diff --git a/apps/driver-archive-cubit/README.md b/apps/driver-archive-cubit/README.md deleted file mode 100644 index 0f30199..0000000 --- a/apps/driver-archive-cubit/README.md +++ /dev/null @@ -1,3 +0,0 @@ -# Tripz — تطبيق السائق (Flutter) -كود موحّد + flavor لكل مستأجر. **OffersBloc** لتدفق العروض. راجع docs/03. -الحالة: هيكل placeholder — يُنشأ فعلياً في P0/P1. diff --git a/apps/driver-archive-cubit/analysis_options.yaml b/apps/driver-archive-cubit/analysis_options.yaml deleted file mode 100755 index 61b6c4d..0000000 --- a/apps/driver-archive-cubit/analysis_options.yaml +++ /dev/null @@ -1,29 +0,0 @@ -# This file configures the analyzer, which statically analyzes Dart code to -# check for errors, warnings, and lints. -# -# The issues identified by the analyzer are surfaced in the UI of Dart-enabled -# IDEs (https://dart.dev/tools#ides-and-editors). The analyzer can also be -# invoked from the command line by running `flutter analyze`. - -# The following line activates a set of recommended lints for Flutter apps, -# packages, and plugins designed to encourage good coding practices. -include: package:flutter_lints/flutter.yaml - -linter: - # The lint rules applied to this project can be customized in the - # section below to disable rules from the `package:flutter_lints/flutter.yaml` - # included above or to enable additional rules. A list of all available lints - # and their documentation is published at - # https://dart-lang.github.io/linter/lints/index.html. - # - # Instead of disabling a lint rule for the entire project in the - # section below, it can also be suppressed for a single line of code - # or a specific dart file by using the `// ignore: name_of_lint` and - # `// ignore_for_file: name_of_lint` syntax on the line or in the file - # producing the lint. - rules: - # avoid_print: false # Uncomment to disable the `avoid_print` rule - # prefer_single_quotes: true # Uncomment to enable the `prefer_single_quotes` rule - -# Additional information about this file can be found at -# https://dart.dev/guides/language/analysis-options diff --git a/apps/driver-archive-cubit/android/.gitignore b/apps/driver-archive-cubit/android/.gitignore deleted file mode 100755 index 16123b5..0000000 --- a/apps/driver-archive-cubit/android/.gitignore +++ /dev/null @@ -1,14 +0,0 @@ -gradle-wrapper.jar -/.gradle -/captures/ -/gradlew -/gradlew.bat -/local.properties -GeneratedPluginRegistrant.java - -# Remember to never publicly share your keystore. -# See https://flutter.dev/docs/deployment/android#reference-the-keystore-from-the-app -key.properties -gradle.properties -**/*.keystore -**/*.jks diff --git a/apps/driver-archive-cubit/android/.settings/org.eclipse.buildship.core.prefs b/apps/driver-archive-cubit/android/.settings/org.eclipse.buildship.core.prefs deleted file mode 100644 index da0e1b9..0000000 --- a/apps/driver-archive-cubit/android/.settings/org.eclipse.buildship.core.prefs +++ /dev/null @@ -1,13 +0,0 @@ -arguments=--init-script /var/folders/cn/w9j2wl8d11517_kjx3xk_vc00000gn/T/db3b08fc4a9ef609cb16b96b200fa13e563f396e9bb1ed0905fdab7bc3bc513b.gradle --init-script /var/folders/cn/w9j2wl8d11517_kjx3xk_vc00000gn/T/52cde0cfcf3e28b8b7510e992210d9614505e0911af0c190bd590d7158574963.gradle -auto.sync=true -build.scans.enabled=false -connection.gradle.distribution=GRADLE_DISTRIBUTION(WRAPPER) -connection.project.dir= -eclipse.preferences.version=1 -gradle.user.home= -java.home=/Users/hamzaaleghwairyeen/Library/Java/JavaVirtualMachines/openjdk-22.0.2/Contents/Home -jvm.arguments= -offline.mode=false -override.workspace.settings=true -show.console.view=true -show.executions.view=true diff --git a/apps/driver-archive-cubit/android/app/build.gradle b/apps/driver-archive-cubit/android/app/build.gradle deleted file mode 100755 index 4509918..0000000 --- a/apps/driver-archive-cubit/android/app/build.gradle +++ /dev/null @@ -1,130 +0,0 @@ -plugins { - id "com.android.application" - // START: FlutterFire Configuration - id 'com.google.gms.google-services' - // END: FlutterFire Configuration - id "org.jetbrains.kotlin.android" - id "dev.flutter.flutter-gradle-plugin" -} - -def localProperties = new Properties() -def localPropertiesFile = rootProject.file('local.properties') -if (localPropertiesFile.exists()) { - localPropertiesFile.withReader('UTF-8') { reader -> - localProperties.load(reader) - } -} - -def keystoreProperties = new Properties() -def keystorePropertiesFile = rootProject.file('key.properties') -if (keystorePropertiesFile.exists()) { - keystorePropertiesFile.withReader("UTF-8") { reader -> - keystoreProperties.load(reader) - } -} - -def flutterVersionCode = localProperties.getProperty('flutter.versionCode') ?: '12' -def flutterVersionName = localProperties.getProperty('flutter.versionName') ?: '1.1.2' - -android { - namespace "com.sefer_driver" - compileSdk = 36 - ndkVersion "29.0.14033849" - - externalNativeBuild { - cmake { - path "src/main/cpp/CMakeLists.txt" - version "3.22.1" - } - } - // - - defaultConfig { - applicationId "com.sefer_driver" - minSdk 29 - targetSdk 36 - versionCode 152 - versionName '2.0.152' - multiDexEnabled true - ndk { - abiFilters "armeabi-v7a", "arm64-v8a" - } - externalNativeBuild { - cmake { - arguments "-DANDROID_SUPPORT_FLEXIBLE_PAGE_SIZES=ON" - } - } - // استدعاء المفتاح من ملف key.properties - manifestPlaceholders += [mapsApiKey: keystoreProperties['mapsApiKey'] ?: ""] - - } - - signingConfigs { - release { - // Defensively check if properties exist to avoid NullPointerException in BundleTool - if (keystoreProperties.isEmpty()) { - println "BUILD_LOG: ERROR - No properties found in key.properties. Release build will fail." - } else { - storeFile = keystoreProperties['storeFile'] ? file(keystoreProperties['storeFile']) : null - storePassword = keystoreProperties['storePassword'] - keyAlias = keystoreProperties['keyAlias'] - keyPassword = keystoreProperties['keyPassword'] - - // Final check to ensure no crucial signing variable is null - if (!storeFile || !storePassword || !keyAlias || !keyPassword) { - println "BUILD_LOG: ERROR - One or more signing properties are NULL. Check key.properties." - } - } - } - } - - buildTypes { - release { - // Only assign signingConfig if the release config is valid - signingConfig signingConfigs.release - - minifyEnabled true - shrinkResources true - proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' - } - } - - compileOptions { - sourceCompatibility = JavaVersion.VERSION_17 - targetCompatibility = JavaVersion.VERSION_17 - coreLibraryDesugaringEnabled true - } - - kotlinOptions { - jvmTarget = JavaVersion.VERSION_17 - } - - sourceSets { - main { - java.srcDirs += 'src/main/kotlin' - jniLibs.srcDirs = ['src/main/jniLibs'] - } - } -} - -flutter { - source '../..' -} - - -dependencies { - implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version" - // تمت الترقية لتطابق تطبيق الراكب - coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:2.1.5' - - // تمت الترقية لتطابق تطبيق الراكب (لتجنب ملفات 4KB القديمة) - implementation "com.stripe:stripe-android:21.4.2" - implementation 'com.stripe:paymentsheet:21.4.2' - - implementation 'com.scottyab:rootbeer-lib:0.1.0' - - // تمت الترقية لتطابق تطبيق الراكب - implementation 'com.google.android.gms:play-services-safetynet:18.1.0' - - implementation "androidx.concurrent:concurrent-futures:1.2.0" -} \ No newline at end of file diff --git a/apps/driver-archive-cubit/android/app/proguard-rules.pro b/apps/driver-archive-cubit/android/app/proguard-rules.pro deleted file mode 100755 index 9af0b7d..0000000 --- a/apps/driver-archive-cubit/android/app/proguard-rules.pro +++ /dev/null @@ -1,38 +0,0 @@ -# Suppress warnings for specific Google ML Kit and Stripe classes --dontwarn com.google.mlkit.vision.text.chinese.ChineseTextRecognizerOptions$Builder --dontwarn com.google.mlkit.vision.text.chinese.ChineseTextRecognizerOptions --dontwarn com.google.mlkit.vision.text.devanagari.DevanagariTextRecognizerOptions$Builder --dontwarn com.google.mlkit.vision.text.devanagari.DevanagariTextRecognizerOptions --dontwarn com.google.mlkit.vision.text.japanese.JapaneseTextRecognizerOptions$Builder --dontwarn com.google.mlkit.vision.text.japanese.JapaneseTextRecognizerOptions --dontwarn com.google.mlkit.vision.text.korean.KoreanTextRecognizerOptions$Builder --dontwarn com.google.mlkit.vision.text.korean.KoreanTextRecognizerOptions --dontwarn com.stripe.android.pushProvisioning.PushProvisioningActivity$g --dontwarn com.stripe.android.pushProvisioning.PushProvisioningActivityStarter$Args --dontwarn com.stripe.android.pushProvisioning.PushProvisioningActivityStarter$Error --dontwarn com.stripe.android.pushProvisioning.PushProvisioningActivityStarter --dontwarn com.stripe.android.pushProvisioning.PushProvisioningEphemeralKeyProvider - -# Keep rules for Google ML Kit --keep class com.google.mlkit.vision.** { *; } --keep class com.google.mlkit.vision.text.** { *; } --keep class com.google.mlkit.vision.text.chinese.ChineseTextRecognizerOptions { *; } --keep class com.google.mlkit.vision.text.chinese.ChineseTextRecognizerOptions$Builder { *; } --keep class com.google.mlkit.vision.text.devanagari.DevanagariTextRecognizerOptions { *; } --keep class com.google.mlkit.vision.text.devanagari.DevanagariTextRecognizerOptions$Builder { *; } --keep class com.google.mlkit.vision.text.japanese.JapaneseTextRecognizerOptions { *; } --keep class com.google.mlkit.vision.text.japanese.JapaneseTextRecognizerOptions$Builder { *; } --keep class com.google.mlkit.vision.text.korean.KoreanTextRecognizerOptions { *; } --keep class com.google.mlkit.vision.text.korean.KoreanTextRecognizerOptions$Builder { *; } - -# Keep rules for Stripe --keep class com.stripe.android.** { *; } --keep class com.stripe.android.pushProvisioning.** { *; } --keep class com.yalantis.ucrop.** { *; } --keep class com.yalantis.ucrop.util.** { *; } - -# منع قراءة كود RootDetection -#-keep class com.sefer_driver.RootDetection { *; } --keep class com.sefer_driver.RootDetection { - native ; - } \ No newline at end of file diff --git a/apps/driver-archive-cubit/android/app/src/debug/AndroidManifest.xml b/apps/driver-archive-cubit/android/app/src/debug/AndroidManifest.xml deleted file mode 100755 index 399f698..0000000 --- a/apps/driver-archive-cubit/android/app/src/debug/AndroidManifest.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - diff --git a/apps/driver-archive-cubit/android/app/src/main/AndroidManifest.xml b/apps/driver-archive-cubit/android/app/src/main/AndroidManifest.xml deleted file mode 100755 index d82148f..0000000 --- a/apps/driver-archive-cubit/android/app/src/main/AndroidManifest.xml +++ /dev/null @@ -1,176 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/apps/driver-archive-cubit/android/app/src/main/cpp/CMakeLists.txt b/apps/driver-archive-cubit/android/app/src/main/cpp/CMakeLists.txt deleted file mode 100755 index 8c11893..0000000 --- a/apps/driver-archive-cubit/android/app/src/main/cpp/CMakeLists.txt +++ /dev/null @@ -1,11 +0,0 @@ -cmake_minimum_required(VERSION 3.10.2) # 3.10.2 is fine, but no need to go as high as 3.31.5 -project(sefer_driver) # Good - -# Add your C++ source file(s) to create a SHARED library. -add_library(native-lib SHARED native-lib.cpp) - -# Find the Android log library. -find_library(log-lib log) - -# Link your library against the log library. This is essential for debugging. -target_link_libraries(native-lib ${log-lib}) \ No newline at end of file diff --git a/apps/driver-archive-cubit/android/app/src/main/cpp/native-lib.cpp b/apps/driver-archive-cubit/android/app/src/main/cpp/native-lib.cpp deleted file mode 100755 index 2238fda..0000000 --- a/apps/driver-archive-cubit/android/app/src/main/cpp/native-lib.cpp +++ /dev/null @@ -1,167 +0,0 @@ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include // Add this line - - -#define LOG_TAG "NativeLib" -#define LOGD(...) __android_log_print(ANDROID_LOG_DEBUG, LOG_TAG, __VA_ARGS__) -#define LOGE(...) __android_log_print(ANDROID_LOG_ERROR, LOG_TAG, __VA_ARGS__) - -// Function to check for common root binaries -bool isRooted() { - std::string paths[] = { - "/system/app/Superuser.apk", - "/system/xbin/su", - "/system/bin/su", - "/system/bin/magisk", - "/system/xbin/magisk", - "/sbin/magisk" - }; - - for (const auto &path : paths) { - std::ifstream file(path); - if (file.good()) { - return true; - } - } - return false; -} - -// Function to check for the presence of files or directories commonly associated with Frida. -bool checkFridaFiles() { - std::string fridaFiles[] = { - "/data/local/tmp/re.frida.server", //Common Frida server path - "/data/local/tmp/frida-server", - "/usr/lib/libfrida-gadget.so", // Frida gadget (injected library) - "/usr/lib64/libfrida-gadget.so", - "/data/local/re.frida.server", - - }; - - for (const auto &path : fridaFiles) { - if (access(path.c_str(), F_OK) != -1) { - LOGE("Frida file detected: %s", path.c_str()); - return true; - } - } - return false; -} - -// Checks for open ports commonly used by Frida. This is less reliable, as ports can be changed. -bool checkFridaPorts() { - int sock = socket(AF_INET, SOCK_STREAM, 0); - if (sock == -1) { - return false; // Couldn't create socket, not a strong indicator. - } - - sockaddr_in sa; - memset(&sa, 0, sizeof(sa)); - sa.sin_family = AF_INET; - sa.sin_port = htons(27042); // Default Frida port - inet_pton(AF_INET, "127.0.0.1", &sa.sin_addr); - - if (connect(sock, (struct sockaddr *)&sa, sizeof(sa)) != -1) { - LOGE("Frida default port (27042) is open."); - close(sock); - return true; - } - - close(sock); - return false; -} - -// Check the maps file of the current process for any suspicious entries. -bool checkMaps() { - std::ifstream mapsFile("/proc/self/maps"); - std::string line; - - if (mapsFile.is_open()) { - while (std::getline(mapsFile, line)) { - // Look for lines that indicate injected libraries, especially Frida. - if (line.find("frida") != std::string::npos || - line.find("gum-js-") != std::string::npos) { // Gum is Frida's JavaScript engine - LOGE("Suspicious entry in /proc/self/maps: %s", line.c_str()); - return true; - } - } - mapsFile.close(); - } else - { - LOGE("Could not open /proc/self/maps"); - return false; - } - return false; -} - -// Check loaded modules. -bool checkLoadedModules() { - bool found = false; - dl_iterate_phdr([](struct dl_phdr_info *info, size_t size, void *data) { - bool *found_ptr = static_cast(data); - if (std::string(info->dlpi_name).find("frida") != std::string::npos) { - LOGE("Frida module detected: %s", info->dlpi_name); - *found_ptr = true; - return 1; // Stop iterating - } - return 0; // Continue iterating - }, &found); - - return found; -} - - -// This is a simple ptrace check. More sophisticated checks are possible (and necessary for robust detection). -//bool checkPtrace() { -// // Attempt to ptrace ourselves. If another process is already tracing us, this will fail. -// if (ptrace(PTRACE_TRACEME, 0, 1, 0) < 0) { -// LOGE("ptrace failed. Debugger or tracer detected."); -// return true; // Likely being traced -// } -// // Detach. If attached, need to detach to not interfere. -// ptrace(PTRACE_DETACH, 0, 0, 0); -// return false; -//} - -extern "C" -JNIEXPORT jboolean JNICALL -Java_com_sefer_1driver_RootDetection_isNativeRooted(JNIEnv *env, jobject /* this */) { - - if (isRooted()) { - return JNI_TRUE; - } - - if (checkFridaFiles()) { - return JNI_TRUE; - } - - if (checkFridaPorts()) { - return JNI_TRUE; - } - if (checkMaps()) { - return JNI_TRUE; - } - - if (checkLoadedModules()) { - return JNI_TRUE; - } - -// if (checkPtrace()) { -// return JNI_TRUE; -// } - - return JNI_FALSE; -} \ No newline at end of file diff --git a/apps/driver-archive-cubit/android/app/src/main/java/com/sefer_driver/MyFirebaseMessagingService.kt b/apps/driver-archive-cubit/android/app/src/main/java/com/sefer_driver/MyFirebaseMessagingService.kt deleted file mode 100755 index 6fb47a0..0000000 --- a/apps/driver-archive-cubit/android/app/src/main/java/com/sefer_driver/MyFirebaseMessagingService.kt +++ /dev/null @@ -1,15 +0,0 @@ -package com.sefer_driver - -import android.app.IntentService -import android.content.Intent -import android.content.Context - -// TODO: Rename actions, choose action names that describe tasks that this -// IntentService can perform, e.g. ACTION_FETCH_NEW_ITEMS -private const val ACTION_FOO = "com.sefer_driver.action.FOO" -private const val ACTION_BAZ = "com.sefer_driver.action.BAZ" - -// TODO: Rename parameters -private const val EXTRA_PARAM1 = "com.sefer_driver.extra.PARAM1" -private const val EXTRA_PARAM2 = "com.sefer_driver.extra.PARAM2" - diff --git a/apps/driver-archive-cubit/android/app/src/main/kotlin/com/sefer_driver/MainActivity.kt b/apps/driver-archive-cubit/android/app/src/main/kotlin/com/sefer_driver/MainActivity.kt deleted file mode 100755 index c79a62a..0000000 --- a/apps/driver-archive-cubit/android/app/src/main/kotlin/com/sefer_driver/MainActivity.kt +++ /dev/null @@ -1,190 +0,0 @@ -package com.sefer_driver - -import android.app.AlertDialog -import android.content.Intent -import android.os.Bundle -import android.util.Log -import android.widget.LinearLayout -import android.widget.ProgressBar -import android.widget.TextView -import androidx.core.view.setPadding -import com.scottyab.rootbeer.RootBeer -import io.flutter.embedding.android.FlutterFragmentActivity -import io.flutter.embedding.engine.FlutterEngine -import io.flutter.plugin.common.MethodChannel -import java.io.File -import java.util.Timer -import kotlin.concurrent.schedule - -class MainActivity : FlutterFragmentActivity() { - private val SECURITY_CHANNEL = "com.sefer_driver/security" - private val APP_CONTROL_CHANNEL = "com.sefer_driver/app_control" - - // 🔴 1. تعريف القناة لتكون متاحة للوصول من الدوال الأخرى - private var appControlChannel: MethodChannel? = null - - override fun configureFlutterEngine(flutterEngine: FlutterEngine) { - super.configureFlutterEngine(flutterEngine) - - // 🔴 2. تهيئة القناة هنا - appControlChannel = - MethodChannel(flutterEngine.dartExecutor.binaryMessenger, APP_CONTROL_CHANNEL) - - // Channel for security checks (isRooted) - MethodChannel(flutterEngine.dartExecutor.binaryMessenger, SECURITY_CHANNEL) - .setMethodCallHandler { call, result -> - when (call.method) { - "isNativeRooted" -> result.success(isDeviceCompromised()) - else -> result.notImplemented() - } - } - - // Channel for app control (bringing to foreground & overlay events) - appControlChannel?.setMethodCallHandler { call, result -> - when (call.method) { - "bringToForeground" -> { - Log.d("MainActivity", "Received bringToForeground request") - val intent = - Intent(this, MainActivity::class.java).apply { - action = Intent.ACTION_MAIN - addCategory(Intent.CATEGORY_LAUNCHER) - addFlags( - Intent.FLAG_ACTIVITY_NEW_TASK or - Intent.FLAG_ACTIVITY_CLEAR_TOP or - Intent.FLAG_ACTIVITY_SINGLE_TOP - ) - } - try { - startActivity(intent) - Log.d("MainActivity", "App brought to foreground successfully") - result.success(true) - } catch (e: Exception) { - Log.e("MainActivity", "Error bringing app to foreground", e) - result.error("ACTIVITY_START_FAILED", e.message, e.stackTraceToString()) - } - } - else -> result.notImplemented() - } - } - } - - override fun onCreate(savedInstanceState: Bundle?) { - super.onCreate(savedInstanceState) - Log.d("MainActivity", "MainActivity onCreate") - if (isDeviceCompromised()) { - showSecurityWarningDialog() - } - - // 🔴 3. فحص نية فتح التطبيق (هل جاء من زر قبول النافذة؟) - checkIntentForOverlayAccept(intent) - } - - override fun onNewIntent(intent: Intent) { - super.onNewIntent(intent) - setIntent(intent) - Log.d("MainActivity", "Received new intent: ${intent.action}") - - // 🔴 4. فحص نية التطبيق عند الفتح من الخلفية - checkIntentForOverlayAccept(intent) - } - - // ========================================================================= - // 🔴 5. الدالة السحرية لالتقاط زر القبول وإرساله للـ Flutter 🔴 - // ========================================================================= - private fun checkIntentForOverlayAccept(intent: Intent) { - val acceptedTripId = intent.getStringExtra("acceptedTripId") - if (acceptedTripId != null) { - Log.d("MainActivity", "✅ Trip accepted via Native Intent: $acceptedTripId") - // إرسال الإشارة عبر القناة لتطبيق فلاتر - appControlChannel?.invokeMethod("onOverlayTripAccepted", acceptedTripId) - // مسح البيانات حتى لا تتكرر العملية إذا أغلق السائق التطبيق وفتحه يدوياً - intent.removeExtra("acceptedTripId") - } - } - - // ========================================================================= - // --- دوال الحماية الخاصة بك (لم يتم المساس بها) --- - // ========================================================================= - private fun isDeviceCompromised(): Boolean { - return try { - val isRootedByRootBeer = RootBeer(this).isRooted - Log.d("MainActivity", "Root check result: $isRootedByRootBeer") - isRootedByRootBeer - } catch (e: Exception) { - Log.e("MainActivity", "Security check error: ${e.message}", e) - true // Fail-safe: assume compromised if check fails - } - } - - private fun showSecurityWarningDialog() { - var secondsRemaining = 10 - val progressBar = - ProgressBar(this, null, android.R.attr.progressBarStyleHorizontal).apply { - max = 10 - progress = 10 - } - val textView = - TextView(this).apply { - text = getString(R.string.security_warning_message) - textAlignment = TextView.TEXT_ALIGNMENT_CENTER - } - val layout = - LinearLayout(this).apply { - orientation = LinearLayout.VERTICAL - setPadding(48) - addView(textView) - addView(progressBar) - } - val dialog = - AlertDialog.Builder(this) - .setTitle(getString(R.string.security_warning_title)) - .setView(layout) - .setCancelable(false) - .create() - dialog.show() - val timer = Timer() - timer.schedule(0, 1000) { - secondsRemaining-- - runOnUiThread { - progressBar.progress = secondsRemaining - if (secondsRemaining <= 0) { - timer.cancel() - dialog.dismiss() - clearAppDataAndExit() - } - } - } - } - - private fun clearAppDataAndExit() { - try { - Runtime.getRuntime().exec("pm clear $packageName") - Log.d("MainActivity", "Cleared app data via package manager") - } catch (e: Exception) { - Log.e("MainActivity", "Error clearing app data: ${e.message}", e) - clearCache() - clearAppData() - } - finishAffinity() - System.exit(0) - } - - private fun clearCache() { - deleteDir(cacheDir) - deleteDir(externalCacheDir) - Log.d("MainActivity", "Cleared cache directories") - } - - private fun clearAppData() { - Log.d("MainActivity", "App data clearing skipped (commented out)") - } - - private fun deleteDir(dir: File?): Boolean { - if (dir != null && dir.isDirectory) { - dir.list()?.forEach { deleteDir(File(dir, it)) } - } - val deleted = dir?.delete() ?: false - Log.d("MainActivity", "Deleted directory ${dir?.path}: $deleted") - return deleted - } -} diff --git a/apps/driver-archive-cubit/android/app/src/main/kotlin/com/sefer_driver/MyApplication.kt b/apps/driver-archive-cubit/android/app/src/main/kotlin/com/sefer_driver/MyApplication.kt deleted file mode 100755 index 75b7ece..0000000 --- a/apps/driver-archive-cubit/android/app/src/main/kotlin/com/sefer_driver/MyApplication.kt +++ /dev/null @@ -1,41 +0,0 @@ -package com.sefer_driver - -import android.app.Application -import android.content.Intent -import io.flutter.embedding.engine.FlutterEngine -import io.flutter.embedding.engine.dart.DartExecutor -import io.flutter.plugin.common.MethodChannel - -class MyApplication : Application() { - companion object { - lateinit var instance: MyApplication - private set - - val flutterEngine: FlutterEngine by lazy { - FlutterEngine(instance).apply { - dartExecutor.executeDartEntrypoint(DartExecutor.DartEntrypoint.createDefault()) - } - } - } - - override fun onCreate() { - super.onCreate() - instance = this - - MethodChannel(flutterEngine.dartExecutor.binaryMessenger, "com.sefer_driver/app_lifecycle") - .setMethodCallHandler { call, result -> - if (call.method == "bringAppToForeground") { - bringAppToForeground() - result.success(null) - } else { - result.notImplemented() - } - } - } - - private fun bringAppToForeground() { - val intent = Intent(applicationContext, MainActivity::class.java) - intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_REORDER_TO_FRONT) - startActivity(intent) - } -} diff --git a/apps/driver-archive-cubit/android/app/src/main/kotlin/com/sefer_driver/RootDetection.kt b/apps/driver-archive-cubit/android/app/src/main/kotlin/com/sefer_driver/RootDetection.kt deleted file mode 100755 index 7dbadd6..0000000 --- a/apps/driver-archive-cubit/android/app/src/main/kotlin/com/sefer_driver/RootDetection.kt +++ /dev/null @@ -1,10 +0,0 @@ - -package com.sefer_driver - -object RootDetection { - init { - System.loadLibrary("native-lib") // Load the native library - } - - external fun isNativeRooted(): Boolean // Declare the external function -} diff --git a/apps/driver-archive-cubit/android/app/src/main/kotlin/com/sefer_driver/SafetyNetCheck.kt b/apps/driver-archive-cubit/android/app/src/main/kotlin/com/sefer_driver/SafetyNetCheck.kt deleted file mode 100755 index 1b8593b..0000000 --- a/apps/driver-archive-cubit/android/app/src/main/kotlin/com/sefer_driver/SafetyNetCheck.kt +++ /dev/null @@ -1,109 +0,0 @@ -import android.content.Context -import android.util.Base64 -import android.util.Log -import com.google.android.gms.safetynet.SafetyNet -import com.google.android.gms.safetynet.SafetyNetApi -import com.google.android.gms.tasks.OnFailureListener -import com.google.android.gms.tasks.OnSuccessListener -import org.json.JSONObject -import java.io.IOException -import java.security.GeneralSecurityException -import java.security.SecureRandom -import java.util.Arrays - -object SafetyNetCheck { - - private const val TAG = "SafetyNetCheck" - - fun checkSafetyNet(context: Context, apiKey: String, callback: (Boolean) -> Unit) { - // Generate a nonce. A good nonce is large, random, and used only once. - val nonce = generateNonce() - - SafetyNet.getClient(context).attest(nonce, apiKey) - .addOnSuccessListener { response -> - // Success! Now, *verify* the response. - val jwsResult = response.jwsResult - if (jwsResult != null) { - try { - val isSafe = SafetyNetResponseVerifier.verify(jwsResult) - Log.d(TAG, "SafetyNet verification result: $isSafe") - callback(isSafe) // Now passing a *verified* result. - } catch (e: Exception) { - Log.e(TAG, "Error verifying SafetyNet response: ${e.message}", e) - callback(false) // Treat verification errors as failures. - } - } else { - Log.e(TAG, "SafetyNet jwsResult is null") - callback(false) // Null result is a failure. - } - } - .addOnFailureListener { e -> - Log.e(TAG, "SafetyNet attest API call failed: ${e.message}", e) - callback(false) // API call failure. - } - } - - - // Helper function to generate a nonce. - private fun generateNonce(): ByteArray { - val byteGenerator = SecureRandom() - val nonce = ByteArray(32) - byteGenerator.nextBytes(nonce) - return nonce - } -} - - - -// Helper class to verify the SafetyNet response. -object SafetyNetResponseVerifier { - - private const val TAG = "SafetyNetVerifier" - - // This method *must* be implemented on a *backend server* for real security. - // This is just a *simplified example* for demonstration purposes and is - // *not* suitable for production without a backend check. - @Throws(GeneralSecurityException::class, IOException::class) - fun verify(jwsResult: String): Boolean { - // 1. Parse the JWS: Split into header, payload, and signature. - val parts = jwsResult.split(".") - if (parts.size != 3) { - Log.e(TAG, "Invalid JWS format") - return false // Invalid JWS format - } - - val header = parts[0] - val payload = parts[1] - val signature = parts[2] - - // 2. Decode the payload (it's Base64 encoded). - val decodedPayload = Base64.decode(payload, Base64.DEFAULT) - val payloadJson = JSONObject(String(decodedPayload)) - - // 3. Check the ctsProfileMatch and basicIntegrity. - val ctsProfileMatch = payloadJson.optBoolean("ctsProfileMatch", false) - val basicIntegrity = payloadJson.optBoolean("basicIntegrity", false) - - Log.d(TAG, "ctsProfileMatch: $ctsProfileMatch, basicIntegrity: $basicIntegrity") - - // 4. **CRITICAL: In a real application, you *must* send the JWS to your - // backend server for verification. The server should use the - // Google SafetyNet API (or a library that wraps it) to verify - // the signature and check the fields. This prevents attackers - // from tampering with the response on the device.** - // - // // Example (pseudo-code) of what the backend check would do: - // // GoogleCredential credential = ...; - // // SafetyNet safetyNet = new SafetyNet.Builder(httpTransport, jsonFactory) - // // .setApplicationName("YourAppName") - // // .setHttpRequestInitializer(credential) - // // .build(); - // // SafetyNetApi.VerifyJwsRequest request = safetyNet.safetynet().verifyJws(jwsResult); - // // SafetyNetApi.VerifyJwsResponse response = request.execute(); - // // return response.isValidSignature() && response.getCtsProfileMatch() && response.getBasicIntegrity(); - - // 5. For this *example* (without a backend), we'll just check the fields. - // This is *NOT SECURE* for production! - return ctsProfileMatch && basicIntegrity - } -} \ No newline at end of file diff --git a/apps/driver-archive-cubit/android/app/src/main/res/drawable-v21/launch_background.xml b/apps/driver-archive-cubit/android/app/src/main/res/drawable-v21/launch_background.xml deleted file mode 100755 index f74085f..0000000 --- a/apps/driver-archive-cubit/android/app/src/main/res/drawable-v21/launch_background.xml +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - - - diff --git a/apps/driver-archive-cubit/android/app/src/main/res/drawable/app_icon.png b/apps/driver-archive-cubit/android/app/src/main/res/drawable/app_icon.png deleted file mode 100755 index c811875..0000000 Binary files a/apps/driver-archive-cubit/android/app/src/main/res/drawable/app_icon.png and /dev/null differ diff --git a/apps/driver-archive-cubit/android/app/src/main/res/drawable/launch_background.xml b/apps/driver-archive-cubit/android/app/src/main/res/drawable/launch_background.xml deleted file mode 100755 index f0bf5d4..0000000 --- a/apps/driver-archive-cubit/android/app/src/main/res/drawable/launch_background.xml +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - - - \ No newline at end of file diff --git a/apps/driver-archive-cubit/android/app/src/main/res/drawable/launcher_icon.png b/apps/driver-archive-cubit/android/app/src/main/res/drawable/launcher_icon.png deleted file mode 100755 index cb1d9cd..0000000 Binary files a/apps/driver-archive-cubit/android/app/src/main/res/drawable/launcher_icon.png and /dev/null differ diff --git a/apps/driver-archive-cubit/android/app/src/main/res/layout/custom_notification.xml b/apps/driver-archive-cubit/android/app/src/main/res/layout/custom_notification.xml deleted file mode 100755 index b9b0215..0000000 --- a/apps/driver-archive-cubit/android/app/src/main/res/layout/custom_notification.xml +++ /dev/null @@ -1,21 +0,0 @@ - - - - - - - - \ No newline at end of file diff --git a/apps/driver-archive-cubit/android/app/src/main/res/mipmap-hdpi/launcher_icon.png b/apps/driver-archive-cubit/android/app/src/main/res/mipmap-hdpi/launcher_icon.png deleted file mode 100755 index d382e98..0000000 Binary files a/apps/driver-archive-cubit/android/app/src/main/res/mipmap-hdpi/launcher_icon.png and /dev/null differ diff --git a/apps/driver-archive-cubit/android/app/src/main/res/mipmap-mdpi/launcher_icon.png b/apps/driver-archive-cubit/android/app/src/main/res/mipmap-mdpi/launcher_icon.png deleted file mode 100755 index ba38ec5..0000000 Binary files a/apps/driver-archive-cubit/android/app/src/main/res/mipmap-mdpi/launcher_icon.png and /dev/null differ diff --git a/apps/driver-archive-cubit/android/app/src/main/res/mipmap-xhdpi/launcher_icon.png b/apps/driver-archive-cubit/android/app/src/main/res/mipmap-xhdpi/launcher_icon.png deleted file mode 100755 index c00c762..0000000 Binary files a/apps/driver-archive-cubit/android/app/src/main/res/mipmap-xhdpi/launcher_icon.png and /dev/null differ diff --git a/apps/driver-archive-cubit/android/app/src/main/res/mipmap-xxhdpi/launcher_icon.png b/apps/driver-archive-cubit/android/app/src/main/res/mipmap-xxhdpi/launcher_icon.png deleted file mode 100755 index 71d0444..0000000 Binary files a/apps/driver-archive-cubit/android/app/src/main/res/mipmap-xxhdpi/launcher_icon.png and /dev/null differ diff --git a/apps/driver-archive-cubit/android/app/src/main/res/mipmap-xxxhdpi/launcher_icon.png b/apps/driver-archive-cubit/android/app/src/main/res/mipmap-xxxhdpi/launcher_icon.png deleted file mode 100755 index f46d9d0..0000000 Binary files a/apps/driver-archive-cubit/android/app/src/main/res/mipmap-xxxhdpi/launcher_icon.png and /dev/null differ diff --git a/apps/driver-archive-cubit/android/app/src/main/res/raw/app_icon.png b/apps/driver-archive-cubit/android/app/src/main/res/raw/app_icon.png deleted file mode 100755 index 96cc55a..0000000 Binary files a/apps/driver-archive-cubit/android/app/src/main/res/raw/app_icon.png and /dev/null differ diff --git a/apps/driver-archive-cubit/android/app/src/main/res/raw/cancel.wav b/apps/driver-archive-cubit/android/app/src/main/res/raw/cancel.wav deleted file mode 100755 index dbe6e7c..0000000 Binary files a/apps/driver-archive-cubit/android/app/src/main/res/raw/cancel.wav and /dev/null differ diff --git a/apps/driver-archive-cubit/android/app/src/main/res/raw/ding.wav b/apps/driver-archive-cubit/android/app/src/main/res/raw/ding.wav deleted file mode 100755 index c53cd50..0000000 Binary files a/apps/driver-archive-cubit/android/app/src/main/res/raw/ding.wav and /dev/null differ diff --git a/apps/driver-archive-cubit/android/app/src/main/res/raw/iphone_ringtone.wav b/apps/driver-archive-cubit/android/app/src/main/res/raw/iphone_ringtone.wav deleted file mode 100755 index aee314f..0000000 Binary files a/apps/driver-archive-cubit/android/app/src/main/res/raw/iphone_ringtone.wav and /dev/null differ diff --git a/apps/driver-archive-cubit/android/app/src/main/res/raw/order.wav b/apps/driver-archive-cubit/android/app/src/main/res/raw/order.wav deleted file mode 100755 index b2b0ba2..0000000 Binary files a/apps/driver-archive-cubit/android/app/src/main/res/raw/order.wav and /dev/null differ diff --git a/apps/driver-archive-cubit/android/app/src/main/res/raw/order1.wav b/apps/driver-archive-cubit/android/app/src/main/res/raw/order1.wav deleted file mode 100755 index 919fdda..0000000 Binary files a/apps/driver-archive-cubit/android/app/src/main/res/raw/order1.wav and /dev/null differ diff --git a/apps/driver-archive-cubit/android/app/src/main/res/raw/promo.wav b/apps/driver-archive-cubit/android/app/src/main/res/raw/promo.wav deleted file mode 100755 index 3bb2d03..0000000 Binary files a/apps/driver-archive-cubit/android/app/src/main/res/raw/promo.wav and /dev/null differ diff --git a/apps/driver-archive-cubit/android/app/src/main/res/raw/start.wav b/apps/driver-archive-cubit/android/app/src/main/res/raw/start.wav deleted file mode 100755 index 0655506..0000000 Binary files a/apps/driver-archive-cubit/android/app/src/main/res/raw/start.wav and /dev/null differ diff --git a/apps/driver-archive-cubit/android/app/src/main/res/raw/tone1.mp3 b/apps/driver-archive-cubit/android/app/src/main/res/raw/tone1.mp3 deleted file mode 100755 index e32e61b..0000000 Binary files a/apps/driver-archive-cubit/android/app/src/main/res/raw/tone1.mp3 and /dev/null differ diff --git a/apps/driver-archive-cubit/android/app/src/main/res/raw/tone2.wav b/apps/driver-archive-cubit/android/app/src/main/res/raw/tone2.wav deleted file mode 100755 index 0582d47..0000000 Binary files a/apps/driver-archive-cubit/android/app/src/main/res/raw/tone2.wav and /dev/null differ diff --git a/apps/driver-archive-cubit/android/app/src/main/res/values-ar/strings.xml b/apps/driver-archive-cubit/android/app/src/main/res/values-ar/strings.xml deleted file mode 100755 index 6b7cb35..0000000 --- a/apps/driver-archive-cubit/android/app/src/main/res/values-ar/strings.xml +++ /dev/null @@ -1,6 +0,0 @@ - - تحذير أمني - تم اكتشاف مشكلة أمنية أو تعديل على هذا الجهاز. لا يمكن تشغيل التطبيق على هذا الجهاز. - إغلاق التطبيق - الجهاز آمن. الاستمرار بشكل طبيعي. - \ No newline at end of file diff --git a/apps/driver-archive-cubit/android/app/src/main/res/values-night/styles.xml b/apps/driver-archive-cubit/android/app/src/main/res/values-night/styles.xml deleted file mode 100755 index 60a2b7e..0000000 --- a/apps/driver-archive-cubit/android/app/src/main/res/values-night/styles.xml +++ /dev/null @@ -1,20 +0,0 @@ - - - - - - - - - diff --git a/apps/driver-archive-cubit/android/app/src/main/res/values/strings.xml b/apps/driver-archive-cubit/android/app/src/main/res/values/strings.xml deleted file mode 100755 index e045415..0000000 --- a/apps/driver-archive-cubit/android/app/src/main/res/values/strings.xml +++ /dev/null @@ -1,15 +0,0 @@ - - My App - high_importance_channel - kffk - AIzaSyB04YNW3LbvmQ5lX1t2bOwEU18- - FCM Notifications - Notifications from Firebase Cloud Messaging - Security Warning - A security issue or modification has been detected on - this device. The app cannot run on this device. - Exit App - Device is secure. Proceeding normally. - - - \ No newline at end of file diff --git a/apps/driver-archive-cubit/android/app/src/main/res/values/styles.xml b/apps/driver-archive-cubit/android/app/src/main/res/values/styles.xml deleted file mode 100755 index 80796a9..0000000 --- a/apps/driver-archive-cubit/android/app/src/main/res/values/styles.xml +++ /dev/null @@ -1,20 +0,0 @@ - - - - - - - - - diff --git a/apps/driver-archive-cubit/android/app/src/main/res/xml/network_security_config.xml b/apps/driver-archive-cubit/android/app/src/main/res/xml/network_security_config.xml deleted file mode 100644 index 7328fde..0000000 --- a/apps/driver-archive-cubit/android/app/src/main/res/xml/network_security_config.xml +++ /dev/null @@ -1,24 +0,0 @@ - - - - - - - - - - - - - tripz-egypt.com - - - - - - - - - - - \ No newline at end of file diff --git a/apps/driver-archive-cubit/android/app/src/profile/AndroidManifest.xml b/apps/driver-archive-cubit/android/app/src/profile/AndroidManifest.xml deleted file mode 100755 index 399f698..0000000 --- a/apps/driver-archive-cubit/android/app/src/profile/AndroidManifest.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - diff --git a/apps/driver-archive-cubit/android/build.gradle b/apps/driver-archive-cubit/android/build.gradle deleted file mode 100755 index 4b28098..0000000 --- a/apps/driver-archive-cubit/android/build.gradle +++ /dev/null @@ -1,52 +0,0 @@ -buildscript { - ext.kotlin_version = '2.3.10' - repositories { - google() - mavenCentral() - } - dependencies { - classpath 'com.android.tools.build:gradle:8.13.2' - classpath 'com.google.gms:google-services:4.3.15' - classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" - } -} - -allprojects { - repositories { - google() - mavenCentral() - } -} - -rootProject.buildDir = '../build' - -subprojects { - project.buildDir = "${rootProject.buildDir}/${project.name}" - project.evaluationDependsOn(':app') - - def setupAndroid = { - if (project.plugins.hasPlugin('com.android.library') || project.plugins.hasPlugin('com.android.application')) { - project.android { - if (namespace == null || namespace == "") { - namespace = project.group - } - compileSdk 36 - defaultConfig { - targetSdk 36 - } - } - } - } - - if (project.state.executed) { - setupAndroid() - } else { - project.afterEvaluate { - setupAndroid() - } - } -} - -tasks.register("clean", Delete) { - delete rootProject.buildDir -} \ No newline at end of file diff --git a/apps/driver-archive-cubit/android/gradle/wrapper/gradle-wrapper.properties b/apps/driver-archive-cubit/android/gradle/wrapper/gradle-wrapper.properties deleted file mode 100755 index a667694..0000000 --- a/apps/driver-archive-cubit/android/gradle/wrapper/gradle-wrapper.properties +++ /dev/null @@ -1,7 +0,0 @@ - - -distributionBase=GRADLE_USER_HOME -distributionPath=wrapper/dists -zipStoreBase=GRADLE_USER_HOME -zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.13-all.zip diff --git a/apps/driver-archive-cubit/android/settings.gradle b/apps/driver-archive-cubit/android/settings.gradle deleted file mode 100755 index 9dae921..0000000 --- a/apps/driver-archive-cubit/android/settings.gradle +++ /dev/null @@ -1,25 +0,0 @@ -pluginManagement { - def flutterSdkPath = { - def properties = new Properties() - file("local.properties").withInputStream { properties.load(it) } - def flutterSdkPath = properties.getProperty("flutter.sdk") - assert flutterSdkPath != null, "flutter.sdk not set in local.properties" - return flutterSdkPath - }() - includeBuild("$flutterSdkPath/packages/flutter_tools/gradle") - repositories { - google() - mavenCentral() - gradlePluginPortal() - } -} - -plugins { - id "dev.flutter.flutter-plugin-loader" version "1.0.0" - id "com.android.application" version '8.13.2' apply false - id "com.google.gms.google-services" version "4.3.15" apply false - id "org.jetbrains.kotlin.android" version "2.3.10" apply false -} - -include ":app" - diff --git a/apps/driver-archive-cubit/assets/fonts/IBMPlexSansArabic-Bold.ttf b/apps/driver-archive-cubit/assets/fonts/IBMPlexSansArabic-Bold.ttf deleted file mode 100644 index d67d9e8..0000000 Binary files a/apps/driver-archive-cubit/assets/fonts/IBMPlexSansArabic-Bold.ttf and /dev/null differ diff --git a/apps/driver-archive-cubit/assets/fonts/IBMPlexSansArabic-Medium.ttf b/apps/driver-archive-cubit/assets/fonts/IBMPlexSansArabic-Medium.ttf deleted file mode 100644 index 09ec8da..0000000 Binary files a/apps/driver-archive-cubit/assets/fonts/IBMPlexSansArabic-Medium.ttf and /dev/null differ diff --git a/apps/driver-archive-cubit/assets/fonts/IBMPlexSansArabic-Regular.ttf b/apps/driver-archive-cubit/assets/fonts/IBMPlexSansArabic-Regular.ttf deleted file mode 100644 index 5e19284..0000000 Binary files a/apps/driver-archive-cubit/assets/fonts/IBMPlexSansArabic-Regular.ttf and /dev/null differ diff --git a/apps/driver-archive-cubit/assets/fonts/IBMPlexSansArabic-SemiBold.ttf b/apps/driver-archive-cubit/assets/fonts/IBMPlexSansArabic-SemiBold.ttf deleted file mode 100644 index 6b48c75..0000000 Binary files a/apps/driver-archive-cubit/assets/fonts/IBMPlexSansArabic-SemiBold.ttf and /dev/null differ diff --git a/apps/driver-archive-cubit/assets/fonts/Inter-Bold.ttf b/apps/driver-archive-cubit/assets/fonts/Inter-Bold.ttf deleted file mode 100644 index 15e908f..0000000 Binary files a/apps/driver-archive-cubit/assets/fonts/Inter-Bold.ttf and /dev/null differ diff --git a/apps/driver-archive-cubit/assets/fonts/Inter-Medium.ttf b/apps/driver-archive-cubit/assets/fonts/Inter-Medium.ttf deleted file mode 100644 index 9342730..0000000 Binary files a/apps/driver-archive-cubit/assets/fonts/Inter-Medium.ttf and /dev/null differ diff --git a/apps/driver-archive-cubit/assets/fonts/Inter-Regular.ttf b/apps/driver-archive-cubit/assets/fonts/Inter-Regular.ttf deleted file mode 100644 index c544be4..0000000 Binary files a/apps/driver-archive-cubit/assets/fonts/Inter-Regular.ttf and /dev/null differ diff --git a/apps/driver-archive-cubit/assets/fonts/Inter-SemiBold.ttf b/apps/driver-archive-cubit/assets/fonts/Inter-SemiBold.ttf deleted file mode 100644 index a32e2b8..0000000 Binary files a/apps/driver-archive-cubit/assets/fonts/Inter-SemiBold.ttf and /dev/null differ diff --git a/apps/driver-archive-cubit/assets/fonts/digit.ttf b/apps/driver-archive-cubit/assets/fonts/digit.ttf deleted file mode 100755 index 5dbe6f9..0000000 Binary files a/apps/driver-archive-cubit/assets/fonts/digit.ttf and /dev/null differ diff --git a/apps/driver-archive-cubit/assets/images/6.png b/apps/driver-archive-cubit/assets/images/6.png deleted file mode 100755 index 23df2c0..0000000 Binary files a/apps/driver-archive-cubit/assets/images/6.png and /dev/null differ diff --git a/apps/driver-archive-cubit/assets/images/A.png b/apps/driver-archive-cubit/assets/images/A.png deleted file mode 100755 index 246b9d2..0000000 Binary files a/apps/driver-archive-cubit/assets/images/A.png and /dev/null differ diff --git a/apps/driver-archive-cubit/assets/images/arrow.png b/apps/driver-archive-cubit/assets/images/arrow.png deleted file mode 100755 index 3d3db75..0000000 Binary files a/apps/driver-archive-cubit/assets/images/arrow.png and /dev/null differ diff --git a/apps/driver-archive-cubit/assets/images/b.png b/apps/driver-archive-cubit/assets/images/b.png deleted file mode 100755 index b22f96c..0000000 Binary files a/apps/driver-archive-cubit/assets/images/b.png and /dev/null differ diff --git a/apps/driver-archive-cubit/assets/images/brand.png b/apps/driver-archive-cubit/assets/images/brand.png deleted file mode 100755 index 9282720..0000000 Binary files a/apps/driver-archive-cubit/assets/images/brand.png and /dev/null differ diff --git a/apps/driver-archive-cubit/assets/images/car.png b/apps/driver-archive-cubit/assets/images/car.png deleted file mode 100755 index 5932743..0000000 Binary files a/apps/driver-archive-cubit/assets/images/car.png and /dev/null differ diff --git a/apps/driver-archive-cubit/assets/images/car_back.png b/apps/driver-archive-cubit/assets/images/car_back.png deleted file mode 100755 index 72c8a89..0000000 Binary files a/apps/driver-archive-cubit/assets/images/car_back.png and /dev/null differ diff --git a/apps/driver-archive-cubit/assets/images/car_front.png b/apps/driver-archive-cubit/assets/images/car_front.png deleted file mode 100755 index 81c974f..0000000 Binary files a/apps/driver-archive-cubit/assets/images/car_front.png and /dev/null differ diff --git a/apps/driver-archive-cubit/assets/images/driver_license.png b/apps/driver-archive-cubit/assets/images/driver_license.png deleted file mode 100755 index aa6a06f..0000000 Binary files a/apps/driver-archive-cubit/assets/images/driver_license.png and /dev/null differ diff --git a/apps/driver-archive-cubit/assets/images/id_back.png b/apps/driver-archive-cubit/assets/images/id_back.png deleted file mode 100755 index 7c4d8d3..0000000 Binary files a/apps/driver-archive-cubit/assets/images/id_back.png and /dev/null differ diff --git a/apps/driver-archive-cubit/assets/images/id_front.png b/apps/driver-archive-cubit/assets/images/id_front.png deleted file mode 100755 index 290e187..0000000 Binary files a/apps/driver-archive-cubit/assets/images/id_front.png and /dev/null differ diff --git a/apps/driver-archive-cubit/assets/images/lady1.png b/apps/driver-archive-cubit/assets/images/lady1.png deleted file mode 100755 index 2797b75..0000000 Binary files a/apps/driver-archive-cubit/assets/images/lady1.png and /dev/null differ diff --git a/apps/driver-archive-cubit/assets/images/logo.gif b/apps/driver-archive-cubit/assets/images/logo.gif deleted file mode 100755 index 5fa1d0d..0000000 Binary files a/apps/driver-archive-cubit/assets/images/logo.gif and /dev/null differ diff --git a/apps/driver-archive-cubit/assets/images/logo.png b/apps/driver-archive-cubit/assets/images/logo.png deleted file mode 100755 index c811875..0000000 Binary files a/apps/driver-archive-cubit/assets/images/logo.png and /dev/null differ diff --git a/apps/driver-archive-cubit/assets/images/logo1.png b/apps/driver-archive-cubit/assets/images/logo1.png deleted file mode 100755 index 8507dbc..0000000 Binary files a/apps/driver-archive-cubit/assets/images/logo1.png and /dev/null differ diff --git a/apps/driver-archive-cubit/assets/images/non_id_front.jpeg b/apps/driver-archive-cubit/assets/images/non_id_front.jpeg deleted file mode 100755 index 3108cb3..0000000 Binary files a/apps/driver-archive-cubit/assets/images/non_id_front.jpeg and /dev/null differ diff --git a/apps/driver-archive-cubit/assets/images/notepad.png b/apps/driver-archive-cubit/assets/images/notepad.png deleted file mode 100755 index 9536a4d..0000000 Binary files a/apps/driver-archive-cubit/assets/images/notepad.png and /dev/null differ diff --git a/apps/driver-archive-cubit/assets/images/on1.png b/apps/driver-archive-cubit/assets/images/on1.png deleted file mode 100755 index c9881c6..0000000 Binary files a/apps/driver-archive-cubit/assets/images/on1.png and /dev/null differ diff --git a/apps/driver-archive-cubit/assets/images/on2.png b/apps/driver-archive-cubit/assets/images/on2.png deleted file mode 100755 index 3b6d28c..0000000 Binary files a/apps/driver-archive-cubit/assets/images/on2.png and /dev/null differ diff --git a/apps/driver-archive-cubit/assets/images/on3.png b/apps/driver-archive-cubit/assets/images/on3.png deleted file mode 100755 index 88af4ae..0000000 Binary files a/apps/driver-archive-cubit/assets/images/on3.png and /dev/null differ diff --git a/apps/driver-archive-cubit/assets/images/picker.png b/apps/driver-archive-cubit/assets/images/picker.png deleted file mode 100755 index 6a35bf3..0000000 Binary files a/apps/driver-archive-cubit/assets/images/picker.png and /dev/null differ diff --git a/apps/driver-archive-cubit/assets/images/s.png b/apps/driver-archive-cubit/assets/images/s.png deleted file mode 100755 index dd3b7b8..0000000 Binary files a/apps/driver-archive-cubit/assets/images/s.png and /dev/null differ diff --git a/apps/driver-archive-cubit/assets/order.mp3 b/apps/driver-archive-cubit/assets/order.mp3 deleted file mode 100755 index b2b0ba2..0000000 Binary files a/apps/driver-archive-cubit/assets/order.mp3 and /dev/null differ diff --git a/apps/driver-archive-cubit/assets/order1.wav b/apps/driver-archive-cubit/assets/order1.wav deleted file mode 100755 index 919fdda..0000000 Binary files a/apps/driver-archive-cubit/assets/order1.wav and /dev/null differ diff --git a/apps/driver-archive-cubit/bubble-master/.gitignore b/apps/driver-archive-cubit/bubble-master/.gitignore deleted file mode 100755 index af412f1..0000000 --- a/apps/driver-archive-cubit/bubble-master/.gitignore +++ /dev/null @@ -1,7 +0,0 @@ -.DS_Store -.dart_tool/ - -.packages -.pub/ - -build/ diff --git a/apps/driver-archive-cubit/bubble-master/.metadata b/apps/driver-archive-cubit/bubble-master/.metadata deleted file mode 100755 index 27b30b4..0000000 --- a/apps/driver-archive-cubit/bubble-master/.metadata +++ /dev/null @@ -1,10 +0,0 @@ -# This file tracks properties of this Flutter project. -# Used by Flutter tool to assess capabilities and perform upgrades etc. -# -# This file should be version controlled and should not be manually edited. - -version: - revision: f4abaa0735eba4dfd8f33f73363911d63931fe03 - channel: stable - -project_type: plugin diff --git a/apps/driver-archive-cubit/bubble-master/CHANGELOG.md b/apps/driver-archive-cubit/bubble-master/CHANGELOG.md deleted file mode 100755 index 1c63343..0000000 --- a/apps/driver-archive-cubit/bubble-master/CHANGELOG.md +++ /dev/null @@ -1,14 +0,0 @@ -## 0.0.1 - -* Created and implemented startBubbleHead and closeBubbleHead usecases for bubble head package - - -## 0.0.2 -* Fix read-me documentation - -## 0.0.3 -* Fix read-me documentation (added `Buy me a coffee link`) - -## 0.0.4 -* Added optional parameter to enable or disable send-app-to-background -* Updated documentation \ No newline at end of file diff --git a/apps/driver-archive-cubit/bubble-master/LICENSE b/apps/driver-archive-cubit/bubble-master/LICENSE deleted file mode 100755 index a7446aa..0000000 --- a/apps/driver-archive-cubit/bubble-master/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -MIT License - -Copyright (c) 2021 chrisoftech - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. diff --git a/apps/driver-archive-cubit/bubble-master/README.md b/apps/driver-archive-cubit/bubble-master/README.md deleted file mode 100755 index 63dffed..0000000 --- a/apps/driver-archive-cubit/bubble-master/README.md +++ /dev/null @@ -1,128 +0,0 @@ -# bubble_head - - -A flutter plugin to enable you launch a bubble while putting your application to background and upon clicking the bubble brings your application back to foreground - -## Getting Started -### Add dependency - -```yaml - dependencies: - bubble_head: ^0.0.4 -``` - - -### Add in android-manifest file (**../main/AndroidManifest.xml**) - -If you are unsure on where to do this, you can reference the example project AndroidManifest.xml file [here](example/android/app/src/main/AndroidManifest.xml) - - -Add `SYSTEM_ALERT_WINDOW` permission in manifest -```xml - -``` - -NOTE: For best UX practices, you should request for `SYSTEM_ALERT_WINDOW` permission on your application launch (if permission `status` is not granted) -To request for permission, we advise the use of this [package](https://pub.dev/packages/permission_handler) - - -Add `intent-filter` in activity tag - -```xml - - - - -``` - -Add `service` in application tag -```xml - -``` - -### Note: To set bubble icon, create `assets/images` folder path and add your png icon with name `icon.png` to the directory (ensure to import assets in your `pubspec.yaml` file) - -**GIF illustration** - -[![](example/assets/images/bubble_head_example.gif)](example/assets/images/bubble_head_example.gif "Bubble-head example") - -### Examples - -**To start bubble** -[This puts your app in background and can be re-launched (brought to foreground) on tap of the bubble] - -```dart - Bubble _bubble = new Bubble(); - - Future startBubbleHead() async { - - try { - await _bubble.startBubbleHead(); - } on PlatformException { - print('Failed to call startBubbleHead'); - } - } -``` - -**To stop/close bubble** - -```dart - Bubble _bubble = new Bubble(); - - Future stopBubbleHead() async { - - try { - await _bubble.stopBubbleHead(); - } on PlatformException { - print('Failed to call stopBubbleHead'); - } - } -``` - -You can prevent the default action of putting your application in background when starting `bubble_head` by setting `sendAppToBackground` parameter when starting bubble head (if you choose to use another means of sending your application to background) - -```dart - Bubble _bubble = new Bubble(); - - Future startBubbleHead() async { - - try { - // this will only display the bubble-head without sending the application to background - await _bubble.startBubbleHead(sendAppToBackground: false); - } on PlatformException { - print('Failed to call startBubbleHead'); - } - } -``` - - -**Other parameters** -(You can choose to tweak **optional** parameters when initializing bubble) - - -```dart - Bubble({ - this.shouldBounce = true, - this.allowDragToClose = true, - this.showCloseButton = false, - }); -``` -```dart - Bubble().startBubbleHead(sendAppToBackground: true); -``` - -**Parameter Definition** -- shouldBounce - Defaults to `True` -(Adds animation to bubble-head) -- allowDragToClose - Defaults to `True` -(Enables dragging bubble to bottom screen to exit) -- showCloseButton - Defaults to `False` -(Adds a close button icon to the bubble-head) -- sendAppToBackground - Defaults to `True` -(Sends application to background) - -## [Buy me a Coffee](https://www.buymeacoffee.com/dsaved) - diff --git a/apps/driver-archive-cubit/bubble-master/android/.gitignore b/apps/driver-archive-cubit/bubble-master/android/.gitignore deleted file mode 100755 index 4c9e2c6..0000000 --- a/apps/driver-archive-cubit/bubble-master/android/.gitignore +++ /dev/null @@ -1,8 +0,0 @@ -*.iml -.gradle -/local.properties -/.idea/workspace.xml -/.idea/libraries -.DS_Store -/build -/captures diff --git a/apps/driver-archive-cubit/bubble-master/android/build.gradle b/apps/driver-archive-cubit/bubble-master/android/build.gradle deleted file mode 100755 index 59519d5..0000000 --- a/apps/driver-archive-cubit/bubble-master/android/build.gradle +++ /dev/null @@ -1,35 +0,0 @@ -group 'com.dsaved.bubblehead.bubble' -version '1.0' - -buildscript { - repositories { - google() - mavenCentral() - } - - dependencies { - classpath 'com.android.tools.build:gradle:4.1.3' - } -} - -rootProject.allprojects { - repositories { - google() - mavenCentral() - } -} - -apply plugin: 'com.android.library' - -android { - namespace 'com.dsaved.bubblehead.bubble' - compileSdkVersion 36 - - defaultConfig { - minSdkVersion 16 - } -} - -dependencies { - implementation 'com.google.android.material:material:1.4.0' -} diff --git a/apps/driver-archive-cubit/bubble-master/android/gradle.properties b/apps/driver-archive-cubit/bubble-master/android/gradle.properties deleted file mode 100755 index 46c1f16..0000000 --- a/apps/driver-archive-cubit/bubble-master/android/gradle.properties +++ /dev/null @@ -1,3 +0,0 @@ -org.gradle.jvmargs=-Xmx1536M -android.useAndroidX=true -android.enableJetifier=true diff --git a/apps/driver-archive-cubit/bubble-master/android/gradle/wrapper/gradle-wrapper.properties b/apps/driver-archive-cubit/bubble-master/android/gradle/wrapper/gradle-wrapper.properties deleted file mode 100755 index e392edb..0000000 --- a/apps/driver-archive-cubit/bubble-master/android/gradle/wrapper/gradle-wrapper.properties +++ /dev/null @@ -1,5 +0,0 @@ -distributionBase=GRADLE_USER_HOME -distributionPath=wrapper/dists -zipStoreBase=GRADLE_USER_HOME -zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-6.7-all.zip diff --git a/apps/driver-archive-cubit/bubble-master/android/settings.gradle b/apps/driver-archive-cubit/bubble-master/android/settings.gradle deleted file mode 100755 index a1c42ae..0000000 --- a/apps/driver-archive-cubit/bubble-master/android/settings.gradle +++ /dev/null @@ -1 +0,0 @@ -rootProject.name = 'bubble' diff --git a/apps/driver-archive-cubit/bubble-master/android/src/main/AndroidManifest.xml b/apps/driver-archive-cubit/bubble-master/android/src/main/AndroidManifest.xml deleted file mode 100755 index adf9d32..0000000 --- a/apps/driver-archive-cubit/bubble-master/android/src/main/AndroidManifest.xml +++ /dev/null @@ -1,4 +0,0 @@ - - - diff --git a/apps/driver-archive-cubit/bubble-master/android/src/main/java/com/dsaved/bubblehead/bubble/BubbleHeadService.java b/apps/driver-archive-cubit/bubble-master/android/src/main/java/com/dsaved/bubblehead/bubble/BubbleHeadService.java deleted file mode 100755 index 7b86119..0000000 --- a/apps/driver-archive-cubit/bubble-master/android/src/main/java/com/dsaved/bubblehead/bubble/BubbleHeadService.java +++ /dev/null @@ -1,456 +0,0 @@ -package com.dsaved.bubblehead.bubble; - -import android.annotation.SuppressLint; -import android.app.Service; -import android.content.ComponentName; -import android.content.Context; -import android.content.Intent; -import android.content.res.Configuration; -import android.graphics.Bitmap; -import android.graphics.BitmapFactory; -import android.graphics.PixelFormat; -import android.graphics.Point; -import android.os.Build; -import android.os.CountDownTimer; -import android.os.Handler; -import android.os.IBinder; -import android.util.Base64; -import android.view.Gravity; -import android.view.LayoutInflater; -import android.view.MotionEvent; -import android.view.View; -import android.view.WindowManager; -import android.widget.ImageView; - -public class BubbleHeadService extends Service implements View.OnClickListener { - private WindowManager mWindowManager; - private View mFloatingWidgetView; - private ImageView remove_image_view; - private final Point szWindow = new Point(); - private View removeFloatingWidgetView; - private static boolean showCloseButton = false, _bounce = true, _dragToClose = true, _sendAppToBackground = true; - private boolean _continueToSnap = false; - - private int x_init_cord, y_init_cord, x_init_margin, y_init_margin; - static Bitmap _image; - - // Set the value for showing close button to true or false - public static void shouldShowCloseButton(Boolean show) { - showCloseButton = show; - } - - // set to true to enable bouncing - public static void bounce(Boolean bounce) { - _bounce = bounce; - } - - // Set the value for drag to close to enable dragging bubble to close - public static void dragToClose(Boolean dragToClose) { - _dragToClose = dragToClose; - } - - public static void sendAppToBackground(Boolean sendAppToBackground) { - _sendAppToBackground = sendAppToBackground; - } - - public static void startService(Context activity, String image) { - byte[] decodedBytes = Base64.decode(image, Base64.DEFAULT); - _image = BitmapFactory.decodeByteArray(decodedBytes, 0, decodedBytes.length); - - // send application to background if this is true - if (_sendAppToBackground) { - Intent i = new Intent(); - i.setAction(Intent.ACTION_MAIN); - i.addCategory(Intent.CATEGORY_HOME); - activity.startActivity(i); - } - - Intent intent = new Intent(activity, BubbleHeadService.class); - activity.startService(intent); - } - - public static void stopService(Context activity) { - Intent intent = new Intent(activity, BubbleHeadService.class); - activity.stopService(intent); - } - - // create an empty constructor - public BubbleHeadService() { - } - - @Override - public IBinder onBind(Intent intent) { - return null; - } - - @SuppressLint({"ClickableViewAccessibility", "InflateParams"}) - @Override - public void onCreate() { - super.onCreate(); - // init WindowManager - mWindowManager = (WindowManager) getSystemService(WINDOW_SERVICE); - getWindowManagerDefaultDisplay(); - - // Init LayoutInflater - LayoutInflater inflater = (LayoutInflater) getSystemService(LAYOUT_INFLATER_SERVICE); - - // Inflate the removing view layout we created - removeFloatingWidgetView = inflater.inflate(R.layout.bubble_head_remove_widget, null); - - // Add the view to the window. - WindowManager.LayoutParams paramRemove; - if (Build.VERSION.SDK_INT < Build.VERSION_CODES.O) { - paramRemove = new WindowManager.LayoutParams( - WindowManager.LayoutParams.WRAP_CONTENT, - WindowManager.LayoutParams.WRAP_CONTENT, - WindowManager.LayoutParams.TYPE_PHONE, - WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE, - PixelFormat.TRANSLUCENT); - } else { - paramRemove = new WindowManager.LayoutParams( - WindowManager.LayoutParams.WRAP_CONTENT, - WindowManager.LayoutParams.WRAP_CONTENT, - WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY, - WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE, - PixelFormat.TRANSLUCENT); - } - - // Specify the view position - paramRemove.gravity = Gravity.TOP | Gravity.LEFT; - - // Initially the Removing widget view is not visible, so set visibility to GONE - removeFloatingWidgetView.setVisibility(View.GONE); - remove_image_view = (ImageView) removeFloatingWidgetView.findViewById(R.id.remove_img); - - // Add the view to the window - mWindowManager.addView(removeFloatingWidgetView, paramRemove); - - // Inflate the floating view layout we created - mFloatingWidgetView = inflater.inflate(R.layout.layout_bubble_head, null); - - // Add the view to the window. - WindowManager.LayoutParams params; - if (Build.VERSION.SDK_INT < Build.VERSION_CODES.O) { - params = new WindowManager.LayoutParams( - WindowManager.LayoutParams.WRAP_CONTENT, - WindowManager.LayoutParams.WRAP_CONTENT, - WindowManager.LayoutParams.TYPE_PHONE, - WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE, - PixelFormat.TRANSLUCENT); - } else { - params = new WindowManager.LayoutParams( - WindowManager.LayoutParams.WRAP_CONTENT, - WindowManager.LayoutParams.WRAP_CONTENT, - WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY, - WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE, - PixelFormat.TRANSLUCENT); - } - - // Specify the view position - params.gravity = Gravity.TOP | Gravity.LEFT; - - // Initially view will be added to top-left corner, you change x-y coordinates according to your need - params.x = 0; - params.y = 100; - - // Add the view to the window - mWindowManager.addView(mFloatingWidgetView, params); - - //set image to chatHead - ImageView chatHeadImage = mFloatingWidgetView.findViewById(R.id.chat_head_profile_iv); - chatHeadImage.setImageBitmap(_image); - - // find id of close image button - ImageView closeBubbleHead = mFloatingWidgetView.findViewById(R.id.close_bubble_head); - closeBubbleHead.setOnClickListener(this); - if (!showCloseButton) { - closeBubbleHead.setVisibility(View.GONE); - } - - implementTouchListenerToFloatingWidgetView(); - } - - private void getWindowManagerDefaultDisplay() { - mWindowManager.getDefaultDisplay().getSize(szWindow); - } - - @SuppressLint("ClickableViewAccessibility") - private void implementTouchListenerToFloatingWidgetView() { - _continueToSnap = true; - // Drag and move chat head using user's touch action. - mFloatingWidgetView.findViewById(R.id.root_container); - mFloatingWidgetView.setOnTouchListener(new View.OnTouchListener() { - long time_start = 0, time_end = 0; - - boolean isLongClick = false; - boolean inBounded = false; - int remove_img_width = 0, remove_img_height = 0; - - final Handler handler_longClick = new Handler(); - final Runnable runnable_longClick = new Runnable() { - @Override - public void run() { - isLongClick = true; - removeFloatingWidgetView.setVisibility(View.VISIBLE); - onFloatingWidgetLongClick(); - } - }; - - @Override - public boolean onTouch(View v, MotionEvent event) { - WindowManager.LayoutParams layoutParams = (WindowManager.LayoutParams) mFloatingWidgetView.getLayoutParams(); - - int x_cord = (int) event.getRawX(); - int y_cord = (int) event.getRawY(); - - int x_cord_Destination, y_cord_Destination; - - switch (event.getAction()) { - case MotionEvent.ACTION_DOWN: - time_start = System.currentTimeMillis(); - - if (_dragToClose) { - handler_longClick.postDelayed(runnable_longClick, 100); - } - remove_img_width = remove_image_view.getLayoutParams().width; - remove_img_height = remove_image_view.getLayoutParams().height; - - x_init_cord = x_cord; - y_init_cord = y_cord; - - // remember the initial position. - x_init_margin = layoutParams.x; - y_init_margin = layoutParams.y; - return true; - case MotionEvent.ACTION_UP: - isLongClick = false; - removeFloatingWidgetView.setVisibility(View.GONE); - remove_image_view.getLayoutParams().height = remove_img_height; - remove_image_view.getLayoutParams().width = remove_img_width; - - if (_dragToClose) { - handler_longClick.removeCallbacks(runnable_longClick); - } - - // If user drag and drop the floating widget view - // into remove view then stop the service - if (inBounded) { - stopSelf(); - inBounded = false; - break; - } - - // Difference between initial coordinate and current coordinate - int x_diff = x_cord - x_init_cord; - int y_diff = y_cord - y_init_cord; - - // check if action move is little as move happen on view with just a tap - if (Math.abs(x_diff) < 5 && Math.abs(y_diff) < 5) { - time_end = System.currentTimeMillis(); - // only perform click if time is less than 200ms - if ((time_end - time_start) < 200) { - onFloatingWidgetClick(); - } - } - - y_cord_Destination = y_init_margin + y_diff; - - int barHeight = getStatusBarHeight(); - if (y_cord_Destination < 0) { - y_cord_Destination = 0; - } else if (y_cord_Destination + (mFloatingWidgetView.getHeight() + barHeight) > szWindow.y) { - y_cord_Destination = szWindow.y - (mFloatingWidgetView.getHeight() + barHeight); - } - - layoutParams.y = y_cord_Destination; - - inBounded = false; - - // reset position - resetPosition(x_cord); - return true; - case MotionEvent.ACTION_MOVE: - int x_diff_move = x_cord - x_init_cord; - int y_diff_move = y_cord - y_init_cord; - - x_cord_Destination = x_init_margin + x_diff_move; - y_cord_Destination = y_init_margin + y_diff_move; - - // If user long click the floating view, update remove view - if (isLongClick) { - int x_bound_left = szWindow.x / 2 - (int) (remove_img_width * 1.5); - int x_bound_right = szWindow.x / 2 + (int) (remove_img_width * 1.5); - int y_bound_top = szWindow.y - (int) (remove_img_height * 1.5); - - // If Floating view comes under Remove View update Window Manager - if ((x_cord >= x_bound_left && x_cord <= x_bound_right) && y_cord >= y_bound_top) { - inBounded = true; - - int x_cord_remove = (int) ((szWindow.x - (remove_img_height * 1.5)) / 2); - int y_cord_remove = (int) (szWindow.y - ((remove_img_width * 1.5) + getStatusBarHeight())); - - if (remove_image_view.getLayoutParams().height == remove_img_height) { - WindowManager.LayoutParams param_remove = (WindowManager.LayoutParams) removeFloatingWidgetView.getLayoutParams(); - param_remove.x = x_cord_remove; - param_remove.y = y_cord_remove; - - mWindowManager.updateViewLayout(removeFloatingWidgetView, param_remove); - } - - layoutParams.x = x_cord_remove + (Math.abs(removeFloatingWidgetView.getWidth() - mFloatingWidgetView.getWidth())) / 2; - layoutParams.y = y_cord_remove + (Math.abs(removeFloatingWidgetView.getHeight() - mFloatingWidgetView.getHeight())) / 2; - - // Update the layout with new X & Y coordinate - mWindowManager.updateViewLayout(mFloatingWidgetView, layoutParams); - break; - } else { - // If Floating window gets out of the Remove view update Remove view again - inBounded = false; - remove_image_view.getLayoutParams().height = remove_img_height; - remove_image_view.getLayoutParams().width = remove_img_width; -// onFloatingWidgetClick(); - } - - } - - layoutParams.x = x_cord_Destination; - layoutParams.y = y_cord_Destination; - - // Update the layout with new X & Y coordinate - mWindowManager.updateViewLayout(mFloatingWidgetView, layoutParams); - return true; - } - return false; - } - }); - } - - @Override - public void onClick(View v) { - int id = v.getId(); - if (id == R.id.close_bubble_head) { - stopSelf(); - } - } - - private void onFloatingWidgetLongClick() { - // Get remove Floating view params - WindowManager.LayoutParams removeParams = (WindowManager.LayoutParams) removeFloatingWidgetView.getLayoutParams(); - - // get x and y coordinates of remove view - int x_cord = (szWindow.x - removeFloatingWidgetView.getWidth()) / 2; - int y_cord = szWindow.y - (removeFloatingWidgetView.getHeight() + getStatusBarHeight()); - - removeParams.x = x_cord; - removeParams.y = y_cord; - - // Update Remove view params - mWindowManager.updateViewLayout(removeFloatingWidgetView, removeParams); - } - - // Reset position of Floating Widget view on dragging - private void resetPosition(int x_cord_now) { - if (_continueToSnap) { - if (x_cord_now <= szWindow.x / 2) { - snapToLeft(x_cord_now); - } else { - snapToRight(x_cord_now); - } - } - } - - private void snapToLeft(final int current_x_cord) { - final int x = szWindow.x - current_x_cord; - new CountDownTimer(500, 5) { - final WindowManager.LayoutParams mParams = (WindowManager.LayoutParams) mFloatingWidgetView.getLayoutParams(); - - public void onTick(long t) { - long step = (500 - t) / 5; - mParams.x = -(int) (current_x_cord * current_x_cord * step); - if (_bounce) { - mParams.x = -(int) (double) bounceValue(step, x); - } - mWindowManager.updateViewLayout(mFloatingWidgetView, mParams); - } - - public void onFinish() { - mParams.x = 0; - mWindowManager.updateViewLayout(mFloatingWidgetView, mParams); - } - }.start(); - } - - private void snapToRight(final int current_x_cord) { - new CountDownTimer(500, 5) { - final WindowManager.LayoutParams mParams = (WindowManager.LayoutParams) mFloatingWidgetView.getLayoutParams(); - - public void onTick(long t) { - long step = (500 - t) / 5; - mParams.x = (int) (szWindow.x + (current_x_cord * current_x_cord * step) - mFloatingWidgetView.getWidth()); - if (_bounce) { - mParams.x = szWindow.x + (int) (double) bounceValue(step, current_x_cord) - mFloatingWidgetView.getWidth(); - } - mWindowManager.updateViewLayout(mFloatingWidgetView, mParams); - } - - public void onFinish() { - mParams.x = szWindow.x - mFloatingWidgetView.getWidth(); - mWindowManager.updateViewLayout(mFloatingWidgetView, mParams); - } - }.start(); - } - - private double bounceValue(long step, long scale) { - return scale * Math.exp(-0.15 * step) * Math.cos(0.08 * step); - } - - private int getStatusBarHeight() { - return (int) Math.ceil(25 * getApplicationContext().getResources().getDisplayMetrics().density); - } - - @Override - public void onConfigurationChanged(Configuration newConfig) { - super.onConfigurationChanged(newConfig); - - getWindowManagerDefaultDisplay(); - WindowManager.LayoutParams layoutParams = (WindowManager.LayoutParams) mFloatingWidgetView.getLayoutParams(); - - if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) { - if (layoutParams.y + (mFloatingWidgetView.getHeight() + getStatusBarHeight()) > szWindow.y) { - layoutParams.y = szWindow.y - (mFloatingWidgetView.getHeight() + getStatusBarHeight()); - mWindowManager.updateViewLayout(mFloatingWidgetView, layoutParams); - } - - if (layoutParams.x != 0 && layoutParams.x < szWindow.x) { - resetPosition(szWindow.x); - } - } else if (newConfig.orientation == Configuration.ORIENTATION_PORTRAIT) { - if (layoutParams.x > szWindow.x) { - resetPosition(szWindow.x); - } - } - } - - private void onFloatingWidgetClick() { - _continueToSnap = false; - // bring the application to front - Intent it = new Intent("intent.bring.app.to.foreground"); - it.setComponent(new ComponentName(getPackageName(), getApplicationContext().getPackageName() + ".MainActivity")); - it.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); - getApplicationContext().startActivity(it); - - // stop the service - stopSelf(); - } - - @Override - public void onDestroy() { - super.onDestroy(); - if (mFloatingWidgetView != null) { - mWindowManager.removeView(mFloatingWidgetView); - } - if (removeFloatingWidgetView != null) { - mWindowManager.removeView(removeFloatingWidgetView); - } - } -} diff --git a/apps/driver-archive-cubit/bubble-master/android/src/main/java/com/dsaved/bubblehead/bubble/BubblePlugin.java b/apps/driver-archive-cubit/bubble-master/android/src/main/java/com/dsaved/bubblehead/bubble/BubblePlugin.java deleted file mode 100755 index 1dc7421..0000000 --- a/apps/driver-archive-cubit/bubble-master/android/src/main/java/com/dsaved/bubblehead/bubble/BubblePlugin.java +++ /dev/null @@ -1,95 +0,0 @@ -package com.dsaved.bubblehead.bubble; - -import android.content.Context; -import android.os.Build; -import android.provider.Settings; - -import androidx.annotation.NonNull; -import androidx.annotation.RequiresApi; - -import io.flutter.embedding.engine.plugins.FlutterPlugin; -import io.flutter.embedding.engine.plugins.activity.ActivityAware; -import io.flutter.embedding.engine.plugins.activity.ActivityPluginBinding; -import io.flutter.plugin.common.MethodCall; -import io.flutter.plugin.common.MethodChannel; -import io.flutter.plugin.common.MethodChannel.MethodCallHandler; -import io.flutter.plugin.common.MethodChannel.Result; - -/** - * BubblePlugin - */ -public class BubblePlugin implements FlutterPlugin, MethodCallHandler, ActivityAware { - /// The MethodChannel that will the communication between Flutter and native Android - /// - /// This local reference serves to register the plugin with the Flutter Engine and unregister it - /// when the Flutter Engine is detached from the Activity - private MethodChannel channel; - private Context activity; - - - @Override - public void onAttachedToEngine(@NonNull FlutterPluginBinding flutterPluginBinding) { - channel = new MethodChannel(flutterPluginBinding.getBinaryMessenger(), "com.dsaved.bubble.head"); - channel.setMethodCallHandler(this); - } - - @RequiresApi(api = Build.VERSION_CODES.M) - @Override - public void onMethodCall(@NonNull MethodCall call, @NonNull Result result) { - if (call.method.equals("startBubbleHead")) { - startBubbleHead(result, call); - } else if (call.method.equals("stopBubbleHead")) { - BubbleHeadService.stopService(activity); - } else { - result.notImplemented(); - } - } - - @RequiresApi(api = Build.VERSION_CODES.M) - public void startBubbleHead(@NonNull Result result, MethodCall call) { - if (Settings.canDrawOverlays(activity)) { - boolean bounce = call.argument("bounce"); - BubbleHeadService.bounce(bounce); - - boolean showClose = call.argument("showClose"); - BubbleHeadService.shouldShowCloseButton(showClose); - - boolean dragToClose = call.argument("dragToClose"); - BubbleHeadService.dragToClose(dragToClose); - - boolean sendAppToBackground = call.argument("sendAppToBackground"); - BubbleHeadService.sendAppToBackground(sendAppToBackground); - - String imageByte = call.argument("image"); - BubbleHeadService.startService(activity, imageByte); - } else { - //Permission is not available - result.error("EPERMNOTGRANTED", "permission not available", "Please request permission for: android.permission.SYSTEM_ALERT_WINDOW. with out this permission you cannot launch the bubble head."); - } - } - - @Override - public void onDetachedFromEngine(@NonNull FlutterPluginBinding binding) { - channel.setMethodCallHandler(null); - } - - @Override - public void onAttachedToActivity(@NonNull ActivityPluginBinding binding) { - this.activity = binding.getActivity(); - } - - @Override - public void onDetachedFromActivityForConfigChanges() { - - } - - @Override - public void onReattachedToActivityForConfigChanges(@NonNull ActivityPluginBinding binding) { - - } - - @Override - public void onDetachedFromActivity() { - - } -} diff --git a/apps/driver-archive-cubit/bubble-master/android/src/main/res/drawable/circle_shape.xml b/apps/driver-archive-cubit/bubble-master/android/src/main/res/drawable/circle_shape.xml deleted file mode 100755 index 39b30cf..0000000 --- a/apps/driver-archive-cubit/bubble-master/android/src/main/res/drawable/circle_shape.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - - \ No newline at end of file diff --git a/apps/driver-archive-cubit/bubble-master/android/src/main/res/drawable/ic_aspect_ratio_black_24dp.xml b/apps/driver-archive-cubit/bubble-master/android/src/main/res/drawable/ic_aspect_ratio_black_24dp.xml deleted file mode 100755 index fd01d34..0000000 --- a/apps/driver-archive-cubit/bubble-master/android/src/main/res/drawable/ic_aspect_ratio_black_24dp.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - diff --git a/apps/driver-archive-cubit/bubble-master/android/src/main/res/drawable/ic_close_black_24dp.xml b/apps/driver-archive-cubit/bubble-master/android/src/main/res/drawable/ic_close_black_24dp.xml deleted file mode 100755 index 20a88e1..0000000 --- a/apps/driver-archive-cubit/bubble-master/android/src/main/res/drawable/ic_close_black_24dp.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - diff --git a/apps/driver-archive-cubit/bubble-master/android/src/main/res/drawable/ic_close_white_24dp.xml b/apps/driver-archive-cubit/bubble-master/android/src/main/res/drawable/ic_close_white_24dp.xml deleted file mode 100755 index 7fb0631..0000000 --- a/apps/driver-archive-cubit/bubble-master/android/src/main/res/drawable/ic_close_white_24dp.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - diff --git a/apps/driver-archive-cubit/bubble-master/android/src/main/res/drawable/ic_launcher.png b/apps/driver-archive-cubit/bubble-master/android/src/main/res/drawable/ic_launcher.png deleted file mode 100755 index cde69bc..0000000 Binary files a/apps/driver-archive-cubit/bubble-master/android/src/main/res/drawable/ic_launcher.png and /dev/null differ diff --git a/apps/driver-archive-cubit/bubble-master/android/src/main/res/drawable/white_circle_shape.xml b/apps/driver-archive-cubit/bubble-master/android/src/main/res/drawable/white_circle_shape.xml deleted file mode 100755 index 53a328a..0000000 --- a/apps/driver-archive-cubit/bubble-master/android/src/main/res/drawable/white_circle_shape.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/apps/driver-archive-cubit/bubble-master/android/src/main/res/layout/bubble_head_remove_widget.xml b/apps/driver-archive-cubit/bubble-master/android/src/main/res/layout/bubble_head_remove_widget.xml deleted file mode 100755 index 532c606..0000000 --- a/apps/driver-archive-cubit/bubble-master/android/src/main/res/layout/bubble_head_remove_widget.xml +++ /dev/null @@ -1,16 +0,0 @@ - - - - - - diff --git a/apps/driver-archive-cubit/bubble-master/android/src/main/res/layout/layout_bubble_head.xml b/apps/driver-archive-cubit/bubble-master/android/src/main/res/layout/layout_bubble_head.xml deleted file mode 100755 index b237150..0000000 --- a/apps/driver-archive-cubit/bubble-master/android/src/main/res/layout/layout_bubble_head.xml +++ /dev/null @@ -1,45 +0,0 @@ - - - - - - - - - - - - - - - - - - - diff --git a/apps/driver-archive-cubit/bubble-master/android/src/main/res/values/styles.xml b/apps/driver-archive-cubit/bubble-master/android/src/main/res/values/styles.xml deleted file mode 100755 index ce24e43..0000000 --- a/apps/driver-archive-cubit/bubble-master/android/src/main/res/values/styles.xml +++ /dev/null @@ -1,16 +0,0 @@ - - - - - - - - \ No newline at end of file diff --git a/apps/driver-archive-cubit/bubble-master/lib/bubble.dart b/apps/driver-archive-cubit/bubble-master/lib/bubble.dart deleted file mode 100755 index 00fa44a..0000000 --- a/apps/driver-archive-cubit/bubble-master/lib/bubble.dart +++ /dev/null @@ -1,41 +0,0 @@ -import 'dart:async'; -import 'dart:convert'; -import 'dart:typed_data'; - -import 'package:flutter/services.dart'; - -class Bubble { - static const MethodChannel _channel = - const MethodChannel('com.dsaved.bubble.head'); - - bool shouldBounce; - bool showCloseButton; - bool allowDragToClose; - - Bubble({ - this.shouldBounce = true, - this.allowDragToClose = true, - this.showCloseButton = false, - }); - - /// puts app in background and shows floaty-bubble head - Future startBubbleHead({bool sendAppToBackground = true}) async { - ByteData bytes = await rootBundle.load( - 'assets/images/s.png', - ); - var buffer = bytes.buffer; - var encodedImage = base64.encode(Uint8List.view(buffer)); - await _channel.invokeMethod('startBubbleHead', { - "image": encodedImage, - "bounce": shouldBounce, - "showClose": showCloseButton, - "dragToClose": allowDragToClose, - "sendAppToBackground": sendAppToBackground, - }); - } - - /// closes floaty-bubble head - Future stopBubbleHead() async { - await _channel.invokeMethod('stopBubbleHead'); - } -} diff --git a/apps/driver-archive-cubit/bubble-master/pubspec.lock b/apps/driver-archive-cubit/bubble-master/pubspec.lock deleted file mode 100755 index c45a5a1..0000000 --- a/apps/driver-archive-cubit/bubble-master/pubspec.lock +++ /dev/null @@ -1,189 +0,0 @@ -# Generated by pub -# See https://dart.dev/tools/pub/glossary#lockfile -packages: - async: - dependency: transitive - description: - name: async - sha256: e2eb0491ba5ddb6177742d2da23904574082139b07c1e33b8503b9f46f3e1a37 - url: "https://pub.dev" - source: hosted - version: "2.13.1" - boolean_selector: - dependency: transitive - description: - name: boolean_selector - sha256: "8aab1771e1243a5063b8b0ff68042d67334e3feab9e95b9490f9a6ebf73b42ea" - url: "https://pub.dev" - source: hosted - version: "2.1.2" - characters: - dependency: transitive - description: - name: characters - sha256: faf38497bda5ead2a8c7615f4f7939df04333478bf32e4173fcb06d428b5716b - url: "https://pub.dev" - source: hosted - version: "1.4.1" - clock: - dependency: transitive - description: - name: clock - sha256: fddb70d9b5277016c77a80201021d40a2247104d9f4aa7bab7157b7e3f05b84b - url: "https://pub.dev" - source: hosted - version: "1.1.2" - collection: - dependency: transitive - description: - name: collection - sha256: "2f5709ae4d3d59dd8f7cd309b4e023046b57d8a6c82130785d2b0e5868084e76" - url: "https://pub.dev" - source: hosted - version: "1.19.1" - fake_async: - dependency: transitive - description: - name: fake_async - sha256: "5368f224a74523e8d2e7399ea1638b37aecfca824a3cc4dfdf77bf1fa905ac44" - url: "https://pub.dev" - source: hosted - version: "1.3.3" - flutter: - dependency: "direct main" - description: flutter - source: sdk - version: "0.0.0" - flutter_test: - dependency: "direct dev" - description: flutter - source: sdk - version: "0.0.0" - leak_tracker: - dependency: transitive - description: - name: leak_tracker - sha256: "33e2e26bdd85a0112ec15400c8cbffea70d0f9c3407491f672a2fad47915e2de" - url: "https://pub.dev" - source: hosted - version: "11.0.2" - leak_tracker_flutter_testing: - dependency: transitive - description: - name: leak_tracker_flutter_testing - sha256: "1dbc140bb5a23c75ea9c4811222756104fbcd1a27173f0c34ca01e16bea473c1" - url: "https://pub.dev" - source: hosted - version: "3.0.10" - leak_tracker_testing: - dependency: transitive - description: - name: leak_tracker_testing - sha256: "8d5a2d49f4a66b49744b23b018848400d23e54caf9463f4eb20df3eb8acb2eb1" - url: "https://pub.dev" - source: hosted - version: "3.0.2" - matcher: - dependency: transitive - description: - name: matcher - sha256: dc0b7dc7651697ea4ff3e69ef44b0407ea32c487a39fff6a4004fa585e901861 - url: "https://pub.dev" - source: hosted - version: "0.12.19" - material_color_utilities: - dependency: transitive - description: - name: material_color_utilities - sha256: "9c337007e82b1889149c82ed242ed1cb24a66044e30979c44912381e9be4c48b" - url: "https://pub.dev" - source: hosted - version: "0.13.0" - meta: - dependency: transitive - description: - name: meta - sha256: "1741988757a65eb6b36abe716829688cf01910bbf91c34354ff7ec1c3de2b349" - url: "https://pub.dev" - source: hosted - version: "1.18.0" - path: - dependency: transitive - description: - name: path - sha256: "75cca69d1490965be98c73ceaea117e8a04dd21217b37b292c9ddbec0d955bc5" - url: "https://pub.dev" - source: hosted - version: "1.9.1" - sky_engine: - dependency: transitive - description: flutter - source: sdk - version: "0.0.0" - source_span: - dependency: transitive - description: - name: source_span - sha256: "56a02f1f4cd1a2d96303c0144c93bd6d909eea6bee6bf5a0e0b685edbd4c47ab" - url: "https://pub.dev" - source: hosted - version: "1.10.2" - stack_trace: - dependency: transitive - description: - name: stack_trace - sha256: "8b27215b45d22309b5cddda1aa2b19bdfec9df0e765f2de506401c071d38d1b1" - url: "https://pub.dev" - source: hosted - version: "1.12.1" - stream_channel: - dependency: transitive - description: - name: stream_channel - sha256: "969e04c80b8bcdf826f8f16579c7b14d780458bd97f56d107d3950fdbeef059d" - url: "https://pub.dev" - source: hosted - version: "2.1.4" - string_scanner: - dependency: transitive - description: - name: string_scanner - sha256: "921cd31725b72fe181906c6a94d987c78e3b98c2e205b397ea399d4054872b43" - url: "https://pub.dev" - source: hosted - version: "1.4.1" - term_glyph: - dependency: transitive - description: - name: term_glyph - sha256: "7f554798625ea768a7518313e58f83891c7f5024f88e46e7182a4558850a4b8e" - url: "https://pub.dev" - source: hosted - version: "1.2.2" - test_api: - dependency: transitive - description: - name: test_api - sha256: "949a932224383300f01be9221c39180316445ecb8e7547f70a41a35bf421fb9e" - url: "https://pub.dev" - source: hosted - version: "0.7.11" - vector_math: - dependency: transitive - description: - name: vector_math - sha256: d530bd74fea330e6e364cda7a85019c434070188383e1cd8d9777ee586914c5b - url: "https://pub.dev" - source: hosted - version: "2.2.0" - vm_service: - dependency: transitive - description: - name: vm_service - sha256: "0016aef94fc66495ac78af5859181e3f3bf2026bd8eecc72b9565601e19ab360" - url: "https://pub.dev" - source: hosted - version: "15.2.0" -sdks: - dart: ">=3.10.0-0 <4.0.0" - flutter: ">=3.18.0-18.0.pre.54" diff --git a/apps/driver-archive-cubit/bubble-master/pubspec.yaml b/apps/driver-archive-cubit/bubble-master/pubspec.yaml deleted file mode 100755 index 65f4b6c..0000000 --- a/apps/driver-archive-cubit/bubble-master/pubspec.yaml +++ /dev/null @@ -1,63 +0,0 @@ -name: bubble_head -description: A flutter plugin to enable you launch a bubble while putting your application to background and upon clicking the bubble brings your application back to foreground -version: 0.0.4 -homepage: https://github.com/chrisoftech/bubble -# publish_to: - -environment: - sdk: ">=3.5.0 <4.0.0" - flutter: ">=1.20.0" - -dependencies: - flutter: - sdk: flutter - -dev_dependencies: - flutter_test: - sdk: flutter - -# For information on the generic Dart part of this file, see the -# following page: https://dart.dev/tools/pub/pubspec - -# The following section is specific to Flutter. -flutter: - # This section identifies this Flutter project as a plugin project. - # The 'pluginClass' and Android 'package' identifiers should not ordinarily - # be modified. They are used by the tooling to maintain consistency when - # adding or updating assets for this project. - plugin: - platforms: - android: - package: com.dsaved.bubblehead.bubble - pluginClass: BubblePlugin - - # To add assets to your plugin package, add an assets section, like this: - # assets: - # - assets/images/ - # - images/a_dot_ham.jpeg - # - # For details regarding assets in packages, see - # https://flutter.dev/assets-and-images/#from-packages - # - # An image asset can refer to one or more resolution-specific "variants", see - # https://flutter.dev/assets-and-images/#resolution-aware. - - # To add custom fonts to your plugin package, add a fonts section here, - # in this "flutter" section. Each entry in this list should have a - # "family" key with the font family name, and a "fonts" key with a - # list giving the asset and other descriptors for the font. For - # example: - # fonts: - # - family: Schyler - # fonts: - # - asset: fonts/Schyler-Regular.ttf - # - asset: fonts/Schyler-Italic.ttf - # style: italic - # - family: Trajan Pro - # fonts: - # - asset: fonts/TrajanPro.ttf - # - asset: fonts/TrajanPro_Bold.ttf - # weight: 700 - # - # For details regarding fonts in packages, see - # https://flutter.dev/custom-fonts/#from-packages diff --git a/apps/driver-archive-cubit/devtools_options.yaml b/apps/driver-archive-cubit/devtools_options.yaml deleted file mode 100755 index 7e7e7f6..0000000 --- a/apps/driver-archive-cubit/devtools_options.yaml +++ /dev/null @@ -1 +0,0 @@ -extensions: diff --git a/apps/driver-archive-cubit/firebase.json b/apps/driver-archive-cubit/firebase.json deleted file mode 100755 index c7c43be..0000000 --- a/apps/driver-archive-cubit/firebase.json +++ /dev/null @@ -1 +0,0 @@ -{"functions":[{"source":"functions","codebase":"default","ignore":["node_modules",".git","firebase-debug.log","firebase-debug.*.log"],"predeploy":["npm --prefix \"$RESOURCE_DIR\" run lint"]}],"flutter":{"platforms":{"android":{"default":{"projectId":"tripz-7883a","appId":"1:139325012385:android:a272f0c9aea4e03d9fb3e0","fileOutput":"android/app/google-services.json"}},"ios":{"default":{"projectId":"tripz-7883a","appId":"1:139325012385:ios:a8221368551c6ef59fb3e0","uploadDebugSymbols":false,"fileOutput":"ios/Runner/GoogleService-Info.plist"}},"dart":{"lib/firebase_options.dart":{"projectId":"tripz-7883a","configurations":{"android":"1:139325012385:android:a272f0c9aea4e03d9fb3e0","ios":"1:139325012385:ios:a8221368551c6ef59fb3e0"}}}}}} \ No newline at end of file diff --git a/apps/driver-archive-cubit/flutter_launcher_icons.yaml b/apps/driver-archive-cubit/flutter_launcher_icons.yaml deleted file mode 100755 index 9903b15..0000000 --- a/apps/driver-archive-cubit/flutter_launcher_icons.yaml +++ /dev/null @@ -1,28 +0,0 @@ -# flutter pub run flutter_launcher_icons -flutter_launcher_icons: - image_path: "assets/images/logo.png" - - android: "launcher_icon" - # image_path_android: "assets/icon/icon.png" - min_sdk_android: 21 # android min sdk min:16, default 21 - # adaptive_icon_background: "assets/icon/background.png" - # adaptive_icon_foreground: "assets/icon/foreground.png" - - ios: true - # image_path_ios: "assets/icon/icon.png" - remove_alpha_channel_ios: true - - web: - generate: true - image_path: "path/to/image.png" - background_color: "#hexcode" - theme_color: "#hexcode" - - windows: - generate: true - image_path: "path/to/image.png" - icon_size: 48 # min:48, max:256, default: 48 - - macos: - generate: true - image_path: "path/to/image.png" diff --git a/apps/driver-archive-cubit/functions/.eslintrc.js b/apps/driver-archive-cubit/functions/.eslintrc.js deleted file mode 100755 index f4cb76c..0000000 --- a/apps/driver-archive-cubit/functions/.eslintrc.js +++ /dev/null @@ -1,28 +0,0 @@ -module.exports = { - env: { - es6: true, - node: true, - }, - parserOptions: { - "ecmaVersion": 2018, - }, - extends: [ - "eslint:recommended", - "google", - ], - rules: { - "no-restricted-globals": ["error", "name", "length"], - "prefer-arrow-callback": "error", - "quotes": ["error", "double", {"allowTemplateLiterals": true}], - }, - overrides: [ - { - files: ["**/*.spec.*"], - env: { - mocha: true, - }, - rules: {}, - }, - ], - globals: {}, -}; diff --git a/apps/driver-archive-cubit/functions/.gitignore b/apps/driver-archive-cubit/functions/.gitignore deleted file mode 100755 index 40b878d..0000000 --- a/apps/driver-archive-cubit/functions/.gitignore +++ /dev/null @@ -1 +0,0 @@ -node_modules/ \ No newline at end of file diff --git a/apps/driver-archive-cubit/functions/index.js b/apps/driver-archive-cubit/functions/index.js deleted file mode 100755 index 9789068..0000000 --- a/apps/driver-archive-cubit/functions/index.js +++ /dev/null @@ -1,39 +0,0 @@ -const express = require("express"); -const {RtcTokenBuilder, RtcRole} = require("agora-access-token"); -const functions = require("firebase-functions"); -const admin = require("firebase-admin"); - -admin.initializeApp(); - -const app = express(); - -const port = 8080; -const appId = "12994c6e707543e68d5638894d04f989"; -const appCertificate = "e21a388f83034a159f2783889a6d7bcf"; - -app.get("/token", (req, res) => { - const channelName = req.query.channelName; - if (!channelName) { - return res.status(500).json({"error": "channelName is required"}); - } - let uid = req.query.uid; - if (!uid) { - uid = 0; - } - let role = RtcRole.SUBSCRIBER; - if (req.query.role == "publisher") { - role = RtcRole.PUBLISHER; - } - let expireTime = req.query.expireTime; - if (!expireTime || expireTime == "") { - expireTime = parseInt(expireTime, 10); - } - const currentTime = Math.floor(Date.now() / 1000); - const privilegeExpireTime = currentTime + expireTime; - - const token = RtcTokenBuilder.buildTokenWithUid(appId, appCertificate, channelName, uid, role, privilegeExpireTime); - - res.json({token}); -}); - -exports.rtcTokenServer = functions.https.onRequest(app); diff --git a/apps/driver-archive-cubit/functions/package-lock.json b/apps/driver-archive-cubit/functions/package-lock.json deleted file mode 100755 index c1c8042..0000000 --- a/apps/driver-archive-cubit/functions/package-lock.json +++ /dev/null @@ -1,7677 +0,0 @@ -{ - "name": "functions", - "lockfileVersion": 3, - "requires": true, - "packages": { - "": { - "name": "functions", - "dependencies": { - "agora-access-token": "^2.0.4", - "express": "^4.18.2", - "firebase": "^10.6.0", - "firebase-admin": "^11.8.0", - "firebase-functions": "^4.7.0" - }, - "devDependencies": { - "eslint": "^8.15.0", - "eslint-config-google": "^0.14.0", - "firebase-functions-test": "^3.1.0" - }, - "engines": { - "node": "18" - } - }, - "node_modules/@aashutoshrathi/word-wrap": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz", - "integrity": "sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/@ampproject/remapping": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.1.tgz", - "integrity": "sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==", - "dev": true, - "peer": true, - "dependencies": { - "@jridgewell/gen-mapping": "^0.3.0", - "@jridgewell/trace-mapping": "^0.3.9" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@babel/code-frame": { - "version": "7.23.5", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.23.5.tgz", - "integrity": "sha512-CgH3s1a96LipHCmSUmYFPwY7MNx8C3avkq7i4Wl3cfa662ldtUe4VM1TPXX70pfmrlWTb6jLqTYrZyT2ZTJBgA==", - "dev": true, - "peer": true, - "dependencies": { - "@babel/highlight": "^7.23.4", - "chalk": "^2.4.2" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/code-frame/node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "peer": true, - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/code-frame/node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "peer": true, - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/code-frame/node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "peer": true, - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/@babel/code-frame/node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true, - "peer": true - }, - "node_modules/@babel/code-frame/node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "dev": true, - "peer": true, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/@babel/code-frame/node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "dev": true, - "peer": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/code-frame/node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "peer": true, - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/compat-data": { - "version": "7.23.5", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.23.5.tgz", - "integrity": "sha512-uU27kfDRlhfKl+w1U6vp16IuvSLtjAxdArVXPa9BvLkrr7CYIsxH5adpHObeAGY/41+syctUWOZ140a2Rvkgjw==", - "dev": true, - "peer": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/core": { - "version": "7.23.9", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.23.9.tgz", - "integrity": "sha512-5q0175NOjddqpvvzU+kDiSOAk4PfdO6FvwCWoQ6RO7rTzEe8vlo+4HVfcnAREhD4npMs0e9uZypjTwzZPCf/cw==", - "dev": true, - "peer": true, - "dependencies": { - "@ampproject/remapping": "^2.2.0", - "@babel/code-frame": "^7.23.5", - "@babel/generator": "^7.23.6", - "@babel/helper-compilation-targets": "^7.23.6", - "@babel/helper-module-transforms": "^7.23.3", - "@babel/helpers": "^7.23.9", - "@babel/parser": "^7.23.9", - "@babel/template": "^7.23.9", - "@babel/traverse": "^7.23.9", - "@babel/types": "^7.23.9", - "convert-source-map": "^2.0.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.2", - "json5": "^2.2.3", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/babel" - } - }, - "node_modules/@babel/generator": { - "version": "7.23.6", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.23.6.tgz", - "integrity": "sha512-qrSfCYxYQB5owCmGLbl8XRpX1ytXlpueOb0N0UmQwA073KZxejgQTzAmJezxvpwQD9uGtK2shHdi55QT+MbjIw==", - "dev": true, - "peer": true, - "dependencies": { - "@babel/types": "^7.23.6", - "@jridgewell/gen-mapping": "^0.3.2", - "@jridgewell/trace-mapping": "^0.3.17", - "jsesc": "^2.5.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-compilation-targets": { - "version": "7.23.6", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.23.6.tgz", - "integrity": "sha512-9JB548GZoQVmzrFgp8o7KxdgkTGm6xs9DW0o/Pim72UDjzr5ObUQ6ZzYPqA+g9OTS2bBQoctLJrky0RDCAWRgQ==", - "dev": true, - "peer": true, - "dependencies": { - "@babel/compat-data": "^7.23.5", - "@babel/helper-validator-option": "^7.23.5", - "browserslist": "^4.22.2", - "lru-cache": "^5.1.1", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-compilation-targets/node_modules/lru-cache": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", - "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", - "dev": true, - "peer": true, - "dependencies": { - "yallist": "^3.0.2" - } - }, - "node_modules/@babel/helper-compilation-targets/node_modules/yallist": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", - "dev": true, - "peer": true - }, - "node_modules/@babel/helper-environment-visitor": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz", - "integrity": "sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==", - "dev": true, - "peer": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-function-name": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz", - "integrity": "sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==", - "dev": true, - "peer": true, - "dependencies": { - "@babel/template": "^7.22.15", - "@babel/types": "^7.23.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-hoist-variables": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz", - "integrity": "sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==", - "dev": true, - "peer": true, - "dependencies": { - "@babel/types": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-module-imports": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.22.15.tgz", - "integrity": "sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w==", - "dev": true, - "peer": true, - "dependencies": { - "@babel/types": "^7.22.15" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-module-transforms": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.23.3.tgz", - "integrity": "sha512-7bBs4ED9OmswdfDzpz4MpWgSrV7FXlc3zIagvLFjS5H+Mk7Snr21vQ6QwrsoCGMfNC4e4LQPdoULEt4ykz0SRQ==", - "dev": true, - "peer": true, - "dependencies": { - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-module-imports": "^7.22.15", - "@babel/helper-simple-access": "^7.22.5", - "@babel/helper-split-export-declaration": "^7.22.6", - "@babel/helper-validator-identifier": "^7.22.20" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/helper-plugin-utils": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz", - "integrity": "sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==", - "dev": true, - "peer": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-simple-access": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz", - "integrity": "sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==", - "dev": true, - "peer": true, - "dependencies": { - "@babel/types": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-split-export-declaration": { - "version": "7.22.6", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz", - "integrity": "sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==", - "dev": true, - "peer": true, - "dependencies": { - "@babel/types": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-string-parser": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.23.4.tgz", - "integrity": "sha512-803gmbQdqwdf4olxrX4AJyFBV/RTr3rSmOj0rKwesmzlfhYNDEs+/iOcznzpNWlJlIlTJC2QfPFcHB6DlzdVLQ==", - "dev": true, - "peer": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-validator-identifier": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz", - "integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==", - "dev": true, - "peer": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-validator-option": { - "version": "7.23.5", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.23.5.tgz", - "integrity": "sha512-85ttAOMLsr53VgXkTbkx8oA6YTfT4q7/HzXSLEYmjcSTJPMPQtvq1BD79Byep5xMUYbGRzEpDsjUf3dyp54IKw==", - "dev": true, - "peer": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helpers": { - "version": "7.23.9", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.23.9.tgz", - "integrity": "sha512-87ICKgU5t5SzOT7sBMfCOZQ2rHjRU+Pcb9BoILMYz600W6DkVRLFBPwQ18gwUVvggqXivaUakpnxWQGbpywbBQ==", - "dev": true, - "peer": true, - "dependencies": { - "@babel/template": "^7.23.9", - "@babel/traverse": "^7.23.9", - "@babel/types": "^7.23.9" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/highlight": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.23.4.tgz", - "integrity": "sha512-acGdbYSfp2WheJoJm/EBBBLh/ID8KDc64ISZ9DYtBmC8/Q204PZJLHyzeB5qMzJ5trcOkybd78M4x2KWsUq++A==", - "dev": true, - "peer": true, - "dependencies": { - "@babel/helper-validator-identifier": "^7.22.20", - "chalk": "^2.4.2", - "js-tokens": "^4.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/highlight/node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "peer": true, - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/highlight/node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "peer": true, - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/highlight/node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "peer": true, - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/@babel/highlight/node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true, - "peer": true - }, - "node_modules/@babel/highlight/node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "dev": true, - "peer": true, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/@babel/highlight/node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "dev": true, - "peer": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/highlight/node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "peer": true, - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/parser": { - "version": "7.23.9", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.23.9.tgz", - "integrity": "sha512-9tcKgqKbs3xGJ+NtKF2ndOBBLVwPjl1SHxPQkd36r3Dlirw3xWUeGaTbqr7uGZcTaxkVNwc+03SVP7aCdWrTlA==", - "devOptional": true, - "bin": { - "parser": "bin/babel-parser.js" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@babel/plugin-syntax-async-generators": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", - "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", - "dev": true, - "peer": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-bigint": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz", - "integrity": "sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==", - "dev": true, - "peer": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-class-properties": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", - "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", - "dev": true, - "peer": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.12.13" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-import-meta": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", - "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", - "dev": true, - "peer": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-json-strings": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", - "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", - "dev": true, - "peer": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-jsx": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.23.3.tgz", - "integrity": "sha512-EB2MELswq55OHUoRZLGg/zC7QWUKfNLpE57m/S2yr1uEneIgsTgrSzXP3NXEsMkVn76OlaVVnzN+ugObuYGwhg==", - "dev": true, - "peer": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-logical-assignment-operators": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", - "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", - "dev": true, - "peer": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-nullish-coalescing-operator": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", - "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", - "dev": true, - "peer": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-numeric-separator": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", - "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", - "dev": true, - "peer": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-object-rest-spread": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", - "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", - "dev": true, - "peer": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-optional-catch-binding": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", - "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", - "dev": true, - "peer": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-optional-chaining": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", - "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", - "dev": true, - "peer": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-top-level-await": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", - "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", - "dev": true, - "peer": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-typescript": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.23.3.tgz", - "integrity": "sha512-9EiNjVJOMwCO+43TqoTrgQ8jMwcAd0sWyXi9RPfIsLTj4R2MADDDQXELhffaUx/uJv2AYcxBgPwH6j4TIA4ytQ==", - "dev": true, - "peer": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/template": { - "version": "7.23.9", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.23.9.tgz", - "integrity": "sha512-+xrD2BWLpvHKNmX2QbpdpsBaWnRxahMwJjO+KZk2JOElj5nSmKezyS1B4u+QbHMTX69t4ukm6hh9lsYQ7GHCKA==", - "dev": true, - "peer": true, - "dependencies": { - "@babel/code-frame": "^7.23.5", - "@babel/parser": "^7.23.9", - "@babel/types": "^7.23.9" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/traverse": { - "version": "7.23.9", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.23.9.tgz", - "integrity": "sha512-I/4UJ9vs90OkBtY6iiiTORVMyIhJ4kAVmsKo9KFc8UOxMeUfi2hvtIBsET5u9GizXE6/GFSuKCTNfgCswuEjRg==", - "dev": true, - "peer": true, - "dependencies": { - "@babel/code-frame": "^7.23.5", - "@babel/generator": "^7.23.6", - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-function-name": "^7.23.0", - "@babel/helper-hoist-variables": "^7.22.5", - "@babel/helper-split-export-declaration": "^7.22.6", - "@babel/parser": "^7.23.9", - "@babel/types": "^7.23.9", - "debug": "^4.3.1", - "globals": "^11.1.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/traverse/node_modules/globals": { - "version": "11.12.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", - "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", - "dev": true, - "peer": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/types": { - "version": "7.23.9", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.23.9.tgz", - "integrity": "sha512-dQjSq/7HaSjRM43FFGnv5keM2HsxpmyV1PfaSVm0nzzjwwTmjOe6J4bC8e3+pTEIgHaHj+1ZlLThRJ2auc/w1Q==", - "dev": true, - "peer": true, - "dependencies": { - "@babel/helper-string-parser": "^7.23.4", - "@babel/helper-validator-identifier": "^7.22.20", - "to-fast-properties": "^2.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@bcoe/v8-coverage": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", - "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", - "dev": true, - "peer": true - }, - "node_modules/@eslint-community/eslint-utils": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", - "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", - "dev": true, - "dependencies": { - "eslint-visitor-keys": "^3.3.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" - } - }, - "node_modules/@eslint-community/regexpp": { - "version": "4.10.0", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.10.0.tgz", - "integrity": "sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==", - "dev": true, - "engines": { - "node": "^12.0.0 || ^14.0.0 || >=16.0.0" - } - }, - "node_modules/@eslint/eslintrc": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz", - "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==", - "dev": true, - "dependencies": { - "ajv": "^6.12.4", - "debug": "^4.3.2", - "espree": "^9.6.0", - "globals": "^13.19.0", - "ignore": "^5.2.0", - "import-fresh": "^3.2.1", - "js-yaml": "^4.1.0", - "minimatch": "^3.1.2", - "strip-json-comments": "^3.1.1" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/@eslint/js": { - "version": "8.56.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.56.0.tgz", - "integrity": "sha512-gMsVel9D7f2HLkBma9VbtzZRehRogVRfbr++f06nL2vnCGCNlzOD+/MUov/F4p8myyAHspEhVobgjpX64q5m6A==", - "dev": true, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - } - }, - "node_modules/@fastify/busboy": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@fastify/busboy/-/busboy-1.2.1.tgz", - "integrity": "sha512-7PQA7EH43S0CxcOa9OeAnaeA0oQ+e/DHNPZwSQM9CQHW76jle5+OvLdibRp/Aafs9KXbLhxyjOTkRjWUbQEd3Q==", - "dependencies": { - "text-decoding": "^1.0.0" - }, - "engines": { - "node": ">=14" - } - }, - "node_modules/@firebase/analytics": { - "version": "0.10.0", - "resolved": "https://registry.npmjs.org/@firebase/analytics/-/analytics-0.10.0.tgz", - "integrity": "sha512-Locv8gAqx0e+GX/0SI3dzmBY5e9kjVDtD+3zCFLJ0tH2hJwuCAiL+5WkHuxKj92rqQj/rvkBUCfA1ewlX2hehg==", - "dependencies": { - "@firebase/component": "0.6.4", - "@firebase/installations": "0.6.4", - "@firebase/logger": "0.4.0", - "@firebase/util": "1.9.3", - "tslib": "^2.1.0" - }, - "peerDependencies": { - "@firebase/app": "0.x" - } - }, - "node_modules/@firebase/analytics-compat": { - "version": "0.2.6", - "resolved": "https://registry.npmjs.org/@firebase/analytics-compat/-/analytics-compat-0.2.6.tgz", - "integrity": "sha512-4MqpVLFkGK7NJf/5wPEEP7ePBJatwYpyjgJ+wQHQGHfzaCDgntOnl9rL2vbVGGKCnRqWtZDIWhctB86UWXaX2Q==", - "dependencies": { - "@firebase/analytics": "0.10.0", - "@firebase/analytics-types": "0.8.0", - "@firebase/component": "0.6.4", - "@firebase/util": "1.9.3", - "tslib": "^2.1.0" - }, - "peerDependencies": { - "@firebase/app-compat": "0.x" - } - }, - "node_modules/@firebase/analytics-types": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/@firebase/analytics-types/-/analytics-types-0.8.0.tgz", - "integrity": "sha512-iRP+QKI2+oz3UAh4nPEq14CsEjrjD6a5+fuypjScisAh9kXKFvdJOZJDwk7kikLvWVLGEs9+kIUS4LPQV7VZVw==" - }, - "node_modules/@firebase/app": { - "version": "0.9.23", - "resolved": "https://registry.npmjs.org/@firebase/app/-/app-0.9.23.tgz", - "integrity": "sha512-CA5pQ88We3FhyuesGKn1thaPBsJSGJGm6AlFToOmEJagWqBeDoNJqBkry/BsHnCs9xeYWWIprKxvuFmAFkdqoA==", - "dependencies": { - "@firebase/component": "0.6.4", - "@firebase/logger": "0.4.0", - "@firebase/util": "1.9.3", - "idb": "7.1.1", - "tslib": "^2.1.0" - } - }, - "node_modules/@firebase/app-check": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/@firebase/app-check/-/app-check-0.8.0.tgz", - "integrity": "sha512-dRDnhkcaC2FspMiRK/Vbp+PfsOAEP6ZElGm9iGFJ9fDqHoPs0HOPn7dwpJ51lCFi1+2/7n5pRPGhqF/F03I97g==", - "dependencies": { - "@firebase/component": "0.6.4", - "@firebase/logger": "0.4.0", - "@firebase/util": "1.9.3", - "tslib": "^2.1.0" - }, - "peerDependencies": { - "@firebase/app": "0.x" - } - }, - "node_modules/@firebase/app-check-compat": { - "version": "0.3.7", - "resolved": "https://registry.npmjs.org/@firebase/app-check-compat/-/app-check-compat-0.3.7.tgz", - "integrity": "sha512-cW682AxsyP1G+Z0/P7pO/WT2CzYlNxoNe5QejVarW2o5ZxeWSSPAiVEwpEpQR/bUlUmdeWThYTMvBWaopdBsqw==", - "dependencies": { - "@firebase/app-check": "0.8.0", - "@firebase/app-check-types": "0.5.0", - "@firebase/component": "0.6.4", - "@firebase/logger": "0.4.0", - "@firebase/util": "1.9.3", - "tslib": "^2.1.0" - }, - "peerDependencies": { - "@firebase/app-compat": "0.x" - } - }, - "node_modules/@firebase/app-check-interop-types": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/@firebase/app-check-interop-types/-/app-check-interop-types-0.3.0.tgz", - "integrity": "sha512-xAxHPZPIgFXnI+vb4sbBjZcde7ZluzPPaSK7Lx3/nmuVk4TjZvnL8ONnkd4ERQKL8WePQySU+pRcWkh8rDf5Sg==" - }, - "node_modules/@firebase/app-check-types": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/@firebase/app-check-types/-/app-check-types-0.5.0.tgz", - "integrity": "sha512-uwSUj32Mlubybw7tedRzR24RP8M8JUVR3NPiMk3/Z4bCmgEKTlQBwMXrehDAZ2wF+TsBq0SN1c6ema71U/JPyQ==" - }, - "node_modules/@firebase/app-compat": { - "version": "0.2.23", - "resolved": "https://registry.npmjs.org/@firebase/app-compat/-/app-compat-0.2.23.tgz", - "integrity": "sha512-UCv0LEzcoqAgY+sLsau7aOZz0CJNLN2gESY68bHKmukNXEN6onLPxBKJzn68CsZZGcdiIEXwvrum1riWNPe9Gw==", - "dependencies": { - "@firebase/app": "0.9.23", - "@firebase/component": "0.6.4", - "@firebase/logger": "0.4.0", - "@firebase/util": "1.9.3", - "tslib": "^2.1.0" - } - }, - "node_modules/@firebase/app-types": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/@firebase/app-types/-/app-types-0.9.0.tgz", - "integrity": "sha512-AeweANOIo0Mb8GiYm3xhTEBVCmPwTYAu9Hcd2qSkLuga/6+j9b1Jskl5bpiSQWy9eJ/j5pavxj6eYogmnuzm+Q==" - }, - "node_modules/@firebase/auth": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/@firebase/auth/-/auth-1.4.0.tgz", - "integrity": "sha512-SfFXZCHDbY+7oSR52NSwx0U7LjYiA+N8imloxphCf3/F+MFty/+mhdjSXGtrJYd0Gbud/qcyedfn2XnWJeIB/g==", - "dependencies": { - "@firebase/component": "0.6.4", - "@firebase/logger": "0.4.0", - "@firebase/util": "1.9.3", - "node-fetch": "2.6.7", - "tslib": "^2.1.0" - }, - "peerDependencies": { - "@firebase/app": "0.x", - "@react-native-async-storage/async-storage": "^1.18.1" - }, - "peerDependenciesMeta": { - "@react-native-async-storage/async-storage": { - "optional": true - } - } - }, - "node_modules/@firebase/auth-compat": { - "version": "0.4.9", - "resolved": "https://registry.npmjs.org/@firebase/auth-compat/-/auth-compat-0.4.9.tgz", - "integrity": "sha512-Fw03i7vduIciEBG4imLtA1duJbljgkfbxiBo/EuekcB+BnPxHp+e8OGMUfemPYeO7Munj6kUC9gr5DelsQkiNA==", - "dependencies": { - "@firebase/auth": "1.4.0", - "@firebase/auth-types": "0.12.0", - "@firebase/component": "0.6.4", - "@firebase/util": "1.9.3", - "node-fetch": "2.6.7", - "tslib": "^2.1.0" - }, - "peerDependencies": { - "@firebase/app-compat": "0.x" - } - }, - "node_modules/@firebase/auth-compat/node_modules/node-fetch": { - "version": "2.6.7", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz", - "integrity": "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==", - "dependencies": { - "whatwg-url": "^5.0.0" - }, - "engines": { - "node": "4.x || >=6.0.0" - }, - "peerDependencies": { - "encoding": "^0.1.0" - }, - "peerDependenciesMeta": { - "encoding": { - "optional": true - } - } - }, - "node_modules/@firebase/auth-interop-types": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/@firebase/auth-interop-types/-/auth-interop-types-0.2.1.tgz", - "integrity": "sha512-VOaGzKp65MY6P5FI84TfYKBXEPi6LmOCSMMzys6o2BN2LOsqy7pCuZCup7NYnfbk5OkkQKzvIfHOzTm0UDpkyg==" - }, - "node_modules/@firebase/auth-types": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/@firebase/auth-types/-/auth-types-0.12.0.tgz", - "integrity": "sha512-pPwaZt+SPOshK8xNoiQlK5XIrS97kFYc3Rc7xmy373QsOJ9MmqXxLaYssP5Kcds4wd2qK//amx/c+A8O2fVeZA==", - "peerDependencies": { - "@firebase/app-types": "0.x", - "@firebase/util": "1.x" - } - }, - "node_modules/@firebase/auth/node_modules/node-fetch": { - "version": "2.6.7", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz", - "integrity": "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==", - "dependencies": { - "whatwg-url": "^5.0.0" - }, - "engines": { - "node": "4.x || >=6.0.0" - }, - "peerDependencies": { - "encoding": "^0.1.0" - }, - "peerDependenciesMeta": { - "encoding": { - "optional": true - } - } - }, - "node_modules/@firebase/component": { - "version": "0.6.4", - "resolved": "https://registry.npmjs.org/@firebase/component/-/component-0.6.4.tgz", - "integrity": "sha512-rLMyrXuO9jcAUCaQXCMjCMUsWrba5fzHlNK24xz5j2W6A/SRmK8mZJ/hn7V0fViLbxC0lPMtrK1eYzk6Fg03jA==", - "dependencies": { - "@firebase/util": "1.9.3", - "tslib": "^2.1.0" - } - }, - "node_modules/@firebase/database": { - "version": "0.14.4", - "resolved": "https://registry.npmjs.org/@firebase/database/-/database-0.14.4.tgz", - "integrity": "sha512-+Ea/IKGwh42jwdjCyzTmeZeLM3oy1h0mFPsTy6OqCWzcu/KFqRAr5Tt1HRCOBlNOdbh84JPZC47WLU18n2VbxQ==", - "dependencies": { - "@firebase/auth-interop-types": "0.2.1", - "@firebase/component": "0.6.4", - "@firebase/logger": "0.4.0", - "@firebase/util": "1.9.3", - "faye-websocket": "0.11.4", - "tslib": "^2.1.0" - } - }, - "node_modules/@firebase/database-compat": { - "version": "0.3.4", - "resolved": "https://registry.npmjs.org/@firebase/database-compat/-/database-compat-0.3.4.tgz", - "integrity": "sha512-kuAW+l+sLMUKBThnvxvUZ+Q1ZrF/vFJ58iUY9kAcbX48U03nVzIF6Tmkf0p3WVQwMqiXguSgtOPIB6ZCeF+5Gg==", - "dependencies": { - "@firebase/component": "0.6.4", - "@firebase/database": "0.14.4", - "@firebase/database-types": "0.10.4", - "@firebase/logger": "0.4.0", - "@firebase/util": "1.9.3", - "tslib": "^2.1.0" - } - }, - "node_modules/@firebase/database-types": { - "version": "0.10.4", - "resolved": "https://registry.npmjs.org/@firebase/database-types/-/database-types-0.10.4.tgz", - "integrity": "sha512-dPySn0vJ/89ZeBac70T+2tWWPiJXWbmRygYv0smT5TfE3hDrQ09eKMF3Y+vMlTdrMWq7mUdYW5REWPSGH4kAZQ==", - "dependencies": { - "@firebase/app-types": "0.9.0", - "@firebase/util": "1.9.3" - } - }, - "node_modules/@firebase/firestore": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/@firebase/firestore/-/firestore-4.3.2.tgz", - "integrity": "sha512-K4TwMbgArWw+XAEUYX/vtk+TVy9n1uLeJKSrQeb89lwfkfyFINGLPME6YleaS0ovD1ziLM5/0WgL1CR4s53fDg==", - "dependencies": { - "@firebase/component": "0.6.4", - "@firebase/logger": "0.4.0", - "@firebase/util": "1.9.3", - "@firebase/webchannel-wrapper": "0.10.3", - "@grpc/grpc-js": "~1.9.0", - "@grpc/proto-loader": "^0.7.8", - "node-fetch": "2.6.7", - "tslib": "^2.1.0" - }, - "engines": { - "node": ">=10.10.0" - }, - "peerDependencies": { - "@firebase/app": "0.x" - } - }, - "node_modules/@firebase/firestore-compat": { - "version": "0.3.22", - "resolved": "https://registry.npmjs.org/@firebase/firestore-compat/-/firestore-compat-0.3.22.tgz", - "integrity": "sha512-M166UvFvRri0CK/+5N0MIeXJVxR6BsX0/96xFT506DxRPIFezLjLcvfddtyFgfe0CtyQWoxBXt060uWUg3d/sw==", - "dependencies": { - "@firebase/component": "0.6.4", - "@firebase/firestore": "4.3.2", - "@firebase/firestore-types": "3.0.0", - "@firebase/util": "1.9.3", - "tslib": "^2.1.0" - }, - "peerDependencies": { - "@firebase/app-compat": "0.x" - } - }, - "node_modules/@firebase/firestore-types": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@firebase/firestore-types/-/firestore-types-3.0.0.tgz", - "integrity": "sha512-Meg4cIezHo9zLamw0ymFYBD4SMjLb+ZXIbuN7T7ddXN6MGoICmOTq3/ltdCGoDCS2u+H1XJs2u/cYp75jsX9Qw==", - "peerDependencies": { - "@firebase/app-types": "0.x", - "@firebase/util": "1.x" - } - }, - "node_modules/@firebase/firestore/node_modules/@grpc/grpc-js": { - "version": "1.9.14", - "resolved": "https://registry.npmjs.org/@grpc/grpc-js/-/grpc-js-1.9.14.tgz", - "integrity": "sha512-nOpuzZ2G3IuMFN+UPPpKrC6NsLmWsTqSsm66IRfnBt1D4pwTqE27lmbpcPM+l2Ua4gE7PfjRHI6uedAy7hoXUw==", - "dependencies": { - "@grpc/proto-loader": "^0.7.8", - "@types/node": ">=12.12.47" - }, - "engines": { - "node": "^8.13.0 || >=10.10.0" - } - }, - "node_modules/@firebase/firestore/node_modules/node-fetch": { - "version": "2.6.7", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz", - "integrity": "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==", - "dependencies": { - "whatwg-url": "^5.0.0" - }, - "engines": { - "node": "4.x || >=6.0.0" - }, - "peerDependencies": { - "encoding": "^0.1.0" - }, - "peerDependenciesMeta": { - "encoding": { - "optional": true - } - } - }, - "node_modules/@firebase/functions": { - "version": "0.10.0", - "resolved": "https://registry.npmjs.org/@firebase/functions/-/functions-0.10.0.tgz", - "integrity": "sha512-2U+fMNxTYhtwSpkkR6WbBcuNMOVaI7MaH3cZ6UAeNfj7AgEwHwMIFLPpC13YNZhno219F0lfxzTAA0N62ndWzA==", - "dependencies": { - "@firebase/app-check-interop-types": "0.3.0", - "@firebase/auth-interop-types": "0.2.1", - "@firebase/component": "0.6.4", - "@firebase/messaging-interop-types": "0.2.0", - "@firebase/util": "1.9.3", - "node-fetch": "2.6.7", - "tslib": "^2.1.0" - }, - "peerDependencies": { - "@firebase/app": "0.x" - } - }, - "node_modules/@firebase/functions-compat": { - "version": "0.3.5", - "resolved": "https://registry.npmjs.org/@firebase/functions-compat/-/functions-compat-0.3.5.tgz", - "integrity": "sha512-uD4jwgwVqdWf6uc3NRKF8cSZ0JwGqSlyhPgackyUPe+GAtnERpS4+Vr66g0b3Gge0ezG4iyHo/EXW/Hjx7QhHw==", - "dependencies": { - "@firebase/component": "0.6.4", - "@firebase/functions": "0.10.0", - "@firebase/functions-types": "0.6.0", - "@firebase/util": "1.9.3", - "tslib": "^2.1.0" - }, - "peerDependencies": { - "@firebase/app-compat": "0.x" - } - }, - "node_modules/@firebase/functions-types": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/@firebase/functions-types/-/functions-types-0.6.0.tgz", - "integrity": "sha512-hfEw5VJtgWXIRf92ImLkgENqpL6IWpYaXVYiRkFY1jJ9+6tIhWM7IzzwbevwIIud/jaxKVdRzD7QBWfPmkwCYw==" - }, - "node_modules/@firebase/functions/node_modules/node-fetch": { - "version": "2.6.7", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz", - "integrity": "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==", - "dependencies": { - "whatwg-url": "^5.0.0" - }, - "engines": { - "node": "4.x || >=6.0.0" - }, - "peerDependencies": { - "encoding": "^0.1.0" - }, - "peerDependenciesMeta": { - "encoding": { - "optional": true - } - } - }, - "node_modules/@firebase/installations": { - "version": "0.6.4", - "resolved": "https://registry.npmjs.org/@firebase/installations/-/installations-0.6.4.tgz", - "integrity": "sha512-u5y88rtsp7NYkCHC3ElbFBrPtieUybZluXyzl7+4BsIz4sqb4vSAuwHEUgCgCeaQhvsnxDEU6icly8U9zsJigA==", - "dependencies": { - "@firebase/component": "0.6.4", - "@firebase/util": "1.9.3", - "idb": "7.0.1", - "tslib": "^2.1.0" - }, - "peerDependencies": { - "@firebase/app": "0.x" - } - }, - "node_modules/@firebase/installations-compat": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/@firebase/installations-compat/-/installations-compat-0.2.4.tgz", - "integrity": "sha512-LI9dYjp0aT9Njkn9U4JRrDqQ6KXeAmFbRC0E7jI7+hxl5YmRWysq5qgQl22hcWpTk+cm3es66d/apoDU/A9n6Q==", - "dependencies": { - "@firebase/component": "0.6.4", - "@firebase/installations": "0.6.4", - "@firebase/installations-types": "0.5.0", - "@firebase/util": "1.9.3", - "tslib": "^2.1.0" - }, - "peerDependencies": { - "@firebase/app-compat": "0.x" - } - }, - "node_modules/@firebase/installations-types": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/@firebase/installations-types/-/installations-types-0.5.0.tgz", - "integrity": "sha512-9DP+RGfzoI2jH7gY4SlzqvZ+hr7gYzPODrbzVD82Y12kScZ6ZpRg/i3j6rleto8vTFC8n6Len4560FnV1w2IRg==", - "peerDependencies": { - "@firebase/app-types": "0.x" - } - }, - "node_modules/@firebase/installations/node_modules/idb": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/idb/-/idb-7.0.1.tgz", - "integrity": "sha512-UUxlE7vGWK5RfB/fDwEGgRf84DY/ieqNha6msMV99UsEMQhJ1RwbCd8AYBj3QMgnE3VZnfQvm4oKVCJTYlqIgg==" - }, - "node_modules/@firebase/logger": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/@firebase/logger/-/logger-0.4.0.tgz", - "integrity": "sha512-eRKSeykumZ5+cJPdxxJRgAC3G5NknY2GwEbKfymdnXtnT0Ucm4pspfR6GT4MUQEDuJwRVbVcSx85kgJulMoFFA==", - "dependencies": { - "tslib": "^2.1.0" - } - }, - "node_modules/@firebase/messaging": { - "version": "0.12.4", - "resolved": "https://registry.npmjs.org/@firebase/messaging/-/messaging-0.12.4.tgz", - "integrity": "sha512-6JLZct6zUaex4g7HI3QbzeUrg9xcnmDAPTWpkoMpd/GoSVWH98zDoWXMGrcvHeCAIsLpFMe4MPoZkJbrPhaASw==", - "dependencies": { - "@firebase/component": "0.6.4", - "@firebase/installations": "0.6.4", - "@firebase/messaging-interop-types": "0.2.0", - "@firebase/util": "1.9.3", - "idb": "7.0.1", - "tslib": "^2.1.0" - }, - "peerDependencies": { - "@firebase/app": "0.x" - } - }, - "node_modules/@firebase/messaging-compat": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/@firebase/messaging-compat/-/messaging-compat-0.2.4.tgz", - "integrity": "sha512-lyFjeUhIsPRYDPNIkYX1LcZMpoVbBWXX4rPl7c/rqc7G+EUea7IEtSt4MxTvh6fDfPuzLn7+FZADfscC+tNMfg==", - "dependencies": { - "@firebase/component": "0.6.4", - "@firebase/messaging": "0.12.4", - "@firebase/util": "1.9.3", - "tslib": "^2.1.0" - }, - "peerDependencies": { - "@firebase/app-compat": "0.x" - } - }, - "node_modules/@firebase/messaging-interop-types": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/@firebase/messaging-interop-types/-/messaging-interop-types-0.2.0.tgz", - "integrity": "sha512-ujA8dcRuVeBixGR9CtegfpU4YmZf3Lt7QYkcj693FFannwNuZgfAYaTmbJ40dtjB81SAu6tbFPL9YLNT15KmOQ==" - }, - "node_modules/@firebase/messaging/node_modules/idb": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/idb/-/idb-7.0.1.tgz", - "integrity": "sha512-UUxlE7vGWK5RfB/fDwEGgRf84DY/ieqNha6msMV99UsEMQhJ1RwbCd8AYBj3QMgnE3VZnfQvm4oKVCJTYlqIgg==" - }, - "node_modules/@firebase/performance": { - "version": "0.6.4", - "resolved": "https://registry.npmjs.org/@firebase/performance/-/performance-0.6.4.tgz", - "integrity": "sha512-HfTn/bd8mfy/61vEqaBelNiNnvAbUtME2S25A67Nb34zVuCSCRIX4SseXY6zBnOFj3oLisaEqhVcJmVPAej67g==", - "dependencies": { - "@firebase/component": "0.6.4", - "@firebase/installations": "0.6.4", - "@firebase/logger": "0.4.0", - "@firebase/util": "1.9.3", - "tslib": "^2.1.0" - }, - "peerDependencies": { - "@firebase/app": "0.x" - } - }, - "node_modules/@firebase/performance-compat": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/@firebase/performance-compat/-/performance-compat-0.2.4.tgz", - "integrity": "sha512-nnHUb8uP9G8islzcld/k6Bg5RhX62VpbAb/Anj7IXs/hp32Eb2LqFPZK4sy3pKkBUO5wcrlRWQa6wKOxqlUqsg==", - "dependencies": { - "@firebase/component": "0.6.4", - "@firebase/logger": "0.4.0", - "@firebase/performance": "0.6.4", - "@firebase/performance-types": "0.2.0", - "@firebase/util": "1.9.3", - "tslib": "^2.1.0" - }, - "peerDependencies": { - "@firebase/app-compat": "0.x" - } - }, - "node_modules/@firebase/performance-types": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/@firebase/performance-types/-/performance-types-0.2.0.tgz", - "integrity": "sha512-kYrbr8e/CYr1KLrLYZZt2noNnf+pRwDq2KK9Au9jHrBMnb0/C9X9yWSXmZkFt4UIdsQknBq8uBB7fsybZdOBTA==" - }, - "node_modules/@firebase/remote-config": { - "version": "0.4.4", - "resolved": "https://registry.npmjs.org/@firebase/remote-config/-/remote-config-0.4.4.tgz", - "integrity": "sha512-x1ioTHGX8ZwDSTOVp8PBLv2/wfwKzb4pxi0gFezS5GCJwbLlloUH4YYZHHS83IPxnua8b6l0IXUaWd0RgbWwzQ==", - "dependencies": { - "@firebase/component": "0.6.4", - "@firebase/installations": "0.6.4", - "@firebase/logger": "0.4.0", - "@firebase/util": "1.9.3", - "tslib": "^2.1.0" - }, - "peerDependencies": { - "@firebase/app": "0.x" - } - }, - "node_modules/@firebase/remote-config-compat": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/@firebase/remote-config-compat/-/remote-config-compat-0.2.4.tgz", - "integrity": "sha512-FKiki53jZirrDFkBHglB3C07j5wBpitAaj8kLME6g8Mx+aq7u9P7qfmuSRytiOItADhWUj7O1JIv7n9q87SuwA==", - "dependencies": { - "@firebase/component": "0.6.4", - "@firebase/logger": "0.4.0", - "@firebase/remote-config": "0.4.4", - "@firebase/remote-config-types": "0.3.0", - "@firebase/util": "1.9.3", - "tslib": "^2.1.0" - }, - "peerDependencies": { - "@firebase/app-compat": "0.x" - } - }, - "node_modules/@firebase/remote-config-types": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/@firebase/remote-config-types/-/remote-config-types-0.3.0.tgz", - "integrity": "sha512-RtEH4vdcbXZuZWRZbIRmQVBNsE7VDQpet2qFvq6vwKLBIQRQR5Kh58M4ok3A3US8Sr3rubYnaGqZSurCwI8uMA==" - }, - "node_modules/@firebase/storage": { - "version": "0.11.2", - "resolved": "https://registry.npmjs.org/@firebase/storage/-/storage-0.11.2.tgz", - "integrity": "sha512-CtvoFaBI4hGXlXbaCHf8humajkbXhs39Nbh6MbNxtwJiCqxPy9iH3D3CCfXAvP0QvAAwmJUTK3+z9a++Kc4nkA==", - "dependencies": { - "@firebase/component": "0.6.4", - "@firebase/util": "1.9.3", - "node-fetch": "2.6.7", - "tslib": "^2.1.0" - }, - "peerDependencies": { - "@firebase/app": "0.x" - } - }, - "node_modules/@firebase/storage-compat": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/@firebase/storage-compat/-/storage-compat-0.3.2.tgz", - "integrity": "sha512-wvsXlLa9DVOMQJckbDNhXKKxRNNewyUhhbXev3t8kSgoCotd1v3MmqhKKz93ePhDnhHnDs7bYHy+Qa8dRY6BXw==", - "dependencies": { - "@firebase/component": "0.6.4", - "@firebase/storage": "0.11.2", - "@firebase/storage-types": "0.8.0", - "@firebase/util": "1.9.3", - "tslib": "^2.1.0" - }, - "peerDependencies": { - "@firebase/app-compat": "0.x" - } - }, - "node_modules/@firebase/storage-types": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/@firebase/storage-types/-/storage-types-0.8.0.tgz", - "integrity": "sha512-isRHcGrTs9kITJC0AVehHfpraWFui39MPaU7Eo8QfWlqW7YPymBmRgjDrlOgFdURh6Cdeg07zmkLP5tzTKRSpg==", - "peerDependencies": { - "@firebase/app-types": "0.x", - "@firebase/util": "1.x" - } - }, - "node_modules/@firebase/storage/node_modules/node-fetch": { - "version": "2.6.7", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz", - "integrity": "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==", - "dependencies": { - "whatwg-url": "^5.0.0" - }, - "engines": { - "node": "4.x || >=6.0.0" - }, - "peerDependencies": { - "encoding": "^0.1.0" - }, - "peerDependenciesMeta": { - "encoding": { - "optional": true - } - } - }, - "node_modules/@firebase/util": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/@firebase/util/-/util-1.9.3.tgz", - "integrity": "sha512-DY02CRhOZwpzO36fHpuVysz6JZrscPiBXD0fXp6qSrL9oNOx5KWICKdR95C0lSITzxp0TZosVyHqzatE8JbcjA==", - "dependencies": { - "tslib": "^2.1.0" - } - }, - "node_modules/@firebase/webchannel-wrapper": { - "version": "0.10.3", - "resolved": "https://registry.npmjs.org/@firebase/webchannel-wrapper/-/webchannel-wrapper-0.10.3.tgz", - "integrity": "sha512-+ZplYUN3HOpgCfgInqgdDAbkGGVzES1cs32JJpeqoh87SkRobGXElJx+1GZSaDqzFL+bYiX18qEcBK76mYs8uA==" - }, - "node_modules/@google-cloud/firestore": { - "version": "6.8.0", - "resolved": "https://registry.npmjs.org/@google-cloud/firestore/-/firestore-6.8.0.tgz", - "integrity": "sha512-JRpk06SmZXLGz0pNx1x7yU3YhkUXheKgH5hbDZ4kMsdhtfV5qPLJLRI4wv69K0cZorIk+zTMOwptue7hizo0eA==", - "optional": true, - "dependencies": { - "fast-deep-equal": "^3.1.1", - "functional-red-black-tree": "^1.0.1", - "google-gax": "^3.5.7", - "protobufjs": "^7.2.5" - }, - "engines": { - "node": ">=12.0.0" - } - }, - "node_modules/@google-cloud/paginator": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/@google-cloud/paginator/-/paginator-3.0.7.tgz", - "integrity": "sha512-jJNutk0arIQhmpUUQJPJErsojqo834KcyB6X7a1mxuic8i1tKXxde8E69IZxNZawRIlZdIK2QY4WALvlK5MzYQ==", - "optional": true, - "dependencies": { - "arrify": "^2.0.0", - "extend": "^3.0.2" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@google-cloud/projectify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@google-cloud/projectify/-/projectify-3.0.0.tgz", - "integrity": "sha512-HRkZsNmjScY6Li8/kb70wjGlDDyLkVk3KvoEo9uIoxSjYLJasGiCch9+PqRVDOCGUFvEIqyogl+BeqILL4OJHA==", - "optional": true, - "engines": { - "node": ">=12.0.0" - } - }, - "node_modules/@google-cloud/promisify": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@google-cloud/promisify/-/promisify-3.0.1.tgz", - "integrity": "sha512-z1CjRjtQyBOYL+5Qr9DdYIfrdLBe746jRTYfaYU6MeXkqp7UfYs/jX16lFFVzZ7PGEJvqZNqYUEtb1mvDww4pA==", - "optional": true, - "engines": { - "node": ">=12" - } - }, - "node_modules/@google-cloud/storage": { - "version": "6.12.0", - "resolved": "https://registry.npmjs.org/@google-cloud/storage/-/storage-6.12.0.tgz", - "integrity": "sha512-78nNAY7iiZ4O/BouWMWTD/oSF2YtYgYB3GZirn0To6eBOugjXVoK+GXgUXOl+HlqbAOyHxAVXOlsj3snfbQ1dw==", - "optional": true, - "dependencies": { - "@google-cloud/paginator": "^3.0.7", - "@google-cloud/projectify": "^3.0.0", - "@google-cloud/promisify": "^3.0.0", - "abort-controller": "^3.0.0", - "async-retry": "^1.3.3", - "compressible": "^2.0.12", - "duplexify": "^4.0.0", - "ent": "^2.2.0", - "extend": "^3.0.2", - "fast-xml-parser": "^4.2.2", - "gaxios": "^5.0.0", - "google-auth-library": "^8.0.1", - "mime": "^3.0.0", - "mime-types": "^2.0.8", - "p-limit": "^3.0.1", - "retry-request": "^5.0.0", - "teeny-request": "^8.0.0", - "uuid": "^8.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/@google-cloud/storage/node_modules/uuid": { - "version": "8.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", - "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", - "optional": true, - "bin": { - "uuid": "dist/bin/uuid" - } - }, - "node_modules/@grpc/grpc-js": { - "version": "1.8.21", - "resolved": "https://registry.npmjs.org/@grpc/grpc-js/-/grpc-js-1.8.21.tgz", - "integrity": "sha512-KeyQeZpxeEBSqFVTi3q2K7PiPXmgBfECc4updA1ejCLjYmoAlvvM3ZMp5ztTDUCUQmoY3CpDxvchjO1+rFkoHg==", - "optional": true, - "dependencies": { - "@grpc/proto-loader": "^0.7.0", - "@types/node": ">=12.12.47" - }, - "engines": { - "node": "^8.13.0 || >=10.10.0" - } - }, - "node_modules/@grpc/proto-loader": { - "version": "0.7.10", - "resolved": "https://registry.npmjs.org/@grpc/proto-loader/-/proto-loader-0.7.10.tgz", - "integrity": "sha512-CAqDfoaQ8ykFd9zqBDn4k6iWT9loLAlc2ETmDFS9JCD70gDcnA4L3AFEo2iV7KyAtAAHFW9ftq1Fz+Vsgq80RQ==", - "dependencies": { - "lodash.camelcase": "^4.3.0", - "long": "^5.0.0", - "protobufjs": "^7.2.4", - "yargs": "^17.7.2" - }, - "bin": { - "proto-loader-gen-types": "build/bin/proto-loader-gen-types.js" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/@humanwhocodes/config-array": { - "version": "0.11.14", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.14.tgz", - "integrity": "sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==", - "dev": true, - "dependencies": { - "@humanwhocodes/object-schema": "^2.0.2", - "debug": "^4.3.1", - "minimatch": "^3.0.5" - }, - "engines": { - "node": ">=10.10.0" - } - }, - "node_modules/@humanwhocodes/module-importer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", - "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", - "dev": true, - "engines": { - "node": ">=12.22" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/nzakas" - } - }, - "node_modules/@humanwhocodes/object-schema": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.2.tgz", - "integrity": "sha512-6EwiSjwWYP7pTckG6I5eyFANjPhmPjUX9JRLUSfNPC7FX7zK9gyZAfUEaECL6ALTpGX5AjnBq3C9XmVWPitNpw==", - "dev": true - }, - "node_modules/@istanbuljs/load-nyc-config": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", - "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", - "dev": true, - "peer": true, - "dependencies": { - "camelcase": "^5.3.1", - "find-up": "^4.1.0", - "get-package-type": "^0.1.0", - "js-yaml": "^3.13.1", - "resolve-from": "^5.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "dev": true, - "peer": true, - "dependencies": { - "sprintf-js": "~1.0.2" - } - }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dev": true, - "peer": true, - "dependencies": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/js-yaml": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", - "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", - "dev": true, - "peer": true, - "dependencies": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dev": true, - "peer": true, - "dependencies": { - "p-locate": "^4.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, - "peer": true, - "dependencies": { - "p-try": "^2.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dev": true, - "peer": true, - "dependencies": { - "p-limit": "^2.2.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", - "dev": true, - "peer": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/@istanbuljs/schema": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", - "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", - "dev": true, - "peer": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/@jest/console": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/console/-/console-29.7.0.tgz", - "integrity": "sha512-5Ni4CU7XHQi32IJ398EEP4RrB8eV09sXP2ROqD4bksHrnTree52PsxvX8tpL8LvTZ3pFzXyPbNQReSN41CAhOg==", - "dev": true, - "peer": true, - "dependencies": { - "@jest/types": "^29.6.3", - "@types/node": "*", - "chalk": "^4.0.0", - "jest-message-util": "^29.7.0", - "jest-util": "^29.7.0", - "slash": "^3.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/core": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/core/-/core-29.7.0.tgz", - "integrity": "sha512-n7aeXWKMnGtDA48y8TLWJPJmLmmZ642Ceo78cYWEpiD7FzDgmNDV/GCVRorPABdXLJZ/9wzzgZAlHjXjxDHGsg==", - "dev": true, - "peer": true, - "dependencies": { - "@jest/console": "^29.7.0", - "@jest/reporters": "^29.7.0", - "@jest/test-result": "^29.7.0", - "@jest/transform": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/node": "*", - "ansi-escapes": "^4.2.1", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "exit": "^0.1.2", - "graceful-fs": "^4.2.9", - "jest-changed-files": "^29.7.0", - "jest-config": "^29.7.0", - "jest-haste-map": "^29.7.0", - "jest-message-util": "^29.7.0", - "jest-regex-util": "^29.6.3", - "jest-resolve": "^29.7.0", - "jest-resolve-dependencies": "^29.7.0", - "jest-runner": "^29.7.0", - "jest-runtime": "^29.7.0", - "jest-snapshot": "^29.7.0", - "jest-util": "^29.7.0", - "jest-validate": "^29.7.0", - "jest-watcher": "^29.7.0", - "micromatch": "^4.0.4", - "pretty-format": "^29.7.0", - "slash": "^3.0.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - }, - "peerDependencies": { - "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" - }, - "peerDependenciesMeta": { - "node-notifier": { - "optional": true - } - } - }, - "node_modules/@jest/environment": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-29.7.0.tgz", - "integrity": "sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw==", - "dev": true, - "peer": true, - "dependencies": { - "@jest/fake-timers": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/node": "*", - "jest-mock": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/expect": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-29.7.0.tgz", - "integrity": "sha512-8uMeAMycttpva3P1lBHB8VciS9V0XAr3GymPpipdyQXbBcuhkLQOSe8E/p92RyAdToS6ZD1tFkX+CkhoECE0dQ==", - "dev": true, - "peer": true, - "dependencies": { - "expect": "^29.7.0", - "jest-snapshot": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/expect-utils": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-29.7.0.tgz", - "integrity": "sha512-GlsNBWiFQFCVi9QVSx7f5AgMeLxe9YCCs5PuP2O2LdjDAA8Jh9eX7lA1Jq/xdXw3Wb3hyvlFNfZIfcRetSzYcA==", - "dev": true, - "peer": true, - "dependencies": { - "jest-get-type": "^29.6.3" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/fake-timers": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-29.7.0.tgz", - "integrity": "sha512-q4DH1Ha4TTFPdxLsqDXK1d3+ioSL7yL5oCMJZgDYm6i+6CygW5E5xVr/D1HdsGxjt1ZWSfUAs9OxSB/BNelWrQ==", - "dev": true, - "peer": true, - "dependencies": { - "@jest/types": "^29.6.3", - "@sinonjs/fake-timers": "^10.0.2", - "@types/node": "*", - "jest-message-util": "^29.7.0", - "jest-mock": "^29.7.0", - "jest-util": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/globals": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-29.7.0.tgz", - "integrity": "sha512-mpiz3dutLbkW2MNFubUGUEVLkTGiqW6yLVTA+JbP6fI6J5iL9Y0Nlg8k95pcF8ctKwCS7WVxteBs29hhfAotzQ==", - "dev": true, - "peer": true, - "dependencies": { - "@jest/environment": "^29.7.0", - "@jest/expect": "^29.7.0", - "@jest/types": "^29.6.3", - "jest-mock": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/reporters": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-29.7.0.tgz", - "integrity": "sha512-DApq0KJbJOEzAFYjHADNNxAE3KbhxQB1y5Kplb5Waqw6zVbuWatSnMjE5gs8FUgEPmNsnZA3NCWl9NG0ia04Pg==", - "dev": true, - "peer": true, - "dependencies": { - "@bcoe/v8-coverage": "^0.2.3", - "@jest/console": "^29.7.0", - "@jest/test-result": "^29.7.0", - "@jest/transform": "^29.7.0", - "@jest/types": "^29.6.3", - "@jridgewell/trace-mapping": "^0.3.18", - "@types/node": "*", - "chalk": "^4.0.0", - "collect-v8-coverage": "^1.0.0", - "exit": "^0.1.2", - "glob": "^7.1.3", - "graceful-fs": "^4.2.9", - "istanbul-lib-coverage": "^3.0.0", - "istanbul-lib-instrument": "^6.0.0", - "istanbul-lib-report": "^3.0.0", - "istanbul-lib-source-maps": "^4.0.0", - "istanbul-reports": "^3.1.3", - "jest-message-util": "^29.7.0", - "jest-util": "^29.7.0", - "jest-worker": "^29.7.0", - "slash": "^3.0.0", - "string-length": "^4.0.1", - "strip-ansi": "^6.0.0", - "v8-to-istanbul": "^9.0.1" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - }, - "peerDependencies": { - "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" - }, - "peerDependenciesMeta": { - "node-notifier": { - "optional": true - } - } - }, - "node_modules/@jest/schemas": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz", - "integrity": "sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==", - "dev": true, - "peer": true, - "dependencies": { - "@sinclair/typebox": "^0.27.8" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/source-map": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-29.6.3.tgz", - "integrity": "sha512-MHjT95QuipcPrpLM+8JMSzFx6eHp5Bm+4XeFDJlwsvVBjmKNiIAvasGK2fxz2WbGRlnvqehFbh07MMa7n3YJnw==", - "dev": true, - "peer": true, - "dependencies": { - "@jridgewell/trace-mapping": "^0.3.18", - "callsites": "^3.0.0", - "graceful-fs": "^4.2.9" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/test-result": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-29.7.0.tgz", - "integrity": "sha512-Fdx+tv6x1zlkJPcWXmMDAG2HBnaR9XPSd5aDWQVsfrZmLVT3lU1cwyxLgRmXR9yrq4NBoEm9BMsfgFzTQAbJYA==", - "dev": true, - "peer": true, - "dependencies": { - "@jest/console": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/istanbul-lib-coverage": "^2.0.0", - "collect-v8-coverage": "^1.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/test-sequencer": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-29.7.0.tgz", - "integrity": "sha512-GQwJ5WZVrKnOJuiYiAF52UNUJXgTZx1NHjFSEB0qEMmSZKAkdMoIzw/Cj6x6NF4AvV23AUqDpFzQkN/eYCYTxw==", - "dev": true, - "peer": true, - "dependencies": { - "@jest/test-result": "^29.7.0", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.7.0", - "slash": "^3.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/transform": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.7.0.tgz", - "integrity": "sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw==", - "dev": true, - "peer": true, - "dependencies": { - "@babel/core": "^7.11.6", - "@jest/types": "^29.6.3", - "@jridgewell/trace-mapping": "^0.3.18", - "babel-plugin-istanbul": "^6.1.1", - "chalk": "^4.0.0", - "convert-source-map": "^2.0.0", - "fast-json-stable-stringify": "^2.1.0", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.7.0", - "jest-regex-util": "^29.6.3", - "jest-util": "^29.7.0", - "micromatch": "^4.0.4", - "pirates": "^4.0.4", - "slash": "^3.0.0", - "write-file-atomic": "^4.0.2" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/types": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.3.tgz", - "integrity": "sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==", - "dev": true, - "peer": true, - "dependencies": { - "@jest/schemas": "^29.6.3", - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", - "@types/yargs": "^17.0.8", - "chalk": "^4.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jridgewell/gen-mapping": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", - "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", - "dev": true, - "peer": true, - "dependencies": { - "@jridgewell/set-array": "^1.0.1", - "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.9" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/resolve-uri": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", - "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", - "dev": true, - "peer": true, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/set-array": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", - "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", - "dev": true, - "peer": true, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.4.15", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", - "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", - "dev": true, - "peer": true - }, - "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.22", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.22.tgz", - "integrity": "sha512-Wf963MzWtA2sjrNt+g18IAln9lKnlRp+K2eH4jjIoF1wYeq3aMREpG09xhlhdzS0EjwU7qmUJYangWa+151vZw==", - "dev": true, - "peer": true, - "dependencies": { - "@jridgewell/resolve-uri": "^3.1.0", - "@jridgewell/sourcemap-codec": "^1.4.14" - } - }, - "node_modules/@jsdoc/salty": { - "version": "0.2.7", - "resolved": "https://registry.npmjs.org/@jsdoc/salty/-/salty-0.2.7.tgz", - "integrity": "sha512-mh8LbS9d4Jq84KLw8pzho7XC2q2/IJGiJss3xwRoLD1A+EE16SjN4PfaG4jRCzKegTFLlN0Zd8SdUPE6XdoPFg==", - "optional": true, - "dependencies": { - "lodash": "^4.17.21" - }, - "engines": { - "node": ">=v12.0.0" - } - }, - "node_modules/@nodelib/fs.scandir": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", - "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", - "dev": true, - "dependencies": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.stat": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", - "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", - "dev": true, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.walk": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", - "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", - "dev": true, - "dependencies": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@protobufjs/aspromise": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz", - "integrity": "sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ==" - }, - "node_modules/@protobufjs/base64": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@protobufjs/base64/-/base64-1.1.2.tgz", - "integrity": "sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==" - }, - "node_modules/@protobufjs/codegen": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@protobufjs/codegen/-/codegen-2.0.4.tgz", - "integrity": "sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==" - }, - "node_modules/@protobufjs/eventemitter": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz", - "integrity": "sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q==" - }, - "node_modules/@protobufjs/fetch": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@protobufjs/fetch/-/fetch-1.1.0.tgz", - "integrity": "sha512-lljVXpqXebpsijW71PZaCYeIcE5on1w5DlQy5WH6GLbFryLUrBD4932W/E2BSpfRJWseIL4v/KPgBFxDOIdKpQ==", - "dependencies": { - "@protobufjs/aspromise": "^1.1.1", - "@protobufjs/inquire": "^1.1.0" - } - }, - "node_modules/@protobufjs/float": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@protobufjs/float/-/float-1.0.2.tgz", - "integrity": "sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ==" - }, - "node_modules/@protobufjs/inquire": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@protobufjs/inquire/-/inquire-1.1.0.tgz", - "integrity": "sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q==" - }, - "node_modules/@protobufjs/path": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@protobufjs/path/-/path-1.1.2.tgz", - "integrity": "sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA==" - }, - "node_modules/@protobufjs/pool": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@protobufjs/pool/-/pool-1.1.0.tgz", - "integrity": "sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw==" - }, - "node_modules/@protobufjs/utf8": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.0.tgz", - "integrity": "sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==" - }, - "node_modules/@sinclair/typebox": { - "version": "0.27.8", - "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz", - "integrity": "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==", - "dev": true, - "peer": true - }, - "node_modules/@sinonjs/commons": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-3.0.1.tgz", - "integrity": "sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ==", - "dev": true, - "peer": true, - "dependencies": { - "type-detect": "4.0.8" - } - }, - "node_modules/@sinonjs/fake-timers": { - "version": "10.3.0", - "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-10.3.0.tgz", - "integrity": "sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA==", - "dev": true, - "peer": true, - "dependencies": { - "@sinonjs/commons": "^3.0.0" - } - }, - "node_modules/@tootallnate/once": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.0.tgz", - "integrity": "sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==", - "optional": true, - "engines": { - "node": ">= 10" - } - }, - "node_modules/@types/babel__core": { - "version": "7.20.5", - "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", - "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==", - "dev": true, - "peer": true, - "dependencies": { - "@babel/parser": "^7.20.7", - "@babel/types": "^7.20.7", - "@types/babel__generator": "*", - "@types/babel__template": "*", - "@types/babel__traverse": "*" - } - }, - "node_modules/@types/babel__generator": { - "version": "7.6.8", - "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.8.tgz", - "integrity": "sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw==", - "dev": true, - "peer": true, - "dependencies": { - "@babel/types": "^7.0.0" - } - }, - "node_modules/@types/babel__template": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz", - "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==", - "dev": true, - "peer": true, - "dependencies": { - "@babel/parser": "^7.1.0", - "@babel/types": "^7.0.0" - } - }, - "node_modules/@types/babel__traverse": { - "version": "7.20.5", - "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.5.tgz", - "integrity": "sha512-WXCyOcRtH37HAUkpXhUduaxdm82b4GSlyTqajXviN4EfiuPgNYR109xMCKvpl6zPIpua0DGlMEDCq+g8EdoheQ==", - "dev": true, - "peer": true, - "dependencies": { - "@babel/types": "^7.20.7" - } - }, - "node_modules/@types/body-parser": { - "version": "1.19.5", - "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.5.tgz", - "integrity": "sha512-fB3Zu92ucau0iQ0JMCFQE7b/dv8Ot07NI3KaZIkIUNXq82k4eBAqUaneXfleGY9JWskeS9y+u0nXMyspcuQrCg==", - "dependencies": { - "@types/connect": "*", - "@types/node": "*" - } - }, - "node_modules/@types/connect": { - "version": "3.4.38", - "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.38.tgz", - "integrity": "sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/cors": { - "version": "2.8.17", - "resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.17.tgz", - "integrity": "sha512-8CGDvrBj1zgo2qE+oS3pOCyYNqCPryMWY2bGfwA0dcfopWGgxs+78df0Rs3rc9THP4JkOhLsAa+15VdpAqkcUA==", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/express": { - "version": "4.17.3", - "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.3.tgz", - "integrity": "sha512-I8cGRJj3pyOLs/HndoP+25vOqhqWkAZsWMEmq1qXy/b/M3ppufecUwaK2/TVDVxcV61/iSdhykUjQQ2DLSrTdg==", - "dependencies": { - "@types/body-parser": "*", - "@types/express-serve-static-core": "*", - "@types/serve-static": "*" - } - }, - "node_modules/@types/express-serve-static-core": { - "version": "4.17.43", - "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.43.tgz", - "integrity": "sha512-oaYtiBirUOPQGSWNGPWnzyAFJ0BP3cwvN4oWZQY+zUBwpVIGsKUkpBpSztp74drYcjavs7SKFZ4DX1V2QeN8rg==", - "dependencies": { - "@types/node": "*", - "@types/qs": "*", - "@types/range-parser": "*", - "@types/send": "*" - } - }, - "node_modules/@types/glob": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/@types/glob/-/glob-8.1.0.tgz", - "integrity": "sha512-IO+MJPVhoqz+28h1qLAcBEH2+xHMK6MTyHJc7MTnnYb6wsoLR29POVGJ7LycmVXIqyy/4/2ShP5sUwTXuOwb/w==", - "optional": true, - "dependencies": { - "@types/minimatch": "^5.1.2", - "@types/node": "*" - } - }, - "node_modules/@types/graceful-fs": { - "version": "4.1.9", - "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.9.tgz", - "integrity": "sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ==", - "dev": true, - "peer": true, - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/http-errors": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.4.tgz", - "integrity": "sha512-D0CFMMtydbJAegzOyHjtiKPLlvnm3iTZyZRSZoLq2mRhDdmLfIWOCYPfQJ4cu2erKghU++QvjcUjp/5h7hESpA==" - }, - "node_modules/@types/istanbul-lib-coverage": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz", - "integrity": "sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==", - "dev": true, - "peer": true - }, - "node_modules/@types/istanbul-lib-report": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.3.tgz", - "integrity": "sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==", - "dev": true, - "peer": true, - "dependencies": { - "@types/istanbul-lib-coverage": "*" - } - }, - "node_modules/@types/istanbul-reports": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.4.tgz", - "integrity": "sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==", - "dev": true, - "peer": true, - "dependencies": { - "@types/istanbul-lib-report": "*" - } - }, - "node_modules/@types/jsonwebtoken": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/@types/jsonwebtoken/-/jsonwebtoken-9.0.5.tgz", - "integrity": "sha512-VRLSGzik+Unrup6BsouBeHsf4d1hOEgYWTm/7Nmw1sXoN1+tRly/Gy/po3yeahnP4jfnQWWAhQAqcNfH7ngOkA==", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/linkify-it": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/@types/linkify-it/-/linkify-it-3.0.5.tgz", - "integrity": "sha512-yg6E+u0/+Zjva+buc3EIb+29XEg4wltq7cSmd4Uc2EE/1nUVmxyzpX6gUXD0V8jIrG0r7YeOGVIbYRkxeooCtw==", - "optional": true - }, - "node_modules/@types/lodash": { - "version": "4.14.202", - "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.202.tgz", - "integrity": "sha512-OvlIYQK9tNneDlS0VN54LLd5uiPCBOp7gS5Z0f1mjoJYBrtStzgmJBxONW3U6OZqdtNzZPmn9BS/7WI7BFFcFQ==", - "dev": true - }, - "node_modules/@types/long": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/@types/long/-/long-4.0.2.tgz", - "integrity": "sha512-MqTGEo5bj5t157U6fA/BiDynNkn0YknVdh48CMPkTSpFTVmvao5UQmm7uEF6xBEo7qIMAlY/JSleYaE6VOdpaA==", - "optional": true - }, - "node_modules/@types/markdown-it": { - "version": "12.2.3", - "resolved": "https://registry.npmjs.org/@types/markdown-it/-/markdown-it-12.2.3.tgz", - "integrity": "sha512-GKMHFfv3458yYy+v/N8gjufHO6MSZKCOXpZc5GXIWWy8uldwfmPn98vp81gZ5f9SVw8YYBctgfJ22a2d7AOMeQ==", - "optional": true, - "dependencies": { - "@types/linkify-it": "*", - "@types/mdurl": "*" - } - }, - "node_modules/@types/mdurl": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/@types/mdurl/-/mdurl-1.0.5.tgz", - "integrity": "sha512-6L6VymKTzYSrEf4Nev4Xa1LCHKrlTlYCBMTlQKFuddo1CvQcE52I0mwfOJayueUC7MJuXOeHTcIU683lzd0cUA==", - "optional": true - }, - "node_modules/@types/mime": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.5.tgz", - "integrity": "sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==" - }, - "node_modules/@types/minimatch": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-5.1.2.tgz", - "integrity": "sha512-K0VQKziLUWkVKiRVrx4a40iPaxTUefQmjtkQofBkYRcoaaL/8rhwDWww9qWbrgicNOgnpIsMxyNIUM4+n6dUIA==", - "optional": true - }, - "node_modules/@types/node": { - "version": "20.11.19", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.11.19.tgz", - "integrity": "sha512-7xMnVEcZFu0DikYjWOlRq7NTPETrm7teqUT2WkQjrTIkEgUyyGdWsj/Zg8bEJt5TNklzbPD1X3fqfsHw3SpapQ==", - "dependencies": { - "undici-types": "~5.26.4" - } - }, - "node_modules/@types/qs": { - "version": "6.9.11", - "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.11.tgz", - "integrity": "sha512-oGk0gmhnEJK4Yyk+oI7EfXsLayXatCWPHary1MtcmbAifkobT9cM9yutG/hZKIseOU0MqbIwQ/u2nn/Gb+ltuQ==" - }, - "node_modules/@types/range-parser": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.7.tgz", - "integrity": "sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==" - }, - "node_modules/@types/rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@types/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-F3OznnSLAUxFrCEu/L5PY8+ny8DtcFRjx7fZZ9bycvXRi3KPTRS9HOitGZwvPg0juRhXFWIeKX58cnX5YqLohQ==", - "optional": true, - "dependencies": { - "@types/glob": "*", - "@types/node": "*" - } - }, - "node_modules/@types/send": { - "version": "0.17.4", - "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.4.tgz", - "integrity": "sha512-x2EM6TJOybec7c52BX0ZspPodMsQUd5L6PRwOunVyVUhXiBSKf3AezDL8Dgvgt5o0UfKNfuA0eMLr2wLT4AiBA==", - "dependencies": { - "@types/mime": "^1", - "@types/node": "*" - } - }, - "node_modules/@types/serve-static": { - "version": "1.15.5", - "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.5.tgz", - "integrity": "sha512-PDRk21MnK70hja/YF8AHfC7yIsiQHn1rcXx7ijCFBX/k+XQJhQT/gw3xekXKJvx+5SXaMMS8oqQy09Mzvz2TuQ==", - "dependencies": { - "@types/http-errors": "*", - "@types/mime": "*", - "@types/node": "*" - } - }, - "node_modules/@types/stack-utils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.3.tgz", - "integrity": "sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==", - "dev": true, - "peer": true - }, - "node_modules/@types/yargs": { - "version": "17.0.32", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.32.tgz", - "integrity": "sha512-xQ67Yc/laOG5uMfX/093MRlGGCIBzZMarVa+gfNKJxWAIgykYpVGkBdbqEzGDDfCrVUj6Hiff4mTZ5BA6TmAog==", - "dev": true, - "peer": true, - "dependencies": { - "@types/yargs-parser": "*" - } - }, - "node_modules/@types/yargs-parser": { - "version": "21.0.3", - "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.3.tgz", - "integrity": "sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==", - "dev": true, - "peer": true - }, - "node_modules/@ungap/structured-clone": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz", - "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==", - "dev": true - }, - "node_modules/abort-controller": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", - "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==", - "optional": true, - "dependencies": { - "event-target-shim": "^5.0.0" - }, - "engines": { - "node": ">=6.5" - } - }, - "node_modules/accepts": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", - "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", - "dependencies": { - "mime-types": "~2.1.34", - "negotiator": "0.6.3" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/acorn": { - "version": "8.11.3", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.3.tgz", - "integrity": "sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==", - "devOptional": true, - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/acorn-jsx": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", - "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", - "devOptional": true, - "peerDependencies": { - "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" - } - }, - "node_modules/agent-base": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", - "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", - "optional": true, - "dependencies": { - "debug": "4" - }, - "engines": { - "node": ">= 6.0.0" - } - }, - "node_modules/agora-access-token": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/agora-access-token/-/agora-access-token-2.0.4.tgz", - "integrity": "sha512-RtOIvi4PqV1ok3rdnopMZeVwiUqZgG9Pp56kqxJc5cU/+ljRBzs1Al+IThD5ahm528dGsdY1TyP1bJdqmgBCbQ==", - "deprecated": "The package has been deprecated. Please use 'agora-token' instead, sorry for the inconvenience caused.", - "dependencies": { - "crc-32": "1.2.0", - "cuint": "0.2.2" - } - }, - "node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": true, - "dependencies": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/ansi-escapes": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", - "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", - "dev": true, - "peer": true, - "dependencies": { - "type-fest": "^0.21.3" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/ansi-escapes/node_modules/type-fest": { - "version": "0.21.3", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", - "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", - "dev": true, - "peer": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "engines": { - "node": ">=8" - } - }, - "node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/anymatch": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", - "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", - "dev": true, - "peer": true, - "dependencies": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "devOptional": true - }, - "node_modules/array-flatten": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", - "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==" - }, - "node_modules/arrify": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/arrify/-/arrify-2.0.1.tgz", - "integrity": "sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug==", - "optional": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/async-retry": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/async-retry/-/async-retry-1.3.3.tgz", - "integrity": "sha512-wfr/jstw9xNi/0teMHrRW7dsz3Lt5ARhYNZ2ewpadnhaIp5mbALhOAP+EAdsC7t4Z6wqsDVv9+W6gm1Dk9mEyw==", - "optional": true, - "dependencies": { - "retry": "0.13.1" - } - }, - "node_modules/babel-jest": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-29.7.0.tgz", - "integrity": "sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg==", - "dev": true, - "peer": true, - "dependencies": { - "@jest/transform": "^29.7.0", - "@types/babel__core": "^7.1.14", - "babel-plugin-istanbul": "^6.1.1", - "babel-preset-jest": "^29.6.3", - "chalk": "^4.0.0", - "graceful-fs": "^4.2.9", - "slash": "^3.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - }, - "peerDependencies": { - "@babel/core": "^7.8.0" - } - }, - "node_modules/babel-plugin-istanbul": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz", - "integrity": "sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==", - "dev": true, - "peer": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.0.0", - "@istanbuljs/load-nyc-config": "^1.0.0", - "@istanbuljs/schema": "^0.1.2", - "istanbul-lib-instrument": "^5.0.4", - "test-exclude": "^6.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/babel-plugin-istanbul/node_modules/istanbul-lib-instrument": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz", - "integrity": "sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==", - "dev": true, - "peer": true, - "dependencies": { - "@babel/core": "^7.12.3", - "@babel/parser": "^7.14.7", - "@istanbuljs/schema": "^0.1.2", - "istanbul-lib-coverage": "^3.2.0", - "semver": "^6.3.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/babel-plugin-jest-hoist": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-29.6.3.tgz", - "integrity": "sha512-ESAc/RJvGTFEzRwOTT4+lNDk/GNHMkKbNzsvT0qKRfDyyYTskxB5rnU2njIDYVxXCBHHEI1c0YwHob3WaYujOg==", - "dev": true, - "peer": true, - "dependencies": { - "@babel/template": "^7.3.3", - "@babel/types": "^7.3.3", - "@types/babel__core": "^7.1.14", - "@types/babel__traverse": "^7.0.6" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/babel-preset-current-node-syntax": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.0.1.tgz", - "integrity": "sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ==", - "dev": true, - "peer": true, - "dependencies": { - "@babel/plugin-syntax-async-generators": "^7.8.4", - "@babel/plugin-syntax-bigint": "^7.8.3", - "@babel/plugin-syntax-class-properties": "^7.8.3", - "@babel/plugin-syntax-import-meta": "^7.8.3", - "@babel/plugin-syntax-json-strings": "^7.8.3", - "@babel/plugin-syntax-logical-assignment-operators": "^7.8.3", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", - "@babel/plugin-syntax-numeric-separator": "^7.8.3", - "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", - "@babel/plugin-syntax-optional-chaining": "^7.8.3", - "@babel/plugin-syntax-top-level-await": "^7.8.3" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/babel-preset-jest": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-29.6.3.tgz", - "integrity": "sha512-0B3bhxR6snWXJZtR/RliHTDPRgn1sNHOR0yVtq/IiQFyuOVjFS+wuio/R4gSNkyYmKmJB4wGZv2NZanmKmTnNA==", - "dev": true, - "peer": true, - "dependencies": { - "babel-plugin-jest-hoist": "^29.6.3", - "babel-preset-current-node-syntax": "^1.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "devOptional": true - }, - "node_modules/base64-js": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", - "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "optional": true - }, - "node_modules/bignumber.js": { - "version": "9.1.2", - "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.1.2.tgz", - "integrity": "sha512-2/mKyZH9K85bzOEfhXDBFZTGd1CTs+5IHpeFQo9luiBG7hghdC851Pj2WAhb6E3R6b9tZj/XKhbg4fum+Kepug==", - "optional": true, - "engines": { - "node": "*" - } - }, - "node_modules/bluebird": { - "version": "3.7.2", - "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", - "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==", - "optional": true - }, - "node_modules/body-parser": { - "version": "1.20.1", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz", - "integrity": "sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==", - "dependencies": { - "bytes": "3.1.2", - "content-type": "~1.0.4", - "debug": "2.6.9", - "depd": "2.0.0", - "destroy": "1.2.0", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "on-finished": "2.4.1", - "qs": "6.11.0", - "raw-body": "2.5.1", - "type-is": "~1.6.18", - "unpipe": "1.0.0" - }, - "engines": { - "node": ">= 0.8", - "npm": "1.2.8000 || >= 1.4.16" - } - }, - "node_modules/body-parser/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/body-parser/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" - }, - "node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "devOptional": true, - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "dev": true, - "peer": true, - "dependencies": { - "fill-range": "^7.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/browserslist": { - "version": "4.23.0", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.23.0.tgz", - "integrity": "sha512-QW8HiM1shhT2GuzkvklfjcKDiWFXHOeFCIA/huJPwHsslwcydgk7X+z2zXpEijP98UCY7HbubZt5J2Zgvf0CaQ==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "peer": true, - "dependencies": { - "caniuse-lite": "^1.0.30001587", - "electron-to-chromium": "^1.4.668", - "node-releases": "^2.0.14", - "update-browserslist-db": "^1.0.13" - }, - "bin": { - "browserslist": "cli.js" - }, - "engines": { - "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" - } - }, - "node_modules/bser": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz", - "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==", - "dev": true, - "peer": true, - "dependencies": { - "node-int64": "^0.4.0" - } - }, - "node_modules/buffer-equal-constant-time": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz", - "integrity": "sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA==" - }, - "node_modules/buffer-from": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", - "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", - "dev": true, - "peer": true - }, - "node_modules/bytes": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", - "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/call-bind": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz", - "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==", - "dependencies": { - "es-define-property": "^1.0.0", - "es-errors": "^1.3.0", - "function-bind": "^1.1.2", - "get-intrinsic": "^1.2.4", - "set-function-length": "^1.2.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "dev": true, - "peer": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/caniuse-lite": { - "version": "1.0.30001588", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001588.tgz", - "integrity": "sha512-+hVY9jE44uKLkH0SrUTqxjxqNTOWHsbnQDIKjwkZ3lNTzUUVdBLBGXtj/q5Mp5u98r3droaZAewQuEDzjQdZlQ==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/caniuse-lite" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "peer": true - }, - "node_modules/catharsis": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/catharsis/-/catharsis-0.9.0.tgz", - "integrity": "sha512-prMTQVpcns/tzFgFVkVp6ak6RykZyWb3gu8ckUpd6YkTlacOd3DXGJjIpD4Q6zJirizvaiAjSSHlOsA+6sNh2A==", - "optional": true, - "dependencies": { - "lodash": "^4.17.15" - }, - "engines": { - "node": ">= 10" - } - }, - "node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "devOptional": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/char-regex": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz", - "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==", - "dev": true, - "peer": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/ci-info": { - "version": "3.9.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz", - "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/sibiraj-s" - } - ], - "peer": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/cjs-module-lexer": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.2.3.tgz", - "integrity": "sha512-0TNiGstbQmCFwt4akjjBg5pLRTSyj/PkWQ1ZoO2zntmg9yLqSRxwEa4iCfQLGjqhiqBfOJa7W/E8wfGrTDmlZQ==", - "dev": true, - "peer": true - }, - "node_modules/cliui": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", - "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", - "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.1", - "wrap-ansi": "^7.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/co": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", - "integrity": "sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==", - "dev": true, - "peer": true, - "engines": { - "iojs": ">= 1.0.0", - "node": ">= 0.12.0" - } - }, - "node_modules/collect-v8-coverage": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.2.tgz", - "integrity": "sha512-lHl4d5/ONEbLlJvaJNtsF/Lz+WvB07u2ycqTYbdrq7UypDXailES4valYb2eWiJFxZlVmpGekfqoxQhzyFdT4Q==", - "dev": true, - "peer": true - }, - "node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "node_modules/compressible": { - "version": "2.0.18", - "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", - "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==", - "optional": true, - "dependencies": { - "mime-db": ">= 1.43.0 < 2" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", - "devOptional": true - }, - "node_modules/content-disposition": { - "version": "0.5.4", - "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", - "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", - "dependencies": { - "safe-buffer": "5.2.1" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/content-type": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", - "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/convert-source-map": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", - "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", - "dev": true, - "peer": true - }, - "node_modules/cookie": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", - "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/cookie-signature": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", - "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==" - }, - "node_modules/cors": { - "version": "2.8.5", - "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", - "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", - "dependencies": { - "object-assign": "^4", - "vary": "^1" - }, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/crc-32": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/crc-32/-/crc-32-1.2.0.tgz", - "integrity": "sha512-1uBwHxF+Y/4yF5G48fwnKq6QsIXheor3ZLPT80yGBV1oEUwpPojlEhQbWKVw1VwcTQyMGHK1/XMmTjmlsmTTGA==", - "dependencies": { - "exit-on-epipe": "~1.0.1", - "printj": "~1.1.0" - }, - "bin": { - "crc32": "bin/crc32.njs" - }, - "engines": { - "node": ">=0.8" - } - }, - "node_modules/create-jest": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/create-jest/-/create-jest-29.7.0.tgz", - "integrity": "sha512-Adz2bdH0Vq3F53KEMJOoftQFutWCukm6J24wbPWRO4k1kMY7gS7ds/uoJkNuV8wDCtWWnuwGcJwpWcih+zEW1Q==", - "dev": true, - "peer": true, - "dependencies": { - "@jest/types": "^29.6.3", - "chalk": "^4.0.0", - "exit": "^0.1.2", - "graceful-fs": "^4.2.9", - "jest-config": "^29.7.0", - "jest-util": "^29.7.0", - "prompts": "^2.0.1" - }, - "bin": { - "create-jest": "bin/create-jest.js" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", - "dev": true, - "dependencies": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/cuint": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/cuint/-/cuint-0.2.2.tgz", - "integrity": "sha512-d4ZVpCW31eWwCMe1YT3ur7mUDnTXbgwyzaL320DrcRT45rfjYxkt5QWLrmOJ+/UEAI2+fQgKe/fCjR8l4TpRgw==" - }, - "node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/dedent": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/dedent/-/dedent-1.5.1.tgz", - "integrity": "sha512-+LxW+KLWxu3HW3M2w2ympwtqPrqYRzU8fqi6Fhd18fBALe15blJPI/I4+UHveMVG6lJqB4JNd4UG0S5cnVHwIg==", - "dev": true, - "peer": true, - "peerDependencies": { - "babel-plugin-macros": "^3.1.0" - }, - "peerDependenciesMeta": { - "babel-plugin-macros": { - "optional": true - } - } - }, - "node_modules/deep-is": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", - "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", - "devOptional": true - }, - "node_modules/deepmerge": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", - "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", - "dev": true, - "peer": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/define-data-property": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", - "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", - "dependencies": { - "es-define-property": "^1.0.0", - "es-errors": "^1.3.0", - "gopd": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/depd": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", - "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/destroy": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", - "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", - "engines": { - "node": ">= 0.8", - "npm": "1.2.8000 || >= 1.4.16" - } - }, - "node_modules/detect-newline": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz", - "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==", - "dev": true, - "peer": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/diff-sequences": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.6.3.tgz", - "integrity": "sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==", - "dev": true, - "peer": true, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/doctrine": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", - "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", - "dev": true, - "dependencies": { - "esutils": "^2.0.2" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/duplexify": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-4.1.2.tgz", - "integrity": "sha512-fz3OjcNCHmRP12MJoZMPglx8m4rrFP8rovnk4vT8Fs+aonZoCwGg10dSsQsfP/E62eZcPTMSMP6686fu9Qlqtw==", - "optional": true, - "dependencies": { - "end-of-stream": "^1.4.1", - "inherits": "^2.0.3", - "readable-stream": "^3.1.1", - "stream-shift": "^1.0.0" - } - }, - "node_modules/ecdsa-sig-formatter": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz", - "integrity": "sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==", - "dependencies": { - "safe-buffer": "^5.0.1" - } - }, - "node_modules/ee-first": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", - "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" - }, - "node_modules/electron-to-chromium": { - "version": "1.4.673", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.673.tgz", - "integrity": "sha512-zjqzx4N7xGdl5468G+vcgzDhaHkaYgVcf9MqgexcTqsl2UHSCmOj/Bi3HAprg4BZCpC7HyD8a6nZl6QAZf72gw==", - "dev": true, - "peer": true - }, - "node_modules/emittery": { - "version": "0.13.1", - "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.13.1.tgz", - "integrity": "sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==", - "dev": true, - "peer": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sindresorhus/emittery?sponsor=1" - } - }, - "node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" - }, - "node_modules/encodeurl": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", - "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/end-of-stream": { - "version": "1.4.4", - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", - "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", - "optional": true, - "dependencies": { - "once": "^1.4.0" - } - }, - "node_modules/ent": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/ent/-/ent-2.2.0.tgz", - "integrity": "sha512-GHrMyVZQWvTIdDtpiEXdHZnFQKzeO09apj8Cbl4pKWy4i0Oprcq17usfDt5aO63swf0JOeMWjWQE/LzgSRuWpA==", - "optional": true - }, - "node_modules/entities": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-2.1.0.tgz", - "integrity": "sha512-hCx1oky9PFrJ611mf0ifBLBRW8lUUVRlFolb5gWRfIELabBlbp9xZvrqZLZAs+NxFnbfQoeGd8wDkygjg7U85w==", - "optional": true, - "funding": { - "url": "https://github.com/fb55/entities?sponsor=1" - } - }, - "node_modules/error-ex": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", - "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", - "dev": true, - "peer": true, - "dependencies": { - "is-arrayish": "^0.2.1" - } - }, - "node_modules/es-define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz", - "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==", - "dependencies": { - "get-intrinsic": "^1.2.4" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-errors": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", - "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/escalade": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.2.tgz", - "integrity": "sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==", - "engines": { - "node": ">=6" - } - }, - "node_modules/escape-html": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", - "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==" - }, - "node_modules/escape-string-regexp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/escodegen": { - "version": "1.14.3", - "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.14.3.tgz", - "integrity": "sha512-qFcX0XJkdg+PB3xjZZG/wKSuT1PnQWx57+TVSjIMmILd2yC/6ByYElPwJnslDsuWuSAp4AwJGumarAAmJch5Kw==", - "optional": true, - "dependencies": { - "esprima": "^4.0.1", - "estraverse": "^4.2.0", - "esutils": "^2.0.2", - "optionator": "^0.8.1" - }, - "bin": { - "escodegen": "bin/escodegen.js", - "esgenerate": "bin/esgenerate.js" - }, - "engines": { - "node": ">=4.0" - }, - "optionalDependencies": { - "source-map": "~0.6.1" - } - }, - "node_modules/escodegen/node_modules/estraverse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", - "optional": true, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/escodegen/node_modules/levn": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", - "integrity": "sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA==", - "optional": true, - "dependencies": { - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/escodegen/node_modules/optionator": { - "version": "0.8.3", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", - "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", - "optional": true, - "dependencies": { - "deep-is": "~0.1.3", - "fast-levenshtein": "~2.0.6", - "levn": "~0.3.0", - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2", - "word-wrap": "~1.2.3" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/escodegen/node_modules/prelude-ls": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", - "integrity": "sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==", - "optional": true, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/escodegen/node_modules/type-check": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", - "integrity": "sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg==", - "optional": true, - "dependencies": { - "prelude-ls": "~1.1.2" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/eslint": { - "version": "8.56.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.56.0.tgz", - "integrity": "sha512-Go19xM6T9puCOWntie1/P997aXxFsOi37JIHRWI514Hc6ZnaHGKY9xFhrU65RT6CcBEzZoGG1e6Nq+DT04ZtZQ==", - "dev": true, - "dependencies": { - "@eslint-community/eslint-utils": "^4.2.0", - "@eslint-community/regexpp": "^4.6.1", - "@eslint/eslintrc": "^2.1.4", - "@eslint/js": "8.56.0", - "@humanwhocodes/config-array": "^0.11.13", - "@humanwhocodes/module-importer": "^1.0.1", - "@nodelib/fs.walk": "^1.2.8", - "@ungap/structured-clone": "^1.2.0", - "ajv": "^6.12.4", - "chalk": "^4.0.0", - "cross-spawn": "^7.0.2", - "debug": "^4.3.2", - "doctrine": "^3.0.0", - "escape-string-regexp": "^4.0.0", - "eslint-scope": "^7.2.2", - "eslint-visitor-keys": "^3.4.3", - "espree": "^9.6.1", - "esquery": "^1.4.2", - "esutils": "^2.0.2", - "fast-deep-equal": "^3.1.3", - "file-entry-cache": "^6.0.1", - "find-up": "^5.0.0", - "glob-parent": "^6.0.2", - "globals": "^13.19.0", - "graphemer": "^1.4.0", - "ignore": "^5.2.0", - "imurmurhash": "^0.1.4", - "is-glob": "^4.0.0", - "is-path-inside": "^3.0.3", - "js-yaml": "^4.1.0", - "json-stable-stringify-without-jsonify": "^1.0.1", - "levn": "^0.4.1", - "lodash.merge": "^4.6.2", - "minimatch": "^3.1.2", - "natural-compare": "^1.4.0", - "optionator": "^0.9.3", - "strip-ansi": "^6.0.1", - "text-table": "^0.2.0" - }, - "bin": { - "eslint": "bin/eslint.js" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/eslint-config-google": { - "version": "0.14.0", - "resolved": "https://registry.npmjs.org/eslint-config-google/-/eslint-config-google-0.14.0.tgz", - "integrity": "sha512-WsbX4WbjuMvTdeVL6+J3rK1RGhCTqjsFjX7UMSMgZiyxxaNLkoJENbrGExzERFeoTpGw3F3FypTiWAP9ZXzkEw==", - "dev": true, - "engines": { - "node": ">=0.10.0" - }, - "peerDependencies": { - "eslint": ">=5.16.0" - } - }, - "node_modules/eslint-scope": { - "version": "7.2.2", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", - "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", - "dev": true, - "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^5.2.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/eslint-visitor-keys": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", - "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", - "devOptional": true, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/espree": { - "version": "9.6.1", - "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", - "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", - "devOptional": true, - "dependencies": { - "acorn": "^8.9.0", - "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^3.4.1" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "devOptional": true, - "bin": { - "esparse": "bin/esparse.js", - "esvalidate": "bin/esvalidate.js" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/esquery": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz", - "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==", - "dev": true, - "dependencies": { - "estraverse": "^5.1.0" - }, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/esrecurse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", - "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", - "dev": true, - "dependencies": { - "estraverse": "^5.2.0" - }, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "devOptional": true, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/esutils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", - "devOptional": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/etag": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", - "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/event-target-shim": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz", - "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==", - "optional": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/execa": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", - "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", - "dev": true, - "peer": true, - "dependencies": { - "cross-spawn": "^7.0.3", - "get-stream": "^6.0.0", - "human-signals": "^2.1.0", - "is-stream": "^2.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^4.0.1", - "onetime": "^5.1.2", - "signal-exit": "^3.0.3", - "strip-final-newline": "^2.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sindresorhus/execa?sponsor=1" - } - }, - "node_modules/exit": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", - "integrity": "sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==", - "dev": true, - "peer": true, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/exit-on-epipe": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/exit-on-epipe/-/exit-on-epipe-1.0.1.tgz", - "integrity": "sha512-h2z5mrROTxce56S+pnvAV890uu7ls7f1kEvVGJbw1OlFH3/mlJ5bkXu0KRyW94v37zzHPiUd55iLn3DA7TjWpw==", - "engines": { - "node": ">=0.8" - } - }, - "node_modules/expect": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/expect/-/expect-29.7.0.tgz", - "integrity": "sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw==", - "dev": true, - "peer": true, - "dependencies": { - "@jest/expect-utils": "^29.7.0", - "jest-get-type": "^29.6.3", - "jest-matcher-utils": "^29.7.0", - "jest-message-util": "^29.7.0", - "jest-util": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/express": { - "version": "4.18.2", - "resolved": "https://registry.npmjs.org/express/-/express-4.18.2.tgz", - "integrity": "sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==", - "dependencies": { - "accepts": "~1.3.8", - "array-flatten": "1.1.1", - "body-parser": "1.20.1", - "content-disposition": "0.5.4", - "content-type": "~1.0.4", - "cookie": "0.5.0", - "cookie-signature": "1.0.6", - "debug": "2.6.9", - "depd": "2.0.0", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "finalhandler": "1.2.0", - "fresh": "0.5.2", - "http-errors": "2.0.0", - "merge-descriptors": "1.0.1", - "methods": "~1.1.2", - "on-finished": "2.4.1", - "parseurl": "~1.3.3", - "path-to-regexp": "0.1.7", - "proxy-addr": "~2.0.7", - "qs": "6.11.0", - "range-parser": "~1.2.1", - "safe-buffer": "5.2.1", - "send": "0.18.0", - "serve-static": "1.15.0", - "setprototypeof": "1.2.0", - "statuses": "2.0.1", - "type-is": "~1.6.18", - "utils-merge": "1.0.1", - "vary": "~1.1.2" - }, - "engines": { - "node": ">= 0.10.0" - } - }, - "node_modules/express/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/express/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" - }, - "node_modules/extend": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", - "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", - "optional": true - }, - "node_modules/fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", - "devOptional": true - }, - "node_modules/fast-json-stable-stringify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", - "dev": true - }, - "node_modules/fast-levenshtein": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", - "devOptional": true - }, - "node_modules/fast-text-encoding": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/fast-text-encoding/-/fast-text-encoding-1.0.6.tgz", - "integrity": "sha512-VhXlQgj9ioXCqGstD37E/HBeqEGV/qOD/kmbVG8h5xKBYvM1L3lR1Zn4555cQ8GkYbJa8aJSipLPndE1k6zK2w==", - "optional": true - }, - "node_modules/fast-xml-parser": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-4.3.4.tgz", - "integrity": "sha512-utnwm92SyozgA3hhH2I8qldf2lBqm6qHOICawRNRFu1qMe3+oqr+GcXjGqTmXTMGE5T4eC03kr/rlh5C1IRdZA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/NaturalIntelligence" - }, - { - "type": "paypal", - "url": "https://paypal.me/naturalintelligence" - } - ], - "optional": true, - "dependencies": { - "strnum": "^1.0.5" - }, - "bin": { - "fxparser": "src/cli/cli.js" - } - }, - "node_modules/fastq": { - "version": "1.17.1", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz", - "integrity": "sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==", - "dev": true, - "dependencies": { - "reusify": "^1.0.4" - } - }, - "node_modules/faye-websocket": { - "version": "0.11.4", - "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.4.tgz", - "integrity": "sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g==", - "dependencies": { - "websocket-driver": ">=0.5.1" - }, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/fb-watchman": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.2.tgz", - "integrity": "sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==", - "dev": true, - "peer": true, - "dependencies": { - "bser": "2.1.1" - } - }, - "node_modules/file-entry-cache": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", - "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", - "dev": true, - "dependencies": { - "flat-cache": "^3.0.4" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" - } - }, - "node_modules/fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "dev": true, - "peer": true, - "dependencies": { - "to-regex-range": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/finalhandler": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", - "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", - "dependencies": { - "debug": "2.6.9", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "on-finished": "2.4.1", - "parseurl": "~1.3.3", - "statuses": "2.0.1", - "unpipe": "~1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/finalhandler/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/finalhandler/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" - }, - "node_modules/find-up": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", - "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", - "dev": true, - "dependencies": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/firebase": { - "version": "10.6.0", - "resolved": "https://registry.npmjs.org/firebase/-/firebase-10.6.0.tgz", - "integrity": "sha512-bnYwHwZ6zB+dM6mGQPEXcFHtAT2WoVzG6H4SIR8HzURVGKJxBW+TqfP3qcJQjTZV3tDqDTo/XZkVmoU/SovV8A==", - "dependencies": { - "@firebase/analytics": "0.10.0", - "@firebase/analytics-compat": "0.2.6", - "@firebase/app": "0.9.23", - "@firebase/app-check": "0.8.0", - "@firebase/app-check-compat": "0.3.7", - "@firebase/app-compat": "0.2.23", - "@firebase/app-types": "0.9.0", - "@firebase/auth": "1.4.0", - "@firebase/auth-compat": "0.4.9", - "@firebase/database": "1.0.1", - "@firebase/database-compat": "1.0.1", - "@firebase/firestore": "4.3.2", - "@firebase/firestore-compat": "0.3.22", - "@firebase/functions": "0.10.0", - "@firebase/functions-compat": "0.3.5", - "@firebase/installations": "0.6.4", - "@firebase/installations-compat": "0.2.4", - "@firebase/messaging": "0.12.4", - "@firebase/messaging-compat": "0.2.4", - "@firebase/performance": "0.6.4", - "@firebase/performance-compat": "0.2.4", - "@firebase/remote-config": "0.4.4", - "@firebase/remote-config-compat": "0.2.4", - "@firebase/storage": "0.11.2", - "@firebase/storage-compat": "0.3.2", - "@firebase/util": "1.9.3" - } - }, - "node_modules/firebase-admin": { - "version": "11.11.1", - "resolved": "https://registry.npmjs.org/firebase-admin/-/firebase-admin-11.11.1.tgz", - "integrity": "sha512-UyEbq+3u6jWzCYbUntv/HuJiTixwh36G1R9j0v71mSvGAx/YZEWEW7uSGLYxBYE6ckVRQoKMr40PYUEzrm/4dg==", - "dependencies": { - "@fastify/busboy": "^1.2.1", - "@firebase/database-compat": "^0.3.4", - "@firebase/database-types": "^0.10.4", - "@types/node": ">=12.12.47", - "jsonwebtoken": "^9.0.0", - "jwks-rsa": "^3.0.1", - "node-forge": "^1.3.1", - "uuid": "^9.0.0" - }, - "engines": { - "node": ">=14" - }, - "optionalDependencies": { - "@google-cloud/firestore": "^6.8.0", - "@google-cloud/storage": "^6.9.5" - } - }, - "node_modules/firebase-functions": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/firebase-functions/-/firebase-functions-4.7.0.tgz", - "integrity": "sha512-YgWqA9otWlBUouY4I2yd0vq9SyQdQ6GJxfH7wGJclzS2pzBQHcU5HhE1Vz/xTrWcKJyw8uPN98WtSE9/APUJJg==", - "dependencies": { - "@types/cors": "^2.8.5", - "@types/express": "4.17.3", - "cors": "^2.8.5", - "express": "^4.17.1", - "node-fetch": "^2.6.7", - "protobufjs": "^7.2.2" - }, - "bin": { - "firebase-functions": "lib/bin/firebase-functions.js" - }, - "engines": { - "node": ">=14.10.0" - }, - "peerDependencies": { - "firebase-admin": "^10.0.0 || ^11.0.0 || ^12.0.0" - } - }, - "node_modules/firebase-functions-test": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/firebase-functions-test/-/firebase-functions-test-3.1.1.tgz", - "integrity": "sha512-IlDzcd+8rUd87hD1ZAPXsc3cX5JGdfpKmKlUJWdZJlErdyznwXssPQzbRPX8rh929ZhwmzGpubFBt7itkXAg+A==", - "dev": true, - "dependencies": { - "@types/lodash": "^4.14.104", - "lodash": "^4.17.5", - "ts-deepmerge": "^2.0.1" - }, - "engines": { - "node": ">=14.0.0" - }, - "peerDependencies": { - "firebase-admin": "^8.0.0 || ^9.0.0 || ^10.0.0 || ^11.0.0 || ^12.0.0", - "firebase-functions": ">=4.3.0", - "jest": ">=28.0.0" - } - }, - "node_modules/firebase/node_modules/@firebase/database": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@firebase/database/-/database-1.0.1.tgz", - "integrity": "sha512-VAhF7gYwunW4Lw/+RQZvW8dlsf2r0YYqV9W0Gi2Mz8+0TGg1mBJWoUtsHfOr8kPJXhcLsC4eP/z3x6L/Fvjk/A==", - "dependencies": { - "@firebase/auth-interop-types": "0.2.1", - "@firebase/component": "0.6.4", - "@firebase/logger": "0.4.0", - "@firebase/util": "1.9.3", - "faye-websocket": "0.11.4", - "tslib": "^2.1.0" - } - }, - "node_modules/firebase/node_modules/@firebase/database-compat": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@firebase/database-compat/-/database-compat-1.0.1.tgz", - "integrity": "sha512-ky82yLIboLxtAIWyW/52a6HLMVTzD2kpZlEilVDok73pNPLjkJYowj8iaIWK5nTy7+6Gxt7d00zfjL6zckGdXQ==", - "dependencies": { - "@firebase/component": "0.6.4", - "@firebase/database": "1.0.1", - "@firebase/database-types": "1.0.0", - "@firebase/logger": "0.4.0", - "@firebase/util": "1.9.3", - "tslib": "^2.1.0" - } - }, - "node_modules/firebase/node_modules/@firebase/database-types": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@firebase/database-types/-/database-types-1.0.0.tgz", - "integrity": "sha512-SjnXStoE0Q56HcFgNQ+9SsmJc0c8TqGARdI/T44KXy+Ets3r6x/ivhQozT66bMnCEjJRywYoxNurRTMlZF8VNg==", - "dependencies": { - "@firebase/app-types": "0.9.0", - "@firebase/util": "1.9.3" - } - }, - "node_modules/flat-cache": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz", - "integrity": "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==", - "dev": true, - "dependencies": { - "flatted": "^3.2.9", - "keyv": "^4.5.3", - "rimraf": "^3.0.2" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" - } - }, - "node_modules/flatted": { - "version": "3.2.9", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.9.tgz", - "integrity": "sha512-36yxDn5H7OFZQla0/jFJmbIKTdZAQHngCedGxiMmpNfEZM0sdEeT+WczLQrjK6D7o2aiyLYDnkw0R3JK0Qv1RQ==", - "dev": true - }, - "node_modules/forwarded": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", - "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/fresh": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", - "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", - "devOptional": true - }, - "node_modules/fsevents": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", - "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", - "dev": true, - "hasInstallScript": true, - "optional": true, - "os": [ - "darwin" - ], - "peer": true, - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } - }, - "node_modules/function-bind": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", - "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/functional-red-black-tree": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", - "integrity": "sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g==", - "optional": true - }, - "node_modules/gaxios": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/gaxios/-/gaxios-5.1.3.tgz", - "integrity": "sha512-95hVgBRgEIRQQQHIbnxBXeHbW4TqFk4ZDJW7wmVtvYar72FdhRIo1UGOLS2eRAKCPEdPBWu+M7+A33D9CdX9rA==", - "optional": true, - "dependencies": { - "extend": "^3.0.2", - "https-proxy-agent": "^5.0.0", - "is-stream": "^2.0.0", - "node-fetch": "^2.6.9" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/gcp-metadata": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/gcp-metadata/-/gcp-metadata-5.3.0.tgz", - "integrity": "sha512-FNTkdNEnBdlqF2oatizolQqNANMrcqJt6AAYt99B3y1aLLC8Hc5IOBb+ZnnzllodEEf6xMBp6wRcBbc16fa65w==", - "optional": true, - "dependencies": { - "gaxios": "^5.0.0", - "json-bigint": "^1.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/gensync": { - "version": "1.0.0-beta.2", - "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", - "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", - "dev": true, - "peer": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "engines": { - "node": "6.* || 8.* || >= 10.*" - } - }, - "node_modules/get-intrinsic": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz", - "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==", - "dependencies": { - "es-errors": "^1.3.0", - "function-bind": "^1.1.2", - "has-proto": "^1.0.1", - "has-symbols": "^1.0.3", - "hasown": "^2.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/get-package-type": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", - "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", - "dev": true, - "peer": true, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/get-stream": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", - "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", - "dev": true, - "peer": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "devOptional": true, - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/glob-parent": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", - "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", - "dev": true, - "dependencies": { - "is-glob": "^4.0.3" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/globals": { - "version": "13.24.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", - "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", - "dev": true, - "dependencies": { - "type-fest": "^0.20.2" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/google-auth-library": { - "version": "8.9.0", - "resolved": "https://registry.npmjs.org/google-auth-library/-/google-auth-library-8.9.0.tgz", - "integrity": "sha512-f7aQCJODJFmYWN6PeNKzgvy9LI2tYmXnzpNDHEjG5sDNPgGb2FXQyTBnXeSH+PAtpKESFD+LmHw3Ox3mN7e1Fg==", - "optional": true, - "dependencies": { - "arrify": "^2.0.0", - "base64-js": "^1.3.0", - "ecdsa-sig-formatter": "^1.0.11", - "fast-text-encoding": "^1.0.0", - "gaxios": "^5.0.0", - "gcp-metadata": "^5.3.0", - "gtoken": "^6.1.0", - "jws": "^4.0.0", - "lru-cache": "^6.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/google-gax": { - "version": "3.6.1", - "resolved": "https://registry.npmjs.org/google-gax/-/google-gax-3.6.1.tgz", - "integrity": "sha512-g/lcUjGcB6DSw2HxgEmCDOrI/CByOwqRvsuUvNalHUK2iPPPlmAIpbMbl62u0YufGMr8zgE3JL7th6dCb1Ry+w==", - "optional": true, - "dependencies": { - "@grpc/grpc-js": "~1.8.0", - "@grpc/proto-loader": "^0.7.0", - "@types/long": "^4.0.0", - "@types/rimraf": "^3.0.2", - "abort-controller": "^3.0.0", - "duplexify": "^4.0.0", - "fast-text-encoding": "^1.0.3", - "google-auth-library": "^8.0.2", - "is-stream-ended": "^0.1.4", - "node-fetch": "^2.6.1", - "object-hash": "^3.0.0", - "proto3-json-serializer": "^1.0.0", - "protobufjs": "7.2.4", - "protobufjs-cli": "1.1.1", - "retry-request": "^5.0.0" - }, - "bin": { - "compileProtos": "build/tools/compileProtos.js", - "minifyProtoJson": "build/tools/minify.js" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/google-gax/node_modules/protobufjs": { - "version": "7.2.4", - "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-7.2.4.tgz", - "integrity": "sha512-AT+RJgD2sH8phPmCf7OUZR8xGdcJRga4+1cOaXJ64hvcSkVhNcRHOwIxUatPH15+nj59WAGTDv3LSGZPEQbJaQ==", - "hasInstallScript": true, - "optional": true, - "dependencies": { - "@protobufjs/aspromise": "^1.1.2", - "@protobufjs/base64": "^1.1.2", - "@protobufjs/codegen": "^2.0.4", - "@protobufjs/eventemitter": "^1.1.0", - "@protobufjs/fetch": "^1.1.0", - "@protobufjs/float": "^1.0.2", - "@protobufjs/inquire": "^1.1.0", - "@protobufjs/path": "^1.1.2", - "@protobufjs/pool": "^1.1.0", - "@protobufjs/utf8": "^1.1.0", - "@types/node": ">=13.7.0", - "long": "^5.0.0" - }, - "engines": { - "node": ">=12.0.0" - } - }, - "node_modules/google-p12-pem": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/google-p12-pem/-/google-p12-pem-4.0.1.tgz", - "integrity": "sha512-WPkN4yGtz05WZ5EhtlxNDWPhC4JIic6G8ePitwUWy4l+XPVYec+a0j0Ts47PDtW59y3RwAhUd9/h9ZZ63px6RQ==", - "optional": true, - "dependencies": { - "node-forge": "^1.3.1" - }, - "bin": { - "gp12-pem": "build/src/bin/gp12-pem.js" - }, - "engines": { - "node": ">=12.0.0" - } - }, - "node_modules/gopd": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", - "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", - "dependencies": { - "get-intrinsic": "^1.1.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/graceful-fs": { - "version": "4.2.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", - "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", - "devOptional": true - }, - "node_modules/graphemer": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", - "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", - "dev": true - }, - "node_modules/gtoken": { - "version": "6.1.2", - "resolved": "https://registry.npmjs.org/gtoken/-/gtoken-6.1.2.tgz", - "integrity": "sha512-4ccGpzz7YAr7lxrT2neugmXQ3hP9ho2gcaityLVkiUecAiwiy60Ii8gRbZeOsXV19fYaRjgBSshs8kXw+NKCPQ==", - "optional": true, - "dependencies": { - "gaxios": "^5.0.1", - "google-p12-pem": "^4.0.0", - "jws": "^4.0.0" - }, - "engines": { - "node": ">=12.0.0" - } - }, - "node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "devOptional": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/has-property-descriptors": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", - "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", - "dependencies": { - "es-define-property": "^1.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-proto": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", - "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-symbols": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", - "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/hasown": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.1.tgz", - "integrity": "sha512-1/th4MHjnwncwXsIW6QMzlvYL9kG5e/CpVvLRZe4XPa8TOUNbCELqmvhDmnkNsAjwaG4+I8gJJL0JBvTTLO9qA==", - "dependencies": { - "function-bind": "^1.1.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/html-escaper": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", - "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", - "dev": true, - "peer": true - }, - "node_modules/http-errors": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", - "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", - "dependencies": { - "depd": "2.0.0", - "inherits": "2.0.4", - "setprototypeof": "1.2.0", - "statuses": "2.0.1", - "toidentifier": "1.0.1" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/http-parser-js": { - "version": "0.5.8", - "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.8.tgz", - "integrity": "sha512-SGeBX54F94Wgu5RH3X5jsDtf4eHyRogWX1XGT3b4HuW3tQPM4AaBzoUji/4AAJNXCEOWZ5O0DgZmJw1947gD5Q==" - }, - "node_modules/http-proxy-agent": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz", - "integrity": "sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==", - "optional": true, - "dependencies": { - "@tootallnate/once": "2", - "agent-base": "6", - "debug": "4" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/https-proxy-agent": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", - "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", - "optional": true, - "dependencies": { - "agent-base": "6", - "debug": "4" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/human-signals": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", - "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", - "dev": true, - "peer": true, - "engines": { - "node": ">=10.17.0" - } - }, - "node_modules/iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/idb": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/idb/-/idb-7.1.1.tgz", - "integrity": "sha512-gchesWBzyvGHRO9W8tzUWFDycow5gwjvFKfyV9FF32Y7F50yZMp7mP+T2mJIWFx49zicqyC4uefHM17o6xKIVQ==" - }, - "node_modules/ignore": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.1.tgz", - "integrity": "sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==", - "dev": true, - "engines": { - "node": ">= 4" - } - }, - "node_modules/import-fresh": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", - "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", - "dev": true, - "dependencies": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/import-local": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.1.0.tgz", - "integrity": "sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==", - "dev": true, - "peer": true, - "dependencies": { - "pkg-dir": "^4.2.0", - "resolve-cwd": "^3.0.0" - }, - "bin": { - "import-local-fixture": "fixtures/cli.js" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", - "dev": true, - "engines": { - "node": ">=0.8.19" - } - }, - "node_modules/inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", - "devOptional": true, - "dependencies": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "node_modules/inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" - }, - "node_modules/ipaddr.js": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", - "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/is-arrayish": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", - "dev": true, - "peer": true - }, - "node_modules/is-core-module": { - "version": "2.13.1", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.1.tgz", - "integrity": "sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==", - "dev": true, - "peer": true, - "dependencies": { - "hasown": "^2.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "engines": { - "node": ">=8" - } - }, - "node_modules/is-generator-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz", - "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==", - "dev": true, - "peer": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/is-glob": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "dev": true, - "dependencies": { - "is-extglob": "^2.1.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true, - "peer": true, - "engines": { - "node": ">=0.12.0" - } - }, - "node_modules/is-path-inside": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", - "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/is-stream": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", - "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", - "devOptional": true, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-stream-ended": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/is-stream-ended/-/is-stream-ended-0.1.4.tgz", - "integrity": "sha512-xj0XPvmr7bQFTvirqnFr50o0hQIh6ZItDqloxt5aJrR4NQsYeSsyFQERYGCAzfindAcnKjINnwEEgLx4IqVzQw==", - "optional": true - }, - "node_modules/isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "dev": true - }, - "node_modules/istanbul-lib-coverage": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz", - "integrity": "sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==", - "dev": true, - "peer": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/istanbul-lib-instrument": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-6.0.1.tgz", - "integrity": "sha512-EAMEJBsYuyyztxMxW3g7ugGPkrZsV57v0Hmv3mm1uQsmB+QnZuepg731CRaIgeUVSdmsTngOkSnauNF8p7FIhA==", - "dev": true, - "peer": true, - "dependencies": { - "@babel/core": "^7.12.3", - "@babel/parser": "^7.14.7", - "@istanbuljs/schema": "^0.1.2", - "istanbul-lib-coverage": "^3.2.0", - "semver": "^7.5.4" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/istanbul-lib-instrument/node_modules/semver": { - "version": "7.6.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", - "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", - "dev": true, - "peer": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/istanbul-lib-report": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz", - "integrity": "sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==", - "dev": true, - "peer": true, - "dependencies": { - "istanbul-lib-coverage": "^3.0.0", - "make-dir": "^4.0.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/istanbul-lib-source-maps": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz", - "integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==", - "dev": true, - "peer": true, - "dependencies": { - "debug": "^4.1.1", - "istanbul-lib-coverage": "^3.0.0", - "source-map": "^0.6.1" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/istanbul-reports": { - "version": "3.1.6", - "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.6.tgz", - "integrity": "sha512-TLgnMkKg3iTDsQ9PbPTdpfAK2DzjF9mqUG7RMgcQl8oFjad8ob4laGxv5XV5U9MAfx8D6tSJiUyuAwzLicaxlg==", - "dev": true, - "peer": true, - "dependencies": { - "html-escaper": "^2.0.0", - "istanbul-lib-report": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/jest": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest/-/jest-29.7.0.tgz", - "integrity": "sha512-NIy3oAFp9shda19hy4HK0HRTWKtPJmGdnvywu01nOqNC2vZg+Z+fvJDxpMQA88eb2I9EcafcdjYgsDthnYTvGw==", - "dev": true, - "peer": true, - "dependencies": { - "@jest/core": "^29.7.0", - "@jest/types": "^29.6.3", - "import-local": "^3.0.2", - "jest-cli": "^29.7.0" - }, - "bin": { - "jest": "bin/jest.js" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - }, - "peerDependencies": { - "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" - }, - "peerDependenciesMeta": { - "node-notifier": { - "optional": true - } - } - }, - "node_modules/jest-changed-files": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-29.7.0.tgz", - "integrity": "sha512-fEArFiwf1BpQ+4bXSprcDc3/x4HSzL4al2tozwVpDFpsxALjLYdyiIK4e5Vz66GQJIbXJ82+35PtysofptNX2w==", - "dev": true, - "peer": true, - "dependencies": { - "execa": "^5.0.0", - "jest-util": "^29.7.0", - "p-limit": "^3.1.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-circus": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-29.7.0.tgz", - "integrity": "sha512-3E1nCMgipcTkCocFwM90XXQab9bS+GMsjdpmPrlelaxwD93Ad8iVEjX/vvHPdLPnFf+L40u+5+iutRdA1N9myw==", - "dev": true, - "peer": true, - "dependencies": { - "@jest/environment": "^29.7.0", - "@jest/expect": "^29.7.0", - "@jest/test-result": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/node": "*", - "chalk": "^4.0.0", - "co": "^4.6.0", - "dedent": "^1.0.0", - "is-generator-fn": "^2.0.0", - "jest-each": "^29.7.0", - "jest-matcher-utils": "^29.7.0", - "jest-message-util": "^29.7.0", - "jest-runtime": "^29.7.0", - "jest-snapshot": "^29.7.0", - "jest-util": "^29.7.0", - "p-limit": "^3.1.0", - "pretty-format": "^29.7.0", - "pure-rand": "^6.0.0", - "slash": "^3.0.0", - "stack-utils": "^2.0.3" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-cli": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-29.7.0.tgz", - "integrity": "sha512-OVVobw2IubN/GSYsxETi+gOe7Ka59EFMR/twOU3Jb2GnKKeMGJB5SGUUrEz3SFVmJASUdZUzy83sLNNQ2gZslg==", - "dev": true, - "peer": true, - "dependencies": { - "@jest/core": "^29.7.0", - "@jest/test-result": "^29.7.0", - "@jest/types": "^29.6.3", - "chalk": "^4.0.0", - "create-jest": "^29.7.0", - "exit": "^0.1.2", - "import-local": "^3.0.2", - "jest-config": "^29.7.0", - "jest-util": "^29.7.0", - "jest-validate": "^29.7.0", - "yargs": "^17.3.1" - }, - "bin": { - "jest": "bin/jest.js" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - }, - "peerDependencies": { - "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" - }, - "peerDependenciesMeta": { - "node-notifier": { - "optional": true - } - } - }, - "node_modules/jest-config": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-29.7.0.tgz", - "integrity": "sha512-uXbpfeQ7R6TZBqI3/TxCU4q4ttk3u0PJeC+E0zbfSoSjq6bJ7buBPxzQPL0ifrkY4DNu4JUdk0ImlBUYi840eQ==", - "dev": true, - "peer": true, - "dependencies": { - "@babel/core": "^7.11.6", - "@jest/test-sequencer": "^29.7.0", - "@jest/types": "^29.6.3", - "babel-jest": "^29.7.0", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "deepmerge": "^4.2.2", - "glob": "^7.1.3", - "graceful-fs": "^4.2.9", - "jest-circus": "^29.7.0", - "jest-environment-node": "^29.7.0", - "jest-get-type": "^29.6.3", - "jest-regex-util": "^29.6.3", - "jest-resolve": "^29.7.0", - "jest-runner": "^29.7.0", - "jest-util": "^29.7.0", - "jest-validate": "^29.7.0", - "micromatch": "^4.0.4", - "parse-json": "^5.2.0", - "pretty-format": "^29.7.0", - "slash": "^3.0.0", - "strip-json-comments": "^3.1.1" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - }, - "peerDependencies": { - "@types/node": "*", - "ts-node": ">=9.0.0" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - }, - "ts-node": { - "optional": true - } - } - }, - "node_modules/jest-diff": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.7.0.tgz", - "integrity": "sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw==", - "dev": true, - "peer": true, - "dependencies": { - "chalk": "^4.0.0", - "diff-sequences": "^29.6.3", - "jest-get-type": "^29.6.3", - "pretty-format": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-docblock": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-29.7.0.tgz", - "integrity": "sha512-q617Auw3A612guyaFgsbFeYpNP5t2aoUNLwBUbc/0kD1R4t9ixDbyFTHd1nok4epoVFpr7PmeWHrhvuV3XaJ4g==", - "dev": true, - "peer": true, - "dependencies": { - "detect-newline": "^3.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-each": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-29.7.0.tgz", - "integrity": "sha512-gns+Er14+ZrEoC5fhOfYCY1LOHHr0TI+rQUHZS8Ttw2l7gl+80eHc/gFf2Ktkw0+SIACDTeWvpFcv3B04VembQ==", - "dev": true, - "peer": true, - "dependencies": { - "@jest/types": "^29.6.3", - "chalk": "^4.0.0", - "jest-get-type": "^29.6.3", - "jest-util": "^29.7.0", - "pretty-format": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-environment-node": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-29.7.0.tgz", - "integrity": "sha512-DOSwCRqXirTOyheM+4d5YZOrWcdu0LNZ87ewUoywbcb2XR4wKgqiG8vNeYwhjFMbEkfju7wx2GYH0P2gevGvFw==", - "dev": true, - "peer": true, - "dependencies": { - "@jest/environment": "^29.7.0", - "@jest/fake-timers": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/node": "*", - "jest-mock": "^29.7.0", - "jest-util": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-get-type": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.6.3.tgz", - "integrity": "sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==", - "dev": true, - "peer": true, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-haste-map": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.7.0.tgz", - "integrity": "sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA==", - "dev": true, - "peer": true, - "dependencies": { - "@jest/types": "^29.6.3", - "@types/graceful-fs": "^4.1.3", - "@types/node": "*", - "anymatch": "^3.0.3", - "fb-watchman": "^2.0.0", - "graceful-fs": "^4.2.9", - "jest-regex-util": "^29.6.3", - "jest-util": "^29.7.0", - "jest-worker": "^29.7.0", - "micromatch": "^4.0.4", - "walker": "^1.0.8" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - }, - "optionalDependencies": { - "fsevents": "^2.3.2" - } - }, - "node_modules/jest-leak-detector": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-29.7.0.tgz", - "integrity": "sha512-kYA8IJcSYtST2BY9I+SMC32nDpBT3J2NvWJx8+JCuCdl/CR1I4EKUJROiP8XtCcxqgTTBGJNdbB1A8XRKbTetw==", - "dev": true, - "peer": true, - "dependencies": { - "jest-get-type": "^29.6.3", - "pretty-format": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-matcher-utils": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.7.0.tgz", - "integrity": "sha512-sBkD+Xi9DtcChsI3L3u0+N0opgPYnCRPtGcQYrgXmR+hmt/fYfWAL0xRXYU8eWOdfuLgBe0YCW3AFtnRLagq/g==", - "dev": true, - "peer": true, - "dependencies": { - "chalk": "^4.0.0", - "jest-diff": "^29.7.0", - "jest-get-type": "^29.6.3", - "pretty-format": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-message-util": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.7.0.tgz", - "integrity": "sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w==", - "dev": true, - "peer": true, - "dependencies": { - "@babel/code-frame": "^7.12.13", - "@jest/types": "^29.6.3", - "@types/stack-utils": "^2.0.0", - "chalk": "^4.0.0", - "graceful-fs": "^4.2.9", - "micromatch": "^4.0.4", - "pretty-format": "^29.7.0", - "slash": "^3.0.0", - "stack-utils": "^2.0.3" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-mock": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.7.0.tgz", - "integrity": "sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw==", - "dev": true, - "peer": true, - "dependencies": { - "@jest/types": "^29.6.3", - "@types/node": "*", - "jest-util": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-pnp-resolver": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz", - "integrity": "sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==", - "dev": true, - "peer": true, - "engines": { - "node": ">=6" - }, - "peerDependencies": { - "jest-resolve": "*" - }, - "peerDependenciesMeta": { - "jest-resolve": { - "optional": true - } - } - }, - "node_modules/jest-regex-util": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-29.6.3.tgz", - "integrity": "sha512-KJJBsRCyyLNWCNBOvZyRDnAIfUiRJ8v+hOBQYGn8gDyF3UegwiP4gwRR3/SDa42g1YbVycTidUF3rKjyLFDWbg==", - "dev": true, - "peer": true, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-resolve": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-29.7.0.tgz", - "integrity": "sha512-IOVhZSrg+UvVAshDSDtHyFCCBUl/Q3AAJv8iZ6ZjnZ74xzvwuzLXid9IIIPgTnY62SJjfuupMKZsZQRsCvxEgA==", - "dev": true, - "peer": true, - "dependencies": { - "chalk": "^4.0.0", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.7.0", - "jest-pnp-resolver": "^1.2.2", - "jest-util": "^29.7.0", - "jest-validate": "^29.7.0", - "resolve": "^1.20.0", - "resolve.exports": "^2.0.0", - "slash": "^3.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-resolve-dependencies": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-29.7.0.tgz", - "integrity": "sha512-un0zD/6qxJ+S0et7WxeI3H5XSe9lTBBR7bOHCHXkKR6luG5mwDDlIzVQ0V5cZCuoTgEdcdwzTghYkTWfubi+nA==", - "dev": true, - "peer": true, - "dependencies": { - "jest-regex-util": "^29.6.3", - "jest-snapshot": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-runner": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-29.7.0.tgz", - "integrity": "sha512-fsc4N6cPCAahybGBfTRcq5wFR6fpLznMg47sY5aDpsoejOcVYFb07AHuSnR0liMcPTgBsA3ZJL6kFOjPdoNipQ==", - "dev": true, - "peer": true, - "dependencies": { - "@jest/console": "^29.7.0", - "@jest/environment": "^29.7.0", - "@jest/test-result": "^29.7.0", - "@jest/transform": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/node": "*", - "chalk": "^4.0.0", - "emittery": "^0.13.1", - "graceful-fs": "^4.2.9", - "jest-docblock": "^29.7.0", - "jest-environment-node": "^29.7.0", - "jest-haste-map": "^29.7.0", - "jest-leak-detector": "^29.7.0", - "jest-message-util": "^29.7.0", - "jest-resolve": "^29.7.0", - "jest-runtime": "^29.7.0", - "jest-util": "^29.7.0", - "jest-watcher": "^29.7.0", - "jest-worker": "^29.7.0", - "p-limit": "^3.1.0", - "source-map-support": "0.5.13" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-runtime": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-29.7.0.tgz", - "integrity": "sha512-gUnLjgwdGqW7B4LvOIkbKs9WGbn+QLqRQQ9juC6HndeDiezIwhDP+mhMwHWCEcfQ5RUXa6OPnFF8BJh5xegwwQ==", - "dev": true, - "peer": true, - "dependencies": { - "@jest/environment": "^29.7.0", - "@jest/fake-timers": "^29.7.0", - "@jest/globals": "^29.7.0", - "@jest/source-map": "^29.6.3", - "@jest/test-result": "^29.7.0", - "@jest/transform": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/node": "*", - "chalk": "^4.0.0", - "cjs-module-lexer": "^1.0.0", - "collect-v8-coverage": "^1.0.0", - "glob": "^7.1.3", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.7.0", - "jest-message-util": "^29.7.0", - "jest-mock": "^29.7.0", - "jest-regex-util": "^29.6.3", - "jest-resolve": "^29.7.0", - "jest-snapshot": "^29.7.0", - "jest-util": "^29.7.0", - "slash": "^3.0.0", - "strip-bom": "^4.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-snapshot": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-29.7.0.tgz", - "integrity": "sha512-Rm0BMWtxBcioHr1/OX5YCP8Uov4riHvKPknOGs804Zg9JGZgmIBkbtlxJC/7Z4msKYVbIJtfU+tKb8xlYNfdkw==", - "dev": true, - "peer": true, - "dependencies": { - "@babel/core": "^7.11.6", - "@babel/generator": "^7.7.2", - "@babel/plugin-syntax-jsx": "^7.7.2", - "@babel/plugin-syntax-typescript": "^7.7.2", - "@babel/types": "^7.3.3", - "@jest/expect-utils": "^29.7.0", - "@jest/transform": "^29.7.0", - "@jest/types": "^29.6.3", - "babel-preset-current-node-syntax": "^1.0.0", - "chalk": "^4.0.0", - "expect": "^29.7.0", - "graceful-fs": "^4.2.9", - "jest-diff": "^29.7.0", - "jest-get-type": "^29.6.3", - "jest-matcher-utils": "^29.7.0", - "jest-message-util": "^29.7.0", - "jest-util": "^29.7.0", - "natural-compare": "^1.4.0", - "pretty-format": "^29.7.0", - "semver": "^7.5.3" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-snapshot/node_modules/semver": { - "version": "7.6.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", - "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", - "dev": true, - "peer": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/jest-util": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.7.0.tgz", - "integrity": "sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==", - "dev": true, - "peer": true, - "dependencies": { - "@jest/types": "^29.6.3", - "@types/node": "*", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "graceful-fs": "^4.2.9", - "picomatch": "^2.2.3" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-validate": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-29.7.0.tgz", - "integrity": "sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw==", - "dev": true, - "peer": true, - "dependencies": { - "@jest/types": "^29.6.3", - "camelcase": "^6.2.0", - "chalk": "^4.0.0", - "jest-get-type": "^29.6.3", - "leven": "^3.1.0", - "pretty-format": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-validate/node_modules/camelcase": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", - "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", - "dev": true, - "peer": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/jest-watcher": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-29.7.0.tgz", - "integrity": "sha512-49Fg7WXkU3Vl2h6LbLtMQ/HyB6rXSIX7SqvBLQmssRBGN9I0PNvPmAmCWSOY6SOvrjhI/F7/bGAv9RtnsPA03g==", - "dev": true, - "peer": true, - "dependencies": { - "@jest/test-result": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/node": "*", - "ansi-escapes": "^4.2.1", - "chalk": "^4.0.0", - "emittery": "^0.13.1", - "jest-util": "^29.7.0", - "string-length": "^4.0.1" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-worker": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.7.0.tgz", - "integrity": "sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==", - "dev": true, - "peer": true, - "dependencies": { - "@types/node": "*", - "jest-util": "^29.7.0", - "merge-stream": "^2.0.0", - "supports-color": "^8.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-worker/node_modules/supports-color": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", - "dev": true, - "peer": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/supports-color?sponsor=1" - } - }, - "node_modules/jose": { - "version": "4.15.4", - "resolved": "https://registry.npmjs.org/jose/-/jose-4.15.4.tgz", - "integrity": "sha512-W+oqK4H+r5sITxfxpSU+MMdr/YSWGvgZMQDIsNoBDGGy4i7GBPTtvFKibQzW06n3U3TqHjhvBJsirShsEJ6eeQ==", - "funding": { - "url": "https://github.com/sponsors/panva" - } - }, - "node_modules/js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "dev": true, - "peer": true - }, - "node_modules/js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "dev": true, - "dependencies": { - "argparse": "^2.0.1" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/js2xmlparser": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/js2xmlparser/-/js2xmlparser-4.0.2.tgz", - "integrity": "sha512-6n4D8gLlLf1n5mNLQPRfViYzu9RATblzPEtm1SthMX1Pjao0r9YI9nw7ZIfRxQMERS87mcswrg+r/OYrPRX6jA==", - "optional": true, - "dependencies": { - "xmlcreate": "^2.0.4" - } - }, - "node_modules/jsdoc": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/jsdoc/-/jsdoc-4.0.2.tgz", - "integrity": "sha512-e8cIg2z62InH7azBBi3EsSEqrKx+nUtAS5bBcYTSpZFA+vhNPyhv8PTFZ0WsjOPDj04/dOLlm08EDcQJDqaGQg==", - "optional": true, - "dependencies": { - "@babel/parser": "^7.20.15", - "@jsdoc/salty": "^0.2.1", - "@types/markdown-it": "^12.2.3", - "bluebird": "^3.7.2", - "catharsis": "^0.9.0", - "escape-string-regexp": "^2.0.0", - "js2xmlparser": "^4.0.2", - "klaw": "^3.0.0", - "markdown-it": "^12.3.2", - "markdown-it-anchor": "^8.4.1", - "marked": "^4.0.10", - "mkdirp": "^1.0.4", - "requizzle": "^0.2.3", - "strip-json-comments": "^3.1.0", - "underscore": "~1.13.2" - }, - "bin": { - "jsdoc": "jsdoc.js" - }, - "engines": { - "node": ">=12.0.0" - } - }, - "node_modules/jsdoc/node_modules/escape-string-regexp": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", - "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", - "optional": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/jsesc": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", - "dev": true, - "peer": true, - "bin": { - "jsesc": "bin/jsesc" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/json-bigint": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-bigint/-/json-bigint-1.0.0.tgz", - "integrity": "sha512-SiPv/8VpZuWbvLSMtTDU8hEfrZWg/mH/nV/b4o0CYbSxu1UIQPLdwKOCIyLQX+VIPO5vrLX3i8qtqFyhdPSUSQ==", - "optional": true, - "dependencies": { - "bignumber.js": "^9.0.0" - } - }, - "node_modules/json-buffer": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", - "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", - "dev": true - }, - "node_modules/json-parse-even-better-errors": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", - "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", - "dev": true, - "peer": true - }, - "node_modules/json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true - }, - "node_modules/json-stable-stringify-without-jsonify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", - "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", - "dev": true - }, - "node_modules/json5": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", - "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", - "dev": true, - "peer": true, - "bin": { - "json5": "lib/cli.js" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/jsonwebtoken": { - "version": "9.0.2", - "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-9.0.2.tgz", - "integrity": "sha512-PRp66vJ865SSqOlgqS8hujT5U4AOgMfhrwYIuIhfKaoSCZcirrmASQr8CX7cUg+RMih+hgznrjp99o+W4pJLHQ==", - "dependencies": { - "jws": "^3.2.2", - "lodash.includes": "^4.3.0", - "lodash.isboolean": "^3.0.3", - "lodash.isinteger": "^4.0.4", - "lodash.isnumber": "^3.0.3", - "lodash.isplainobject": "^4.0.6", - "lodash.isstring": "^4.0.1", - "lodash.once": "^4.0.0", - "ms": "^2.1.1", - "semver": "^7.5.4" - }, - "engines": { - "node": ">=12", - "npm": ">=6" - } - }, - "node_modules/jsonwebtoken/node_modules/jwa": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/jwa/-/jwa-1.4.1.tgz", - "integrity": "sha512-qiLX/xhEEFKUAJ6FiBMbes3w9ATzyk5W7Hvzpa/SLYdxNtng+gcurvrI7TbACjIXlsJyr05/S1oUhZrc63evQA==", - "dependencies": { - "buffer-equal-constant-time": "1.0.1", - "ecdsa-sig-formatter": "1.0.11", - "safe-buffer": "^5.0.1" - } - }, - "node_modules/jsonwebtoken/node_modules/jws": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/jws/-/jws-3.2.2.tgz", - "integrity": "sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA==", - "dependencies": { - "jwa": "^1.4.1", - "safe-buffer": "^5.0.1" - } - }, - "node_modules/jsonwebtoken/node_modules/semver": { - "version": "7.6.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", - "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/jwa": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/jwa/-/jwa-2.0.0.tgz", - "integrity": "sha512-jrZ2Qx916EA+fq9cEAeCROWPTfCwi1IVHqT2tapuqLEVVDKFDENFw1oL+MwrTvH6msKxsd1YTDVw6uKEcsrLEA==", - "optional": true, - "dependencies": { - "buffer-equal-constant-time": "1.0.1", - "ecdsa-sig-formatter": "1.0.11", - "safe-buffer": "^5.0.1" - } - }, - "node_modules/jwks-rsa": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/jwks-rsa/-/jwks-rsa-3.1.0.tgz", - "integrity": "sha512-v7nqlfezb9YfHHzYII3ef2a2j1XnGeSE/bK3WfumaYCqONAIstJbrEGapz4kadScZzEt7zYCN7bucj8C0Mv/Rg==", - "dependencies": { - "@types/express": "^4.17.17", - "@types/jsonwebtoken": "^9.0.2", - "debug": "^4.3.4", - "jose": "^4.14.6", - "limiter": "^1.1.5", - "lru-memoizer": "^2.2.0" - }, - "engines": { - "node": ">=14" - } - }, - "node_modules/jwks-rsa/node_modules/@types/express": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.21.tgz", - "integrity": "sha512-ejlPM315qwLpaQlQDTjPdsUFSc6ZsP4AN6AlWnogPjQ7CVi7PYF3YVz+CY3jE2pwYf7E/7HlDAN0rV2GxTG0HQ==", - "dependencies": { - "@types/body-parser": "*", - "@types/express-serve-static-core": "^4.17.33", - "@types/qs": "*", - "@types/serve-static": "*" - } - }, - "node_modules/jws": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/jws/-/jws-4.0.0.tgz", - "integrity": "sha512-KDncfTmOZoOMTFG4mBlG0qUIOlc03fmzH+ru6RgYVZhPkyiy/92Owlt/8UEN+a4TXR1FQetfIpJE8ApdvdVxTg==", - "optional": true, - "dependencies": { - "jwa": "^2.0.0", - "safe-buffer": "^5.0.1" - } - }, - "node_modules/keyv": { - "version": "4.5.4", - "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", - "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", - "dev": true, - "dependencies": { - "json-buffer": "3.0.1" - } - }, - "node_modules/klaw": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/klaw/-/klaw-3.0.0.tgz", - "integrity": "sha512-0Fo5oir+O9jnXu5EefYbVK+mHMBeEVEy2cmctR1O1NECcCkPRreJKrS6Qt/j3KC2C148Dfo9i3pCmCMsdqGr0g==", - "optional": true, - "dependencies": { - "graceful-fs": "^4.1.9" - } - }, - "node_modules/kleur": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", - "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", - "dev": true, - "peer": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/leven": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", - "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", - "dev": true, - "peer": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/levn": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", - "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", - "dev": true, - "dependencies": { - "prelude-ls": "^1.2.1", - "type-check": "~0.4.0" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/limiter": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/limiter/-/limiter-1.1.5.tgz", - "integrity": "sha512-FWWMIEOxz3GwUI4Ts/IvgVy6LPvoMPgjMdQ185nN6psJyBJ4yOpzqm695/h5umdLJg2vW3GR5iG11MAkR2AzJA==" - }, - "node_modules/lines-and-columns": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", - "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", - "dev": true, - "peer": true - }, - "node_modules/linkify-it": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-3.0.3.tgz", - "integrity": "sha512-ynTsyrFSdE5oZ/O9GEf00kPngmOfVwazR5GKDq6EYfhlpFug3J2zybX56a2PRRpc9P+FuSoGNAwjlbDs9jJBPQ==", - "optional": true, - "dependencies": { - "uc.micro": "^1.0.1" - } - }, - "node_modules/locate-path": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", - "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", - "dev": true, - "dependencies": { - "p-locate": "^5.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", - "devOptional": true - }, - "node_modules/lodash.camelcase": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", - "integrity": "sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==" - }, - "node_modules/lodash.clonedeep": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz", - "integrity": "sha512-H5ZhCF25riFd9uB5UCkVKo61m3S/xZk1x4wA6yp/L3RFP6Z/eHH1ymQcGLo7J3GMPfm0V/7m1tryHuGVxpqEBQ==" - }, - "node_modules/lodash.includes": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/lodash.includes/-/lodash.includes-4.3.0.tgz", - "integrity": "sha512-W3Bx6mdkRTGtlJISOvVD/lbqjTlPPUDTMnlXZFnVwi9NKJ6tiAk6LVdlhZMm17VZisqhKcgzpO5Wz91PCt5b0w==" - }, - "node_modules/lodash.isboolean": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz", - "integrity": "sha512-Bz5mupy2SVbPHURB98VAcw+aHh4vRV5IPNhILUCsOzRmsTmSQ17jIuqopAentWoehktxGd9e/hbIXq980/1QJg==" - }, - "node_modules/lodash.isinteger": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/lodash.isinteger/-/lodash.isinteger-4.0.4.tgz", - "integrity": "sha512-DBwtEWN2caHQ9/imiNeEA5ys1JoRtRfY3d7V9wkqtbycnAmTvRRmbHKDV4a0EYc678/dia0jrte4tjYwVBaZUA==" - }, - "node_modules/lodash.isnumber": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/lodash.isnumber/-/lodash.isnumber-3.0.3.tgz", - "integrity": "sha512-QYqzpfwO3/CWf3XP+Z+tkQsfaLL/EnUlXWVkIk5FUPc4sBdTehEqZONuyRt2P67PXAk+NXmTBcc97zw9t1FQrw==" - }, - "node_modules/lodash.isplainobject": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", - "integrity": "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==" - }, - "node_modules/lodash.isstring": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz", - "integrity": "sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw==" - }, - "node_modules/lodash.merge": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", - "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", - "dev": true - }, - "node_modules/lodash.once": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz", - "integrity": "sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg==" - }, - "node_modules/long": { - "version": "5.2.3", - "resolved": "https://registry.npmjs.org/long/-/long-5.2.3.tgz", - "integrity": "sha512-lcHwpNoggQTObv5apGNCTdJrO69eHOZMi4BNC+rTLER8iHAqGrUVeLh/irVIM7zTw2bOXA8T6uNPeujwOLg/2Q==" - }, - "node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/lru-memoizer": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/lru-memoizer/-/lru-memoizer-2.2.0.tgz", - "integrity": "sha512-QfOZ6jNkxCcM/BkIPnFsqDhtrazLRsghi9mBwFAzol5GCvj4EkFT899Za3+QwikCg5sRX8JstioBDwOxEyzaNw==", - "dependencies": { - "lodash.clonedeep": "^4.5.0", - "lru-cache": "~4.0.0" - } - }, - "node_modules/lru-memoizer/node_modules/lru-cache": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.0.2.tgz", - "integrity": "sha512-uQw9OqphAGiZhkuPlpFGmdTU2tEuhxTourM/19qGJrxBPHAr/f8BT1a0i/lOclESnGatdJG/UCkP9kZB/Lh1iw==", - "dependencies": { - "pseudomap": "^1.0.1", - "yallist": "^2.0.0" - } - }, - "node_modules/lru-memoizer/node_modules/yallist": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", - "integrity": "sha512-ncTzHV7NvsQZkYe1DW7cbDLm0YpzHmZF5r/iyP3ZnQtMiJ+pjzisCiMNI+Sj+xQF5pXhSHxSB3uDbsBTzY/c2A==" - }, - "node_modules/make-dir": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz", - "integrity": "sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==", - "dev": true, - "peer": true, - "dependencies": { - "semver": "^7.5.3" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/make-dir/node_modules/semver": { - "version": "7.6.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", - "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", - "dev": true, - "peer": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/makeerror": { - "version": "1.0.12", - "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz", - "integrity": "sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==", - "dev": true, - "peer": true, - "dependencies": { - "tmpl": "1.0.5" - } - }, - "node_modules/markdown-it": { - "version": "12.3.2", - "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-12.3.2.tgz", - "integrity": "sha512-TchMembfxfNVpHkbtriWltGWc+m3xszaRD0CZup7GFFhzIgQqxIfn3eGj1yZpfuflzPvfkt611B2Q/Bsk1YnGg==", - "optional": true, - "dependencies": { - "argparse": "^2.0.1", - "entities": "~2.1.0", - "linkify-it": "^3.0.1", - "mdurl": "^1.0.1", - "uc.micro": "^1.0.5" - }, - "bin": { - "markdown-it": "bin/markdown-it.js" - } - }, - "node_modules/markdown-it-anchor": { - "version": "8.6.7", - "resolved": "https://registry.npmjs.org/markdown-it-anchor/-/markdown-it-anchor-8.6.7.tgz", - "integrity": "sha512-FlCHFwNnutLgVTflOYHPW2pPcl2AACqVzExlkGQNsi4CJgqOHN7YTgDd4LuhgN1BFO3TS0vLAruV1Td6dwWPJA==", - "optional": true, - "peerDependencies": { - "@types/markdown-it": "*", - "markdown-it": "*" - } - }, - "node_modules/marked": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/marked/-/marked-4.3.0.tgz", - "integrity": "sha512-PRsaiG84bK+AMvxziE/lCFss8juXjNaWzVbN5tXAm4XjeaS9NAHhop+PjQxz2A9h8Q4M/xGmzP8vqNwy6JeK0A==", - "optional": true, - "bin": { - "marked": "bin/marked.js" - }, - "engines": { - "node": ">= 12" - } - }, - "node_modules/mdurl": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-1.0.1.tgz", - "integrity": "sha512-/sKlQJCBYVY9Ers9hqzKou4H6V5UWc/M59TH2dvkt+84itfnq7uFOMLpOiOS4ujvHP4etln18fmIxA5R5fll0g==", - "optional": true - }, - "node_modules/media-typer": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", - "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/merge-descriptors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", - "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==" - }, - "node_modules/merge-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", - "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", - "dev": true, - "peer": true - }, - "node_modules/methods": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", - "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/micromatch": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", - "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", - "dev": true, - "peer": true, - "dependencies": { - "braces": "^3.0.2", - "picomatch": "^2.3.1" - }, - "engines": { - "node": ">=8.6" - } - }, - "node_modules/mime": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-3.0.0.tgz", - "integrity": "sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A==", - "optional": true, - "bin": { - "mime": "cli.js" - }, - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mime-types": { - "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", - "dependencies": { - "mime-db": "1.52.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", - "dev": true, - "peer": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "devOptional": true, - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/minimist": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", - "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", - "optional": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/mkdirp": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", - "optional": true, - "bin": { - "mkdirp": "bin/cmd.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" - }, - "node_modules/natural-compare": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", - "dev": true - }, - "node_modules/negotiator": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", - "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/node-fetch": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", - "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", - "dependencies": { - "whatwg-url": "^5.0.0" - }, - "engines": { - "node": "4.x || >=6.0.0" - }, - "peerDependencies": { - "encoding": "^0.1.0" - }, - "peerDependenciesMeta": { - "encoding": { - "optional": true - } - } - }, - "node_modules/node-forge": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.3.1.tgz", - "integrity": "sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==", - "engines": { - "node": ">= 6.13.0" - } - }, - "node_modules/node-int64": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", - "integrity": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==", - "dev": true, - "peer": true - }, - "node_modules/node-releases": { - "version": "2.0.14", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.14.tgz", - "integrity": "sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==", - "dev": true, - "peer": true - }, - "node_modules/normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "dev": true, - "peer": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/npm-run-path": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", - "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", - "dev": true, - "peer": true, - "dependencies": { - "path-key": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/object-hash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz", - "integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==", - "optional": true, - "engines": { - "node": ">= 6" - } - }, - "node_modules/object-inspect": { - "version": "1.13.1", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.1.tgz", - "integrity": "sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/on-finished": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", - "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", - "dependencies": { - "ee-first": "1.1.1" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", - "devOptional": true, - "dependencies": { - "wrappy": "1" - } - }, - "node_modules/onetime": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", - "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", - "dev": true, - "peer": true, - "dependencies": { - "mimic-fn": "^2.1.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/optionator": { - "version": "0.9.3", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.3.tgz", - "integrity": "sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==", - "dev": true, - "dependencies": { - "@aashutoshrathi/word-wrap": "^1.2.3", - "deep-is": "^0.1.3", - "fast-levenshtein": "^2.0.6", - "levn": "^0.4.1", - "prelude-ls": "^1.2.1", - "type-check": "^0.4.0" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/p-limit": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", - "devOptional": true, - "dependencies": { - "yocto-queue": "^0.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-locate": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", - "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", - "dev": true, - "dependencies": { - "p-limit": "^3.0.2" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "dev": true, - "peer": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/parent-module": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", - "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", - "dev": true, - "dependencies": { - "callsites": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/parse-json": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", - "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", - "dev": true, - "peer": true, - "dependencies": { - "@babel/code-frame": "^7.0.0", - "error-ex": "^1.3.1", - "json-parse-even-better-errors": "^2.3.0", - "lines-and-columns": "^1.1.6" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/parseurl": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", - "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", - "devOptional": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/path-parse": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", - "dev": true, - "peer": true - }, - "node_modules/path-to-regexp": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", - "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==" - }, - "node_modules/picocolors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", - "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", - "dev": true, - "peer": true - }, - "node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "dev": true, - "peer": true, - "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/pirates": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.6.tgz", - "integrity": "sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==", - "dev": true, - "peer": true, - "engines": { - "node": ">= 6" - } - }, - "node_modules/pkg-dir": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", - "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", - "dev": true, - "peer": true, - "dependencies": { - "find-up": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/pkg-dir/node_modules/find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dev": true, - "peer": true, - "dependencies": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/pkg-dir/node_modules/locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dev": true, - "peer": true, - "dependencies": { - "p-locate": "^4.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/pkg-dir/node_modules/p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, - "peer": true, - "dependencies": { - "p-try": "^2.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/pkg-dir/node_modules/p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dev": true, - "peer": true, - "dependencies": { - "p-limit": "^2.2.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/prelude-ls": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", - "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", - "dev": true, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/pretty-format": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", - "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", - "dev": true, - "peer": true, - "dependencies": { - "@jest/schemas": "^29.6.3", - "ansi-styles": "^5.0.0", - "react-is": "^18.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/pretty-format/node_modules/ansi-styles": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", - "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", - "dev": true, - "peer": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/printj": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/printj/-/printj-1.1.2.tgz", - "integrity": "sha512-zA2SmoLaxZyArQTOPj5LXecR+RagfPSU5Kw1qP+jkWeNlrq+eJZyY2oS68SU1Z/7/myXM4lo9716laOFAVStCQ==", - "bin": { - "printj": "bin/printj.njs" - }, - "engines": { - "node": ">=0.8" - } - }, - "node_modules/prompts": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", - "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==", - "dev": true, - "peer": true, - "dependencies": { - "kleur": "^3.0.3", - "sisteransi": "^1.0.5" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/proto3-json-serializer": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/proto3-json-serializer/-/proto3-json-serializer-1.1.1.tgz", - "integrity": "sha512-AwAuY4g9nxx0u52DnSMkqqgyLHaW/XaPLtaAo3y/ZCfeaQB/g4YDH4kb8Wc/mWzWvu0YjOznVnfn373MVZZrgw==", - "optional": true, - "dependencies": { - "protobufjs": "^7.0.0" - }, - "engines": { - "node": ">=12.0.0" - } - }, - "node_modules/protobufjs": { - "version": "7.2.6", - "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-7.2.6.tgz", - "integrity": "sha512-dgJaEDDL6x8ASUZ1YqWciTRrdOuYNzoOf27oHNfdyvKqHr5i0FV7FSLU+aIeFjyFgVxrpTOtQUi0BLLBymZaBw==", - "hasInstallScript": true, - "dependencies": { - "@protobufjs/aspromise": "^1.1.2", - "@protobufjs/base64": "^1.1.2", - "@protobufjs/codegen": "^2.0.4", - "@protobufjs/eventemitter": "^1.1.0", - "@protobufjs/fetch": "^1.1.0", - "@protobufjs/float": "^1.0.2", - "@protobufjs/inquire": "^1.1.0", - "@protobufjs/path": "^1.1.2", - "@protobufjs/pool": "^1.1.0", - "@protobufjs/utf8": "^1.1.0", - "@types/node": ">=13.7.0", - "long": "^5.0.0" - }, - "engines": { - "node": ">=12.0.0" - } - }, - "node_modules/protobufjs-cli": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/protobufjs-cli/-/protobufjs-cli-1.1.1.tgz", - "integrity": "sha512-VPWMgIcRNyQwWUv8OLPyGQ/0lQY/QTQAVN5fh+XzfDwsVw1FZ2L3DM/bcBf8WPiRz2tNpaov9lPZfNcmNo6LXA==", - "optional": true, - "dependencies": { - "chalk": "^4.0.0", - "escodegen": "^1.13.0", - "espree": "^9.0.0", - "estraverse": "^5.1.0", - "glob": "^8.0.0", - "jsdoc": "^4.0.0", - "minimist": "^1.2.0", - "semver": "^7.1.2", - "tmp": "^0.2.1", - "uglify-js": "^3.7.7" - }, - "bin": { - "pbjs": "bin/pbjs", - "pbts": "bin/pbts" - }, - "engines": { - "node": ">=12.0.0" - }, - "peerDependencies": { - "protobufjs": "^7.0.0" - } - }, - "node_modules/protobufjs-cli/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "optional": true, - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/protobufjs-cli/node_modules/glob": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz", - "integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==", - "optional": true, - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^5.0.1", - "once": "^1.3.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/protobufjs-cli/node_modules/minimatch": { - "version": "5.1.6", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", - "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", - "optional": true, - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/protobufjs-cli/node_modules/semver": { - "version": "7.6.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", - "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", - "optional": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/proxy-addr": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", - "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", - "dependencies": { - "forwarded": "0.2.0", - "ipaddr.js": "1.9.1" - }, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/pseudomap": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", - "integrity": "sha512-b/YwNhb8lk1Zz2+bXXpS/LK9OisiZZ1SNsSLxN1x2OXVEhW2Ckr/7mWE5vrC1ZTiJlD9g19jWszTmJsB+oEpFQ==" - }, - "node_modules/punycode": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", - "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/pure-rand": { - "version": "6.0.4", - "resolved": "https://registry.npmjs.org/pure-rand/-/pure-rand-6.0.4.tgz", - "integrity": "sha512-LA0Y9kxMYv47GIPJy6MI84fqTd2HmYZI83W/kM/SkKfDlajnZYfmXFTxkbY+xSBPkLJxltMa9hIkmdc29eguMA==", - "dev": true, - "funding": [ - { - "type": "individual", - "url": "https://github.com/sponsors/dubzzz" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/fast-check" - } - ], - "peer": true - }, - "node_modules/qs": { - "version": "6.11.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", - "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", - "dependencies": { - "side-channel": "^1.0.4" - }, - "engines": { - "node": ">=0.6" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/queue-microtask": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", - "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/range-parser": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", - "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/raw-body": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz", - "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==", - "dependencies": { - "bytes": "3.1.2", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "unpipe": "1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/react-is": { - "version": "18.2.0", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", - "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==", - "dev": true, - "peer": true - }, - "node_modules/readable-stream": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", - "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", - "optional": true, - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/requizzle": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/requizzle/-/requizzle-0.2.4.tgz", - "integrity": "sha512-JRrFk1D4OQ4SqovXOgdav+K8EAhSB/LJZqCz8tbX0KObcdeM15Ss59ozWMBWmmINMagCwmqn4ZNryUGpBsl6Jw==", - "optional": true, - "dependencies": { - "lodash": "^4.17.21" - } - }, - "node_modules/resolve": { - "version": "1.22.8", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", - "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", - "dev": true, - "peer": true, - "dependencies": { - "is-core-module": "^2.13.0", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - }, - "bin": { - "resolve": "bin/resolve" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/resolve-cwd": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", - "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", - "dev": true, - "peer": true, - "dependencies": { - "resolve-from": "^5.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/resolve-cwd/node_modules/resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", - "dev": true, - "peer": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/resolve-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/resolve.exports": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-2.0.2.tgz", - "integrity": "sha512-X2UW6Nw3n/aMgDVy+0rSqgHlv39WZAlZrXCdnbyEiKm17DSqHX4MmQMaST3FbeWR5FTuRcUwYAziZajji0Y7mg==", - "dev": true, - "peer": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/retry": { - "version": "0.13.1", - "resolved": "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz", - "integrity": "sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==", - "optional": true, - "engines": { - "node": ">= 4" - } - }, - "node_modules/retry-request": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/retry-request/-/retry-request-5.0.2.tgz", - "integrity": "sha512-wfI3pk7EE80lCIXprqh7ym48IHYdwmAAzESdbU8Q9l7pnRCk9LEhpbOTNKjz6FARLm/Bl5m+4F0ABxOkYUujSQ==", - "optional": true, - "dependencies": { - "debug": "^4.1.1", - "extend": "^3.0.2" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/reusify": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", - "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", - "dev": true, - "engines": { - "iojs": ">=1.0.0", - "node": ">=0.10.0" - } - }, - "node_modules/rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "devOptional": true, - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/run-parallel": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", - "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "dependencies": { - "queue-microtask": "^1.2.2" - } - }, - "node_modules/safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" - }, - "node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "peer": true, - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/send": { - "version": "0.18.0", - "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", - "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", - "dependencies": { - "debug": "2.6.9", - "depd": "2.0.0", - "destroy": "1.2.0", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "fresh": "0.5.2", - "http-errors": "2.0.0", - "mime": "1.6.0", - "ms": "2.1.3", - "on-finished": "2.4.1", - "range-parser": "~1.2.1", - "statuses": "2.0.1" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/send/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/send/node_modules/debug/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" - }, - "node_modules/send/node_modules/mime": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", - "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", - "bin": { - "mime": "cli.js" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/send/node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" - }, - "node_modules/serve-static": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", - "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", - "dependencies": { - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "parseurl": "~1.3.3", - "send": "0.18.0" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/set-function-length": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.1.tgz", - "integrity": "sha512-j4t6ccc+VsKwYHso+kElc5neZpjtq9EnRICFZtWyBsLojhmeF/ZBd/elqm22WJh/BziDe/SBiOeAt0m2mfLD0g==", - "dependencies": { - "define-data-property": "^1.1.2", - "es-errors": "^1.3.0", - "function-bind": "^1.1.2", - "get-intrinsic": "^1.2.3", - "gopd": "^1.0.1", - "has-property-descriptors": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/setprototypeof": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", - "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" - }, - "node_modules/shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "dev": true, - "dependencies": { - "shebang-regex": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/side-channel": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.5.tgz", - "integrity": "sha512-QcgiIWV4WV7qWExbN5llt6frQB/lBven9pqliLXfGPB+K9ZYXxDozp0wLkHS24kWCm+6YXH/f0HhnObZnZOBnQ==", - "dependencies": { - "call-bind": "^1.0.6", - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.4", - "object-inspect": "^1.13.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/signal-exit": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", - "dev": true, - "peer": true - }, - "node_modules/sisteransi": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", - "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", - "dev": true, - "peer": true - }, - "node_modules/slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "dev": true, - "peer": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "devOptional": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/source-map-support": { - "version": "0.5.13", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.13.tgz", - "integrity": "sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==", - "dev": true, - "peer": true, - "dependencies": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - } - }, - "node_modules/sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", - "dev": true, - "peer": true - }, - "node_modules/stack-utils": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.6.tgz", - "integrity": "sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==", - "dev": true, - "peer": true, - "dependencies": { - "escape-string-regexp": "^2.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/stack-utils/node_modules/escape-string-regexp": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", - "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", - "dev": true, - "peer": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/statuses": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", - "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/stream-events": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/stream-events/-/stream-events-1.0.5.tgz", - "integrity": "sha512-E1GUzBSgvct8Jsb3v2X15pjzN1tYebtbLaMg+eBOUOAxgbLoSbT2NS91ckc5lJD1KfLjId+jXJRgo0qnV5Nerg==", - "optional": true, - "dependencies": { - "stubs": "^3.0.0" - } - }, - "node_modules/stream-shift": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.3.tgz", - "integrity": "sha512-76ORR0DO1o1hlKwTbi/DM3EXWGf3ZJYO8cXX5RJwnul2DEg2oyoZyjLNoQM8WsvZiFKCRfC1O0J7iCvie3RZmQ==", - "optional": true - }, - "node_modules/string_decoder": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", - "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", - "optional": true, - "dependencies": { - "safe-buffer": "~5.2.0" - } - }, - "node_modules/string-length": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz", - "integrity": "sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==", - "dev": true, - "peer": true, - "dependencies": { - "char-regex": "^1.0.2", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-bom": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", - "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", - "dev": true, - "peer": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-final-newline": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", - "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", - "dev": true, - "peer": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/strip-json-comments": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", - "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", - "devOptional": true, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/strnum": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/strnum/-/strnum-1.0.5.tgz", - "integrity": "sha512-J8bbNyKKXl5qYcR36TIO8W3mVGVHrmmxsd5PAItGkmyzwJvybiw2IVq5nqd0i4LSNSkB/sx9VHllbfFdr9k1JA==", - "optional": true - }, - "node_modules/stubs": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/stubs/-/stubs-3.0.0.tgz", - "integrity": "sha512-PdHt7hHUJKxvTCgbKX9C1V/ftOcjJQgz8BZwNfV5c4B6dcGqlpelTbJ999jBGZ2jYiPAwcX5dP6oBwVlBlUbxw==", - "optional": true - }, - "node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "devOptional": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/supports-preserve-symlinks-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", - "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", - "dev": true, - "peer": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/teeny-request": { - "version": "8.0.3", - "resolved": "https://registry.npmjs.org/teeny-request/-/teeny-request-8.0.3.tgz", - "integrity": "sha512-jJZpA5He2y52yUhA7pyAGZlgQpcB+xLjcN0eUFxr9c8hP/H7uOXbBNVo/O0C/xVfJLJs680jvkFgVJEEvk9+ww==", - "optional": true, - "dependencies": { - "http-proxy-agent": "^5.0.0", - "https-proxy-agent": "^5.0.0", - "node-fetch": "^2.6.1", - "stream-events": "^1.0.5", - "uuid": "^9.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/test-exclude": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", - "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", - "dev": true, - "peer": true, - "dependencies": { - "@istanbuljs/schema": "^0.1.2", - "glob": "^7.1.4", - "minimatch": "^3.0.4" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/text-decoding": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/text-decoding/-/text-decoding-1.0.0.tgz", - "integrity": "sha512-/0TJD42KDnVwKmDK6jj3xP7E2MG7SHAOG4tyTgyUCRPdHwvkquYNLEQltmdMa3owq3TkddCVcTsoctJI8VQNKA==" - }, - "node_modules/text-table": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", - "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", - "dev": true - }, - "node_modules/tmp": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.1.tgz", - "integrity": "sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ==", - "optional": true, - "dependencies": { - "rimraf": "^3.0.0" - }, - "engines": { - "node": ">=8.17.0" - } - }, - "node_modules/tmpl": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz", - "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==", - "dev": true, - "peer": true - }, - "node_modules/to-fast-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", - "dev": true, - "peer": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, - "peer": true, - "dependencies": { - "is-number": "^7.0.0" - }, - "engines": { - "node": ">=8.0" - } - }, - "node_modules/toidentifier": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", - "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", - "engines": { - "node": ">=0.6" - } - }, - "node_modules/tr46": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", - "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" - }, - "node_modules/ts-deepmerge": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/ts-deepmerge/-/ts-deepmerge-2.0.7.tgz", - "integrity": "sha512-3phiGcxPSSR47RBubQxPoZ+pqXsEsozLo4G4AlSrsMKTFg9TA3l+3he5BqpUi9wiuDbaHWXH/amlzQ49uEdXtg==", - "dev": true - }, - "node_modules/tslib": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", - "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" - }, - "node_modules/type-check": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", - "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", - "dev": true, - "dependencies": { - "prelude-ls": "^1.2.1" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/type-detect": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", - "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", - "dev": true, - "peer": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/type-fest": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", - "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/type-is": { - "version": "1.6.18", - "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", - "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", - "dependencies": { - "media-typer": "0.3.0", - "mime-types": "~2.1.24" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/uc.micro": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-1.0.6.tgz", - "integrity": "sha512-8Y75pvTYkLJW2hWQHXxoqRgV7qb9B+9vFEtidML+7koHUFapnVJAZ6cKs+Qjz5Aw3aZWHMC6u0wJE3At+nSGwA==", - "optional": true - }, - "node_modules/uglify-js": { - "version": "3.17.4", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.17.4.tgz", - "integrity": "sha512-T9q82TJI9e/C1TAxYvfb16xO120tMVFZrGA3f9/P4424DNu6ypK103y0GPFVa17yotwSyZW5iYXgjYHkGrJW/g==", - "optional": true, - "bin": { - "uglifyjs": "bin/uglifyjs" - }, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/underscore": { - "version": "1.13.6", - "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.13.6.tgz", - "integrity": "sha512-+A5Sja4HP1M08MaXya7p5LvjuM7K6q/2EaC0+iovj/wOcMsTzMvDFbasi/oSapiwOlt252IqsKqPjCl7huKS0A==", - "optional": true - }, - "node_modules/undici-types": { - "version": "5.26.5", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", - "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==" - }, - "node_modules/unpipe": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", - "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/update-browserslist-db": { - "version": "1.0.13", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz", - "integrity": "sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "peer": true, - "dependencies": { - "escalade": "^3.1.1", - "picocolors": "^1.0.0" - }, - "bin": { - "update-browserslist-db": "cli.js" - }, - "peerDependencies": { - "browserslist": ">= 4.21.0" - } - }, - "node_modules/uri-js": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", - "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", - "dev": true, - "dependencies": { - "punycode": "^2.1.0" - } - }, - "node_modules/util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", - "optional": true - }, - "node_modules/utils-merge": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", - "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", - "engines": { - "node": ">= 0.4.0" - } - }, - "node_modules/uuid": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz", - "integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==", - "funding": [ - "https://github.com/sponsors/broofa", - "https://github.com/sponsors/ctavan" - ], - "bin": { - "uuid": "dist/bin/uuid" - } - }, - "node_modules/v8-to-istanbul": { - "version": "9.2.0", - "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.2.0.tgz", - "integrity": "sha512-/EH/sDgxU2eGxajKdwLCDmQ4FWq+kpi3uCmBGpw1xJtnAxEjlD8j8PEiGWpCIMIs3ciNAgH0d3TTJiUkYzyZjA==", - "dev": true, - "peer": true, - "dependencies": { - "@jridgewell/trace-mapping": "^0.3.12", - "@types/istanbul-lib-coverage": "^2.0.1", - "convert-source-map": "^2.0.0" - }, - "engines": { - "node": ">=10.12.0" - } - }, - "node_modules/vary": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", - "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/walker": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz", - "integrity": "sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==", - "dev": true, - "peer": true, - "dependencies": { - "makeerror": "1.0.12" - } - }, - "node_modules/webidl-conversions": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", - "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" - }, - "node_modules/websocket-driver": { - "version": "0.7.4", - "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.4.tgz", - "integrity": "sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==", - "dependencies": { - "http-parser-js": ">=0.5.1", - "safe-buffer": ">=5.1.0", - "websocket-extensions": ">=0.1.1" - }, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/websocket-extensions": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.4.tgz", - "integrity": "sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==", - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/whatwg-url": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", - "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", - "dependencies": { - "tr46": "~0.0.3", - "webidl-conversions": "^3.0.0" - } - }, - "node_modules/which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/node-which" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/word-wrap": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", - "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", - "optional": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", - "devOptional": true - }, - "node_modules/write-file-atomic": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-4.0.2.tgz", - "integrity": "sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==", - "dev": true, - "peer": true, - "dependencies": { - "imurmurhash": "^0.1.4", - "signal-exit": "^3.0.7" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/xmlcreate": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/xmlcreate/-/xmlcreate-2.0.4.tgz", - "integrity": "sha512-nquOebG4sngPmGPICTS5EnxqhKbCmz5Ox5hsszI2T6U5qdrJizBc+0ilYSEjTSzU0yZcmvppztXe/5Al5fUwdg==", - "optional": true - }, - "node_modules/y18n": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", - "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", - "engines": { - "node": ">=10" - } - }, - "node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" - }, - "node_modules/yargs": { - "version": "17.7.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", - "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", - "dependencies": { - "cliui": "^8.0.1", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.3", - "y18n": "^5.0.5", - "yargs-parser": "^21.1.1" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/yargs-parser": { - "version": "21.1.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", - "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", - "engines": { - "node": ">=12" - } - }, - "node_modules/yocto-queue": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", - "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", - "devOptional": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - } - } -} diff --git a/apps/driver-archive-cubit/functions/package.json b/apps/driver-archive-cubit/functions/package.json deleted file mode 100755 index 38eeb46..0000000 --- a/apps/driver-archive-cubit/functions/package.json +++ /dev/null @@ -1,29 +0,0 @@ -{ - "name": "functions", - "description": "Cloud Functions for Firebase", - "scripts": { - "lint": "eslint .", - "serve": "firebase emulators:start --only functions", - "shell": "firebase functions:shell", - "start": "npm run shell", - "deploy": "firebase deploy --only functions", - "logs": "firebase functions:log" - }, - "engines": { - "node": "18" - }, - "main": "index.js", - "dependencies": { - "agora-access-token": "^2.0.4", - "express": "^4.18.2", - "firebase": "^10.6.0", - "firebase-admin": "^11.8.0", - "firebase-functions": "^4.7.0" - }, - "devDependencies": { - "eslint": "^8.15.0", - "eslint-config-google": "^0.14.0", - "firebase-functions-test": "^3.1.0" - }, - "private": true -} diff --git a/apps/driver-archive-cubit/ios/.gitignore b/apps/driver-archive-cubit/ios/.gitignore deleted file mode 100755 index 7a7f987..0000000 --- a/apps/driver-archive-cubit/ios/.gitignore +++ /dev/null @@ -1,34 +0,0 @@ -**/dgph -*.mode1v3 -*.mode2v3 -*.moved-aside -*.pbxuser -*.perspectivev3 -**/*sync/ -.sconsign.dblite -.tags* -**/.vagrant/ -**/DerivedData/ -Icon? -**/Pods/ -**/.symlinks/ -profile -xcuserdata -**/.generated/ -Flutter/App.framework -Flutter/Flutter.framework -Flutter/Flutter.podspec -Flutter/Generated.xcconfig -Flutter/ephemeral/ -Flutter/app.flx -Flutter/app.zip -Flutter/flutter_assets/ -Flutter/flutter_export_environment.sh -ServiceDefinitions.json -Runner/GeneratedPluginRegistrant.* - -# Exceptions to above rules. -!default.mode1v3 -!default.mode2v3 -!default.pbxuser -!default.perspectivev3 diff --git a/apps/driver-archive-cubit/ios/Flutter/AppFrameworkInfo.plist b/apps/driver-archive-cubit/ios/Flutter/AppFrameworkInfo.plist deleted file mode 100755 index 7c56964..0000000 --- a/apps/driver-archive-cubit/ios/Flutter/AppFrameworkInfo.plist +++ /dev/null @@ -1,26 +0,0 @@ - - - - - CFBundleDevelopmentRegion - en - CFBundleExecutable - App - CFBundleIdentifier - io.flutter.flutter.app - CFBundleInfoDictionaryVersion - 6.0 - CFBundleName - App - CFBundlePackageType - FMWK - CFBundleShortVersionString - 1.0 - CFBundleSignature - ???? - CFBundleVersion - 1.0 - MinimumOSVersion - 12.0 - - diff --git a/apps/driver-archive-cubit/ios/Flutter/Debug.xcconfig b/apps/driver-archive-cubit/ios/Flutter/Debug.xcconfig deleted file mode 100755 index ec97fc6..0000000 --- a/apps/driver-archive-cubit/ios/Flutter/Debug.xcconfig +++ /dev/null @@ -1,2 +0,0 @@ -#include? "Pods/Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig" -#include "Generated.xcconfig" diff --git a/apps/driver-archive-cubit/ios/Flutter/Release.xcconfig b/apps/driver-archive-cubit/ios/Flutter/Release.xcconfig deleted file mode 100755 index c4855bf..0000000 --- a/apps/driver-archive-cubit/ios/Flutter/Release.xcconfig +++ /dev/null @@ -1,2 +0,0 @@ -#include? "Pods/Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig" -#include "Generated.xcconfig" diff --git a/apps/driver-archive-cubit/ios/Podfile b/apps/driver-archive-cubit/ios/Podfile deleted file mode 100755 index 20f45c9..0000000 --- a/apps/driver-archive-cubit/ios/Podfile +++ /dev/null @@ -1,59 +0,0 @@ -platform :ios, '14.0' -$iOSVersion = '14.0' # or your desired version - -ENV['COCOAPODS_DISABLE_STATS'] = 'true' - -project 'Runner', { - 'Debug' => :debug, - 'Profile' => :release, - 'Release' => :release, -} - -def flutter_root - generated_xcode_build_settings_path = File.expand_path(File.join('..', 'Flutter', 'Generated.xcconfig'), __FILE__) - unless File.exist?(generated_xcode_build_settings_path) - raise "#{generated_xcode_build_settings_path} must exist. If you're running pod install manually, make sure flutter pub get is executed first" - end - - File.foreach(generated_xcode_build_settings_path) do |line| - matches = line.match(/FLUTTER_ROOT\=(.*)/) - return matches[1].strip if matches - end - raise "FLUTTER_ROOT not found in #{generated_xcode_build_settings_path}. Try deleting Generated.xcconfig, then run flutter pub get" -end - -require File.expand_path(File.join('packages', 'flutter_tools', 'bin', 'podhelper'), flutter_root) - -flutter_ios_podfile_setup - -target 'Runner' do - use_frameworks! :linkage => :dynamic - pod 'Firebase', :modular_headers => true - - # Explicitly enable modular headers for firebase_messaging and other Firebase-related pods - pod 'FirebaseMessaging', :modular_headers => true - pod 'FirebaseCore', :modular_headers => true - pod 'FirebaseAuth', :modular_headers => true - - flutter_install_all_ios_pods File.dirname(File.realpath(__FILE__)) - - target 'RunnerTests' do - inherit! :search_paths - end -end - -post_install do |installer| - installer.pods_project.build_configurations.each do |config| - config.build_settings["EXCLUDED_ARCHS[sdk=*]"] = "armv7" - config.build_settings['IPHONEOS_DEPLOYMENT_TARGET'] = $iOSVersion - end - - installer.pods_project.targets.each do |target| - flutter_additional_ios_build_settings(target) - target.build_configurations.each do |config| - if Gem::Version.new($iOSVersion) > Gem::Version.new(config.build_settings['IPHONEOS_DEPLOYMENT_TARGET']) - config.build_settings['IPHONEOS_DEPLOYMENT_TARGET'] = $iOSVersion - end - end - end -end \ No newline at end of file diff --git a/apps/driver-archive-cubit/ios/Podfile.lock b/apps/driver-archive-cubit/ios/Podfile.lock deleted file mode 100755 index aef1f9f..0000000 --- a/apps/driver-archive-cubit/ios/Podfile.lock +++ /dev/null @@ -1,555 +0,0 @@ -PODS: - - AppAuth (1.7.6): - - AppAuth/Core (= 1.7.6) - - AppAuth/ExternalUserAgent (= 1.7.6) - - AppAuth/Core (1.7.6) - - AppAuth/ExternalUserAgent (1.7.6): - - AppAuth/Core - - audio_session (0.0.1): - - Flutter - - background_location (0.0.1): - - Flutter - - camera_avfoundation (0.0.1): - - Flutter - - device_info_plus (0.0.1): - - Flutter - - Firebase (11.4.0): - - Firebase/Core (= 11.4.0) - - Firebase/Auth (11.4.0): - - Firebase/CoreOnly - - FirebaseAuth (~> 11.4.0) - - Firebase/Core (11.4.0): - - Firebase/CoreOnly - - FirebaseAnalytics (~> 11.4.0) - - Firebase/CoreOnly (11.4.0): - - FirebaseCore (= 11.4.0) - - Firebase/Messaging (11.4.0): - - Firebase/CoreOnly - - FirebaseMessaging (~> 11.4.0) - - firebase_auth (5.3.4): - - Firebase/Auth (= 11.4.0) - - firebase_core - - Flutter - - firebase_core (3.9.0): - - Firebase/CoreOnly (= 11.4.0) - - Flutter - - firebase_messaging (15.1.6): - - Firebase/Messaging (= 11.4.0) - - firebase_core - - Flutter - - FirebaseAnalytics (11.4.0): - - FirebaseAnalytics/AdIdSupport (= 11.4.0) - - FirebaseCore (~> 11.0) - - FirebaseInstallations (~> 11.0) - - GoogleUtilities/AppDelegateSwizzler (~> 8.0) - - GoogleUtilities/MethodSwizzler (~> 8.0) - - GoogleUtilities/Network (~> 8.0) - - "GoogleUtilities/NSData+zlib (~> 8.0)" - - nanopb (~> 3.30910.0) - - FirebaseAnalytics/AdIdSupport (11.4.0): - - FirebaseCore (~> 11.0) - - FirebaseInstallations (~> 11.0) - - GoogleAppMeasurement (= 11.4.0) - - GoogleUtilities/AppDelegateSwizzler (~> 8.0) - - GoogleUtilities/MethodSwizzler (~> 8.0) - - GoogleUtilities/Network (~> 8.0) - - "GoogleUtilities/NSData+zlib (~> 8.0)" - - nanopb (~> 3.30910.0) - - FirebaseAppCheckInterop (11.6.0) - - FirebaseAuth (11.4.0): - - FirebaseAppCheckInterop (~> 11.0) - - FirebaseAuthInterop (~> 11.0) - - FirebaseCore (~> 11.4) - - FirebaseCoreExtension (~> 11.4) - - GoogleUtilities/AppDelegateSwizzler (~> 8.0) - - GoogleUtilities/Environment (~> 8.0) - - GTMSessionFetcher/Core (< 5.0, >= 3.4) - - RecaptchaInterop (~> 100.0) - - FirebaseAuthInterop (11.6.0) - - FirebaseCore (11.4.0): - - FirebaseCoreInternal (~> 11.0) - - GoogleUtilities/Environment (~> 8.0) - - GoogleUtilities/Logger (~> 8.0) - - FirebaseCoreExtension (11.4.1): - - FirebaseCore (~> 11.0) - - FirebaseCoreInternal (11.6.0): - - "GoogleUtilities/NSData+zlib (~> 8.0)" - - FirebaseInstallations (11.4.0): - - FirebaseCore (~> 11.0) - - GoogleUtilities/Environment (~> 8.0) - - GoogleUtilities/UserDefaults (~> 8.0) - - PromisesObjC (~> 2.4) - - FirebaseMessaging (11.4.0): - - FirebaseCore (~> 11.0) - - FirebaseInstallations (~> 11.0) - - GoogleDataTransport (~> 10.0) - - GoogleUtilities/AppDelegateSwizzler (~> 8.0) - - GoogleUtilities/Environment (~> 8.0) - - GoogleUtilities/Reachability (~> 8.0) - - GoogleUtilities/UserDefaults (~> 8.0) - - nanopb (~> 3.30910.0) - - Flutter (1.0.0) - - flutter_app_group_directory (0.0.1): - - Flutter - - flutter_contacts (0.0.1): - - Flutter - - flutter_image_compress_common (1.0.0): - - Flutter - - Mantle - - SDWebImage - - SDWebImageWebPCoder - - flutter_inappwebview_ios (0.0.1): - - Flutter - - flutter_inappwebview_ios/Core (= 0.0.1) - - OrderedSet (~> 6.0.3) - - flutter_inappwebview_ios/Core (0.0.1): - - Flutter - - OrderedSet (~> 6.0.3) - - flutter_local_notifications (0.0.1): - - Flutter - - flutter_secure_storage (6.0.0): - - Flutter - - flutter_tts (0.0.1): - - Flutter - - geolocator_apple (1.2.0): - - Flutter - - Google-Maps-iOS-Utils (5.0.0): - - GoogleMaps (~> 8.0) - - google_maps_flutter_ios (0.0.1): - - Flutter - - Google-Maps-iOS-Utils (< 7.0, >= 5.0) - - GoogleMaps (< 10.0, >= 8.4) - - google_sign_in_ios (0.0.1): - - AppAuth (>= 1.7.4) - - Flutter - - FlutterMacOS - - GoogleSignIn (~> 7.1) - - GTMSessionFetcher (>= 3.4.0) - - GoogleAppMeasurement (11.4.0): - - GoogleAppMeasurement/AdIdSupport (= 11.4.0) - - GoogleUtilities/AppDelegateSwizzler (~> 8.0) - - GoogleUtilities/MethodSwizzler (~> 8.0) - - GoogleUtilities/Network (~> 8.0) - - "GoogleUtilities/NSData+zlib (~> 8.0)" - - nanopb (~> 3.30910.0) - - GoogleAppMeasurement/AdIdSupport (11.4.0): - - GoogleAppMeasurement/WithoutAdIdSupport (= 11.4.0) - - GoogleUtilities/AppDelegateSwizzler (~> 8.0) - - GoogleUtilities/MethodSwizzler (~> 8.0) - - GoogleUtilities/Network (~> 8.0) - - "GoogleUtilities/NSData+zlib (~> 8.0)" - - nanopb (~> 3.30910.0) - - GoogleAppMeasurement/WithoutAdIdSupport (11.4.0): - - GoogleUtilities/AppDelegateSwizzler (~> 8.0) - - GoogleUtilities/MethodSwizzler (~> 8.0) - - GoogleUtilities/Network (~> 8.0) - - "GoogleUtilities/NSData+zlib (~> 8.0)" - - nanopb (~> 3.30910.0) - - GoogleDataTransport (10.1.0): - - nanopb (~> 3.30910.0) - - PromisesObjC (~> 2.4) - - GoogleMaps (8.4.0): - - GoogleMaps/Maps (= 8.4.0) - - GoogleMaps/Base (8.4.0) - - GoogleMaps/Maps (8.4.0): - - GoogleMaps/Base - - GoogleSignIn (7.1.0): - - AppAuth (< 2.0, >= 1.7.3) - - GTMAppAuth (< 5.0, >= 4.1.1) - - GTMSessionFetcher/Core (~> 3.3) - - GoogleUtilities/AppDelegateSwizzler (8.0.2): - - GoogleUtilities/Environment - - GoogleUtilities/Logger - - GoogleUtilities/Network - - GoogleUtilities/Privacy - - GoogleUtilities/Environment (8.0.2): - - GoogleUtilities/Privacy - - GoogleUtilities/Logger (8.0.2): - - GoogleUtilities/Environment - - GoogleUtilities/Privacy - - GoogleUtilities/MethodSwizzler (8.0.2): - - GoogleUtilities/Logger - - GoogleUtilities/Privacy - - GoogleUtilities/Network (8.0.2): - - GoogleUtilities/Logger - - "GoogleUtilities/NSData+zlib" - - GoogleUtilities/Privacy - - GoogleUtilities/Reachability - - "GoogleUtilities/NSData+zlib (8.0.2)": - - GoogleUtilities/Privacy - - GoogleUtilities/Privacy (8.0.2) - - GoogleUtilities/Reachability (8.0.2): - - GoogleUtilities/Logger - - GoogleUtilities/Privacy - - GoogleUtilities/UserDefaults (8.0.2): - - GoogleUtilities/Logger - - GoogleUtilities/Privacy - - GTMAppAuth (4.1.1): - - AppAuth/Core (~> 1.7) - - GTMSessionFetcher/Core (< 4.0, >= 3.3) - - GTMSessionFetcher (3.5.0): - - GTMSessionFetcher/Full (= 3.5.0) - - GTMSessionFetcher/Core (3.5.0) - - GTMSessionFetcher/Full (3.5.0): - - GTMSessionFetcher/Core - - image_cropper (0.0.4): - - Flutter - - TOCropViewController (~> 2.7.4) - - image_picker_ios (0.0.1): - - Flutter - - IOSSecuritySuite (1.9.11) - - jailbreak_root_detection (1.0.1): - - Flutter - - IOSSecuritySuite (~> 1.9.10) - - just_audio (0.0.1): - - Flutter - - libwebp (1.3.2): - - libwebp/demux (= 1.3.2) - - libwebp/mux (= 1.3.2) - - libwebp/sharpyuv (= 1.3.2) - - libwebp/webp (= 1.3.2) - - libwebp/demux (1.3.2): - - libwebp/webp - - libwebp/mux (1.3.2): - - libwebp/demux - - libwebp/sharpyuv (1.3.2) - - libwebp/webp (1.3.2): - - libwebp/sharpyuv - - live_activities (0.0.1): - - Flutter - - local_auth_darwin (0.0.1): - - Flutter - - FlutterMacOS - - location (0.0.1): - - Flutter - - Mantle (2.2.0): - - Mantle/extobjc (= 2.2.0) - - Mantle/extobjc (2.2.0) - - nanopb (3.30910.0): - - nanopb/decode (= 3.30910.0) - - nanopb/encode (= 3.30910.0) - - nanopb/decode (3.30910.0) - - nanopb/encode (3.30910.0) - - OrderedSet (6.0.3) - - package_info_plus (0.4.5): - - Flutter - - path_provider_foundation (0.0.1): - - Flutter - - FlutterMacOS - - permission_handler_apple (9.3.0): - - Flutter - - PromisesObjC (2.4.0) - - quick_actions_ios (0.0.1): - - Flutter - - RecaptchaInterop (100.0.0) - - record_darwin (1.0.0): - - Flutter - - SDWebImage (5.20.0): - - SDWebImage/Core (= 5.20.0) - - SDWebImage/Core (5.20.0) - - SDWebImageWebPCoder (0.14.6): - - libwebp (~> 1.0) - - SDWebImage/Core (~> 5.17) - - share (0.0.1): - - Flutter - - sign_in_with_apple (0.0.1): - - Flutter - - sqflite_darwin (0.0.4): - - Flutter - - FlutterMacOS - - Stripe (23.30.0): - - StripeApplePay (= 23.30.0) - - StripeCore (= 23.30.0) - - StripePayments (= 23.30.0) - - StripePaymentsUI (= 23.30.0) - - StripeUICore (= 23.30.0) - - stripe_ios (0.0.1): - - Flutter - - Stripe (~> 23.30.0) - - StripeApplePay (~> 23.30.0) - - StripeFinancialConnections (~> 23.30.0) - - StripePayments (~> 23.30.0) - - StripePaymentSheet (~> 23.30.0) - - StripePaymentsUI (~> 23.30.0) - - StripeApplePay (23.30.0): - - StripeCore (= 23.30.0) - - StripeCore (23.30.0) - - StripeFinancialConnections (23.30.0): - - StripeCore (= 23.30.0) - - StripeUICore (= 23.30.0) - - StripePayments (23.30.0): - - StripeCore (= 23.30.0) - - StripePayments/Stripe3DS2 (= 23.30.0) - - StripePayments/Stripe3DS2 (23.30.0): - - StripeCore (= 23.30.0) - - StripePaymentSheet (23.30.0): - - StripeApplePay (= 23.30.0) - - StripeCore (= 23.30.0) - - StripePayments (= 23.30.0) - - StripePaymentsUI (= 23.30.0) - - StripePaymentsUI (23.30.0): - - StripeCore (= 23.30.0) - - StripePayments (= 23.30.0) - - StripeUICore (= 23.30.0) - - StripeUICore (23.30.0): - - StripeCore (= 23.30.0) - - TOCropViewController (2.7.4) - - url_launcher_ios (0.0.1): - - Flutter - - vibration (1.7.5): - - Flutter - - video_player_avfoundation (0.0.1): - - Flutter - - FlutterMacOS - - wakelock_plus (0.0.1): - - Flutter - - webview_flutter_wkwebview (0.0.1): - - Flutter - - FlutterMacOS - -DEPENDENCIES: - - audio_session (from `.symlinks/plugins/audio_session/ios`) - - background_location (from `.symlinks/plugins/background_location/ios`) - - camera_avfoundation (from `.symlinks/plugins/camera_avfoundation/ios`) - - device_info_plus (from `.symlinks/plugins/device_info_plus/ios`) - - Firebase - - firebase_auth (from `.symlinks/plugins/firebase_auth/ios`) - - firebase_core (from `.symlinks/plugins/firebase_core/ios`) - - firebase_messaging (from `.symlinks/plugins/firebase_messaging/ios`) - - FirebaseAuth - - FirebaseCore - - FirebaseMessaging - - Flutter (from `Flutter`) - - flutter_app_group_directory (from `.symlinks/plugins/flutter_app_group_directory/ios`) - - flutter_contacts (from `.symlinks/plugins/flutter_contacts/ios`) - - flutter_image_compress_common (from `.symlinks/plugins/flutter_image_compress_common/ios`) - - flutter_inappwebview_ios (from `.symlinks/plugins/flutter_inappwebview_ios/ios`) - - flutter_local_notifications (from `.symlinks/plugins/flutter_local_notifications/ios`) - - flutter_secure_storage (from `.symlinks/plugins/flutter_secure_storage/ios`) - - flutter_tts (from `.symlinks/plugins/flutter_tts/ios`) - - geolocator_apple (from `.symlinks/plugins/geolocator_apple/ios`) - - google_maps_flutter_ios (from `.symlinks/plugins/google_maps_flutter_ios/ios`) - - google_sign_in_ios (from `.symlinks/plugins/google_sign_in_ios/darwin`) - - image_cropper (from `.symlinks/plugins/image_cropper/ios`) - - image_picker_ios (from `.symlinks/plugins/image_picker_ios/ios`) - - jailbreak_root_detection (from `.symlinks/plugins/jailbreak_root_detection/ios`) - - just_audio (from `.symlinks/plugins/just_audio/ios`) - - live_activities (from `.symlinks/plugins/live_activities/ios`) - - local_auth_darwin (from `.symlinks/plugins/local_auth_darwin/darwin`) - - location (from `.symlinks/plugins/location/ios`) - - package_info_plus (from `.symlinks/plugins/package_info_plus/ios`) - - path_provider_foundation (from `.symlinks/plugins/path_provider_foundation/darwin`) - - permission_handler_apple (from `.symlinks/plugins/permission_handler_apple/ios`) - - quick_actions_ios (from `.symlinks/plugins/quick_actions_ios/ios`) - - record_darwin (from `.symlinks/plugins/record_darwin/ios`) - - share (from `.symlinks/plugins/share/ios`) - - sign_in_with_apple (from `.symlinks/plugins/sign_in_with_apple/ios`) - - sqflite_darwin (from `.symlinks/plugins/sqflite_darwin/darwin`) - - stripe_ios (from `.symlinks/plugins/stripe_ios/ios`) - - url_launcher_ios (from `.symlinks/plugins/url_launcher_ios/ios`) - - vibration (from `.symlinks/plugins/vibration/ios`) - - video_player_avfoundation (from `.symlinks/plugins/video_player_avfoundation/darwin`) - - wakelock_plus (from `.symlinks/plugins/wakelock_plus/ios`) - - webview_flutter_wkwebview (from `.symlinks/plugins/webview_flutter_wkwebview/darwin`) - -SPEC REPOS: - trunk: - - AppAuth - - Firebase - - FirebaseAnalytics - - FirebaseAppCheckInterop - - FirebaseAuth - - FirebaseAuthInterop - - FirebaseCore - - FirebaseCoreExtension - - FirebaseCoreInternal - - FirebaseInstallations - - FirebaseMessaging - - Google-Maps-iOS-Utils - - GoogleAppMeasurement - - GoogleDataTransport - - GoogleMaps - - GoogleSignIn - - GoogleUtilities - - GTMAppAuth - - GTMSessionFetcher - - IOSSecuritySuite - - libwebp - - Mantle - - nanopb - - OrderedSet - - PromisesObjC - - RecaptchaInterop - - SDWebImage - - SDWebImageWebPCoder - - Stripe - - StripeApplePay - - StripeCore - - StripeFinancialConnections - - StripePayments - - StripePaymentSheet - - StripePaymentsUI - - StripeUICore - - TOCropViewController - -EXTERNAL SOURCES: - audio_session: - :path: ".symlinks/plugins/audio_session/ios" - background_location: - :path: ".symlinks/plugins/background_location/ios" - camera_avfoundation: - :path: ".symlinks/plugins/camera_avfoundation/ios" - device_info_plus: - :path: ".symlinks/plugins/device_info_plus/ios" - firebase_auth: - :path: ".symlinks/plugins/firebase_auth/ios" - firebase_core: - :path: ".symlinks/plugins/firebase_core/ios" - firebase_messaging: - :path: ".symlinks/plugins/firebase_messaging/ios" - Flutter: - :path: Flutter - flutter_app_group_directory: - :path: ".symlinks/plugins/flutter_app_group_directory/ios" - flutter_contacts: - :path: ".symlinks/plugins/flutter_contacts/ios" - flutter_image_compress_common: - :path: ".symlinks/plugins/flutter_image_compress_common/ios" - flutter_inappwebview_ios: - :path: ".symlinks/plugins/flutter_inappwebview_ios/ios" - flutter_local_notifications: - :path: ".symlinks/plugins/flutter_local_notifications/ios" - flutter_secure_storage: - :path: ".symlinks/plugins/flutter_secure_storage/ios" - flutter_tts: - :path: ".symlinks/plugins/flutter_tts/ios" - geolocator_apple: - :path: ".symlinks/plugins/geolocator_apple/ios" - google_maps_flutter_ios: - :path: ".symlinks/plugins/google_maps_flutter_ios/ios" - google_sign_in_ios: - :path: ".symlinks/plugins/google_sign_in_ios/darwin" - image_cropper: - :path: ".symlinks/plugins/image_cropper/ios" - image_picker_ios: - :path: ".symlinks/plugins/image_picker_ios/ios" - jailbreak_root_detection: - :path: ".symlinks/plugins/jailbreak_root_detection/ios" - just_audio: - :path: ".symlinks/plugins/just_audio/ios" - live_activities: - :path: ".symlinks/plugins/live_activities/ios" - local_auth_darwin: - :path: ".symlinks/plugins/local_auth_darwin/darwin" - location: - :path: ".symlinks/plugins/location/ios" - package_info_plus: - :path: ".symlinks/plugins/package_info_plus/ios" - path_provider_foundation: - :path: ".symlinks/plugins/path_provider_foundation/darwin" - permission_handler_apple: - :path: ".symlinks/plugins/permission_handler_apple/ios" - quick_actions_ios: - :path: ".symlinks/plugins/quick_actions_ios/ios" - record_darwin: - :path: ".symlinks/plugins/record_darwin/ios" - share: - :path: ".symlinks/plugins/share/ios" - sign_in_with_apple: - :path: ".symlinks/plugins/sign_in_with_apple/ios" - sqflite_darwin: - :path: ".symlinks/plugins/sqflite_darwin/darwin" - stripe_ios: - :path: ".symlinks/plugins/stripe_ios/ios" - url_launcher_ios: - :path: ".symlinks/plugins/url_launcher_ios/ios" - vibration: - :path: ".symlinks/plugins/vibration/ios" - video_player_avfoundation: - :path: ".symlinks/plugins/video_player_avfoundation/darwin" - wakelock_plus: - :path: ".symlinks/plugins/wakelock_plus/ios" - webview_flutter_wkwebview: - :path: ".symlinks/plugins/webview_flutter_wkwebview/darwin" - -SPEC CHECKSUMS: - AppAuth: d4f13a8fe0baf391b2108511793e4b479691fb73 - audio_session: f08db0697111ac84ba46191b55488c0563bb29c6 - background_location: d888b93eca7cff45c2c084b7ecea2eec70b6e490 - camera_avfoundation: 04b44aeb14070126c6529e5ab82cc7c9fca107cf - device_info_plus: 21fcca2080fbcd348be798aa36c3e5ed849eefbe - Firebase: cf1b19f21410b029b6786a54e9764a0cacad3c99 - firebase_auth: dee97e7428ef7c304083839d4e3bc4313c03afd5 - firebase_core: 726c34112998e66d1ddaf4b1bef78ed2dd4b9804 - firebase_messaging: a538130cb2bca3ea0ff0892b8c948bd7d20ecaed - FirebaseAnalytics: 3feef9ae8733c567866342a1000691baaa7cad49 - FirebaseAppCheckInterop: 347aa09a805219a31249b58fc956888e9fcb314b - FirebaseAuth: c359af98bd703cbf4293eec107a40de08ede6ce6 - FirebaseAuthInterop: a919d415797d23b7bfe195a04f322b86c65020ef - FirebaseCore: e0510f1523bc0eb21653cac00792e1e2bd6f1771 - FirebaseCoreExtension: f1bc67a4702931a7caa097d8e4ac0a1b0d16720e - FirebaseCoreInternal: d98ab91e2d80a56d7b246856a8885443b302c0c2 - FirebaseInstallations: 6ef4a1c7eb2a61ee1f74727d7f6ce2e72acf1414 - FirebaseMessaging: f8a160d99c2c2e5babbbcc90c4a3e15db036aee2 - Flutter: e0871f40cf51350855a761d2e70bf5af5b9b5de7 - flutter_app_group_directory: 55b5362007d1c0cb45dc1dd1e94f67d615f45a6b - flutter_contacts: 5383945387e7ca37cf963d4be57c21f2fc15ca9f - flutter_image_compress_common: 1697a328fd72bfb335507c6bca1a65fa5ad87df1 - flutter_inappwebview_ios: b89ba3482b96fb25e00c967aae065701b66e9b99 - flutter_local_notifications: 395056b3175ba4f08480a7c5de30cd36d69827e4 - flutter_secure_storage: 1ed9476fba7e7a782b22888f956cce43e2c62f13 - flutter_tts: b88dbc8655d3dc961bc4a796e4e16a4cc1795833 - geolocator_apple: 1560c3c875af2a412242c7a923e15d0d401966ff - Google-Maps-iOS-Utils: 66d6de12be1ce6d3742a54661e7a79cb317a9321 - google_maps_flutter_ios: 0291eb2aa252298a769b04d075e4a9d747ff7264 - google_sign_in_ios: 0ab078e60da6dfe23cbc55c83502b52bba1aad63 - GoogleAppMeasurement: 987769c4ca6b968f2479fbcc9fe3ce34af454b8e - GoogleDataTransport: aae35b7ea0c09004c3797d53c8c41f66f219d6a7 - GoogleMaps: 8939898920281c649150e0af74aa291c60f2e77d - GoogleSignIn: d4281ab6cf21542b1cfaff85c191f230b399d2db - GoogleUtilities: 26a3abef001b6533cf678d3eb38fd3f614b7872d - GTMAppAuth: f69bd07d68cd3b766125f7e072c45d7340dea0de - GTMSessionFetcher: 5aea5ba6bd522a239e236100971f10cb71b96ab6 - image_cropper: 5f162dcf988100dc1513f9c6b7eb42cd6fbf9156 - image_picker_ios: 7fe1ff8e34c1790d6fff70a32484959f563a928a - IOSSecuritySuite: b51056d5411aee567153ca86ce7f6edfdc5d2654 - jailbreak_root_detection: 9201e1dfd51dc23069cbfb8d4f4a2d18305170bf - just_audio: 6c031bb61297cf218b4462be616638e81c058e97 - libwebp: 1786c9f4ff8a279e4dac1e8f385004d5fc253009 - live_activities: f2e133059358f99655c8d181d65ff54f024a6e93 - local_auth_darwin: 553ce4f9b16d3fdfeafce9cf042e7c9f77c1c391 - location: 155caecf9da4f280ab5fe4a55f94ceccfab838f8 - Mantle: c5aa8794a29a022dfbbfc9799af95f477a69b62d - nanopb: fad817b59e0457d11a5dfbde799381cd727c1275 - OrderedSet: e539b66b644ff081c73a262d24ad552a69be3a94 - package_info_plus: af8e2ca6888548050f16fa2f1938db7b5a5df499 - path_provider_foundation: 080d55be775b7414fd5a5ef3ac137b97b097e564 - permission_handler_apple: 4ed2196e43d0651e8ff7ca3483a069d469701f2d - PromisesObjC: f5707f49cb48b9636751c5b2e7d227e43fba9f47 - quick_actions_ios: 4b07fb49d8d8f3518d7565fbb7a91014067a7d82 - RecaptchaInterop: 7d1a4a01a6b2cb1610a47ef3f85f0c411434cb21 - record_darwin: fb1f375f1d9603714f55b8708a903bbb91ffdb0a - SDWebImage: 73c6079366fea25fa4bb9640d5fb58f0893facd8 - SDWebImageWebPCoder: e38c0a70396191361d60c092933e22c20d5b1380 - share: a34936589f3090d59481bcdc5c30cc9dd47c75f6 - sign_in_with_apple: c5dcc141574c8c54d5ac99dd2163c0c72ad22418 - sqflite_darwin: 20b2a3a3b70e43edae938624ce550a3cbf66a3d0 - Stripe: 9757efc154de1d9615cbea4836d590bc4034d3a4 - stripe_ios: ac48e0488f95ac7ddea9475fd30f3d739e0bae52 - StripeApplePay: ca33933601302742623762157d587b79b942d073 - StripeCore: 2af250a2366ff2bbf64d4243c5f9bbf2a98b2aaf - StripeFinancialConnections: 3ab1ef6182ec44e71c29e9a2100b663f9713ac20 - StripePayments: 658a16bd34d20c8185aa281866227b9e1743300e - StripePaymentSheet: eac031f76d7fbb4f52df9b9c39be5be671ca4c07 - StripePaymentsUI: 7d7cffb2ecfc0d6b5ac3a4488c02893a5ff6cc77 - StripeUICore: bb102d453b1e1a10a37f810bc0a9aa0675fb17fd - TOCropViewController: 80b8985ad794298fb69d3341de183f33d1853654 - url_launcher_ios: 694010445543906933d732453a59da0a173ae33d - vibration: 8e2f50fc35bb736f9eecb7dd9f7047fbb6a6e888 - video_player_avfoundation: 2cef49524dd1f16c5300b9cd6efd9611ce03639b - wakelock_plus: 04623e3f525556020ebd4034310f20fe7fda8b49 - webview_flutter_wkwebview: 44d4dee7d7056d5ad185d25b38404436d56c547c - -PODFILE CHECKSUM: 07f180bff2523e15e01e42c30418373e5627c8fd - -COCOAPODS: 1.16.2 diff --git a/apps/driver-archive-cubit/ios/Runner.xcodeproj/project.pbxproj b/apps/driver-archive-cubit/ios/Runner.xcodeproj/project.pbxproj deleted file mode 100755 index 7d79090..0000000 --- a/apps/driver-archive-cubit/ios/Runner.xcodeproj/project.pbxproj +++ /dev/null @@ -1,832 +0,0 @@ -// !$*UTF8*$! -{ - archiveVersion = 1; - classes = { - }; - objectVersion = 54; - objects = { - -/* Begin PBXBuildFile section */ - 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */ = {isa = PBXBuildFile; fileRef = 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */; }; - 331C808B294A63AB00263BE5 /* RunnerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 331C807B294A618700263BE5 /* RunnerTests.swift */; }; - 38BFC4984B1B26A880FE76DE /* Pods_RunnerTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 2AC5295B6ADEC13901A4281A /* Pods_RunnerTests.framework */; }; - 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */ = {isa = PBXBuildFile; fileRef = 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */; }; - 3CEA26D0738D4C4B62323122 /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = A1987A597103D3E58DD06571 /* Pods_Runner.framework */; }; - 74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 74858FAE1ED2DC5600515810 /* AppDelegate.swift */; }; - 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FA1CF9000F007C117D /* Main.storyboard */; }; - 97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FD1CF9000F007C117D /* Assets.xcassets */; }; - 97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */; }; - C604FDB02D6C8D6A00CF8873 /* Constants.swift in Sources */ = {isa = PBXBuildFile; fileRef = C604FDAF2D6C8D6000CF8873 /* Constants.swift */; }; - C604FDB22D6C953400CF8873 /* JailbreakDetection.swift in Sources */ = {isa = PBXBuildFile; fileRef = C604FDB12D6C953100CF8873 /* JailbreakDetection.swift */; }; - C604FDB52D6C96D000CF8873 /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = C604FDB32D6C96D000CF8873 /* Localizable.strings */; }; - C624C4642BD56D34002834AF /* tone1.mp3 in Resources */ = {isa = PBXBuildFile; fileRef = C624C45C2BD56D34002834AF /* tone1.mp3 */; }; - C624C4652BD56D34002834AF /* start.wav in Resources */ = {isa = PBXBuildFile; fileRef = C624C45D2BD56D34002834AF /* start.wav */; }; - C624C4672BD56D34002834AF /* promo.wav in Resources */ = {isa = PBXBuildFile; fileRef = C624C45F2BD56D34002834AF /* promo.wav */; }; - C624C4682BD56D34002834AF /* cancel.wav in Resources */ = {isa = PBXBuildFile; fileRef = C624C4602BD56D34002834AF /* cancel.wav */; }; - C624C4692BD56D34002834AF /* iphone_ringtone.wav in Resources */ = {isa = PBXBuildFile; fileRef = C624C4612BD56D34002834AF /* iphone_ringtone.wav */; }; - C624C46A2BD56D34002834AF /* order1.wav in Resources */ = {isa = PBXBuildFile; fileRef = C624C4622BD56D34002834AF /* order1.wav */; }; - C628BC3F2C31427000E4D33B /* ding.wav in Resources */ = {isa = PBXBuildFile; fileRef = C628BC3E2C31427000E4D33B /* ding.wav */; }; - C638D7C62D884B7A009B4DF9 /* SecurityChecks.m in Sources */ = {isa = PBXBuildFile; fileRef = C638D7C52D884B7A009B4DF9 /* SecurityChecks.m */; }; - C638D7C82D884BE3009B4DF9 /* Config.plist in Resources */ = {isa = PBXBuildFile; fileRef = C638D7C72D884BE2009B4DF9 /* Config.plist */; }; - C690B4752A80554500E1D66E /* GoogleService-Info.plist in Resources */ = {isa = PBXBuildFile; fileRef = C690B4742A80554500E1D66E /* GoogleService-Info.plist */; }; - C6B15AA12B5FB24600746405 /* order.wav in Resources */ = {isa = PBXBuildFile; fileRef = C6B15A9F2B5FB24600746405 /* order.wav */; }; - C6B15AA22B5FB24600746405 /* tone2.wav in Resources */ = {isa = PBXBuildFile; fileRef = C6B15AA02B5FB24600746405 /* tone2.wav */; }; -/* End PBXBuildFile section */ - -/* Begin PBXContainerItemProxy section */ - 331C8085294A63A400263BE5 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 97C146E61CF9000F007C117D /* Project object */; - proxyType = 1; - remoteGlobalIDString = 97C146ED1CF9000F007C117D; - remoteInfo = Runner; - }; -/* End PBXContainerItemProxy section */ - -/* Begin PBXCopyFilesBuildPhase section */ - 9705A1C41CF9048500538489 /* Embed Frameworks */ = { - isa = PBXCopyFilesBuildPhase; - buildActionMask = 2147483647; - dstPath = ""; - dstSubfolderSpec = 10; - files = ( - ); - name = "Embed Frameworks"; - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXCopyFilesBuildPhase section */ - -/* Begin PBXFileReference section */ - 0116059C9A3684AC66E6EA10 /* Pods-RunnerTests.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.profile.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.profile.xcconfig"; sourceTree = ""; }; - 0A588BA0B74F002C38F0E4F0 /* Pods-RunnerTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.debug.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.debug.xcconfig"; sourceTree = ""; }; - 1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GeneratedPluginRegistrant.h; sourceTree = ""; }; - 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GeneratedPluginRegistrant.m; sourceTree = ""; }; - 169535ADE82517D8C1F876D0 /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = ""; }; - 20CE5C1BB6B23CE4706F0F53 /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = ""; }; - 2AC5295B6ADEC13901A4281A /* Pods_RunnerTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_RunnerTests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - 331C807B294A618700263BE5 /* RunnerTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RunnerTests.swift; sourceTree = ""; }; - 331C8081294A63A400263BE5 /* RunnerTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = RunnerTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; - 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = AppFrameworkInfo.plist; path = Flutter/AppFrameworkInfo.plist; sourceTree = ""; }; - 74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Runner-Bridging-Header.h"; sourceTree = ""; }; - 74858FAE1ED2DC5600515810 /* AppDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; - 7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = Release.xcconfig; path = Flutter/Release.xcconfig; sourceTree = ""; }; - 9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Debug.xcconfig; path = Flutter/Debug.xcconfig; sourceTree = ""; }; - 9740EEB31CF90195004384FC /* Generated.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Generated.xcconfig; path = Flutter/Generated.xcconfig; sourceTree = ""; }; - 97C146EE1CF9000F007C117D /* Runner.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Runner.app; sourceTree = BUILT_PRODUCTS_DIR; }; - 97C146FB1CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; - 97C146FD1CF9000F007C117D /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; - 97C147001CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; - 97C147021CF9000F007C117D /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - A1987A597103D3E58DD06571 /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - C604FDAF2D6C8D6000CF8873 /* Constants.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Constants.swift; sourceTree = ""; }; - C604FDB12D6C953100CF8873 /* JailbreakDetection.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = JailbreakDetection.swift; sourceTree = ""; }; - C604FDB42D6C96D000CF8873 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/Localizable.strings; sourceTree = ""; }; - C624C45C2BD56D34002834AF /* tone1.mp3 */ = {isa = PBXFileReference; lastKnownFileType = audio.mp3; name = tone1.mp3; path = ../../android/app/src/main/res/raw/tone1.mp3; sourceTree = ""; }; - C624C45D2BD56D34002834AF /* start.wav */ = {isa = PBXFileReference; lastKnownFileType = audio.wav; name = start.wav; path = ../../android/app/src/main/res/raw/start.wav; sourceTree = ""; }; - C624C45F2BD56D34002834AF /* promo.wav */ = {isa = PBXFileReference; lastKnownFileType = audio.wav; name = promo.wav; path = ../../android/app/src/main/res/raw/promo.wav; sourceTree = ""; }; - C624C4602BD56D34002834AF /* cancel.wav */ = {isa = PBXFileReference; lastKnownFileType = audio.wav; name = cancel.wav; path = ../../android/app/src/main/res/raw/cancel.wav; sourceTree = ""; }; - C624C4612BD56D34002834AF /* iphone_ringtone.wav */ = {isa = PBXFileReference; lastKnownFileType = audio.wav; name = iphone_ringtone.wav; path = ../../android/app/src/main/res/raw/iphone_ringtone.wav; sourceTree = ""; }; - C624C4622BD56D34002834AF /* order1.wav */ = {isa = PBXFileReference; lastKnownFileType = audio.wav; name = order1.wav; path = ../../android/app/src/main/res/raw/order1.wav; sourceTree = ""; }; - C628BC3E2C31427000E4D33B /* ding.wav */ = {isa = PBXFileReference; lastKnownFileType = audio.wav; name = ding.wav; path = ../../android/app/src/main/res/raw/ding.wav; sourceTree = ""; }; - C638D7C42D884B54009B4DF9 /* SecurityChecks.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = SecurityChecks.h; sourceTree = ""; }; - C638D7C52D884B7A009B4DF9 /* SecurityChecks.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = SecurityChecks.m; sourceTree = ""; }; - C638D7C72D884BE2009B4DF9 /* Config.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Config.plist; sourceTree = ""; }; - C690B4742A80554500E1D66E /* GoogleService-Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = "GoogleService-Info.plist"; sourceTree = ""; }; - C69588332A8C1F6B00C3AC67 /* Runner.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = Runner.entitlements; sourceTree = ""; }; - C6B15A9F2B5FB24600746405 /* order.wav */ = {isa = PBXFileReference; lastKnownFileType = audio.wav; path = order.wav; sourceTree = ""; }; - C6B15AA02B5FB24600746405 /* tone2.wav */ = {isa = PBXFileReference; lastKnownFileType = audio.wav; path = tone2.wav; sourceTree = ""; }; - F13EEC8BD3BD109D175EA06D /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = ""; }; - F8C2B267C197A536F06ED67A /* Pods-RunnerTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.release.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.release.xcconfig"; sourceTree = ""; }; -/* End PBXFileReference section */ - -/* Begin PBXFrameworksBuildPhase section */ - 7AD318F74F39A70FCC91E66D /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - 38BFC4984B1B26A880FE76DE /* Pods_RunnerTests.framework in Frameworks */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 97C146EB1CF9000F007C117D /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - 3CEA26D0738D4C4B62323122 /* Pods_Runner.framework in Frameworks */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXFrameworksBuildPhase section */ - -/* Begin PBXGroup section */ - 331C8082294A63A400263BE5 /* RunnerTests */ = { - isa = PBXGroup; - children = ( - 331C807B294A618700263BE5 /* RunnerTests.swift */, - ); - path = RunnerTests; - sourceTree = ""; - }; - 5684D45491D29A320AB8001A /* Pods */ = { - isa = PBXGroup; - children = ( - 169535ADE82517D8C1F876D0 /* Pods-Runner.debug.xcconfig */, - F13EEC8BD3BD109D175EA06D /* Pods-Runner.release.xcconfig */, - 20CE5C1BB6B23CE4706F0F53 /* Pods-Runner.profile.xcconfig */, - 0A588BA0B74F002C38F0E4F0 /* Pods-RunnerTests.debug.xcconfig */, - F8C2B267C197A536F06ED67A /* Pods-RunnerTests.release.xcconfig */, - 0116059C9A3684AC66E6EA10 /* Pods-RunnerTests.profile.xcconfig */, - ); - path = Pods; - sourceTree = ""; - }; - 9740EEB11CF90186004384FC /* Flutter */ = { - isa = PBXGroup; - children = ( - 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */, - 9740EEB21CF90195004384FC /* Debug.xcconfig */, - 7AFA3C8E1D35360C0083082E /* Release.xcconfig */, - 9740EEB31CF90195004384FC /* Generated.xcconfig */, - ); - name = Flutter; - sourceTree = ""; - }; - 97C146E51CF9000F007C117D = { - isa = PBXGroup; - children = ( - 9740EEB11CF90186004384FC /* Flutter */, - 97C146F01CF9000F007C117D /* Runner */, - 97C146EF1CF9000F007C117D /* Products */, - 331C8082294A63A400263BE5 /* RunnerTests */, - 5684D45491D29A320AB8001A /* Pods */, - A3767309D6B5681282917CC7 /* Frameworks */, - ); - sourceTree = ""; - }; - 97C146EF1CF9000F007C117D /* Products */ = { - isa = PBXGroup; - children = ( - 97C146EE1CF9000F007C117D /* Runner.app */, - 331C8081294A63A400263BE5 /* RunnerTests.xctest */, - ); - name = Products; - sourceTree = ""; - }; - 97C146F01CF9000F007C117D /* Runner */ = { - isa = PBXGroup; - children = ( - C69588332A8C1F6B00C3AC67 /* Runner.entitlements */, - C638D7C52D884B7A009B4DF9 /* SecurityChecks.m */, - C6B15A9F2B5FB24600746405 /* order.wav */, - C6B15AA02B5FB24600746405 /* tone2.wav */, - C624C4602BD56D34002834AF /* cancel.wav */, - C624C4612BD56D34002834AF /* iphone_ringtone.wav */, - C628BC3E2C31427000E4D33B /* ding.wav */, - C624C4622BD56D34002834AF /* order1.wav */, - C624C45F2BD56D34002834AF /* promo.wav */, - C624C45D2BD56D34002834AF /* start.wav */, - C624C45C2BD56D34002834AF /* tone1.mp3 */, - 97C146FA1CF9000F007C117D /* Main.storyboard */, - 97C146FD1CF9000F007C117D /* Assets.xcassets */, - 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */, - 97C147021CF9000F007C117D /* Info.plist */, - C690B4742A80554500E1D66E /* GoogleService-Info.plist */, - 1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */, - 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */, - 74858FAE1ED2DC5600515810 /* AppDelegate.swift */, - C604FDB12D6C953100CF8873 /* JailbreakDetection.swift */, - C604FDB32D6C96D000CF8873 /* Localizable.strings */, - C604FDAF2D6C8D6000CF8873 /* Constants.swift */, - 74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */, - C638D7C42D884B54009B4DF9 /* SecurityChecks.h */, - C638D7C72D884BE2009B4DF9 /* Config.plist */, - ); - path = Runner; - sourceTree = ""; - }; - A3767309D6B5681282917CC7 /* Frameworks */ = { - isa = PBXGroup; - children = ( - A1987A597103D3E58DD06571 /* Pods_Runner.framework */, - 2AC5295B6ADEC13901A4281A /* Pods_RunnerTests.framework */, - ); - name = Frameworks; - sourceTree = ""; - }; -/* End PBXGroup section */ - -/* Begin PBXNativeTarget section */ - 331C8080294A63A400263BE5 /* RunnerTests */ = { - isa = PBXNativeTarget; - buildConfigurationList = 331C8087294A63A400263BE5 /* Build configuration list for PBXNativeTarget "RunnerTests" */; - buildPhases = ( - 6A195BB0776CA9E53EAA143A /* [CP] Check Pods Manifest.lock */, - 331C807D294A63A400263BE5 /* Sources */, - 331C807F294A63A400263BE5 /* Resources */, - 7AD318F74F39A70FCC91E66D /* Frameworks */, - ); - buildRules = ( - ); - dependencies = ( - 331C8086294A63A400263BE5 /* PBXTargetDependency */, - ); - name = RunnerTests; - productName = RunnerTests; - productReference = 331C8081294A63A400263BE5 /* RunnerTests.xctest */; - productType = "com.apple.product-type.bundle.unit-test"; - }; - 97C146ED1CF9000F007C117D /* Runner */ = { - isa = PBXNativeTarget; - buildConfigurationList = 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */; - buildPhases = ( - 495F1A7DF9442FE345F87EDB /* [CP] Check Pods Manifest.lock */, - 9740EEB61CF901F6004384FC /* Run Script */, - 97C146EA1CF9000F007C117D /* Sources */, - 97C146EB1CF9000F007C117D /* Frameworks */, - 97C146EC1CF9000F007C117D /* Resources */, - 9705A1C41CF9048500538489 /* Embed Frameworks */, - 3B06AD1E1E4923F5004D2608 /* Thin Binary */, - 87F758C3C5B8AE624C4BE481 /* [CP] Embed Pods Frameworks */, - 99A28AAD8EACCE6238494873 /* [CP] Copy Pods Resources */, - ); - buildRules = ( - ); - dependencies = ( - ); - name = Runner; - productName = Runner; - productReference = 97C146EE1CF9000F007C117D /* Runner.app */; - productType = "com.apple.product-type.application"; - }; -/* End PBXNativeTarget section */ - -/* Begin PBXProject section */ - 97C146E61CF9000F007C117D /* Project object */ = { - isa = PBXProject; - attributes = { - BuildIndependentTargetsInParallel = YES; - LastUpgradeCheck = 1510; - ORGANIZATIONNAME = ""; - TargetAttributes = { - 331C8080294A63A400263BE5 = { - CreatedOnToolsVersion = 14.0; - TestTargetID = 97C146ED1CF9000F007C117D; - }; - 97C146ED1CF9000F007C117D = { - CreatedOnToolsVersion = 7.3.1; - LastSwiftMigration = 1100; - }; - }; - }; - buildConfigurationList = 97C146E91CF9000F007C117D /* Build configuration list for PBXProject "Runner" */; - compatibilityVersion = "Xcode 9.3"; - developmentRegion = en; - hasScannedForEncodings = 0; - knownRegions = ( - en, - Base, - ); - mainGroup = 97C146E51CF9000F007C117D; - productRefGroup = 97C146EF1CF9000F007C117D /* Products */; - projectDirPath = ""; - projectRoot = ""; - targets = ( - 97C146ED1CF9000F007C117D /* Runner */, - 331C8080294A63A400263BE5 /* RunnerTests */, - ); - }; -/* End PBXProject section */ - -/* Begin PBXResourcesBuildPhase section */ - 331C807F294A63A400263BE5 /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 97C146EC1CF9000F007C117D /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - C6B15AA22B5FB24600746405 /* tone2.wav in Resources */, - C624C4652BD56D34002834AF /* start.wav in Resources */, - C624C4672BD56D34002834AF /* promo.wav in Resources */, - C624C46A2BD56D34002834AF /* order1.wav in Resources */, - 97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */, - C624C4682BD56D34002834AF /* cancel.wav in Resources */, - C6B15AA12B5FB24600746405 /* order.wav in Resources */, - 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */, - C628BC3F2C31427000E4D33B /* ding.wav in Resources */, - C690B4752A80554500E1D66E /* GoogleService-Info.plist in Resources */, - C604FDB52D6C96D000CF8873 /* Localizable.strings in Resources */, - 97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */, - C638D7C82D884BE3009B4DF9 /* Config.plist in Resources */, - C624C4692BD56D34002834AF /* iphone_ringtone.wav in Resources */, - C624C4642BD56D34002834AF /* tone1.mp3 in Resources */, - 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXResourcesBuildPhase section */ - -/* Begin PBXShellScriptBuildPhase section */ - 3B06AD1E1E4923F5004D2608 /* Thin Binary */ = { - isa = PBXShellScriptBuildPhase; - alwaysOutOfDate = 1; - buildActionMask = 2147483647; - files = ( - ); - inputPaths = ( - "${TARGET_BUILD_DIR}/${INFOPLIST_PATH}", - ); - name = "Thin Binary"; - outputPaths = ( - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" embed_and_thin"; - }; - 495F1A7DF9442FE345F87EDB /* [CP] Check Pods Manifest.lock */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputFileListPaths = ( - ); - inputPaths = ( - "${PODS_PODFILE_DIR_PATH}/Podfile.lock", - "${PODS_ROOT}/Manifest.lock", - ); - name = "[CP] Check Pods Manifest.lock"; - outputFileListPaths = ( - ); - outputPaths = ( - "$(DERIVED_FILE_DIR)/Pods-Runner-checkManifestLockResult.txt", - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; - showEnvVarsInLog = 0; - }; - 6A195BB0776CA9E53EAA143A /* [CP] Check Pods Manifest.lock */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputFileListPaths = ( - ); - inputPaths = ( - "${PODS_PODFILE_DIR_PATH}/Podfile.lock", - "${PODS_ROOT}/Manifest.lock", - ); - name = "[CP] Check Pods Manifest.lock"; - outputFileListPaths = ( - ); - outputPaths = ( - "$(DERIVED_FILE_DIR)/Pods-RunnerTests-checkManifestLockResult.txt", - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; - showEnvVarsInLog = 0; - }; - 87F758C3C5B8AE624C4BE481 /* [CP] Embed Pods Frameworks */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputFileListPaths = ( - "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-input-files.xcfilelist", - ); - name = "[CP] Embed Pods Frameworks"; - outputFileListPaths = ( - "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-output-files.xcfilelist", - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n"; - showEnvVarsInLog = 0; - }; - 9740EEB61CF901F6004384FC /* Run Script */ = { - isa = PBXShellScriptBuildPhase; - alwaysOutOfDate = 1; - buildActionMask = 2147483647; - files = ( - ); - inputPaths = ( - ); - name = "Run Script"; - outputPaths = ( - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" build"; - }; - 99A28AAD8EACCE6238494873 /* [CP] Copy Pods Resources */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputFileListPaths = ( - "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-resources-${CONFIGURATION}-input-files.xcfilelist", - ); - name = "[CP] Copy Pods Resources"; - outputFileListPaths = ( - "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-resources-${CONFIGURATION}-output-files.xcfilelist", - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-resources.sh\"\n"; - showEnvVarsInLog = 0; - }; -/* End PBXShellScriptBuildPhase section */ - -/* Begin PBXSourcesBuildPhase section */ - 331C807D294A63A400263BE5 /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 331C808B294A63AB00263BE5 /* RunnerTests.swift in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 97C146EA1CF9000F007C117D /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */, - C638D7C62D884B7A009B4DF9 /* SecurityChecks.m in Sources */, - 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */, - C604FDB02D6C8D6A00CF8873 /* Constants.swift in Sources */, - C604FDB22D6C953400CF8873 /* JailbreakDetection.swift in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXSourcesBuildPhase section */ - -/* Begin PBXTargetDependency section */ - 331C8086294A63A400263BE5 /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - target = 97C146ED1CF9000F007C117D /* Runner */; - targetProxy = 331C8085294A63A400263BE5 /* PBXContainerItemProxy */; - }; -/* End PBXTargetDependency section */ - -/* Begin PBXVariantGroup section */ - 97C146FA1CF9000F007C117D /* Main.storyboard */ = { - isa = PBXVariantGroup; - children = ( - 97C146FB1CF9000F007C117D /* Base */, - ); - name = Main.storyboard; - sourceTree = ""; - }; - 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */ = { - isa = PBXVariantGroup; - children = ( - 97C147001CF9000F007C117D /* Base */, - ); - name = LaunchScreen.storyboard; - sourceTree = ""; - }; - C604FDB32D6C96D000CF8873 /* Localizable.strings */ = { - isa = PBXVariantGroup; - children = ( - C604FDB42D6C96D000CF8873 /* en */, - ); - name = Localizable.strings; - sourceTree = ""; - }; -/* End PBXVariantGroup section */ - -/* Begin XCBuildConfiguration section */ - 249021D3217E4FDB00AE95B9 /* Profile */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - CLANG_ANALYZER_NONNULL = YES; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; - CLANG_CXX_LIBRARY = "libc++"; - CLANG_ENABLE_MODULES = YES; - CLANG_ENABLE_OBJC_ARC = YES; - CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_COMMA = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; - CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INFINITE_RECURSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; - CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; - CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; - CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; - CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; - 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 = 12.0; - MTL_ENABLE_DEBUG_INFO = NO; - SDKROOT = iphoneos; - SUPPORTED_PLATFORMS = iphoneos; - TARGETED_DEVICE_FAMILY = "1,2"; - VALIDATE_PRODUCT = YES; - }; - name = Profile; - }; - 249021D4217E4FDB00AE95B9 /* Profile */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; - buildSettings = { - ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; - CLANG_ENABLE_MODULES = YES; - CODE_SIGN_ENTITLEMENTS = Runner/Runner.entitlements; - CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; - DEVELOPMENT_TEAM = 63CVT8G5P8; - ENABLE_BITCODE = NO; - INFOPLIST_FILE = Runner/Info.plist; - INFOPLIST_KEY_CFBundleDisplayName = "Sefer Driver"; - INFOPLIST_KEY_LSApplicationCategoryType = "public.app-category.travel"; - LD_RUNPATH_SEARCH_PATHS = ( - "$(inherited)", - "@executable_path/Frameworks", - ); - PRODUCT_BUNDLE_IDENTIFIER = com.sefer.driver; - PRODUCT_NAME = "$(TARGET_NAME)"; - SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; - SWIFT_VERSION = 5.0; - VERSIONING_SYSTEM = "apple-generic"; - }; - name = Profile; - }; - 331C8088294A63A400263BE5 /* Debug */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 0A588BA0B74F002C38F0E4F0 /* Pods-RunnerTests.debug.xcconfig */; - buildSettings = { - BUNDLE_LOADER = "$(TEST_HOST)"; - CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 1; - DEVELOPMENT_TEAM = 63CVT8G5P8; - GENERATE_INFOPLIST_FILE = YES; - MARKETING_VERSION = 1.0; - PRODUCT_BUNDLE_IDENTIFIER = com.mobileapp.store.ride; - 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; - }; - 331C8089294A63A400263BE5 /* Release */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = F8C2B267C197A536F06ED67A /* Pods-RunnerTests.release.xcconfig */; - buildSettings = { - BUNDLE_LOADER = "$(TEST_HOST)"; - CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 1; - DEVELOPMENT_TEAM = 63CVT8G5P8; - GENERATE_INFOPLIST_FILE = YES; - MARKETING_VERSION = 1.0; - PRODUCT_BUNDLE_IDENTIFIER = com.mobileapp.store.ride; - PRODUCT_NAME = "$(TARGET_NAME)"; - SWIFT_VERSION = 5.0; - TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Runner.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/Runner"; - }; - name = Release; - }; - 331C808A294A63A400263BE5 /* Profile */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 0116059C9A3684AC66E6EA10 /* Pods-RunnerTests.profile.xcconfig */; - buildSettings = { - BUNDLE_LOADER = "$(TEST_HOST)"; - CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 1; - DEVELOPMENT_TEAM = 63CVT8G5P8; - GENERATE_INFOPLIST_FILE = YES; - MARKETING_VERSION = 1.0; - PRODUCT_BUNDLE_IDENTIFIER = com.mobileapp.store.ride; - PRODUCT_NAME = "$(TARGET_NAME)"; - SWIFT_VERSION = 5.0; - TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Runner.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/Runner"; - }; - name = Profile; - }; - 97C147031CF9000F007C117D /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - CLANG_ANALYZER_NONNULL = YES; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; - CLANG_CXX_LIBRARY = "libc++"; - CLANG_ENABLE_MODULES = YES; - CLANG_ENABLE_OBJC_ARC = YES; - CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_COMMA = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; - CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INFINITE_RECURSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; - CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; - CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; - CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; - CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; - 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 = 12.0; - MTL_ENABLE_DEBUG_INFO = YES; - ONLY_ACTIVE_ARCH = YES; - SDKROOT = iphoneos; - TARGETED_DEVICE_FAMILY = "1,2"; - }; - name = Debug; - }; - 97C147041CF9000F007C117D /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - CLANG_ANALYZER_NONNULL = YES; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; - CLANG_CXX_LIBRARY = "libc++"; - CLANG_ENABLE_MODULES = YES; - CLANG_ENABLE_OBJC_ARC = YES; - CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_COMMA = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; - CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INFINITE_RECURSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; - CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; - CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; - CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; - CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; - 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 = 12.0; - MTL_ENABLE_DEBUG_INFO = NO; - SDKROOT = iphoneos; - SUPPORTED_PLATFORMS = iphoneos; - SWIFT_COMPILATION_MODE = wholemodule; - SWIFT_OPTIMIZATION_LEVEL = "-O"; - TARGETED_DEVICE_FAMILY = "1,2"; - VALIDATE_PRODUCT = YES; - }; - name = Release; - }; - 97C147061CF9000F007C117D /* Debug */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 9740EEB21CF90195004384FC /* Debug.xcconfig */; - buildSettings = { - ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; - CLANG_ENABLE_MODULES = YES; - CODE_SIGN_ENTITLEMENTS = Runner/Runner.entitlements; - CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; - DEVELOPMENT_TEAM = 63CVT8G5P8; - ENABLE_BITCODE = NO; - INFOPLIST_FILE = Runner/Info.plist; - INFOPLIST_KEY_CFBundleDisplayName = "Sefer Driver"; - INFOPLIST_KEY_LSApplicationCategoryType = "public.app-category.travel"; - LD_RUNPATH_SEARCH_PATHS = ( - "$(inherited)", - "@executable_path/Frameworks", - ); - PRODUCT_BUNDLE_IDENTIFIER = com.sefer.driver; - PRODUCT_NAME = "$(TARGET_NAME)"; - SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; - SWIFT_OPTIMIZATION_LEVEL = "-Onone"; - SWIFT_VERSION = 5.0; - VERSIONING_SYSTEM = "apple-generic"; - }; - name = Debug; - }; - 97C147071CF9000F007C117D /* Release */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; - buildSettings = { - ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; - CLANG_ENABLE_MODULES = YES; - CODE_SIGN_ENTITLEMENTS = Runner/Runner.entitlements; - CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; - DEVELOPMENT_TEAM = 63CVT8G5P8; - ENABLE_BITCODE = NO; - INFOPLIST_FILE = Runner/Info.plist; - INFOPLIST_KEY_CFBundleDisplayName = "Sefer Driver"; - INFOPLIST_KEY_LSApplicationCategoryType = "public.app-category.travel"; - LD_RUNPATH_SEARCH_PATHS = ( - "$(inherited)", - "@executable_path/Frameworks", - ); - PRODUCT_BUNDLE_IDENTIFIER = com.sefer.driver; - PRODUCT_NAME = "$(TARGET_NAME)"; - SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; - SWIFT_VERSION = 5.0; - VERSIONING_SYSTEM = "apple-generic"; - }; - name = Release; - }; -/* End XCBuildConfiguration section */ - -/* Begin XCConfigurationList section */ - 331C8087294A63A400263BE5 /* Build configuration list for PBXNativeTarget "RunnerTests" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 331C8088294A63A400263BE5 /* Debug */, - 331C8089294A63A400263BE5 /* Release */, - 331C808A294A63A400263BE5 /* Profile */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - 97C146E91CF9000F007C117D /* Build configuration list for PBXProject "Runner" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 97C147031CF9000F007C117D /* Debug */, - 97C147041CF9000F007C117D /* Release */, - 249021D3217E4FDB00AE95B9 /* Profile */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 97C147061CF9000F007C117D /* Debug */, - 97C147071CF9000F007C117D /* Release */, - 249021D4217E4FDB00AE95B9 /* Profile */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; -/* End XCConfigurationList section */ - }; - rootObject = 97C146E61CF9000F007C117D /* Project object */; -} diff --git a/apps/driver-archive-cubit/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/apps/driver-archive-cubit/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata deleted file mode 100755 index 919434a..0000000 --- a/apps/driver-archive-cubit/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata +++ /dev/null @@ -1,7 +0,0 @@ - - - - - diff --git a/apps/driver-archive-cubit/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/apps/driver-archive-cubit/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist deleted file mode 100755 index 18d9810..0000000 --- a/apps/driver-archive-cubit/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist +++ /dev/null @@ -1,8 +0,0 @@ - - - - - IDEDidComputeMac32BitWarning - - - diff --git a/apps/driver-archive-cubit/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings b/apps/driver-archive-cubit/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings deleted file mode 100755 index f9b0d7c..0000000 --- a/apps/driver-archive-cubit/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings +++ /dev/null @@ -1,8 +0,0 @@ - - - - - PreviewsEnabled - - - diff --git a/apps/driver-archive-cubit/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/apps/driver-archive-cubit/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme deleted file mode 100755 index e3773d4..0000000 --- a/apps/driver-archive-cubit/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +++ /dev/null @@ -1,101 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/apps/driver-archive-cubit/ios/Runner.xcworkspace/contents.xcworkspacedata b/apps/driver-archive-cubit/ios/Runner.xcworkspace/contents.xcworkspacedata deleted file mode 100755 index 21a3cc1..0000000 --- a/apps/driver-archive-cubit/ios/Runner.xcworkspace/contents.xcworkspacedata +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - - diff --git a/apps/driver-archive-cubit/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/apps/driver-archive-cubit/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist deleted file mode 100755 index 18d9810..0000000 --- a/apps/driver-archive-cubit/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist +++ /dev/null @@ -1,8 +0,0 @@ - - - - - IDEDidComputeMac32BitWarning - - - diff --git a/apps/driver-archive-cubit/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings b/apps/driver-archive-cubit/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings deleted file mode 100755 index f9b0d7c..0000000 --- a/apps/driver-archive-cubit/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings +++ /dev/null @@ -1,8 +0,0 @@ - - - - - PreviewsEnabled - - - diff --git a/apps/driver-archive-cubit/ios/Runner/AppDelegate.swift b/apps/driver-archive-cubit/ios/Runner/AppDelegate.swift deleted file mode 100755 index 326c490..0000000 --- a/apps/driver-archive-cubit/ios/Runner/AppDelegate.swift +++ /dev/null @@ -1,149 +0,0 @@ -import UIKit -import Flutter -import FirebaseCore -import CoreLocation - -@main -@objc class AppDelegate: FlutterAppDelegate { - - let locationManager = CLLocationManager() - - override func application( - _ application: UIApplication, - didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]? - ) -> Bool { - - // تهيئة Firebase - FirebaseApp.configure() - GeneratedPluginRegistrant.register(with: self) - - // التأكد من أن الجهاز غير مخترق قبل تشغيل التطبيق - if SecurityChecks.isDeviceCompromised() { - showSecurityAlert() - return false - } - - // تهيئة قنوات الاتصال مع Flutter - setupMethodChannel() - - // ضبط مدير الموقع لمتابعة تغييرات الأذونات - locationManager.delegate = self - locationManager.requestWhenInUseAuthorization() // طلب الأذونات فقط عند الحاجة - - return super.application(application, didFinishLaunchingWithOptions: launchOptions) - } - - // MARK: - تهيئة القناة بين Swift و Flutter - func setupMethodChannel() { - guard let controller = window?.rootViewController as? FlutterViewController else { - return - } - - let channel = FlutterMethodChannel(name: "com.sefer_driver/security", - binaryMessenger: controller.binaryMessenger) - channel.setMethodCallHandler { call, result in - switch call.method { - case "isNativeRooted": - result(SecurityChecks.isDeviceCompromised()) - default: - result(FlutterMethodNotImplemented) - } - } - } - - // MARK: - عرض تنبيه عند اكتشاف جهاز مخترق - func showSecurityAlert() { - guard let rootVC = UIApplication.shared.keyWindow?.rootViewController else { - exit(0) - } - - let alert = UIAlertController( - title: "Security Warning".localized, - message: "Compromised device detected. Exiting.".localized, - preferredStyle: .alert - ) - - alert.addAction(UIAlertAction(title: "OK".localized, style: .destructive) { _ in - self.obfuscatedExit() - }) - - if #available(iOS 15.0, *) { - alert.popoverPresentationController?.sourceView = rootVC.view - alert.popoverPresentationController?.sourceRect = CGRect(x: rootVC.view.bounds.midX, y: rootVC.view.bounds.midY, width: 0, height: 0) - alert.popoverPresentationController?.permittedArrowDirections = [] - alert.presentationController?.delegate = self - - if let presentationController = alert.presentationController as? UISheetPresentationController { - presentationController.detents = [.medium()] - presentationController.preferredCornerRadius = 20 - presentationController.prefersEdgeAttachedInCompactHeight = true - presentationController.prefersGrabberVisible = false - } - } - - rootVC.present(alert, animated: true, completion: nil) - } - - // MARK: - إخفاء عملية الخروج بطريقة مشفرة - func obfuscatedExit() { - let selector = NSSelectorFromString(String(format: "%@%@", "ex", "it:")) - if responds(to: selector) { - perform(selector, with: 0) - } - } - - // MARK: - تحميل مفاتيح API بطريقة آمنة - func loadConfig() -> [String: Any]? { - guard let path = Bundle.main.path(forResource: "Config", ofType: "plist"), - let config = NSDictionary(contentsOfFile: path) as? [String: Any] else { - return nil - } - return config - } -} - -// MARK: - التعامل مع أذونات الموقع بطريقة آمنة -extension AppDelegate: CLLocationManagerDelegate { - func locationManagerDidChangeAuthorization(_ manager: CLLocationManager) { - if #available(iOS 14.0, *) { - let status = manager.authorizationStatus - switch status { - case .authorizedWhenInUse, .authorizedAlways: - print("Authorization granted") - case .denied, .restricted: - print("Authorization denied") - case .notDetermined: - manager.requestWhenInUseAuthorization() - @unknown default: - break - } - } else { - // لنظام iOS 13 وما قبله، نستخدم الطريقة القديمة - let status = CLLocationManager.authorizationStatus() - switch status { - case .authorizedWhenInUse, .authorizedAlways: - print("Authorization granted") - case .denied, .restricted: - print("Authorization denied") - case .notDetermined: - manager.requestWhenInUseAuthorization() - @unknown default: - break - } - } - } -} - -// MARK: - منع إغلاق التنبيهات الأمنية -extension AppDelegate: UIAdaptivePresentationControllerDelegate { - func presentationControllerShouldDismiss(_ presentationController: UIPresentationController) -> Bool { - return false - } -} - -// MARK: - دعم الترجمة للنصوص -extension String { - var localized: String { - return NSLocalizedString(self, tableName: nil, bundle: Bundle.main, value: "", comment: "") - } -} diff --git a/apps/driver-archive-cubit/ios/Runner/Assets.xcassets/AppIcon.appiconset/100.png b/apps/driver-archive-cubit/ios/Runner/Assets.xcassets/AppIcon.appiconset/100.png deleted file mode 100755 index b8b1256..0000000 Binary files a/apps/driver-archive-cubit/ios/Runner/Assets.xcassets/AppIcon.appiconset/100.png and /dev/null differ diff --git a/apps/driver-archive-cubit/ios/Runner/Assets.xcassets/AppIcon.appiconset/102.png b/apps/driver-archive-cubit/ios/Runner/Assets.xcassets/AppIcon.appiconset/102.png deleted file mode 100755 index c099ce0..0000000 Binary files a/apps/driver-archive-cubit/ios/Runner/Assets.xcassets/AppIcon.appiconset/102.png and /dev/null differ diff --git a/apps/driver-archive-cubit/ios/Runner/Assets.xcassets/AppIcon.appiconset/1024.png b/apps/driver-archive-cubit/ios/Runner/Assets.xcassets/AppIcon.appiconset/1024.png deleted file mode 100755 index 360d0c8..0000000 Binary files a/apps/driver-archive-cubit/ios/Runner/Assets.xcassets/AppIcon.appiconset/1024.png and /dev/null differ diff --git a/apps/driver-archive-cubit/ios/Runner/Assets.xcassets/AppIcon.appiconset/108.png b/apps/driver-archive-cubit/ios/Runner/Assets.xcassets/AppIcon.appiconset/108.png deleted file mode 100755 index 55d8e8f..0000000 Binary files a/apps/driver-archive-cubit/ios/Runner/Assets.xcassets/AppIcon.appiconset/108.png and /dev/null differ diff --git a/apps/driver-archive-cubit/ios/Runner/Assets.xcassets/AppIcon.appiconset/114.png b/apps/driver-archive-cubit/ios/Runner/Assets.xcassets/AppIcon.appiconset/114.png deleted file mode 100755 index bcecac5..0000000 Binary files a/apps/driver-archive-cubit/ios/Runner/Assets.xcassets/AppIcon.appiconset/114.png and /dev/null differ diff --git a/apps/driver-archive-cubit/ios/Runner/Assets.xcassets/AppIcon.appiconset/120.png b/apps/driver-archive-cubit/ios/Runner/Assets.xcassets/AppIcon.appiconset/120.png deleted file mode 100755 index 390799d..0000000 Binary files a/apps/driver-archive-cubit/ios/Runner/Assets.xcassets/AppIcon.appiconset/120.png and /dev/null differ diff --git a/apps/driver-archive-cubit/ios/Runner/Assets.xcassets/AppIcon.appiconset/128.png b/apps/driver-archive-cubit/ios/Runner/Assets.xcassets/AppIcon.appiconset/128.png deleted file mode 100755 index f8bf6c9..0000000 Binary files a/apps/driver-archive-cubit/ios/Runner/Assets.xcassets/AppIcon.appiconset/128.png and /dev/null differ diff --git a/apps/driver-archive-cubit/ios/Runner/Assets.xcassets/AppIcon.appiconset/144.png b/apps/driver-archive-cubit/ios/Runner/Assets.xcassets/AppIcon.appiconset/144.png deleted file mode 100755 index e272c49..0000000 Binary files a/apps/driver-archive-cubit/ios/Runner/Assets.xcassets/AppIcon.appiconset/144.png and /dev/null differ diff --git a/apps/driver-archive-cubit/ios/Runner/Assets.xcassets/AppIcon.appiconset/152.png b/apps/driver-archive-cubit/ios/Runner/Assets.xcassets/AppIcon.appiconset/152.png deleted file mode 100755 index 2747a44..0000000 Binary files a/apps/driver-archive-cubit/ios/Runner/Assets.xcassets/AppIcon.appiconset/152.png and /dev/null differ diff --git a/apps/driver-archive-cubit/ios/Runner/Assets.xcassets/AppIcon.appiconset/16.png b/apps/driver-archive-cubit/ios/Runner/Assets.xcassets/AppIcon.appiconset/16.png deleted file mode 100755 index fcb6d77..0000000 Binary files a/apps/driver-archive-cubit/ios/Runner/Assets.xcassets/AppIcon.appiconset/16.png and /dev/null differ diff --git a/apps/driver-archive-cubit/ios/Runner/Assets.xcassets/AppIcon.appiconset/167.png b/apps/driver-archive-cubit/ios/Runner/Assets.xcassets/AppIcon.appiconset/167.png deleted file mode 100755 index 337ca39..0000000 Binary files a/apps/driver-archive-cubit/ios/Runner/Assets.xcassets/AppIcon.appiconset/167.png and /dev/null differ diff --git a/apps/driver-archive-cubit/ios/Runner/Assets.xcassets/AppIcon.appiconset/172.png b/apps/driver-archive-cubit/ios/Runner/Assets.xcassets/AppIcon.appiconset/172.png deleted file mode 100755 index 9b26d07..0000000 Binary files a/apps/driver-archive-cubit/ios/Runner/Assets.xcassets/AppIcon.appiconset/172.png and /dev/null differ diff --git a/apps/driver-archive-cubit/ios/Runner/Assets.xcassets/AppIcon.appiconset/180.png b/apps/driver-archive-cubit/ios/Runner/Assets.xcassets/AppIcon.appiconset/180.png deleted file mode 100755 index c6b49f7..0000000 Binary files a/apps/driver-archive-cubit/ios/Runner/Assets.xcassets/AppIcon.appiconset/180.png and /dev/null differ diff --git a/apps/driver-archive-cubit/ios/Runner/Assets.xcassets/AppIcon.appiconset/196.png b/apps/driver-archive-cubit/ios/Runner/Assets.xcassets/AppIcon.appiconset/196.png deleted file mode 100755 index 1e32ea7..0000000 Binary files a/apps/driver-archive-cubit/ios/Runner/Assets.xcassets/AppIcon.appiconset/196.png and /dev/null differ diff --git a/apps/driver-archive-cubit/ios/Runner/Assets.xcassets/AppIcon.appiconset/20.png b/apps/driver-archive-cubit/ios/Runner/Assets.xcassets/AppIcon.appiconset/20.png deleted file mode 100755 index 88039b3..0000000 Binary files a/apps/driver-archive-cubit/ios/Runner/Assets.xcassets/AppIcon.appiconset/20.png and /dev/null differ diff --git a/apps/driver-archive-cubit/ios/Runner/Assets.xcassets/AppIcon.appiconset/216.png b/apps/driver-archive-cubit/ios/Runner/Assets.xcassets/AppIcon.appiconset/216.png deleted file mode 100755 index b5a67ca..0000000 Binary files a/apps/driver-archive-cubit/ios/Runner/Assets.xcassets/AppIcon.appiconset/216.png and /dev/null differ diff --git a/apps/driver-archive-cubit/ios/Runner/Assets.xcassets/AppIcon.appiconset/234.png b/apps/driver-archive-cubit/ios/Runner/Assets.xcassets/AppIcon.appiconset/234.png deleted file mode 100755 index 192635b..0000000 Binary files a/apps/driver-archive-cubit/ios/Runner/Assets.xcassets/AppIcon.appiconset/234.png and /dev/null differ diff --git a/apps/driver-archive-cubit/ios/Runner/Assets.xcassets/AppIcon.appiconset/256.png b/apps/driver-archive-cubit/ios/Runner/Assets.xcassets/AppIcon.appiconset/256.png deleted file mode 100755 index 830d356..0000000 Binary files a/apps/driver-archive-cubit/ios/Runner/Assets.xcassets/AppIcon.appiconset/256.png and /dev/null differ diff --git a/apps/driver-archive-cubit/ios/Runner/Assets.xcassets/AppIcon.appiconset/258.png b/apps/driver-archive-cubit/ios/Runner/Assets.xcassets/AppIcon.appiconset/258.png deleted file mode 100755 index e7adea6..0000000 Binary files a/apps/driver-archive-cubit/ios/Runner/Assets.xcassets/AppIcon.appiconset/258.png and /dev/null differ diff --git a/apps/driver-archive-cubit/ios/Runner/Assets.xcassets/AppIcon.appiconset/29.png b/apps/driver-archive-cubit/ios/Runner/Assets.xcassets/AppIcon.appiconset/29.png deleted file mode 100755 index 62dd2ae..0000000 Binary files a/apps/driver-archive-cubit/ios/Runner/Assets.xcassets/AppIcon.appiconset/29.png and /dev/null differ diff --git a/apps/driver-archive-cubit/ios/Runner/Assets.xcassets/AppIcon.appiconset/32.png b/apps/driver-archive-cubit/ios/Runner/Assets.xcassets/AppIcon.appiconset/32.png deleted file mode 100755 index 6dcb454..0000000 Binary files a/apps/driver-archive-cubit/ios/Runner/Assets.xcassets/AppIcon.appiconset/32.png and /dev/null differ diff --git a/apps/driver-archive-cubit/ios/Runner/Assets.xcassets/AppIcon.appiconset/40.png b/apps/driver-archive-cubit/ios/Runner/Assets.xcassets/AppIcon.appiconset/40.png deleted file mode 100755 index ba727b0..0000000 Binary files a/apps/driver-archive-cubit/ios/Runner/Assets.xcassets/AppIcon.appiconset/40.png and /dev/null differ diff --git a/apps/driver-archive-cubit/ios/Runner/Assets.xcassets/AppIcon.appiconset/48.png b/apps/driver-archive-cubit/ios/Runner/Assets.xcassets/AppIcon.appiconset/48.png deleted file mode 100755 index ded0445..0000000 Binary files a/apps/driver-archive-cubit/ios/Runner/Assets.xcassets/AppIcon.appiconset/48.png and /dev/null differ diff --git a/apps/driver-archive-cubit/ios/Runner/Assets.xcassets/AppIcon.appiconset/50.png b/apps/driver-archive-cubit/ios/Runner/Assets.xcassets/AppIcon.appiconset/50.png deleted file mode 100755 index fe7b959..0000000 Binary files a/apps/driver-archive-cubit/ios/Runner/Assets.xcassets/AppIcon.appiconset/50.png and /dev/null differ diff --git a/apps/driver-archive-cubit/ios/Runner/Assets.xcassets/AppIcon.appiconset/512.png b/apps/driver-archive-cubit/ios/Runner/Assets.xcassets/AppIcon.appiconset/512.png deleted file mode 100755 index 207a10d..0000000 Binary files a/apps/driver-archive-cubit/ios/Runner/Assets.xcassets/AppIcon.appiconset/512.png and /dev/null differ diff --git a/apps/driver-archive-cubit/ios/Runner/Assets.xcassets/AppIcon.appiconset/55.png b/apps/driver-archive-cubit/ios/Runner/Assets.xcassets/AppIcon.appiconset/55.png deleted file mode 100755 index f115281..0000000 Binary files a/apps/driver-archive-cubit/ios/Runner/Assets.xcassets/AppIcon.appiconset/55.png and /dev/null differ diff --git a/apps/driver-archive-cubit/ios/Runner/Assets.xcassets/AppIcon.appiconset/57.png b/apps/driver-archive-cubit/ios/Runner/Assets.xcassets/AppIcon.appiconset/57.png deleted file mode 100755 index b67fa63..0000000 Binary files a/apps/driver-archive-cubit/ios/Runner/Assets.xcassets/AppIcon.appiconset/57.png and /dev/null differ diff --git a/apps/driver-archive-cubit/ios/Runner/Assets.xcassets/AppIcon.appiconset/58.png b/apps/driver-archive-cubit/ios/Runner/Assets.xcassets/AppIcon.appiconset/58.png deleted file mode 100755 index 7011399..0000000 Binary files a/apps/driver-archive-cubit/ios/Runner/Assets.xcassets/AppIcon.appiconset/58.png and /dev/null differ diff --git a/apps/driver-archive-cubit/ios/Runner/Assets.xcassets/AppIcon.appiconset/60.png b/apps/driver-archive-cubit/ios/Runner/Assets.xcassets/AppIcon.appiconset/60.png deleted file mode 100755 index 3d98bd6..0000000 Binary files a/apps/driver-archive-cubit/ios/Runner/Assets.xcassets/AppIcon.appiconset/60.png and /dev/null differ diff --git a/apps/driver-archive-cubit/ios/Runner/Assets.xcassets/AppIcon.appiconset/64.png b/apps/driver-archive-cubit/ios/Runner/Assets.xcassets/AppIcon.appiconset/64.png deleted file mode 100755 index d7aa056..0000000 Binary files a/apps/driver-archive-cubit/ios/Runner/Assets.xcassets/AppIcon.appiconset/64.png and /dev/null differ diff --git a/apps/driver-archive-cubit/ios/Runner/Assets.xcassets/AppIcon.appiconset/66.png b/apps/driver-archive-cubit/ios/Runner/Assets.xcassets/AppIcon.appiconset/66.png deleted file mode 100755 index 2f25a3e..0000000 Binary files a/apps/driver-archive-cubit/ios/Runner/Assets.xcassets/AppIcon.appiconset/66.png and /dev/null differ diff --git a/apps/driver-archive-cubit/ios/Runner/Assets.xcassets/AppIcon.appiconset/72.png b/apps/driver-archive-cubit/ios/Runner/Assets.xcassets/AppIcon.appiconset/72.png deleted file mode 100755 index 93905f9..0000000 Binary files a/apps/driver-archive-cubit/ios/Runner/Assets.xcassets/AppIcon.appiconset/72.png and /dev/null differ diff --git a/apps/driver-archive-cubit/ios/Runner/Assets.xcassets/AppIcon.appiconset/76.png b/apps/driver-archive-cubit/ios/Runner/Assets.xcassets/AppIcon.appiconset/76.png deleted file mode 100755 index 8dcf758..0000000 Binary files a/apps/driver-archive-cubit/ios/Runner/Assets.xcassets/AppIcon.appiconset/76.png and /dev/null differ diff --git a/apps/driver-archive-cubit/ios/Runner/Assets.xcassets/AppIcon.appiconset/80.png b/apps/driver-archive-cubit/ios/Runner/Assets.xcassets/AppIcon.appiconset/80.png deleted file mode 100755 index 3e8a65f..0000000 Binary files a/apps/driver-archive-cubit/ios/Runner/Assets.xcassets/AppIcon.appiconset/80.png and /dev/null differ diff --git a/apps/driver-archive-cubit/ios/Runner/Assets.xcassets/AppIcon.appiconset/87.png b/apps/driver-archive-cubit/ios/Runner/Assets.xcassets/AppIcon.appiconset/87.png deleted file mode 100755 index 722bedf..0000000 Binary files a/apps/driver-archive-cubit/ios/Runner/Assets.xcassets/AppIcon.appiconset/87.png and /dev/null differ diff --git a/apps/driver-archive-cubit/ios/Runner/Assets.xcassets/AppIcon.appiconset/88.png b/apps/driver-archive-cubit/ios/Runner/Assets.xcassets/AppIcon.appiconset/88.png deleted file mode 100755 index 0b9fd37..0000000 Binary files a/apps/driver-archive-cubit/ios/Runner/Assets.xcassets/AppIcon.appiconset/88.png and /dev/null differ diff --git a/apps/driver-archive-cubit/ios/Runner/Assets.xcassets/AppIcon.appiconset/92.png b/apps/driver-archive-cubit/ios/Runner/Assets.xcassets/AppIcon.appiconset/92.png deleted file mode 100755 index ac011bd..0000000 Binary files a/apps/driver-archive-cubit/ios/Runner/Assets.xcassets/AppIcon.appiconset/92.png and /dev/null differ diff --git a/apps/driver-archive-cubit/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json b/apps/driver-archive-cubit/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json deleted file mode 100755 index 1319290..0000000 --- a/apps/driver-archive-cubit/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json +++ /dev/null @@ -1 +0,0 @@ -{"images":[{"size":"60x60","expected-size":"180","filename":"180.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"iphone","scale":"3x"},{"size":"40x40","expected-size":"80","filename":"80.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"iphone","scale":"2x"},{"size":"40x40","expected-size":"120","filename":"120.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"iphone","scale":"3x"},{"size":"60x60","expected-size":"120","filename":"120.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"iphone","scale":"2x"},{"size":"57x57","expected-size":"57","filename":"57.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"iphone","scale":"1x"},{"size":"29x29","expected-size":"58","filename":"58.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"iphone","scale":"2x"},{"size":"29x29","expected-size":"29","filename":"29.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"iphone","scale":"1x"},{"size":"29x29","expected-size":"87","filename":"87.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"iphone","scale":"3x"},{"size":"57x57","expected-size":"114","filename":"114.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"iphone","scale":"2x"},{"size":"20x20","expected-size":"40","filename":"40.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"iphone","scale":"2x"},{"size":"20x20","expected-size":"60","filename":"60.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"iphone","scale":"3x"},{"size":"1024x1024","filename":"1024.png","expected-size":"1024","idiom":"ios-marketing","folder":"Assets.xcassets/AppIcon.appiconset/","scale":"1x"},{"size":"40x40","expected-size":"80","filename":"80.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"ipad","scale":"2x"},{"size":"72x72","expected-size":"72","filename":"72.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"ipad","scale":"1x"},{"size":"76x76","expected-size":"152","filename":"152.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"ipad","scale":"2x"},{"size":"50x50","expected-size":"100","filename":"100.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"ipad","scale":"2x"},{"size":"29x29","expected-size":"58","filename":"58.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"ipad","scale":"2x"},{"size":"76x76","expected-size":"76","filename":"76.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"ipad","scale":"1x"},{"size":"29x29","expected-size":"29","filename":"29.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"ipad","scale":"1x"},{"size":"50x50","expected-size":"50","filename":"50.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"ipad","scale":"1x"},{"size":"72x72","expected-size":"144","filename":"144.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"ipad","scale":"2x"},{"size":"40x40","expected-size":"40","filename":"40.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"ipad","scale":"1x"},{"size":"83.5x83.5","expected-size":"167","filename":"167.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"ipad","scale":"2x"},{"size":"20x20","expected-size":"20","filename":"20.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"ipad","scale":"1x"},{"size":"20x20","expected-size":"40","filename":"40.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"ipad","scale":"2x"},{"idiom":"watch","filename":"172.png","folder":"Assets.xcassets/AppIcon.appiconset/","subtype":"38mm","scale":"2x","size":"86x86","expected-size":"172","role":"quickLook"},{"idiom":"watch","filename":"80.png","folder":"Assets.xcassets/AppIcon.appiconset/","subtype":"38mm","scale":"2x","size":"40x40","expected-size":"80","role":"appLauncher"},{"idiom":"watch","filename":"88.png","folder":"Assets.xcassets/AppIcon.appiconset/","subtype":"40mm","scale":"2x","size":"44x44","expected-size":"88","role":"appLauncher"},{"idiom":"watch","filename":"102.png","folder":"Assets.xcassets/AppIcon.appiconset/","subtype":"45mm","scale":"2x","size":"51x51","expected-size":"102","role":"appLauncher"},{"idiom":"watch","filename":"108.png","folder":"Assets.xcassets/AppIcon.appiconset/","subtype":"49mm","scale":"2x","size":"54x54","expected-size":"108","role":"appLauncher"},{"idiom":"watch","filename":"92.png","folder":"Assets.xcassets/AppIcon.appiconset/","subtype":"41mm","scale":"2x","size":"46x46","expected-size":"92","role":"appLauncher"},{"idiom":"watch","filename":"100.png","folder":"Assets.xcassets/AppIcon.appiconset/","subtype":"44mm","scale":"2x","size":"50x50","expected-size":"100","role":"appLauncher"},{"idiom":"watch","filename":"196.png","folder":"Assets.xcassets/AppIcon.appiconset/","subtype":"42mm","scale":"2x","size":"98x98","expected-size":"196","role":"quickLook"},{"idiom":"watch","filename":"216.png","folder":"Assets.xcassets/AppIcon.appiconset/","subtype":"44mm","scale":"2x","size":"108x108","expected-size":"216","role":"quickLook"},{"idiom":"watch","filename":"234.png","folder":"Assets.xcassets/AppIcon.appiconset/","subtype":"45mm","scale":"2x","size":"117x117","expected-size":"234","role":"quickLook"},{"idiom":"watch","filename":"258.png","folder":"Assets.xcassets/AppIcon.appiconset/","subtype":"49mm","scale":"2x","size":"129x129","expected-size":"258","role":"quickLook"},{"idiom":"watch","filename":"48.png","folder":"Assets.xcassets/AppIcon.appiconset/","subtype":"38mm","scale":"2x","size":"24x24","expected-size":"48","role":"notificationCenter"},{"idiom":"watch","filename":"55.png","folder":"Assets.xcassets/AppIcon.appiconset/","subtype":"42mm","scale":"2x","size":"27.5x27.5","expected-size":"55","role":"notificationCenter"},{"idiom":"watch","filename":"66.png","folder":"Assets.xcassets/AppIcon.appiconset/","subtype":"45mm","scale":"2x","size":"33x33","expected-size":"66","role":"notificationCenter"},{"size":"29x29","expected-size":"87","filename":"87.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"watch","role":"companionSettings","scale":"3x"},{"size":"29x29","expected-size":"58","filename":"58.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"watch","role":"companionSettings","scale":"2x"},{"size":"1024x1024","expected-size":"1024","filename":"1024.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"watch-marketing","scale":"1x"},{"size":"128x128","expected-size":"128","filename":"128.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"mac","scale":"1x"},{"size":"256x256","expected-size":"256","filename":"256.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"mac","scale":"1x"},{"size":"128x128","expected-size":"256","filename":"256.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"mac","scale":"2x"},{"size":"256x256","expected-size":"512","filename":"512.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"mac","scale":"2x"},{"size":"32x32","expected-size":"32","filename":"32.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"mac","scale":"1x"},{"size":"512x512","expected-size":"512","filename":"512.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"mac","scale":"1x"},{"size":"16x16","expected-size":"16","filename":"16.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"mac","scale":"1x"},{"size":"16x16","expected-size":"32","filename":"32.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"mac","scale":"2x"},{"size":"32x32","expected-size":"64","filename":"64.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"mac","scale":"2x"},{"size":"512x512","expected-size":"1024","filename":"1024.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"mac","scale":"2x"}]} \ No newline at end of file diff --git a/apps/driver-archive-cubit/ios/Runner/Base.lproj/LaunchScreen.storyboard b/apps/driver-archive-cubit/ios/Runner/Base.lproj/LaunchScreen.storyboard deleted file mode 100755 index f2e259c..0000000 --- a/apps/driver-archive-cubit/ios/Runner/Base.lproj/LaunchScreen.storyboard +++ /dev/null @@ -1,37 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/apps/driver-archive-cubit/ios/Runner/Base.lproj/Main.storyboard b/apps/driver-archive-cubit/ios/Runner/Base.lproj/Main.storyboard deleted file mode 100755 index 19d3697..0000000 --- a/apps/driver-archive-cubit/ios/Runner/Base.lproj/Main.storyboard +++ /dev/null @@ -1,29 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/apps/driver-archive-cubit/ios/Runner/Config.plist b/apps/driver-archive-cubit/ios/Runner/Config.plist deleted file mode 100755 index 9e656c2..0000000 --- a/apps/driver-archive-cubit/ios/Runner/Config.plist +++ /dev/null @@ -1,8 +0,0 @@ - - - - - APIKey - AIzaSyCf2mW2h0HD8ZYjwh4VOa2ladw6MJkCDTM - - diff --git a/apps/driver-archive-cubit/ios/Runner/Constants.swift b/apps/driver-archive-cubit/ios/Runner/Constants.swift deleted file mode 100755 index 75776b7..0000000 --- a/apps/driver-archive-cubit/ios/Runner/Constants.swift +++ /dev/null @@ -1,12 +0,0 @@ -// -// Constants.swift -// Runner -// -// Created by Hamza Aleghwairyeen on 24/02/2025. -// - -import Foundation - -struct Constants { - static let googleMapsAPIKey = "AIzaSyCyfwRXTwSTLOFQSQgN5p7QZgGJVZnEKq0" -} diff --git a/apps/driver-archive-cubit/ios/Runner/Constants1.swift b/apps/driver-archive-cubit/ios/Runner/Constants1.swift deleted file mode 100755 index 704a451..0000000 --- a/apps/driver-archive-cubit/ios/Runner/Constants1.swift +++ /dev/null @@ -1,8 +0,0 @@ -// -// Constants1.swift -// Runner -// -// Created by Hamza Aleghwairyeen on 16/03/2025. -// - -import Foundation diff --git a/apps/driver-archive-cubit/ios/Runner/Info.plist b/apps/driver-archive-cubit/ios/Runner/Info.plist deleted file mode 100755 index ad7c2d6..0000000 --- a/apps/driver-archive-cubit/ios/Runner/Info.plist +++ /dev/null @@ -1,109 +0,0 @@ - - - - - LSMinimumSystemVersion - 12.0 - UIBackgroundModes - - fetch - location - remote-notification - - BGTaskSchedulerPermittedIdentifiers - - $(PRODUCT_BUNDLE_IDENTIFIER) - - NSContactsUsageDescription - This app requires contacts access to function properly. - CADisableMinimumFrameDurationOnPhone - - CFBundleDevelopmentRegion - $(DEVELOPMENT_LANGUAGE) - CFBundleDisplayName - Tripz Driver - CFBundleExecutable - $(EXECUTABLE_NAME) - CFBundleGetInfoString - - CFBundleIdentifier - $(PRODUCT_BUNDLE_IDENTIFIER) - CFBundleInfoDictionaryVersion - 6.0 - CFBundleName - Tripz Driver - CFBundlePackageType - APPL - CFBundleShortVersionString - 109 - CFBundleSignature - ???? - CFBundleURLTypes - - - CFBundleTypeRole - Editor - CFBundleURLSchemes - - com.googleusercontent.apps.594687661098-9fnj82nef9oagl98prigdf8qne3ddbto - - - - CFBundleVersion - 5.0.109 - FirebaseAppDelegateProxyEnabled - NO - GMSApiKey - YOUR_API_KEY - LSApplicationCategoryType - - LSApplicationQueriesSchemes - - googlechromes - comgooglemaps - - LSRequiresIPhoneOS - - NSCameraUsageDescription - This app requires access to your camera in order to scan QR codes and capture images - for uploading and access to connect to a call. - NSFaceIDUsageDescription - Use Face ID to securely authenticate payment accounts. - NSLocationAlwaysAndWhenInUseUsageDescription - This app needs access to your location to provide you with the best ride experience. - Your location data will be used to find the nearest available cars and connect you with - the closest captain for efficient and convenient rides. - NSLocationAlwaysUsageDescription - This app needs access to location. - NSLocationWhenInUseUsageDescription - This app needs access to your location to provide you with the best ride experience. - Your location data will be used to find the nearest available cars and connect you with - the closest captain for efficient and convenient rides. - NSMicrophoneUsageDescription - This app requires access to your microphone to record audio, allowing you to add - voice recordings to your photos and videos and access to connect to a call. - NSPhotoLibraryUsageDescription - Explanation of why your app needs access to the photo library. - UIApplicationSupportsIndirectInputEvents - - UILaunchStoryboardName - LaunchScreen - UIMainStoryboardFile - Main - UISupportedInterfaceOrientations - - UIInterfaceOrientationPortrait - UIInterfaceOrientationLandscapeLeft - UIInterfaceOrientationLandscapeRight - - UISupportedInterfaceOrientations~ipad - - UIInterfaceOrientationPortrait - UIInterfaceOrientationPortraitUpsideDown - UIInterfaceOrientationLandscapeLeft - UIInterfaceOrientationLandscapeRight - - UIViewControllerBasedStatusBarAppearance - - - diff --git a/apps/driver-archive-cubit/ios/Runner/JailbreakDetection.swift b/apps/driver-archive-cubit/ios/Runner/JailbreakDetection.swift deleted file mode 100755 index 17eb672..0000000 --- a/apps/driver-archive-cubit/ios/Runner/JailbreakDetection.swift +++ /dev/null @@ -1,26 +0,0 @@ -// -// JailbreakDetection.swift -// Runner -// -// Created by Hamza Aleghwairyeen on 24/02/2025. -// - - -import Foundation - -class JailbreakDetection { - static func isJailbroken() -> Bool { - let paths = [ - "/Applications/Cydia.app", - "/Library/MobileSubstrate/MobileSubstrate.dylib", - "/usr/sbin/sshd", - "/etc/apt" - ] - for path in paths { - if FileManager.default.fileExists(atPath: path) { - return true - } - } - return false - } -} diff --git a/apps/driver-archive-cubit/ios/Runner/KeychainHelper.swift b/apps/driver-archive-cubit/ios/Runner/KeychainHelper.swift deleted file mode 100755 index a7418db..0000000 --- a/apps/driver-archive-cubit/ios/Runner/KeychainHelper.swift +++ /dev/null @@ -1,8 +0,0 @@ -// -// KeychainHelper.swift -// Runner -// -// Created by Hamza Aleghwairyeen on 16/03/2025. -// - -import Foundation diff --git a/apps/driver-archive-cubit/ios/Runner/Runner-Bridging-Header.h b/apps/driver-archive-cubit/ios/Runner/Runner-Bridging-Header.h deleted file mode 100755 index 2dd4564..0000000 --- a/apps/driver-archive-cubit/ios/Runner/Runner-Bridging-Header.h +++ /dev/null @@ -1,2 +0,0 @@ -#import "GeneratedPluginRegistrant.h" -#import "SecurityChecks.h" diff --git a/apps/driver-archive-cubit/ios/Runner/Runner.entitlements b/apps/driver-archive-cubit/ios/Runner/Runner.entitlements deleted file mode 100755 index 80b5221..0000000 --- a/apps/driver-archive-cubit/ios/Runner/Runner.entitlements +++ /dev/null @@ -1,12 +0,0 @@ - - - - - aps-environment - development - com.apple.developer.applesignin - - Default - - - diff --git a/apps/driver-archive-cubit/ios/Runner/SecurityChecks.h b/apps/driver-archive-cubit/ios/Runner/SecurityChecks.h deleted file mode 100755 index 7c62f85..0000000 --- a/apps/driver-archive-cubit/ios/Runner/SecurityChecks.h +++ /dev/null @@ -1,16 +0,0 @@ -// -// SecurityChecks.h -// Runner -// -// Created by Hamza Aleghwairyeen on 17/03/2025. -// - -// SecurityChecks.h -#import -#import // Import UIKit - -@interface SecurityChecks : NSObject - -+ (BOOL)isDeviceCompromised; // Combined check - -@end diff --git a/apps/driver-archive-cubit/ios/Runner/SecurityChecks.m b/apps/driver-archive-cubit/ios/Runner/SecurityChecks.m deleted file mode 100755 index b9ab3e3..0000000 --- a/apps/driver-archive-cubit/ios/Runner/SecurityChecks.m +++ /dev/null @@ -1,197 +0,0 @@ -// -// SecurityChecks.m -// Runner -// -// Created by Hamza Aleghwairyeen on 17/03/2025. -// - -#import - - - -#import "SecurityChecks.h" -#import -#include -#import -#include // For _dyld_image_count and _dyld_get_image_name -#include // for fork() -#include //for socket, connect -#include // for sockaddr_in -#include // for inet_pton - -@implementation SecurityChecks - -+ (BOOL)isDeviceJailbroken { - // (Same jailbreak checks as before - from previous responses) - // 1. Check for common jailbreak files - NSArray *jailbreakPaths = @[ - @"/Applications/Cydia.app", -// #if !TARGET_IPHONE_SIMULATOR -// @"/bin/bash", -// #endif - @"/Library/MobileSubstrate/MobileSubstrate.dylib", - @"/bin/bash", - @"/usr/sbin/sshd", - @"/etc/apt", - @"/private/var/lib/apt/", - @"/private/var/tmp/cydia.log", - ]; - - for (NSString *path in jailbreakPaths) { - if ([[NSFileManager defaultManager] fileExistsAtPath:path]) { - NSLog(@"Jailbreak file detected: %@", path); - return YES; - } - } - - // 2. Check if we can write outside the sandbox (a strong indicator) - NSError *error = nil; - NSString *testPath = @"/private/jailbreaktest.txt"; - [@"test" writeToFile:testPath atomically:YES encoding:NSUTF8StringEncoding error:&error]; - - if (!error) { - // If we can write, it's jailbroken. Remove the file immediately. - [[NSFileManager defaultManager] removeItemAtPath:testPath error:nil]; - NSLog(@"Sandbox write test indicates jailbreak."); - return YES; - } - //3: Check for existence of the symbolic link /Applications. - struct stat s; - if (lstat("/Applications", &s) == 0) { - if (S_ISLNK(s.st_mode)) { - NSLog(@"Symbolic link /Applications exists, jailbroken"); - return YES; - } - } - - //4:Check for dyld Libraries - uint32_t count = _dyld_image_count(); - for (uint32_t i = 0 ; i < count ; ++i) { - const char *dyld = _dyld_get_image_name(i); - if (strstr(dyld, "MobileSubstrate") != NULL || strstr(dyld, "libcycript") != NULL) { - NSLog(@"Suspicious dyld library found: %s", dyld); - return YES; - } - } - - //5 Check if fork() is available. Sandboxed apps should not be able to call fork(). - #if !TARGET_IPHONE_SIMULATOR // Don't run this on the simulator - int pid = fork(); - if (pid == 0) - { - //in child, exit immediately to avoid crashing. - exit(0); - } else if (pid > 0) - { - NSLog(@"Fork available. Likely jailbroken."); - return YES; // Fork succeeded; likely jailbroken - } - #endif - - return NO; // No jailbreak indicators found -} -+ (BOOL)isDebuggerAttached { - int mib[4]; - struct kinfo_proc info; - size_t size = sizeof(info); - - mib[0] = CTL_KERN; - mib[1] = KERN_PROC; - mib[2] = KERN_PROC_PID; - mib[3] = getpid(); - - sysctl(mib, 4, &info, &size, NULL, 0); - - return (info.kp_proc.p_flag & P_TRACED) != 0; -} - -// Check for Frida's default port -+ (BOOL)isFridaListeningOnDefaultPort { - int sock = socket(AF_INET, SOCK_STREAM, 0); - if (sock == -1) { - return NO; // Couldn't create socket - } - - struct sockaddr_in sa; - memset(&sa, 0, sizeof(sa)); - sa.sin_family = AF_INET; - sa.sin_port = htons(27042); // Default Frida port - inet_pton(AF_INET, "127.0.0.1", &sa.sin_addr); - - if (connect(sock, (struct sockaddr *)&sa, sizeof(sa)) != -1) { - NSLog(@"Frida default port (27042) is open."); - close(sock); - return YES; - } - - close(sock); - return NO; -} - - -+ (BOOL)isFridaDetected { - int name[] = { CTL_KERN, KERN_PROC, KERN_PROC_ALL, 0 }; - size_t length; - struct kinfo_proc *procs, *proc; - - sysctl(name, 3, NULL, &length, NULL, 0); - procs = malloc(length); - sysctl(name, 3, procs, &length, NULL, 0); - - for (proc = procs; (char *)proc < (char *)procs + length; proc++) { - if (strstr(proc->kp_proc.p_comm, "frida") != NULL) { - free(procs); - return YES; - } - } - - free(procs); - return NO; -} -// Check for loaded dylibs that indicate Frida -+(BOOL) checkForFridaDylib{ - uint32_t count = _dyld_image_count(); - for (uint32_t i = 0 ; i < count ; ++i) { - const char *dyld = _dyld_get_image_name(i); - if (strstr(dyld, "FridaGadget") != NULL) { // Look for FridaGadget - NSLog(@"FridaGadget dylib found: %s", dyld); - return YES; - } - } - return NO; -} - -// Check process name -+ (BOOL)checkProcessName { - NSString* processName = [[NSProcessInfo processInfo] processName]; - if ([processName containsString:@"Frida"]) { - return YES; - } - return NO; -} - -// A combined check for jailbreak and Frida -+ (BOOL)isDeviceCompromised { - if ([SecurityChecks isDeviceJailbroken]) { - return YES; - } - if ([SecurityChecks isFridaListeningOnDefaultPort]) { - return YES; - } - if ([SecurityChecks checkForFridaDylib]) { - return YES; - } - if([SecurityChecks checkProcessName]){ - return YES; - } - if ([SecurityChecks isDebuggerAttached]) { - return YES; - } -// if ([SecurityChecks isFridaDetected]) { -// return YES; -// } - - return NO; -} - -@end diff --git a/apps/driver-archive-cubit/ios/Runner/en.lproj/Localizable.strings b/apps/driver-archive-cubit/ios/Runner/en.lproj/Localizable.strings deleted file mode 100755 index dda4b9d..0000000 --- a/apps/driver-archive-cubit/ios/Runner/en.lproj/Localizable.strings +++ /dev/null @@ -1,7 +0,0 @@ -/* - Localizable.strings - Runner - - Created by Hamza Aleghwairyeen on 24/02/2025. - -*/ diff --git a/apps/driver-archive-cubit/ios/Runner/order.wav b/apps/driver-archive-cubit/ios/Runner/order.wav deleted file mode 100755 index b2b0ba2..0000000 Binary files a/apps/driver-archive-cubit/ios/Runner/order.wav and /dev/null differ diff --git a/apps/driver-archive-cubit/ios/Runner/tone2.wav b/apps/driver-archive-cubit/ios/Runner/tone2.wav deleted file mode 100755 index 0582d47..0000000 Binary files a/apps/driver-archive-cubit/ios/Runner/tone2.wav and /dev/null differ diff --git a/apps/driver-archive-cubit/ios/RunnerTests/RunnerTests.swift b/apps/driver-archive-cubit/ios/RunnerTests/RunnerTests.swift deleted file mode 100755 index 86a7c3b..0000000 --- a/apps/driver-archive-cubit/ios/RunnerTests/RunnerTests.swift +++ /dev/null @@ -1,12 +0,0 @@ -import Flutter -import UIKit -import XCTest - -class RunnerTests: XCTestCase { - - func testExample() { - // If you add code to the Runner application, consider adding tests here. - // See https://developer.apple.com/documentation/xctest for more information about using XCTest. - } - -} diff --git a/apps/driver-archive-cubit/ios/firebase_app_id_file.json b/apps/driver-archive-cubit/ios/firebase_app_id_file.json deleted file mode 100755 index 5236662..0000000 --- a/apps/driver-archive-cubit/ios/firebase_app_id_file.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "file_generated_by": "FlutterFire CLI", - "purpose": "FirebaseAppID & ProjectID for this Firebase app in this directory", - "GOOGLE_APP_ID": "1:594687661098:ios:6f69eee1449be943595f53", - "FIREBASE_PROJECT_ID": "ride-b1bd8", - "GCM_SENDER_ID": "594687661098" -} \ No newline at end of file diff --git a/apps/driver-archive-cubit/l10n.yaml b/apps/driver-archive-cubit/l10n.yaml deleted file mode 100644 index ce44212..0000000 --- a/apps/driver-archive-cubit/l10n.yaml +++ /dev/null @@ -1,4 +0,0 @@ -arb-dir: lib/core/l10n -template-arb-file: app_ar.arb -output-localization-file: app_localizations.dart -output-class: AppLocalizations diff --git a/apps/driver-archive-cubit/lib/app.dart b/apps/driver-archive-cubit/lib/app.dart deleted file mode 100644 index c4e086b..0000000 --- a/apps/driver-archive-cubit/lib/app.dart +++ /dev/null @@ -1,93 +0,0 @@ -import 'package:flutter/material.dart'; -import 'package:flutter_bloc/flutter_bloc.dart'; -import 'package:driver/core/l10n/app_localizations.dart'; -import 'core/di.dart'; -import 'core/router.dart'; -import 'core/design/theme.dart'; -import 'features/auth/cubit/auth_cubit.dart'; -import 'features/auth/data/auth_repository.dart'; -import 'features/settings/cubit/settings_cubit.dart'; -import 'features/auth/cubit/auth_state.dart'; -import 'features/home/cubit/driver_cubit.dart'; -import 'features/offers/bloc/offers_bloc.dart'; -import 'features/trip/bloc/driver_trip_bloc.dart'; -import 'features/trip/data/fcm_service.dart'; - -class TripzDriverApp extends StatelessWidget { - const TripzDriverApp({super.key}); - - @override - Widget build(BuildContext context) { - return MultiBlocProvider( - providers: [ - BlocProvider( - create: (_) => SettingsCubit(), - ), - BlocProvider( - create: (_) => AuthCubit(getIt())..checkAuth(), - ), - // Blocs for Phase 3 — provided from getIt (lazy singletons). - // They persist across navigation and are disposed manually at logout. - BlocProvider.value(value: getIt()..loadProfile()), - BlocProvider.value( - value: getIt()..add(const OffersStarted()), - ), - BlocProvider.value( - value: getIt()..add(const DriverTripCheckActive()), - ), - ], - child: _AppListener( - child: Builder( - builder: (context) { - final settings = context.watch(); - final auth = context.read(); - final router = buildRouter(auth); - - return MaterialApp.router( - title: 'Tripz Driver', - debugShowCheckedModeBanner: false, - theme: buildTheme( - brightness: Brightness.light, - locale: settings.state.locale, - ), - darkTheme: buildTheme( - brightness: Brightness.dark, - locale: settings.state.locale, - ), - themeMode: settings.state.themeMode, - locale: settings.state.locale, - supportedLocales: AppLocalizations.supportedLocales, - localizationsDelegates: AppLocalizations.localizationsDelegates, - routerConfig: router, - ); - }, - ), - ), - ); - } -} - -/// يستمع لتغيير حالة المصادقة ويُهيّئ FCM بعد تسجيل الدخول. -class _AppListener extends StatefulWidget { - final Widget child; - const _AppListener({required this.child}); - - @override - State<_AppListener> createState() => _AppListenerState(); -} - -class _AppListenerState extends State<_AppListener> { - @override - void initState() { - super.initState(); - final auth = context.read(); - auth.stream.listen((state) { - if (state.status == AuthStatus.authenticated) { - getIt().init(); - } - }); - } - - @override - Widget build(BuildContext context) => widget.child; -} diff --git a/apps/driver-archive-cubit/lib/core/api/api_client.dart b/apps/driver-archive-cubit/lib/core/api/api_client.dart deleted file mode 100644 index c79274f..0000000 --- a/apps/driver-archive-cubit/lib/core/api/api_client.dart +++ /dev/null @@ -1,105 +0,0 @@ -import 'dart:io'; -import 'package:dio/dio.dart'; -import 'package:device_info_plus/device_info_plus.dart'; -import '../config.dart'; -import '../storage/token_store.dart'; - -/// عميل HTTP لكل نداءات الـAPI (docs/23 §4). -/// -/// **نقطة الشبكة الوحيدة** في التطبيق: لا `http.get` ولا `Dio` آخر في أي -/// مكان. السبب أن كل ما يفرضه السيرفر (المستأجر · التوكن · بصمة الجهاز · -/// التوقيع) يُحقن هنا مرة واحدة؛ نداءٌ يلتفّ حول هذا الملف هو نداء بلا -/// مصادقة يفشل عند تفعيل الحراسات على السيرفر. -class ApiClient { - final Dio dio; - final TokenStore _store; - - /// بصمة الجهاز (docs/17 — D2). تُحسب مرة وتُخزَّن: قراءتها من النظام في كل - /// طلب استدعاءُ قناة أصيلة بلا داعٍ. - static String? _deviceId; - - ApiClient(this._store) - : dio = Dio(BaseOptions( - baseUrl: AppConfig.baseUrl, - connectTimeout: const Duration(seconds: 15), - receiveTimeout: const Duration(seconds: 20), - headers: {'Content-Type': 'application/json'}, - )) { - dio.interceptors.add(InterceptorsWrapper( - onRequest: (options, handler) async { - options.headers['x-tenant-id'] = AppConfig.tenantSlug; - // راكب أم سائق — هويتان منفصلتان لنفس الرقم (قرار المالك 2026-07-20 — ب). - options.headers['x-app-role'] = AppConfig.appRole; - - final device = await _resolveDeviceId(); - if (device != null) options.headers['x-device-id'] = device; - - final token = await _store.access(); - if (token != null && token.isNotEmpty) { - options.headers['Authorization'] = 'Bearer $token'; - } - handler.next(options); - }, - onError: (e, handler) async { - // تجديد التوكن عند 401 — **مرة واحدة**. بلا علامة `_retried` يعيد - // الطلبُ الفاشل تجديداً يفشل فيعيد… حلقة لانهائية تستنزف البطارية - // وتغرق السيرفر عند انتهاء الجلسة فعلاً. - final isAuthError = e.response?.statusCode == 401; - final alreadyRetried = e.requestOptions.extra['_retried'] == true; - final isRefreshCall = e.requestOptions.path.contains('/auth/refresh'); - - if (!isAuthError || alreadyRetried || isRefreshCall) { - return handler.next(e); - } - - final refreshed = await _tryRefresh(); - if (!refreshed) { - await _store.clear(); // الجلسة انتهت فعلاً — لا نُبقي توكناً ميتاً - return handler.next(e); - } - - try { - e.requestOptions.extra['_retried'] = true; - final retry = await dio.fetch(e.requestOptions); - return handler.resolve(retry); - } on DioException catch (err) { - return handler.next(err); - } - }, - )); - } - - Future _tryRefresh() async { - final rt = await _store.refresh(); - if (rt == null || rt.isEmpty) return false; - try { - // Dio نظيف: المرور بالعميل نفسه يُدخل التوكن المنتهي في الترويسة. - final plain = Dio(BaseOptions(baseUrl: AppConfig.baseUrl)); - final r = await plain.post('/auth/refresh', data: {'refresh_token': rt}); - await _store.save( - r.data['access_token'] as String, - (r.data['refresh_token'] ?? rt) as String, - ); - return true; - } catch (_) { - return false; - } - } - - static Future _resolveDeviceId() async { - if (_deviceId != null) return _deviceId; - try { - final info = DeviceInfoPlugin(); - if (Platform.isAndroid) { - _deviceId = (await info.androidInfo).id; - } else if (Platform.isIOS) { - _deviceId = (await info.iosInfo).identifierForVendor; - } - } catch (_) { - // تعذّر قراءة الجهاز: نُرسل بلا الترويسة بدل إسقاط الطلب. السيرفر - // يرفض عند تفعيل الربط، وهذا أوضح من فشل صامت هنا. - _deviceId = null; - } - return _deviceId; - } -} diff --git a/apps/driver-archive-cubit/lib/core/api/api_exception.dart b/apps/driver-archive-cubit/lib/core/api/api_exception.dart deleted file mode 100644 index 2143ff3..0000000 --- a/apps/driver-archive-cubit/lib/core/api/api_exception.dart +++ /dev/null @@ -1,77 +0,0 @@ -/// استثناءات الشبكة الموحّدة — كل خطأ يتحول إلى صنف هنا. -/// docs/23 §4 -class ApiException implements Exception { - ApiException(this.message, {this.statusCode, this.type}); - - final String message; - final int? statusCode; - final ApiExceptionType? type; - - @override - String toString() => 'ApiException($statusCode): $message'; -} - -enum ApiExceptionType { - network, - timeout, - unauthorized, - forbidden, - notFound, - server, - unknown, -} - -/// تحليل DioException إلى ApiException -ApiException fromDioError(Object error) { - final dio = error; - final type = switch (dio.runtimeType.toString()) { - 'DioException' => _mapDioType(dio), - _ => ApiExceptionType.unknown, - }; - - final statusCode = _extractStatusCode(dio); - final message = _extractMessage(dio, statusCode); - - return ApiException(message, statusCode: statusCode, type: type); -} - -int? _extractStatusCode(Object error) { - try { - return (error as dynamic).response?.statusCode as int?; - } catch (_) { - return null; - } -} - -String _extractMessage(Object error, int? statusCode) { - try { - final data = (error as dynamic).response?.data; - if (data is Map) { - return (data['message'] ?? data['error'] ?? 'خطأ غير معروف').toString(); - } - } catch (_) {} - return switch (statusCode) { - 401 => 'انتهت الجلسة', - 403 => 'غير مصرح', - 404 => 'غير موجود', - 500 => 'خطأ في السيرفر', - _ => 'خطأ غير معروف', - }; -} - -ApiExceptionType _mapDioType(Object error) { - try { - final dioType = (error as dynamic).type; - return switch (dioType.toString()) { - 'DioExceptionType.connectionTimeout' => ApiExceptionType.timeout, - 'DioExceptionType.sendTimeout' => ApiExceptionType.timeout, - 'DioExceptionType.receiveTimeout' => ApiExceptionType.timeout, - 'DioExceptionType.connectionError' => ApiExceptionType.network, - 'DioExceptionType.badResponse' => ApiExceptionType.server, - 'DioExceptionType.cancel' => ApiExceptionType.unknown, - _ => ApiExceptionType.unknown, - }; - } catch (_) { - return ApiExceptionType.unknown; - } -} diff --git a/apps/driver-archive-cubit/lib/core/build_config.dart b/apps/driver-archive-cubit/lib/core/build_config.dart deleted file mode 100644 index 3726999..0000000 --- a/apps/driver-archive-cubit/lib/core/build_config.dart +++ /dev/null @@ -1,60 +0,0 @@ -/// مُولَّد من المانيفست عبر سكربت N3 — لا يُحرَّر يدوياً. -/// يحتوي على أعلام الميزات `const` + إعداد المستأجر الثابت. -/// docs/22 §1.5 -class BuildConfig { - static const String tenantSlug = 'siro'; - static const String baseUrl = 'https://tripz-api.intaleqapp.com/api'; - static const String appName = 'Tripz Driver'; - static const String appRole = 'driver'; - - // ألوان المستأجر (البذرة) - static const int primaryColorValue = 0xFF0E7C66; - static const int secondaryColorValue = 0xFF0E7C66; - - // أعلام الميزات — const: tree-shaking يحذف الكود المطفأ في release - // docs/22 §1.5, docs/23 §5 - static const bool rideClassesSet = true; - static const bool tariffEngineFull = true; - static const bool liveTrackingPro = true; - static const bool coupons = true; - static const bool walletPayment = true; - static const bool chat = true; - static const bool aiDocumentProcessing = false; - static const bool heatmap = false; - static const bool predictiveDemand = false; - static const bool geofence = false; - static const bool targetedPromo = false; - static const bool whatsappCampaigns = false; - static const bool marketingEngine = false; - static const bool dynamicPricing = false; - static const bool transit = false; - static const bool paymentGateways = false; - static const bool smsSettlement = false; - static const bool negotiator = false; - static const bool driverTiers = false; - static const bool driverAssurance = false; -} - -/// اختصار وصول للاستعمال في شروط Features.xxx -abstract final class Features { - static const bool rideClassesSet = BuildConfig.rideClassesSet; - static const bool tariffEngineFull = BuildConfig.tariffEngineFull; - static const bool liveTrackingPro = BuildConfig.liveTrackingPro; - static const bool coupons = BuildConfig.coupons; - static const bool walletPayment = BuildConfig.walletPayment; - static const bool chat = BuildConfig.chat; - static const bool aiDocumentProcessing = BuildConfig.aiDocumentProcessing; - static const bool heatmap = BuildConfig.heatmap; - static const bool predictiveDemand = BuildConfig.predictiveDemand; - static const bool geofence = BuildConfig.geofence; - static const bool targetedPromo = BuildConfig.targetedPromo; - static const bool whatsappCampaigns = BuildConfig.whatsappCampaigns; - static const bool marketingEngine = BuildConfig.marketingEngine; - static const bool dynamicPricing = BuildConfig.dynamicPricing; - static const bool transit = BuildConfig.transit; - static const bool paymentGateways = BuildConfig.paymentGateways; - static const bool smsSettlement = BuildConfig.smsSettlement; - static const bool negotiator = BuildConfig.negotiator; - static const bool driverTiers = BuildConfig.driverTiers; - static const bool driverAssurance = BuildConfig.driverAssurance; -} diff --git a/apps/driver-archive-cubit/lib/core/config.dart b/apps/driver-archive-cubit/lib/core/config.dart deleted file mode 100644 index ca78c82..0000000 --- a/apps/driver-archive-cubit/lib/core/config.dart +++ /dev/null @@ -1,24 +0,0 @@ -/// إعداد وقت التشغيل — يُمرَّر عبر --dart-define عند البناء. -/// -/// ما يخصّ **المستأجر** (اسمه، ألوانه، أعلام ميزاته) لا يوضع هنا: مكانه -/// `build_config.dart` المُولَّد من المانيفست (docs/22 §1.5). هذا الملف -/// للإعداد التقني المشترك بين كل المستأجرين. -class AppConfig { - /// الـAPI عبر TLS حصراً (docs/20). المنفذ الخام مغلق على مستوى الشبكة، - /// فأي عودة إلى http تعني تطبيقاً لا يتصل أصلاً. - static const String baseUrl = String.fromEnvironment( - 'BASE_URL', - defaultValue: 'https://tripz-api.intaleqapp.com/api', - ); - - /// slug المستأجر. الافتراض للتطوير؛ البناء المولَّد يمرّره صراحةً. - static const String tenantSlug = String.fromEnvironment( - 'TENANT', - defaultValue: 'siro', - ); - - static const String appName = 'Tripz Driver'; - - /// دور هذا التطبيق — يميّز تطبيق السائق عن الراكب عند التسجيل. - static const String appRole = 'driver'; -} diff --git a/apps/driver-archive-cubit/lib/core/design/theme.dart b/apps/driver-archive-cubit/lib/core/design/theme.dart deleted file mode 100644 index 451dbc0..0000000 --- a/apps/driver-archive-cubit/lib/core/design/theme.dart +++ /dev/null @@ -1,88 +0,0 @@ -import 'package:flutter/material.dart'; -import 'tripz_colors.dart'; -import 'typography.dart'; - -/// بناء الثيم — المدخلان الوحيدان: السطوع واللغة. -/// docs/26 §2, §4 -ThemeData buildTheme({required Brightness brightness, required Locale locale}) { - final bool isDark = brightness == Brightness.dark; - final seed = const Color(0xFF0E7C66); // أخضر تركوازي — بذرة المستأجر - - final colorScheme = ColorScheme.fromSeed( - seedColor: seed, - brightness: brightness, - ); - - final textTheme = buildTextTheme(locale); - - return ThemeData( - useMaterial3: true, - brightness: brightness, - colorScheme: colorScheme, - textTheme: textTheme, - extensions: [ - isDark ? TripzColors.dark : TripzColors.light, - ], - appBarTheme: AppBarTheme( - backgroundColor: colorScheme.surface, - foregroundColor: colorScheme.onSurface, - elevation: 0, - scrolledUnderElevation: 0, - centerTitle: false, - titleTextStyle: textTheme.titleLarge?.copyWith( - color: colorScheme.onSurface, - ), - ), - inputDecorationTheme: InputDecorationTheme( - filled: true, - fillColor: colorScheme.surfaceContainerHighest, - border: OutlineInputBorder( - borderRadius: BorderRadius.circular(8), - borderSide: BorderSide(color: colorScheme.outline), - ), - enabledBorder: OutlineInputBorder( - borderRadius: BorderRadius.circular(8), - borderSide: BorderSide(color: colorScheme.outline), - ), - focusedBorder: OutlineInputBorder( - borderRadius: BorderRadius.circular(8), - borderSide: BorderSide(color: colorScheme.primary, width: 2), - ), - errorBorder: OutlineInputBorder( - borderRadius: BorderRadius.circular(8), - borderSide: BorderSide(color: colorScheme.error), - ), - contentPadding: const EdgeInsets.symmetric(horizontal: 16, vertical: 14), - labelStyle: textTheme.bodyLarge, - hintStyle: textTheme.bodyLarge?.copyWith(color: colorScheme.onSurfaceVariant), - ), - filledButtonTheme: FilledButtonThemeData( - style: FilledButton.styleFrom( - minimumSize: const Size.fromHeight(52), - shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(12)), - textStyle: textTheme.labelLarge, - ), - ), - outlinedButtonTheme: OutlinedButtonThemeData( - style: OutlinedButton.styleFrom( - minimumSize: const Size.fromHeight(52), - shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(12)), - textStyle: textTheme.labelLarge, - ), - ), - cardTheme: CardThemeData( - elevation: 0, - shape: RoundedRectangleBorder( - borderRadius: BorderRadius.circular(12), - side: BorderSide(color: colorScheme.outlineVariant), - ), - margin: EdgeInsets.zero, - ), - bottomSheetTheme: const BottomSheetThemeData( - shape: RoundedRectangleBorder( - borderRadius: BorderRadius.vertical(top: Radius.circular(24)), - ), - showDragHandle: true, - ), - ); -} diff --git a/apps/driver-archive-cubit/lib/core/design/tokens.dart b/apps/driver-archive-cubit/lib/core/design/tokens.dart deleted file mode 100644 index 70df45d..0000000 --- a/apps/driver-archive-cubit/lib/core/design/tokens.dart +++ /dev/null @@ -1,41 +0,0 @@ -/// الرموز الثابتة — كل قيمة هنا `const` ولا تُخترَع في الشاشات. -/// docs/26 §3 -abstract final class T { - // ── المسافات (مضاعفات 4) ── - static const double s4 = 4; - static const double s8 = 8; - static const double s12 = 12; - static const double s16 = 16; - static const double s24 = 24; - static const double s32 = 32; - static const double s48 = 48; - - /// حشوة الصفحة الافتراضية - static const double pagePadding = s16; - - // ── الزوايا ── - static const double r8 = 8; // حقول / شارات - static const double r12 = 12; // أزرار / بطاقات - static const double r16 = 16; // بطاقات كبيرة - static const double r24 = 24; // bottom sheets - static const double rCircle = 999; // avatars - - // ── الحركة (أزمنة) ── - static const Duration fast = Duration(milliseconds: 120); // لمسة - static const Duration medium = Duration(milliseconds: 240); // انتقال ضمن الشاشة - static const Duration slow = Duration(milliseconds: 400); // sheet / صفحة - - // ── الأيقونات ── - static const double iconSm = 20; - static const double iconMd = 24; - static const double iconLg = 32; - - // ── الارتفاعات ── - static const double buttonHeight = 52; - static const double inputHeight = 52; - static const double touchTarget = 48; - - // ── عناصر الخريطة ── - static const double markerSize = 40; - static const double polylineWidth = 6; -} diff --git a/apps/driver-archive-cubit/lib/core/design/tripz_colors.dart b/apps/driver-archive-cubit/lib/core/design/tripz_colors.dart deleted file mode 100644 index 4b8ab2a..0000000 --- a/apps/driver-archive-cubit/lib/core/design/tripz_colors.dart +++ /dev/null @@ -1,88 +0,0 @@ -import 'package:flutter/material.dart'; - -/// الأدوار الدلالية غير الموجودة في ColorScheme الأساسي. -/// الشاشة تستدعيها عبر `context.tripzColors` — لا تقرّر درجة اللون بنفسها. -/// docs/26 §2 -@immutable -class TripzColors extends ThemeExtension { - const TripzColors({ - required this.success, - required this.warning, - required this.danger, - required this.info, - required this.surfaceRaised, - required this.mapOverlayDark, - required this.mapOverlayLight, - }); - - final Color success; - final Color warning; - final Color danger; - final Color info; - final Color surfaceRaised; - final Color mapOverlayDark; - final Color mapOverlayLight; - - @override - TripzColors copyWith({ - Color? success, - Color? warning, - Color? danger, - Color? info, - Color? surfaceRaised, - Color? mapOverlayDark, - Color? mapOverlayLight, - }) { - return TripzColors( - success: success ?? this.success, - warning: warning ?? this.warning, - danger: danger ?? this.danger, - info: info ?? this.info, - surfaceRaised: surfaceRaised ?? this.surfaceRaised, - mapOverlayDark: mapOverlayDark ?? this.mapOverlayDark, - mapOverlayLight: mapOverlayLight ?? this.mapOverlayLight, - ); - } - - @override - TripzColors lerp(TripzColors? other, double t) { - if (other is! TripzColors) return this; - return TripzColors( - success: Color.lerp(success, other.success, t)!, - warning: Color.lerp(warning, other.warning, t)!, - danger: Color.lerp(danger, other.danger, t)!, - info: Color.lerp(info, other.info, t)!, - surfaceRaised: Color.lerp(surfaceRaised, other.surfaceRaised, t)!, - mapOverlayDark: Color.lerp(mapOverlayDark, other.mapOverlayDark, t)!, - mapOverlayLight: Color.lerp(mapOverlayLight, other.mapOverlayLight, t)!, - ); - } - - // ── الوضع النهاري ── - static const light = TripzColors( - success: Color(0xFF2E7D32), - warning: Color(0xFFF9A825), - danger: Color(0xFFD32F2F), - info: Color(0xFF1565C0), - surfaceRaised: Color(0xFFF5F5F5), - mapOverlayDark: Color(0xCC1A1A2E), - mapOverlayLight: Color(0xCCFFFFFF), - ); - - // ── الوضع الليلي ── - static const dark = TripzColors( - success: Color(0xFF66BB6A), - warning: Color(0xFFFFD54F), - danger: Color(0xFFEF5350), - info: Color(0xFF42A5F5), - surfaceRaised: Color(0xFF2C2C3A), - mapOverlayDark: Color(0xCC0D0D1A), - mapOverlayLight: Color(0xCC1A1A2E), - ); -} - -/// امتداد مريح للوصول السريع من السياق -extension TripzColorsExtension on BuildContext { - TripzColors get tripzColors => - Theme.of(this).extension() ?? TripzColors.light; -} diff --git a/apps/driver-archive-cubit/lib/core/design/typography.dart b/apps/driver-archive-cubit/lib/core/design/typography.dart deleted file mode 100644 index 5f0ebf6..0000000 --- a/apps/driver-archive-cubit/lib/core/design/typography.dart +++ /dev/null @@ -1,34 +0,0 @@ -import 'package:flutter/material.dart'; - -/// الخطوط المضمّنة محلياً — Inter + IBM Plex Sans Arabic. -/// لا حزمة google_fonts — الاتصال لا يُراهَن عليه. -/// docs/26 §1 -/// -/// الأوزان المضمّنة: Regular(400) · Medium(500) · SemiBold(600) · Bold(700) -/// لكل خط (٨ ملفات في `assets/fonts/`). -TextTheme buildTextTheme(Locale locale) { - final bool isArabic = locale.languageCode == 'ar'; - - // الخط الرئيسي: عربي ⇒ Plex Arabic، إنجليزي ⇒ Inter - final String primary = isArabic ? 'IBMPlexSansArabic' : 'Inter'; - // الاحتياطي: العكس - final String fallback = isArabic ? 'Inter' : 'IBMPlexSansArabic'; - - return TextTheme( - displayLarge: TextStyle(fontFamily: primary, fontFamilyFallback: [fallback], fontWeight: FontWeight.w700, fontSize: 57, height: 1.12), - displayMedium: TextStyle(fontFamily: primary, fontFamilyFallback: [fallback], fontWeight: FontWeight.w700, fontSize: 45, height: 1.16), - displaySmall: TextStyle(fontFamily: primary, fontFamilyFallback: [fallback], fontWeight: FontWeight.w700, fontSize: 36, height: 1.22), - headlineLarge: TextStyle(fontFamily: primary, fontFamilyFallback: [fallback], fontWeight: FontWeight.w700, fontSize: 32, height: 1.25), - headlineMedium: TextStyle(fontFamily: primary, fontFamilyFallback: [fallback], fontWeight: FontWeight.w600, fontSize: 28, height: 1.29), - headlineSmall: TextStyle(fontFamily: primary, fontFamilyFallback: [fallback], fontWeight: FontWeight.w600, fontSize: 24, height: 1.33), - titleLarge: TextStyle(fontFamily: primary, fontFamilyFallback: [fallback], fontWeight: FontWeight.w600, fontSize: 22, height: 1.27), - titleMedium: TextStyle(fontFamily: primary, fontFamilyFallback: [fallback], fontWeight: FontWeight.w500, fontSize: 16, height: 1.50, letterSpacing: 0.15), - titleSmall: TextStyle(fontFamily: primary, fontFamilyFallback: [fallback], fontWeight: FontWeight.w500, fontSize: 14, height: 1.43, letterSpacing: 0.1), - bodyLarge: TextStyle(fontFamily: primary, fontFamilyFallback: [fallback], fontWeight: FontWeight.w400, fontSize: 16, height: 1.50, letterSpacing: 0.5), - bodyMedium: TextStyle(fontFamily: primary, fontFamilyFallback: [fallback], fontWeight: FontWeight.w400, fontSize: 14, height: 1.43, letterSpacing: 0.25), - bodySmall: TextStyle(fontFamily: primary, fontFamilyFallback: [fallback], fontWeight: FontWeight.w400, fontSize: 12, height: 1.33, letterSpacing: 0.4), - labelLarge: TextStyle(fontFamily: primary, fontFamilyFallback: [fallback], fontWeight: FontWeight.w500, fontSize: 14, height: 1.43, letterSpacing: 0.1), - labelMedium: TextStyle(fontFamily: primary, fontFamilyFallback: [fallback], fontWeight: FontWeight.w500, fontSize: 12, height: 1.33, letterSpacing: 0.5), - labelSmall: TextStyle(fontFamily: primary, fontFamilyFallback: [fallback], fontWeight: FontWeight.w500, fontSize: 11, height: 1.45, letterSpacing: 0.5), - ); -} diff --git a/apps/driver-archive-cubit/lib/core/di.dart b/apps/driver-archive-cubit/lib/core/di.dart deleted file mode 100644 index 4dc8f74..0000000 --- a/apps/driver-archive-cubit/lib/core/di.dart +++ /dev/null @@ -1,67 +0,0 @@ -import 'package:get_it/get_it.dart'; -import 'api/api_client.dart'; -import 'storage/token_store.dart'; -import '../features/auth/data/auth_repository.dart'; -import '../features/home/data/driver_repository.dart'; -import '../features/home/cubit/driver_cubit.dart'; -import '../features/offers/data/offers_repository.dart'; -import '../features/offers/bloc/offers_bloc.dart'; -import '../features/trip/data/driver_trip_repository.dart'; -import '../features/trip/data/driver_socket_service.dart'; -import '../features/trip/data/trip_event_merger.dart'; -import '../features/trip/data/fcm_service.dart'; -import '../features/trip/bloc/driver_trip_bloc.dart'; - -final GetIt getIt = GetIt.instance; - -/// حقن التبعيات (docs/23 §1). -/// -/// **هذه نقطة إقفال الميزات المدفوعة**: الموديول المحروس يُسجَّل داخل -/// `if (Features.x)` فلا يوجد أصلاً حين لا تكون الميزة مشتراة — بدل فحص -/// متناثر في كل شاشة يُنسى أحدها (docs/22 §1.5). -Future setupDi() async { - getIt.registerLazySingleton(() => TokenStore()); - getIt.registerLazySingleton(() => ApiClient(getIt())); - getIt.registerLazySingleton( - () => AuthRepository(getIt(), getIt()), - ); - - // ── Driver Phase 3: Data Layer ── - getIt.registerLazySingleton( - () => DriverRepository(getIt()), - ); - getIt.registerLazySingleton( - () => OffersRepository(getIt()), - ); - getIt.registerLazySingleton( - () => DriverTripRepository(getIt()), - ); - getIt.registerLazySingleton( - () => DriverTripEventMerger(), - ); - getIt.registerLazySingleton( - () => DriverSocketService(getIt(), getIt()), - ); - getIt.registerLazySingleton( - () => DriverFcmService(getIt()), - ); - - // ── Driver Phase 3: Bloc/Cubit (lazy singletons — يُدمَّرون يدوياً عند logout) ── - getIt.registerLazySingleton( - () => DriverCubit(getIt()), - ); - getIt.registerLazySingleton( - () => OffersBloc( - offersRepo: getIt(), - socket: getIt(), - merger: getIt(), - ), - ); - getIt.registerLazySingleton( - () => DriverTripBloc( - tripRepo: getIt(), - socket: getIt(), - merger: getIt(), - ), - ); -} diff --git a/apps/driver-archive-cubit/lib/core/l10n/app_ar.arb b/apps/driver-archive-cubit/lib/core/l10n/app_ar.arb deleted file mode 100644 index 5299711..0000000 --- a/apps/driver-archive-cubit/lib/core/l10n/app_ar.arb +++ /dev/null @@ -1,121 +0,0 @@ -{ - "@@locale": "ar", - "appName": "Tripz", - "appTagline": "اسحب، وصل، وصل", - "phoneTitle": "أدخل رقم هاتفك للمتابعة", - "phoneLabel": "رقم الهاتف", - "phoneHint": "07XXXXXXXX", - "sendCode": "إرسال الرمز", - "otpTitle": "أدخل رمز التحقق", - "otpSentTo": "أُرسل إلى {phone}", - "@otpSentTo": { - "placeholders": { - "phone": {"type": "String"} - } - }, - "otpLabel": "الرمز", - "confirm": "تأكيد", - "welcome": "مرحباً {name}", - "@welcome": { - "placeholders": { - "name": {"type": "String"} - } - }, - "welcomeBack": "مرحباً بعودتك", - "whereTo": "إلى أين؟", - "myTrips": "رحلاتي", - "wallet": "المحفظة", - "coupons": "الكوبونات والدعوات", - "settings": "الإعدادات", - "support": "الدعم", - "logout": "تسجيل الخروج", - "language": "اللغة", - "arabic": "العربية", - "english": "English", - "theme": "المظهر", - "lightMode": "الوضع النهاري", - "darkMode": "الوضع الليلي", - "systemMode": "تلقائي", - "errorGeneric": "حدث خطأ ما", - "retry": "أعد المحاولة", - "emptyGeneric": "لا توجد عناصر بعد", - "loading": "جارٍ التحميل...", - "cancel": "إلغاء", - "save": "حفظ", - "close": "إغلاق", - "next": "التالي", - "back": "رجوع", - "search": "بحث", - "noResults": "لا توجد نتائج", - "connectionError": "تحقق من اتصالك بالإنترنت", - "authError": "تعذّر إرسال الرمز", - "invalidOtp": "رمز غير صحيح", - "phoneEmpty": "أدخل رقم الهاتف", - "selectDestination": "اختر وجهتك", - "pickupLocation": "نقطة الانطلاق", - "dropoffLocation": "الوجهة", - "chooseOnMap": "اختر من الخريطة", - "favorites": "المفضلة", - "home": "البيت", - "work": "العمل", - "searchPlaces": "ابحث عن مكان...", - "rideClasses": "فئة الرحلة", - "cash": "نقدي", - "walletPayment": "المحفظة", - "couponCode": "كود الخصم", - "scheduleRide": "جدولة رحلة", - "requestRide": "اطلب رحلة", - "searchingDriver": "جارٍ البحث عن سائق...", - "cancelSearch": "إلغاء البحث", - "driverAccepted": "قبل سائقك الرحلة", - "driverArriving": "السائق في طريقه إليك", - "driverArrived": "وصل سائقك", - "rideInProgress": "الرحلة جارية", - "rideCompleted": "انتهت الرحلة", - "rateDriver": "قيّم سائقك", - "tripFare": "أجرة الرحلة", - "waitingFee": "رسوم الانتظار", - "discount": "الخصم", - "paymentMethod": "طريقة الدفع", - "total": "المجموع", - "submitRating": "إرسال التقييم", - "skipRating": "تخطي", - "freeWaitMinutes": "دقائق انتظار مجانية", - "minutes": "دقائق", - "callDriver": "اتصل بالسائق", - "chatWithDriver": "دردشة مع السائق", - "shareTrip": "مشاركة الرحلة", - "emergencySOS": "طارئ SOS", - "plateNumber": "رقم اللوحة", - "vehicleInfo": "معلومات المركبة", - "driverRating": "تقييم السائق", - "eta": "الوصول المتوقع", - "km": "كم", - "min": "د", - "searchTimeout": "لم نجد سائقاً متاحاً حالياً. حاول مرة أخرى", - - "goOnline": "الاتصال", - "goOffline": "الانقطاع", - "online": "مُتصل", - "offline": "مُنقطع", - "accept": "قبول", - "reject": "رفض", - "offersAvailable": "عروض متاحة", - "tripAssigned": "رحلة جديدة مُعيّنة", - "onTheWay": "في الطريق", - "arrivedAtPickup": "وصلت", - "startTrip": "بدء الرحلة", - "completeTrip": "إتمام الرحلة", - "tripInProgress": "الرحلة جارية", - "tripCompleted": "أُتمّت الرحلة", - "cancelTrip": "إلغاء الرحلة", - "cancelTripConfirm": "هل أنت متأكد من إلغاء هذه الرحلة؟", - "yes": "نعم", - "no": "لا", - "callClient": "اتصال بالعميل", - "chat": "محادثة", - "trip": "الرحلة", - "anonymous": "السائق", - "noMessagesYet": "لا توجد رسائل بعد", - "typeMessage": "اكتب رسالة..." -} diff --git a/apps/driver-archive-cubit/lib/core/l10n/app_en.arb b/apps/driver-archive-cubit/lib/core/l10n/app_en.arb deleted file mode 100644 index 078d14d..0000000 --- a/apps/driver-archive-cubit/lib/core/l10n/app_en.arb +++ /dev/null @@ -1,121 +0,0 @@ -{ - "@@locale": "en", - "appName": "Tripz", - "appTagline": "Tap, ride, arrive", - "phoneTitle": "Enter your phone number to continue", - "phoneLabel": "Phone number", - "phoneHint": "07XXXXXXXX", - "sendCode": "Send code", - "otpTitle": "Enter verification code", - "otpSentTo": "Sent to {phone}", - "@otpSentTo": { - "placeholders": { - "phone": {"type": "String"} - } - }, - "otpLabel": "Code", - "confirm": "Confirm", - "welcome": "Welcome {name}", - "@welcome": { - "placeholders": { - "name": {"type": "String"} - } - }, - "welcomeBack": "Welcome back", - "whereTo": "Where to?", - "myTrips": "My trips", - "wallet": "Wallet", - "coupons": "Coupons & invites", - "settings": "Settings", - "support": "Support", - "logout": "Logout", - "language": "Language", - "arabic": "العربية", - "english": "English", - "theme": "Theme", - "lightMode": "Light", - "darkMode": "Dark", - "systemMode": "System", - "errorGeneric": "Something went wrong", - "retry": "Try again", - "emptyGeneric": "Nothing here yet", - "loading": "Loading...", - "cancel": "Cancel", - "save": "Save", - "close": "Close", - "next": "Next", - "back": "Back", - "search": "Search", - "noResults": "No results found", - "connectionError": "Check your internet connection", - "authError": "Failed to send code", - "invalidOtp": "Invalid code", - "phoneEmpty": "Enter your phone number", - "selectDestination": "Choose your destination", - "pickupLocation": "Pickup location", - "dropoffLocation": "Destination", - "chooseOnMap": "Choose on map", - "favorites": "Favorites", - "home": "Home", - "work": "Work", - "searchPlaces": "Search for a place...", - "rideClasses": "Ride class", - "cash": "Cash", - "walletPayment": "Wallet", - "couponCode": "Coupon code", - "scheduleRide": "Schedule a ride", - "requestRide": "Request a ride", - "searchingDriver": "Looking for a driver...", - "cancelSearch": "Cancel search", - "driverAccepted": "Your driver accepted", - "driverArriving": "Driver is on the way", - "driverArrived": "Your driver has arrived", - "rideInProgress": "Ride in progress", - "rideCompleted": "Ride completed", - "rateDriver": "Rate your driver", - "tripFare": "Trip fare", - "waitingFee": "Waiting fee", - "discount": "Discount", - "paymentMethod": "Payment method", - "total": "Total", - "submitRating": "Submit rating", - "skipRating": "Skip", - "freeWaitMinutes": "Free wait minutes", - "minutes": "minutes", - "callDriver": "Call driver", - "chatWithDriver": "Chat with driver", - "shareTrip": "Share trip", - "emergencySOS": "Emergency SOS", - "plateNumber": "Plate number", - "vehicleInfo": "Vehicle info", - "driverRating": "Driver rating", - "eta": "Estimated arrival", - "km": "km", - "min": "min", - "searchTimeout": "No drivers available right now. Please try again", - - "goOnline": "Go online", - "goOffline": "Go offline", - "online": "Online", - "offline": "Offline", - "accept": "Accept", - "reject": "Reject", - "offersAvailable": "offers available", - "tripAssigned": "New trip assigned", - "onTheWay": "On my way", - "arrivedAtPickup": "I've arrived", - "startTrip": "Start trip", - "completeTrip": "Complete trip", - "tripInProgress": "Trip in progress", - "tripCompleted": "Trip completed", - "cancelTrip": "Cancel trip", - "cancelTripConfirm": "Are you sure you want to cancel this trip?", - "yes": "Yes", - "no": "No", - "callClient": "Call client", - "chat": "Chat", - "trip": "Trip", - "anonymous": "Driver", - "noMessagesYet": "No messages yet", - "typeMessage": "Type a message..." -} diff --git a/apps/driver-archive-cubit/lib/core/l10n/app_localizations.dart b/apps/driver-archive-cubit/lib/core/l10n/app_localizations.dart deleted file mode 100644 index f97a218..0000000 --- a/apps/driver-archive-cubit/lib/core/l10n/app_localizations.dart +++ /dev/null @@ -1,775 +0,0 @@ -import 'dart:async'; - -import 'package:flutter/foundation.dart'; -import 'package:flutter/widgets.dart'; -import 'package:flutter_localizations/flutter_localizations.dart'; -import 'package:intl/intl.dart' as intl; - -import 'app_localizations_ar.dart'; -import 'app_localizations_en.dart'; - -// ignore_for_file: type=lint - -/// Callers can lookup localized strings with an instance of AppLocalizations -/// returned by `AppLocalizations.of(context)`. -/// -/// Applications need to include `AppLocalizations.delegate()` in their app's -/// `localizationDelegates` list, and the locales they support in the app's -/// `supportedLocales` list. For example: -/// -/// ```dart -/// import 'l10n/app_localizations.dart'; -/// -/// return MaterialApp( -/// localizationsDelegates: AppLocalizations.localizationsDelegates, -/// supportedLocales: AppLocalizations.supportedLocales, -/// home: MyApplicationHome(), -/// ); -/// ``` -/// -/// ## Update pubspec.yaml -/// -/// Please make sure to update your pubspec.yaml to include the following -/// packages: -/// -/// ```yaml -/// dependencies: -/// # Internationalization support. -/// flutter_localizations: -/// sdk: flutter -/// intl: any # Use the pinned version from flutter_localizations -/// -/// # Rest of dependencies -/// ``` -/// -/// ## iOS Applications -/// -/// iOS applications define key application metadata, including supported -/// locales, in an Info.plist file that is built into the application bundle. -/// To configure the locales supported by your app, you’ll need to edit this -/// file. -/// -/// First, open your project’s ios/Runner.xcworkspace Xcode workspace file. -/// Then, in the Project Navigator, open the Info.plist file under the Runner -/// project’s Runner folder. -/// -/// Next, select the Information Property List item, select Add Item from the -/// Editor menu, then select Localizations from the pop-up menu. -/// -/// Select and expand the newly-created Localizations item then, for each -/// locale your application supports, add a new item and select the locale -/// you wish to add from the pop-up menu in the Value field. This list should -/// be consistent with the languages listed in the AppLocalizations.supportedLocales -/// property. -abstract class AppLocalizations { - AppLocalizations(String locale) - : localeName = intl.Intl.canonicalizedLocale(locale.toString()); - - final String localeName; - - static AppLocalizations? of(BuildContext context) { - return Localizations.of(context, AppLocalizations); - } - - static const LocalizationsDelegate delegate = - _AppLocalizationsDelegate(); - - /// A list of this localizations delegate along with the default localizations - /// delegates. - /// - /// Returns a list of localizations delegates containing this delegate along with - /// GlobalMaterialLocalizations.delegate, GlobalCupertinoLocalizations.delegate, - /// and GlobalWidgetsLocalizations.delegate. - /// - /// Additional delegates can be added by appending to this list in - /// MaterialApp. This list does not have to be used at all if a custom list - /// of delegates is preferred or required. - static const List> localizationsDelegates = - >[ - delegate, - GlobalMaterialLocalizations.delegate, - GlobalCupertinoLocalizations.delegate, - GlobalWidgetsLocalizations.delegate, - ]; - - /// A list of this localizations delegate's supported locales. - static const List supportedLocales = [ - Locale('ar'), - Locale('en') - ]; - - /// No description provided for @appName. - /// - /// In ar, this message translates to: - /// **'Tripz'** - String get appName; - - /// No description provided for @appTagline. - /// - /// In ar, this message translates to: - /// **'اسحب، وصل، وصل'** - String get appTagline; - - /// No description provided for @phoneTitle. - /// - /// In ar, this message translates to: - /// **'أدخل رقم هاتفك للمتابعة'** - String get phoneTitle; - - /// No description provided for @phoneLabel. - /// - /// In ar, this message translates to: - /// **'رقم الهاتف'** - String get phoneLabel; - - /// No description provided for @phoneHint. - /// - /// In ar, this message translates to: - /// **'07XXXXXXXX'** - String get phoneHint; - - /// No description provided for @sendCode. - /// - /// In ar, this message translates to: - /// **'إرسال الرمز'** - String get sendCode; - - /// No description provided for @otpTitle. - /// - /// In ar, this message translates to: - /// **'أدخل رمز التحقق'** - String get otpTitle; - - /// No description provided for @otpSentTo. - /// - /// In ar, this message translates to: - /// **'أُرسل إلى {phone}'** - String otpSentTo(String phone); - - /// No description provided for @otpLabel. - /// - /// In ar, this message translates to: - /// **'الرمز'** - String get otpLabel; - - /// No description provided for @confirm. - /// - /// In ar, this message translates to: - /// **'تأكيد'** - String get confirm; - - /// No description provided for @welcome. - /// - /// In ar, this message translates to: - /// **'مرحباً {name}'** - String welcome(String name); - - /// No description provided for @welcomeBack. - /// - /// In ar, this message translates to: - /// **'مرحباً بعودتك'** - String get welcomeBack; - - /// No description provided for @whereTo. - /// - /// In ar, this message translates to: - /// **'إلى أين؟'** - String get whereTo; - - /// No description provided for @myTrips. - /// - /// In ar, this message translates to: - /// **'رحلاتي'** - String get myTrips; - - /// No description provided for @wallet. - /// - /// In ar, this message translates to: - /// **'المحفظة'** - String get wallet; - - /// No description provided for @coupons. - /// - /// In ar, this message translates to: - /// **'الكوبونات والدعوات'** - String get coupons; - - /// No description provided for @settings. - /// - /// In ar, this message translates to: - /// **'الإعدادات'** - String get settings; - - /// No description provided for @support. - /// - /// In ar, this message translates to: - /// **'الدعم'** - String get support; - - /// No description provided for @logout. - /// - /// In ar, this message translates to: - /// **'تسجيل الخروج'** - String get logout; - - /// No description provided for @language. - /// - /// In ar, this message translates to: - /// **'اللغة'** - String get language; - - /// No description provided for @arabic. - /// - /// In ar, this message translates to: - /// **'العربية'** - String get arabic; - - /// No description provided for @english. - /// - /// In ar, this message translates to: - /// **'English'** - String get english; - - /// No description provided for @theme. - /// - /// In ar, this message translates to: - /// **'المظهر'** - String get theme; - - /// No description provided for @lightMode. - /// - /// In ar, this message translates to: - /// **'الوضع النهاري'** - String get lightMode; - - /// No description provided for @darkMode. - /// - /// In ar, this message translates to: - /// **'الوضع الليلي'** - String get darkMode; - - /// No description provided for @systemMode. - /// - /// In ar, this message translates to: - /// **'تلقائي'** - String get systemMode; - - /// No description provided for @errorGeneric. - /// - /// In ar, this message translates to: - /// **'حدث خطأ ما'** - String get errorGeneric; - - /// No description provided for @retry. - /// - /// In ar, this message translates to: - /// **'أعد المحاولة'** - String get retry; - - /// No description provided for @emptyGeneric. - /// - /// In ar, this message translates to: - /// **'لا توجد عناصر بعد'** - String get emptyGeneric; - - /// No description provided for @loading. - /// - /// In ar, this message translates to: - /// **'جارٍ التحميل...'** - String get loading; - - /// No description provided for @cancel. - /// - /// In ar, this message translates to: - /// **'إلغاء'** - String get cancel; - - /// No description provided for @save. - /// - /// In ar, this message translates to: - /// **'حفظ'** - String get save; - - /// No description provided for @close. - /// - /// In ar, this message translates to: - /// **'إغلاق'** - String get close; - - /// No description provided for @next. - /// - /// In ar, this message translates to: - /// **'التالي'** - String get next; - - /// No description provided for @back. - /// - /// In ar, this message translates to: - /// **'رجوع'** - String get back; - - /// No description provided for @search. - /// - /// In ar, this message translates to: - /// **'بحث'** - String get search; - - /// No description provided for @noResults. - /// - /// In ar, this message translates to: - /// **'لا توجد نتائج'** - String get noResults; - - /// No description provided for @connectionError. - /// - /// In ar, this message translates to: - /// **'تحقق من اتصالك بالإنترنت'** - String get connectionError; - - /// No description provided for @authError. - /// - /// In ar, this message translates to: - /// **'تعذّر إرسال الرمز'** - String get authError; - - /// No description provided for @invalidOtp. - /// - /// In ar, this message translates to: - /// **'رمز غير صحيح'** - String get invalidOtp; - - /// No description provided for @phoneEmpty. - /// - /// In ar, this message translates to: - /// **'أدخل رقم الهاتف'** - String get phoneEmpty; - - /// No description provided for @selectDestination. - /// - /// In ar, this message translates to: - /// **'اختر وجهتك'** - String get selectDestination; - - /// No description provided for @pickupLocation. - /// - /// In ar, this message translates to: - /// **'نقطة الانطلاق'** - String get pickupLocation; - - /// No description provided for @dropoffLocation. - /// - /// In ar, this message translates to: - /// **'الوجهة'** - String get dropoffLocation; - - /// No description provided for @chooseOnMap. - /// - /// In ar, this message translates to: - /// **'اختر من الخريطة'** - String get chooseOnMap; - - /// No description provided for @favorites. - /// - /// In ar, this message translates to: - /// **'المفضلة'** - String get favorites; - - /// No description provided for @home. - /// - /// In ar, this message translates to: - /// **'البيت'** - String get home; - - /// No description provided for @work. - /// - /// In ar, this message translates to: - /// **'العمل'** - String get work; - - /// No description provided for @searchPlaces. - /// - /// In ar, this message translates to: - /// **'ابحث عن مكان...'** - String get searchPlaces; - - /// No description provided for @rideClasses. - /// - /// In ar, this message translates to: - /// **'فئة الرحلة'** - String get rideClasses; - - /// No description provided for @cash. - /// - /// In ar, this message translates to: - /// **'نقدي'** - String get cash; - - /// No description provided for @walletPayment. - /// - /// In ar, this message translates to: - /// **'المحفظة'** - String get walletPayment; - - /// No description provided for @couponCode. - /// - /// In ar, this message translates to: - /// **'كود الخصم'** - String get couponCode; - - /// No description provided for @scheduleRide. - /// - /// In ar, this message translates to: - /// **'جدولة رحلة'** - String get scheduleRide; - - /// No description provided for @requestRide. - /// - /// In ar, this message translates to: - /// **'اطلب رحلة'** - String get requestRide; - - /// No description provided for @searchingDriver. - /// - /// In ar, this message translates to: - /// **'جارٍ البحث عن سائق...'** - String get searchingDriver; - - /// No description provided for @cancelSearch. - /// - /// In ar, this message translates to: - /// **'إلغاء البحث'** - String get cancelSearch; - - /// No description provided for @driverAccepted. - /// - /// In ar, this message translates to: - /// **'قبل سائقك الرحلة'** - String get driverAccepted; - - /// No description provided for @driverArriving. - /// - /// In ar, this message translates to: - /// **'السائق في طريقه إليك'** - String get driverArriving; - - /// No description provided for @driverArrived. - /// - /// In ar, this message translates to: - /// **'وصل سائقك'** - String get driverArrived; - - /// No description provided for @rideInProgress. - /// - /// In ar, this message translates to: - /// **'الرحلة جارية'** - String get rideInProgress; - - /// No description provided for @rideCompleted. - /// - /// In ar, this message translates to: - /// **'انتهت الرحلة'** - String get rideCompleted; - - /// No description provided for @rateDriver. - /// - /// In ar, this message translates to: - /// **'قيّم سائقك'** - String get rateDriver; - - /// No description provided for @tripFare. - /// - /// In ar, this message translates to: - /// **'أجرة الرحلة'** - String get tripFare; - - /// No description provided for @waitingFee. - /// - /// In ar, this message translates to: - /// **'رسوم الانتظار'** - String get waitingFee; - - /// No description provided for @discount. - /// - /// In ar, this message translates to: - /// **'الخصم'** - String get discount; - - /// No description provided for @paymentMethod. - /// - /// In ar, this message translates to: - /// **'طريقة الدفع'** - String get paymentMethod; - - /// No description provided for @total. - /// - /// In ar, this message translates to: - /// **'المجموع'** - String get total; - - /// No description provided for @submitRating. - /// - /// In ar, this message translates to: - /// **'إرسال التقييم'** - String get submitRating; - - /// No description provided for @skipRating. - /// - /// In ar, this message translates to: - /// **'تخطي'** - String get skipRating; - - /// No description provided for @freeWaitMinutes. - /// - /// In ar, this message translates to: - /// **'دقائق انتظار مجانية'** - String get freeWaitMinutes; - - /// No description provided for @minutes. - /// - /// In ar, this message translates to: - /// **'دقائق'** - String get minutes; - - /// No description provided for @callDriver. - /// - /// In ar, this message translates to: - /// **'اتصل بالسائق'** - String get callDriver; - - /// No description provided for @chatWithDriver. - /// - /// In ar, this message translates to: - /// **'دردشة مع السائق'** - String get chatWithDriver; - - /// No description provided for @shareTrip. - /// - /// In ar, this message translates to: - /// **'مشاركة الرحلة'** - String get shareTrip; - - /// No description provided for @emergencySOS. - /// - /// In ar, this message translates to: - /// **'طارئ SOS'** - String get emergencySOS; - - /// No description provided for @plateNumber. - /// - /// In ar, this message translates to: - /// **'رقم اللوحة'** - String get plateNumber; - - /// No description provided for @vehicleInfo. - /// - /// In ar, this message translates to: - /// **'معلومات المركبة'** - String get vehicleInfo; - - /// No description provided for @driverRating. - /// - /// In ar, this message translates to: - /// **'تقييم السائق'** - String get driverRating; - - /// No description provided for @eta. - /// - /// In ar, this message translates to: - /// **'الوصول المتوقع'** - String get eta; - - /// No description provided for @km. - /// - /// In ar, this message translates to: - /// **'كم'** - String get km; - - /// No description provided for @min. - /// - /// In ar, this message translates to: - /// **'د'** - String get min; - - /// No description provided for @searchTimeout. - /// - /// In ar, this message translates to: - /// **'لم نجد سائقاً متاحاً حالياً. حاول مرة أخرى'** - String get searchTimeout; - - /// No description provided for @goOnline. - /// - /// In ar, this message translates to: - /// **'الاتصال'** - String get goOnline; - - /// No description provided for @goOffline. - /// - /// In ar, this message translates to: - /// **'الانقطاع'** - String get goOffline; - - /// No description provided for @online. - /// - /// In ar, this message translates to: - /// **'مُتصل'** - String get online; - - /// No description provided for @offline. - /// - /// In ar, this message translates to: - /// **'مُنقطع'** - String get offline; - - /// No description provided for @accept. - /// - /// In ar, this message translates to: - /// **'قبول'** - String get accept; - - /// No description provided for @reject. - /// - /// In ar, this message translates to: - /// **'رفض'** - String get reject; - - /// No description provided for @offersAvailable. - /// - /// In ar, this message translates to: - /// **'عروض متاحة'** - String get offersAvailable; - - /// No description provided for @tripAssigned. - /// - /// In ar, this message translates to: - /// **'رحلة جديدة مُعيّنة'** - String get tripAssigned; - - /// No description provided for @onTheWay. - /// - /// In ar, this message translates to: - /// **'في الطريق'** - String get onTheWay; - - /// No description provided for @arrivedAtPickup. - /// - /// In ar, this message translates to: - /// **'وصلت'** - String get arrivedAtPickup; - - /// No description provided for @startTrip. - /// - /// In ar, this message translates to: - /// **'بدء الرحلة'** - String get startTrip; - - /// No description provided for @completeTrip. - /// - /// In ar, this message translates to: - /// **'إتمام الرحلة'** - String get completeTrip; - - /// No description provided for @tripInProgress. - /// - /// In ar, this message translates to: - /// **'الرحلة جارية'** - String get tripInProgress; - - /// No description provided for @tripCompleted. - /// - /// In ar, this message translates to: - /// **'أُتمّت الرحلة'** - String get tripCompleted; - - /// No description provided for @cancelTrip. - /// - /// In ar, this message translates to: - /// **'إلغاء الرحلة'** - String get cancelTrip; - - /// No description provided for @cancelTripConfirm. - /// - /// In ar, this message translates to: - /// **'هل أنت متأكد من إلغاء هذه الرحلة؟'** - String get cancelTripConfirm; - - /// No description provided for @yes. - /// - /// In ar, this message translates to: - /// **'نعم'** - String get yes; - - /// No description provided for @no. - /// - /// In ar, this message translates to: - /// **'لا'** - String get no; - - /// No description provided for @callClient. - /// - /// In ar, this message translates to: - /// **'اتصال بالعميل'** - String get callClient; - - /// No description provided for @chat. - /// - /// In ar, this message translates to: - /// **'محادثة'** - String get chat; - - /// No description provided for @trip. - /// - /// In ar, this message translates to: - /// **'الرحلة'** - String get trip; - - /// No description provided for @anonymous. - /// - /// In ar, this message translates to: - /// **'السائق'** - String get anonymous; - - /// No description provided for @noMessagesYet. - /// - /// In ar, this message translates to: - /// **'لا توجد رسائل بعد'** - String get noMessagesYet; - - /// No description provided for @typeMessage. - /// - /// In ar, this message translates to: - /// **'اكتب رسالة...'** - String get typeMessage; -} - -class _AppLocalizationsDelegate - extends LocalizationsDelegate { - const _AppLocalizationsDelegate(); - - @override - Future load(Locale locale) { - return SynchronousFuture(lookupAppLocalizations(locale)); - } - - @override - bool isSupported(Locale locale) => - ['ar', 'en'].contains(locale.languageCode); - - @override - bool shouldReload(_AppLocalizationsDelegate old) => false; -} - -AppLocalizations lookupAppLocalizations(Locale locale) { - // Lookup logic when only language code is specified. - switch (locale.languageCode) { - case 'ar': - return AppLocalizationsAr(); - case 'en': - return AppLocalizationsEn(); - } - - throw FlutterError( - 'AppLocalizations.delegate failed to load unsupported locale "$locale". This is likely ' - 'an issue with the localizations generation tool. Please file an issue ' - 'on GitHub with a reproducible sample app and the gen-l10n configuration ' - 'that was used.'); -} diff --git a/apps/driver-archive-cubit/lib/core/l10n/app_localizations_ar.dart b/apps/driver-archive-cubit/lib/core/l10n/app_localizations_ar.dart deleted file mode 100644 index 21a7e9d..0000000 --- a/apps/driver-archive-cubit/lib/core/l10n/app_localizations_ar.dart +++ /dev/null @@ -1,335 +0,0 @@ -// ignore: unused_import -import 'package:intl/intl.dart' as intl; -import 'app_localizations.dart'; - -// ignore_for_file: type=lint - -/// The translations for Arabic (`ar`). -class AppLocalizationsAr extends AppLocalizations { - AppLocalizationsAr([String locale = 'ar']) : super(locale); - - @override - String get appName => 'Tripz'; - - @override - String get appTagline => 'اسحب، وصل، وصل'; - - @override - String get phoneTitle => 'أدخل رقم هاتفك للمتابعة'; - - @override - String get phoneLabel => 'رقم الهاتف'; - - @override - String get phoneHint => '07XXXXXXXX'; - - @override - String get sendCode => 'إرسال الرمز'; - - @override - String get otpTitle => 'أدخل رمز التحقق'; - - @override - String otpSentTo(String phone) { - return 'أُرسل إلى $phone'; - } - - @override - String get otpLabel => 'الرمز'; - - @override - String get confirm => 'تأكيد'; - - @override - String welcome(String name) { - return 'مرحباً $name'; - } - - @override - String get welcomeBack => 'مرحباً بعودتك'; - - @override - String get whereTo => 'إلى أين؟'; - - @override - String get myTrips => 'رحلاتي'; - - @override - String get wallet => 'المحفظة'; - - @override - String get coupons => 'الكوبونات والدعوات'; - - @override - String get settings => 'الإعدادات'; - - @override - String get support => 'الدعم'; - - @override - String get logout => 'تسجيل الخروج'; - - @override - String get language => 'اللغة'; - - @override - String get arabic => 'العربية'; - - @override - String get english => 'English'; - - @override - String get theme => 'المظهر'; - - @override - String get lightMode => 'الوضع النهاري'; - - @override - String get darkMode => 'الوضع الليلي'; - - @override - String get systemMode => 'تلقائي'; - - @override - String get errorGeneric => 'حدث خطأ ما'; - - @override - String get retry => 'أعد المحاولة'; - - @override - String get emptyGeneric => 'لا توجد عناصر بعد'; - - @override - String get loading => 'جارٍ التحميل...'; - - @override - String get cancel => 'إلغاء'; - - @override - String get save => 'حفظ'; - - @override - String get close => 'إغلاق'; - - @override - String get next => 'التالي'; - - @override - String get back => 'رجوع'; - - @override - String get search => 'بحث'; - - @override - String get noResults => 'لا توجد نتائج'; - - @override - String get connectionError => 'تحقق من اتصالك بالإنترنت'; - - @override - String get authError => 'تعذّر إرسال الرمز'; - - @override - String get invalidOtp => 'رمز غير صحيح'; - - @override - String get phoneEmpty => 'أدخل رقم الهاتف'; - - @override - String get selectDestination => 'اختر وجهتك'; - - @override - String get pickupLocation => 'نقطة الانطلاق'; - - @override - String get dropoffLocation => 'الوجهة'; - - @override - String get chooseOnMap => 'اختر من الخريطة'; - - @override - String get favorites => 'المفضلة'; - - @override - String get home => 'البيت'; - - @override - String get work => 'العمل'; - - @override - String get searchPlaces => 'ابحث عن مكان...'; - - @override - String get rideClasses => 'فئة الرحلة'; - - @override - String get cash => 'نقدي'; - - @override - String get walletPayment => 'المحفظة'; - - @override - String get couponCode => 'كود الخصم'; - - @override - String get scheduleRide => 'جدولة رحلة'; - - @override - String get requestRide => 'اطلب رحلة'; - - @override - String get searchingDriver => 'جارٍ البحث عن سائق...'; - - @override - String get cancelSearch => 'إلغاء البحث'; - - @override - String get driverAccepted => 'قبل سائقك الرحلة'; - - @override - String get driverArriving => 'السائق في طريقه إليك'; - - @override - String get driverArrived => 'وصل سائقك'; - - @override - String get rideInProgress => 'الرحلة جارية'; - - @override - String get rideCompleted => 'انتهت الرحلة'; - - @override - String get rateDriver => 'قيّم سائقك'; - - @override - String get tripFare => 'أجرة الرحلة'; - - @override - String get waitingFee => 'رسوم الانتظار'; - - @override - String get discount => 'الخصم'; - - @override - String get paymentMethod => 'طريقة الدفع'; - - @override - String get total => 'المجموع'; - - @override - String get submitRating => 'إرسال التقييم'; - - @override - String get skipRating => 'تخطي'; - - @override - String get freeWaitMinutes => 'دقائق انتظار مجانية'; - - @override - String get minutes => 'دقائق'; - - @override - String get callDriver => 'اتصل بالسائق'; - - @override - String get chatWithDriver => 'دردشة مع السائق'; - - @override - String get shareTrip => 'مشاركة الرحلة'; - - @override - String get emergencySOS => 'طارئ SOS'; - - @override - String get plateNumber => 'رقم اللوحة'; - - @override - String get vehicleInfo => 'معلومات المركبة'; - - @override - String get driverRating => 'تقييم السائق'; - - @override - String get eta => 'الوصول المتوقع'; - - @override - String get km => 'كم'; - - @override - String get min => 'د'; - - @override - String get searchTimeout => 'لم نجد سائقاً متاحاً حالياً. حاول مرة أخرى'; - - @override - String get goOnline => 'الاتصال'; - - @override - String get goOffline => 'الانقطاع'; - - @override - String get online => 'مُتصل'; - - @override - String get offline => 'مُنقطع'; - - @override - String get accept => 'قبول'; - - @override - String get reject => 'رفض'; - - @override - String get offersAvailable => 'عروض متاحة'; - - @override - String get tripAssigned => 'رحلة جديدة مُعيّنة'; - - @override - String get onTheWay => 'في الطريق'; - - @override - String get arrivedAtPickup => 'وصلت'; - - @override - String get startTrip => 'بدء الرحلة'; - - @override - String get completeTrip => 'إتمام الرحلة'; - - @override - String get tripInProgress => 'الرحلة جارية'; - - @override - String get tripCompleted => 'أُتمّت الرحلة'; - - @override - String get cancelTrip => 'إلغاء الرحلة'; - - @override - String get cancelTripConfirm => 'هل أنت متأكد من إلغاء هذه الرحلة؟'; - - @override - String get yes => 'نعم'; - - @override - String get no => 'لا'; - - @override - String get callClient => 'اتصال بالعميل'; - - @override - String get chat => 'محادثة'; - - @override - String get trip => 'الرحلة'; - - @override - String get anonymous => 'السائق'; - - @override - String get noMessagesYet => 'لا توجد رسائل بعد'; - - @override - String get typeMessage => 'اكتب رسالة...'; -} diff --git a/apps/driver-archive-cubit/lib/core/l10n/app_localizations_en.dart b/apps/driver-archive-cubit/lib/core/l10n/app_localizations_en.dart deleted file mode 100644 index 8e3aa2a..0000000 --- a/apps/driver-archive-cubit/lib/core/l10n/app_localizations_en.dart +++ /dev/null @@ -1,336 +0,0 @@ -// ignore: unused_import -import 'package:intl/intl.dart' as intl; -import 'app_localizations.dart'; - -// ignore_for_file: type=lint - -/// The translations for English (`en`). -class AppLocalizationsEn extends AppLocalizations { - AppLocalizationsEn([String locale = 'en']) : super(locale); - - @override - String get appName => 'Tripz'; - - @override - String get appTagline => 'Tap, ride, arrive'; - - @override - String get phoneTitle => 'Enter your phone number to continue'; - - @override - String get phoneLabel => 'Phone number'; - - @override - String get phoneHint => '07XXXXXXXX'; - - @override - String get sendCode => 'Send code'; - - @override - String get otpTitle => 'Enter verification code'; - - @override - String otpSentTo(String phone) { - return 'Sent to $phone'; - } - - @override - String get otpLabel => 'Code'; - - @override - String get confirm => 'Confirm'; - - @override - String welcome(String name) { - return 'Welcome $name'; - } - - @override - String get welcomeBack => 'Welcome back'; - - @override - String get whereTo => 'Where to?'; - - @override - String get myTrips => 'My trips'; - - @override - String get wallet => 'Wallet'; - - @override - String get coupons => 'Coupons & invites'; - - @override - String get settings => 'Settings'; - - @override - String get support => 'Support'; - - @override - String get logout => 'Logout'; - - @override - String get language => 'Language'; - - @override - String get arabic => 'العربية'; - - @override - String get english => 'English'; - - @override - String get theme => 'Theme'; - - @override - String get lightMode => 'Light'; - - @override - String get darkMode => 'Dark'; - - @override - String get systemMode => 'System'; - - @override - String get errorGeneric => 'Something went wrong'; - - @override - String get retry => 'Try again'; - - @override - String get emptyGeneric => 'Nothing here yet'; - - @override - String get loading => 'Loading...'; - - @override - String get cancel => 'Cancel'; - - @override - String get save => 'Save'; - - @override - String get close => 'Close'; - - @override - String get next => 'Next'; - - @override - String get back => 'Back'; - - @override - String get search => 'Search'; - - @override - String get noResults => 'No results found'; - - @override - String get connectionError => 'Check your internet connection'; - - @override - String get authError => 'Failed to send code'; - - @override - String get invalidOtp => 'Invalid code'; - - @override - String get phoneEmpty => 'Enter your phone number'; - - @override - String get selectDestination => 'Choose your destination'; - - @override - String get pickupLocation => 'Pickup location'; - - @override - String get dropoffLocation => 'Destination'; - - @override - String get chooseOnMap => 'Choose on map'; - - @override - String get favorites => 'Favorites'; - - @override - String get home => 'Home'; - - @override - String get work => 'Work'; - - @override - String get searchPlaces => 'Search for a place...'; - - @override - String get rideClasses => 'Ride class'; - - @override - String get cash => 'Cash'; - - @override - String get walletPayment => 'Wallet'; - - @override - String get couponCode => 'Coupon code'; - - @override - String get scheduleRide => 'Schedule a ride'; - - @override - String get requestRide => 'Request a ride'; - - @override - String get searchingDriver => 'Looking for a driver...'; - - @override - String get cancelSearch => 'Cancel search'; - - @override - String get driverAccepted => 'Your driver accepted'; - - @override - String get driverArriving => 'Driver is on the way'; - - @override - String get driverArrived => 'Your driver has arrived'; - - @override - String get rideInProgress => 'Ride in progress'; - - @override - String get rideCompleted => 'Ride completed'; - - @override - String get rateDriver => 'Rate your driver'; - - @override - String get tripFare => 'Trip fare'; - - @override - String get waitingFee => 'Waiting fee'; - - @override - String get discount => 'Discount'; - - @override - String get paymentMethod => 'Payment method'; - - @override - String get total => 'Total'; - - @override - String get submitRating => 'Submit rating'; - - @override - String get skipRating => 'Skip'; - - @override - String get freeWaitMinutes => 'Free wait minutes'; - - @override - String get minutes => 'minutes'; - - @override - String get callDriver => 'Call driver'; - - @override - String get chatWithDriver => 'Chat with driver'; - - @override - String get shareTrip => 'Share trip'; - - @override - String get emergencySOS => 'Emergency SOS'; - - @override - String get plateNumber => 'Plate number'; - - @override - String get vehicleInfo => 'Vehicle info'; - - @override - String get driverRating => 'Driver rating'; - - @override - String get eta => 'Estimated arrival'; - - @override - String get km => 'km'; - - @override - String get min => 'min'; - - @override - String get searchTimeout => - 'No drivers available right now. Please try again'; - - @override - String get goOnline => 'Go online'; - - @override - String get goOffline => 'Go offline'; - - @override - String get online => 'Online'; - - @override - String get offline => 'Offline'; - - @override - String get accept => 'Accept'; - - @override - String get reject => 'Reject'; - - @override - String get offersAvailable => 'offers available'; - - @override - String get tripAssigned => 'New trip assigned'; - - @override - String get onTheWay => 'On my way'; - - @override - String get arrivedAtPickup => 'I\'ve arrived'; - - @override - String get startTrip => 'Start trip'; - - @override - String get completeTrip => 'Complete trip'; - - @override - String get tripInProgress => 'Trip in progress'; - - @override - String get tripCompleted => 'Trip completed'; - - @override - String get cancelTrip => 'Cancel trip'; - - @override - String get cancelTripConfirm => 'Are you sure you want to cancel this trip?'; - - @override - String get yes => 'Yes'; - - @override - String get no => 'No'; - - @override - String get callClient => 'Call client'; - - @override - String get chat => 'Chat'; - - @override - String get trip => 'Trip'; - - @override - String get anonymous => 'Driver'; - - @override - String get noMessagesYet => 'No messages yet'; - - @override - String get typeMessage => 'Type a message...'; -} diff --git a/apps/driver-archive-cubit/lib/core/router.dart b/apps/driver-archive-cubit/lib/core/router.dart deleted file mode 100644 index 22f17e6..0000000 --- a/apps/driver-archive-cubit/lib/core/router.dart +++ /dev/null @@ -1,64 +0,0 @@ -import 'dart:async'; -import 'package:flutter/widgets.dart'; -import 'package:go_router/go_router.dart'; -import 'package:flutter_bloc/flutter_bloc.dart'; -import '../features/auth/cubit/auth_cubit.dart'; -import '../features/auth/cubit/auth_state.dart'; -import '../features/auth/view/phone_screen.dart'; -import '../features/auth/view/otp_screen.dart'; -import '../features/home/view/home_screen.dart'; -import '../features/trip/bloc/driver_trip_bloc.dart'; -import '../features/trip/view/driver_trip_screen.dart'; -import '../features/trip/view/driver_chat_screen.dart'; -import '../core/di.dart'; - -GoRouter buildRouter(AuthCubit auth) { - return GoRouter( - initialLocation: '/phone', - refreshListenable: _StreamRefresh(auth.stream), - redirect: (context, state) { - final status = auth.state.status; - final loc = state.matchedLocation; - final onAuthPages = loc == '/phone' || loc == '/otp'; - - if (status == AuthStatus.authenticated) { - return onAuthPages ? '/home' : null; - } - if (status == AuthStatus.codeSent && loc == '/phone') return '/otp'; - if (status != AuthStatus.authenticated && !onAuthPages) return '/phone'; - return null; - }, - routes: [ - GoRoute(path: '/phone', builder: (_, __) => const PhoneScreen()), - GoRoute(path: '/otp', builder: (_, __) => const OtpScreen()), - GoRoute(path: '/home', builder: (_, __) => const HomeScreen()), - GoRoute( - path: '/trip', - builder: (_, __) => BlocProvider.value( - value: getIt(), - child: const DriverTripScreen(), - ), - ), - GoRoute( - path: '/chat/:tripId', - builder: (context, state) { - final tripId = state.pathParameters['tripId']!; - return DriverChatScreen(tripId: tripId); - }, - ), - ], - ); -} - -class _StreamRefresh extends ChangeNotifier { - late final StreamSubscription _sub; - _StreamRefresh(Stream stream) { - notifyListeners(); - _sub = stream.asBroadcastStream().listen((_) => notifyListeners()); - } - @override - void dispose() { - _sub.cancel(); - super.dispose(); - } -} diff --git a/apps/driver-archive-cubit/lib/core/storage/token_store.dart b/apps/driver-archive-cubit/lib/core/storage/token_store.dart deleted file mode 100644 index e091f41..0000000 --- a/apps/driver-archive-cubit/lib/core/storage/token_store.dart +++ /dev/null @@ -1,15 +0,0 @@ -import 'package:flutter_secure_storage/flutter_secure_storage.dart'; - -/// تخزين آمن للتوكنات (access + refresh). -class TokenStore { - final FlutterSecureStorage _s = const FlutterSecureStorage(); - - Future save(String access, String refresh) async { - await _s.write(key: 'access_token', value: access); - await _s.write(key: 'refresh_token', value: refresh); - } - - Future access() => _s.read(key: 'access_token'); - Future refresh() => _s.read(key: 'refresh_token'); - Future clear() => _s.deleteAll(); -} diff --git a/apps/driver-archive-cubit/lib/core/ui/empty_view.dart b/apps/driver-archive-cubit/lib/core/ui/empty_view.dart deleted file mode 100644 index c79efc8..0000000 --- a/apps/driver-archive-cubit/lib/core/ui/empty_view.dart +++ /dev/null @@ -1,39 +0,0 @@ -import 'package:flutter/material.dart'; -import '../design/tokens.dart'; - -/// حالة اللاشيء — رسالة + أيقونة. -/// docs/26 §7 -class EmptyView extends StatelessWidget { - const EmptyView({ - super.key, - this.icon = Icons.inbox_rounded, - this.message, - }); - - final IconData icon; - final String? message; - - @override - Widget build(BuildContext context) { - final cs = Theme.of(context).colorScheme; - return Center( - child: Padding( - padding: const EdgeInsets.all(T.s32), - child: Column( - mainAxisSize: MainAxisSize.min, - children: [ - Icon(icon, size: 64, color: cs.onSurfaceVariant.withValues(alpha: 0.4)), - const SizedBox(height: T.s16), - Text( - message ?? 'لا توجد عناصر بعد', - style: Theme.of(context).textTheme.bodyLarge?.copyWith( - color: cs.onSurfaceVariant, - ), - textAlign: TextAlign.center, - ), - ], - ), - ), - ); - } -} diff --git a/apps/driver-archive-cubit/lib/core/ui/error_view.dart b/apps/driver-archive-cubit/lib/core/ui/error_view.dart deleted file mode 100644 index 8c69850..0000000 --- a/apps/driver-archive-cubit/lib/core/ui/error_view.dart +++ /dev/null @@ -1,48 +0,0 @@ -import 'package:flutter/material.dart'; -import '../design/tokens.dart'; - -/// حالة الخطأ — رسالة بالعربية + زر إعادة المحاولة. -/// docs/26 §7 -class ErrorView extends StatelessWidget { - const ErrorView({ - super.key, - this.message, - this.onRetry, - }); - - final String? message; - final VoidCallback? onRetry; - - @override - Widget build(BuildContext context) { - final cs = Theme.of(context).colorScheme; - return Center( - child: Padding( - padding: const EdgeInsets.all(T.s32), - child: Column( - mainAxisSize: MainAxisSize.min, - children: [ - Icon(Icons.error_outline_rounded, - size: 64, color: cs.error.withValues(alpha: 0.6)), - const SizedBox(height: T.s16), - Text( - message ?? 'حدث خطأ ما', - style: Theme.of(context).textTheme.bodyLarge?.copyWith( - color: cs.onSurface, - ), - textAlign: TextAlign.center, - ), - if (onRetry != null) ...[ - const SizedBox(height: T.s16), - FilledButton.icon( - onPressed: onRetry, - icon: const Icon(Icons.refresh_rounded, size: 20), - label: const Text('أعد المحاولة'), - ), - ], - ], - ), - ), - ); - } -} diff --git a/apps/driver-archive-cubit/lib/core/ui/skeleton.dart b/apps/driver-archive-cubit/lib/core/ui/skeleton.dart deleted file mode 100644 index ffb5487..0000000 --- a/apps/driver-archive-cubit/lib/core/ui/skeleton.dart +++ /dev/null @@ -1,104 +0,0 @@ -import 'package:flutter/material.dart'; -import '../design/tokens.dart'; - -/// هيكل التحميل — تأثير نبض على عناصر مستوحاة من الشاشة الفعلية. -/// docs/26 §7 -class Skeleton extends StatelessWidget { - const Skeleton({super.key}); - - @override - Widget build(BuildContext context) { - final cs = Theme.of(context).colorScheme; - final baseColor = cs.surfaceContainerHighest; - final highlightColor = cs.surfaceContainerHigh; - - return Padding( - padding: const EdgeInsets.all(T.pagePadding), - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - _PulseBox(width: double.infinity, height: 200, base: baseColor, highlight: highlightColor), - const SizedBox(height: T.s16), - _PulseBox(width: 200, height: 20, base: baseColor, highlight: highlightColor), - const SizedBox(height: T.s12), - _PulseBox(width: 140, height: 16, base: baseColor, highlight: highlightColor), - const SizedBox(height: T.s24), - Row( - children: [ - _PulseBox(width: 48, height: 48, base: baseColor, highlight: highlightColor, radius: T.rCircle), - const SizedBox(width: T.s12), - Expanded( - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - _PulseBox(width: double.infinity, height: 16, base: baseColor, highlight: highlightColor), - const SizedBox(height: T.s8), - _PulseBox(width: 120, height: 14, base: baseColor, highlight: highlightColor), - ], - ), - ), - ], - ), - ], - ), - ); - } -} - -class _PulseBox extends StatefulWidget { - const _PulseBox({ - required this.width, - required this.height, - required this.base, - required this.highlight, - this.radius = 8, - }); - - final double width; - final double height; - final Color base; - final Color highlight; - final double radius; - - @override - State<_PulseBox> createState() => _PulseBoxState(); -} - -class _PulseBoxState extends State<_PulseBox> - with SingleTickerProviderStateMixin { - late final AnimationController _ctrl; - late final Animation _anim; - - @override - void initState() { - super.initState(); - _ctrl = AnimationController(vsync: this, duration: const Duration(milliseconds: 1200)) - ..repeat(); - _anim = Tween(begin: 0, end: 1).animate( - CurvedAnimation(parent: _ctrl, curve: Curves.easeInOut), - ); - } - - @override - void dispose() { - _ctrl.dispose(); - super.dispose(); - } - - @override - Widget build(BuildContext context) { - return AnimatedBuilder( - animation: _anim, - builder: (_, __) { - return Container( - width: widget.width, - height: widget.height, - decoration: BoxDecoration( - color: Color.lerp(widget.base, widget.highlight, _anim.value), - borderRadius: BorderRadius.circular(widget.radius), - ), - ); - }, - ); - } -} diff --git a/apps/driver-archive-cubit/lib/core/ui/status_banner.dart b/apps/driver-archive-cubit/lib/core/ui/status_banner.dart deleted file mode 100644 index 855d846..0000000 --- a/apps/driver-archive-cubit/lib/core/ui/status_banner.dart +++ /dev/null @@ -1,51 +0,0 @@ -import 'package:flutter/material.dart'; -import '../design/tokens.dart'; - -/// شريط حالة الرحلة الحي. -/// docs/26 §7 -class StatusBanner extends StatelessWidget { - const StatusBanner({ - super.key, - required this.label, - this.color, - this.icon, - }); - - final String label; - final Color? color; - final IconData? icon; - - @override - Widget build(BuildContext context) { - final cs = Theme.of(context).colorScheme; - final effectiveColor = color ?? cs.primary; - - return Container( - width: double.infinity, - padding: const EdgeInsets.symmetric( - horizontal: T.s16, - vertical: T.s12, - ), - decoration: BoxDecoration( - color: effectiveColor.withValues(alpha: 0.1), - borderRadius: BorderRadius.circular(T.r8), - ), - child: Row( - children: [ - if (icon != null) ...[ - Icon(icon, color: effectiveColor, size: T.iconSm), - const SizedBox(width: T.s8), - ], - Expanded( - child: Text( - label, - style: Theme.of(context).textTheme.labelLarge?.copyWith( - color: effectiveColor, - ), - ), - ), - ], - ), - ); - } -} diff --git a/apps/driver-archive-cubit/lib/core/ui/tripz_button.dart b/apps/driver-archive-cubit/lib/core/ui/tripz_button.dart deleted file mode 100644 index 2585f7e..0000000 --- a/apps/driver-archive-cubit/lib/core/ui/tripz_button.dart +++ /dev/null @@ -1,83 +0,0 @@ -import 'package:flutter/material.dart'; -import '../design/tokens.dart'; - -/// زر موحّد: primary (معبّأ) · secondary (محدّد) · text — مع حالة تحميل داخلية. -/// docs/26 §7 -enum TripzButtonStyle { primary, secondary, text } - -class TripzButton extends StatelessWidget { - const TripzButton({ - super.key, - required this.label, - this.onPressed, - this.style = TripzButtonStyle.primary, - this.loading = false, - this.icon, - this.fullWidth = true, - }); - - final String label; - final VoidCallback? onPressed; - final TripzButtonStyle style; - final bool loading; - final IconData? icon; - final bool fullWidth; - - @override - Widget build(BuildContext context) { - final theme = Theme.of(context); - final cs = theme.colorScheme; - final labelStyle = theme.textTheme.labelLarge; - - final effectiveOnPressed = loading ? null : onPressed; - - switch (style) { - case TripzButtonStyle.primary: - return SizedBox( - width: fullWidth ? double.infinity : null, - height: T.buttonHeight, - child: FilledButton( - onPressed: effectiveOnPressed, - child: _buildChild(cs.primary, labelStyle), - ), - ); - case TripzButtonStyle.secondary: - return SizedBox( - width: fullWidth ? double.infinity : null, - height: T.buttonHeight, - child: OutlinedButton( - onPressed: effectiveOnPressed, - child: _buildChild(cs.primary, labelStyle), - ), - ); - case TripzButtonStyle.text: - return TextButton( - onPressed: effectiveOnPressed, - child: _buildChild(cs.primary, labelStyle), - ); - } - } - - Widget _buildChild(Color color, TextStyle? style) { - if (loading) { - return const SizedBox( - height: 22, - width: 22, - child: CircularProgressIndicator(strokeWidth: 2), - ); - } - - if (icon != null) { - return Row( - mainAxisSize: MainAxisSize.min, - children: [ - Icon(icon, size: 20), - const SizedBox(width: T.s8), - Text(label, style: style), - ], - ); - } - - return Text(label, style: style); - } -} diff --git a/apps/driver-archive-cubit/lib/core/ui/tripz_card.dart b/apps/driver-archive-cubit/lib/core/ui/tripz_card.dart deleted file mode 100644 index c0f669f..0000000 --- a/apps/driver-archive-cubit/lib/core/ui/tripz_card.dart +++ /dev/null @@ -1,48 +0,0 @@ -import 'package:flutter/material.dart'; -import '../design/tokens.dart'; - -/// بطاقة موحّدة: رحلة / سائق / محفظة — زوايا 12، حشوة 16. -/// docs/26 §7 -class TripzCard extends StatelessWidget { - const TripzCard({ - super.key, - required this.child, - this.padding, - this.onTap, - this.color, - this.borderColor, - }); - - final Widget child; - final EdgeInsetsGeometry? padding; - final VoidCallback? onTap; - final Color? color; - final Color? borderColor; - - @override - Widget build(BuildContext context) { - final card = Card( - color: color, - shape: RoundedRectangleBorder( - borderRadius: BorderRadius.circular(T.r12), - side: borderColor != null - ? BorderSide(color: borderColor!) - : BorderSide.none, - ), - child: Padding( - padding: padding ?? const EdgeInsets.all(T.pagePadding), - child: child, - ), - ); - - if (onTap != null) { - return InkWell( - onTap: onTap, - borderRadius: BorderRadius.circular(T.r12), - child: card, - ); - } - - return card; - } -} diff --git a/apps/driver-archive-cubit/lib/core/ui/tripz_scaffold.dart b/apps/driver-archive-cubit/lib/core/ui/tripz_scaffold.dart deleted file mode 100644 index 8cd7c6e..0000000 --- a/apps/driver-archive-cubit/lib/core/ui/tripz_scaffold.dart +++ /dev/null @@ -1,103 +0,0 @@ -import 'package:flutter/material.dart'; -import '../design/tokens.dart'; -import 'empty_view.dart'; -import 'error_view.dart'; -import 'skeleton.dart'; - -/// السكافولد الموحّد — كل شاشة في التطبيق تُبنى داخله. -/// يحوّل `status` من Cubit/Bloc إلى: skeleton / error / empty / محتوى. -/// docs/26 §6 -class TripzScaffold extends StatelessWidget { - const TripzScaffold({ - super.key, - this.title, - this.status, - this.onRetry, - this.empty, - this.bottomAction, - this.actions, - this.showBackButton = false, - this.onBack, - this.safeAreaTop = true, - this.safeAreaBottom = true, - this.padding = true, - this.backgroundColor, - required this.child, - }); - - final String? title; - final Enum? status; - final VoidCallback? onRetry; - final Widget? empty; - final Widget? bottomAction; - final List? actions; - final bool showBackButton; - final VoidCallback? onBack; - final bool safeAreaTop; - final bool safeAreaBottom; - final bool padding; - final Color? backgroundColor; - final Widget child; - - @override - Widget build(BuildContext context) { - final theme = Theme.of(context); - final cs = theme.colorScheme; - - return Scaffold( - backgroundColor: backgroundColor ?? cs.surface, - appBar: title != null - ? AppBar( - title: Text(title!), - leading: showBackButton - ? IconButton( - icon: const Icon(Icons.arrow_back_ios_new_rounded, - size: 20), - onPressed: onBack ?? () => Navigator.maybePop(context), - ) - : null, - actions: actions, - ) - : null, - body: SafeArea( - top: safeAreaTop, - bottom: safeAreaBottom, - child: _buildBody(context), - ), - bottomNavigationBar: bottomAction != null - ? Padding( - padding: EdgeInsets.fromLTRB( - T.pagePadding, - 0, - T.pagePadding, - MediaQuery.of(context).viewInsets.bottom > 0 - ? MediaQuery.of(context).viewInsets.bottom + 8 - : T.pagePadding, - ), - child: bottomAction, - ) - : null, - ); - } - - Widget _buildBody(BuildContext context) { - if (status != null) { - if (_isError) return ErrorView(onRetry: onRetry); - if (_isLoading) return const Skeleton(); - if (_isEmpty) return empty ?? const EmptyView(); - } - - return padding - ? Padding( - padding: const EdgeInsets.all(T.pagePadding), - child: child, - ) - : child; - } - - bool get _isLoading => status != null && status!.name == 'loading'; - - bool get _isError => status != null && status!.name == 'error'; - - bool get _isEmpty => status != null && status!.name == 'empty'; -} diff --git a/apps/driver-archive-cubit/lib/core/ui/tripz_sheet.dart b/apps/driver-archive-cubit/lib/core/ui/tripz_sheet.dart deleted file mode 100644 index 69e09b3..0000000 --- a/apps/driver-archive-cubit/lib/core/ui/tripz_sheet.dart +++ /dev/null @@ -1,74 +0,0 @@ -import 'package:flutter/material.dart'; -import '../design/tokens.dart'; - -/// كل bottom sheet في التطبيق يمرّ من هنا: مقبض علوي، زوايا 24. -/// docs/26 §7 -class TripzSheet extends StatelessWidget { - const TripzSheet({ - super.key, - this.title, - this.child, - this.bottomAction, - this.isScrollControlled = true, - }); - - final String? title; - final Widget? child; - final Widget? bottomAction; - final bool isScrollControlled; - - /// مساعد للاستدعاء بأمر واحد - static Future show( - BuildContext context, { - String? title, - Widget? child, - Widget? bottomAction, - bool isScrollControlled = true, - }) { - return showModalBottomSheet( - context: context, - isScrollControlled: isScrollControlled, - useSafeArea: true, - builder: (_) => TripzSheet( - title: title, - child: child, - bottomAction: bottomAction, - ), - ); - } - - @override - Widget build(BuildContext context) { - final theme = Theme.of(context); - final bottomPadding = MediaQuery.of(context).viewInsets.bottom; - - return Padding( - padding: EdgeInsets.fromLTRB(0, 0, 0, bottomPadding), - child: SafeArea( - child: Padding( - padding: const EdgeInsets.symmetric(horizontal: T.pagePadding), - child: Column( - mainAxisSize: MainAxisSize.min, - crossAxisAlignment: CrossAxisAlignment.stretch, - children: [ - if (title != null) ...[ - Text( - title!, - style: theme.textTheme.titleMedium, - textAlign: TextAlign.center, - ), - const SizedBox(height: T.s16), - ], - if (child != null) child!, - if (bottomAction != null) ...[ - const SizedBox(height: T.s16), - bottomAction!, - const SizedBox(height: T.s8), - ], - ], - ), - ), - ), - ); - } -} diff --git a/apps/driver-archive-cubit/lib/core/ui/tripz_text_field.dart b/apps/driver-archive-cubit/lib/core/ui/tripz_text_field.dart deleted file mode 100644 index c790992..0000000 --- a/apps/driver-archive-cubit/lib/core/ui/tripz_text_field.dart +++ /dev/null @@ -1,86 +0,0 @@ -import 'package:flutter/material.dart'; -import '../design/tokens.dart'; - -/// حقل إدخال موحّد: هاتف · OTP · بحث — رسالة الخطأ تحته بالعربية. -/// docs/26 §7 -class TripzTextField extends StatelessWidget { - const TripzTextField({ - super.key, - this.controller, - this.label, - this.hint, - this.prefix, - this.suffix, - this.keyboardType, - this.obscureText = false, - this.errorText, - this.enabled = true, - this.onChanged, - this.onSubmitted, - this.autofocus = false, - this.textAlign, - this.maxLength, - this.contentPadding, - }); - - final TextEditingController? controller; - final String? label; - final String? hint; - final Widget? prefix; - final Widget? suffix; - final TextInputType? keyboardType; - final bool obscureText; - final String? errorText; - final bool enabled; - final ValueChanged? onChanged; - final ValueChanged? onSubmitted; - final bool autofocus; - final TextAlign? textAlign; - final int? maxLength; - final EdgeInsetsGeometry? contentPadding; - - @override - Widget build(BuildContext context) { - final cs = Theme.of(context).colorScheme; - - return Column( - mainAxisSize: MainAxisSize.min, - crossAxisAlignment: CrossAxisAlignment.stretch, - children: [ - SizedBox( - height: T.inputHeight, - child: TextField( - controller: controller, - keyboardType: keyboardType, - obscureText: obscureText, - enabled: enabled, - onChanged: onChanged, - onSubmitted: onSubmitted, - autofocus: autofocus, - textAlign: textAlign ?? TextAlign.start, - maxLength: maxLength, - style: Theme.of(context).textTheme.bodyLarge, - decoration: InputDecoration( - labelText: label, - hintText: hint, - prefixIcon: prefix, - suffixIcon: suffix, - counterText: '', - contentPadding: contentPadding ?? - const EdgeInsets.symmetric(horizontal: 16, vertical: 14), - ), - ), - ), - if (errorText != null) ...[ - const SizedBox(height: 4), - Text( - errorText!, - style: Theme.of(context).textTheme.bodySmall?.copyWith( - color: cs.error, - ), - ), - ], - ], - ); - } -} diff --git a/apps/driver-archive-cubit/lib/features/auth/cubit/auth_cubit.dart b/apps/driver-archive-cubit/lib/features/auth/cubit/auth_cubit.dart deleted file mode 100644 index bf09594..0000000 --- a/apps/driver-archive-cubit/lib/features/auth/cubit/auth_cubit.dart +++ /dev/null @@ -1,46 +0,0 @@ -import 'package:flutter_bloc/flutter_bloc.dart'; -import '../data/auth_repository.dart'; -import 'auth_state.dart'; - -class AuthCubit extends Cubit { - final AuthRepository _repo; - - AuthCubit(this._repo) : super(const AuthState()); - - Future checkAuth() async { - final user = await _repo.me(); - emit(state.copyWith( - status: user != null ? AuthStatus.authenticated : AuthStatus.unauthenticated, - user: user, - )); - } - - Future sendOtp(String phone) async { - if (phone.trim().isEmpty) { - emit(state.copyWith(status: AuthStatus.error, error: 'أدخل رقم الهاتف')); - return; - } - try { - emit(state.copyWith(status: AuthStatus.authenticating, phone: phone.trim())); - await _repo.sendOtp(phone.trim()); - emit(state.copyWith(status: AuthStatus.codeSent, phone: phone.trim())); - } catch (_) { - emit(state.copyWith(status: AuthStatus.error, error: 'تعذّر إرسال الرمز')); - } - } - - Future verify(String code) async { - try { - emit(state.copyWith(status: AuthStatus.authenticating)); - final user = await _repo.verify(state.phone, code.trim()); - emit(state.copyWith(status: AuthStatus.authenticated, user: user)); - } catch (_) { - emit(state.copyWith(status: AuthStatus.error, error: 'رمز غير صحيح')); - } - } - - Future logout() async { - await _repo.logout(); - emit(const AuthState(status: AuthStatus.unauthenticated)); - } -} diff --git a/apps/driver-archive-cubit/lib/features/auth/cubit/auth_state.dart b/apps/driver-archive-cubit/lib/features/auth/cubit/auth_state.dart deleted file mode 100644 index c02f18b..0000000 --- a/apps/driver-archive-cubit/lib/features/auth/cubit/auth_state.dart +++ /dev/null @@ -1,42 +0,0 @@ -import 'package:equatable/equatable.dart'; -import '../data/auth_repository.dart'; - -enum AuthStatus { - unknown, - unauthenticated, - codeSent, - authenticating, - authenticated, - error, -} - -class AuthState extends Equatable { - final AuthStatus status; - final String phone; - final AppUser? user; - final String? error; - - const AuthState({ - this.status = AuthStatus.unknown, - this.phone = '', - this.user, - this.error, - }); - - AuthState copyWith({ - AuthStatus? status, - String? phone, - AppUser? user, - String? error, - }) { - return AuthState( - status: status ?? this.status, - phone: phone ?? this.phone, - user: user ?? this.user, - error: error, - ); - } - - @override - List get props => [status, phone, user, error]; -} diff --git a/apps/driver-archive-cubit/lib/features/auth/data/auth_repository.dart b/apps/driver-archive-cubit/lib/features/auth/data/auth_repository.dart deleted file mode 100644 index bef673d..0000000 --- a/apps/driver-archive-cubit/lib/features/auth/data/auth_repository.dart +++ /dev/null @@ -1,53 +0,0 @@ -import 'package:dio/dio.dart'; -import '../../../core/api/api_client.dart'; -import '../../../core/storage/token_store.dart'; - -class AppUser { - final String id; - final String phone; - final String? name; - final String role; - - AppUser({required this.id, required this.phone, this.name, required this.role}); - - factory AppUser.fromJson(Map j) => AppUser( - id: j['id'] as String, - phone: (j['phone'] ?? '') as String, - name: j['name'] as String?, - role: (j['role'] ?? 'driver') as String, - ); -} - -class AuthRepository { - final ApiClient _api; - final TokenStore _store; - - AuthRepository(this._api, this._store); - - Future sendOtp(String phone) async { - await _api.dio.post('/auth/send-otp', data: {'phone': phone}); - } - - Future verify(String phone, String code) async { - final r = await _api.dio.post( - '/auth/verify-otp', - data: {'phone': phone, 'code': code}, - ); - await _store.save( - r.data['access_token'] as String, - r.data['refresh_token'] as String, - ); - return AppUser.fromJson(Map.from(r.data['user'] as Map)); - } - - Future me() async { - try { - final r = await _api.dio.get('/users/me'); - return AppUser.fromJson(Map.from(r.data as Map)); - } on DioException { - return null; - } - } - - Future logout() => _store.clear(); -} diff --git a/apps/driver-archive-cubit/lib/features/auth/view/otp_screen.dart b/apps/driver-archive-cubit/lib/features/auth/view/otp_screen.dart deleted file mode 100644 index b777207..0000000 --- a/apps/driver-archive-cubit/lib/features/auth/view/otp_screen.dart +++ /dev/null @@ -1,78 +0,0 @@ -import 'package:flutter/material.dart'; -import 'package:flutter_bloc/flutter_bloc.dart'; -import 'package:go_router/go_router.dart'; -import 'package:driver/core/l10n/app_localizations.dart'; -import '../cubit/auth_cubit.dart'; -import '../cubit/auth_state.dart'; -import '../../../core/ui/tripz_scaffold.dart'; -import '../../../core/ui/tripz_button.dart'; -import '../../../core/ui/tripz_text_field.dart'; - -class OtpScreen extends StatefulWidget { - const OtpScreen({super.key}); - @override - State createState() => _OtpScreenState(); -} - -class _OtpScreenState extends State { - final _controller = TextEditingController(); - - @override - void dispose() { - _controller.dispose(); - super.dispose(); - } - - @override - Widget build(BuildContext context) { - final l10n = AppLocalizations.of(context)!; - - return TripzScaffold( - showBackButton: true, - onBack: () => context.go('/phone'), - child: BlocConsumer( - listener: (context, state) { - if (state.status == AuthStatus.error && state.error != null) { - ScaffoldMessenger.of(context).showSnackBar( - SnackBar(content: Text(state.error!)), - ); - } - }, - builder: (context, state) { - return Column( - crossAxisAlignment: CrossAxisAlignment.stretch, - children: [ - const SizedBox(height: 24), - Text( - l10n.otpTitle, - style: Theme.of(context).textTheme.titleLarge, - ), - const SizedBox(height: 8), - Text( - l10n.otpSentTo(state.phone), - style: Theme.of(context).textTheme.bodyMedium?.copyWith( - color: Theme.of(context).colorScheme.onSurfaceVariant, - ), - ), - const SizedBox(height: 28), - TripzTextField( - controller: _controller, - label: l10n.otpLabel, - keyboardType: TextInputType.number, - textAlign: TextAlign.center, - maxLength: 6, - ), - const SizedBox(height: 20), - TripzButton( - label: l10n.confirm, - loading: state.status == AuthStatus.authenticating, - onPressed: () => - context.read().verify(_controller.text), - ), - ], - ); - }, - ), - ); - } -} diff --git a/apps/driver-archive-cubit/lib/features/auth/view/phone_screen.dart b/apps/driver-archive-cubit/lib/features/auth/view/phone_screen.dart deleted file mode 100644 index 9bc3fb7..0000000 --- a/apps/driver-archive-cubit/lib/features/auth/view/phone_screen.dart +++ /dev/null @@ -1,77 +0,0 @@ -import 'package:flutter/material.dart'; -import 'package:flutter_bloc/flutter_bloc.dart'; -import 'package:driver/core/l10n/app_localizations.dart'; -import '../cubit/auth_cubit.dart'; -import '../cubit/auth_state.dart'; -import '../../../core/ui/tripz_scaffold.dart'; -import '../../../core/ui/tripz_button.dart'; -import '../../../core/ui/tripz_text_field.dart'; - -class PhoneScreen extends StatefulWidget { - const PhoneScreen({super.key}); - @override - State createState() => _PhoneScreenState(); -} - -class _PhoneScreenState extends State { - final _controller = TextEditingController(); - - @override - void dispose() { - _controller.dispose(); - super.dispose(); - } - - @override - Widget build(BuildContext context) { - final l10n = AppLocalizations.of(context)!; - - return TripzScaffold( - safeAreaTop: true, - padding: true, - child: Column( - crossAxisAlignment: CrossAxisAlignment.stretch, - children: [ - const Spacer(flex: 2), - Text( - l10n.appName, - style: Theme.of(context).textTheme.headlineLarge, - ), - const SizedBox(height: 8), - Text( - l10n.phoneTitle, - style: Theme.of(context).textTheme.bodyLarge?.copyWith( - color: Theme.of(context).colorScheme.onSurfaceVariant, - ), - ), - const Spacer(), - TripzTextField( - controller: _controller, - label: l10n.phoneLabel, - hint: l10n.phoneHint, - keyboardType: TextInputType.phone, - ), - const SizedBox(height: 20), - BlocConsumer( - listener: (context, state) { - if (state.status == AuthStatus.error && state.error != null) { - ScaffoldMessenger.of(context).showSnackBar( - SnackBar(content: Text(state.error!)), - ); - } - }, - builder: (context, state) { - return TripzButton( - label: l10n.sendCode, - loading: state.status == AuthStatus.authenticating, - onPressed: () => - context.read().sendOtp(_controller.text), - ); - }, - ), - const Spacer(flex: 2), - ], - ), - ); - } -} diff --git a/apps/driver-archive-cubit/lib/features/home/cubit/driver_cubit.dart b/apps/driver-archive-cubit/lib/features/home/cubit/driver_cubit.dart deleted file mode 100644 index f3741cb..0000000 --- a/apps/driver-archive-cubit/lib/features/home/cubit/driver_cubit.dart +++ /dev/null @@ -1,118 +0,0 @@ -import 'dart:async'; -import 'package:equatable/equatable.dart'; -import 'package:flutter_bloc/flutter_bloc.dart'; -import '../data/driver_repository.dart'; -import '../data/driver_location_service.dart'; -import '../data/models/driver_profile_model.dart'; - -/// حالة DriverCubit. -class DriverState extends Equatable { - final DriverProfileModel? profile; - final bool loading; - final bool online; - final String? error; - - const DriverState({ - this.profile, - this.loading = true, - this.online = false, - this.error, - }); - - DriverState copyWith({ - DriverProfileModel? profile, - bool? loading, - bool? online, - String? error, - bool clearError = false, - }) { - return DriverState( - profile: profile ?? this.profile, - loading: loading ?? this.loading, - online: online ?? this.online, - error: clearError ? null : (error ?? this.error), - ); - } - - @override - List get props => [profile, loading, online, error]; -} - -/// Cubit مُتّصل/مُنقطع — يدير ملف السائق وتبديل الحالة وموقع الخلفية. -/// -/// يُقدّم: -/// - جلب الملف عند بدء التشغيل -/// - تبديل الحالة (online/offline) -/// - بدء/إيقاف تتبع الموقع عند التنشيط -class DriverCubit extends Cubit { - final DriverRepository _repo; - DriverLocationService? _locationService; - Timer? _heartbeatTimer; - - DriverCubit(this._repo) : super(const DriverState(loading: true)); - - /// جلب ملف السائق وتحديد الحالة الأولية. - Future loadProfile() async { - try { - final profile = await _repo.getProfile(); - if (profile != null) { - emit(state.copyWith( - profile: profile, - online: profile.online, - loading: false, - )); - // إذا كان مُتصلاً مسبقاً، أعد بدء التتبع. - if (profile.online) { - _startLocationTracking(); - } - } else { - emit(state.copyWith(loading: false)); - } - } catch (e) { - emit(state.copyWith(loading: false, error: e.toString())); - } - } - - /// تبديل الحالة (مُتصل/مُنقطع). - Future toggleOnline() async { - final newOnline = !state.online; - emit(state.copyWith(online: newOnline)); - - final result = await _repo.setOnline(newOnline); - if (!result) { - // فشل — أعد الحالة السابقة. - emit(state.copyWith(online: !newOnline)); - return; - } - - if (newOnline) { - _startLocationTracking(); - } else { - _stopLocationTracking(); - } - } - - /// بدء تتبع الموقع. - void _startLocationTracking() { - if (_locationService?.isActive == true) return; - - _locationService = DriverLocationService((lat, lng, {heading, speed}) async { - await _repo.sendLocation(lat: lat, lng: lng, heading: heading, speed: speed); - }); - _locationService!.start(); - } - - /// إيقاف تتبع الموقع. - void _stopLocationTracking() { - _locationService?.stop(); - _locationService = null; - _heartbeatTimer?.cancel(); - _heartbeatTimer = null; - } - - @override - Future close() { - _stopLocationTracking(); - return super.close(); - } -} diff --git a/apps/driver-archive-cubit/lib/features/home/data/driver_location_service.dart b/apps/driver-archive-cubit/lib/features/home/data/driver_location_service.dart deleted file mode 100644 index 7d522b4..0000000 --- a/apps/driver-archive-cubit/lib/features/home/data/driver_location_service.dart +++ /dev/null @@ -1,91 +0,0 @@ -import 'dart:async'; -import 'package:geolocator/geolocator.dart'; - -/// خدمة موقع السائق — تتبع الموقع في الخلفية وإرساله للسيرفر. -/// -/// تتبع 3 ثوانٍ عند التنشيط، ثم إرسال كل دقيقتين (docs/23 §10). -/// تراعي حالة البطارية وتتوقف عند انخفاضها. -class DriverLocationService { - final Future Function(double lat, double lng, {double? heading, double? speed}) - _onLocationUpdate; - - StreamSubscription? _positionSub; - Timer? _heartbeatTimer; - bool _active = false; - - DriverLocationService(this._onLocationUpdate); - - bool get isActive => _active; - - /// بدء التتبع. - Future start() async { - if (_active) return; - - // تحقق من صلاحية الموقع. - var permission = await Geolocator.checkPermission(); - if (permission == LocationPermission.denied) { - permission = await Geolocator.requestPermission(); - if (permission == LocationPermission.denied || - permission == LocationPermission.deniedForever) { - return; - } - } - - _active = true; - - // أرسل الموقع فوراً. - _sendCurrentLocation(); - - // استمع لتحديثات الموقع كل 3 ثوانٍ. - _positionSub = Geolocator.getPositionStream( - locationSettings: const LocationSettings( - accuracy: LocationAccuracy.high, - distanceFilter: 15, // تحديث عند تغيير 15 متر - ), - ).listen((pos) { - _onLocationUpdate( - pos.latitude, - pos.longitude, - heading: pos.heading, - speed: pos.speed, - ); - }); - - // دفعة كل دقيقتين كحد أقصى. - _heartbeatTimer = Timer.periodic(const Duration(minutes: 2), (_) { - _sendCurrentLocation(); - }); - } - - /// إيقاف التتبع. - void stop() { - _active = false; - _positionSub?.cancel(); - _positionSub = null; - _heartbeatTimer?.cancel(); - _heartbeatTimer = null; - } - - /// إرسال الموقع الحالي مرة واحدة. - Future _sendCurrentLocation() async { - try { - final pos = await Geolocator.getCurrentPosition( - locationSettings: const LocationSettings( - accuracy: LocationAccuracy.high, - ), - ); - await _onLocationUpdate( - pos.latitude, - pos.longitude, - heading: pos.heading, - speed: pos.speed, - ); - } catch (_) { - // خطأ صامت — سيحاول مرة أخرى مع الدقيقة التالية. - } - } - - void dispose() { - stop(); - } -} diff --git a/apps/driver-archive-cubit/lib/features/home/data/driver_repository.dart b/apps/driver-archive-cubit/lib/features/home/data/driver_repository.dart deleted file mode 100644 index a142423..0000000 --- a/apps/driver-archive-cubit/lib/features/home/data/driver_repository.dart +++ /dev/null @@ -1,50 +0,0 @@ -import '../../../core/api/api_client.dart'; -import 'models/driver_profile_model.dart'; - -/// مستودع بيانات السائق — يُستخدم من DriverCubit. -class DriverRepository { - final ApiClient _api; - DriverRepository(this._api); - - /// `GET /drivers/me` — جلب ملف السائق. - Future getProfile() async { - try { - final r = await _api.dio.get('/drivers/me'); - return DriverProfileModel.fromJson(r.data as Map); - } catch (_) { - return null; - } - } - - /// `PATCH /drivers/status` — تبديل الحالة (مُتصل/مُنقطع). - Future setOnline(bool online) async { - try { - final r = await _api.dio.patch('/drivers/status', data: {'online': online}); - return r.data['online'] as bool? ?? online; - } catch (_) { - return false; - } - } - - /// `POST /drivers/location` — إرسال الموقع الحالي. - /// - /// يُعيد `true` إذا كان الموقع "مُهماً" (تغيير كبير حسب السيرفر). - Future sendLocation({ - required double lat, - required double lng, - double? heading, - double? speed, - }) async { - try { - final r = await _api.dio.post('/drivers/location', data: { - 'lat': lat, - 'lng': lng, - if (heading != null) 'heading': heading, - if (speed != null) 'speed': speed, - }); - return r.data['significant'] as bool? ?? false; - } catch (_) { - return false; - } - } -} diff --git a/apps/driver-archive-cubit/lib/features/home/data/models/driver_profile_model.dart b/apps/driver-archive-cubit/lib/features/home/data/models/driver_profile_model.dart deleted file mode 100644 index 21969e7..0000000 --- a/apps/driver-archive-cubit/lib/features/home/data/models/driver_profile_model.dart +++ /dev/null @@ -1,94 +0,0 @@ -import 'package:equatable/equatable.dart'; - -/// نموذج بيانات السائق — من `GET /drivers/me`. -class DriverProfileModel extends Equatable { - final String id; - final String phone; - final String? name; - final bool online; - final double? lat; - final double? lng; - final String? vehicleMake; - final String? vehicleModel; - final int? vehicleYear; - final String? vehicleColor; - final String? plateNumber; - final String? serviceClass; - final double? rating; - final int? totalTrips; - final int? creditBalance; - - const DriverProfileModel({ - required this.id, - required this.phone, - this.name, - this.online = false, - this.lat, - this.lng, - this.vehicleMake, - this.vehicleModel, - this.vehicleYear, - this.vehicleColor, - this.plateNumber, - this.serviceClass, - this.rating, - this.totalTrips, - this.creditBalance, - }); - - factory DriverProfileModel.fromJson(Map j) => - DriverProfileModel( - id: j['id'] as String, - phone: (j['phone'] ?? '') as String, - name: j['name'] as String?, - online: j['online'] as bool? ?? false, - lat: (j['lat'] as num?)?.toDouble(), - lng: (j['lng'] as num?)?.toDouble(), - vehicleMake: j['vehicleMake'] as String?, - vehicleModel: j['vehicleModel'] as String?, - vehicleYear: j['vehicleYear'] as int?, - vehicleColor: j['vehicleColor'] as String?, - plateNumber: j['plateNumber'] as String?, - serviceClass: j['serviceClass'] as String?, - rating: (j['rating'] as num?)?.toDouble(), - totalTrips: j['totalTrips'] as int?, - creditBalance: j['creditBalance'] as int?, - ); - - DriverProfileModel copyWith({ - String? name, - bool? online, - double? lat, - double? lng, - String? vehicleMake, - String? vehicleModel, - int? vehicleYear, - String? vehicleColor, - String? plateNumber, - String? serviceClass, - double? rating, - int? totalTrips, - int? creditBalance, - }) { - return DriverProfileModel( - id: id, - phone: phone, - name: name ?? this.name, - online: online ?? this.online, - lat: lat ?? this.lat, - lng: lng ?? this.lng, - vehicleMake: vehicleMake ?? this.vehicleMake, - vehicleModel: vehicleModel ?? this.vehicleModel, - vehicleYear: vehicleYear ?? this.vehicleYear, - vehicleColor: vehicleColor ?? this.vehicleColor, - plateNumber: plateNumber ?? this.plateNumber, - serviceClass: serviceClass ?? this.serviceClass, - rating: rating ?? this.rating, - totalTrips: totalTrips ?? this.totalTrips, - creditBalance: creditBalance ?? this.creditBalance, - ); - } - - @override - List get props => [id, phone, name, online, vehicleMake, vehicleModel, plateNumber]; -} diff --git a/apps/driver-archive-cubit/lib/features/home/data/models/trip_offer_model.dart b/apps/driver-archive-cubit/lib/features/home/data/models/trip_offer_model.dart deleted file mode 100644 index f92c523..0000000 --- a/apps/driver-archive-cubit/lib/features/home/data/models/trip_offer_model.dart +++ /dev/null @@ -1,62 +0,0 @@ -import 'package:equatable/equatable.dart'; - -/// عرض رحلة وارد — من `trip:offer` عبر WebSocket. -/// -/// يحتوي على كل المعلومات التي يحتاجها السائق للقبول/الرفض. -/// المهلة الزمنية (`expiresAt`) تُدار من OffersBloc. -class TripOfferModel extends Equatable { - final String tripId; - final double pickupLat; - final double pickupLng; - final String? pickupAddress; - final double dropoffLat; - final double dropoffLng; - final String? dropoffAddress; - final double distance; - final num fare; - final String currency; - final int etaPickup; - final String vehicleClass; - final DateTime expiresAt; - - const TripOfferModel({ - required this.tripId, - required this.pickupLat, - required this.pickupLng, - this.pickupAddress, - required this.dropoffLat, - required this.dropoffLng, - this.dropoffAddress, - required this.distance, - required this.fare, - required this.currency, - required this.etaPickup, - required this.vehicleClass, - required this.expiresAt, - }); - - factory TripOfferModel.fromJson(Map j) => TripOfferModel( - tripId: j['tripId'] as String, - pickupLat: (j['pickup']?['lat'] ?? 0).toDouble(), - pickupLng: (j['pickup']?['lng'] ?? 0).toDouble(), - pickupAddress: j['pickup']?['address'] as String?, - dropoffLat: (j['dropoff']?['lat'] ?? 0).toDouble(), - dropoffLng: (j['dropoff']?['lng'] ?? 0).toDouble(), - dropoffAddress: j['dropoff']?['address'] as String?, - distance: (j['distance'] ?? 0).toDouble(), - fare: (j['fare'] ?? 0) as num, - currency: (j['currency'] ?? 'IQD') as String, - etaPickup: (j['etaPickup'] ?? 0) as int, - vehicleClass: (j['vehicleClass'] ?? '') as String, - expiresAt: DateTime.parse(j['expiresAt'] as String), - ); - - /// المسافة المنسقة (كم مع خانتين عشريتين). - String get formattedDistance => '${distance.toStringAsFixed(1)} km'; - - /// الأجرة المنسقة. - String get formattedFare => '$fare $currency'; - - @override - List get props => [tripId, pickupLat, pickupLng, fare, expiresAt]; -} diff --git a/apps/driver-archive-cubit/lib/features/home/view/home_screen.dart b/apps/driver-archive-cubit/lib/features/home/view/home_screen.dart deleted file mode 100644 index 48f32a8..0000000 --- a/apps/driver-archive-cubit/lib/features/home/view/home_screen.dart +++ /dev/null @@ -1,189 +0,0 @@ -import 'package:flutter/material.dart'; -import 'package:driver/core/l10n/app_localizations.dart'; -import 'package:intaleq_maps/intaleq_maps.dart'; -import 'package:driver/core/design/tokens.dart'; -import 'package:flutter_bloc/flutter_bloc.dart'; -import 'package:driver/features/home/cubit/driver_cubit.dart'; -import 'package:driver/features/offers/bloc/offers_bloc.dart'; -import 'widgets/driver_status_indicator.dart'; -import 'widgets/trip_offer_card.dart'; -import 'dart:async'; - -/// شاشة السائق الرئيسية — خريطة + مفتاح الاتصال/الانقطاع + overlay العروض. -class HomeScreen extends StatefulWidget { - const HomeScreen({super.key}); - - @override - State createState() => _HomeScreenState(); -} - -class _HomeScreenState extends State { - final Completer _mapController = Completer(); - - @override - Widget build(BuildContext context) { - final l10n = AppLocalizations.of(context)!; - final cs = Theme.of(context).colorScheme; - - return Scaffold( - body: Stack( - children: [ - // ── الخريطة ── - _buildMap(cs), - - // ── شريط الحالة العلوي ── - Positioned( - top: MediaQuery.of(context).padding.top + T.s8, - left: T.s16, - right: T.s16, - child: _buildTopBar(context, l10n, cs), - ), - - // ── مؤشر حالة السائق ── - Positioned( - bottom: T.s24, - left: T.s16, - right: T.s16, - child: const DriverStatusIndicator(), - ), - - // ── overlay العروض الواردة ── - const _OffersOverlay(), - ], - ), - ); - } - - Widget _buildMap(ColorScheme cs) { - return BlocBuilder( - builder: (context, state) { - final driverLat = state.profile?.lat ?? 33.3128; - final driverLng = state.profile?.lng ?? 44.3615; - - return IntaleqMap( - apiKey: '', - initialCameraPosition: CameraPosition( - target: LatLng(driverLat, driverLng), - zoom: 14, - ), - myLocationEnabled: true, - myLocationButtonEnabled: false, - zoomControlsEnabled: false, - onMapCreated: (controller) { - if (!_mapController.isCompleted) { - _mapController.complete(controller); - } - }, - ); - }, - ); - } - - Widget _buildTopBar(BuildContext context, AppLocalizations l10n, ColorScheme cs) { - return SafeArea( - child: Row( - children: [ - // زر القائمة - Container( - decoration: BoxDecoration( - color: cs.surface, - borderRadius: BorderRadius.circular(T.rCircle), - boxShadow: [ - BoxShadow( - color: Colors.black.withValues(alpha: 0.08), - blurRadius: 8, - offset: const Offset(0, 2), - ), - ], - ), - child: IconButton( - icon: const Icon(Icons.menu_rounded), - onPressed: () { - // TODO: Q4 drawer - }, - ), - ), - const Spacer(), - // معلومات السائق - Container( - padding: const EdgeInsets.symmetric( - horizontal: T.s12, - vertical: T.s8, - ), - decoration: BoxDecoration( - color: cs.surface, - borderRadius: BorderRadius.circular(T.r12), - boxShadow: [ - BoxShadow( - color: Colors.black.withValues(alpha: 0.08), - blurRadius: 8, - offset: const Offset(0, 2), - ), - ], - ), - child: Row( - children: [ - Icon(Icons.star_rounded, size: 18, color: Colors.amber[600]), - const SizedBox(width: T.s4), - Text( - '${context.read().state.profile?.rating?.toStringAsFixed(1) ?? "-"}', - style: Theme.of(context).textTheme.bodyMedium?.copyWith( - fontWeight: FontWeight.w600, - ), - ), - ], - ), - ), - ], - ), - ); - } -} - -/// overlay يعرض العروض الواردة كبطاقات في أسفل الشاشة. -class _OffersOverlay extends StatelessWidget { - const _OffersOverlay(); - - @override - Widget build(BuildContext context) { - return BlocBuilder( - builder: (context, state) { - if (!state.hasOffers) return const SizedBox.shrink(); - - return Positioned( - bottom: 100, - left: T.s16, - right: T.s16, - child: Column( - mainAxisSize: MainAxisSize.min, - children: [ - // عدد العروض - if (state.offers.length > 1) - Container( - margin: const EdgeInsets.only(bottom: T.s8), - padding: const EdgeInsets.symmetric( - horizontal: T.s12, - vertical: T.s4, - ), - decoration: BoxDecoration( - color: Theme.of(context).colorScheme.primary, - borderRadius: BorderRadius.circular(T.rCircle), - ), - child: Text( - '${state.offers.length} ${AppLocalizations.of(context)!.offersAvailable}', - style: Theme.of(context).textTheme.bodySmall?.copyWith( - color: Theme.of(context).colorScheme.onPrimary, - fontWeight: FontWeight.w600, - ), - ), - ), - - // العرض الأحدث - TripOfferCard(offer: state.offers.first), - ], - ), - ); - }, - ); - } -} diff --git a/apps/driver-archive-cubit/lib/features/home/view/widgets/driver_status_indicator.dart b/apps/driver-archive-cubit/lib/features/home/view/widgets/driver_status_indicator.dart deleted file mode 100644 index e9c961a..0000000 --- a/apps/driver-archive-cubit/lib/features/home/view/widgets/driver_status_indicator.dart +++ /dev/null @@ -1,133 +0,0 @@ -import 'package:flutter/material.dart'; -import 'package:driver/core/l10n/app_localizations.dart'; -import 'package:flutter_bloc/flutter_bloc.dart'; -import 'package:driver/core/design/tokens.dart'; -import 'package:driver/core/design/tripz_colors.dart'; -import 'package:driver/features/home/cubit/driver_cubit.dart'; - -/// مؤشر حالة السائق — يعرض "مُتصل" أو "مُنقطع" مع زر التبديل. -class DriverStatusIndicator extends StatelessWidget { - const DriverStatusIndicator({super.key}); - - @override - Widget build(BuildContext context) { - final l10n = AppLocalizations.of(context)!; - final cs = Theme.of(context).colorScheme; - - return BlocBuilder( - builder: (context, state) { - final isOnline = state.online; - - return Container( - padding: const EdgeInsets.symmetric( - horizontal: T.s16, - vertical: T.s12, - ), - decoration: BoxDecoration( - color: cs.surface, - borderRadius: BorderRadius.circular(T.r12), - boxShadow: [ - BoxShadow( - color: Colors.black.withValues(alpha: 0.1), - blurRadius: 12, - offset: const Offset(0, -4), - ), - ], - ), - child: Column( - mainAxisSize: MainAxisSize.min, - children: [ - // معلومات السائق - if (state.profile != null) - Padding( - padding: const EdgeInsets.only(bottom: T.s8), - child: Row( - children: [ - CircleAvatar( - radius: 20, - backgroundColor: cs.primaryContainer, - child: Icon(Icons.person, color: cs.onPrimaryContainer), - ), - const SizedBox(width: T.s12), - Expanded( - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Text( - state.profile!.name ?? l10n.anonymous, - style: Theme.of(context) - .textTheme - .bodyMedium - ?.copyWith( - fontWeight: FontWeight.w600, - ), - ), - if (state.profile!.vehicleMake != null) - Text( - '${state.profile!.vehicleMake} ${state.profile!.vehicleModel ?? ""} · ${state.profile!.plateNumber ?? ""}', - style: Theme.of(context) - .textTheme - .bodySmall - ?.copyWith( - color: cs.onSurfaceVariant, - ), - ), - ], - ), - ), - ], - ), - ), - - // زر التبديل - SizedBox( - width: double.infinity, - height: T.buttonHeight, - child: ElevatedButton( - onPressed: state.loading - ? null - : () => context.read().toggleOnline(), - style: ElevatedButton.styleFrom( - backgroundColor: isOnline - ? context.tripzColors.danger - : cs.primary, - foregroundColor: isOnline ? Colors.white : cs.onPrimary, - shape: RoundedRectangleBorder( - borderRadius: BorderRadius.circular(T.r12), - ), - elevation: 0, - ), - child: state.loading - ? const SizedBox( - width: 20, - height: 20, - child: CircularProgressIndicator(strokeWidth: 2), - ) - : Row( - mainAxisAlignment: MainAxisAlignment.center, - children: [ - Icon( - isOnline - ? Icons.stop_rounded - : Icons.play_arrow_rounded, - size: 24, - ), - const SizedBox(width: T.s8), - Text( - isOnline ? l10n.goOffline : l10n.goOnline, - style: const TextStyle( - fontSize: 16, - fontWeight: FontWeight.w600, - ), - ), - ], - ), - ), - ), - ], - ), - ); - }, - ); - } -} diff --git a/apps/driver-archive-cubit/lib/features/home/view/widgets/trip_offer_card.dart b/apps/driver-archive-cubit/lib/features/home/view/widgets/trip_offer_card.dart deleted file mode 100644 index 62d0136..0000000 --- a/apps/driver-archive-cubit/lib/features/home/view/widgets/trip_offer_card.dart +++ /dev/null @@ -1,287 +0,0 @@ -import 'dart:async'; -import 'package:flutter/material.dart'; -import 'package:driver/core/l10n/app_localizations.dart'; -import 'package:flutter_bloc/flutter_bloc.dart'; -import 'package:driver/core/design/tokens.dart'; -import 'package:driver/core/design/tripz_colors.dart'; -import 'package:driver/features/home/data/models/trip_offer_model.dart'; -import 'package:driver/features/offers/bloc/offers_bloc.dart'; - -/// بطاقة عرض الرحلة الواردة — تُعرض في overlay. -/// -/// تتضمن: -/// - نقاط pickup/dropoff على الخريطة المصغرة -/// - معلومات المسافة والأجرة والوقت -/// - عداد تنازلي للمهلة -/// - أزرار قبول/رفض -class TripOfferCard extends StatefulWidget { - final TripOfferModel offer; - - const TripOfferCard({super.key, required this.offer}); - - @override - State createState() => _TripOfferCardState(); -} - -class _TripOfferCardState extends State { - Timer? _countdownTimer; - int _remainingSeconds = 0; - - @override - void initState() { - super.initState(); - _remainingSeconds = widget.offer.expiresAt.difference(DateTime.now()).inSeconds; - _countdownTimer = Timer.periodic(const Duration(seconds: 1), (_) { - if (!mounted) return; - setState(() { - _remainingSeconds = widget.offer.expiresAt.difference(DateTime.now()).inSeconds; - if (_remainingSeconds <= 0) { - _countdownTimer?.cancel(); - } - }); - }); - } - - @override - void dispose() { - _countdownTimer?.cancel(); - super.dispose(); - } - - @override - Widget build(BuildContext context) { - final l10n = AppLocalizations.of(context)!; - final cs = Theme.of(context).colorScheme; - - final progress = _remainingSeconds > 0 - ? (_remainingSeconds / 30.0).clamp(0.0, 1.0) - : 0.0; - - return Container( - constraints: const BoxConstraints(maxHeight: 280), - decoration: BoxDecoration( - color: cs.surface, - borderRadius: BorderRadius.circular(T.r12), - boxShadow: [ - BoxShadow( - color: Colors.black.withValues(alpha: 0.12), - blurRadius: 16, - offset: const Offset(0, 4), - ), - ], - ), - child: Column( - mainAxisSize: MainAxisSize.min, - children: [ - // شريط التقدم (العد التنازلي) - LinearProgressIndicator( - value: progress, - backgroundColor: cs.surfaceContainerHighest, - valueColor: AlwaysStoppedAnimation( - _remainingSeconds > 10 ? cs.primary : context.tripzColors.danger, - ), - minHeight: 4, - ), - - Padding( - padding: const EdgeInsets.all(T.s16), - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - // الأجرة + العداد - Row( - children: [ - Text( - widget.offer.formattedFare, - style: Theme.of(context).textTheme.headlineSmall?.copyWith( - fontWeight: FontWeight.bold, - color: cs.primary, - ), - ), - const Spacer(), - Container( - padding: const EdgeInsets.symmetric( - horizontal: T.s8, - vertical: T.s4, - ), - decoration: BoxDecoration( - color: _remainingSeconds > 10 - ? cs.primaryContainer - : context.tripzColors.danger.withValues(alpha: 0.1), - borderRadius: BorderRadius.circular(T.r8), - ), - child: Text( - '${_remainingSeconds > 0 ? _remainingSeconds : 0}s', - style: Theme.of(context).textTheme.bodySmall?.copyWith( - fontWeight: FontWeight.w600, - color: _remainingSeconds > 10 - ? cs.onPrimaryContainer - : context.tripzColors.danger, - ), - ), - ), - ], - ), - - const SizedBox(height: T.s12), - - // المسافة والوقت - Row( - children: [ - _InfoChip( - icon: Icons.straighten, - label: widget.offer.formattedDistance, - ), - const SizedBox(width: T.s8), - _InfoChip( - icon: Icons.access_time, - label: '${widget.offer.etaPickup} ${l10n.min}', - ), - const SizedBox(width: T.s8), - _InfoChip( - icon: Icons.local_taxi, - label: widget.offer.vehicleClass, - ), - ], - ), - - const SizedBox(height: T.s12), - - // نقاط pickup وdropoff - _LocationDot( - color: const Color(0xFF4CAF50), - label: widget.offer.pickupAddress ?? l10n.pickupLocation, - ), - Padding( - padding: const EdgeInsets.only(left: 7), - child: Container( - width: 2, - height: T.s16, - color: cs.outlineVariant, - ), - ), - _LocationDot( - color: const Color(0xFFF44336), - label: widget.offer.dropoffAddress ?? l10n.dropoffLocation, - ), - - const SizedBox(height: T.s16), - - // أزرار القبول/الرفض - Row( - children: [ - Expanded( - child: OutlinedButton( - onPressed: () { - context.read().add( - OfferRejected(widget.offer.tripId), - ); - }, - style: OutlinedButton.styleFrom( - foregroundColor: cs.error, - side: BorderSide(color: cs.error), - shape: RoundedRectangleBorder( - borderRadius: BorderRadius.circular(T.r12), - ), - minimumSize: const Size(0, T.buttonHeight), - ), - child: Text(l10n.reject), - ), - ), - const SizedBox(width: T.s12), - Expanded( - child: ElevatedButton( - onPressed: () { - context.read().add( - OfferAccepted(widget.offer.tripId), - ); - }, - style: ElevatedButton.styleFrom( - backgroundColor: cs.primary, - foregroundColor: cs.onPrimary, - shape: RoundedRectangleBorder( - borderRadius: BorderRadius.circular(T.r12), - ), - minimumSize: const Size(0, T.buttonHeight), - elevation: 0, - ), - child: Text(l10n.accept), - ), - ), - ], - ), - ], - ), - ), - ], - ), - ); - } -} - -/// رقاقة معلومات صغيرة (مسافة / وقت / فئة). -class _InfoChip extends StatelessWidget { - final IconData icon; - final String label; - - const _InfoChip({required this.icon, required this.label}); - - @override - Widget build(BuildContext context) { - final cs = Theme.of(context).colorScheme; - - return Container( - padding: const EdgeInsets.symmetric(horizontal: T.s8, vertical: T.s4), - decoration: BoxDecoration( - color: cs.surfaceContainerHighest, - borderRadius: BorderRadius.circular(T.r8), - ), - child: Row( - mainAxisSize: MainAxisSize.min, - children: [ - Icon(icon, size: 14, color: cs.onSurfaceVariant), - const SizedBox(width: 4), - Text( - label, - style: Theme.of(context).textTheme.bodySmall?.copyWith( - color: cs.onSurfaceVariant, - ), - ), - ], - ), - ); - } -} - -/// نقطة موقع مع لون وعنوان. -class _LocationDot extends StatelessWidget { - final Color color; - final String label; - - const _LocationDot({required this.color, required this.label}); - - @override - Widget build(BuildContext context) { - return Row( - children: [ - Container( - width: 12, - height: 12, - decoration: BoxDecoration( - color: color, - shape: BoxShape.circle, - ), - ), - const SizedBox(width: T.s8), - Expanded( - child: Text( - label, - style: Theme.of(context).textTheme.bodyMedium, - maxLines: 1, - overflow: TextOverflow.ellipsis, - ), - ), - ], - ); - } -} diff --git a/apps/driver-archive-cubit/lib/features/offers/bloc/offers_bloc.dart b/apps/driver-archive-cubit/lib/features/offers/bloc/offers_bloc.dart deleted file mode 100644 index 7db0925..0000000 --- a/apps/driver-archive-cubit/lib/features/offers/bloc/offers_bloc.dart +++ /dev/null @@ -1,235 +0,0 @@ -import 'dart:async'; -import 'package:equatable/equatable.dart'; -import 'package:flutter_bloc/flutter_bloc.dart'; -import '../data/offers_repository.dart'; -import 'package:driver/features/home/data/models/trip_offer_model.dart'; -import '../../trip/data/driver_socket_service.dart'; -import '../../trip/data/trip_event_merger.dart'; - -// ─── أحداث ─── - -sealed class OffersEvent extends Equatable { - const OffersEvent(); - @override - List get props => []; -} - -/// بدء الاستماع للعروض (بعد الاتصال بالـWebSocket). -class OffersStarted extends OffersEvent { - const OffersStarted(); -} - -/// عرض رحلة وارد (من WebSocket). -class OfferReceived extends OffersEvent { - final TripOfferModel offer; - const OfferReceived(this.offer); - @override - List get props => [offer.tripId]; -} - -/// العرض تم قبوله من سائق آخر. -class OfferTaken extends OffersEvent { - final String tripId; - const OfferTaken(this.tripId); - @override - List get props => [tripId]; -} - -/// العرض انتهت مهلته (من المؤقت). -class OfferExpired extends OffersEvent { - final String tripId; - const OfferExpired(this.tripId); - @override - List get props => [tripId]; -} - -/// قبول العرض. -class OfferAccepted extends OffersEvent { - final String tripId; - const OfferAccepted(this.tripId); - @override - List get props => [tripId]; -} - -/// رفض العرض يدوياً. -class OfferRejected extends OffersEvent { - final String tripId; - const OfferRejected(this.tripId); - @override - List get props => [tripId]; -} - -/// مسح كل العروض (عند بدء رحلة نشطة). -class OffersClear extends OffersEvent { - const OffersClear(); -} - -// ─── حالة ─── - -class OffersState extends Equatable { - final List offers; - final String? acceptedTripId; - final bool accepting; - final String? error; - - const OffersState({ - this.offers = const [], - this.acceptedTripId, - this.accepting = false, - this.error, - }); - - OffersState copyWith({ - List? offers, - String? acceptedTripId, - bool? accepting, - String? error, - bool clearError = false, - bool clearAccepted = false, - }) { - return OffersState( - offers: offers ?? this.offers, - acceptedTripId: clearAccepted ? null : (acceptedTripId ?? this.acceptedTripId), - accepting: accepting ?? this.accepting, - error: clearError ? null : (error ?? this.error), - ); - } - - /// هل هناك عرض واحد على الأقل؟ - bool get hasOffers => offers.isNotEmpty; - - @override - List get props => [offers, acceptedTripId, accepting, error]; -} - -// ─── Bloc ─── - -/// OffersBloc — Bloc الثاني للسائق (docs/03 §14). -/// -/// يستقبل عروض من WebSocket ويدير القبول/الرفض والمؤقت. -/// العروض تُعرض كـstack: الأحدث أولاً. -class OffersBloc extends Bloc { - final OffersRepository _offersRepo; - final DriverSocketService _socket; - final DriverTripEventMerger _merger; - - /// مؤقتات المهلة لكل عرض ( tripId → Timer ). - final Map _expiryTimers = {}; - - OffersBloc({ - required OffersRepository offersRepo, - required DriverSocketService socket, - DriverTripEventMerger? merger, - }) : _offersRepo = offersRepo, - _socket = socket, - _merger = merger ?? DriverTripEventMerger(), - super(const OffersState()) { - on(_onStarted); - on(_onOfferReceived); - on(_onOfferTaken); - on(_onOfferExpired); - on(_onOfferAccepted); - on(_onOfferRejected); - on(_onClear); - - // استمع لتحديثات Merger. - _merger.offerStream.listen((offer) { - add(OfferReceived(offer)); - }); - - _merger.offerTakenStream.listen((tripId) { - add(OfferTaken(tripId)); - }); - } - - Future _onStarted(OffersStarted event, Emitter emit) async { - _socket.connect(); - } - - void _onOfferReceived(OfferReceived event, Emitter emit) { - // لا تضف عروضاً مكررة. - final exists = state.offers.any((o) => o.tripId == event.offer.tripId); - if (exists) return; - - final updated = [event.offer, ...state.offers]; - emit(state.copyWith(offers: updated, clearError: true)); - - // ابدأ مؤقت المهلة. - _startExpiryTimer(event.offer); - } - - void _onOfferTaken(OfferTaken event, Emitter emit) { - final updated = state.offers.where((o) => o.tripId != event.tripId).toList(); - _cancelExpiryTimer(event.tripId); - emit(state.copyWith(offers: updated)); - } - - void _onOfferExpired(OfferExpired event, Emitter emit) { - final updated = state.offers.where((o) => o.tripId != event.tripId).toList(); - _cancelExpiryTimer(event.tripId); - emit(state.copyWith(offers: updated)); - } - - Future _onOfferAccepted(OfferAccepted event, Emitter emit) async { - emit(state.copyWith(accepting: true, clearError: true)); - - final trip = await _offersRepo.acceptTrip(event.tripId); - if (trip == null) { - emit(state.copyWith(accepting: false, error: 'Failed to accept trip')); - return; - } - - // أزل كل العروض المتبقية (تم اختيار سائق). - _cancelAllTimers(); - emit(state.copyWith( - offers: [], - accepting: false, - acceptedTripId: event.tripId, - )); - } - - void _onOfferRejected(OfferRejected event, Emitter emit) { - final updated = state.offers.where((o) => o.tripId != event.tripId).toList(); - _cancelExpiryTimer(event.tripId); - emit(state.copyWith(offers: updated)); - } - - void _onClear(OffersClear event, Emitter emit) { - _cancelAllTimers(); - emit(const OffersState()); - } - - // ─── مساعدات المؤقتات ─── - - void _startExpiryTimer(TripOfferModel offer) { - final remaining = offer.expiresAt.difference(DateTime.now()); - if (remaining.isNegative) { - add(OfferExpired(offer.tripId)); - return; - } - - _expiryTimers[offer.tripId]?.cancel(); - _expiryTimers[offer.tripId] = Timer(remaining, () { - add(OfferExpired(offer.tripId)); - }); - } - - void _cancelExpiryTimer(String tripId) { - _expiryTimers[tripId]?.cancel(); - _expiryTimers.remove(tripId); - } - - void _cancelAllTimers() { - for (final timer in _expiryTimers.values) { - timer.cancel(); - } - _expiryTimers.clear(); - } - - @override - Future close() { - _cancelAllTimers(); - _merger.dispose(); - return super.close(); - } -} diff --git a/apps/driver-archive-cubit/lib/features/offers/data/offers_repository.dart b/apps/driver-archive-cubit/lib/features/offers/data/offers_repository.dart deleted file mode 100644 index 61210d6..0000000 --- a/apps/driver-archive-cubit/lib/features/offers/data/offers_repository.dart +++ /dev/null @@ -1,41 +0,0 @@ -import 'package:driver/core/api/api_client.dart'; -import 'package:driver/features/trip/data/models/driver_trip_model.dart'; - -/// مستودع عروض ورحلات السائق — يُستخدم من OffersBloc وDriverTripBloc. -class OffersRepository { - final ApiClient _api; - OffersRepository(this._api); - - /// `GET /trips/available` — جلب الرحلات المتاحة. - Future> getAvailableTrips() async { - try { - final r = await _api.dio.get('/trips/available'); - final items = (r.data['items'] ?? r.data) as List; - return items - .map((j) => DriverTripModel.fromJson(j as Map)) - .toList(); - } catch (_) { - return []; - } - } - - /// `POST /trips/:id/accept` — قبول عرض الرحلة. - Future acceptTrip(String tripId) async { - try { - final r = await _api.dio.post('/trips/$tripId/accept'); - return DriverTripModel.fromJson(r.data as Map); - } catch (_) { - return null; - } - } - - /// `POST /trips/:id/cancel` — إلغاء رحلة مقبولة. - Future cancelTrip(String tripId) async { - try { - final r = await _api.dio.post('/trips/$tripId/cancel'); - return DriverTripModel.fromJson(r.data as Map); - } catch (_) { - return null; - } - } -} diff --git a/apps/driver-archive-cubit/lib/features/settings/cubit/settings_cubit.dart b/apps/driver-archive-cubit/lib/features/settings/cubit/settings_cubit.dart deleted file mode 100644 index 8df81e4..0000000 --- a/apps/driver-archive-cubit/lib/features/settings/cubit/settings_cubit.dart +++ /dev/null @@ -1,38 +0,0 @@ -import 'package:flutter/material.dart'; -import 'package:flutter_bloc/flutter_bloc.dart'; -import 'package:shared_preferences/shared_preferences.dart'; -import 'settings_state.dart'; - -/// الإعدادات العامة: الثيم + اللغة. -/// يُحفظ محلياً عبر SharedPreferences (ليس سراً — docs/26 §4). -class SettingsCubit extends Cubit { - static const _kThemeKey = 'settings_theme_mode'; - static const _kLocaleKey = 'settings_locale'; - - SettingsCubit() : super(const SettingsState()) { - _load(); - } - - Future _load() async { - final prefs = await SharedPreferences.getInstance(); - final themeIndex = prefs.getInt(_kThemeKey) ?? 0; - final localeCode = prefs.getString(_kLocaleKey) ?? 'ar'; - - emit(state.copyWith( - themeMode: ThemeMode.values[themeIndex], - locale: Locale(localeCode), - )); - } - - Future setThemeMode(ThemeMode mode) async { - emit(state.copyWith(themeMode: mode)); - final prefs = await SharedPreferences.getInstance(); - await prefs.setInt(_kThemeKey, mode.index); - } - - Future setLocale(Locale locale) async { - emit(state.copyWith(locale: locale)); - final prefs = await SharedPreferences.getInstance(); - await prefs.setString(_kLocaleKey, locale.languageCode); - } -} diff --git a/apps/driver-archive-cubit/lib/features/settings/cubit/settings_state.dart b/apps/driver-archive-cubit/lib/features/settings/cubit/settings_state.dart deleted file mode 100644 index 27ee227..0000000 --- a/apps/driver-archive-cubit/lib/features/settings/cubit/settings_state.dart +++ /dev/null @@ -1,31 +0,0 @@ -import 'package:equatable/equatable.dart'; -import 'package:flutter/material.dart'; - -enum SettingsStatus { loaded, error } - -class SettingsState extends Equatable { - final SettingsStatus status; - final ThemeMode themeMode; - final Locale locale; - - const SettingsState({ - this.status = SettingsStatus.loaded, - this.themeMode = ThemeMode.system, - this.locale = const Locale('ar'), - }); - - SettingsState copyWith({ - SettingsStatus? status, - ThemeMode? themeMode, - Locale? locale, - }) { - return SettingsState( - status: status ?? this.status, - themeMode: themeMode ?? this.themeMode, - locale: locale ?? this.locale, - ); - } - - @override - List get props => [status, themeMode, locale]; -} diff --git a/apps/driver-archive-cubit/lib/features/trip/bloc/driver_trip_bloc.dart b/apps/driver-archive-cubit/lib/features/trip/bloc/driver_trip_bloc.dart deleted file mode 100644 index 8c2ba29..0000000 --- a/apps/driver-archive-cubit/lib/features/trip/bloc/driver_trip_bloc.dart +++ /dev/null @@ -1,285 +0,0 @@ -import 'dart:async'; -import 'package:equatable/equatable.dart'; -import 'package:flutter_bloc/flutter_bloc.dart'; -import '../data/driver_trip_repository.dart'; -import '../data/driver_socket_service.dart'; -import '../data/trip_event_merger.dart'; -import 'package:driver/features/trip/data/models/driver_trip_model.dart'; - -// ─── أحداث ─── - -sealed class DriverTripEvent extends Equatable { - const DriverTripEvent(); - @override - List get props => []; -} - -/// فحص رحلة نشطة عند بدء التشغيل. -class DriverTripCheckActive extends DriverTripEvent { - const DriverTripCheckActive(); -} - -/// تم قبول رحلة (من OffersBloc). -class DriverTripAccepted extends DriverTripEvent { - final DriverTripModel trip; - const DriverTripAccepted(this.trip); - @override - List get props => [trip.id]; -} - -/// تحديث حالة من WebSocket أو FCM. -class DriverTripUpdateReceived extends DriverTripEvent { - final String tripId; - final String status; - final Map extra; - const DriverTripUpdateReceived({ - required this.tripId, - required this.status, - this.extra = const {}, - }); - @override - List get props => [tripId, status]; -} - -/// تغيير الحالة يدوياً (من زر السائق). -class DriverTripStatusChanged extends DriverTripEvent { - final String status; - const DriverTripStatusChanged(this.status); - @override - List get props => [status]; -} - -/// إلغاء الرحلة من السائق. -class DriverTripCancelRequested extends DriverTripEvent { - const DriverTripCancelRequested(); -} - -/// مسح الرحلة من الذاكرة. -class DriverTripClear extends DriverTripEvent { - const DriverTripClear(); -} - -// ─── حالة ─── - -class DriverTripState extends Equatable { - final DriverTripModel? trip; - final bool loading; - final String? error; - final bool cancelled; - - const DriverTripState({ - this.trip, - this.loading = false, - this.error, - this.cancelled = false, - }); - - DriverTripState copyWith({ - DriverTripModel? trip, - bool? loading, - String? error, - bool? cancelled, - bool clearError = false, - }) { - return DriverTripState( - trip: trip ?? this.trip, - loading: loading ?? this.loading, - error: clearError ? null : (error ?? this.error), - cancelled: cancelled ?? this.cancelled, - ); - } - - /// هل هناك رحلة نشطة؟ - bool get hasActiveTrip { - if (trip == null) return false; - return !['completed', 'paid', 'cancelled', 'expired'] - .contains(trip!.status); - } - - /// الحالة التالية المتوقعة للسائق. - String? get nextStatus { - if (trip == null) return null; - switch (trip!.status) { - case 'assigned': - return 'driver_arriving'; - case 'driver_arriving': - return 'driver_arrived'; - case 'driver_arrived': - return 'in_progress'; - case 'in_progress': - return 'completed'; - default: - return null; - } - } - - /// هل يمكن للسائق إلغاء الرحلة حالياً؟ - bool get canCancel { - if (trip == null) return false; - return ['assigned', 'driver_arriving'].contains(trip!.status); - } - - @override - List get props => [trip, loading, error, cancelled]; -} - -// ─── Bloc ─── - -/// DriverTripBloc — يدير دورة حياة الرحلة من وجهة نظر السائق. -/// -/// الحالات: assigned → driver_arriving → driver_arrived → in_progress → completed -class DriverTripBloc extends Bloc { - final DriverTripRepository _tripRepo; - final DriverSocketService _socket; - final DriverTripEventMerger _merger; - Timer? _reconciliationTimer; - - DriverTripBloc({ - required DriverTripRepository tripRepo, - required DriverSocketService socket, - DriverTripEventMerger? merger, - }) : _tripRepo = tripRepo, - _socket = socket, - _merger = merger ?? DriverTripEventMerger(), - super(const DriverTripState()) { - on(_onCheckActive); - on(_onAccepted); - on(_onUpdateReceived); - on(_onStatusChanged); - on(_onCancel); - on(_onClear); - - // استمع لتحديثات Merger. - _merger.updateStream.listen((update) { - add(DriverTripUpdateReceived( - tripId: update.tripId, - status: update.status, - extra: update.extra, - )); - }); - } - - Future _onCheckActive( - DriverTripCheckActive event, Emitter emit) async { - emit(state.copyWith(loading: true)); - try { - final trip = await _tripRepo.getTrip('me'); // backend يُعيد الرحلة النشطة للسائق - if (trip != null && trip.status != 'completed' && trip.status != 'paid') { - emit(state.copyWith(trip: trip, loading: false)); - _joinTripRoom(trip.id); - _startReconciliation(trip.id); - } else { - emit(state.copyWith(loading: false)); - } - } catch (_) { - emit(state.copyWith(loading: false)); - } - } - - void _onAccepted(DriverTripAccepted event, Emitter emit) { - emit(state.copyWith(trip: event.trip)); - _joinTripRoom(event.trip.id); - _startReconciliation(event.trip.id); - } - - void _onUpdateReceived( - DriverTripUpdateReceived event, Emitter emit) { - final currentTrip = state.trip; - if (currentTrip == null || currentTrip.id != event.tripId) return; - - // تصفية صامتة: تجاهل الحالات القديمة. - if (isTerminalStatus(event.status)) { - emit(state.copyWith( - trip: currentTrip.copyWith(status: event.status), - )); - _stopReconciliation(); - _socket.leaveTrip(event.tripId); - return; - } - - emit(state.copyWith( - trip: currentTrip.copyWith(status: event.status), - clearError: true, - )); - } - - Future _onStatusChanged( - DriverTripStatusChanged event, Emitter emit) async { - if (state.trip == null) return; - - emit(state.copyWith(loading: true, clearError: true)); - - final trip = await _tripRepo.updateStatus(state.trip!.id, event.status); - if (trip == null) { - emit(state.copyWith(loading: false, error: 'Failed to update status')); - return; - } - - emit(state.copyWith(trip: trip, loading: false)); - - if (isTerminalStatus(trip.status)) { - _stopReconciliation(); - _socket.leaveTrip(trip.id); - } - } - - Future _onCancel( - DriverTripCancelRequested event, Emitter emit) async { - if (state.trip == null) return; - - emit(state.copyWith(loading: true, clearError: true)); - - final trip = await _tripRepo.cancelTrip(state.trip!.id); - if (trip == null) { - emit(state.copyWith(loading: false, error: 'Failed to cancel trip')); - return; - } - - emit(state.copyWith(trip: trip, cancelled: true, loading: false)); - _stopReconciliation(); - _socket.leaveTrip(trip.id); - } - - void _onClear(DriverTripClear event, Emitter emit) { - _stopReconciliation(); - emit(const DriverTripState()); - } - - // ─── مساعدات ─── - - void _joinTripRoom(String tripId) { - _socket.joinTrip(tripId); - } - - void _startReconciliation(String tripId) { - _stopReconciliation(); - _reconciliationTimer = Timer.periodic(const Duration(seconds: 25), (_) async { - try { - final trip = await _tripRepo.getTrip(tripId); - if (trip != null) { - add(DriverTripUpdateReceived( - tripId: trip.id, - status: trip.status, - )); - } - } catch (_) {} - }); - } - - void _stopReconciliation() { - _reconciliationTimer?.cancel(); - _reconciliationTimer = null; - } - - @override - Future close() { - _stopReconciliation(); - _merger.dispose(); - return super.close(); - } -} - -/// هل هذه الحالة نهائية؟ -bool isTerminalStatus(String status) { - return status == 'cancelled' || status == 'expired' || status == 'paid' || status == 'completed'; -} diff --git a/apps/driver-archive-cubit/lib/features/trip/data/driver_socket_service.dart b/apps/driver-archive-cubit/lib/features/trip/data/driver_socket_service.dart deleted file mode 100644 index 85c5d90..0000000 --- a/apps/driver-archive-cubit/lib/features/trip/data/driver_socket_service.dart +++ /dev/null @@ -1,117 +0,0 @@ -import 'dart:async'; -import 'package:socket_io_client/socket_io_client.dart' as io; -import '../../../core/config.dart'; -import '../../../core/storage/token_store.dart'; -import '../../home/data/models/trip_offer_model.dart'; -import 'trip_event_merger.dart'; - -/// خدمة WebSocket للسائق — تتصل بالسيرفر وتستقبل: -/// - `trip:offer` — عرض رحلة وارد -/// - `trip:offer_taken` — تم قبول العرض (من سائق آخر) -/// - `trip:update` — تحديث حالة الرحلة النشطة -/// - `trip:new` — رحلة جديدة متاحة -class DriverSocketService { - final TokenStore _tokenStore; - final DriverTripEventMerger _merger; - - io.Socket? _socket; - bool _connected = false; - String? _currentTripId; - - DriverSocketService(this._tokenStore, this._merger); - - /// الاتصال بالخادم. - Future connect() async { - if (_connected) return; - - final token = await _tokenStore.access(); - if (token == null || token.isEmpty) return; - - _socket = io.io( - AppConfig.baseUrl.replaceAll('/api', ''), - io.OptionBuilder() - .setTransports(['websocket']) - .enableAutoConnect() - .enableReconnection() - .setReconnectionDelay(2000) - .setReconnectionAttempts(10) - .setAuth({'token': token}) - .build(), - ); - - _socket!.onConnect((_) { - _connected = true; - }); - - _socket!.onDisconnect((_) { - _connected = false; - }); - - _socket!.onReconnect((_) { - if (_currentTripId != null) { - joinTrip(_currentTripId!); - } - }); - - // استقبال عروض الرحلات الواردة. - _socket!.on('trip:offer', (data) { - if (data is! Map) return; - final map = Map.from(data); - _merger.addOffer(TripOfferModel.fromJson(map)); - }); - - // العرض تم قبوله من سائق آخر. - _socket!.on('trip:offer_taken', (data) { - if (data is! Map) return; - final map = Map.from(data); - final tripId = map['tripId'] as String?; - if (tripId != null) { - _merger.addOfferTaken(tripId); - } - }); - - // تحديث حالة الرحلة النشطة. - _socket!.on('trip:update', (data) { - if (data is! Map) return; - final map = Map.from(data); - _merger.addUpdate(DriverTripUpdate( - tripId: map['tripId'] as String? ?? '', - status: map['status'] as String? ?? '', - extra: map..remove('tripId')..remove('status'), - )); - }); - - // رحلة جديدة متاحة (إشعار عام). - _socket!.on('trip:new', (data) { - if (data is! Map) return; - final map = Map.from(data); - final tripId = map['tripId'] as String?; - if (tripId != null) { - _merger.addNewTrip(tripId); - } - }); - - _socket!.connect(); - } - - /// الانضمام لغرفة الرحلة. - void joinTrip(String tripId) { - _currentTripId = tripId; - _socket?.emit('trip:join', {'tripId': tripId}); - } - - /// مغادرة غرفة الرحلة. - void leaveTrip(String tripId) { - _currentTripId = null; - } - - /// قطع الاتصال. - void disconnect() { - _socket?.disconnect(); - _socket?.dispose(); - _socket = null; - _connected = false; - } - - bool get isConnected => _connected; -} diff --git a/apps/driver-archive-cubit/lib/features/trip/data/driver_trip_repository.dart b/apps/driver-archive-cubit/lib/features/trip/data/driver_trip_repository.dart deleted file mode 100644 index b214ca7..0000000 --- a/apps/driver-archive-cubit/lib/features/trip/data/driver_trip_repository.dart +++ /dev/null @@ -1,75 +0,0 @@ -import '../../../core/api/api_client.dart'; -import 'models/driver_trip_model.dart'; -import 'models/chat_message_model.dart'; - -/// مستودع رحلة السائق — يُستخدم من DriverTripBloc. -/// -/// يشمل تغييرات الحالة ودردشة الرحلة. -class DriverTripRepository { - final ApiClient _api; - DriverTripRepository(this._api); - - /// `GET /trips/:id` — جلب رحلة محددة. - Future getTrip(String tripId) async { - try { - final r = await _api.dio.get('/trips/$tripId'); - return DriverTripModel.fromJson(r.data as Map); - } catch (_) { - return null; - } - } - - /// `PATCH /trips/:id/status` — تغيير حالة الرحلة (status machine). - /// - /// الحالات المسموحة للسائق: `driver_arriving`, `driver_arrived`, `in_progress`, `completed`. - Future updateStatus(String tripId, String status) async { - try { - final r = await _api.dio.patch('/trips/$tripId/status', data: { - 'status': status, - }); - return DriverTripModel.fromJson(r.data as Map); - } catch (_) { - return null; - } - } - - /// `POST /trips/:id/cancel` — إلغاء الرحلة من السائق. - Future cancelTrip(String tripId) async { - try { - final r = await _api.dio.post('/trips/$tripId/cancel'); - return DriverTripModel.fromJson(r.data as Map); - } catch (_) { - return null; - } - } - - /// `GET /chat/:tripId/messages` — جلب سجل الرسائل. - Future> getMessages(String tripId, {String? currentUserId}) async { - try { - final r = await _api.dio.get('/chat/$tripId/messages'); - final items = (r.data['items'] ?? r.data) as List; - return items - .map((j) => ChatMessageModel.fromJson( - j as Map, - currentUserId: currentUserId, - )) - .toList(); - } catch (_) { - return []; - } - } - - /// `POST /chat/:tripId/send` — إرسال رسالة. - Future sendMessage(String tripId, String text, - {String? currentUserId}) async { - try { - final r = await _api.dio.post('/chat/$tripId/send', data: {'text': text}); - return ChatMessageModel.fromJson( - r.data as Map, - currentUserId: currentUserId, - ); - } catch (_) { - return null; - } - } -} diff --git a/apps/driver-archive-cubit/lib/features/trip/data/fcm_service.dart b/apps/driver-archive-cubit/lib/features/trip/data/fcm_service.dart deleted file mode 100644 index e006901..0000000 --- a/apps/driver-archive-cubit/lib/features/trip/data/fcm_service.dart +++ /dev/null @@ -1,89 +0,0 @@ -import 'dart:async'; -import 'dart:io' show Platform; -import 'package:firebase_messaging/firebase_messaging.dart'; -import '../../../core/api/api_client.dart'; -import '../../../core/di.dart'; -import 'trip_event_merger.dart'; - -/// القناة الثانية للزمن الحقيقي — FCM data-message (docs/23 §15). -/// -/// للسائق: يستقبل عروض الرحلات (trip:offer) وتحديثات الحالة -/// عبر FCM كطبقة احتياطية للسوكت. أيّهما يسبق يفوز — -/// الـ merger يتكفّل بالتصفية الصامتة. -class DriverFcmService { - final DriverTripEventMerger _merger; - StreamSubscription? _onMessageSub; - StreamSubscription? _onOpenSub; - - DriverFcmService(this._merger); - - Future init() async { - final messaging = FirebaseMessaging.instance; - - await messaging.requestPermission( - alert: false, - badge: false, - sound: false, - provisional: false, - ); - - final token = await messaging.getToken(); - if (token != null) { - _registerToken(token); - } - messaging.onTokenRefresh.listen(_registerToken); - - _onMessageSub = FirebaseMessaging.onMessage.listen(_handleMessage); - _onOpenSub = FirebaseMessaging.onMessageOpenedApp.listen(_handleMessage); - } - - void dispose() { - _onMessageSub?.cancel(); - _onOpenSub?.cancel(); - } - - void _handleMessage(RemoteMessage message) { - final data = message.data; - final type = data['type'] as String?; - final tripId = data['tripId'] as String?; - - if (type == null || tripId == null || tripId.isEmpty) return; - - switch (type) { - case 'trip_offer': - // عرض رحلة وارد — سيُعالج عبر OffersBloc. - _merger.addNewTrip(tripId); - break; - case 'trip_offer_taken': - // العرض تم قبوله من سائق آخر. - _merger.addOfferTaken(tripId); - break; - default: - // تحديث حالة رحلة نشطة. - final status = type.startsWith('trip_') ? type.substring(5) : null; - if (status == null) return; - - final extra = Map.from(data) - ..remove('type') - ..remove('tripId') - ..remove('title') - ..remove('body'); - - _merger.addUpdate(DriverTripUpdate( - tripId: tripId, - status: status, - extra: extra, - )); - } - } - - static Future _registerToken(String token) async { - try { - final api = getIt(); - await api.dio.post('/notifications/token', data: { - 'token': token, - 'platform': Platform.isIOS ? 'ios' : 'android', - }); - } catch (_) {} - } -} diff --git a/apps/driver-archive-cubit/lib/features/trip/data/models/chat_message_model.dart b/apps/driver-archive-cubit/lib/features/trip/data/models/chat_message_model.dart deleted file mode 100644 index cb649bb..0000000 --- a/apps/driver-archive-cubit/lib/features/trip/data/models/chat_message_model.dart +++ /dev/null @@ -1,33 +0,0 @@ -import 'package:equatable/equatable.dart'; - -/// نموذج رسالة الدردشة — من `GET /chat/:tripId/messages` و`POST /chat/:tripId/send`. -class ChatMessageModel extends Equatable { - final String id; - final String tripId; - final String senderId; - final String text; - final DateTime createdAt; - final bool isMe; - - const ChatMessageModel({ - required this.id, - required this.tripId, - required this.senderId, - required this.text, - required this.createdAt, - required this.isMe, - }); - - factory ChatMessageModel.fromJson(Map j, {String? currentUserId}) => - ChatMessageModel( - id: j['id'] as String, - tripId: (j['tripId'] ?? '') as String, - senderId: j['senderId'] as String, - text: j['text'] as String, - createdAt: DateTime.parse(j['createdAt'] as String), - isMe: j['senderId'] == currentUserId, - ); - - @override - List get props => [id, tripId, senderId, text, createdAt]; -} diff --git a/apps/driver-archive-cubit/lib/features/trip/data/models/driver_trip_model.dart b/apps/driver-archive-cubit/lib/features/trip/data/models/driver_trip_model.dart deleted file mode 100644 index 7b34a41..0000000 --- a/apps/driver-archive-cubit/lib/features/trip/data/models/driver_trip_model.dart +++ /dev/null @@ -1,93 +0,0 @@ -import 'package:equatable/equatable.dart'; - -/// نموذج الرحلة من وجهة نظر السائق — من `GET /trips/available` وتحديثات WebSocket. -class DriverTripModel extends Equatable { - final String id; - final String status; - final String? clientId; - final String? clientName; - final String? clientPhone; - final double pickupLat; - final double pickupLng; - final String? pickupAddress; - final double dropoffLat; - final double dropoffLng; - final String? dropoffAddress; - final String vehicleClass; - final num? fare; - final String? currency; - final String? paymentMethod; - final DateTime? createdAt; - final DateTime? updatedAt; - - const DriverTripModel({ - required this.id, - required this.status, - this.clientId, - this.clientName, - this.clientPhone, - required this.pickupLat, - required this.pickupLng, - this.pickupAddress, - required this.dropoffLat, - required this.dropoffLng, - this.dropoffAddress, - required this.vehicleClass, - this.fare, - this.currency, - this.paymentMethod, - this.createdAt, - this.updatedAt, - }); - - factory DriverTripModel.fromJson(Map j) => DriverTripModel( - id: j['id'] as String, - status: j['status'] as String, - clientId: j['clientId'] as String?, - clientName: j['clientName'] as String?, - clientPhone: j['clientPhone'] as String?, - pickupLat: (j['pickup']?['lat'] ?? j['pickupLat'] ?? 0).toDouble(), - pickupLng: (j['pickup']?['lng'] ?? j['pickupLng'] ?? 0).toDouble(), - pickupAddress: (j['pickup']?['address'] ?? j['pickupAddress']) as String?, - dropoffLat: (j['dropoff']?['lat'] ?? j['dropoffLat'] ?? 0).toDouble(), - dropoffLng: (j['dropoff']?['lng'] ?? j['dropoffLng'] ?? 0).toDouble(), - dropoffAddress: (j['dropoff']?['address'] ?? j['dropoffAddress']) as String?, - vehicleClass: (j['vehicleClass'] ?? '') as String, - fare: (j['fare'] as num?), - currency: j['currency'] as String?, - paymentMethod: j['paymentMethod'] as String?, - createdAt: j['createdAt'] != null ? DateTime.tryParse(j['createdAt'] as String) : null, - updatedAt: j['updatedAt'] != null ? DateTime.tryParse(j['updatedAt'] as String) : null, - ); - - DriverTripModel copyWith({ - String? status, - String? clientName, - String? clientPhone, - num? fare, - String? currency, - }) { - return DriverTripModel( - id: id, - status: status ?? this.status, - clientId: clientId, - clientName: clientName ?? this.clientName, - clientPhone: clientPhone ?? this.clientPhone, - pickupLat: pickupLat, - pickupLng: pickupLng, - pickupAddress: pickupAddress, - dropoffLat: dropoffLat, - dropoffLng: dropoffLng, - dropoffAddress: dropoffAddress, - vehicleClass: vehicleClass, - fare: fare ?? this.fare, - currency: currency ?? this.currency, - paymentMethod: paymentMethod, - createdAt: createdAt, - updatedAt: DateTime.now(), - ); - } - - @override - List get props => [id, status, clientId, vehicleClass, fare]; -} diff --git a/apps/driver-archive-cubit/lib/features/trip/data/trip_event_merger.dart b/apps/driver-archive-cubit/lib/features/trip/data/trip_event_merger.dart deleted file mode 100644 index d2f854c..0000000 --- a/apps/driver-archive-cubit/lib/features/trip/data/trip_event_merger.dart +++ /dev/null @@ -1,92 +0,0 @@ -import 'dart:async'; -import '../../home/data/models/trip_offer_model.dart'; - -/// تحديث حالة رحلة من WebSocket (للسائق). -class DriverTripUpdate { - final String tripId; - final String status; - final Map extra; - - const DriverTripUpdate({ - required this.tripId, - required this.status, - this.extra = const {}, - }); -} - -/// محول أحداث WebSocket للسائق — يدعم: -/// - عروض الرحلات (`trip:offer`) -/// - إلغاء العروض (`trip:offer_taken`) -/// - تحديثات الحالة (`trip:update`) -/// - رحلات جديدة (`trip:new`) -/// -/// التصفية الصامتة تتم بترتيب الحالات (docs/23 §15). -int _statusOrder(String s) { - switch (s) { - case 'assigned': - return 0; - case 'driver_arriving': - return 1; - case 'driver_arrived': - return 2; - case 'in_progress': - return 3; - case 'completed': - return 4; - case 'paid': - return 5; - default: - return -1; // cancelled, expired - } -} - -class DriverTripEventMerger { - final _offerController = StreamController.broadcast(); - final _offerTakenController = StreamController.broadcast(); - final _updateController = StreamController.broadcast(); - final _newTripController = StreamController.broadcast(); - - /// الحالة المعروضة حالياً لكل رحلة. - final Map _currentOrder = {}; - - Stream get offerStream => _offerController.stream; - Stream get offerTakenStream => _offerTakenController.stream; - Stream get updateStream => _updateController.stream; - Stream get newTripStream => _newTripController.stream; - - /// استقبال عرض رحلة وارد. - void addOffer(TripOfferModel offer) { - _offerController.add(offer); - } - - /// العرض تم قبوله من سائق آخر. - void addOfferTaken(String tripId) { - _offerTakenController.add(tripId); - } - - /// تحديث حالة رحلة نشطة. - void addUpdate(DriverTripUpdate update) { - final newOrder = _statusOrder(update.status); - final currentOrder = _currentOrder[update.tripId] ?? -1; - - if (newOrder >= 0 && newOrder <= currentOrder) return; - - if (newOrder >= 0) { - _currentOrder[update.tripId] = newOrder; - } - - _updateController.add(update); - } - - /// إشعار برحلة جديدة متاحة. - void addNewTrip(String tripId) { - _newTripController.add(tripId); - } - - void dispose() { - _offerController.close(); - _offerTakenController.close(); - _updateController.close(); - _newTripController.close(); - } -} diff --git a/apps/driver-archive-cubit/lib/features/trip/view/driver_chat_screen.dart b/apps/driver-archive-cubit/lib/features/trip/view/driver_chat_screen.dart deleted file mode 100644 index 1fa38e0..0000000 --- a/apps/driver-archive-cubit/lib/features/trip/view/driver_chat_screen.dart +++ /dev/null @@ -1,212 +0,0 @@ -import 'package:flutter/material.dart'; -import 'package:driver/core/l10n/app_localizations.dart'; -import '../../../core/design/tokens.dart'; -import '../../../core/ui/tripz_text_field.dart'; -import '../../trip/data/driver_trip_repository.dart'; -import '../../trip/data/models/chat_message_model.dart'; -import '../../../core/storage/token_store.dart'; -import '../../../core/di.dart'; - -/// شاشة دردشة السائق مع العميل داخل الرحلة. -/// -/// تُستخدم من شاشة تنفيذ الرحلة (Q4). -class DriverChatScreen extends StatefulWidget { - final String tripId; - - const DriverChatScreen({super.key, required this.tripId}); - - @override - State createState() => _DriverChatScreenState(); -} - -class _DriverChatScreenState extends State { - final TextEditingController _controller = TextEditingController(); - final ScrollController _scrollController = ScrollController(); - late final DriverTripRepository _repo; - List _messages = []; - bool _loading = true; - bool _sending = false; - - @override - void initState() { - super.initState(); - _repo = DriverTripRepository(getIt()); - _loadMessages(); - } - - Future _loadMessages() async { - final userId = await getIt().access(); - final messages = await _repo.getMessages(widget.tripId, currentUserId: userId); - if (mounted) { - setState(() { - _messages = messages; - _loading = false; - }); - _scrollToBottom(); - } - } - - Future _sendMessage() async { - final text = _controller.text.trim(); - if (text.isEmpty || _sending) return; - - setState(() => _sending = true); - _controller.clear(); - - final userId = await getIt().access(); - final msg = await _repo.sendMessage(widget.tripId, text, currentUserId: userId); - if (msg != null && mounted) { - setState(() => _messages.add(msg)); - _scrollToBottom(); - } - if (mounted) setState(() => _sending = false); - } - - void _scrollToBottom() { - Future.delayed(const Duration(milliseconds: 100), () { - if (_scrollController.hasClients) { - _scrollController.animateTo( - _scrollController.position.maxScrollExtent, - duration: const Duration(milliseconds: 200), - curve: Curves.easeOut, - ); - } - }); - } - - @override - void dispose() { - _controller.dispose(); - _scrollController.dispose(); - super.dispose(); - } - - @override - Widget build(BuildContext context) { - final l10n = AppLocalizations.of(context)!; - final cs = Theme.of(context).colorScheme; - - return Scaffold( - appBar: AppBar( - title: Text(l10n.chat), - ), - body: Column( - children: [ - // الرسائل - Expanded( - child: _loading - ? const Center(child: CircularProgressIndicator()) - : _messages.isEmpty - ? Center( - child: Text( - l10n.noMessagesYet, - style: TextStyle(color: cs.onSurfaceVariant), - ), - ) - : ListView.builder( - controller: _scrollController, - padding: const EdgeInsets.all(T.s16), - itemCount: _messages.length, - itemBuilder: (context, index) { - final msg = _messages[index]; - return _MessageBubble(message: msg); - }, - ), - ), - - // حقل الإرسال - Container( - padding: const EdgeInsets.all(T.s12), - decoration: BoxDecoration( - color: cs.surface, - boxShadow: [ - BoxShadow( - color: Colors.black.withValues(alpha: 0.05), - blurRadius: 8, - offset: const Offset(0, -2), - ), - ], - ), - child: SafeArea( - child: Row( - children: [ - Expanded( - child: TripzTextField( - controller: _controller, - hint: l10n.typeMessage, - onSubmitted: (_) => _sendMessage(), - ), - ), - const SizedBox(width: T.s8), - IconButton( - onPressed: _sending ? null : _sendMessage, - icon: _sending - ? const SizedBox( - width: 20, - height: 20, - child: CircularProgressIndicator(strokeWidth: 2), - ) - : Icon(Icons.send, color: cs.primary), - ), - ], - ), - ), - ), - ], - ), - ); - } -} - -class _MessageBubble extends StatelessWidget { - final ChatMessageModel message; - - const _MessageBubble({required this.message}); - - @override - Widget build(BuildContext context) { - final cs = Theme.of(context).colorScheme; - - return Align( - alignment: message.isMe ? Alignment.centerRight : Alignment.centerLeft, - child: Container( - margin: const EdgeInsets.only(bottom: T.s8), - padding: const EdgeInsets.symmetric( - horizontal: T.s12, - vertical: T.s8, - ), - constraints: BoxConstraints( - maxWidth: MediaQuery.of(context).size.width * 0.75, - ), - decoration: BoxDecoration( - color: message.isMe ? cs.primary : cs.surfaceContainerHighest, - borderRadius: BorderRadius.circular(T.r12).copyWith( - bottomRight: message.isMe ? const Radius.circular(4) : null, - bottomLeft: !message.isMe ? const Radius.circular(4) : null, - ), - ), - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Text( - message.text, - style: TextStyle( - color: message.isMe ? cs.onPrimary : cs.onSurface, - ), - ), - const SizedBox(height: 2), - Text( - '${message.createdAt.hour.toString().padLeft(2, '0')}:${message.createdAt.minute.toString().padLeft(2, '0')}', - style: TextStyle( - fontSize: 10, - color: message.isMe - ? cs.onPrimary.withValues(alpha: 0.7) - : cs.onSurfaceVariant, - ), - ), - ], - ), - ), - ); - } -} diff --git a/apps/driver-archive-cubit/lib/features/trip/view/driver_trip_screen.dart b/apps/driver-archive-cubit/lib/features/trip/view/driver_trip_screen.dart deleted file mode 100644 index a0a3586..0000000 --- a/apps/driver-archive-cubit/lib/features/trip/view/driver_trip_screen.dart +++ /dev/null @@ -1,260 +0,0 @@ -import 'package:flutter/material.dart'; -import 'package:driver/core/l10n/app_localizations.dart'; -import 'package:flutter_bloc/flutter_bloc.dart'; -import 'package:intaleq_maps/intaleq_maps.dart'; -import '../../../core/design/tokens.dart'; -import '../../trip/bloc/driver_trip_bloc.dart'; -import 'widgets/trip_action_button.dart'; - -/// شاشة تنفيذ الرحلة — تتبع السائق أثناء تنفيذ الرحلة. -/// -/// الحالات: -/// - `assigned`: عرض pickup + زر "في الطريق" -/// - `driver_arriving`: تتبع المسار إلى العميل -/// - `driver_arrived`: انتظار العميل + زر "بدء الرحلة" -/// - `in_progress`: تتبع المسار إلى dropoff + زر "إتمام" -class DriverTripScreen extends StatelessWidget { - const DriverTripScreen({super.key}); - - @override - Widget build(BuildContext context) { - final l10n = AppLocalizations.of(context)!; - final cs = Theme.of(context).colorScheme; - - return BlocBuilder( - builder: (context, state) { - if (state.trip == null) { - return const Scaffold( - body: Center(child: CircularProgressIndicator()), - ); - } - - final trip = state.trip!; - final statusLabel = _statusLabel(l10n, trip.status); - - return Scaffold( - appBar: AppBar( - title: Text(statusLabel), - centerTitle: true, - automaticallyImplyLeading: false, - actions: [ - if (state.canCancel) - TextButton( - onPressed: () => _showCancelDialog(context, l10n), - child: Text( - l10n.cancel, - style: TextStyle(color: cs.error), - ), - ), - ], - ), - body: Column( - children: [ - // ── الخريطة ── - Expanded( - flex: 3, - child: _buildMap(context, trip), - ), - - // ── معلومات + زر ── - Expanded( - flex: 2, - child: Container( - padding: const EdgeInsets.all(T.s16), - decoration: BoxDecoration( - color: cs.surface, - borderRadius: const BorderRadius.vertical( - top: Radius.circular(T.r24), - ), - boxShadow: [ - BoxShadow( - color: Colors.black.withValues(alpha: 0.08), - blurRadius: 12, - offset: const Offset(0, -4), - ), - ], - ), - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - // معلومات العميل - if (trip.clientName != null) - Row( - children: [ - CircleAvatar( - radius: 20, - backgroundColor: cs.primaryContainer, - child: Icon(Icons.person, color: cs.onPrimaryContainer), - ), - const SizedBox(width: T.s12), - Expanded( - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Text( - trip.clientName!, - style: Theme.of(context).textTheme.bodyLarge?.copyWith( - fontWeight: FontWeight.w600, - ), - ), - if (trip.clientPhone != null) - Text( - trip.clientPhone!, - style: Theme.of(context).textTheme.bodySmall?.copyWith( - color: cs.onSurfaceVariant, - ), - ), - ], - ), - ), - ], - ), - - const SizedBox(height: T.s12), - - // نقاط pickup/dropoff - _InfoRow( - dotColor: const Color(0xFF4CAF50), - label: trip.pickupAddress ?? l10n.pickupLocation, - ), - const SizedBox(height: T.s4), - _InfoRow( - dotColor: const Color(0xFFF44336), - label: trip.dropoffAddress ?? l10n.dropoffLocation, - ), - - if (trip.fare != null) ...[ - const SizedBox(height: T.s8), - Text( - '${l10n.tripFare}: ${trip.fare} ${trip.currency ?? ""}', - style: Theme.of(context).textTheme.bodyMedium?.copyWith( - fontWeight: FontWeight.w600, - color: cs.primary, - ), - ), - ], - - const Spacer(), - - // زر الإجراء التالي - TripActionButton(trip: trip), - - if (state.error != null) ...[ - const SizedBox(height: T.s8), - Text( - state.error!, - style: TextStyle(color: cs.error, fontSize: 12), - textAlign: TextAlign.center, - ), - ], - ], - ), - ), - ), - ], - ), - ); - }, - ); - } - - Widget _buildMap(BuildContext context, dynamic trip) { - return IntaleqMap( - apiKey: '', - initialCameraPosition: CameraPosition( - target: LatLng(trip.pickupLat, trip.pickupLng), - zoom: 14, - ), - myLocationEnabled: true, - myLocationButtonEnabled: false, - zoomControlsEnabled: false, - markers: { - Marker( - markerId: const MarkerId('pickup'), - position: LatLng(trip.pickupLat, trip.pickupLng), - infoWindow: InfoWindow(title: AppLocalizations.of(context)!.pickupLocation), - ), - if (trip.dropoffLat != 0 && trip.dropoffLng != 0) - Marker( - markerId: const MarkerId('dropoff'), - position: LatLng(trip.dropoffLat, trip.dropoffLng), - infoWindow: InfoWindow(title: AppLocalizations.of(context)!.dropoffLocation), - ), - }, - ); - } - - String _statusLabel(AppLocalizations l10n, String status) { - switch (status) { - case 'assigned': - return l10n.tripAssigned; - case 'driver_arriving': - return l10n.onTheWay; - case 'driver_arrived': - return l10n.arrivedAtPickup; - case 'in_progress': - return l10n.tripInProgress; - case 'completed': - return l10n.tripCompleted; - default: - return l10n.trip; - } - } - - void _showCancelDialog(BuildContext context, AppLocalizations l10n) { - final cs = Theme.of(context).colorScheme; - showDialog( - context: context, - builder: (ctx) => AlertDialog( - title: Text(l10n.cancelTrip), - content: Text(l10n.cancelTripConfirm), - actions: [ - TextButton( - onPressed: () => Navigator.pop(ctx), - child: Text(l10n.no), - ), - TextButton( - onPressed: () { - Navigator.pop(ctx); - context.read().add(const DriverTripCancelRequested()); - }, - style: TextButton.styleFrom(foregroundColor: cs.error), - child: Text(l10n.yes), - ), - ], - ), - ); - } -} - -class _InfoRow extends StatelessWidget { - final Color dotColor; - final String label; - - const _InfoRow({required this.dotColor, required this.label}); - - @override - Widget build(BuildContext context) { - return Row( - children: [ - Container( - width: 10, - height: 10, - decoration: BoxDecoration( - color: dotColor, - shape: BoxShape.circle, - ), - ), - const SizedBox(width: T.s8), - Expanded( - child: Text( - label, - style: Theme.of(context).textTheme.bodyMedium, - maxLines: 1, - overflow: TextOverflow.ellipsis, - ), - ), - ], - ); - } -} diff --git a/apps/driver-archive-cubit/lib/features/trip/view/widgets/trip_action_button.dart b/apps/driver-archive-cubit/lib/features/trip/view/widgets/trip_action_button.dart deleted file mode 100644 index 676cd46..0000000 --- a/apps/driver-archive-cubit/lib/features/trip/view/widgets/trip_action_button.dart +++ /dev/null @@ -1,161 +0,0 @@ -import 'package:flutter/material.dart'; -import 'package:driver/core/l10n/app_localizations.dart'; -import 'package:flutter_bloc/flutter_bloc.dart'; -import 'package:url_launcher/url_launcher.dart'; -import 'package:driver/core/design/tokens.dart'; -import 'package:driver/core/design/tripz_colors.dart'; -import 'package:driver/features/trip/bloc/driver_trip_bloc.dart'; - -/// زر الإجراء التالي في شاشة تنفيذ الرحلة. -/// -/// الحالة → الزر: -/// - assigned → "في الطريق" (driver_arriving) -/// - driver_arriving → "وصلت" (driver_arrived) -/// - driver_arrived → "بدء الرحلة" (in_progress) -/// - in_progress → "إتمام" (completed) -class TripActionButton extends StatelessWidget { - final dynamic trip; - - const TripActionButton({super.key, required this.trip}); - - @override - Widget build(BuildContext context) { - final l10n = AppLocalizations.of(context)!; - final cs = Theme.of(context).colorScheme; - final bloc = context.watch(); - final state = bloc.state; - - final nextStatus = state.nextStatus; - if (nextStatus == null) return const SizedBox.shrink(); - - final label = _buttonLabel(l10n, nextStatus); - final color = nextStatus == 'completed' - ? context.tripzColors.success - : cs.primary; - - return Column( - mainAxisSize: MainAxisSize.min, - children: [ - // أزرار ثانوية - Row( - children: [ - if (trip.clientPhone != null) ...[ - Expanded( - child: _SecondaryButton( - icon: Icons.phone, - label: l10n.callClient, - onTap: () => _launchPhone(trip.clientPhone!), - ), - ), - const SizedBox(width: T.s8), - ], - Expanded( - child: _SecondaryButton( - icon: Icons.chat_bubble_outline, - label: l10n.chat, - onTap: () { - // TODO: Q4 chat screen - }, - ), - ), - ], - ), - - const SizedBox(height: T.s12), - - // زر الإجراء الرئيسي - SizedBox( - width: double.infinity, - height: T.buttonHeight, - child: ElevatedButton( - onPressed: state.loading - ? null - : () { - bloc.add(DriverTripStatusChanged(nextStatus)); - }, - style: ElevatedButton.styleFrom( - backgroundColor: color, - foregroundColor: Colors.white, - shape: RoundedRectangleBorder( - borderRadius: BorderRadius.circular(T.r12), - ), - elevation: 0, - ), - child: state.loading - ? const SizedBox( - width: 20, - height: 20, - child: CircularProgressIndicator( - strokeWidth: 2, - color: Colors.white, - ), - ) - : Text( - label, - style: const TextStyle( - fontSize: 16, - fontWeight: FontWeight.w600, - ), - ), - ), - ), - ], - ); - } - - String _buttonLabel(AppLocalizations l10n, String status) { - switch (status) { - case 'driver_arriving': - return l10n.onTheWay; - case 'driver_arrived': - return l10n.arrivedAtPickup; - case 'in_progress': - return l10n.startTrip; - case 'completed': - return l10n.completeTrip; - default: - return status; - } - } - - void _launchPhone(String phone) async { - final uri = Uri(scheme: 'tel', path: phone); - if (await canLaunchUrl(uri)) { - await launchUrl(uri); - } - } -} - -/// زر ثانوي صغير. -class _SecondaryButton extends StatelessWidget { - final IconData icon; - final String label; - final VoidCallback onTap; - - const _SecondaryButton({ - required this.icon, - required this.label, - required this.onTap, - }); - - @override - Widget build(BuildContext context) { - return OutlinedButton( - onPressed: onTap, - style: OutlinedButton.styleFrom( - shape: RoundedRectangleBorder( - borderRadius: BorderRadius.circular(T.r12), - ), - minimumSize: const Size(0, T.buttonHeight), - ), - child: Row( - mainAxisAlignment: MainAxisAlignment.center, - children: [ - Icon(icon, size: 18), - const SizedBox(width: T.s4), - Text(label), - ], - ), - ); - } -} diff --git a/apps/driver-archive-cubit/lib/firebase_options.dart b/apps/driver-archive-cubit/lib/firebase_options.dart deleted file mode 100644 index f479d5a..0000000 --- a/apps/driver-archive-cubit/lib/firebase_options.dart +++ /dev/null @@ -1,90 +0,0 @@ -// File generated by FlutterFire CLI. -// ignore_for_file: type=lint -import 'package:firebase_core/firebase_core.dart' show FirebaseOptions; -import 'package:flutter/foundation.dart' - show defaultTargetPlatform, kIsWeb, TargetPlatform; - -/// Default [FirebaseOptions] for use with your Firebase apps. -/// -/// Example: -/// ```dart -/// import 'firebase_options.dart'; -/// // ... -/// await Firebase.initializeApp( -/// options: DefaultFirebaseOptions.currentPlatform, -/// ); -/// ``` -class DefaultFirebaseOptions { - static FirebaseOptions get currentPlatform { - if (kIsWeb) { - return web; - } - switch (defaultTargetPlatform) { - case TargetPlatform.android: - return android; - case TargetPlatform.iOS: - return ios; - case TargetPlatform.macOS: - return macos; - case TargetPlatform.windows: - return windows; - case TargetPlatform.linux: - throw UnsupportedError( - 'DefaultFirebaseOptions have not been configured for linux - ' - 'you can reconfigure this by running the FlutterFire CLI again.', - ); - default: - throw UnsupportedError( - 'DefaultFirebaseOptions are not supported for this platform.', - ); - } - } - - static const FirebaseOptions android = FirebaseOptions( - apiKey: 'AIzaSyCPew9iGolLyI8f-uZUD7QhG4IE0hl20LU', - appId: '1:139325012385:android:a272f0c9aea4e03d9fb3e0', - messagingSenderId: '139325012385', - projectId: 'tripz-7883a', - storageBucket: 'tripz-7883a.firebasestorage.app', - ); - static const FirebaseOptions ios = FirebaseOptions( - apiKey: 'AIzaSyB6chzJf14YXUM9wWXIGNLlHfmNg5Jrw6E', - appId: '1:139325012385:ios:a8221368551c6ef59fb3e0', - messagingSenderId: '139325012385', - projectId: 'tripz-7883a', - storageBucket: 'tripz-7883a.firebasestorage.app', - iosBundleId: 'com.sefer.driver', - ); - static const FirebaseOptions web = FirebaseOptions( - apiKey: 'AIzaSyAVtyV7YVMeLbwA1UlNPxV9FhCzT0kjeAE', - appId: '1:594687661098:web:62d8388476ec91ec595f53', - messagingSenderId: '594687661098', - projectId: 'ride-b1bd8', - authDomain: 'ride-b1bd8.firebaseapp.com', - storageBucket: 'ride-b1bd8.appspot.com', - measurementId: 'G-Y3HFEC6F4N', - ); - - static const FirebaseOptions macos = FirebaseOptions( - apiKey: 'AIzaSyCf2mW2h0HD8ZYjwh4VOa2ladw6MJkCDTM', - appId: '1:594687661098:ios:6f69eee1449be943595f53', - messagingSenderId: '594687661098', - projectId: 'ride-b1bd8', - storageBucket: 'ride-b1bd8.appspot.com', - androidClientId: - '594687661098-2dhoogl7be9phobfbu8bbg1sj567iv88.apps.googleusercontent.com', - iosClientId: - '594687661098-8e26699cris2k3nj5msj1osi59it9kpf.apps.googleusercontent.com', - iosBundleId: 'com.mobileapp.store.ride', - ); - - static const FirebaseOptions windows = FirebaseOptions( - apiKey: 'AIzaSyAVtyV7YVMeLbwA1UlNPxV9FhCzT0kjeAE', - appId: '1:594687661098:web:d9f43a2091395d87595f53', - messagingSenderId: '594687661098', - projectId: 'ride-b1bd8', - authDomain: 'ride-b1bd8.firebaseapp.com', - storageBucket: 'ride-b1bd8.appspot.com', - measurementId: 'G-C3DWQ8Z062', - ); -} diff --git a/apps/driver-archive-cubit/lib/main.dart b/apps/driver-archive-cubit/lib/main.dart deleted file mode 100644 index e89bd34..0000000 --- a/apps/driver-archive-cubit/lib/main.dart +++ /dev/null @@ -1,16 +0,0 @@ -import 'package:flutter/material.dart'; -import 'package:firebase_core/firebase_core.dart'; -import 'firebase_options.dart'; -import 'core/di.dart'; -import 'app.dart'; - -Future main() async { - WidgetsFlutterBinding.ensureInitialized(); - try { - await Firebase.initializeApp(options: DefaultFirebaseOptions.currentPlatform); - } catch (_) { - // لا نُسقط الإقلاع لو تعذّر Firebase - } - await setupDi(); - runApp(const TripzDriverApp()); -} diff --git a/apps/driver-archive-cubit/macos/.gitignore b/apps/driver-archive-cubit/macos/.gitignore deleted file mode 100755 index 746adbb..0000000 --- a/apps/driver-archive-cubit/macos/.gitignore +++ /dev/null @@ -1,7 +0,0 @@ -# Flutter-related -**/Flutter/ephemeral/ -**/Pods/ - -# Xcode-related -**/dgph -**/xcuserdata/ diff --git a/apps/driver-archive-cubit/macos/Flutter/Flutter-Debug.xcconfig b/apps/driver-archive-cubit/macos/Flutter/Flutter-Debug.xcconfig deleted file mode 100755 index 4b81f9b..0000000 --- a/apps/driver-archive-cubit/macos/Flutter/Flutter-Debug.xcconfig +++ /dev/null @@ -1,2 +0,0 @@ -#include? "Pods/Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig" -#include "ephemeral/Flutter-Generated.xcconfig" diff --git a/apps/driver-archive-cubit/macos/Flutter/Flutter-Release.xcconfig b/apps/driver-archive-cubit/macos/Flutter/Flutter-Release.xcconfig deleted file mode 100755 index 5caa9d1..0000000 --- a/apps/driver-archive-cubit/macos/Flutter/Flutter-Release.xcconfig +++ /dev/null @@ -1,2 +0,0 @@ -#include? "Pods/Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig" -#include "ephemeral/Flutter-Generated.xcconfig" diff --git a/apps/driver-archive-cubit/macos/Flutter/GeneratedPluginRegistrant.swift b/apps/driver-archive-cubit/macos/Flutter/GeneratedPluginRegistrant.swift deleted file mode 100755 index f0dab0d..0000000 --- a/apps/driver-archive-cubit/macos/Flutter/GeneratedPluginRegistrant.swift +++ /dev/null @@ -1,40 +0,0 @@ -// -// Generated file. Do not edit. -// - -import FlutterMacOS -import Foundation - -import battery_plus -import connectivity_plus -import device_info_plus -import file_selector_macos -import firebase_core -import firebase_messaging -import flutter_app_group_directory -import flutter_local_notifications -import flutter_secure_storage_macos -import geolocator_apple -import local_auth_darwin -import package_info_plus -import shared_preferences_foundation -import url_launcher_macos -import wakelock_plus - -func RegisterGeneratedPlugins(registry: FlutterPluginRegistry) { - BatteryPlusMacosPlugin.register(with: registry.registrar(forPlugin: "BatteryPlusMacosPlugin")) - ConnectivityPlusPlugin.register(with: registry.registrar(forPlugin: "ConnectivityPlusPlugin")) - DeviceInfoPlusMacosPlugin.register(with: registry.registrar(forPlugin: "DeviceInfoPlusMacosPlugin")) - FileSelectorPlugin.register(with: registry.registrar(forPlugin: "FileSelectorPlugin")) - FLTFirebaseCorePlugin.register(with: registry.registrar(forPlugin: "FLTFirebaseCorePlugin")) - FLTFirebaseMessagingPlugin.register(with: registry.registrar(forPlugin: "FLTFirebaseMessagingPlugin")) - FlutterAppGroupDirectoryPlugin.register(with: registry.registrar(forPlugin: "FlutterAppGroupDirectoryPlugin")) - FlutterLocalNotificationsPlugin.register(with: registry.registrar(forPlugin: "FlutterLocalNotificationsPlugin")) - FlutterSecureStoragePlugin.register(with: registry.registrar(forPlugin: "FlutterSecureStoragePlugin")) - GeolocatorPlugin.register(with: registry.registrar(forPlugin: "GeolocatorPlugin")) - LocalAuthPlugin.register(with: registry.registrar(forPlugin: "LocalAuthPlugin")) - FPPPackageInfoPlusPlugin.register(with: registry.registrar(forPlugin: "FPPPackageInfoPlusPlugin")) - SharedPreferencesPlugin.register(with: registry.registrar(forPlugin: "SharedPreferencesPlugin")) - UrlLauncherPlugin.register(with: registry.registrar(forPlugin: "UrlLauncherPlugin")) - WakelockPlusMacosPlugin.register(with: registry.registrar(forPlugin: "WakelockPlusMacosPlugin")) -} diff --git a/apps/driver-archive-cubit/macos/Podfile b/apps/driver-archive-cubit/macos/Podfile deleted file mode 100755 index c795730..0000000 --- a/apps/driver-archive-cubit/macos/Podfile +++ /dev/null @@ -1,43 +0,0 @@ -platform :osx, '10.14' - -# CocoaPods analytics sends network stats synchronously affecting flutter build latency. -ENV['COCOAPODS_DISABLE_STATS'] = 'true' - -project 'Runner', { - 'Debug' => :debug, - 'Profile' => :release, - 'Release' => :release, -} - -def flutter_root - generated_xcode_build_settings_path = File.expand_path(File.join('..', 'Flutter', 'ephemeral', 'Flutter-Generated.xcconfig'), __FILE__) - unless File.exist?(generated_xcode_build_settings_path) - raise "#{generated_xcode_build_settings_path} must exist. If you're running pod install manually, make sure \"flutter pub get\" is executed first" - end - - File.foreach(generated_xcode_build_settings_path) do |line| - matches = line.match(/FLUTTER_ROOT\=(.*)/) - return matches[1].strip if matches - end - raise "FLUTTER_ROOT not found in #{generated_xcode_build_settings_path}. Try deleting Flutter-Generated.xcconfig, then run \"flutter pub get\"" -end - -require File.expand_path(File.join('packages', 'flutter_tools', 'bin', 'podhelper'), flutter_root) - -flutter_macos_podfile_setup - -target 'Runner' do - use_frameworks! - use_modular_headers! - - flutter_install_all_macos_pods File.dirname(File.realpath(__FILE__)) - target 'RunnerTests' do - inherit! :search_paths - end -end - -post_install do |installer| - installer.pods_project.targets.each do |target| - flutter_additional_macos_build_settings(target) - end -end diff --git a/apps/driver-archive-cubit/macos/Podfile.lock b/apps/driver-archive-cubit/macos/Podfile.lock deleted file mode 100755 index d259d49..0000000 --- a/apps/driver-archive-cubit/macos/Podfile.lock +++ /dev/null @@ -1,197 +0,0 @@ -PODS: - - audio_session (0.0.1): - - FlutterMacOS - - device_info_plus (0.0.1): - - FlutterMacOS - - file_selector_macos (0.0.1): - - FlutterMacOS - - Firebase/CoreOnly (10.18.0): - - FirebaseCore (= 10.18.0) - - Firebase/Messaging (10.18.0): - - Firebase/CoreOnly - - FirebaseMessaging (~> 10.18.0) - - firebase_core (2.23.0): - - Firebase/CoreOnly (~> 10.18.0) - - FlutterMacOS - - firebase_messaging (14.7.5): - - Firebase/CoreOnly (~> 10.18.0) - - Firebase/Messaging (~> 10.18.0) - - firebase_core - - FlutterMacOS - - FirebaseCore (10.18.0): - - FirebaseCoreInternal (~> 10.0) - - GoogleUtilities/Environment (~> 7.12) - - GoogleUtilities/Logger (~> 7.12) - - FirebaseCoreInternal (10.19.0): - - "GoogleUtilities/NSData+zlib (~> 7.8)" - - FirebaseInstallations (10.19.0): - - FirebaseCore (~> 10.0) - - GoogleUtilities/Environment (~> 7.8) - - GoogleUtilities/UserDefaults (~> 7.8) - - PromisesObjC (~> 2.1) - - FirebaseMessaging (10.18.0): - - FirebaseCore (~> 10.0) - - FirebaseInstallations (~> 10.0) - - GoogleDataTransport (~> 9.2) - - GoogleUtilities/AppDelegateSwizzler (~> 7.8) - - GoogleUtilities/Environment (~> 7.8) - - GoogleUtilities/Reachability (~> 7.8) - - GoogleUtilities/UserDefaults (~> 7.8) - - nanopb (< 2.30910.0, >= 2.30908.0) - - flutter_local_notifications (0.0.1): - - FlutterMacOS - - flutter_secure_storage_macos (6.1.1): - - FlutterMacOS - - FlutterMacOS (1.0.0) - - FMDB (2.7.5): - - FMDB/standard (= 2.7.5) - - FMDB/standard (2.7.5) - - geolocator_apple (1.2.0): - - FlutterMacOS - - GoogleDataTransport (9.3.0): - - GoogleUtilities/Environment (~> 7.7) - - nanopb (< 2.30910.0, >= 2.30908.0) - - PromisesObjC (< 3.0, >= 1.2) - - GoogleUtilities/AppDelegateSwizzler (7.12.0): - - GoogleUtilities/Environment - - GoogleUtilities/Logger - - GoogleUtilities/Network - - GoogleUtilities/Environment (7.12.0): - - PromisesObjC (< 3.0, >= 1.2) - - GoogleUtilities/Logger (7.12.0): - - GoogleUtilities/Environment - - GoogleUtilities/Network (7.12.0): - - GoogleUtilities/Logger - - "GoogleUtilities/NSData+zlib" - - GoogleUtilities/Reachability - - "GoogleUtilities/NSData+zlib (7.12.0)" - - GoogleUtilities/Reachability (7.12.0): - - GoogleUtilities/Logger - - GoogleUtilities/UserDefaults (7.12.0): - - GoogleUtilities/Logger - - just_audio (0.0.1): - - FlutterMacOS - - location (0.0.1): - - FlutterMacOS - - nanopb (2.30909.1): - - nanopb/decode (= 2.30909.1) - - nanopb/encode (= 2.30909.1) - - nanopb/decode (2.30909.1) - - nanopb/encode (2.30909.1) - - package_info_plus (0.0.1): - - FlutterMacOS - - path_provider_foundation (0.0.1): - - Flutter - - FlutterMacOS - - PromisesObjC (2.3.1) - - sqflite (0.0.2): - - FlutterMacOS - - FMDB (>= 2.7.5) - - url_launcher_macos (0.0.1): - - FlutterMacOS - - video_player_avfoundation (0.0.1): - - Flutter - - FlutterMacOS - - wakelock_plus (0.0.1): - - FlutterMacOS - -DEPENDENCIES: - - audio_session (from `Flutter/ephemeral/.symlinks/plugins/audio_session/macos`) - - device_info_plus (from `Flutter/ephemeral/.symlinks/plugins/device_info_plus/macos`) - - file_selector_macos (from `Flutter/ephemeral/.symlinks/plugins/file_selector_macos/macos`) - - firebase_core (from `Flutter/ephemeral/.symlinks/plugins/firebase_core/macos`) - - firebase_messaging (from `Flutter/ephemeral/.symlinks/plugins/firebase_messaging/macos`) - - flutter_local_notifications (from `Flutter/ephemeral/.symlinks/plugins/flutter_local_notifications/macos`) - - flutter_secure_storage_macos (from `Flutter/ephemeral/.symlinks/plugins/flutter_secure_storage_macos/macos`) - - FlutterMacOS (from `Flutter/ephemeral`) - - geolocator_apple (from `Flutter/ephemeral/.symlinks/plugins/geolocator_apple/macos`) - - just_audio (from `Flutter/ephemeral/.symlinks/plugins/just_audio/macos`) - - location (from `Flutter/ephemeral/.symlinks/plugins/location/macos`) - - package_info_plus (from `Flutter/ephemeral/.symlinks/plugins/package_info_plus/macos`) - - path_provider_foundation (from `Flutter/ephemeral/.symlinks/plugins/path_provider_foundation/darwin`) - - sqflite (from `Flutter/ephemeral/.symlinks/plugins/sqflite/macos`) - - url_launcher_macos (from `Flutter/ephemeral/.symlinks/plugins/url_launcher_macos/macos`) - - video_player_avfoundation (from `Flutter/ephemeral/.symlinks/plugins/video_player_avfoundation/darwin`) - - wakelock_plus (from `Flutter/ephemeral/.symlinks/plugins/wakelock_plus/macos`) - -SPEC REPOS: - trunk: - - Firebase - - FirebaseCore - - FirebaseCoreInternal - - FirebaseInstallations - - FirebaseMessaging - - FMDB - - GoogleDataTransport - - GoogleUtilities - - nanopb - - PromisesObjC - -EXTERNAL SOURCES: - audio_session: - :path: Flutter/ephemeral/.symlinks/plugins/audio_session/macos - device_info_plus: - :path: Flutter/ephemeral/.symlinks/plugins/device_info_plus/macos - file_selector_macos: - :path: Flutter/ephemeral/.symlinks/plugins/file_selector_macos/macos - firebase_core: - :path: Flutter/ephemeral/.symlinks/plugins/firebase_core/macos - firebase_messaging: - :path: Flutter/ephemeral/.symlinks/plugins/firebase_messaging/macos - flutter_local_notifications: - :path: Flutter/ephemeral/.symlinks/plugins/flutter_local_notifications/macos - flutter_secure_storage_macos: - :path: Flutter/ephemeral/.symlinks/plugins/flutter_secure_storage_macos/macos - FlutterMacOS: - :path: Flutter/ephemeral - geolocator_apple: - :path: Flutter/ephemeral/.symlinks/plugins/geolocator_apple/macos - just_audio: - :path: Flutter/ephemeral/.symlinks/plugins/just_audio/macos - location: - :path: Flutter/ephemeral/.symlinks/plugins/location/macos - package_info_plus: - :path: Flutter/ephemeral/.symlinks/plugins/package_info_plus/macos - path_provider_foundation: - :path: Flutter/ephemeral/.symlinks/plugins/path_provider_foundation/darwin - sqflite: - :path: Flutter/ephemeral/.symlinks/plugins/sqflite/macos - url_launcher_macos: - :path: Flutter/ephemeral/.symlinks/plugins/url_launcher_macos/macos - video_player_avfoundation: - :path: Flutter/ephemeral/.symlinks/plugins/video_player_avfoundation/darwin - wakelock_plus: - :path: Flutter/ephemeral/.symlinks/plugins/wakelock_plus/macos - -SPEC CHECKSUMS: - audio_session: dea1f41890dbf1718f04a56f1d6150fd50039b72 - device_info_plus: 5401765fde0b8d062a2f8eb65510fb17e77cf07f - file_selector_macos: 468fb6b81fac7c0e88d71317f3eec34c3b008ff9 - Firebase: 414ad272f8d02dfbf12662a9d43f4bba9bec2a06 - firebase_core: b57f52ccb63d2700bf22bc65ca0b08c66135ae6e - firebase_messaging: 9a572e87106da8843fa3b00c874e17cfacafaa71 - FirebaseCore: 2322423314d92f946219c8791674d2f3345b598f - FirebaseCoreInternal: b444828ea7cfd594fca83046b95db98a2be4f290 - FirebaseInstallations: 033d199474164db20c8350736842a94fe717b960 - FirebaseMessaging: 9bc34a98d2e0237e1b121915120d4d48ddcf301e - flutter_local_notifications: 3805ca215b2fb7f397d78b66db91f6a747af52e4 - flutter_secure_storage_macos: d56e2d218c1130b262bef8b4a7d64f88d7f9c9ea - FlutterMacOS: 8f6f14fa908a6fb3fba0cd85dbd81ec4b251fb24 - FMDB: 2ce00b547f966261cd18927a3ddb07cb6f3db82a - geolocator_apple: 72a78ae3f3e4ec0db62117bd93e34523f5011d58 - GoogleDataTransport: 57c22343ab29bc686febbf7cbb13bad167c2d8fe - GoogleUtilities: 0759d1a57ebb953965c2dfe0ba4c82e95ccc2e34 - just_audio: 9b67ca7b97c61cfc9784ea23cd8cc55eb226d489 - location: 7cdb0665bd6577d382b0a343acdadbcb7f964775 - nanopb: d4d75c12cd1316f4a64e3c6963f879ecd4b5e0d5 - package_info_plus: 02d7a575e80f194102bef286361c6c326e4c29ce - path_provider_foundation: 29f094ae23ebbca9d3d0cec13889cd9060c0e943 - PromisesObjC: c50d2056b5253dadbd6c2bea79b0674bd5a52fa4 - sqflite: a5789cceda41d54d23f31d6de539d65bb14100ea - url_launcher_macos: d2691c7dd33ed713bf3544850a623080ec693d95 - video_player_avfoundation: e9e6f9cae7d7a6d9b43519b0aab382bca60fcfd1 - wakelock_plus: 4783562c9a43d209c458cb9b30692134af456269 - -PODFILE CHECKSUM: 236401fc2c932af29a9fcf0e97baeeb2d750d367 - -COCOAPODS: 1.13.0 diff --git a/apps/driver-archive-cubit/macos/Runner.xcodeproj/project.pbxproj b/apps/driver-archive-cubit/macos/Runner.xcodeproj/project.pbxproj deleted file mode 100755 index 2c25330..0000000 --- a/apps/driver-archive-cubit/macos/Runner.xcodeproj/project.pbxproj +++ /dev/null @@ -1,699 +0,0 @@ -// !$*UTF8*$! -{ - archiveVersion = 1; - classes = { - }; - objectVersion = 54; - objects = { - -/* Begin PBXAggregateTarget section */ - 33CC111A2044C6BA0003C045 /* Flutter Assemble */ = { - isa = PBXAggregateTarget; - buildConfigurationList = 33CC111B2044C6BA0003C045 /* Build configuration list for PBXAggregateTarget "Flutter Assemble" */; - buildPhases = ( - 33CC111E2044C6BF0003C045 /* ShellScript */, - ); - dependencies = ( - ); - name = "Flutter Assemble"; - productName = FLX; - }; -/* End PBXAggregateTarget section */ - -/* Begin PBXBuildFile section */ - 331C80D8294CF71000263BE5 /* RunnerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 331C80D7294CF71000263BE5 /* RunnerTests.swift */; }; - 335BBD1B22A9A15E00E9071D /* GeneratedPluginRegistrant.swift in Sources */ = {isa = PBXBuildFile; fileRef = 335BBD1A22A9A15E00E9071D /* GeneratedPluginRegistrant.swift */; }; - 33CC10F12044A3C60003C045 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 33CC10F02044A3C60003C045 /* AppDelegate.swift */; }; - 33CC10F32044A3C60003C045 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 33CC10F22044A3C60003C045 /* Assets.xcassets */; }; - 33CC10F62044A3C60003C045 /* MainMenu.xib in Resources */ = {isa = PBXBuildFile; fileRef = 33CC10F42044A3C60003C045 /* MainMenu.xib */; }; - 33CC11132044BFA00003C045 /* MainFlutterWindow.swift in Sources */ = {isa = PBXBuildFile; fileRef = 33CC11122044BFA00003C045 /* MainFlutterWindow.swift */; }; - 5FF20D1C7FA311876020D2FA /* GoogleService-Info.plist in Resources */ = {isa = PBXBuildFile; fileRef = 0D357E3E229DEB5E9B861200 /* GoogleService-Info.plist */; }; -/* End PBXBuildFile section */ - -/* Begin PBXContainerItemProxy section */ - 331C80D9294CF71000263BE5 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 33CC10E52044A3C60003C045 /* Project object */; - proxyType = 1; - remoteGlobalIDString = 33CC10EC2044A3C60003C045; - remoteInfo = Runner; - }; - 33CC111F2044C79F0003C045 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 33CC10E52044A3C60003C045 /* Project object */; - proxyType = 1; - remoteGlobalIDString = 33CC111A2044C6BA0003C045; - remoteInfo = FLX; - }; -/* End PBXContainerItemProxy section */ - -/* Begin PBXCopyFilesBuildPhase section */ - 33CC110E2044A8840003C045 /* Bundle Framework */ = { - isa = PBXCopyFilesBuildPhase; - buildActionMask = 2147483647; - dstPath = ""; - dstSubfolderSpec = 10; - files = ( - ); - name = "Bundle Framework"; - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXCopyFilesBuildPhase section */ - -/* Begin PBXFileReference section */ - 0D357E3E229DEB5E9B861200 /* GoogleService-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; name = "GoogleService-Info.plist"; path = "Runner/GoogleService-Info.plist"; sourceTree = ""; }; - 331C80D5294CF71000263BE5 /* RunnerTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = RunnerTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; - 331C80D7294CF71000263BE5 /* RunnerTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RunnerTests.swift; sourceTree = ""; }; - 333000ED22D3DE5D00554162 /* Warnings.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Warnings.xcconfig; sourceTree = ""; }; - 335BBD1A22A9A15E00E9071D /* GeneratedPluginRegistrant.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = GeneratedPluginRegistrant.swift; sourceTree = ""; }; - 33CC10ED2044A3C60003C045 /* ride.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = ride.app; sourceTree = BUILT_PRODUCTS_DIR; }; - 33CC10F02044A3C60003C045 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; - 33CC10F22044A3C60003C045 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; name = Assets.xcassets; path = Runner/Assets.xcassets; sourceTree = ""; }; - 33CC10F52044A3C60003C045 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/MainMenu.xib; sourceTree = ""; }; - 33CC10F72044A3C60003C045 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; name = Info.plist; path = Runner/Info.plist; sourceTree = ""; }; - 33CC11122044BFA00003C045 /* MainFlutterWindow.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MainFlutterWindow.swift; sourceTree = ""; }; - 33CEB47222A05771004F2AC0 /* Flutter-Debug.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = "Flutter-Debug.xcconfig"; sourceTree = ""; }; - 33CEB47422A05771004F2AC0 /* Flutter-Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = "Flutter-Release.xcconfig"; sourceTree = ""; }; - 33CEB47722A0578A004F2AC0 /* Flutter-Generated.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = "Flutter-Generated.xcconfig"; path = "ephemeral/Flutter-Generated.xcconfig"; sourceTree = ""; }; - 33E51913231747F40026EE4D /* DebugProfile.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = DebugProfile.entitlements; sourceTree = ""; }; - 33E51914231749380026EE4D /* Release.entitlements */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.entitlements; path = Release.entitlements; sourceTree = ""; }; - 33E5194F232828860026EE4D /* AppInfo.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = AppInfo.xcconfig; sourceTree = ""; }; - 7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Release.xcconfig; sourceTree = ""; }; - 9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = Debug.xcconfig; sourceTree = ""; }; -/* End PBXFileReference section */ - -/* Begin PBXFrameworksBuildPhase section */ - 331C80D2294CF70F00263BE5 /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 33CC10EA2044A3C60003C045 /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXFrameworksBuildPhase section */ - -/* Begin PBXGroup section */ - 331C80D6294CF71000263BE5 /* RunnerTests */ = { - isa = PBXGroup; - children = ( - 331C80D7294CF71000263BE5 /* RunnerTests.swift */, - ); - path = RunnerTests; - sourceTree = ""; - }; - 33BA886A226E78AF003329D5 /* Configs */ = { - isa = PBXGroup; - children = ( - 33E5194F232828860026EE4D /* AppInfo.xcconfig */, - 9740EEB21CF90195004384FC /* Debug.xcconfig */, - 7AFA3C8E1D35360C0083082E /* Release.xcconfig */, - 333000ED22D3DE5D00554162 /* Warnings.xcconfig */, - ); - path = Configs; - sourceTree = ""; - }; - 33CC10E42044A3C60003C045 = { - isa = PBXGroup; - children = ( - 33FAB671232836740065AC1E /* Runner */, - 33CEB47122A05771004F2AC0 /* Flutter */, - 331C80D6294CF71000263BE5 /* RunnerTests */, - 33CC10EE2044A3C60003C045 /* Products */, - D73912EC22F37F3D000D13A0 /* Frameworks */, - 0D357E3E229DEB5E9B861200 /* GoogleService-Info.plist */, - ); - sourceTree = ""; - }; - 33CC10EE2044A3C60003C045 /* Products */ = { - isa = PBXGroup; - children = ( - 33CC10ED2044A3C60003C045 /* ride.app */, - 331C80D5294CF71000263BE5 /* RunnerTests.xctest */, - ); - name = Products; - sourceTree = ""; - }; - 33CC11242044D66E0003C045 /* Resources */ = { - isa = PBXGroup; - children = ( - 33CC10F22044A3C60003C045 /* Assets.xcassets */, - 33CC10F42044A3C60003C045 /* MainMenu.xib */, - 33CC10F72044A3C60003C045 /* Info.plist */, - ); - name = Resources; - path = ..; - sourceTree = ""; - }; - 33CEB47122A05771004F2AC0 /* Flutter */ = { - isa = PBXGroup; - children = ( - 335BBD1A22A9A15E00E9071D /* GeneratedPluginRegistrant.swift */, - 33CEB47222A05771004F2AC0 /* Flutter-Debug.xcconfig */, - 33CEB47422A05771004F2AC0 /* Flutter-Release.xcconfig */, - 33CEB47722A0578A004F2AC0 /* Flutter-Generated.xcconfig */, - ); - path = Flutter; - sourceTree = ""; - }; - 33FAB671232836740065AC1E /* Runner */ = { - isa = PBXGroup; - children = ( - 33CC10F02044A3C60003C045 /* AppDelegate.swift */, - 33CC11122044BFA00003C045 /* MainFlutterWindow.swift */, - 33E51913231747F40026EE4D /* DebugProfile.entitlements */, - 33E51914231749380026EE4D /* Release.entitlements */, - 33CC11242044D66E0003C045 /* Resources */, - 33BA886A226E78AF003329D5 /* Configs */, - ); - path = Runner; - sourceTree = ""; - }; - D73912EC22F37F3D000D13A0 /* Frameworks */ = { - isa = PBXGroup; - children = ( - ); - name = Frameworks; - sourceTree = ""; - }; -/* End PBXGroup section */ - -/* Begin PBXNativeTarget section */ - 331C80D4294CF70F00263BE5 /* RunnerTests */ = { - isa = PBXNativeTarget; - buildConfigurationList = 331C80DE294CF71000263BE5 /* Build configuration list for PBXNativeTarget "RunnerTests" */; - buildPhases = ( - 331C80D1294CF70F00263BE5 /* Sources */, - 331C80D2294CF70F00263BE5 /* Frameworks */, - 331C80D3294CF70F00263BE5 /* Resources */, - ); - buildRules = ( - ); - dependencies = ( - 331C80DA294CF71000263BE5 /* PBXTargetDependency */, - ); - name = RunnerTests; - productName = RunnerTests; - productReference = 331C80D5294CF71000263BE5 /* RunnerTests.xctest */; - productType = "com.apple.product-type.bundle.unit-test"; - }; - 33CC10EC2044A3C60003C045 /* Runner */ = { - isa = PBXNativeTarget; - buildConfigurationList = 33CC10FB2044A3C60003C045 /* Build configuration list for PBXNativeTarget "Runner" */; - buildPhases = ( - 33CC10E92044A3C60003C045 /* Sources */, - 33CC10EA2044A3C60003C045 /* Frameworks */, - 33CC10EB2044A3C60003C045 /* Resources */, - 33CC110E2044A8840003C045 /* Bundle Framework */, - 3399D490228B24CF009A79C7 /* ShellScript */, - ); - buildRules = ( - ); - dependencies = ( - 33CC11202044C79F0003C045 /* PBXTargetDependency */, - ); - name = Runner; - productName = Runner; - productReference = 33CC10ED2044A3C60003C045 /* ride.app */; - productType = "com.apple.product-type.application"; - }; -/* End PBXNativeTarget section */ - -/* Begin PBXProject section */ - 33CC10E52044A3C60003C045 /* Project object */ = { - isa = PBXProject; - attributes = { - LastSwiftUpdateCheck = 0920; - LastUpgradeCheck = 1510; - ORGANIZATIONNAME = ""; - TargetAttributes = { - 331C80D4294CF70F00263BE5 = { - CreatedOnToolsVersion = 14.0; - TestTargetID = 33CC10EC2044A3C60003C045; - }; - 33CC10EC2044A3C60003C045 = { - CreatedOnToolsVersion = 9.2; - LastSwiftMigration = 1100; - ProvisioningStyle = Automatic; - SystemCapabilities = { - com.apple.Sandbox = { - enabled = 1; - }; - }; - }; - 33CC111A2044C6BA0003C045 = { - CreatedOnToolsVersion = 9.2; - ProvisioningStyle = Manual; - }; - }; - }; - buildConfigurationList = 33CC10E82044A3C60003C045 /* Build configuration list for PBXProject "Runner" */; - compatibilityVersion = "Xcode 9.3"; - developmentRegion = en; - hasScannedForEncodings = 0; - knownRegions = ( - en, - Base, - ); - mainGroup = 33CC10E42044A3C60003C045; - productRefGroup = 33CC10EE2044A3C60003C045 /* Products */; - projectDirPath = ""; - projectRoot = ""; - targets = ( - 33CC10EC2044A3C60003C045 /* Runner */, - 331C80D4294CF70F00263BE5 /* RunnerTests */, - 33CC111A2044C6BA0003C045 /* Flutter Assemble */, - ); - }; -/* End PBXProject section */ - -/* Begin PBXResourcesBuildPhase section */ - 331C80D3294CF70F00263BE5 /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 33CC10EB2044A3C60003C045 /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 33CC10F32044A3C60003C045 /* Assets.xcassets in Resources */, - 33CC10F62044A3C60003C045 /* MainMenu.xib in Resources */, - 5FF20D1C7FA311876020D2FA /* GoogleService-Info.plist in Resources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXResourcesBuildPhase section */ - -/* Begin PBXShellScriptBuildPhase section */ - 3399D490228B24CF009A79C7 /* ShellScript */ = { - isa = PBXShellScriptBuildPhase; - alwaysOutOfDate = 1; - buildActionMask = 2147483647; - files = ( - ); - inputFileListPaths = ( - ); - inputPaths = ( - ); - outputFileListPaths = ( - ); - outputPaths = ( - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "echo \"$PRODUCT_NAME.app\" > \"$PROJECT_DIR\"/Flutter/ephemeral/.app_filename && \"$FLUTTER_ROOT\"/packages/flutter_tools/bin/macos_assemble.sh embed\n"; - }; - 33CC111E2044C6BF0003C045 /* ShellScript */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputFileListPaths = ( - Flutter/ephemeral/FlutterInputs.xcfilelist, - ); - inputPaths = ( - Flutter/ephemeral/tripwire, - ); - outputFileListPaths = ( - Flutter/ephemeral/FlutterOutputs.xcfilelist, - ); - outputPaths = ( - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "\"$FLUTTER_ROOT\"/packages/flutter_tools/bin/macos_assemble.sh && touch Flutter/ephemeral/tripwire"; - }; -/* End PBXShellScriptBuildPhase section */ - -/* Begin PBXSourcesBuildPhase section */ - 331C80D1294CF70F00263BE5 /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 331C80D8294CF71000263BE5 /* RunnerTests.swift in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 33CC10E92044A3C60003C045 /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 33CC11132044BFA00003C045 /* MainFlutterWindow.swift in Sources */, - 33CC10F12044A3C60003C045 /* AppDelegate.swift in Sources */, - 335BBD1B22A9A15E00E9071D /* GeneratedPluginRegistrant.swift in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXSourcesBuildPhase section */ - -/* Begin PBXTargetDependency section */ - 331C80DA294CF71000263BE5 /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - target = 33CC10EC2044A3C60003C045 /* Runner */; - targetProxy = 331C80D9294CF71000263BE5 /* PBXContainerItemProxy */; - }; - 33CC11202044C79F0003C045 /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - target = 33CC111A2044C6BA0003C045 /* Flutter Assemble */; - targetProxy = 33CC111F2044C79F0003C045 /* PBXContainerItemProxy */; - }; -/* End PBXTargetDependency section */ - -/* Begin PBXVariantGroup section */ - 33CC10F42044A3C60003C045 /* MainMenu.xib */ = { - isa = PBXVariantGroup; - children = ( - 33CC10F52044A3C60003C045 /* Base */, - ); - name = MainMenu.xib; - path = Runner; - sourceTree = ""; - }; -/* End PBXVariantGroup section */ - -/* Begin XCBuildConfiguration section */ - 331C80DB294CF71000263BE5 /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - BUNDLE_LOADER = "$(TEST_HOST)"; - CURRENT_PROJECT_VERSION = 1; - GENERATE_INFOPLIST_FILE = YES; - MARKETING_VERSION = 1.0; - PRODUCT_BUNDLE_IDENTIFIER = com.mobileapp.store.ride.RunnerTests; - PRODUCT_NAME = "$(TARGET_NAME)"; - SWIFT_VERSION = 5.0; - TEST_HOST = "$(BUILT_PRODUCTS_DIR)/ride.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/ride"; - }; - name = Debug; - }; - 331C80DC294CF71000263BE5 /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - BUNDLE_LOADER = "$(TEST_HOST)"; - CURRENT_PROJECT_VERSION = 1; - GENERATE_INFOPLIST_FILE = YES; - MARKETING_VERSION = 1.0; - PRODUCT_BUNDLE_IDENTIFIER = com.mobileapp.store.ride.RunnerTests; - PRODUCT_NAME = "$(TARGET_NAME)"; - SWIFT_VERSION = 5.0; - TEST_HOST = "$(BUILT_PRODUCTS_DIR)/ride.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/ride"; - }; - name = Release; - }; - 331C80DD294CF71000263BE5 /* Profile */ = { - isa = XCBuildConfiguration; - buildSettings = { - BUNDLE_LOADER = "$(TEST_HOST)"; - CURRENT_PROJECT_VERSION = 1; - GENERATE_INFOPLIST_FILE = YES; - MARKETING_VERSION = 1.0; - PRODUCT_BUNDLE_IDENTIFIER = com.mobileapp.store.ride.RunnerTests; - PRODUCT_NAME = "$(TARGET_NAME)"; - SWIFT_VERSION = 5.0; - TEST_HOST = "$(BUILT_PRODUCTS_DIR)/ride.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/ride"; - }; - name = Profile; - }; - 338D0CE9231458BD00FA5F75 /* Profile */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - CLANG_ANALYZER_NONNULL = YES; - CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; - CLANG_CXX_LIBRARY = "libc++"; - CLANG_ENABLE_MODULES = YES; - CLANG_ENABLE_OBJC_ARC = YES; - CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; - CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; - CLANG_WARN_DOCUMENTATION_COMMENTS = YES; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INFINITE_RECURSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; - CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; - CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; - CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; - CLANG_WARN_SUSPICIOUS_MOVE = YES; - CODE_SIGN_IDENTITY = "-"; - COPY_PHASE_STRIP = NO; - DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; - ENABLE_NS_ASSERTIONS = NO; - ENABLE_STRICT_OBJC_MSGSEND = YES; - GCC_C_LANGUAGE_STANDARD = gnu11; - GCC_NO_COMMON_BLOCKS = YES; - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; - GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; - GCC_WARN_UNUSED_FUNCTION = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - MACOSX_DEPLOYMENT_TARGET = 10.14; - MTL_ENABLE_DEBUG_INFO = NO; - SDKROOT = macosx; - SWIFT_COMPILATION_MODE = wholemodule; - SWIFT_OPTIMIZATION_LEVEL = "-O"; - }; - name = Profile; - }; - 338D0CEA231458BD00FA5F75 /* Profile */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 33E5194F232828860026EE4D /* AppInfo.xcconfig */; - buildSettings = { - ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; - CLANG_ENABLE_MODULES = YES; - CODE_SIGN_ENTITLEMENTS = Runner/DebugProfile.entitlements; - CODE_SIGN_STYLE = Automatic; - COMBINE_HIDPI_IMAGES = YES; - INFOPLIST_FILE = Runner/Info.plist; - LD_RUNPATH_SEARCH_PATHS = ( - "$(inherited)", - "@executable_path/../Frameworks", - ); - PROVISIONING_PROFILE_SPECIFIER = ""; - SWIFT_VERSION = 5.0; - }; - name = Profile; - }; - 338D0CEB231458BD00FA5F75 /* Profile */ = { - isa = XCBuildConfiguration; - buildSettings = { - CODE_SIGN_STYLE = Manual; - PRODUCT_NAME = "$(TARGET_NAME)"; - }; - name = Profile; - }; - 33CC10F92044A3C60003C045 /* Debug */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 9740EEB21CF90195004384FC /* Debug.xcconfig */; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - CLANG_ANALYZER_NONNULL = YES; - CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; - CLANG_CXX_LIBRARY = "libc++"; - CLANG_ENABLE_MODULES = YES; - CLANG_ENABLE_OBJC_ARC = YES; - CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; - CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; - CLANG_WARN_DOCUMENTATION_COMMENTS = YES; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INFINITE_RECURSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; - CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; - CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; - CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; - CLANG_WARN_SUSPICIOUS_MOVE = YES; - CODE_SIGN_IDENTITY = "-"; - COPY_PHASE_STRIP = NO; - DEBUG_INFORMATION_FORMAT = dwarf; - ENABLE_STRICT_OBJC_MSGSEND = YES; - ENABLE_TESTABILITY = YES; - GCC_C_LANGUAGE_STANDARD = gnu11; - GCC_DYNAMIC_NO_PIC = NO; - GCC_NO_COMMON_BLOCKS = YES; - GCC_OPTIMIZATION_LEVEL = 0; - GCC_PREPROCESSOR_DEFINITIONS = ( - "DEBUG=1", - "$(inherited)", - ); - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; - GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; - GCC_WARN_UNUSED_FUNCTION = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - MACOSX_DEPLOYMENT_TARGET = 10.14; - MTL_ENABLE_DEBUG_INFO = YES; - ONLY_ACTIVE_ARCH = YES; - SDKROOT = macosx; - SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; - SWIFT_OPTIMIZATION_LEVEL = "-Onone"; - }; - name = Debug; - }; - 33CC10FA2044A3C60003C045 /* Release */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - CLANG_ANALYZER_NONNULL = YES; - CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; - CLANG_CXX_LIBRARY = "libc++"; - CLANG_ENABLE_MODULES = YES; - CLANG_ENABLE_OBJC_ARC = YES; - CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; - CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; - CLANG_WARN_DOCUMENTATION_COMMENTS = YES; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INFINITE_RECURSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; - CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; - CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; - CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; - CLANG_WARN_SUSPICIOUS_MOVE = YES; - CODE_SIGN_IDENTITY = "-"; - COPY_PHASE_STRIP = NO; - DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; - ENABLE_NS_ASSERTIONS = NO; - ENABLE_STRICT_OBJC_MSGSEND = YES; - GCC_C_LANGUAGE_STANDARD = gnu11; - GCC_NO_COMMON_BLOCKS = YES; - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; - GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; - GCC_WARN_UNUSED_FUNCTION = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - MACOSX_DEPLOYMENT_TARGET = 10.14; - MTL_ENABLE_DEBUG_INFO = NO; - SDKROOT = macosx; - SWIFT_COMPILATION_MODE = wholemodule; - SWIFT_OPTIMIZATION_LEVEL = "-O"; - }; - name = Release; - }; - 33CC10FC2044A3C60003C045 /* Debug */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 33E5194F232828860026EE4D /* AppInfo.xcconfig */; - buildSettings = { - ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; - CLANG_ENABLE_MODULES = YES; - CODE_SIGN_ENTITLEMENTS = Runner/DebugProfile.entitlements; - CODE_SIGN_STYLE = Automatic; - COMBINE_HIDPI_IMAGES = YES; - INFOPLIST_FILE = Runner/Info.plist; - LD_RUNPATH_SEARCH_PATHS = ( - "$(inherited)", - "@executable_path/../Frameworks", - ); - PROVISIONING_PROFILE_SPECIFIER = ""; - SWIFT_OPTIMIZATION_LEVEL = "-Onone"; - SWIFT_VERSION = 5.0; - }; - name = Debug; - }; - 33CC10FD2044A3C60003C045 /* Release */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 33E5194F232828860026EE4D /* AppInfo.xcconfig */; - buildSettings = { - ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; - CLANG_ENABLE_MODULES = YES; - CODE_SIGN_ENTITLEMENTS = Runner/Release.entitlements; - CODE_SIGN_STYLE = Automatic; - COMBINE_HIDPI_IMAGES = YES; - INFOPLIST_FILE = Runner/Info.plist; - LD_RUNPATH_SEARCH_PATHS = ( - "$(inherited)", - "@executable_path/../Frameworks", - ); - PROVISIONING_PROFILE_SPECIFIER = ""; - SWIFT_VERSION = 5.0; - }; - name = Release; - }; - 33CC111C2044C6BA0003C045 /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - CODE_SIGN_STYLE = Manual; - PRODUCT_NAME = "$(TARGET_NAME)"; - }; - name = Debug; - }; - 33CC111D2044C6BA0003C045 /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - CODE_SIGN_STYLE = Automatic; - PRODUCT_NAME = "$(TARGET_NAME)"; - }; - name = Release; - }; -/* End XCBuildConfiguration section */ - -/* Begin XCConfigurationList section */ - 331C80DE294CF71000263BE5 /* Build configuration list for PBXNativeTarget "RunnerTests" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 331C80DB294CF71000263BE5 /* Debug */, - 331C80DC294CF71000263BE5 /* Release */, - 331C80DD294CF71000263BE5 /* Profile */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - 33CC10E82044A3C60003C045 /* Build configuration list for PBXProject "Runner" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 33CC10F92044A3C60003C045 /* Debug */, - 33CC10FA2044A3C60003C045 /* Release */, - 338D0CE9231458BD00FA5F75 /* Profile */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - 33CC10FB2044A3C60003C045 /* Build configuration list for PBXNativeTarget "Runner" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 33CC10FC2044A3C60003C045 /* Debug */, - 33CC10FD2044A3C60003C045 /* Release */, - 338D0CEA231458BD00FA5F75 /* Profile */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - 33CC111B2044C6BA0003C045 /* Build configuration list for PBXAggregateTarget "Flutter Assemble" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 33CC111C2044C6BA0003C045 /* Debug */, - 33CC111D2044C6BA0003C045 /* Release */, - 338D0CEB231458BD00FA5F75 /* Profile */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; -/* End XCConfigurationList section */ - }; - rootObject = 33CC10E52044A3C60003C045 /* Project object */; -} diff --git a/apps/driver-archive-cubit/macos/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/apps/driver-archive-cubit/macos/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist deleted file mode 100755 index 18d9810..0000000 --- a/apps/driver-archive-cubit/macos/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist +++ /dev/null @@ -1,8 +0,0 @@ - - - - - IDEDidComputeMac32BitWarning - - - diff --git a/apps/driver-archive-cubit/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/apps/driver-archive-cubit/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme deleted file mode 100755 index 00eeaca..0000000 --- a/apps/driver-archive-cubit/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +++ /dev/null @@ -1,99 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/apps/driver-archive-cubit/macos/Runner.xcworkspace/contents.xcworkspacedata b/apps/driver-archive-cubit/macos/Runner.xcworkspace/contents.xcworkspacedata deleted file mode 100755 index 1d526a1..0000000 --- a/apps/driver-archive-cubit/macos/Runner.xcworkspace/contents.xcworkspacedata +++ /dev/null @@ -1,7 +0,0 @@ - - - - - diff --git a/apps/driver-archive-cubit/macos/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/apps/driver-archive-cubit/macos/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist deleted file mode 100755 index 18d9810..0000000 --- a/apps/driver-archive-cubit/macos/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist +++ /dev/null @@ -1,8 +0,0 @@ - - - - - IDEDidComputeMac32BitWarning - - - diff --git a/apps/driver-archive-cubit/macos/Runner/AppDelegate.swift b/apps/driver-archive-cubit/macos/Runner/AppDelegate.swift deleted file mode 100755 index b3c1761..0000000 --- a/apps/driver-archive-cubit/macos/Runner/AppDelegate.swift +++ /dev/null @@ -1,13 +0,0 @@ -import Cocoa -import FlutterMacOS - -@main -class AppDelegate: FlutterAppDelegate { - override func applicationShouldTerminateAfterLastWindowClosed(_ sender: NSApplication) -> Bool { - return true - } - - override func applicationSupportsSecureRestorableState(_ app: NSApplication) -> Bool { - return true - } -} diff --git a/apps/driver-archive-cubit/macos/Runner/Assets.xcassets/AppIcon.appiconset/100.png b/apps/driver-archive-cubit/macos/Runner/Assets.xcassets/AppIcon.appiconset/100.png deleted file mode 100755 index 06a5ca4..0000000 Binary files a/apps/driver-archive-cubit/macos/Runner/Assets.xcassets/AppIcon.appiconset/100.png and /dev/null differ diff --git a/apps/driver-archive-cubit/macos/Runner/Assets.xcassets/AppIcon.appiconset/1024.png b/apps/driver-archive-cubit/macos/Runner/Assets.xcassets/AppIcon.appiconset/1024.png deleted file mode 100755 index 776785b..0000000 Binary files a/apps/driver-archive-cubit/macos/Runner/Assets.xcassets/AppIcon.appiconset/1024.png and /dev/null differ diff --git a/apps/driver-archive-cubit/macos/Runner/Assets.xcassets/AppIcon.appiconset/114.png b/apps/driver-archive-cubit/macos/Runner/Assets.xcassets/AppIcon.appiconset/114.png deleted file mode 100755 index 9d849c2..0000000 Binary files a/apps/driver-archive-cubit/macos/Runner/Assets.xcassets/AppIcon.appiconset/114.png and /dev/null differ diff --git a/apps/driver-archive-cubit/macos/Runner/Assets.xcassets/AppIcon.appiconset/120.png b/apps/driver-archive-cubit/macos/Runner/Assets.xcassets/AppIcon.appiconset/120.png deleted file mode 100755 index fa21b1d..0000000 Binary files a/apps/driver-archive-cubit/macos/Runner/Assets.xcassets/AppIcon.appiconset/120.png and /dev/null differ diff --git a/apps/driver-archive-cubit/macos/Runner/Assets.xcassets/AppIcon.appiconset/128.png b/apps/driver-archive-cubit/macos/Runner/Assets.xcassets/AppIcon.appiconset/128.png deleted file mode 100755 index 723651e..0000000 Binary files a/apps/driver-archive-cubit/macos/Runner/Assets.xcassets/AppIcon.appiconset/128.png and /dev/null differ diff --git a/apps/driver-archive-cubit/macos/Runner/Assets.xcassets/AppIcon.appiconset/144.png b/apps/driver-archive-cubit/macos/Runner/Assets.xcassets/AppIcon.appiconset/144.png deleted file mode 100755 index dae61b3..0000000 Binary files a/apps/driver-archive-cubit/macos/Runner/Assets.xcassets/AppIcon.appiconset/144.png and /dev/null differ diff --git a/apps/driver-archive-cubit/macos/Runner/Assets.xcassets/AppIcon.appiconset/152.png b/apps/driver-archive-cubit/macos/Runner/Assets.xcassets/AppIcon.appiconset/152.png deleted file mode 100755 index d8b1a7f..0000000 Binary files a/apps/driver-archive-cubit/macos/Runner/Assets.xcassets/AppIcon.appiconset/152.png and /dev/null differ diff --git a/apps/driver-archive-cubit/macos/Runner/Assets.xcassets/AppIcon.appiconset/16.png b/apps/driver-archive-cubit/macos/Runner/Assets.xcassets/AppIcon.appiconset/16.png deleted file mode 100755 index f187210..0000000 Binary files a/apps/driver-archive-cubit/macos/Runner/Assets.xcassets/AppIcon.appiconset/16.png and /dev/null differ diff --git a/apps/driver-archive-cubit/macos/Runner/Assets.xcassets/AppIcon.appiconset/167.png b/apps/driver-archive-cubit/macos/Runner/Assets.xcassets/AppIcon.appiconset/167.png deleted file mode 100755 index 9f9ea91..0000000 Binary files a/apps/driver-archive-cubit/macos/Runner/Assets.xcassets/AppIcon.appiconset/167.png and /dev/null differ diff --git a/apps/driver-archive-cubit/macos/Runner/Assets.xcassets/AppIcon.appiconset/180.png b/apps/driver-archive-cubit/macos/Runner/Assets.xcassets/AppIcon.appiconset/180.png deleted file mode 100755 index a4cb198..0000000 Binary files a/apps/driver-archive-cubit/macos/Runner/Assets.xcassets/AppIcon.appiconset/180.png and /dev/null differ diff --git a/apps/driver-archive-cubit/macos/Runner/Assets.xcassets/AppIcon.appiconset/20.png b/apps/driver-archive-cubit/macos/Runner/Assets.xcassets/AppIcon.appiconset/20.png deleted file mode 100755 index 9cd0b7a..0000000 Binary files a/apps/driver-archive-cubit/macos/Runner/Assets.xcassets/AppIcon.appiconset/20.png and /dev/null differ diff --git a/apps/driver-archive-cubit/macos/Runner/Assets.xcassets/AppIcon.appiconset/256.png b/apps/driver-archive-cubit/macos/Runner/Assets.xcassets/AppIcon.appiconset/256.png deleted file mode 100755 index c0ae1fb..0000000 Binary files a/apps/driver-archive-cubit/macos/Runner/Assets.xcassets/AppIcon.appiconset/256.png and /dev/null differ diff --git a/apps/driver-archive-cubit/macos/Runner/Assets.xcassets/AppIcon.appiconset/29.png b/apps/driver-archive-cubit/macos/Runner/Assets.xcassets/AppIcon.appiconset/29.png deleted file mode 100755 index a4c5844..0000000 Binary files a/apps/driver-archive-cubit/macos/Runner/Assets.xcassets/AppIcon.appiconset/29.png and /dev/null differ diff --git a/apps/driver-archive-cubit/macos/Runner/Assets.xcassets/AppIcon.appiconset/32.png b/apps/driver-archive-cubit/macos/Runner/Assets.xcassets/AppIcon.appiconset/32.png deleted file mode 100755 index 5f8c2f2..0000000 Binary files a/apps/driver-archive-cubit/macos/Runner/Assets.xcassets/AppIcon.appiconset/32.png and /dev/null differ diff --git a/apps/driver-archive-cubit/macos/Runner/Assets.xcassets/AppIcon.appiconset/40.png b/apps/driver-archive-cubit/macos/Runner/Assets.xcassets/AppIcon.appiconset/40.png deleted file mode 100755 index b0270d4..0000000 Binary files a/apps/driver-archive-cubit/macos/Runner/Assets.xcassets/AppIcon.appiconset/40.png and /dev/null differ diff --git a/apps/driver-archive-cubit/macos/Runner/Assets.xcassets/AppIcon.appiconset/50.png b/apps/driver-archive-cubit/macos/Runner/Assets.xcassets/AppIcon.appiconset/50.png deleted file mode 100755 index d54573f..0000000 Binary files a/apps/driver-archive-cubit/macos/Runner/Assets.xcassets/AppIcon.appiconset/50.png and /dev/null differ diff --git a/apps/driver-archive-cubit/macos/Runner/Assets.xcassets/AppIcon.appiconset/512.png b/apps/driver-archive-cubit/macos/Runner/Assets.xcassets/AppIcon.appiconset/512.png deleted file mode 100755 index f7af634..0000000 Binary files a/apps/driver-archive-cubit/macos/Runner/Assets.xcassets/AppIcon.appiconset/512.png and /dev/null differ diff --git a/apps/driver-archive-cubit/macos/Runner/Assets.xcassets/AppIcon.appiconset/57.png b/apps/driver-archive-cubit/macos/Runner/Assets.xcassets/AppIcon.appiconset/57.png deleted file mode 100755 index 88246f8..0000000 Binary files a/apps/driver-archive-cubit/macos/Runner/Assets.xcassets/AppIcon.appiconset/57.png and /dev/null differ diff --git a/apps/driver-archive-cubit/macos/Runner/Assets.xcassets/AppIcon.appiconset/58.png b/apps/driver-archive-cubit/macos/Runner/Assets.xcassets/AppIcon.appiconset/58.png deleted file mode 100755 index 579ecfb..0000000 Binary files a/apps/driver-archive-cubit/macos/Runner/Assets.xcassets/AppIcon.appiconset/58.png and /dev/null differ diff --git a/apps/driver-archive-cubit/macos/Runner/Assets.xcassets/AppIcon.appiconset/60.png b/apps/driver-archive-cubit/macos/Runner/Assets.xcassets/AppIcon.appiconset/60.png deleted file mode 100755 index 6375658..0000000 Binary files a/apps/driver-archive-cubit/macos/Runner/Assets.xcassets/AppIcon.appiconset/60.png and /dev/null differ diff --git a/apps/driver-archive-cubit/macos/Runner/Assets.xcassets/AppIcon.appiconset/64.png b/apps/driver-archive-cubit/macos/Runner/Assets.xcassets/AppIcon.appiconset/64.png deleted file mode 100755 index c05e1b0..0000000 Binary files a/apps/driver-archive-cubit/macos/Runner/Assets.xcassets/AppIcon.appiconset/64.png and /dev/null differ diff --git a/apps/driver-archive-cubit/macos/Runner/Assets.xcassets/AppIcon.appiconset/72.png b/apps/driver-archive-cubit/macos/Runner/Assets.xcassets/AppIcon.appiconset/72.png deleted file mode 100755 index 4cdf4ba..0000000 Binary files a/apps/driver-archive-cubit/macos/Runner/Assets.xcassets/AppIcon.appiconset/72.png and /dev/null differ diff --git a/apps/driver-archive-cubit/macos/Runner/Assets.xcassets/AppIcon.appiconset/76.png b/apps/driver-archive-cubit/macos/Runner/Assets.xcassets/AppIcon.appiconset/76.png deleted file mode 100755 index f98f82d..0000000 Binary files a/apps/driver-archive-cubit/macos/Runner/Assets.xcassets/AppIcon.appiconset/76.png and /dev/null differ diff --git a/apps/driver-archive-cubit/macos/Runner/Assets.xcassets/AppIcon.appiconset/80.png b/apps/driver-archive-cubit/macos/Runner/Assets.xcassets/AppIcon.appiconset/80.png deleted file mode 100755 index e1bb646..0000000 Binary files a/apps/driver-archive-cubit/macos/Runner/Assets.xcassets/AppIcon.appiconset/80.png and /dev/null differ diff --git a/apps/driver-archive-cubit/macos/Runner/Assets.xcassets/AppIcon.appiconset/87.png b/apps/driver-archive-cubit/macos/Runner/Assets.xcassets/AppIcon.appiconset/87.png deleted file mode 100755 index f94f8e5..0000000 Binary files a/apps/driver-archive-cubit/macos/Runner/Assets.xcassets/AppIcon.appiconset/87.png and /dev/null differ diff --git a/apps/driver-archive-cubit/macos/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json b/apps/driver-archive-cubit/macos/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json deleted file mode 100755 index ac5afcb..0000000 --- a/apps/driver-archive-cubit/macos/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json +++ /dev/null @@ -1,64 +0,0 @@ -{ - "images": [ - { - "size": "16x16", - "idiom": "mac", - "filename": "app_icon_16.png", - "scale": "1x" - }, - { - "size": "16x16", - "idiom": "mac", - "filename": "app_icon_32.png", - "scale": "2x" - }, - { - "size": "32x32", - "idiom": "mac", - "filename": "app_icon_32.png", - "scale": "1x" - }, - { - "size": "32x32", - "idiom": "mac", - "filename": "app_icon_64.png", - "scale": "2x" - }, - { - "size": "128x128", - "idiom": "mac", - "filename": "app_icon_128.png", - "scale": "1x" - }, - { - "size": "128x128", - "idiom": "mac", - "filename": "app_icon_256.png", - "scale": "2x" - }, - { - "size": "256x256", - "idiom": "mac", - "filename": "app_icon_256.png", - "scale": "1x" - }, - { - "size": "256x256", - "idiom": "mac", - "filename": "app_icon_512.png", - "scale": "2x" - }, - { - "size": "512x512", - "idiom": "mac", - "filename": "app_icon_512.png", - "scale": "1x" - }, - { - "size": "512x512", - "idiom": "mac", - "filename": "app_icon_1024.png", - "scale": "2x" - } - ] -} \ No newline at end of file diff --git a/apps/driver-archive-cubit/macos/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png b/apps/driver-archive-cubit/macos/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png deleted file mode 100755 index dc9ada4..0000000 Binary files a/apps/driver-archive-cubit/macos/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png and /dev/null differ diff --git a/apps/driver-archive-cubit/macos/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png b/apps/driver-archive-cubit/macos/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png deleted file mode 100755 index 7353c41..0000000 Binary files a/apps/driver-archive-cubit/macos/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png and /dev/null differ diff --git a/apps/driver-archive-cubit/macos/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png b/apps/driver-archive-cubit/macos/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png deleted file mode 100755 index 797d452..0000000 Binary files a/apps/driver-archive-cubit/macos/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png and /dev/null differ diff --git a/apps/driver-archive-cubit/macos/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png b/apps/driver-archive-cubit/macos/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png deleted file mode 100755 index 6ed2d93..0000000 Binary files a/apps/driver-archive-cubit/macos/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png and /dev/null differ diff --git a/apps/driver-archive-cubit/macos/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png b/apps/driver-archive-cubit/macos/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png deleted file mode 100755 index 4cd7b00..0000000 Binary files a/apps/driver-archive-cubit/macos/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png and /dev/null differ diff --git a/apps/driver-archive-cubit/macos/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png b/apps/driver-archive-cubit/macos/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png deleted file mode 100755 index fe73094..0000000 Binary files a/apps/driver-archive-cubit/macos/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png and /dev/null differ diff --git a/apps/driver-archive-cubit/macos/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png b/apps/driver-archive-cubit/macos/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png deleted file mode 100755 index 321773c..0000000 Binary files a/apps/driver-archive-cubit/macos/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png and /dev/null differ diff --git a/apps/driver-archive-cubit/macos/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png b/apps/driver-archive-cubit/macos/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png deleted file mode 100755 index 797d452..0000000 Binary files a/apps/driver-archive-cubit/macos/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png and /dev/null differ diff --git a/apps/driver-archive-cubit/macos/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png b/apps/driver-archive-cubit/macos/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png deleted file mode 100755 index 502f463..0000000 Binary files a/apps/driver-archive-cubit/macos/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png and /dev/null differ diff --git a/apps/driver-archive-cubit/macos/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png b/apps/driver-archive-cubit/macos/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png deleted file mode 100755 index 0ec3034..0000000 Binary files a/apps/driver-archive-cubit/macos/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png and /dev/null differ diff --git a/apps/driver-archive-cubit/macos/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png b/apps/driver-archive-cubit/macos/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png deleted file mode 100755 index 0ec3034..0000000 Binary files a/apps/driver-archive-cubit/macos/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png and /dev/null differ diff --git a/apps/driver-archive-cubit/macos/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png b/apps/driver-archive-cubit/macos/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png deleted file mode 100755 index e9f5fea..0000000 Binary files a/apps/driver-archive-cubit/macos/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png and /dev/null differ diff --git a/apps/driver-archive-cubit/macos/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png b/apps/driver-archive-cubit/macos/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png deleted file mode 100755 index 84ac32a..0000000 Binary files a/apps/driver-archive-cubit/macos/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png and /dev/null differ diff --git a/apps/driver-archive-cubit/macos/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png b/apps/driver-archive-cubit/macos/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png deleted file mode 100755 index 8953cba..0000000 Binary files a/apps/driver-archive-cubit/macos/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png and /dev/null differ diff --git a/apps/driver-archive-cubit/macos/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png b/apps/driver-archive-cubit/macos/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png deleted file mode 100755 index 0467bf1..0000000 Binary files a/apps/driver-archive-cubit/macos/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png and /dev/null differ diff --git a/apps/driver-archive-cubit/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_1024.png b/apps/driver-archive-cubit/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_1024.png deleted file mode 100755 index 7ffb93a..0000000 Binary files a/apps/driver-archive-cubit/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_1024.png and /dev/null differ diff --git a/apps/driver-archive-cubit/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_128.png b/apps/driver-archive-cubit/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_128.png deleted file mode 100755 index 81296f2..0000000 Binary files a/apps/driver-archive-cubit/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_128.png and /dev/null differ diff --git a/apps/driver-archive-cubit/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_16.png b/apps/driver-archive-cubit/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_16.png deleted file mode 100755 index 4298e38..0000000 Binary files a/apps/driver-archive-cubit/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_16.png and /dev/null differ diff --git a/apps/driver-archive-cubit/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_256.png b/apps/driver-archive-cubit/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_256.png deleted file mode 100755 index 8eb97ff..0000000 Binary files a/apps/driver-archive-cubit/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_256.png and /dev/null differ diff --git a/apps/driver-archive-cubit/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_32.png b/apps/driver-archive-cubit/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_32.png deleted file mode 100755 index 9e52102..0000000 Binary files a/apps/driver-archive-cubit/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_32.png and /dev/null differ diff --git a/apps/driver-archive-cubit/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_512.png b/apps/driver-archive-cubit/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_512.png deleted file mode 100755 index 458f078..0000000 Binary files a/apps/driver-archive-cubit/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_512.png and /dev/null differ diff --git a/apps/driver-archive-cubit/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_64.png b/apps/driver-archive-cubit/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_64.png deleted file mode 100755 index d4639cf..0000000 Binary files a/apps/driver-archive-cubit/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_64.png and /dev/null differ diff --git a/apps/driver-archive-cubit/macos/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json b/apps/driver-archive-cubit/macos/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json deleted file mode 100755 index 0bedcf2..0000000 --- a/apps/driver-archive-cubit/macos/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "images" : [ - { - "idiom" : "universal", - "filename" : "LaunchImage.png", - "scale" : "1x" - }, - { - "idiom" : "universal", - "filename" : "LaunchImage@2x.png", - "scale" : "2x" - }, - { - "idiom" : "universal", - "filename" : "LaunchImage@3x.png", - "scale" : "3x" - } - ], - "info" : { - "version" : 1, - "author" : "xcode" - } -} diff --git a/apps/driver-archive-cubit/macos/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png b/apps/driver-archive-cubit/macos/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png deleted file mode 100755 index 9da19ea..0000000 Binary files a/apps/driver-archive-cubit/macos/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png and /dev/null differ diff --git a/apps/driver-archive-cubit/macos/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png b/apps/driver-archive-cubit/macos/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png deleted file mode 100755 index 9da19ea..0000000 Binary files a/apps/driver-archive-cubit/macos/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png and /dev/null differ diff --git a/apps/driver-archive-cubit/macos/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png b/apps/driver-archive-cubit/macos/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png deleted file mode 100755 index 9da19ea..0000000 Binary files a/apps/driver-archive-cubit/macos/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png and /dev/null differ diff --git a/apps/driver-archive-cubit/macos/Runner/Assets.xcassets/LaunchImage.imageset/README.md b/apps/driver-archive-cubit/macos/Runner/Assets.xcassets/LaunchImage.imageset/README.md deleted file mode 100755 index 89c2725..0000000 --- a/apps/driver-archive-cubit/macos/Runner/Assets.xcassets/LaunchImage.imageset/README.md +++ /dev/null @@ -1,5 +0,0 @@ -# Launch Screen Assets - -You can customize the launch screen with your own desired assets by replacing the image files in this directory. - -You can also do it by opening your Flutter project's Xcode project with `open ios/Runner.xcworkspace`, selecting `Runner/Assets.xcassets` in the Project Navigator and dropping in the desired images. \ No newline at end of file diff --git a/apps/driver-archive-cubit/macos/Runner/Base.lproj/MainMenu.xib b/apps/driver-archive-cubit/macos/Runner/Base.lproj/MainMenu.xib deleted file mode 100755 index 80e867a..0000000 --- a/apps/driver-archive-cubit/macos/Runner/Base.lproj/MainMenu.xib +++ /dev/null @@ -1,343 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/apps/driver-archive-cubit/macos/Runner/Configs/AppInfo.xcconfig b/apps/driver-archive-cubit/macos/Runner/Configs/AppInfo.xcconfig deleted file mode 100755 index 8fc065e..0000000 --- a/apps/driver-archive-cubit/macos/Runner/Configs/AppInfo.xcconfig +++ /dev/null @@ -1,14 +0,0 @@ -// Application-level settings for the Runner target. -// -// This may be replaced with something auto-generated from metadata (e.g., pubspec.yaml) in the -// future. If not, the values below would default to using the project name when this becomes a -// 'flutter create' template. - -// The application's name. By default this is also the title of the Flutter window. -PRODUCT_NAME = ride - -// The application's bundle identifier -PRODUCT_BUNDLE_IDENTIFIER = com.mobileapp.store.ride - -// The copyright displayed in application information -PRODUCT_COPYRIGHT = Copyright © 2023 com.mobileapp.store. All rights reserved. diff --git a/apps/driver-archive-cubit/macos/Runner/Configs/Debug.xcconfig b/apps/driver-archive-cubit/macos/Runner/Configs/Debug.xcconfig deleted file mode 100755 index 36b0fd9..0000000 --- a/apps/driver-archive-cubit/macos/Runner/Configs/Debug.xcconfig +++ /dev/null @@ -1,2 +0,0 @@ -#include "../../Flutter/Flutter-Debug.xcconfig" -#include "Warnings.xcconfig" diff --git a/apps/driver-archive-cubit/macos/Runner/Configs/Release.xcconfig b/apps/driver-archive-cubit/macos/Runner/Configs/Release.xcconfig deleted file mode 100755 index dff4f49..0000000 --- a/apps/driver-archive-cubit/macos/Runner/Configs/Release.xcconfig +++ /dev/null @@ -1,2 +0,0 @@ -#include "../../Flutter/Flutter-Release.xcconfig" -#include "Warnings.xcconfig" diff --git a/apps/driver-archive-cubit/macos/Runner/Configs/Warnings.xcconfig b/apps/driver-archive-cubit/macos/Runner/Configs/Warnings.xcconfig deleted file mode 100755 index 42bcbf4..0000000 --- a/apps/driver-archive-cubit/macos/Runner/Configs/Warnings.xcconfig +++ /dev/null @@ -1,13 +0,0 @@ -WARNING_CFLAGS = -Wall -Wconditional-uninitialized -Wnullable-to-nonnull-conversion -Wmissing-method-return-type -Woverlength-strings -GCC_WARN_UNDECLARED_SELECTOR = YES -CLANG_UNDEFINED_BEHAVIOR_SANITIZER_NULLABILITY = YES -CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE -CLANG_WARN__DUPLICATE_METHOD_MATCH = YES -CLANG_WARN_PRAGMA_PACK = YES -CLANG_WARN_STRICT_PROTOTYPES = YES -CLANG_WARN_COMMA = YES -GCC_WARN_STRICT_SELECTOR_MATCH = YES -CLANG_WARN_OBJC_REPEATED_USE_OF_WEAK = YES -CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES -GCC_WARN_SHADOW = YES -CLANG_WARN_UNREACHABLE_CODE = YES diff --git a/apps/driver-archive-cubit/macos/Runner/DebugProfile.entitlements b/apps/driver-archive-cubit/macos/Runner/DebugProfile.entitlements deleted file mode 100755 index dddb8a3..0000000 --- a/apps/driver-archive-cubit/macos/Runner/DebugProfile.entitlements +++ /dev/null @@ -1,12 +0,0 @@ - - - - - com.apple.security.app-sandbox - - com.apple.security.cs.allow-jit - - com.apple.security.network.server - - - diff --git a/apps/driver-archive-cubit/macos/Runner/Info.plist b/apps/driver-archive-cubit/macos/Runner/Info.plist deleted file mode 100755 index 4789daa..0000000 --- a/apps/driver-archive-cubit/macos/Runner/Info.plist +++ /dev/null @@ -1,32 +0,0 @@ - - - - - CFBundleDevelopmentRegion - $(DEVELOPMENT_LANGUAGE) - CFBundleExecutable - $(EXECUTABLE_NAME) - CFBundleIconFile - - CFBundleIdentifier - $(PRODUCT_BUNDLE_IDENTIFIER) - CFBundleInfoDictionaryVersion - 6.0 - CFBundleName - $(PRODUCT_NAME) - CFBundlePackageType - APPL - CFBundleShortVersionString - $(FLUTTER_BUILD_NAME) - CFBundleVersion - $(FLUTTER_BUILD_NUMBER) - LSMinimumSystemVersion - $(MACOSX_DEPLOYMENT_TARGET) - NSHumanReadableCopyright - $(PRODUCT_COPYRIGHT) - NSMainNibFile - MainMenu - NSPrincipalClass - NSApplication - - diff --git a/apps/driver-archive-cubit/macos/Runner/MainFlutterWindow.swift b/apps/driver-archive-cubit/macos/Runner/MainFlutterWindow.swift deleted file mode 100755 index 3cc05eb..0000000 --- a/apps/driver-archive-cubit/macos/Runner/MainFlutterWindow.swift +++ /dev/null @@ -1,15 +0,0 @@ -import Cocoa -import FlutterMacOS - -class MainFlutterWindow: NSWindow { - override func awakeFromNib() { - let flutterViewController = FlutterViewController() - let windowFrame = self.frame - self.contentViewController = flutterViewController - self.setFrame(windowFrame, display: true) - - RegisterGeneratedPlugins(registry: flutterViewController) - - super.awakeFromNib() - } -} diff --git a/apps/driver-archive-cubit/macos/Runner/Release.entitlements b/apps/driver-archive-cubit/macos/Runner/Release.entitlements deleted file mode 100755 index f9105be..0000000 --- a/apps/driver-archive-cubit/macos/Runner/Release.entitlements +++ /dev/null @@ -1,12 +0,0 @@ - - - - - com.apple.security.app-sandbox - - com.apple.security.cs.allow-unsigned-executable-memory - - com.apple.security.network.client - - - diff --git a/apps/driver-archive-cubit/macos/RunnerTests/RunnerTests.swift b/apps/driver-archive-cubit/macos/RunnerTests/RunnerTests.swift deleted file mode 100755 index 5418c9f..0000000 --- a/apps/driver-archive-cubit/macos/RunnerTests/RunnerTests.swift +++ /dev/null @@ -1,12 +0,0 @@ -import FlutterMacOS -import Cocoa -import XCTest - -class RunnerTests: XCTestCase { - - func testExample() { - // If you add code to the Runner application, consider adding tests here. - // See https://developer.apple.com/documentation/xctest for more information about using XCTest. - } - -} diff --git a/apps/driver-archive-cubit/macos/firebase_app_id_file.json b/apps/driver-archive-cubit/macos/firebase_app_id_file.json deleted file mode 100755 index 665da2c..0000000 --- a/apps/driver-archive-cubit/macos/firebase_app_id_file.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "file_generated_by": "FlutterFire CLI", - "purpose": "FirebaseAppID & ProjectID for this Firebase app in this directory", - "GOOGLE_APP_ID": "1:594687661098:ios:e8ca02ed508d4737595f53", - "FIREBASE_PROJECT_ID": "ride-b1bd8", - "GCM_SENDER_ID": "594687661098" -} \ No newline at end of file diff --git a/apps/driver-archive-cubit/pubspec.lock b/apps/driver-archive-cubit/pubspec.lock deleted file mode 100644 index f52588a..0000000 --- a/apps/driver-archive-cubit/pubspec.lock +++ /dev/null @@ -1,1460 +0,0 @@ -# Generated by pub -# See https://dart.dev/tools/pub/glossary#lockfile -packages: - _flutterfire_internals: - dependency: transitive - description: - name: _flutterfire_internals - sha256: "460e9e684edb461d85498fc166ff8416f303f22216838d302d80676b348c6a4c" - url: "https://pub.dev" - source: hosted - version: "1.3.75" - ansicolor: - dependency: transitive - description: - name: ansicolor - sha256: "50e982d500bc863e1d703448afdbf9e5a72eb48840a4f766fa361ffd6877055f" - url: "https://pub.dev" - source: hosted - version: "2.0.3" - archive: - dependency: transitive - description: - name: archive - sha256: a96e8b390886ee8abb49b7bd3ac8df6f451c621619f52a26e815fdcf568959ff - url: "https://pub.dev" - source: hosted - version: "4.0.9" - args: - dependency: transitive - description: - name: args - sha256: d0481093c50b1da8910eb0bb301626d4d8eb7284aa739614d2b394ee09e3ea04 - url: "https://pub.dev" - source: hosted - version: "2.7.0" - async: - dependency: transitive - description: - name: async - sha256: e2eb0491ba5ddb6177742d2da23904574082139b07c1e33b8503b9f46f3e1a37 - url: "https://pub.dev" - source: hosted - version: "2.13.1" - battery_plus: - dependency: "direct main" - description: - name: battery_plus - sha256: "3853aa1e18ea1d15493dd1d3edac05770b4b95c1e691fb85934c5fd3b1ac0fcc" - url: "https://pub.dev" - source: hosted - version: "7.1.1" - battery_plus_platform_interface: - dependency: transitive - description: - name: battery_plus_platform_interface - sha256: e8342c0f32de4b1dfd0223114b6785e48e579bfc398da9471c9179b907fa4910 - url: "https://pub.dev" - source: hosted - version: "2.0.1" - bloc: - dependency: transitive - description: - name: bloc - sha256: e03b235924e4f509c27b5d6b2f949200e0a91149a9818b4f65eeb56662b75413 - url: "https://pub.dev" - source: hosted - version: "9.2.1" - boolean_selector: - dependency: transitive - description: - name: boolean_selector - sha256: "8aab1771e1243a5063b8b0ff68042d67334e3feab9e95b9490f9a6ebf73b42ea" - url: "https://pub.dev" - source: hosted - version: "2.1.2" - bubble_head: - dependency: "direct main" - description: - path: bubble-master - relative: true - source: path - version: "0.0.4" - characters: - dependency: transitive - description: - name: characters - sha256: faf38497bda5ead2a8c7615f4f7939df04333478bf32e4173fcb06d428b5716b - url: "https://pub.dev" - source: hosted - version: "1.4.1" - checked_yaml: - dependency: transitive - description: - name: checked_yaml - sha256: "959525d3162f249993882720d52b7e0c833978df229be20702b33d48d91de70f" - url: "https://pub.dev" - source: hosted - version: "2.0.4" - cli_util: - dependency: transitive - description: - name: cli_util - sha256: ff6785f7e9e3c38ac98b2fb035701789de90154024a75b6cb926445e83197d1c - url: "https://pub.dev" - source: hosted - version: "0.4.2" - clock: - dependency: transitive - description: - name: clock - sha256: fddb70d9b5277016c77a80201021d40a2247104d9f4aa7bab7157b7e3f05b84b - url: "https://pub.dev" - source: hosted - version: "1.1.2" - code_assets: - dependency: transitive - description: - name: code_assets - sha256: bf394f466ba9205f1812a0433b392d6af280f155f56651eda7c18cc32ed493b8 - url: "https://pub.dev" - source: hosted - version: "1.2.1" - collection: - dependency: transitive - description: - name: collection - sha256: "2f5709ae4d3d59dd8f7cd309b4e023046b57d8a6c82130785d2b0e5868084e76" - url: "https://pub.dev" - source: hosted - version: "1.19.1" - connectivity_plus: - dependency: "direct main" - description: - name: connectivity_plus - sha256: b5e72753cf63becce2c61fd04dfe0f1c430cc5278b53a1342dc5ad839eab29ec - url: "https://pub.dev" - source: hosted - version: "6.1.5" - connectivity_plus_platform_interface: - dependency: transitive - description: - name: connectivity_plus_platform_interface - sha256: "3c09627c536d22fd24691a905cdd8b14520de69da52c7a97499c8be5284a32ed" - url: "https://pub.dev" - source: hosted - version: "2.1.0" - cross_file: - dependency: transitive - description: - name: cross_file - sha256: "92c9c43c383bfa1c32079d3bc492d55d6d4318044b7b47edaff8971cbb555c51" - url: "https://pub.dev" - source: hosted - version: "0.3.5+4" - crypto: - dependency: transitive - description: - name: crypto - sha256: c8ea0233063ba03258fbcf2ca4d6dadfefe14f02fab57702265467a19f27fadf - url: "https://pub.dev" - source: hosted - version: "3.0.7" - csslib: - dependency: transitive - description: - name: csslib - sha256: "09bad715f418841f976c77db72d5398dc1253c21fb9c0c7f0b0b985860b2d58e" - url: "https://pub.dev" - source: hosted - version: "1.0.2" - cupertino_icons: - dependency: "direct main" - description: - name: cupertino_icons - sha256: "41e005c33bd814be4d3096aff55b1908d419fde52ca656c8c47719ec745873cd" - url: "https://pub.dev" - source: hosted - version: "1.0.9" - dbus: - dependency: transitive - description: - name: dbus - sha256: "0ce9b0a839e6dee59a37a623d2fc26a35bbbe6404213e419b0d6411023d62645" - url: "https://pub.dev" - source: hosted - version: "0.7.14" - device_info_plus: - dependency: "direct main" - description: - name: device_info_plus - sha256: "98f28b42168cc509abc92f88518882fd58061ea372d7999aecc424345c7bff6a" - url: "https://pub.dev" - source: hosted - version: "11.5.0" - device_info_plus_platform_interface: - dependency: transitive - description: - name: device_info_plus_platform_interface - sha256: e1ea89119e34903dca74b883d0dd78eb762814f97fb6c76f35e9ff74d261a18f - url: "https://pub.dev" - source: hosted - version: "7.0.3" - dio: - dependency: "direct main" - description: - name: dio - sha256: ea2bad3c89a27635ce2d85cce4d6b199da49a5a48ec77b03e45b65a3b90922b0 - url: "https://pub.dev" - source: hosted - version: "5.10.0" - dio_web_adapter: - dependency: transitive - description: - name: dio_web_adapter - sha256: dd58dc3861eb36edb13b217efc006a1c21e5bbc341de8c229b85634fa5e362e4 - url: "https://pub.dev" - source: hosted - version: "2.2.0" - equatable: - dependency: "direct main" - description: - name: equatable - sha256: "3bce007a596ff8b3119c45d68aaef631272537c03d30e5d4534dd24bf4c5eaa2" - url: "https://pub.dev" - source: hosted - version: "2.1.0" - fake_async: - dependency: transitive - description: - name: fake_async - sha256: "5368f224a74523e8d2e7399ea1638b37aecfca824a3cc4dfdf77bf1fa905ac44" - url: "https://pub.dev" - source: hosted - version: "1.3.3" - ffi: - dependency: transitive - description: - name: ffi - sha256: "6d7fd89431262d8f3125e81b50d3847a091d846eafcd4fdb88dd06f36d705a45" - url: "https://pub.dev" - source: hosted - version: "2.2.0" - file: - dependency: transitive - description: - name: file - sha256: a3b4f84adafef897088c160faf7dfffb7696046cb13ae90b508c2cbc95d3b8d4 - url: "https://pub.dev" - source: hosted - version: "7.0.1" - file_selector_linux: - dependency: transitive - description: - name: file_selector_linux - sha256: "2567f398e06ac72dcf2e98a0c95df2a9edd03c2c2e0cacd4780f20cdf56263a0" - url: "https://pub.dev" - source: hosted - version: "0.9.4" - file_selector_macos: - dependency: transitive - description: - name: file_selector_macos - sha256: "5e0bbe9c312416f1787a68259ea1505b52f258c587f12920422671807c4d618a" - url: "https://pub.dev" - source: hosted - version: "0.9.5" - file_selector_platform_interface: - dependency: transitive - description: - name: file_selector_platform_interface - sha256: "35e0bd61ebcdb91a3505813b055b09b79dfdc7d0aee9c09a7ba59ae4bb13dc85" - url: "https://pub.dev" - source: hosted - version: "2.7.0" - file_selector_windows: - dependency: transitive - description: - name: file_selector_windows - sha256: "62197474ae75893a62df75939c777763d39c2bc5f73ce5b88497208bc269abfd" - url: "https://pub.dev" - source: hosted - version: "0.9.3+5" - firebase_core: - dependency: "direct main" - description: - name: firebase_core - sha256: "6f22d1c62e0c20976f02cd842c7b7cd3c0f561cc2052586411871045c08860c9" - url: "https://pub.dev" - source: hosted - version: "4.12.1" - firebase_core_platform_interface: - dependency: transitive - description: - name: firebase_core_platform_interface - sha256: f74d1d6fabccf7743b0144c2ed363d81049e258e22428ebb6fb0faec2fa7d938 - url: "https://pub.dev" - source: hosted - version: "8.0.0" - firebase_core_web: - dependency: transitive - description: - name: firebase_core_web - sha256: ddab99d709b8c27dd47576eb05a1e719e07a2aa45c009a49ae92ac4d2a8ca555 - url: "https://pub.dev" - source: hosted - version: "3.9.1" - firebase_messaging: - dependency: "direct main" - description: - name: firebase_messaging - sha256: "30ad2d59bcd86117dc49d278c8998a0fb390c5a3202f6e43e4bd215d3f1d0556" - url: "https://pub.dev" - source: hosted - version: "16.4.3" - firebase_messaging_platform_interface: - dependency: transitive - description: - name: firebase_messaging_platform_interface - sha256: "4d144cb42b9a5a42855596be2d7682d32c50169f42e7df2cb3278ecf935e7d63" - url: "https://pub.dev" - source: hosted - version: "4.9.2" - firebase_messaging_web: - dependency: transitive - description: - name: firebase_messaging_web - sha256: fcd25d0b9da55766ef4d28ae05a7460f5189635d6b42607adcd9f08818fd35f0 - url: "https://pub.dev" - source: hosted - version: "4.2.3" - fixnum: - dependency: transitive - description: - name: fixnum - sha256: b6dc7065e46c974bc7c5f143080a6764ec7a4be6da1285ececdc37be96de53be - url: "https://pub.dev" - source: hosted - version: "1.1.1" - flutter: - dependency: "direct main" - description: flutter - source: sdk - version: "0.0.0" - flutter_app_group_directory: - dependency: transitive - description: - name: flutter_app_group_directory - sha256: "680ef9b2dee84c237cd7bb7fc78bc45867b32556a8a5f0de61278078b9fefd05" - url: "https://pub.dev" - source: hosted - version: "1.1.0" - flutter_background_service: - dependency: "direct main" - description: - name: flutter_background_service - sha256: "70a1c185b1fa1a44f8f14ecd6c86f6e50366e3562f00b2fa5a54df39b3324d3d" - url: "https://pub.dev" - source: hosted - version: "5.1.0" - flutter_background_service_android: - dependency: "direct main" - description: - name: flutter_background_service_android - sha256: ca0793d4cd19f1e194a130918401a3d0b1076c81236f7273458ae96987944a87 - url: "https://pub.dev" - source: hosted - version: "6.3.1" - flutter_background_service_ios: - dependency: transitive - description: - name: flutter_background_service_ios - sha256: "6037ffd45c4d019dab0975c7feb1d31012dd697e25edc05505a4a9b0c7dc9fba" - url: "https://pub.dev" - source: hosted - version: "5.0.3" - flutter_background_service_platform_interface: - dependency: transitive - description: - name: flutter_background_service_platform_interface - sha256: ca74aa95789a8304f4d3f57f07ba404faa86bed6e415f83e8edea6ad8b904a41 - url: "https://pub.dev" - source: hosted - version: "5.1.2" - flutter_bloc: - dependency: "direct main" - description: - name: flutter_bloc - sha256: cf51747952201a455a1c840f8171d273be009b932c75093020f9af64f2123e38 - url: "https://pub.dev" - source: hosted - version: "9.1.1" - flutter_launcher_icons: - dependency: "direct dev" - description: - name: flutter_launcher_icons - sha256: "10f13781741a2e3972126fae08393d3c4e01fa4cd7473326b94b72cf594195e7" - url: "https://pub.dev" - source: hosted - version: "0.14.4" - flutter_lints: - dependency: "direct dev" - description: - name: flutter_lints - sha256: "3105dc8492f6183fb076ccf1f351ac3d60564bff92e20bfc4af9cc1651f4e7e1" - url: "https://pub.dev" - source: hosted - version: "6.0.0" - flutter_local_notifications: - dependency: "direct main" - description: - name: flutter_local_notifications - sha256: ef41ae901e7529e52934feba19ed82827b11baa67336829564aeab3129460610 - url: "https://pub.dev" - source: hosted - version: "18.0.1" - flutter_local_notifications_linux: - dependency: transitive - description: - name: flutter_local_notifications_linux - sha256: "8f685642876742c941b29c32030f6f4f6dacd0e4eaecb3efbb187d6a3812ca01" - url: "https://pub.dev" - source: hosted - version: "5.0.0" - flutter_local_notifications_platform_interface: - dependency: transitive - description: - name: flutter_local_notifications_platform_interface - sha256: "6c5b83c86bf819cdb177a9247a3722067dd8cc6313827ce7c77a4b238a26fd52" - url: "https://pub.dev" - source: hosted - version: "8.0.0" - flutter_localizations: - dependency: "direct main" - description: flutter - source: sdk - version: "0.0.0" - flutter_native_splash: - dependency: "direct dev" - description: - name: flutter_native_splash - sha256: "4fb9f4113350d3a80841ce05ebf1976a36de622af7d19aca0ca9a9911c7ff002" - url: "https://pub.dev" - source: hosted - version: "2.4.7" - flutter_overlay_window: - dependency: "direct main" - description: - name: flutter_overlay_window - sha256: "87a8ed7c47104a9ac1352d081e85304934b3f06ae28507097e49dd5f892e208d" - url: "https://pub.dev" - source: hosted - version: "0.4.5" - flutter_plugin_android_lifecycle: - dependency: transitive - description: - name: flutter_plugin_android_lifecycle - sha256: "3854fe5e3bff0b113c658f260b90c95dea17c92db0f2addeac2e343dd9969785" - url: "https://pub.dev" - source: hosted - version: "2.0.35" - flutter_secure_storage: - dependency: "direct main" - description: - name: flutter_secure_storage - sha256: "9cad52d75ebc511adfae3d447d5d13da15a55a92c9410e50f67335b6d21d16ea" - url: "https://pub.dev" - source: hosted - version: "9.2.4" - flutter_secure_storage_linux: - dependency: transitive - description: - name: flutter_secure_storage_linux - sha256: be76c1d24a97d0b98f8b54bce6b481a380a6590df992d0098f868ad54dc8f688 - url: "https://pub.dev" - source: hosted - version: "1.2.3" - flutter_secure_storage_macos: - dependency: transitive - description: - name: flutter_secure_storage_macos - sha256: "6c0a2795a2d1de26ae202a0d78527d163f4acbb11cde4c75c670f3a0fc064247" - url: "https://pub.dev" - source: hosted - version: "3.1.3" - flutter_secure_storage_platform_interface: - dependency: transitive - description: - name: flutter_secure_storage_platform_interface - sha256: cf91ad32ce5adef6fba4d736a542baca9daf3beac4db2d04be350b87f69ac4a8 - url: "https://pub.dev" - source: hosted - version: "1.1.2" - flutter_secure_storage_web: - dependency: transitive - description: - name: flutter_secure_storage_web - sha256: f4ebff989b4f07b2656fb16b47852c0aab9fed9b4ec1c70103368337bc1886a9 - url: "https://pub.dev" - source: hosted - version: "1.2.1" - flutter_secure_storage_windows: - dependency: transitive - description: - name: flutter_secure_storage_windows - sha256: b20b07cb5ed4ed74fc567b78a72936203f587eba460af1df11281c9326cd3709 - url: "https://pub.dev" - source: hosted - version: "3.1.2" - flutter_test: - dependency: "direct dev" - description: flutter - source: sdk - version: "0.0.0" - flutter_web_plugins: - dependency: transitive - description: flutter - source: sdk - version: "0.0.0" - geoclue: - dependency: transitive - description: - name: geoclue - sha256: c2a998c77474fc57aa00c6baa2928e58f4b267649057a1c76738656e9dbd2a7f - url: "https://pub.dev" - source: hosted - version: "0.1.1" - geolocator: - dependency: "direct main" - description: - name: geolocator - sha256: "79939537046c9025be47ec645f35c8090ecadb6fe98eba146a0d25e8c1357516" - url: "https://pub.dev" - source: hosted - version: "14.0.2" - geolocator_android: - dependency: transitive - description: - name: geolocator_android - sha256: "86ea1654e4f61ff51466848e91c116b422d6010ea269fda0fbe1af7e9e742ce1" - url: "https://pub.dev" - source: hosted - version: "5.0.3" - geolocator_apple: - dependency: transitive - description: - name: geolocator_apple - sha256: "853803d6bb1713c094e935b4a5ae5f19c0308acf81da13fa9ff84fb4c70c0b73" - url: "https://pub.dev" - source: hosted - version: "2.3.14" - geolocator_linux: - dependency: transitive - description: - name: geolocator_linux - sha256: c4e966f0a7a87e70049eac7a2617f9e16fd4c585a26e4330bdfc3a71e6a721f3 - url: "https://pub.dev" - source: hosted - version: "0.2.3" - geolocator_platform_interface: - dependency: transitive - description: - name: geolocator_platform_interface - sha256: cdb082e4f048b69da244117b7914cc60d2a8897546ffaa4f2529c786ded7aee2 - url: "https://pub.dev" - source: hosted - version: "4.2.8" - geolocator_web: - dependency: transitive - description: - name: geolocator_web - sha256: "19e485a0f8d6a88abcf9c53cba3a4105e14b7435ed8ac1c108c067b938fe8429" - url: "https://pub.dev" - source: hosted - version: "4.1.4" - geolocator_windows: - dependency: transitive - description: - name: geolocator_windows - sha256: "175435404d20278ffd220de83c2ca293b73db95eafbdc8131fe8609be1421eb6" - url: "https://pub.dev" - source: hosted - version: "0.2.5" - get_it: - dependency: "direct main" - description: - name: get_it - sha256: ae78de7c3f2304b8d81f2bb6e320833e5e81de942188542328f074978cc0efa9 - url: "https://pub.dev" - source: hosted - version: "8.3.0" - go_router: - dependency: "direct main" - description: - name: go_router - sha256: f02fd7d2a4dc512fec615529824fdd217fecb3a3d3de68360293a551f21634b3 - url: "https://pub.dev" - source: hosted - version: "14.8.1" - gsettings: - dependency: transitive - description: - name: gsettings - sha256: "1b0ce661f5436d2db1e51f3c4295a49849f03d304003a7ba177d01e3a858249c" - url: "https://pub.dev" - source: hosted - version: "0.2.8" - hooks: - dependency: transitive - description: - name: hooks - sha256: "9a62a50b50b769a737bc0a8ff381f333529df3ab746b2f6b02e83760231455ba" - url: "https://pub.dev" - source: hosted - version: "2.0.2" - html: - dependency: transitive - description: - name: html - sha256: "6d1264f2dffa1b1101c25a91dff0dc2daee4c18e87cd8538729773c073dbf602" - url: "https://pub.dev" - source: hosted - version: "0.15.6" - http: - dependency: transitive - description: - name: http - sha256: "87721a4a50b19c7f1d49001e51409bddc46303966ce89a65af4f4e6004896412" - url: "https://pub.dev" - source: hosted - version: "1.6.0" - http_parser: - dependency: transitive - description: - name: http_parser - sha256: "178d74305e7866013777bab2c3d8726205dc5a4dd935297175b19a23a2e66571" - url: "https://pub.dev" - source: hosted - version: "4.1.2" - image: - dependency: transitive - description: - name: image - sha256: f9881ff4998044947ec38d098bc7c8316ae1186fa786eddffdb867b9bc94dfce - url: "https://pub.dev" - source: hosted - version: "4.8.0" - image_picker: - dependency: "direct main" - description: - name: image_picker - sha256: d8402284df184bc05f4a2210c6c23983b0720f4cd87cbd05c5390a78af602667 - url: "https://pub.dev" - source: hosted - version: "1.2.3" - image_picker_android: - dependency: transitive - description: - name: image_picker_android - sha256: d5b3e1774af29c9ab00103afb0d4614070f924d2e0057ac867ec98800114793f - url: "https://pub.dev" - source: hosted - version: "0.8.13+17" - image_picker_for_web: - dependency: transitive - description: - name: image_picker_for_web - sha256: "66257a3191ab360d23a55c8241c91a6e329d31e94efa7be9cf7a212e65850214" - url: "https://pub.dev" - source: hosted - version: "3.1.1" - image_picker_ios: - dependency: transitive - description: - name: image_picker_ios - sha256: b9c4a438a9ff4f60808c9cf0039b93a42bb6c2211ef6ebb647394b2b3fa84588 - url: "https://pub.dev" - source: hosted - version: "0.8.13+6" - image_picker_linux: - dependency: transitive - description: - name: image_picker_linux - sha256: "1f81c5f2046b9ab724f85523e4af65be1d47b038160a8c8deed909762c308ed4" - url: "https://pub.dev" - source: hosted - version: "0.2.2" - image_picker_macos: - dependency: transitive - description: - name: image_picker_macos - sha256: "86f0f15a309de7e1a552c12df9ce5b59fe927e71385329355aec4776c6a8ec91" - url: "https://pub.dev" - source: hosted - version: "0.2.2+1" - image_picker_platform_interface: - dependency: transitive - description: - name: image_picker_platform_interface - sha256: "567e056716333a1647c64bb6bd873cff7622233a5c3f694be28a583d4715690c" - url: "https://pub.dev" - source: hosted - version: "2.11.1" - image_picker_windows: - dependency: transitive - description: - name: image_picker_windows - sha256: d248c86554a72b5495a31c56f060cf73a41c7ff541689327b1a7dbccc33adfae - url: "https://pub.dev" - source: hosted - version: "0.2.2" - intaleq_maps: - dependency: "direct main" - description: - name: intaleq_maps - sha256: "4307196a9a9a4d4dfd29fd984ecd1f7460051523c74f9b201f0ba641dbda78a2" - url: "https://pub.dev" - source: hosted - version: "2.2.1" - intl: - dependency: "direct main" - description: - name: intl - sha256: "3df61194eb431efc39c4ceba583b95633a403f46c9fd341e550ce0bfa50e9aa5" - url: "https://pub.dev" - source: hosted - version: "0.20.2" - jni: - dependency: transitive - description: - name: jni - sha256: c2230682d5bc2362c1c9e8d3c7f406d9cbba23ab3f2e203a025dd47e0fb2e68f - url: "https://pub.dev" - source: hosted - version: "1.0.0" - jni_flutter: - dependency: transitive - description: - name: jni_flutter - sha256: "8b59e590786050b1cd866677dddaf76b1ade5e7bc751abe04b86e84d379d3ba6" - url: "https://pub.dev" - source: hosted - version: "1.0.1" - js: - dependency: transitive - description: - name: js - sha256: f2c445dce49627136094980615a031419f7f3eb393237e4ecd97ac15dea343f3 - url: "https://pub.dev" - source: hosted - version: "0.6.7" - json_annotation: - dependency: transitive - description: - name: json_annotation - sha256: "2a743920d81b7910627f68ee2c9ac1fc0bfee32b9fc3403587d7c6791ca12f80" - url: "https://pub.dev" - source: hosted - version: "4.12.0" - leak_tracker: - dependency: transitive - description: - name: leak_tracker - sha256: "33e2e26bdd85a0112ec15400c8cbffea70d0f9c3407491f672a2fad47915e2de" - url: "https://pub.dev" - source: hosted - version: "11.0.2" - leak_tracker_flutter_testing: - dependency: transitive - description: - name: leak_tracker_flutter_testing - sha256: "1dbc140bb5a23c75ea9c4811222756104fbcd1a27173f0c34ca01e16bea473c1" - url: "https://pub.dev" - source: hosted - version: "3.0.10" - leak_tracker_testing: - dependency: transitive - description: - name: leak_tracker_testing - sha256: "8d5a2d49f4a66b49744b23b018848400d23e54caf9463f4eb20df3eb8acb2eb1" - url: "https://pub.dev" - source: hosted - version: "3.0.2" - lints: - dependency: transitive - description: - name: lints - sha256: "12f842a479589fea194fe5c5a3095abc7be0c1f2ddfa9a0e76aed1dbd26a87df" - url: "https://pub.dev" - source: hosted - version: "6.1.0" - live_activities: - dependency: "direct main" - description: - name: live_activities - sha256: "30a77e91918585d904c73ce9b96e6553e2d2d958b6059c23a0957277c95522bf" - url: "https://pub.dev" - source: hosted - version: "2.4.3" - local_auth: - dependency: "direct main" - description: - name: local_auth - sha256: "434d854cf478f17f12ab29a76a02b3067f86a63a6d6c4eb8fbfdcfe4879c1b7b" - url: "https://pub.dev" - source: hosted - version: "2.3.0" - local_auth_android: - dependency: transitive - description: - name: local_auth_android - sha256: a0bdfcc0607050a26ef5b31d6b4b254581c3d3ce3c1816ab4d4f4a9173e84467 - url: "https://pub.dev" - source: hosted - version: "1.0.56" - local_auth_darwin: - dependency: transitive - description: - name: local_auth_darwin - sha256: "699873970067a40ef2f2c09b4c72eb1cfef64224ef041b3df9fdc5c4c1f91f49" - url: "https://pub.dev" - source: hosted - version: "1.6.1" - local_auth_platform_interface: - dependency: transitive - description: - name: local_auth_platform_interface - sha256: f98b8e388588583d3f781f6806e4f4c9f9e189d898d27f0c249b93a1973dd122 - url: "https://pub.dev" - source: hosted - version: "1.1.0" - local_auth_windows: - dependency: transitive - description: - name: local_auth_windows - sha256: bc4e66a29b0fdf751aafbec923b5bed7ad6ed3614875d8151afe2578520b2ab5 - url: "https://pub.dev" - source: hosted - version: "1.0.11" - logging: - dependency: transitive - description: - name: logging - sha256: c8245ada5f1717ed44271ed1c26b8ce85ca3228fd2ffdb75468ab01979309d61 - url: "https://pub.dev" - source: hosted - version: "1.3.0" - maplibre_gl: - dependency: transitive - description: - name: maplibre_gl - sha256: d9773555ae4ebab94bbc3ae2176b077cfda486ec729eefe01e1613f164cb8410 - url: "https://pub.dev" - source: hosted - version: "0.25.0" - maplibre_gl_platform_interface: - dependency: transitive - description: - name: maplibre_gl_platform_interface - sha256: bd7de401dea24dd7e8a6f2fa736ddee7dbbee3e24a9027f0afdd619994702047 - url: "https://pub.dev" - source: hosted - version: "0.25.0" - maplibre_gl_web: - dependency: transitive - description: - name: maplibre_gl_web - sha256: af0e48bf96e8dd99f8b958a1953126971eb8a0527b9735441d4f24df3913f5a2 - url: "https://pub.dev" - source: hosted - version: "0.25.0" - matcher: - dependency: transitive - description: - name: matcher - sha256: "12956d0ad8390bbcc63ca2e1469c0619946ccb52809807067a7020d57e647aa6" - url: "https://pub.dev" - source: hosted - version: "0.12.18" - material_color_utilities: - dependency: transitive - description: - name: material_color_utilities - sha256: "9c337007e82b1889149c82ed242ed1cb24a66044e30979c44912381e9be4c48b" - url: "https://pub.dev" - source: hosted - version: "0.13.0" - meta: - dependency: transitive - description: - name: meta - sha256: "23f08335362185a5ea2ad3a4e597f1375e78bce8a040df5c600c8d3552ef2394" - url: "https://pub.dev" - source: hosted - version: "1.17.0" - mime: - dependency: transitive - description: - name: mime - sha256: "41a20518f0cb1256669420fdba0cd90d21561e560ac240f26ef8322e45bb7ed6" - url: "https://pub.dev" - source: hosted - version: "2.0.0" - nested: - dependency: transitive - description: - name: nested - sha256: "03bac4c528c64c95c722ec99280375a6f2fc708eec17c7b3f07253b626cd2a20" - url: "https://pub.dev" - source: hosted - version: "1.0.0" - nm: - dependency: transitive - description: - name: nm - sha256: "2c9aae4127bdc8993206464fcc063611e0e36e72018696cd9631023a31b24254" - url: "https://pub.dev" - source: hosted - version: "0.5.0" - objective_c: - dependency: transitive - description: - name: objective_c - sha256: "6cb691c686fa2838c6deb34980d426145c2a5d537491cb83d463c33cdbc726ed" - url: "https://pub.dev" - source: hosted - version: "9.4.1" - package_config: - dependency: transitive - description: - name: package_config - sha256: f096c55ebb7deb7e384101542bfba8c52696c1b56fca2eb62827989ef2353bbc - url: "https://pub.dev" - source: hosted - version: "2.2.0" - package_info_plus: - dependency: "direct main" - description: - name: package_info_plus - sha256: "16eee997588c60225bda0488b6dcfac69280a6b7a3cf02c741895dd370a02968" - url: "https://pub.dev" - source: hosted - version: "8.3.1" - package_info_plus_platform_interface: - dependency: transitive - description: - name: package_info_plus_platform_interface - sha256: "202a487f08836a592a6bd4f901ac69b3a8f146af552bbd14407b6b41e1c3f086" - url: "https://pub.dev" - source: hosted - version: "3.2.1" - path: - dependency: transitive - description: - name: path - sha256: "75cca69d1490965be98c73ceaea117e8a04dd21217b37b292c9ddbec0d955bc5" - url: "https://pub.dev" - source: hosted - version: "1.9.1" - path_provider: - dependency: transitive - description: - name: path_provider - sha256: a7f4874f987173da295a61c181b8ee71dab59b332a486b391babf26a1b884825 - url: "https://pub.dev" - source: hosted - version: "2.1.6" - path_provider_android: - dependency: transitive - description: - name: path_provider_android - sha256: "69cbd515a62b94d32a7944f086b2f82b4ac40a1d45bebfc00813a430ab2dabcd" - url: "https://pub.dev" - source: hosted - version: "2.3.1" - path_provider_foundation: - dependency: transitive - description: - name: path_provider_foundation - sha256: "2a376b7d6392d80cd3705782d2caa734ca4727776db0b6ec36ef3f1855197699" - url: "https://pub.dev" - source: hosted - version: "2.6.0" - path_provider_linux: - dependency: transitive - description: - name: path_provider_linux - sha256: "58c2005f147315b11e9b4a7bc889cd5203e250cba8e3f012dae259b4972b5c16" - url: "https://pub.dev" - source: hosted - version: "2.2.2" - path_provider_platform_interface: - dependency: transitive - description: - name: path_provider_platform_interface - sha256: "484838772624c3a4b94f1e44a3e19897fee738f2d5c4ce448443b0417f7c9dda" - url: "https://pub.dev" - source: hosted - version: "2.1.3" - path_provider_windows: - dependency: transitive - description: - name: path_provider_windows - sha256: bd6f00dbd873bfb70d0761682da2b3a2c2fccc2b9e84c495821639601d81afe7 - url: "https://pub.dev" - source: hosted - version: "2.3.0" - permission_handler: - dependency: "direct main" - description: - name: permission_handler - sha256: "59adad729136f01ea9e35a48f5d1395e25cba6cea552249ddbe9cf950f5d7849" - url: "https://pub.dev" - source: hosted - version: "11.4.0" - permission_handler_android: - dependency: transitive - description: - name: permission_handler_android - sha256: d3971dcdd76182a0c198c096b5db2f0884b0d4196723d21a866fc4cdea057ebc - url: "https://pub.dev" - source: hosted - version: "12.1.0" - permission_handler_apple: - dependency: transitive - description: - name: permission_handler_apple - sha256: "79dfa1df734798aa3cfdad166d3a3698c206d8813de13516ea1071b5d7e2f420" - url: "https://pub.dev" - source: hosted - version: "9.4.10" - permission_handler_html: - dependency: transitive - description: - name: permission_handler_html - sha256: "38f000e83355abb3392140f6bc3030660cfaef189e1f87824facb76300b4ff24" - url: "https://pub.dev" - source: hosted - version: "0.1.3+5" - permission_handler_platform_interface: - dependency: transitive - description: - name: permission_handler_platform_interface - sha256: eb99b295153abce5d683cac8c02e22faab63e50679b937fa1bf67d58bb282878 - url: "https://pub.dev" - source: hosted - version: "4.3.0" - permission_handler_windows: - dependency: transitive - description: - name: permission_handler_windows - sha256: "1a790728016f79a41216d88672dbc5df30e686e811ad4e698bfc51f76ad91f1e" - url: "https://pub.dev" - source: hosted - version: "0.2.1" - petitparser: - dependency: transitive - description: - name: petitparser - sha256: "91bd59303e9f769f108f8df05e371341b15d59e995e6806aefab827b58336675" - url: "https://pub.dev" - source: hosted - version: "7.0.2" - platform: - dependency: transitive - description: - name: platform - sha256: "5d6b1b0036a5f331ebc77c850ebc8506cbc1e9416c27e59b439f917a902a4984" - url: "https://pub.dev" - source: hosted - version: "3.1.6" - plugin_platform_interface: - dependency: transitive - description: - name: plugin_platform_interface - sha256: "4820fbfdb9478b1ebae27888254d445073732dae3d6ea81f0b7e06d5dedc3f02" - url: "https://pub.dev" - source: hosted - version: "2.1.8" - posix: - dependency: transitive - description: - name: posix - sha256: "185ef7606574f789b40f289c233efa52e96dead518aed988e040a10737febb07" - url: "https://pub.dev" - source: hosted - version: "6.5.0" - provider: - dependency: transitive - description: - name: provider - sha256: "4e82183fa20e5ca25703ead7e05de9e4cceed1fbd1eadc1ac3cb6f565a09f272" - url: "https://pub.dev" - source: hosted - version: "6.1.5+1" - pub_semver: - dependency: transitive - description: - name: pub_semver - sha256: "5bfcf68ca79ef689f8990d1160781b4bad40a3bd5e5218ad4076ddb7f4081585" - url: "https://pub.dev" - source: hosted - version: "2.2.0" - record_use: - dependency: transitive - description: - name: record_use - sha256: "2551bd8eecfe95d14ae75f6021ad0248be5c27f138c2ec12fcb52b500b3ba1ed" - url: "https://pub.dev" - source: hosted - version: "0.6.0" - secure_string_operations: - dependency: "direct main" - description: - path: secure_string_operations - relative: true - source: path - version: "1.0.0" - shared_preferences: - dependency: "direct main" - description: - name: shared_preferences - sha256: c3025c5534b01739267eb7d76959bbc25a6d10f6988e1c2a3036940133dd10bf - url: "https://pub.dev" - source: hosted - version: "2.5.5" - shared_preferences_android: - dependency: transitive - description: - name: shared_preferences_android - sha256: e8d4762b1e2e8578fc4d0fd548cebf24afd24f49719c08974df92834565e2c53 - url: "https://pub.dev" - source: hosted - version: "2.4.23" - shared_preferences_foundation: - dependency: transitive - description: - name: shared_preferences_foundation - sha256: "4e7eaffc2b17ba398759f1151415869a34771ba11ebbccd1b0145472a619a64f" - url: "https://pub.dev" - source: hosted - version: "2.5.6" - shared_preferences_linux: - dependency: transitive - description: - name: shared_preferences_linux - sha256: "580abfd40f415611503cae30adf626e6656dfb2f0cee8f465ece7b6defb40f2f" - url: "https://pub.dev" - source: hosted - version: "2.4.1" - shared_preferences_platform_interface: - dependency: transitive - description: - name: shared_preferences_platform_interface - sha256: "649dc798a33931919ea356c4305c2d1f81619ea6e92244070b520187b5140ef9" - url: "https://pub.dev" - source: hosted - version: "2.4.2" - shared_preferences_web: - dependency: transitive - description: - name: shared_preferences_web - sha256: c49bd060261c9a3f0ff445892695d6212ff603ef3115edbb448509d407600019 - url: "https://pub.dev" - source: hosted - version: "2.4.3" - shared_preferences_windows: - dependency: transitive - description: - name: shared_preferences_windows - sha256: "94ef0f72b2d71bc3e700e025db3710911bd51a71cefb65cc609dd0d9a982e3c1" - url: "https://pub.dev" - source: hosted - version: "2.4.1" - sky_engine: - dependency: transitive - description: flutter - source: sdk - version: "0.0.0" - socket_io_client: - dependency: "direct main" - description: - name: socket_io_client - sha256: f5990ff303d385e7b2150f0e57cca097a8d20c6a2ae0a22cb2d496661ea8ed9b - url: "https://pub.dev" - source: hosted - version: "3.1.6" - socket_io_common: - dependency: transitive - description: - name: socket_io_common - sha256: "162fbaecbf4bf9a9372a62a341b3550b51dcef2f02f3e5830a297fd48203d45b" - url: "https://pub.dev" - source: hosted - version: "3.1.1" - source_span: - dependency: transitive - description: - name: source_span - sha256: "56a02f1f4cd1a2d96303c0144c93bd6d909eea6bee6bf5a0e0b685edbd4c47ab" - url: "https://pub.dev" - source: hosted - version: "1.10.2" - stack_trace: - dependency: transitive - description: - name: stack_trace - sha256: "8b27215b45d22309b5cddda1aa2b19bdfec9df0e765f2de506401c071d38d1b1" - url: "https://pub.dev" - source: hosted - version: "1.12.1" - stream_channel: - dependency: transitive - description: - name: stream_channel - sha256: "969e04c80b8bcdf826f8f16579c7b14d780458bd97f56d107d3950fdbeef059d" - url: "https://pub.dev" - source: hosted - version: "2.1.4" - string_scanner: - dependency: transitive - description: - name: string_scanner - sha256: "921cd31725b72fe181906c6a94d987c78e3b98c2e205b397ea399d4054872b43" - url: "https://pub.dev" - source: hosted - version: "1.4.1" - term_glyph: - dependency: transitive - description: - name: term_glyph - sha256: "7f554798625ea768a7518313e58f83891c7f5024f88e46e7182a4558850a4b8e" - url: "https://pub.dev" - source: hosted - version: "1.2.2" - test_api: - dependency: transitive - description: - name: test_api - sha256: "93167629bfc610f71560ab9312acdda4959de4df6fac7492c89ff0d3886f6636" - url: "https://pub.dev" - source: hosted - version: "0.7.9" - timezone: - dependency: transitive - description: - name: timezone - sha256: dd14a3b83cfd7cb19e7888f1cbc20f258b8d71b54c06f79ac585f14093a287d1 - url: "https://pub.dev" - source: hosted - version: "0.10.1" - trip_overlay_plugin: - dependency: "direct main" - description: - path: trip_overlay_plugin - relative: true - source: path - version: "0.0.1" - typed_data: - dependency: transitive - description: - name: typed_data - sha256: f9049c039ebfeb4cf7a7104a675823cd72dba8297f264b6637062516699fa006 - url: "https://pub.dev" - source: hosted - version: "1.4.0" - universal_io: - dependency: transitive - description: - name: universal_io - sha256: f63cbc48103236abf48e345e07a03ce5757ea86285ed313a6a032596ed9301e2 - url: "https://pub.dev" - source: hosted - version: "2.3.1" - upower: - dependency: transitive - description: - name: upower - sha256: cf042403154751180affa1d15614db7fa50234bc2373cd21c3db666c38543ebf - url: "https://pub.dev" - source: hosted - version: "0.7.0" - url_launcher: - dependency: "direct main" - description: - name: url_launcher - sha256: f6a7e5c4835bb4e3026a04793a4199ca2d14c739ec378fdfe23fc8075d0439f8 - url: "https://pub.dev" - source: hosted - version: "6.3.2" - url_launcher_android: - dependency: transitive - description: - name: url_launcher_android - sha256: "17bc677f0b301615530dd1d67e0a9828cafa2d0b6b6eae4cd3679b7eac4a273c" - url: "https://pub.dev" - source: hosted - version: "6.3.30" - url_launcher_ios: - dependency: transitive - description: - name: url_launcher_ios - sha256: "580fe5dfb51671ae38191d316e027f6b76272b026370708c2d898799750a02b0" - url: "https://pub.dev" - source: hosted - version: "6.4.1" - url_launcher_linux: - dependency: transitive - description: - name: url_launcher_linux - sha256: d5e14138b3bc193a0f63c10a53c94b91d399df0512b1f29b94a043db7482384a - url: "https://pub.dev" - source: hosted - version: "3.2.2" - url_launcher_macos: - dependency: transitive - description: - name: url_launcher_macos - sha256: "368adf46f71ad3c21b8f06614adb38346f193f3a59ba8fe9a2fd74133070ba18" - url: "https://pub.dev" - source: hosted - version: "3.2.5" - url_launcher_platform_interface: - dependency: transitive - description: - name: url_launcher_platform_interface - sha256: "552f8a1e663569be95a8190206a38187b531910283c3e982193e4f2733f01029" - url: "https://pub.dev" - source: hosted - version: "2.3.2" - url_launcher_web: - dependency: transitive - description: - name: url_launcher_web - sha256: "85c81589622fbc87c1c683aaea164d3604a7777495a79d91e39ffcdec39ddb34" - url: "https://pub.dev" - source: hosted - version: "2.4.3" - url_launcher_windows: - dependency: transitive - description: - name: url_launcher_windows - sha256: "712c70ab1b99744ff066053cbe3e80c73332b38d46e5e945c98689b2e66fc15f" - url: "https://pub.dev" - source: hosted - version: "3.1.5" - uuid: - dependency: transitive - description: - name: uuid - sha256: "9b129329f58692f6e6578329498a8fe9fbe98f090beb764ffbb8ee2eadd01dcd" - url: "https://pub.dev" - source: hosted - version: "4.6.0" - vector_math: - dependency: transitive - description: - name: vector_math - sha256: d530bd74fea330e6e364cda7a85019c434070188383e1cd8d9777ee586914c5b - url: "https://pub.dev" - source: hosted - version: "2.2.0" - vibration: - dependency: "direct main" - description: - name: vibration - sha256: c6c25eb7acadfd231925a60004736443cbf63f1eb5740d6dd83a1bc09cf00f6d - url: "https://pub.dev" - source: hosted - version: "3.2.0" - vibration_platform_interface: - dependency: transitive - description: - name: vibration_platform_interface - sha256: "258c273268f8aa40c88d29741137c536874a738779b92ddb8aa32ed093721ec5" - url: "https://pub.dev" - source: hosted - version: "0.1.2" - vm_service: - dependency: transitive - description: - name: vm_service - sha256: "0016aef94fc66495ac78af5859181e3f3bf2026bd8eecc72b9565601e19ab360" - url: "https://pub.dev" - source: hosted - version: "15.2.0" - wakelock_plus: - dependency: "direct main" - description: - name: wakelock_plus - sha256: "61713aa82b7f85c21c9f4cd0a148abd75f38a74ec645fcb1e446f882c82fd09b" - url: "https://pub.dev" - source: hosted - version: "1.3.3" - wakelock_plus_platform_interface: - dependency: transitive - description: - name: wakelock_plus_platform_interface - sha256: b13f99e992e7ae6a152e16c5559d3c07ff445b13330192662494e614ca3e7d7b - url: "https://pub.dev" - source: hosted - version: "1.5.1" - web: - dependency: transitive - description: - name: web - sha256: "868d88a33d8a87b18ffc05f9f030ba328ffefba92d6c127917a2ba740f9cfe4a" - url: "https://pub.dev" - source: hosted - version: "1.1.1" - web_socket: - dependency: transitive - description: - name: web_socket - sha256: "34d64019aa8e36bf9842ac014bb5d2f5586ca73df5e4d9bf5c936975cae6982c" - url: "https://pub.dev" - source: hosted - version: "1.0.1" - win32: - dependency: transitive - description: - name: win32 - sha256: d7cb55e04cd34096cd3a79b3330245f54cb96a370a1c27adb3c84b917de8b08e - url: "https://pub.dev" - source: hosted - version: "5.15.0" - win32_registry: - dependency: transitive - description: - name: win32_registry - sha256: "6f1b564492d0147b330dd794fee8f512cec4977957f310f9951b5f9d83618dae" - url: "https://pub.dev" - source: hosted - version: "2.1.0" - xdg_directories: - dependency: transitive - description: - name: xdg_directories - sha256: "7a3f37b05d989967cdddcbb571f1ea834867ae2faa29725fd085180e0883aa15" - url: "https://pub.dev" - source: hosted - version: "1.1.0" - xml: - dependency: transitive - description: - name: xml - sha256: "971043b3a0d3da28727e40ed3e0b5d18b742fa5a68665cca88e74b7876d5e025" - url: "https://pub.dev" - source: hosted - version: "6.6.1" - yaml: - dependency: transitive - description: - name: yaml - sha256: b9da305ac7c39faa3f030eccd175340f968459dae4af175130b3fc47e40d76ce - url: "https://pub.dev" - source: hosted - version: "3.1.3" -sdks: - dart: ">=3.11.0 <4.0.0" - flutter: ">=3.41.0" diff --git a/apps/driver-archive-cubit/pubspec.yaml b/apps/driver-archive-cubit/pubspec.yaml deleted file mode 100755 index 37de5c9..0000000 --- a/apps/driver-archive-cubit/pubspec.yaml +++ /dev/null @@ -1,118 +0,0 @@ -name: driver -description: Tripz — تطبيق السائق -publish_to: "none" - -version: 1.0.0+1 - -environment: - sdk: ">=3.5.0 <4.0.0" - -dependencies: - flutter: - sdk: flutter - flutter_localizations: - sdk: flutter - - # ---- الإضافات الأصيلة المُعاد استعمالها (docs/23 §7) — لا يُعاد بناؤها ---- - secure_string_operations: - path: ./secure_string_operations - trip_overlay_plugin: - path: ./trip_overlay_plugin - bubble_head: - path: ./bubble-master - - # ---- البنية المعتمدة (docs/23 §9) ---- - flutter_bloc: ^9.1.1 # الحالة - equatable: ^2.0.7 - get_it: ^8.0.3 # الحقن - dio: ^5.7.0 # الشبكة — نقطة النداء الوحيدة - go_router: ^14.6.2 # التنقّل - flutter_secure_storage: ^9.2.2 # التوكنات (لا SharedPreferences) - shared_preferences: ^2.3.4 # إعدادات الثيم واللغة (docs/26 §4) - - # ---- الخرائط: SDK انطلق حصراً (docs/23 §6) ---- - # يُصدِّر LatLng/Marker/Polyline بنفسه كبديل drop-in لـgoogle_maps_flutter. - # لا تُضَف flutter_map ولا latlong2: طبقة منافسة تعطي نوعَي LatLng متضاربين. - intaleq_maps: ^2.2.1 - - # ---- الزمن الحقيقي والإشعارات ---- - socket_io_client: ^3.0.2 - firebase_core: ^4.1.1 - firebase_messaging: ^16.0.2 - flutter_local_notifications: ^18.0.1 - - # ---- خاصّ بالسائق: الموقع في الخلفية والعرض الطافي (docs/23 §10) ---- - geolocator: ^14.0.2 - flutter_background_service: ^5.1.0 - flutter_background_service_android: ^6.3.1 - flutter_overlay_window: ^0.4.5 - battery_plus: ^7.0.0 # متحكّم الموقع واعٍ للبطارية - wakelock_plus: ^1.2.10 - vibration: ^3.1.2 - - # الرحلة الحيّة على شاشة القفل: iOS عبر live_activities، وأندرويد عبر - # `trip_overlay_plugin` الأصيل المرفق (لا حزمة pub مقابلة له). - live_activities: ^2.3.0 - - # ---- أدوات مساعدة ---- - device_info_plus: ^11.2.0 # بصمة الجهاز (x-device-id — docs/17 D2) - connectivity_plus: ^6.1.5 - permission_handler: ^11.3.1 - package_info_plus: ^8.1.2 - image_picker: ^1.1.2 # صور الوثائق - local_auth: ^2.3.0 # حيوية/تحقّق السائق - url_launcher: ^6.3.1 - intl: ^0.20.2 - cupertino_icons: ^1.0.8 - -dev_dependencies: - flutter_test: - sdk: flutter - flutter_lints: ^6.0.0 - flutter_launcher_icons: ^0.14.2 # يستدعيها سكربت التوليد (N3) - flutter_native_splash: ^2.4.3 - -flutter_launcher_icons: - android: "launcher_icon" - ios: true - image_path: "assets/images/logo.png" - min_sdk_android: 21 - -flutter: - generate: true - uses-material-design: true - assets: - - assets/ - - assets/images/ - - assets/fonts/ - - assets/lang/ - - shorebird.yaml - - fonts: - - family: Inter - fonts: - - asset: assets/fonts/Inter-Regular.ttf - weight: 400 - - asset: assets/fonts/Inter-Medium.ttf - weight: 500 - - asset: assets/fonts/Inter-SemiBold.ttf - weight: 600 - - asset: assets/fonts/Inter-Bold.ttf - weight: 700 - - family: IBMPlexSansArabic - fonts: - - asset: assets/fonts/IBMPlexSansArabic-Regular.ttf - weight: 400 - - asset: assets/fonts/IBMPlexSansArabic-Medium.ttf - weight: 500 - - asset: assets/fonts/IBMPlexSansArabic-SemiBold.ttf - weight: 600 - - asset: assets/fonts/IBMPlexSansArabic-Bold.ttf - weight: 700 - -flutter_native_splash: - color: "#FFFFFF" - image: "assets/images/logo.png" - android_12: - image: "assets/images/logo.png" - icon_background_color: "#FFFFFF" diff --git a/apps/driver-archive-cubit/secure_string_operations/lib/secure_string_operations.dart b/apps/driver-archive-cubit/secure_string_operations/lib/secure_string_operations.dart deleted file mode 100755 index d428ac3..0000000 --- a/apps/driver-archive-cubit/secure_string_operations/lib/secure_string_operations.dart +++ /dev/null @@ -1,47 +0,0 @@ -// File: lib/secure_string_operations.dart - -library secure_string_operations; - -class X { - static String c(String a, Map b) { - StringBuffer c = StringBuffer(); - c.write(a); - - String d = "Bl"; - c.write(b[d] ?? d); - - StringBuffer e = StringBuffer(); - String f = c.toString(); - - for (int g = 0; g < f.length; g++) { - String h = f[g]; - e.write(b[h] ?? h); - } - - return e.toString(); - } - - static String r(String a, Map b) { - StringBuffer c = StringBuffer(); - String d = "Bl"; - int e = d.length; - - for (int f = 0; f < a.length; f++) { - String g = a[f]; - String h = b.keys.firstWhere( - (i) => b[i] == g, - orElse: () => g, - ); - - c.write(h); - } - - String j = c.toString(); - - if (j.endsWith(d)) { - j = j.substring(0, j.length - e); - } - - return j; - } -} diff --git a/apps/driver-archive-cubit/secure_string_operations/pubspec.lock b/apps/driver-archive-cubit/secure_string_operations/pubspec.lock deleted file mode 100755 index fce7ef1..0000000 --- a/apps/driver-archive-cubit/secure_string_operations/pubspec.lock +++ /dev/null @@ -1,5 +0,0 @@ -# Generated by pub -# See https://dart.dev/tools/pub/glossary#lockfile -packages: {} -sdks: - dart: ">=2.12.0 <4.0.0" diff --git a/apps/driver-archive-cubit/secure_string_operations/pubspec.yaml b/apps/driver-archive-cubit/secure_string_operations/pubspec.yaml deleted file mode 100755 index 9709971..0000000 --- a/apps/driver-archive-cubit/secure_string_operations/pubspec.yaml +++ /dev/null @@ -1,6 +0,0 @@ -name: secure_string_operations -description: A package for secure string operations -version: 1.0.0 - -environment: - sdk: ">=3.5.0 <4.0.0" diff --git a/apps/driver-archive-cubit/shorebird.yaml b/apps/driver-archive-cubit/shorebird.yaml deleted file mode 100755 index 4c0bb21..0000000 --- a/apps/driver-archive-cubit/shorebird.yaml +++ /dev/null @@ -1,14 +0,0 @@ -# This file is used to configure the Shorebird updater used by your app. -# Learn more at https://docs.shorebird.dev -# This file does not contain any sensitive information and should be checked into version control. - -# Your app_id is the unique identifier assigned to your app. -# It is used to identify your app when requesting patches from Shorebird's servers. -# It is not a secret and can be shared publicly. -app_id: 68cc9345-6270-439e-ae58-437fb195836d - -# auto_update controls if Shorebird should automatically update in the background on launch. -# If auto_update: false, you will need to use package:shorebird_code_push to trigger updates. -# https://pub.dev/packages/shorebird_code_push -# Uncomment the following line to disable automatic updates. -# auto_update: false diff --git a/apps/driver-archive-cubit/test/widget_test.dart b/apps/driver-archive-cubit/test/widget_test.dart deleted file mode 100755 index 8f47a6d..0000000 --- a/apps/driver-archive-cubit/test/widget_test.dart +++ /dev/null @@ -1,24 +0,0 @@ -// This is a basic Flutter widget test. -// -// To perform an interaction with a widget in your test, use the WidgetTester -// utility in the flutter_test package. For example, you can send tap and scroll -// gestures. You can also use WidgetTester to find child widgets in the widget -// tree, read text, and verify that the values of widget properties are correct. - -import 'package:flutter_test/flutter_test.dart'; - -void main() { - testWidgets('App smoke test', (WidgetTester tester) async { - // TODO: To properly test TripzDriverApp, you need to mock dependencies - // registered in getIt (e.g. AuthRepository, DriverCubit, etc.) or - // provide a testing configuration for setupDi(). - - // Example: - // await setupDi(); // Setup test dependencies here - // await tester.pumpWidget(const TripzDriverApp()); - - // expect(find.byType(TripzDriverApp), findsOneWidget); - - expect(true, isTrue); // Basic placeholder test to pass - }); -} diff --git a/apps/driver-archive-cubit/trip_overlay_plugin/.gitignore b/apps/driver-archive-cubit/trip_overlay_plugin/.gitignore deleted file mode 100644 index b9d7f25..0000000 --- a/apps/driver-archive-cubit/trip_overlay_plugin/.gitignore +++ /dev/null @@ -1,33 +0,0 @@ -# Miscellaneous -*.class -*.log -*.pyc -*.swp -.DS_Store -.atom/ -.build/ -.buildlog/ -.history -.svn/ -.swiftpm/ -migrate_working_dir/ - -# IntelliJ related -*.iml -*.ipr -*.iws -.idea/ - -# The .vscode folder contains launch configuration and tasks you configure in -# VS Code which you may wish to be included in version control, so this line -# is commented out by default. -#.vscode/ - -# Flutter/Dart/Pub related -# Libraries should not include pubspec.lock, per https://dart.dev/guides/libraries/private-files#pubspeclock. -/pubspec.lock -**/doc/api/ -.dart_tool/ -.flutter-plugins-dependencies -/build/ -/coverage/ diff --git a/apps/driver-archive-cubit/trip_overlay_plugin/.metadata b/apps/driver-archive-cubit/trip_overlay_plugin/.metadata deleted file mode 100644 index 74605d9..0000000 --- a/apps/driver-archive-cubit/trip_overlay_plugin/.metadata +++ /dev/null @@ -1,30 +0,0 @@ -# This file tracks properties of this Flutter project. -# Used by Flutter tool to assess capabilities and perform upgrades etc. -# -# This file should be version controlled and should not be manually edited. - -version: - revision: "67323de285b00232883f53b84095eb72be97d35c" - channel: "stable" - -project_type: plugin - -# Tracks metadata for the flutter migrate command -migration: - platforms: - - platform: root - create_revision: 67323de285b00232883f53b84095eb72be97d35c - base_revision: 67323de285b00232883f53b84095eb72be97d35c - - platform: android - create_revision: 67323de285b00232883f53b84095eb72be97d35c - base_revision: 67323de285b00232883f53b84095eb72be97d35c - - # User provided section - - # List of Local paths (relative to this file) that should be - # ignored by the migrate tool. - # - # Files that are not part of the templates will be ignored by default. - unmanaged_files: - - 'lib/main.dart' - - 'ios/Runner.xcodeproj/project.pbxproj' diff --git a/apps/driver-archive-cubit/trip_overlay_plugin/CHANGELOG.md b/apps/driver-archive-cubit/trip_overlay_plugin/CHANGELOG.md deleted file mode 100644 index 41cc7d8..0000000 --- a/apps/driver-archive-cubit/trip_overlay_plugin/CHANGELOG.md +++ /dev/null @@ -1,3 +0,0 @@ -## 0.0.1 - -* TODO: Describe initial release. diff --git a/apps/driver-archive-cubit/trip_overlay_plugin/LICENSE b/apps/driver-archive-cubit/trip_overlay_plugin/LICENSE deleted file mode 100644 index ba75c69..0000000 --- a/apps/driver-archive-cubit/trip_overlay_plugin/LICENSE +++ /dev/null @@ -1 +0,0 @@ -TODO: Add your license here. diff --git a/apps/driver-archive-cubit/trip_overlay_plugin/README.md b/apps/driver-archive-cubit/trip_overlay_plugin/README.md deleted file mode 100644 index 01c5a92..0000000 --- a/apps/driver-archive-cubit/trip_overlay_plugin/README.md +++ /dev/null @@ -1,15 +0,0 @@ -# trip_overlay_plugin - -A new Flutter plugin project. - -## Getting Started - -This project is a starting point for a Flutter -[plug-in package](https://flutter.dev/to/develop-plugins), -a specialized package that includes platform-specific implementation code for -Android and/or iOS. - -For help getting started with Flutter development, view the -[online documentation](https://docs.flutter.dev), which offers tutorials, -samples, guidance on mobile development, and a full API reference. - diff --git a/apps/driver-archive-cubit/trip_overlay_plugin/analysis_options.yaml b/apps/driver-archive-cubit/trip_overlay_plugin/analysis_options.yaml deleted file mode 100644 index a5744c1..0000000 --- a/apps/driver-archive-cubit/trip_overlay_plugin/analysis_options.yaml +++ /dev/null @@ -1,4 +0,0 @@ -include: package:flutter_lints/flutter.yaml - -# Additional information about this file can be found at -# https://dart.dev/guides/language/analysis-options diff --git a/apps/driver-archive-cubit/trip_overlay_plugin/android/.gitignore b/apps/driver-archive-cubit/trip_overlay_plugin/android/.gitignore deleted file mode 100644 index 161bdcd..0000000 --- a/apps/driver-archive-cubit/trip_overlay_plugin/android/.gitignore +++ /dev/null @@ -1,9 +0,0 @@ -*.iml -.gradle -/local.properties -/.idea/workspace.xml -/.idea/libraries -.DS_Store -/build -/captures -.cxx diff --git a/apps/driver-archive-cubit/trip_overlay_plugin/android/build.gradle b/apps/driver-archive-cubit/trip_overlay_plugin/android/build.gradle deleted file mode 100644 index 71b8e30..0000000 --- a/apps/driver-archive-cubit/trip_overlay_plugin/android/build.gradle +++ /dev/null @@ -1,66 +0,0 @@ -group = "com.intaleq_driver.trip_overlay_plugin" -version = "1.0-SNAPSHOT" - -buildscript { - ext.kotlin_version = "2.2.20" - repositories { - google() - mavenCentral() - } - - dependencies { - classpath("com.android.tools.build:gradle:8.11.1") - classpath("org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version") - } -} - -allprojects { - repositories { - google() - mavenCentral() - } -} - -apply plugin: "com.android.library" -apply plugin: "kotlin-android" - -android { - namespace = "com.intaleq_driver.trip_overlay_plugin" - - compileSdk = 36 - - compileOptions { - sourceCompatibility = JavaVersion.VERSION_17 - targetCompatibility = JavaVersion.VERSION_17 - } - - kotlinOptions { - jvmTarget = JavaVersion.VERSION_17 - } - - sourceSets { - main.java.srcDirs += "src/main/kotlin" - test.java.srcDirs += "src/test/kotlin" - } - - defaultConfig { - minSdk = 24 - } - - dependencies { - testImplementation("org.jetbrains.kotlin:kotlin-test") - testImplementation("org.mockito:mockito-core:5.0.0") - } - - testOptions { - unitTests.all { - useJUnitPlatform() - - testLogging { - events "passed", "skipped", "failed", "standardOut", "standardError" - outputs.upToDateWhen {false} - showStandardStreams = true - } - } - } -} diff --git a/apps/driver-archive-cubit/trip_overlay_plugin/android/settings.gradle b/apps/driver-archive-cubit/trip_overlay_plugin/android/settings.gradle deleted file mode 100644 index 4aaa409..0000000 --- a/apps/driver-archive-cubit/trip_overlay_plugin/android/settings.gradle +++ /dev/null @@ -1 +0,0 @@ -rootProject.name = 'trip_overlay_plugin' diff --git a/apps/driver-archive-cubit/trip_overlay_plugin/android/src/main/AndroidManifest.xml b/apps/driver-archive-cubit/trip_overlay_plugin/android/src/main/AndroidManifest.xml deleted file mode 100644 index dd49fdf..0000000 --- a/apps/driver-archive-cubit/trip_overlay_plugin/android/src/main/AndroidManifest.xml +++ /dev/null @@ -1,3 +0,0 @@ - - diff --git a/apps/driver-archive-cubit/trip_overlay_plugin/android/src/main/kotlin/com/intaleq_driver/trip_overlay_plugin/TripOverlayPlugin.kt b/apps/driver-archive-cubit/trip_overlay_plugin/android/src/main/kotlin/com/intaleq_driver/trip_overlay_plugin/TripOverlayPlugin.kt deleted file mode 100644 index 7e7a2d2..0000000 --- a/apps/driver-archive-cubit/trip_overlay_plugin/android/src/main/kotlin/com/intaleq_driver/trip_overlay_plugin/TripOverlayPlugin.kt +++ /dev/null @@ -1,179 +0,0 @@ -package com.intaleq_driver.trip_overlay_plugin - -import android.app.Activity -import android.content.Context -import android.content.Intent -import android.net.Uri -import android.os.Build -import android.provider.Settings -import android.util.Log -import io.flutter.embedding.engine.plugins.FlutterPlugin -import io.flutter.embedding.engine.plugins.activity.ActivityAware -import io.flutter.embedding.engine.plugins.activity.ActivityPluginBinding -import io.flutter.plugin.common.MethodCall -import io.flutter.plugin.common.MethodChannel -import io.flutter.plugin.common.MethodChannel.MethodCallHandler -import io.flutter.plugin.common.MethodChannel.Result -import io.flutter.plugin.common.PluginRegistry - -class TripOverlayPlugin : - FlutterPlugin, MethodCallHandler, ActivityAware, PluginRegistry.ActivityResultListener { - - private lateinit var channel: MethodChannel - private lateinit var context: Context - private var activity: Activity? = null - - companion object { - const val CHANNEL = "trip_overlay_plugin" - - const val TAG = "TripOverlayPlugin" - const val REQUEST_CODE_OVERLAY = 1001 - - // Static reference so TripOverlayService can call back into Flutter - var methodChannel: MethodChannel? = null - - /** - * Called by TripOverlayService when the driver taps Accept. Sends event Flutter → Dart - * side. - */ - fun notifyTripAccepted(tripId: String) { - methodChannel?.invokeMethod("onTripAccepted", mapOf("tripId" to tripId)) - Log.d(TAG, "notifyTripAccepted: $tripId") - } - - /** Called by TripOverlayService when the driver taps Reject or timer expires. */ - fun notifyTripRejected(tripId: String) { - methodChannel?.invokeMethod("onTripRejected", mapOf("tripId" to tripId)) - Log.d(TAG, "notifyTripRejected: $tripId") - } - } - - // ─── FlutterPlugin ─────────────────────────────────────────────────────── - - override fun onAttachedToEngine(binding: FlutterPlugin.FlutterPluginBinding) { - context = binding.applicationContext - channel = MethodChannel(binding.binaryMessenger, CHANNEL) - channel.setMethodCallHandler(this) - methodChannel = channel - Log.d(TAG, "Plugin attached to engine") - } - - override fun onDetachedFromEngine(binding: FlutterPlugin.FlutterPluginBinding) { - channel.setMethodCallHandler(null) - methodChannel = null - } - - // ─── MethodCallHandler ─────────────────────────────────────────────────── - - override fun onMethodCall(call: MethodCall, result: Result) { - when (call.method) { - "isPermissionGranted" -> { - result.success(isOverlayPermissionGranted()) - } - "requestPermission" -> { - requestOverlayPermission() - result.success(null) - } - "showOverlay" -> { - val tripDataJson = - call.argument("tripData") - ?: run { - result.error("INVALID_ARGS", "tripData is required", null) - return - } - val autoCloseSeconds = call.argument("autoCloseSeconds") ?: 30 - val success = showOverlay(tripDataJson, autoCloseSeconds) - result.success(success) - } - "hideOverlay" -> { - hideOverlay() - result.success(null) - } - "isOverlayActive" -> { - result.success(TripOverlayService.isRunning) - } - else -> result.notImplemented() - } - } - - // ─── Permission Helpers ─────────────────────────────────────────────────── - - private fun isOverlayPermissionGranted(): Boolean { - return if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { - Settings.canDrawOverlays(context) - } else { - true // Pre-M devices don't need runtime permission - } - } - - private fun requestOverlayPermission() { - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { - val intent = - Intent( - Settings.ACTION_MANAGE_OVERLAY_PERMISSION, - Uri.parse("package:${context.packageName}") - ) - .apply { addFlags(Intent.FLAG_ACTIVITY_NEW_TASK) } - activity?.startActivityForResult(intent, REQUEST_CODE_OVERLAY) - ?: context.startActivity(intent) - } - } - - // ─── Overlay Control ────────────────────────────────────────────────────── - - private fun showOverlay(tripDataJson: String, autoCloseSeconds: Int): Boolean { - if (!isOverlayPermissionGranted()) { - Log.w(TAG, "Overlay permission not granted") - return false - } - val intent = - Intent(context, TripOverlayService::class.java).apply { - action = TripOverlayService.ACTION_SHOW - putExtra(TripOverlayService.EXTRA_TRIP_DATA, tripDataJson) - putExtra(TripOverlayService.EXTRA_AUTO_CLOSE_SECONDS, autoCloseSeconds) - } - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { - context.startForegroundService(intent) - } else { - context.startService(intent) - } - Log.d(TAG, "showOverlay called with tripData: $tripDataJson") - return true - } - - private fun hideOverlay() { - val intent = - Intent(context, TripOverlayService::class.java).apply { - action = TripOverlayService.ACTION_HIDE - } - context.startService(intent) - Log.d(TAG, "hideOverlay called") - } - - // ─── ActivityAware ──────────────────────────────────────────────────────── - - override fun onAttachedToActivity(binding: ActivityPluginBinding) { - activity = binding.activity - binding.addActivityResultListener(this) - } - - override fun onDetachedFromActivityForConfigChanges() { - activity = null - } - override fun onReattachedToActivityForConfigChanges(binding: ActivityPluginBinding) { - activity = binding.activity - } - override fun onDetachedFromActivity() { - activity = null - } - - // ─── ActivityResultListener ─────────────────────────────────────────────── - - override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?): Boolean { - if (requestCode == REQUEST_CODE_OVERLAY) { - Log.d(TAG, "Overlay permission result received") - return true - } - return false - } -} diff --git a/apps/driver-archive-cubit/trip_overlay_plugin/android/src/main/kotlin/com/intaleq_driver/trip_overlay_plugin/TripzOverlayReciver.kt b/apps/driver-archive-cubit/trip_overlay_plugin/android/src/main/kotlin/com/intaleq_driver/trip_overlay_plugin/TripzOverlayReciver.kt deleted file mode 100644 index 05eb485..0000000 --- a/apps/driver-archive-cubit/trip_overlay_plugin/android/src/main/kotlin/com/intaleq_driver/trip_overlay_plugin/TripzOverlayReciver.kt +++ /dev/null @@ -1,109 +0,0 @@ -package com.intaleq_driver.trip_overlay_plugin - -import android.content.BroadcastReceiver -import android.content.Context -import android.content.Intent -import android.os.Build -import android.util.Log -import org.json.JSONObject - -/** - * TripOverlayReceiver - * - * A BroadcastReceiver you can trigger directly from your FCM background handler (or anywhere - * outside Flutter context) to show the overlay without needing an active MethodChannel. - * - * Usage from your backgroundMessageHandler in main.dart: — Call the static helper - * [TripOverlayReceiver.show(context, tripDataJson)] - * - * Or register in AndroidManifest and send an explicit broadcast. - * - * Register in AndroidManifest.xml: - * ``` - */ -class TripOverlayReceiver : BroadcastReceiver() { - - companion object { - const val TAG = "TripOverlayReceiver" - const val ACTION = "com.intaleq_driver.SHOW_OVERLAY" - const val EXTRA_TRIP_DATA = "trip_data" - const val EXTRA_AUTO_CLOSE = "auto_close_seconds" - - /** - * Convenience method — call this from your FCM handler (Kotlin/Java) or from a Flutter - * MethodChannel invocation. - */ - fun show(context: Context, tripDataJson: String, autoCloseSeconds: Int = 30) { - val intent = - Intent(context, TripOverlayService::class.java).apply { - action = TripOverlayService.ACTION_SHOW - putExtra(TripOverlayService.EXTRA_TRIP_DATA, tripDataJson) - putExtra(TripOverlayService.EXTRA_AUTO_CLOSE_SECONDS, autoCloseSeconds) - } - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { - context.startForegroundService(intent) - } else { - context.startService(intent) - } - Log.d(TAG, "Dispatched show overlay request") - } - - /** Hide the overlay programmatically from native side */ - fun hide(context: Context) { - val intent = - Intent(context, TripOverlayService::class.java).apply { - action = TripOverlayService.ACTION_HIDE - } - context.startService(intent) - Log.d(TAG, "Dispatched hide overlay request") - } - - /** - * Build a TripData JSON string from FCM message data map. Keys match what your server sends - * inside the FCM data payload. - * - * Expected FCM data keys: tripId, passengerName, pickupAddress, dropoffAddress, distanceKm, - * estimatedFare, estimatedMinutes, pickupLat, pickupLng - */ - fun buildTripJsonFromFcmData(data: Map): String { - return try { - JSONObject() - .apply { - put("tripId", data["tripId"] ?: "") - put("passengerName", data["passengerName"] ?: "غير معروف") - put("pickupAddress", data["pickupAddress"] ?: "") - put("dropoffAddress", data["dropoffAddress"] ?: "") - put("distanceKm", data["distanceKm"]?.toDoubleOrNull() ?: 0.0) - put("estimatedFare", data["estimatedFare"]?.toDoubleOrNull() ?: 0.0) - put("estimatedMinutes", data["estimatedMinutes"]?.toIntOrNull() ?: 0) - put("pickupLat", data["pickupLat"]?.toDoubleOrNull() ?: 0.0) - put("pickupLng", data["pickupLng"]?.toDoubleOrNull() ?: 0.0) - put("passengerAvatarUrl", data["passengerAvatarUrl"] ?: "") - } - .toString() - } catch (e: Exception) { - Log.e(TAG, "Error building trip JSON: ${e.message}") - "{}" - } - } - } - - // ─── Broadcast received ─────────────────────────────────────────────────── - - override fun onReceive(context: Context, intent: Intent) { - if (intent.action != ACTION) return - - val tripData = - intent.getStringExtra(EXTRA_TRIP_DATA) - ?: run { - Log.e(TAG, "No trip data in broadcast intent") - return - } - val autoClose = intent.getIntExtra(EXTRA_AUTO_CLOSE, 30) - show(context, tripData, autoClose) - Log.d(TAG, "Received broadcast, showing overlay") - } -} diff --git a/apps/driver-archive-cubit/trip_overlay_plugin/android/src/main/kotlin/com/intaleq_driver/trip_overlay_plugin/TripzOverlayService.kt b/apps/driver-archive-cubit/trip_overlay_plugin/android/src/main/kotlin/com/intaleq_driver/trip_overlay_plugin/TripzOverlayService.kt deleted file mode 100644 index 1811c3b..0000000 --- a/apps/driver-archive-cubit/trip_overlay_plugin/android/src/main/kotlin/com/intaleq_driver/trip_overlay_plugin/TripzOverlayService.kt +++ /dev/null @@ -1,560 +0,0 @@ -package com.intaleq_driver.trip_overlay_plugin - -import android.app.* -import android.content.Context -import android.content.Intent -import android.graphics.BitmapFactory -import android.graphics.Color -import android.graphics.PixelFormat -import android.graphics.drawable.GradientDrawable -import android.media.MediaPlayer -import android.media.RingtoneManager -import android.os.Build -import android.os.CountDownTimer -import android.os.Handler -import android.os.IBinder -import android.os.Looper -import android.util.Log -import android.view.* -import android.widget.* -import androidx.core.app.NotificationCompat -import java.net.HttpURLConnection -import java.net.URL -import kotlin.concurrent.thread -import org.json.JSONObject - -class TripOverlayService : Service() { - - companion object { - const val TAG = "TripOverlayService" - const val ACTION_SHOW = "SHOW" - const val ACTION_HIDE = "HIDE" - const val EXTRA_TRIP_DATA = "trip_data" - const val EXTRA_AUTO_CLOSE_SECONDS = "auto_close_seconds" - private const val NOTIFICATION_ID = 9900 - private const val CHANNEL_ID = "trip_overlay_service_channel" - - @Volatile - var isRunning: Boolean = false - private set - } - - private var windowManager: WindowManager? = null - private var overlayView: View? = null - private var countDownTimer: CountDownTimer? = null - private var currentTripId: String = "" - private var mediaPlayer: MediaPlayer? = null // 🔴 مشغل الصوت - - override fun onBind(intent: Intent?): IBinder? = null - - override fun onCreate() { - super.onCreate() - windowManager = getSystemService(Context.WINDOW_SERVICE) as WindowManager - createNotificationChannel() - } - - override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int { - when (intent?.action) { - ACTION_SHOW -> { - val tripDataJson = intent.getStringExtra(EXTRA_TRIP_DATA) ?: return START_NOT_STICKY - val autoClose = intent.getIntExtra(EXTRA_AUTO_CLOSE_SECONDS, 15) - startForegroundWithNotification() - showTripOverlay(tripDataJson, autoClose) - } - ACTION_HIDE -> dismissOverlay(reason = "programmatic") - } - return START_NOT_STICKY - } - - override fun onDestroy() { - removeOverlayView() - countDownTimer?.cancel() - stopSound() // 🔴 إيقاف الصوت عند التدمير - isRunning = false - super.onDestroy() - } - - // ========================================================== - // 🔴 الصوت والإشعارات 🔴 - // ========================================================== - private fun playSound() { - try { - // استخدام صوت التنبيه الافتراضي القوي في الجهاز - val soundUri = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION) - mediaPlayer = MediaPlayer.create(this, soundUri) - mediaPlayer?.isLooping = true // تكرار الصوت حتى يتخذ السائق قراراً - mediaPlayer?.start() - } catch (e: Exception) { - Log.e(TAG, "Error playing sound: ${e.message}") - } - } - - private fun stopSound() { - try { - mediaPlayer?.takeIf { it.isPlaying }?.stop() - mediaPlayer?.release() - mediaPlayer = null - } catch (e: Exception) { - Log.e(TAG, "Error stopping sound: ${e.message}") - } - } - - private fun createNotificationChannel() { - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { - val channel = - NotificationChannel( - CHANNEL_ID, - "Trip Overlay Service", - NotificationManager.IMPORTANCE_LOW - ) - (getSystemService(NOTIFICATION_SERVICE) as NotificationManager) - .createNotificationChannel(channel) - } - } - - private fun startForegroundWithNotification() { - val notification = - NotificationCompat.Builder(this, CHANNEL_ID) - .setContentTitle("طلب رحلة جديد") - .setContentText("يوجد طلب رحلة في انتظارك") - .setSmallIcon(android.R.drawable.ic_dialog_map) - .setPriority(NotificationCompat.PRIORITY_LOW) - .build() - startForeground(NOTIFICATION_ID, notification) - } - - // ========================================================== - // 🔴 بناء وتصميم النافذة (Premium UI) 🔴 - // ========================================================== - private fun showTripOverlay(tripDataJson: String, autoCloseSeconds: Int) { - removeOverlayView() - - val tripData = - parseTripData(tripDataJson) - ?: run { - stopSelf() - return - } - currentTripId = tripData.tripId - - val view = buildOverlayView(tripData, autoCloseSeconds) - overlayView = view - - val type = - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) - WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY - else @Suppress("DEPRECATION") WindowManager.LayoutParams.TYPE_PHONE - - val params = - WindowManager.LayoutParams( - WindowManager.LayoutParams.MATCH_PARENT, - WindowManager.LayoutParams.WRAP_CONTENT, - type, - WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE or - WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN or - WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON, - PixelFormat.TRANSLUCENT - ) - .apply { - gravity = Gravity.TOP or Gravity.CENTER_HORIZONTAL - val metrics = resources.displayMetrics - y = (metrics.heightPixels * 0.15).toInt() // النزول للأسفل بنسبة 15% - } - - try { - windowManager?.addView(view, params) - isRunning = true - playSound() // 🔴 تشغيل الصوت - startCountdown(autoCloseSeconds) - } catch (e: Exception) { - stopSelf() - } - } - - private fun buildOverlayView(trip: TripInfo, autoCloseSeconds: Int): View { - val ctx = this - - // الخلفية الرئيسية بستايل الكروت الحديثة (حواف دائرية كبيرة) - val card = - FrameLayout(ctx).apply { - background = - GradientDrawable().apply { - cornerRadius = 60f - setColor(Color.WHITE) - setStroke(2, Color.parseColor("#E0E0E0")) // إطار خفيف - } - elevation = 40f - setPadding(0, 0, 0, 0) - layoutParams = - FrameLayout.LayoutParams( - FrameLayout.LayoutParams.MATCH_PARENT, - FrameLayout.LayoutParams.WRAP_CONTENT - ) - .apply { - setMargins(40, 0, 40, 0) // هوامش جانبية - } - } - - val root = LinearLayout(ctx).apply { orientation = LinearLayout.VERTICAL } - card.addView(root) - - // ── 1. صورة الخريطة (Static Map) ── - val mapImageView = - ImageView(ctx).apply { - layoutParams = - LinearLayout.LayoutParams( - LinearLayout.LayoutParams.MATCH_PARENT, - 350 - ) // ارتفاع الخريطة - scaleType = ImageView.ScaleType.CENTER_CROP - setBackgroundColor(Color.parseColor("#F3F4F6")) // لون رمادي فاتح كخلفية بديلة - } - root.addView(mapImageView) - - // 🔴 دالة تحميل الخريطة (شغالة وتحتاج فقط مفتاحك) - loadStaticMap(mapImageView, trip.pickupLat, trip.pickupLng) - - // ── حاوية التفاصيل ── - val detailsContainer = - LinearLayout(ctx).apply { - orientation = LinearLayout.VERTICAL - setPadding(40, 30, 40, 40) - } - root.addView(detailsContainer) - - // ── 2. السعر والمسافة (خط كبير وواضح) ── - val priceRow = - LinearLayout(ctx).apply { - orientation = LinearLayout.HORIZONTAL - gravity = Gravity.CENTER_VERTICAL - } - - val priceText = - TextView(ctx).apply { - text = "${trip.estimatedFare} ل.س" - textSize = 24f - setTextColor(Color.parseColor("#27AE60")) // لون أخضر فخم - typeface = android.graphics.Typeface.DEFAULT_BOLD - layoutParams = - LinearLayout.LayoutParams(0, LinearLayout.LayoutParams.WRAP_CONTENT, 1f) - } - val distanceText = - TextView(ctx).apply { - text = "المسافة: ${trip.distanceKm} كم" - textSize = 14f - setTextColor(Color.parseColor("#7F8C8D")) - typeface = android.graphics.Typeface.DEFAULT_BOLD - } - priceRow.addView(priceText) - priceRow.addView(distanceText) - detailsContainer.addView(priceRow) - - detailsContainer.addView(divider(ctx, 30)) - - // ── 3. المواقع (الانطلاق والوصول) ── - detailsContainer.addView(labeledRow(ctx, "🟢 من:", trip.pickupAddress)) - detailsContainer.addView(labeledRow(ctx, "🔴 إلى:", trip.dropoffAddress)) - detailsContainer.addView(labeledRow(ctx, "👤 الراكب:", trip.passengerName)) - - detailsContainer.addView(divider(ctx, 30)) - - // ── 4. شريط الوقت ── - val countdownLabel = - TextView(ctx).apply { - text = "ينتهي خلال $autoCloseSeconds ثانية" - textSize = 12f - setTextColor(Color.parseColor("#E74C3C")) - gravity = Gravity.CENTER - id = android.R.id.text1 - } - val progressBar = - ProgressBar(ctx, null, android.R.attr.progressBarStyleHorizontal).apply { - max = autoCloseSeconds - progress = autoCloseSeconds - id = android.R.id.progress - progressTintList = - android.content.res.ColorStateList.valueOf(Color.parseColor("#E74C3C")) - layoutParams = - LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, 15) - .apply { - topMargin = 10 - bottomMargin = 30 - } - } - detailsContainer.addView(countdownLabel) - detailsContainer.addView(progressBar) - - // ── 5. الأزرار (تصميم كبسولة فخم) ── - val buttonsRow = LinearLayout(ctx).apply { orientation = LinearLayout.HORIZONTAL } - - val rejectBtn = - Button(ctx).apply { - text = "رفض" - textSize = 16f - setTextColor(Color.parseColor("#E74C3C")) // نص أحمر - background = - GradientDrawable().apply { - cornerRadius = 100f - setColor(Color.parseColor("#FDEDEC")) // خلفية حمراء باهتة فخمة - } - layoutParams = - LinearLayout.LayoutParams(0, LinearLayout.LayoutParams.WRAP_CONTENT, 1f) - .apply { rightMargin = 20 } - setOnClickListener { dismissOverlay(reason = "rejected") } - } - - val acceptBtn = - Button(ctx).apply { - text = "قبول الطلب" - textSize = 16f - setTextColor(Color.WHITE) - background = - GradientDrawable().apply { - cornerRadius = 100f - setColor(Color.parseColor("#27AE60")) // لون أخضر فخم - } - layoutParams = - LinearLayout.LayoutParams( - 0, - LinearLayout.LayoutParams.WRAP_CONTENT, - 1.5f - ) // زر القبول أكبر قليلاً - setOnClickListener { onTripAccepted() } - } - - buttonsRow.addView(rejectBtn) - buttonsRow.addView(acceptBtn) - detailsContainer.addView(buttonsRow) - - card.tag = mapOf("countdownLabel" to countdownLabel, "progressBar" to progressBar) - return card - } - // 🔴 دالة احترافية لقراءة المفتاح المحقون من Gradle 🔴 - private fun getGoogleMapsApiKey(): String { - return try { - // الوصول إلى بيانات التطبيق في الـ Manifest - val appInfo = - packageManager.getApplicationInfo( - packageName, - android.content.pm.PackageManager.GET_META_DATA - ) - val bundle = appInfo.metaData - - // قراءة المفتاح (تأكد أن هذا هو نفس الاسم الموجود في AndroidManifest.xml لديك) - val apiKey = bundle?.getString("com.google.android.geo.API_KEY") - - apiKey ?: "" // إرجاع المفتاح أو نص فارغ إذا لم يجده - } catch (e: Exception) { - Log.e(TAG, "❌ فشل في قراءة مفتاح الخريطة من Manifest: ${e.message}") - "" - } - } - - // ========================================================== - // 🔴 جلب صورة الخريطة (Static Map) 🔴 - // ========================================================== - // ========================================================== - // 🔴 جلب صورة الخريطة (Static Map) 🔴 - // ========================================================== - private fun loadStaticMap(imageView: ImageView, lat: Double, lng: Double) { - if (lat == 0.0 || lng == 0.0) { - Log.e(TAG, "⚠️ الإحداثيات صفر، تم تجاهل تحميل الخريطة") - return - } - - // 🟢 جلب المفتاح بأمان تام من الـ Properties عبر الـ Manifest 🟢 - val apiKey = getGoogleMapsApiKey() - - if (apiKey.isEmpty()) { - Log.e(TAG, "⚠️ مفتاح جوجل ماب غير موجود أو فارغ!") - return - } - - // رابط احترافي: زووم مناسب، وضع خريطة نظيف، ودبوس أخضر بارز - val mapUrl = - "https://maps.googleapis.com/maps/api/staticmap?center=$lat,$lng&zoom=15&size=600x350&maptype=roadmap&markers=color:0x27AE60%7C$lat,$lng&key=$apiKey" - - thread { - try { - val url = URL(mapUrl) - val connection = url.openConnection() as HttpURLConnection - connection.doInput = true - connection.connectTimeout = 5000 // تحديد وقت أقصى للاتصال - connection.readTimeout = 5000 - connection.connect() - - if (connection.responseCode == HttpURLConnection.HTTP_OK) { - val bitmap = BitmapFactory.decodeStream(connection.inputStream) - // عرض الصورة في الواجهة (Main Thread) - Handler(Looper.getMainLooper()).post { imageView.setImageBitmap(bitmap) } - } else { - Log.e(TAG, "❌ خطأ من سيرفر جوجل: ${connection.responseCode}") - } - } catch (e: Exception) { - Log.e(TAG, "❌ فشل الاتصال بخدمة الخرائط: ${e.message}") - } - } - } - - // ========================================================== - // 🔴 أدوات مساعدة للتصميم 🔴 - // ========================================================== - private fun labeledRow(ctx: Context, label: String, value: String): LinearLayout { - return LinearLayout(ctx).apply { - orientation = LinearLayout.HORIZONTAL - setPadding(0, 8, 0, 8) - gravity = Gravity.CENTER_VERTICAL - - addView( - TextView(ctx).apply { - text = label - textSize = 14f - setTextColor(Color.parseColor("#7F8C8D")) - layoutParams = - LinearLayout.LayoutParams( - LinearLayout.LayoutParams.WRAP_CONTENT, - LinearLayout.LayoutParams.WRAP_CONTENT - ) - .apply { rightMargin = 16 } - } - ) - addView( - TextView(ctx).apply { - text = value - textSize = 15f - setTextColor(Color.parseColor("#2C3E50")) - typeface = android.graphics.Typeface.DEFAULT_BOLD - maxLines = 1 - ellipsize = android.text.TextUtils.TruncateAt.END - } - ) - } - } - - private fun statChip(ctx: Context, value: String, label: String): LinearLayout { - return LinearLayout(ctx).apply { - orientation = LinearLayout.VERTICAL - gravity = Gravity.CENTER - layoutParams = LinearLayout.LayoutParams(0, LinearLayout.LayoutParams.WRAP_CONTENT, 1f) - - addView( - TextView(ctx).apply { - text = value - textSize = 16f - setTextColor(Color.parseColor("#2C3E50")) - typeface = android.graphics.Typeface.DEFAULT_BOLD - } - ) - addView( - TextView(ctx).apply { - text = label - textSize = 12f - setTextColor(Color.parseColor("#95A5A6")) - } - ) - } - } - - private fun divider(ctx: Context, margin: Int = 16): View { - return View(ctx).apply { - setBackgroundColor(Color.parseColor("#EEEEEE")) - layoutParams = - LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, 2).apply { - setMargins(0, margin, 0, margin) - } - } - } - - // ========================================================== - // 🔴 التحكم والمؤقت 🔴 - // ========================================================== - private fun startCountdown(totalSeconds: Int) { - countDownTimer?.cancel() - countDownTimer = - object : CountDownTimer(totalSeconds * 1000L, 1000L) { - override fun onTick(millisUntilFinished: Long) { - updateCountdownUI((millisUntilFinished / 1000).toInt()) - } - override fun onFinish() { - dismissOverlay(reason = "timeout") - } - } - .start() - } - - private fun updateCountdownUI(secondsLeft: Int) { - val tagMap = overlayView?.tag as? Map<*, *> ?: return - val label = tagMap["countdownLabel"] as? TextView ?: return - val bar = tagMap["progressBar"] as? ProgressBar ?: return - label.text = "ينتهي خلال $secondsLeft ثانية" - bar.progress = secondsLeft - } - - private fun onTripAccepted() { - stopSound() // 🔴 - TripOverlayPlugin.notifyTripAccepted(currentTripId) - bringAppToForeground() - removeOverlayView() - stopSelf() - } - - private fun dismissOverlay(reason: String) { - stopSound() // 🔴 - countDownTimer?.cancel() - if (reason == "rejected" || reason == "timeout") { - TripOverlayPlugin.notifyTripRejected(currentTripId) - } - removeOverlayView() - stopSelf() - } - - private fun bringAppToForeground() { - val launchIntent = packageManager.getLaunchIntentForPackage(packageName) ?: return - launchIntent.apply { - addFlags( - Intent.FLAG_ACTIVITY_NEW_TASK or - Intent.FLAG_ACTIVITY_REORDER_TO_FRONT or - Intent.FLAG_ACTIVITY_SINGLE_TOP - ) - putExtra("acceptedTripId", currentTripId) - } - startActivity(launchIntent) - } - - private fun removeOverlayView() { - overlayView?.let { windowManager?.removeView(it) } - overlayView = null - isRunning = false - } - - private fun parseTripData(json: String): TripInfo? { - return try { - val obj = JSONObject(json) - TripInfo( - tripId = obj.getString("tripId"), - passengerName = obj.getString("passengerName"), - pickupAddress = obj.getString("pickupAddress"), - dropoffAddress = obj.getString("dropoffAddress"), - distanceKm = obj.getDouble("distanceKm"), - estimatedFare = obj.getDouble("estimatedFare"), - estimatedMinutes = obj.getInt("estimatedMinutes"), - pickupLat = obj.getDouble("pickupLat"), - pickupLng = obj.getDouble("pickupLng") - ) - } catch (e: Exception) { - null - } - } - - data class TripInfo( - val tripId: String, - val passengerName: String, - val pickupAddress: String, - val dropoffAddress: String, - val distanceKm: Double, - val estimatedFare: Double, - val estimatedMinutes: Int, - val pickupLat: Double, - val pickupLng: Double - ) -} diff --git a/apps/driver-archive-cubit/trip_overlay_plugin/android/src/test/kotlin/com/intaleq_driver/trip_overlay_plugin/TripOverlayPluginTest.kt b/apps/driver-archive-cubit/trip_overlay_plugin/android/src/test/kotlin/com/intaleq_driver/trip_overlay_plugin/TripOverlayPluginTest.kt deleted file mode 100644 index fc9f0dc..0000000 --- a/apps/driver-archive-cubit/trip_overlay_plugin/android/src/test/kotlin/com/intaleq_driver/trip_overlay_plugin/TripOverlayPluginTest.kt +++ /dev/null @@ -1,27 +0,0 @@ -package com.intaleq_driver.trip_overlay_plugin - -import io.flutter.plugin.common.MethodCall -import io.flutter.plugin.common.MethodChannel -import org.mockito.Mockito -import kotlin.test.Test - -/* - * This demonstrates a simple unit test of the Kotlin portion of this plugin's implementation. - * - * Once you have built the plugin's example app, you can run these tests from the command - * line by running `./gradlew testDebugUnitTest` in the `example/android/` directory, or - * you can run them directly from IDEs that support JUnit such as Android Studio. - */ - -internal class TripOverlayPluginTest { - @Test - fun onMethodCall_getPlatformVersion_returnsExpectedValue() { - val plugin = TripOverlayPlugin() - - val call = MethodCall("getPlatformVersion", null) - val mockResult: MethodChannel.Result = Mockito.mock(MethodChannel.Result::class.java) - plugin.onMethodCall(call, mockResult) - - Mockito.verify(mockResult).success("Android " + android.os.Build.VERSION.RELEASE) - } -} diff --git a/apps/driver-archive-cubit/trip_overlay_plugin/example/.gitignore b/apps/driver-archive-cubit/trip_overlay_plugin/example/.gitignore deleted file mode 100644 index 3820a95..0000000 --- a/apps/driver-archive-cubit/trip_overlay_plugin/example/.gitignore +++ /dev/null @@ -1,45 +0,0 @@ -# Miscellaneous -*.class -*.log -*.pyc -*.swp -.DS_Store -.atom/ -.build/ -.buildlog/ -.history -.svn/ -.swiftpm/ -migrate_working_dir/ - -# IntelliJ related -*.iml -*.ipr -*.iws -.idea/ - -# The .vscode folder contains launch configuration and tasks you configure in -# VS Code which you may wish to be included in version control, so this line -# is commented out by default. -#.vscode/ - -# Flutter/Dart/Pub related -**/doc/api/ -**/ios/Flutter/.last_build_id -.dart_tool/ -.flutter-plugins-dependencies -.pub-cache/ -.pub/ -/build/ -/coverage/ - -# Symbolication related -app.*.symbols - -# Obfuscation related -app.*.map.json - -# Android Studio will place build artifacts here -/android/app/debug -/android/app/profile -/android/app/release diff --git a/apps/driver-archive-cubit/trip_overlay_plugin/example/README.md b/apps/driver-archive-cubit/trip_overlay_plugin/example/README.md deleted file mode 100644 index 4b44f24..0000000 --- a/apps/driver-archive-cubit/trip_overlay_plugin/example/README.md +++ /dev/null @@ -1,16 +0,0 @@ -# trip_overlay_plugin_example - -Demonstrates how to use the trip_overlay_plugin plugin. - -## Getting Started - -This project is a starting point for a Flutter application. - -A few resources to get you started if this is your first Flutter project: - -- [Lab: Write your first Flutter app](https://docs.flutter.dev/get-started/codelab) -- [Cookbook: Useful Flutter samples](https://docs.flutter.dev/cookbook) - -For help getting started with Flutter development, view the -[online documentation](https://docs.flutter.dev/), which offers tutorials, -samples, guidance on mobile development, and a full API reference. diff --git a/apps/driver-archive-cubit/trip_overlay_plugin/example/analysis_options.yaml b/apps/driver-archive-cubit/trip_overlay_plugin/example/analysis_options.yaml deleted file mode 100644 index 0d29021..0000000 --- a/apps/driver-archive-cubit/trip_overlay_plugin/example/analysis_options.yaml +++ /dev/null @@ -1,28 +0,0 @@ -# This file configures the analyzer, which statically analyzes Dart code to -# check for errors, warnings, and lints. -# -# The issues identified by the analyzer are surfaced in the UI of Dart-enabled -# IDEs (https://dart.dev/tools#ides-and-editors). The analyzer can also be -# invoked from the command line by running `flutter analyze`. - -# The following line activates a set of recommended lints for Flutter apps, -# packages, and plugins designed to encourage good coding practices. -include: package:flutter_lints/flutter.yaml - -linter: - # The lint rules applied to this project can be customized in the - # section below to disable rules from the `package:flutter_lints/flutter.yaml` - # included above or to enable additional rules. A list of all available lints - # and their documentation is published at https://dart.dev/lints. - # - # Instead of disabling a lint rule for the entire project in the - # section below, it can also be suppressed for a single line of code - # or a specific dart file by using the `// ignore: name_of_lint` and - # `// ignore_for_file: name_of_lint` syntax on the line or in the file - # producing the lint. - rules: - # avoid_print: false # Uncomment to disable the `avoid_print` rule - # prefer_single_quotes: true # Uncomment to enable the `prefer_single_quotes` rule - -# Additional information about this file can be found at -# https://dart.dev/guides/language/analysis-options diff --git a/apps/driver-archive-cubit/trip_overlay_plugin/example/android/.gitignore b/apps/driver-archive-cubit/trip_overlay_plugin/example/android/.gitignore deleted file mode 100644 index be3943c..0000000 --- a/apps/driver-archive-cubit/trip_overlay_plugin/example/android/.gitignore +++ /dev/null @@ -1,14 +0,0 @@ -gradle-wrapper.jar -/.gradle -/captures/ -/gradlew -/gradlew.bat -/local.properties -GeneratedPluginRegistrant.java -.cxx/ - -# Remember to never publicly share your keystore. -# See https://flutter.dev/to/reference-keystore -key.properties -**/*.keystore -**/*.jks diff --git a/apps/driver-archive-cubit/trip_overlay_plugin/example/android/app/build.gradle.kts b/apps/driver-archive-cubit/trip_overlay_plugin/example/android/app/build.gradle.kts deleted file mode 100644 index 0b353f7..0000000 --- a/apps/driver-archive-cubit/trip_overlay_plugin/example/android/app/build.gradle.kts +++ /dev/null @@ -1,44 +0,0 @@ -plugins { - id("com.android.application") - id("kotlin-android") - // The Flutter Gradle Plugin must be applied after the Android and Kotlin Gradle plugins. - id("dev.flutter.flutter-gradle-plugin") -} - -android { - namespace = "com.intaleq_driver.trip_overlay_plugin_example" - compileSdk = flutter.compileSdkVersion - ndkVersion = flutter.ndkVersion - - compileOptions { - sourceCompatibility = JavaVersion.VERSION_17 - targetCompatibility = JavaVersion.VERSION_17 - } - - kotlinOptions { - jvmTarget = JavaVersion.VERSION_17.toString() - } - - defaultConfig { - // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). - applicationId = "com.intaleq_driver.trip_overlay_plugin_example" - // You can update the following values to match your application needs. - // For more information, see: https://flutter.dev/to/review-gradle-config. - minSdk = flutter.minSdkVersion - targetSdk = flutter.targetSdkVersion - versionCode = flutter.versionCode - versionName = flutter.versionName - } - - 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("debug") - } - } -} - -flutter { - source = "../.." -} diff --git a/apps/driver-archive-cubit/trip_overlay_plugin/example/android/app/src/debug/AndroidManifest.xml b/apps/driver-archive-cubit/trip_overlay_plugin/example/android/app/src/debug/AndroidManifest.xml deleted file mode 100644 index 399f698..0000000 --- a/apps/driver-archive-cubit/trip_overlay_plugin/example/android/app/src/debug/AndroidManifest.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - diff --git a/apps/driver-archive-cubit/trip_overlay_plugin/example/android/app/src/main/AndroidManifest.xml b/apps/driver-archive-cubit/trip_overlay_plugin/example/android/app/src/main/AndroidManifest.xml deleted file mode 100644 index 023b46c..0000000 --- a/apps/driver-archive-cubit/trip_overlay_plugin/example/android/app/src/main/AndroidManifest.xml +++ /dev/null @@ -1,45 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - diff --git a/apps/driver-archive-cubit/trip_overlay_plugin/example/android/app/src/main/kotlin/com/intaleq_driver/trip_overlay_plugin_example/MainActivity.kt b/apps/driver-archive-cubit/trip_overlay_plugin/example/android/app/src/main/kotlin/com/intaleq_driver/trip_overlay_plugin_example/MainActivity.kt deleted file mode 100644 index a2333ca..0000000 --- a/apps/driver-archive-cubit/trip_overlay_plugin/example/android/app/src/main/kotlin/com/intaleq_driver/trip_overlay_plugin_example/MainActivity.kt +++ /dev/null @@ -1,5 +0,0 @@ -package com.intaleq_driver.trip_overlay_plugin_example - -import io.flutter.embedding.android.FlutterActivity - -class MainActivity : FlutterActivity() diff --git a/apps/driver-archive-cubit/trip_overlay_plugin/example/android/app/src/main/res/drawable-v21/launch_background.xml b/apps/driver-archive-cubit/trip_overlay_plugin/example/android/app/src/main/res/drawable-v21/launch_background.xml deleted file mode 100644 index f74085f..0000000 --- a/apps/driver-archive-cubit/trip_overlay_plugin/example/android/app/src/main/res/drawable-v21/launch_background.xml +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - - - diff --git a/apps/driver-archive-cubit/trip_overlay_plugin/example/android/app/src/main/res/drawable/launch_background.xml b/apps/driver-archive-cubit/trip_overlay_plugin/example/android/app/src/main/res/drawable/launch_background.xml deleted file mode 100644 index 304732f..0000000 --- a/apps/driver-archive-cubit/trip_overlay_plugin/example/android/app/src/main/res/drawable/launch_background.xml +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - - - diff --git a/apps/driver-archive-cubit/trip_overlay_plugin/example/android/app/src/main/res/mipmap-hdpi/ic_launcher.png b/apps/driver-archive-cubit/trip_overlay_plugin/example/android/app/src/main/res/mipmap-hdpi/ic_launcher.png deleted file mode 100644 index db77bb4..0000000 Binary files a/apps/driver-archive-cubit/trip_overlay_plugin/example/android/app/src/main/res/mipmap-hdpi/ic_launcher.png and /dev/null differ diff --git a/apps/driver-archive-cubit/trip_overlay_plugin/example/android/app/src/main/res/mipmap-mdpi/ic_launcher.png b/apps/driver-archive-cubit/trip_overlay_plugin/example/android/app/src/main/res/mipmap-mdpi/ic_launcher.png deleted file mode 100644 index 17987b7..0000000 Binary files a/apps/driver-archive-cubit/trip_overlay_plugin/example/android/app/src/main/res/mipmap-mdpi/ic_launcher.png and /dev/null differ diff --git a/apps/driver-archive-cubit/trip_overlay_plugin/example/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png b/apps/driver-archive-cubit/trip_overlay_plugin/example/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png deleted file mode 100644 index 09d4391..0000000 Binary files a/apps/driver-archive-cubit/trip_overlay_plugin/example/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png and /dev/null differ diff --git a/apps/driver-archive-cubit/trip_overlay_plugin/example/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png b/apps/driver-archive-cubit/trip_overlay_plugin/example/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png deleted file mode 100644 index d5f1c8d..0000000 Binary files a/apps/driver-archive-cubit/trip_overlay_plugin/example/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png and /dev/null differ diff --git a/apps/driver-archive-cubit/trip_overlay_plugin/example/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png b/apps/driver-archive-cubit/trip_overlay_plugin/example/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png deleted file mode 100644 index 4d6372e..0000000 Binary files a/apps/driver-archive-cubit/trip_overlay_plugin/example/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png and /dev/null differ diff --git a/apps/driver-archive-cubit/trip_overlay_plugin/example/android/app/src/main/res/values-night/styles.xml b/apps/driver-archive-cubit/trip_overlay_plugin/example/android/app/src/main/res/values-night/styles.xml deleted file mode 100644 index 06952be..0000000 --- a/apps/driver-archive-cubit/trip_overlay_plugin/example/android/app/src/main/res/values-night/styles.xml +++ /dev/null @@ -1,18 +0,0 @@ - - - - - - - diff --git a/apps/driver-archive-cubit/trip_overlay_plugin/example/android/app/src/main/res/values/styles.xml b/apps/driver-archive-cubit/trip_overlay_plugin/example/android/app/src/main/res/values/styles.xml deleted file mode 100644 index cb1ef88..0000000 --- a/apps/driver-archive-cubit/trip_overlay_plugin/example/android/app/src/main/res/values/styles.xml +++ /dev/null @@ -1,18 +0,0 @@ - - - - - - - diff --git a/apps/driver-archive-cubit/trip_overlay_plugin/example/android/app/src/profile/AndroidManifest.xml b/apps/driver-archive-cubit/trip_overlay_plugin/example/android/app/src/profile/AndroidManifest.xml deleted file mode 100644 index 399f698..0000000 --- a/apps/driver-archive-cubit/trip_overlay_plugin/example/android/app/src/profile/AndroidManifest.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - diff --git a/apps/driver-archive-cubit/trip_overlay_plugin/example/android/build.gradle.kts b/apps/driver-archive-cubit/trip_overlay_plugin/example/android/build.gradle.kts deleted file mode 100644 index dbee657..0000000 --- a/apps/driver-archive-cubit/trip_overlay_plugin/example/android/build.gradle.kts +++ /dev/null @@ -1,24 +0,0 @@ -allprojects { - repositories { - google() - mavenCentral() - } -} - -val newBuildDir: Directory = - rootProject.layout.buildDirectory - .dir("../../build") - .get() -rootProject.layout.buildDirectory.value(newBuildDir) - -subprojects { - val newSubprojectBuildDir: Directory = newBuildDir.dir(project.name) - project.layout.buildDirectory.value(newSubprojectBuildDir) -} -subprojects { - project.evaluationDependsOn(":app") -} - -tasks.register("clean") { - delete(rootProject.layout.buildDirectory) -} diff --git a/apps/driver-archive-cubit/trip_overlay_plugin/example/android/gradle.properties b/apps/driver-archive-cubit/trip_overlay_plugin/example/android/gradle.properties deleted file mode 100644 index fbee1d8..0000000 --- a/apps/driver-archive-cubit/trip_overlay_plugin/example/android/gradle.properties +++ /dev/null @@ -1,2 +0,0 @@ -org.gradle.jvmargs=-Xmx8G -XX:MaxMetaspaceSize=4G -XX:ReservedCodeCacheSize=512m -XX:+HeapDumpOnOutOfMemoryError -android.useAndroidX=true diff --git a/apps/driver-archive-cubit/trip_overlay_plugin/example/android/gradle/wrapper/gradle-wrapper.properties b/apps/driver-archive-cubit/trip_overlay_plugin/example/android/gradle/wrapper/gradle-wrapper.properties deleted file mode 100644 index e4ef43f..0000000 --- a/apps/driver-archive-cubit/trip_overlay_plugin/example/android/gradle/wrapper/gradle-wrapper.properties +++ /dev/null @@ -1,5 +0,0 @@ -distributionBase=GRADLE_USER_HOME -distributionPath=wrapper/dists -zipStoreBase=GRADLE_USER_HOME -zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.14-all.zip diff --git a/apps/driver-archive-cubit/trip_overlay_plugin/example/android/settings.gradle.kts b/apps/driver-archive-cubit/trip_overlay_plugin/example/android/settings.gradle.kts deleted file mode 100644 index ca7fe06..0000000 --- a/apps/driver-archive-cubit/trip_overlay_plugin/example/android/settings.gradle.kts +++ /dev/null @@ -1,26 +0,0 @@ -pluginManagement { - val flutterSdkPath = - run { - val properties = java.util.Properties() - file("local.properties").inputStream().use { properties.load(it) } - val flutterSdkPath = properties.getProperty("flutter.sdk") - require(flutterSdkPath != null) { "flutter.sdk not set in local.properties" } - flutterSdkPath - } - - includeBuild("$flutterSdkPath/packages/flutter_tools/gradle") - - repositories { - google() - mavenCentral() - gradlePluginPortal() - } -} - -plugins { - id("dev.flutter.flutter-plugin-loader") version "1.0.0" - id("com.android.application") version "8.11.1" apply false - id("org.jetbrains.kotlin.android") version "2.2.20" apply false -} - -include(":app") diff --git a/apps/driver-archive-cubit/trip_overlay_plugin/example/integration_test/plugin_integration_test.dart b/apps/driver-archive-cubit/trip_overlay_plugin/example/integration_test/plugin_integration_test.dart deleted file mode 100644 index fd7d953..0000000 --- a/apps/driver-archive-cubit/trip_overlay_plugin/example/integration_test/plugin_integration_test.dart +++ /dev/null @@ -1,24 +0,0 @@ -// This is a basic Flutter integration test. -// -// Since integration tests run in a full Flutter application, they can interact -// with the host side of a plugin implementation, unlike Dart unit tests. -// -// For more information about Flutter integration tests, please see -// https://flutter.dev/to/integration-testing - - -import 'package:flutter_test/flutter_test.dart'; -import 'package:integration_test/integration_test.dart'; - -// import 'package:trip_overlay_plugin/trip_overlay_plugin.dart'; - -void main() { - IntegrationTestWidgetsFlutterBinding.ensureInitialized(); - - testWidgets('Placeholder integration test', (WidgetTester tester) async { - // Testing the overlay directly in integration tests can be tricky because - // it requires accepting the SYSTEM_ALERT_WINDOW permission on Android. - // This is a placeholder test. - expect(true, isTrue); - }); -} diff --git a/apps/driver-archive-cubit/trip_overlay_plugin/example/lib/main.dart b/apps/driver-archive-cubit/trip_overlay_plugin/example/lib/main.dart deleted file mode 100644 index 0f410e4..0000000 --- a/apps/driver-archive-cubit/trip_overlay_plugin/example/lib/main.dart +++ /dev/null @@ -1,98 +0,0 @@ -import 'package:flutter/material.dart'; -import 'package:trip_overlay_plugin/trip_overlay_plugin.dart'; - -void main() { - WidgetsFlutterBinding.ensureInitialized(); - TripOverlayPlugin.initialize(); - runApp(const MyApp()); -} - -class MyApp extends StatefulWidget { - const MyApp({super.key}); - - @override - State createState() => _MyAppState(); -} - -class _MyAppState extends State { - bool _isOverlayActive = false; - - @override - void initState() { - super.initState(); - // Listen to overlay events - TripOverlayPlugin.onTripAccepted.listen((result) { - debugPrint('Trip accepted: ${result.tripId}'); - }); - TripOverlayPlugin.onTripRejected.listen((tripId) { - debugPrint('Trip rejected/expired: $tripId'); - }); - } - - @override - void dispose() { - TripOverlayPlugin.dispose(); - super.dispose(); - } - - Future _showOverlay() async { - final granted = await TripOverlayPlugin.isPermissionGranted(); - if (!granted) { - await TripOverlayPlugin.requestPermission(); - return; - } - - final tripData = TripData( - tripId: 'TRIP_12345', - passengerName: 'Hamza A.', - pickupAddress: 'Amman, Jordan', - dropoffAddress: 'Irbid, Jordan', - distanceKm: 85.0, - estimatedFare: 25.0, - estimatedMinutes: 90, - pickupLat: 31.9539, - pickupLng: 35.9106, - ); - - final result = await TripOverlayPlugin.showOverlay(tripData); - setState(() { - _isOverlayActive = result; - }); - } - - Future _hideOverlay() async { - await TripOverlayPlugin.hideOverlay(); - setState(() { - _isOverlayActive = false; - }); - } - - @override - Widget build(BuildContext context) { - return MaterialApp( - home: Scaffold( - appBar: AppBar( - title: const Text('Trip Overlay Example'), - ), - body: Center( - child: Column( - mainAxisAlignment: MainAxisAlignment.center, - children: [ - Text('Overlay Active: $_isOverlayActive'), - const SizedBox(height: 20), - ElevatedButton( - onPressed: _showOverlay, - child: const Text('Show Overlay'), - ), - const SizedBox(height: 10), - ElevatedButton( - onPressed: _hideOverlay, - child: const Text('Hide Overlay'), - ), - ], - ), - ), - ), - ); - } -} diff --git a/apps/driver-archive-cubit/trip_overlay_plugin/example/pubspec.lock b/apps/driver-archive-cubit/trip_overlay_plugin/example/pubspec.lock deleted file mode 100644 index 9a39050..0000000 --- a/apps/driver-archive-cubit/trip_overlay_plugin/example/pubspec.lock +++ /dev/null @@ -1,283 +0,0 @@ -# Generated by pub -# See https://dart.dev/tools/pub/glossary#lockfile -packages: - async: - dependency: transitive - description: - name: async - sha256: e2eb0491ba5ddb6177742d2da23904574082139b07c1e33b8503b9f46f3e1a37 - url: "https://pub.dev" - source: hosted - version: "2.13.1" - boolean_selector: - dependency: transitive - description: - name: boolean_selector - sha256: "8aab1771e1243a5063b8b0ff68042d67334e3feab9e95b9490f9a6ebf73b42ea" - url: "https://pub.dev" - source: hosted - version: "2.1.2" - characters: - dependency: transitive - description: - name: characters - sha256: faf38497bda5ead2a8c7615f4f7939df04333478bf32e4173fcb06d428b5716b - url: "https://pub.dev" - source: hosted - version: "1.4.1" - clock: - dependency: transitive - description: - name: clock - sha256: fddb70d9b5277016c77a80201021d40a2247104d9f4aa7bab7157b7e3f05b84b - url: "https://pub.dev" - source: hosted - version: "1.1.2" - collection: - dependency: transitive - description: - name: collection - sha256: "2f5709ae4d3d59dd8f7cd309b4e023046b57d8a6c82130785d2b0e5868084e76" - url: "https://pub.dev" - source: hosted - version: "1.19.1" - cupertino_icons: - dependency: "direct main" - description: - name: cupertino_icons - sha256: "41e005c33bd814be4d3096aff55b1908d419fde52ca656c8c47719ec745873cd" - url: "https://pub.dev" - source: hosted - version: "1.0.9" - fake_async: - dependency: transitive - description: - name: fake_async - sha256: "5368f224a74523e8d2e7399ea1638b37aecfca824a3cc4dfdf77bf1fa905ac44" - url: "https://pub.dev" - source: hosted - version: "1.3.3" - file: - dependency: transitive - description: - name: file - sha256: a3b4f84adafef897088c160faf7dfffb7696046cb13ae90b508c2cbc95d3b8d4 - url: "https://pub.dev" - source: hosted - version: "7.0.1" - flutter: - dependency: "direct main" - description: flutter - source: sdk - version: "0.0.0" - flutter_driver: - dependency: transitive - description: flutter - source: sdk - version: "0.0.0" - flutter_lints: - dependency: "direct dev" - description: - name: flutter_lints - sha256: "3105dc8492f6183fb076ccf1f351ac3d60564bff92e20bfc4af9cc1651f4e7e1" - url: "https://pub.dev" - source: hosted - version: "6.0.0" - flutter_test: - dependency: "direct dev" - description: flutter - source: sdk - version: "0.0.0" - fuchsia_remote_debug_protocol: - dependency: transitive - description: flutter - source: sdk - version: "0.0.0" - integration_test: - dependency: "direct dev" - description: flutter - source: sdk - version: "0.0.0" - leak_tracker: - dependency: transitive - description: - name: leak_tracker - sha256: "33e2e26bdd85a0112ec15400c8cbffea70d0f9c3407491f672a2fad47915e2de" - url: "https://pub.dev" - source: hosted - version: "11.0.2" - leak_tracker_flutter_testing: - dependency: transitive - description: - name: leak_tracker_flutter_testing - sha256: "1dbc140bb5a23c75ea9c4811222756104fbcd1a27173f0c34ca01e16bea473c1" - url: "https://pub.dev" - source: hosted - version: "3.0.10" - leak_tracker_testing: - dependency: transitive - description: - name: leak_tracker_testing - sha256: "8d5a2d49f4a66b49744b23b018848400d23e54caf9463f4eb20df3eb8acb2eb1" - url: "https://pub.dev" - source: hosted - version: "3.0.2" - lints: - dependency: transitive - description: - name: lints - sha256: "12f842a479589fea194fe5c5a3095abc7be0c1f2ddfa9a0e76aed1dbd26a87df" - url: "https://pub.dev" - source: hosted - version: "6.1.0" - matcher: - dependency: transitive - description: - name: matcher - sha256: dc0b7dc7651697ea4ff3e69ef44b0407ea32c487a39fff6a4004fa585e901861 - url: "https://pub.dev" - source: hosted - version: "0.12.19" - material_color_utilities: - dependency: transitive - description: - name: material_color_utilities - sha256: "9c337007e82b1889149c82ed242ed1cb24a66044e30979c44912381e9be4c48b" - url: "https://pub.dev" - source: hosted - version: "0.13.0" - meta: - dependency: transitive - description: - name: meta - sha256: "1741988757a65eb6b36abe716829688cf01910bbf91c34354ff7ec1c3de2b349" - url: "https://pub.dev" - source: hosted - version: "1.18.0" - path: - dependency: transitive - description: - name: path - sha256: "75cca69d1490965be98c73ceaea117e8a04dd21217b37b292c9ddbec0d955bc5" - url: "https://pub.dev" - source: hosted - version: "1.9.1" - platform: - dependency: transitive - description: - name: platform - sha256: "5d6b1b0036a5f331ebc77c850ebc8506cbc1e9416c27e59b439f917a902a4984" - url: "https://pub.dev" - source: hosted - version: "3.1.6" - plugin_platform_interface: - dependency: transitive - description: - name: plugin_platform_interface - sha256: "4820fbfdb9478b1ebae27888254d445073732dae3d6ea81f0b7e06d5dedc3f02" - url: "https://pub.dev" - source: hosted - version: "2.1.8" - process: - dependency: transitive - description: - name: process - sha256: c6248e4526673988586e8c00bb22a49210c258dc91df5227d5da9748ecf79744 - url: "https://pub.dev" - source: hosted - version: "5.0.5" - sky_engine: - dependency: transitive - description: flutter - source: sdk - version: "0.0.0" - source_span: - dependency: transitive - description: - name: source_span - sha256: "56a02f1f4cd1a2d96303c0144c93bd6d909eea6bee6bf5a0e0b685edbd4c47ab" - url: "https://pub.dev" - source: hosted - version: "1.10.2" - stack_trace: - dependency: transitive - description: - name: stack_trace - sha256: "8b27215b45d22309b5cddda1aa2b19bdfec9df0e765f2de506401c071d38d1b1" - url: "https://pub.dev" - source: hosted - version: "1.12.1" - stream_channel: - dependency: transitive - description: - name: stream_channel - sha256: "969e04c80b8bcdf826f8f16579c7b14d780458bd97f56d107d3950fdbeef059d" - url: "https://pub.dev" - source: hosted - version: "2.1.4" - string_scanner: - dependency: transitive - description: - name: string_scanner - sha256: "921cd31725b72fe181906c6a94d987c78e3b98c2e205b397ea399d4054872b43" - url: "https://pub.dev" - source: hosted - version: "1.4.1" - sync_http: - dependency: transitive - description: - name: sync_http - sha256: "7f0cd72eca000d2e026bcd6f990b81d0ca06022ef4e32fb257b30d3d1014a961" - url: "https://pub.dev" - source: hosted - version: "0.3.1" - term_glyph: - dependency: transitive - description: - name: term_glyph - sha256: "7f554798625ea768a7518313e58f83891c7f5024f88e46e7182a4558850a4b8e" - url: "https://pub.dev" - source: hosted - version: "1.2.2" - test_api: - dependency: transitive - description: - name: test_api - sha256: "949a932224383300f01be9221c39180316445ecb8e7547f70a41a35bf421fb9e" - url: "https://pub.dev" - source: hosted - version: "0.7.11" - trip_overlay_plugin: - dependency: "direct main" - description: - path: ".." - relative: true - source: path - version: "0.0.1" - vector_math: - dependency: transitive - description: - name: vector_math - sha256: d530bd74fea330e6e364cda7a85019c434070188383e1cd8d9777ee586914c5b - url: "https://pub.dev" - source: hosted - version: "2.2.0" - vm_service: - dependency: transitive - description: - name: vm_service - sha256: "0016aef94fc66495ac78af5859181e3f3bf2026bd8eecc72b9565601e19ab360" - url: "https://pub.dev" - source: hosted - version: "15.2.0" - webdriver: - dependency: transitive - description: - name: webdriver - sha256: "2f3a14ca026957870cfd9c635b83507e0e51d8091568e90129fbf805aba7cade" - url: "https://pub.dev" - source: hosted - version: "3.1.0" -sdks: - dart: ">=3.10.8 <4.0.0" - flutter: ">=3.18.0-18.0.pre.54" diff --git a/apps/driver-archive-cubit/trip_overlay_plugin/example/pubspec.yaml b/apps/driver-archive-cubit/trip_overlay_plugin/example/pubspec.yaml deleted file mode 100644 index 428e812..0000000 --- a/apps/driver-archive-cubit/trip_overlay_plugin/example/pubspec.yaml +++ /dev/null @@ -1,85 +0,0 @@ -name: trip_overlay_plugin_example -description: "Demonstrates how to use the trip_overlay_plugin plugin." -# The following line prevents the package from being accidentally published to -# pub.dev using `flutter pub publish`. This is preferred for private packages. -publish_to: 'none' # Remove this line if you wish to publish to pub.dev - -environment: - sdk: ^3.10.8 - -# Dependencies specify other packages that your package needs in order to work. -# To automatically upgrade your package dependencies to the latest versions -# consider running `flutter pub upgrade --major-versions`. Alternatively, -# dependencies can be manually updated by changing the version numbers below to -# the latest version available on pub.dev. To see which dependencies have newer -# versions available, run `flutter pub outdated`. -dependencies: - flutter: - sdk: flutter - - trip_overlay_plugin: - # When depending on this package from a real application you should use: - # trip_overlay_plugin: ^x.y.z - # See https://dart.dev/tools/pub/dependencies#version-constraints - # The example app is bundled with the plugin so we use a path dependency on - # the parent directory to use the current plugin's version. - path: ../ - - # The following adds the Cupertino Icons font to your application. - # Use with the CupertinoIcons class for iOS style icons. - cupertino_icons: ^1.0.8 - -dev_dependencies: - integration_test: - sdk: flutter - flutter_test: - sdk: flutter - - # The "flutter_lints" package below contains a set of recommended lints to - # encourage good coding practices. The lint set provided by the package is - # activated in the `analysis_options.yaml` file located at the root of your - # package. See that file for information about deactivating specific lint - # rules and activating additional ones. - flutter_lints: ^6.0.0 - -# For information on the generic Dart part of this file, see the -# following page: https://dart.dev/tools/pub/pubspec - -# The following section is specific to Flutter packages. -flutter: - - # The following line ensures that the Material Icons font is - # included with your application, so that you can use the icons in - # the material Icons class. - uses-material-design: true - - # To add assets to your application, add an assets section, like this: - # assets: - # - images/a_dot_burr.jpeg - # - images/a_dot_ham.jpeg - - # An image asset can refer to one or more resolution-specific "variants", see - # https://flutter.dev/to/resolution-aware-images - - # For details regarding adding assets from package dependencies, see - # https://flutter.dev/to/asset-from-package - - # To add custom fonts to your application, add a fonts section here, - # in this "flutter" section. Each entry in this list should have a - # "family" key with the font family name, and a "fonts" key with a - # list giving the asset and other descriptors for the font. For - # example: - # fonts: - # - family: Schyler - # fonts: - # - asset: fonts/Schyler-Regular.ttf - # - asset: fonts/Schyler-Italic.ttf - # style: italic - # - family: Trajan Pro - # fonts: - # - asset: fonts/TrajanPro.ttf - # - asset: fonts/TrajanPro_Bold.ttf - # weight: 700 - # - # For details regarding fonts from package dependencies, - # see https://flutter.dev/to/font-from-package diff --git a/apps/driver-archive-cubit/trip_overlay_plugin/example/test/widget_test.dart b/apps/driver-archive-cubit/trip_overlay_plugin/example/test/widget_test.dart deleted file mode 100644 index 2d0e0e7..0000000 --- a/apps/driver-archive-cubit/trip_overlay_plugin/example/test/widget_test.dart +++ /dev/null @@ -1,27 +0,0 @@ -// This is a basic Flutter widget test. -// -// To perform an interaction with a widget in your test, use the WidgetTester -// utility in the flutter_test package. For example, you can send tap and scroll -// gestures. You can also use WidgetTester to find child widgets in the widget -// tree, read text, and verify that the values of widget properties are correct. - -import 'package:flutter/material.dart'; -import 'package:flutter_test/flutter_test.dart'; - -import 'package:trip_overlay_plugin_example/main.dart'; - -void main() { - testWidgets('Verify Platform version', (WidgetTester tester) async { - // Build our app and trigger a frame. - await tester.pumpWidget(const MyApp()); - - // Verify that platform version is retrieved. - expect( - find.byWidgetPredicate( - (Widget widget) => widget is Text && - widget.data!.startsWith('Running on:'), - ), - findsOneWidget, - ); - }); -} diff --git a/apps/driver-archive-cubit/trip_overlay_plugin/lib/trip_overlay_plugin.dart b/apps/driver-archive-cubit/trip_overlay_plugin/lib/trip_overlay_plugin.dart deleted file mode 100644 index db99150..0000000 --- a/apps/driver-archive-cubit/trip_overlay_plugin/lib/trip_overlay_plugin.dart +++ /dev/null @@ -1,168 +0,0 @@ -import 'dart:async'; -import 'dart:convert'; -import 'package:flutter/services.dart'; - -/// Model for trip data passed to the overlay -class TripData { - final String tripId; - final String passengerName; - final String pickupAddress; - final String dropoffAddress; - final double distanceKm; - final double estimatedFare; - final int estimatedMinutes; - final double pickupLat; - final double pickupLng; - final String? passengerAvatarUrl; - - TripData({ - required this.tripId, - required this.passengerName, - required this.pickupAddress, - required this.dropoffAddress, - required this.distanceKm, - required this.estimatedFare, - required this.estimatedMinutes, - required this.pickupLat, - required this.pickupLng, - this.passengerAvatarUrl, - }); - - Map toMap() => { - 'tripId': tripId, - 'passengerName': passengerName, - 'pickupAddress': pickupAddress, - 'dropoffAddress': dropoffAddress, - 'distanceKm': distanceKm, - 'estimatedFare': estimatedFare, - 'estimatedMinutes': estimatedMinutes, - 'pickupLat': pickupLat, - 'pickupLng': pickupLng, - 'passengerAvatarUrl': passengerAvatarUrl ?? '', - }; - - factory TripData.fromMap(Map map) => TripData( - tripId: map['tripId'] ?? '', - passengerName: map['passengerName'] ?? '', - pickupAddress: map['pickupAddress'] ?? '', - dropoffAddress: map['dropoffAddress'] ?? '', - distanceKm: (map['distanceKm'] ?? 0.0).toDouble(), - estimatedFare: (map['estimatedFare'] ?? 0.0).toDouble(), - estimatedMinutes: map['estimatedMinutes'] ?? 0, - pickupLat: (map['pickupLat'] ?? 0.0).toDouble(), - pickupLng: (map['pickupLng'] ?? 0.0).toDouble(), - passengerAvatarUrl: map['passengerAvatarUrl'], - ); - - factory TripData.fromJson(String json) => - TripData.fromMap(jsonDecode(json) as Map); - - String toJson() => jsonEncode(toMap()); -} - -/// Result returned when the driver accepts a trip -class TripAcceptedResult { - final String tripId; - final DateTime acceptedAt; - - TripAcceptedResult({required this.tripId, required this.acceptedAt}); -} - -/// Main plugin class — single entry point for Flutter side -class TripOverlayPlugin { - static const MethodChannel _channel = MethodChannel('trip_overlay_plugin'); - - // Stream controller for trip accepted events coming FROM Android overlay - static final StreamController _tripAcceptedController = - StreamController.broadcast(); - - // Stream controller for trip rejected/expired events - static final StreamController _tripRejectedController = - StreamController.broadcast(); - - static bool _isInitialized = false; - - /// Stream that fires when the driver taps "Accept" in the overlay - static Stream get onTripAccepted => - _tripAcceptedController.stream; - - /// Stream that fires when the driver rejects or overlay times out - static Stream get onTripRejected => _tripRejectedController.stream; - - /// Initialize the plugin — call this once in main() or initState() - static Future initialize() async { - if (_isInitialized) return; - _channel.setMethodCallHandler(_handleMethodCall); - _isInitialized = true; - } - - /// Handle incoming calls FROM Android → Flutter - static Future _handleMethodCall(MethodCall call) async { - switch (call.method) { - case 'onTripAccepted': - final tripId = call.arguments['tripId'] as String; - _tripAcceptedController.add( - TripAcceptedResult(tripId: tripId, acceptedAt: DateTime.now()), - ); - break; - - case 'onTripRejected': - final tripId = call.arguments['tripId'] as String; - _tripRejectedController.add(tripId); - break; - - default: - throw PlatformException( - code: 'UNKNOWN_METHOD', - message: 'Method ${call.method} not implemented', - ); - } - } - - /// Check if SYSTEM_ALERT_WINDOW permission is granted - static Future isPermissionGranted() async { - final result = await _channel.invokeMethod('isPermissionGranted'); - return result ?? false; - } - - /// Open system settings to grant SYSTEM_ALERT_WINDOW permission - static Future requestPermission() async { - await _channel.invokeMethod('requestPermission'); - } - - /// Show the trip overlay with the given [tripData] - /// [autoCloseSeconds] — how long before auto-dismiss (default 30s) - static Future showOverlay( - TripData tripData, { - int autoCloseSeconds = 30, - }) async { - final granted = await isPermissionGranted(); - if (!granted) { - await requestPermission(); - return false; - } - - final result = await _channel.invokeMethod('showOverlay', { - 'tripData': tripData.toJson(), - 'autoCloseSeconds': autoCloseSeconds, - }); - return result ?? false; - } - - /// Programmatically close the overlay (e.g. if trip was cancelled) - static Future hideOverlay() async { - await _channel.invokeMethod('hideOverlay'); - } - - /// Check if the overlay is currently visible - static Future isOverlayActive() async { - final result = await _channel.invokeMethod('isOverlayActive'); - return result ?? false; - } - - /// Dispose streams — call in app's dispose() - static void dispose() { - _tripAcceptedController.close(); - _tripRejectedController.close(); - } -} diff --git a/apps/driver-archive-cubit/trip_overlay_plugin/lib/trip_overlay_plugin_method_channel.dart b/apps/driver-archive-cubit/trip_overlay_plugin/lib/trip_overlay_plugin_method_channel.dart deleted file mode 100644 index 4db3a40..0000000 --- a/apps/driver-archive-cubit/trip_overlay_plugin/lib/trip_overlay_plugin_method_channel.dart +++ /dev/null @@ -1,12 +0,0 @@ -import 'package:flutter/foundation.dart'; -import 'package:flutter/services.dart'; - -import 'trip_overlay_plugin_platform_interface.dart'; - -/// An implementation of [TripOverlayPluginPlatform] that uses method channels. -class MethodChannelTripOverlayPlugin extends TripOverlayPluginPlatform { - /// The method channel used to interact with the native platform. - @visibleForTesting - final methodChannel = const MethodChannel('trip_overlay_plugin'); - -} diff --git a/apps/driver-archive-cubit/trip_overlay_plugin/lib/trip_overlay_plugin_platform_interface.dart b/apps/driver-archive-cubit/trip_overlay_plugin/lib/trip_overlay_plugin_platform_interface.dart deleted file mode 100644 index 4473bfa..0000000 --- a/apps/driver-archive-cubit/trip_overlay_plugin/lib/trip_overlay_plugin_platform_interface.dart +++ /dev/null @@ -1,26 +0,0 @@ -import 'package:plugin_platform_interface/plugin_platform_interface.dart'; - -import 'trip_overlay_plugin_method_channel.dart'; - -abstract class TripOverlayPluginPlatform extends PlatformInterface { - /// Constructs a TripOverlayPluginPlatform. - TripOverlayPluginPlatform() : super(token: _token); - - static final Object _token = Object(); - - static TripOverlayPluginPlatform _instance = MethodChannelTripOverlayPlugin(); - - /// The default instance of [TripOverlayPluginPlatform] to use. - /// - /// Defaults to [MethodChannelTripOverlayPlugin]. - static TripOverlayPluginPlatform get instance => _instance; - - /// Platform-specific implementations should set this with their own - /// platform-specific class that extends [TripOverlayPluginPlatform] when - /// they register themselves. - static set instance(TripOverlayPluginPlatform instance) { - PlatformInterface.verifyToken(instance, _token); - _instance = instance; - } - -} diff --git a/apps/driver-archive-cubit/trip_overlay_plugin/pubspec.yaml b/apps/driver-archive-cubit/trip_overlay_plugin/pubspec.yaml deleted file mode 100644 index 2a696d6..0000000 --- a/apps/driver-archive-cubit/trip_overlay_plugin/pubspec.yaml +++ /dev/null @@ -1,70 +0,0 @@ -name: trip_overlay_plugin -description: "A new Flutter plugin project." -version: 0.0.1 -homepage: - -environment: - sdk: ">=3.5.0 <4.0.0" - flutter: '>=3.3.0' - -dependencies: - flutter: - sdk: flutter - plugin_platform_interface: ^2.0.2 - -dev_dependencies: - flutter_test: - sdk: flutter - flutter_lints: ^6.0.0 - -# For information on the generic Dart part of this file, see the -# following page: https://dart.dev/tools/pub/pubspec - -# The following section is specific to Flutter packages. -flutter: - # This section identifies this Flutter project as a plugin project. - # The 'pluginClass' specifies the class (in Java, Kotlin, Swift, Objective-C, etc.) - # which should be registered in the plugin registry. This is required for - # using method channels. - # The Android 'package' specifies package in which the registered class is. - # This is required for using method channels on Android. - # The 'ffiPlugin' specifies that native code should be built and bundled. - # This is required for using `dart:ffi`. - # All these are used by the tooling to maintain consistency when - # adding or updating assets for this project. - plugin: - platforms: - android: - package: com.intaleq_driver.trip_overlay_plugin - pluginClass: TripOverlayPlugin - - # To add assets to your plugin package, add an assets section, like this: - # assets: - # - images/a_dot_burr.jpeg - # - images/a_dot_ham.jpeg - # - # For details regarding assets in packages, see - # https://flutter.dev/to/asset-from-package - # - # An image asset can refer to one or more resolution-specific "variants", see - # https://flutter.dev/to/resolution-aware-images - - # To add custom fonts to your plugin package, add a fonts section here, - # in this "flutter" section. Each entry in this list should have a - # "family" key with the font family name, and a "fonts" key with a - # list giving the asset and other descriptors for the font. For - # example: - # fonts: - # - family: Schyler - # fonts: - # - asset: fonts/Schyler-Regular.ttf - # - asset: fonts/Schyler-Italic.ttf - # style: italic - # - family: Trajan Pro - # fonts: - # - asset: fonts/TrajanPro.ttf - # - asset: fonts/TrajanPro_Bold.ttf - # weight: 700 - # - # For details regarding fonts in packages, see - # https://flutter.dev/to/font-from-package diff --git a/apps/driver-archive-cubit/trip_overlay_plugin/test/trip_overlay_plugin_method_channel_test.dart b/apps/driver-archive-cubit/trip_overlay_plugin/test/trip_overlay_plugin_method_channel_test.dart deleted file mode 100644 index 1f50843..0000000 --- a/apps/driver-archive-cubit/trip_overlay_plugin/test/trip_overlay_plugin_method_channel_test.dart +++ /dev/null @@ -1,5 +0,0 @@ -import 'package:flutter_test/flutter_test.dart'; - -void main() { - TestWidgetsFlutterBinding.ensureInitialized(); -} diff --git a/apps/driver-archive-cubit/trip_overlay_plugin/test/trip_overlay_plugin_test.dart b/apps/driver-archive-cubit/trip_overlay_plugin/test/trip_overlay_plugin_test.dart deleted file mode 100644 index 724fe15..0000000 --- a/apps/driver-archive-cubit/trip_overlay_plugin/test/trip_overlay_plugin_test.dart +++ /dev/null @@ -1,19 +0,0 @@ -import 'package:flutter_test/flutter_test.dart'; -import 'package:trip_overlay_plugin/trip_overlay_plugin_platform_interface.dart'; -import 'package:trip_overlay_plugin/trip_overlay_plugin_method_channel.dart'; -import 'package:plugin_platform_interface/plugin_platform_interface.dart'; - -class MockTripOverlayPluginPlatform - with MockPlatformInterfaceMixin - implements TripOverlayPluginPlatform { -} - -void main() { - final TripOverlayPluginPlatform initialPlatform = TripOverlayPluginPlatform.instance; - - test('$MethodChannelTripOverlayPlugin is the default instance', () { - expect(initialPlatform, isInstanceOf()); - }); - - -} diff --git a/apps/driver-archive-cubit/web/favicon.png b/apps/driver-archive-cubit/web/favicon.png deleted file mode 100755 index 4298e38..0000000 Binary files a/apps/driver-archive-cubit/web/favicon.png and /dev/null differ diff --git a/apps/driver-archive-cubit/web/icons/192.png b/apps/driver-archive-cubit/web/icons/192.png deleted file mode 100755 index eb9b4d7..0000000 Binary files a/apps/driver-archive-cubit/web/icons/192.png and /dev/null differ diff --git a/apps/driver-archive-cubit/web/icons/521.png b/apps/driver-archive-cubit/web/icons/521.png deleted file mode 100755 index 88cfd48..0000000 Binary files a/apps/driver-archive-cubit/web/icons/521.png and /dev/null differ diff --git a/apps/driver-archive-cubit/web/icons/Icon-192.png b/apps/driver-archive-cubit/web/icons/Icon-192.png deleted file mode 100755 index bd0a373..0000000 Binary files a/apps/driver-archive-cubit/web/icons/Icon-192.png and /dev/null differ diff --git a/apps/driver-archive-cubit/web/icons/Icon-512.png b/apps/driver-archive-cubit/web/icons/Icon-512.png deleted file mode 100755 index 458f078..0000000 Binary files a/apps/driver-archive-cubit/web/icons/Icon-512.png and /dev/null differ diff --git a/apps/driver-archive-cubit/web/icons/Icon-maskable-192.png b/apps/driver-archive-cubit/web/icons/Icon-maskable-192.png deleted file mode 100755 index bd0a373..0000000 Binary files a/apps/driver-archive-cubit/web/icons/Icon-maskable-192.png and /dev/null differ diff --git a/apps/driver-archive-cubit/web/icons/Icon-maskable-512.png b/apps/driver-archive-cubit/web/icons/Icon-maskable-512.png deleted file mode 100755 index 458f078..0000000 Binary files a/apps/driver-archive-cubit/web/icons/Icon-maskable-512.png and /dev/null differ diff --git a/apps/driver-archive-cubit/web/icons/d.png b/apps/driver-archive-cubit/web/icons/d.png deleted file mode 100755 index d69c566..0000000 Binary files a/apps/driver-archive-cubit/web/icons/d.png and /dev/null differ diff --git a/apps/driver-archive-cubit/web/icons/qq.png b/apps/driver-archive-cubit/web/icons/qq.png deleted file mode 100755 index b749bfe..0000000 Binary files a/apps/driver-archive-cubit/web/icons/qq.png and /dev/null differ diff --git a/apps/driver-archive-cubit/web/index.html b/apps/driver-archive-cubit/web/index.html deleted file mode 100755 index f4fda8c..0000000 --- a/apps/driver-archive-cubit/web/index.html +++ /dev/null @@ -1,59 +0,0 @@ - - - - - - - - - - - - - - - - - - - - ride - - - - - - - - - - diff --git a/apps/driver-archive-cubit/web/manifest.json b/apps/driver-archive-cubit/web/manifest.json deleted file mode 100755 index 31db40a..0000000 --- a/apps/driver-archive-cubit/web/manifest.json +++ /dev/null @@ -1,35 +0,0 @@ -{ - "name": "ride", - "short_name": "ride", - "start_url": ".", - "display": "standalone", - "background_color": "#hexcode", - "theme_color": "#hexcode", - "description": "A new Flutter project.", - "orientation": "portrait-primary", - "prefer_related_applications": false, - "icons": [ - { - "src": "icons/Icon-192.png", - "sizes": "192x192", - "type": "image/png" - }, - { - "src": "icons/Icon-512.png", - "sizes": "512x512", - "type": "image/png" - }, - { - "src": "icons/Icon-maskable-192.png", - "sizes": "192x192", - "type": "image/png", - "purpose": "maskable" - }, - { - "src": "icons/Icon-maskable-512.png", - "sizes": "512x512", - "type": "image/png", - "purpose": "maskable" - } - ] -} \ No newline at end of file diff --git a/apps/driver-archive-cubit/windows/.gitignore b/apps/driver-archive-cubit/windows/.gitignore deleted file mode 100755 index d492d0d..0000000 --- a/apps/driver-archive-cubit/windows/.gitignore +++ /dev/null @@ -1,17 +0,0 @@ -flutter/ephemeral/ - -# Visual Studio user-specific files. -*.suo -*.user -*.userosscache -*.sln.docstates - -# Visual Studio build-related files. -x64/ -x86/ - -# Visual Studio cache files -# files ending in .cache can be ignored -*.[Cc]ache -# but keep track of directories ending in .cache -!*.[Cc]ache/ diff --git a/apps/driver-archive-cubit/windows/CMakeLists.txt b/apps/driver-archive-cubit/windows/CMakeLists.txt deleted file mode 100755 index e663f62..0000000 --- a/apps/driver-archive-cubit/windows/CMakeLists.txt +++ /dev/null @@ -1,102 +0,0 @@ -# Project-level configuration. -cmake_minimum_required(VERSION 3.14) -project(ride LANGUAGES CXX) - -# The name of the executable created for the application. Change this to change -# the on-disk name of your application. -set(BINARY_NAME "ride") - -# Explicitly opt in to modern CMake behaviors to avoid warnings with recent -# versions of CMake. -cmake_policy(SET CMP0063 NEW) - -# Define build configuration option. -get_property(IS_MULTICONFIG GLOBAL PROPERTY GENERATOR_IS_MULTI_CONFIG) -if(IS_MULTICONFIG) - set(CMAKE_CONFIGURATION_TYPES "Debug;Profile;Release" - CACHE STRING "" FORCE) -else() - if(NOT CMAKE_BUILD_TYPE AND NOT CMAKE_CONFIGURATION_TYPES) - set(CMAKE_BUILD_TYPE "Debug" CACHE - STRING "Flutter build mode" FORCE) - set_property(CACHE CMAKE_BUILD_TYPE PROPERTY STRINGS - "Debug" "Profile" "Release") - endif() -endif() -# Define settings for the Profile build mode. -set(CMAKE_EXE_LINKER_FLAGS_PROFILE "${CMAKE_EXE_LINKER_FLAGS_RELEASE}") -set(CMAKE_SHARED_LINKER_FLAGS_PROFILE "${CMAKE_SHARED_LINKER_FLAGS_RELEASE}") -set(CMAKE_C_FLAGS_PROFILE "${CMAKE_C_FLAGS_RELEASE}") -set(CMAKE_CXX_FLAGS_PROFILE "${CMAKE_CXX_FLAGS_RELEASE}") - -# Use Unicode for all projects. -add_definitions(-DUNICODE -D_UNICODE) - -# Compilation settings that should be applied to most targets. -# -# Be cautious about adding new options here, as plugins use this function by -# default. In most cases, you should add new options to specific targets instead -# of modifying this function. -function(APPLY_STANDARD_SETTINGS TARGET) - target_compile_features(${TARGET} PUBLIC cxx_std_17) - target_compile_options(${TARGET} PRIVATE /W4 /WX /wd"4100") - target_compile_options(${TARGET} PRIVATE /EHsc) - target_compile_definitions(${TARGET} PRIVATE "_HAS_EXCEPTIONS=0") - target_compile_definitions(${TARGET} PRIVATE "$<$:_DEBUG>") -endfunction() - -# Flutter library and tool build rules. -set(FLUTTER_MANAGED_DIR "${CMAKE_CURRENT_SOURCE_DIR}/flutter") -add_subdirectory(${FLUTTER_MANAGED_DIR}) - -# Application build; see runner/CMakeLists.txt. -add_subdirectory("runner") - - -# Generated plugin build rules, which manage building the plugins and adding -# them to the application. -include(flutter/generated_plugins.cmake) - - -# === Installation === -# Support files are copied into place next to the executable, so that it can -# run in place. This is done instead of making a separate bundle (as on Linux) -# so that building and running from within Visual Studio will work. -set(BUILD_BUNDLE_DIR "$") -# Make the "install" step default, as it's required to run. -set(CMAKE_VS_INCLUDE_INSTALL_TO_DEFAULT_BUILD 1) -if(CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT) - set(CMAKE_INSTALL_PREFIX "${BUILD_BUNDLE_DIR}" CACHE PATH "..." FORCE) -endif() - -set(INSTALL_BUNDLE_DATA_DIR "${CMAKE_INSTALL_PREFIX}/data") -set(INSTALL_BUNDLE_LIB_DIR "${CMAKE_INSTALL_PREFIX}") - -install(TARGETS ${BINARY_NAME} RUNTIME DESTINATION "${CMAKE_INSTALL_PREFIX}" - COMPONENT Runtime) - -install(FILES "${FLUTTER_ICU_DATA_FILE}" DESTINATION "${INSTALL_BUNDLE_DATA_DIR}" - COMPONENT Runtime) - -install(FILES "${FLUTTER_LIBRARY}" DESTINATION "${INSTALL_BUNDLE_LIB_DIR}" - COMPONENT Runtime) - -if(PLUGIN_BUNDLED_LIBRARIES) - install(FILES "${PLUGIN_BUNDLED_LIBRARIES}" - DESTINATION "${INSTALL_BUNDLE_LIB_DIR}" - COMPONENT Runtime) -endif() - -# Fully re-copy the assets directory on each build to avoid having stale files -# from a previous install. -set(FLUTTER_ASSET_DIR_NAME "flutter_assets") -install(CODE " - file(REMOVE_RECURSE \"${INSTALL_BUNDLE_DATA_DIR}/${FLUTTER_ASSET_DIR_NAME}\") - " COMPONENT Runtime) -install(DIRECTORY "${PROJECT_BUILD_DIR}/${FLUTTER_ASSET_DIR_NAME}" - DESTINATION "${INSTALL_BUNDLE_DATA_DIR}" COMPONENT Runtime) - -# Install the AOT library on non-Debug builds only. -install(FILES "${AOT_LIBRARY}" DESTINATION "${INSTALL_BUNDLE_DATA_DIR}" - CONFIGURATIONS Profile;Release - COMPONENT Runtime) diff --git a/apps/driver-archive-cubit/windows/flutter/CMakeLists.txt b/apps/driver-archive-cubit/windows/flutter/CMakeLists.txt deleted file mode 100755 index 903f489..0000000 --- a/apps/driver-archive-cubit/windows/flutter/CMakeLists.txt +++ /dev/null @@ -1,109 +0,0 @@ -# This file controls Flutter-level build steps. It should not be edited. -cmake_minimum_required(VERSION 3.14) - -set(EPHEMERAL_DIR "${CMAKE_CURRENT_SOURCE_DIR}/ephemeral") - -# Configuration provided via flutter tool. -include(${EPHEMERAL_DIR}/generated_config.cmake) - -# TODO: Move the rest of this into files in ephemeral. See -# https://github.com/flutter/flutter/issues/57146. -set(WRAPPER_ROOT "${EPHEMERAL_DIR}/cpp_client_wrapper") - -# Set fallback configurations for older versions of the flutter tool. -if (NOT DEFINED FLUTTER_TARGET_PLATFORM) - set(FLUTTER_TARGET_PLATFORM "windows-x64") -endif() - -# === Flutter Library === -set(FLUTTER_LIBRARY "${EPHEMERAL_DIR}/flutter_windows.dll") - -# Published to parent scope for install step. -set(FLUTTER_LIBRARY ${FLUTTER_LIBRARY} PARENT_SCOPE) -set(FLUTTER_ICU_DATA_FILE "${EPHEMERAL_DIR}/icudtl.dat" PARENT_SCOPE) -set(PROJECT_BUILD_DIR "${PROJECT_DIR}/build/" PARENT_SCOPE) -set(AOT_LIBRARY "${PROJECT_DIR}/build/windows/app.so" PARENT_SCOPE) - -list(APPEND FLUTTER_LIBRARY_HEADERS - "flutter_export.h" - "flutter_windows.h" - "flutter_messenger.h" - "flutter_plugin_registrar.h" - "flutter_texture_registrar.h" -) -list(TRANSFORM FLUTTER_LIBRARY_HEADERS PREPEND "${EPHEMERAL_DIR}/") -add_library(flutter INTERFACE) -target_include_directories(flutter INTERFACE - "${EPHEMERAL_DIR}" -) -target_link_libraries(flutter INTERFACE "${FLUTTER_LIBRARY}.lib") -add_dependencies(flutter flutter_assemble) - -# === Wrapper === -list(APPEND CPP_WRAPPER_SOURCES_CORE - "core_implementations.cc" - "standard_codec.cc" -) -list(TRANSFORM CPP_WRAPPER_SOURCES_CORE PREPEND "${WRAPPER_ROOT}/") -list(APPEND CPP_WRAPPER_SOURCES_PLUGIN - "plugin_registrar.cc" -) -list(TRANSFORM CPP_WRAPPER_SOURCES_PLUGIN PREPEND "${WRAPPER_ROOT}/") -list(APPEND CPP_WRAPPER_SOURCES_APP - "flutter_engine.cc" - "flutter_view_controller.cc" -) -list(TRANSFORM CPP_WRAPPER_SOURCES_APP PREPEND "${WRAPPER_ROOT}/") - -# Wrapper sources needed for a plugin. -add_library(flutter_wrapper_plugin STATIC - ${CPP_WRAPPER_SOURCES_CORE} - ${CPP_WRAPPER_SOURCES_PLUGIN} -) -apply_standard_settings(flutter_wrapper_plugin) -set_target_properties(flutter_wrapper_plugin PROPERTIES - POSITION_INDEPENDENT_CODE ON) -set_target_properties(flutter_wrapper_plugin PROPERTIES - CXX_VISIBILITY_PRESET hidden) -target_link_libraries(flutter_wrapper_plugin PUBLIC flutter) -target_include_directories(flutter_wrapper_plugin PUBLIC - "${WRAPPER_ROOT}/include" -) -add_dependencies(flutter_wrapper_plugin flutter_assemble) - -# Wrapper sources needed for the runner. -add_library(flutter_wrapper_app STATIC - ${CPP_WRAPPER_SOURCES_CORE} - ${CPP_WRAPPER_SOURCES_APP} -) -apply_standard_settings(flutter_wrapper_app) -target_link_libraries(flutter_wrapper_app PUBLIC flutter) -target_include_directories(flutter_wrapper_app PUBLIC - "${WRAPPER_ROOT}/include" -) -add_dependencies(flutter_wrapper_app flutter_assemble) - -# === Flutter tool backend === -# _phony_ is a non-existent file to force this command to run every time, -# since currently there's no way to get a full input/output list from the -# flutter tool. -set(PHONY_OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/_phony_") -set_source_files_properties("${PHONY_OUTPUT}" PROPERTIES SYMBOLIC TRUE) -add_custom_command( - OUTPUT ${FLUTTER_LIBRARY} ${FLUTTER_LIBRARY_HEADERS} - ${CPP_WRAPPER_SOURCES_CORE} ${CPP_WRAPPER_SOURCES_PLUGIN} - ${CPP_WRAPPER_SOURCES_APP} - ${PHONY_OUTPUT} - COMMAND ${CMAKE_COMMAND} -E env - ${FLUTTER_TOOL_ENVIRONMENT} - "${FLUTTER_ROOT}/packages/flutter_tools/bin/tool_backend.bat" - ${FLUTTER_TARGET_PLATFORM} $ - VERBATIM -) -add_custom_target(flutter_assemble DEPENDS - "${FLUTTER_LIBRARY}" - ${FLUTTER_LIBRARY_HEADERS} - ${CPP_WRAPPER_SOURCES_CORE} - ${CPP_WRAPPER_SOURCES_PLUGIN} - ${CPP_WRAPPER_SOURCES_APP} -) diff --git a/apps/driver-archive-cubit/windows/flutter/generated_plugin_registrant.cc b/apps/driver-archive-cubit/windows/flutter/generated_plugin_registrant.cc deleted file mode 100755 index 6a5391e..0000000 --- a/apps/driver-archive-cubit/windows/flutter/generated_plugin_registrant.cc +++ /dev/null @@ -1,38 +0,0 @@ -// -// Generated file. Do not edit. -// - -// clang-format off - -#include "generated_plugin_registrant.h" - -#include -#include -#include -#include -#include -#include -#include -#include -#include - -void RegisterPlugins(flutter::PluginRegistry* registry) { - BatteryPlusWindowsPluginRegisterWithRegistrar( - registry->GetRegistrarForPlugin("BatteryPlusWindowsPlugin")); - ConnectivityPlusWindowsPluginRegisterWithRegistrar( - registry->GetRegistrarForPlugin("ConnectivityPlusWindowsPlugin")); - FileSelectorWindowsRegisterWithRegistrar( - registry->GetRegistrarForPlugin("FileSelectorWindows")); - FirebaseCorePluginCApiRegisterWithRegistrar( - registry->GetRegistrarForPlugin("FirebaseCorePluginCApi")); - FlutterSecureStorageWindowsPluginRegisterWithRegistrar( - registry->GetRegistrarForPlugin("FlutterSecureStorageWindowsPlugin")); - GeolocatorWindowsRegisterWithRegistrar( - registry->GetRegistrarForPlugin("GeolocatorWindows")); - LocalAuthPluginRegisterWithRegistrar( - registry->GetRegistrarForPlugin("LocalAuthPlugin")); - PermissionHandlerWindowsPluginRegisterWithRegistrar( - registry->GetRegistrarForPlugin("PermissionHandlerWindowsPlugin")); - UrlLauncherWindowsRegisterWithRegistrar( - registry->GetRegistrarForPlugin("UrlLauncherWindows")); -} diff --git a/apps/driver-archive-cubit/windows/flutter/generated_plugin_registrant.h b/apps/driver-archive-cubit/windows/flutter/generated_plugin_registrant.h deleted file mode 100755 index dc139d8..0000000 --- a/apps/driver-archive-cubit/windows/flutter/generated_plugin_registrant.h +++ /dev/null @@ -1,15 +0,0 @@ -// -// Generated file. Do not edit. -// - -// clang-format off - -#ifndef GENERATED_PLUGIN_REGISTRANT_ -#define GENERATED_PLUGIN_REGISTRANT_ - -#include - -// Registers Flutter plugins. -void RegisterPlugins(flutter::PluginRegistry* registry); - -#endif // GENERATED_PLUGIN_REGISTRANT_ diff --git a/apps/driver-archive-cubit/windows/flutter/generated_plugins.cmake b/apps/driver-archive-cubit/windows/flutter/generated_plugins.cmake deleted file mode 100755 index 0f4ac6d..0000000 --- a/apps/driver-archive-cubit/windows/flutter/generated_plugins.cmake +++ /dev/null @@ -1,33 +0,0 @@ -# -# Generated file, do not edit. -# - -list(APPEND FLUTTER_PLUGIN_LIST - battery_plus - connectivity_plus - file_selector_windows - firebase_core - flutter_secure_storage_windows - geolocator_windows - local_auth_windows - permission_handler_windows - url_launcher_windows -) - -list(APPEND FLUTTER_FFI_PLUGIN_LIST - jni -) - -set(PLUGIN_BUNDLED_LIBRARIES) - -foreach(plugin ${FLUTTER_PLUGIN_LIST}) - add_subdirectory(flutter/ephemeral/.plugin_symlinks/${plugin}/windows plugins/${plugin}) - target_link_libraries(${BINARY_NAME} PRIVATE ${plugin}_plugin) - list(APPEND PLUGIN_BUNDLED_LIBRARIES $) - list(APPEND PLUGIN_BUNDLED_LIBRARIES ${${plugin}_bundled_libraries}) -endforeach(plugin) - -foreach(ffi_plugin ${FLUTTER_FFI_PLUGIN_LIST}) - add_subdirectory(flutter/ephemeral/.plugin_symlinks/${ffi_plugin}/windows plugins/${ffi_plugin}) - list(APPEND PLUGIN_BUNDLED_LIBRARIES ${${ffi_plugin}_bundled_libraries}) -endforeach(ffi_plugin) diff --git a/apps/driver-archive-cubit/windows/runner/CMakeLists.txt b/apps/driver-archive-cubit/windows/runner/CMakeLists.txt deleted file mode 100755 index 394917c..0000000 --- a/apps/driver-archive-cubit/windows/runner/CMakeLists.txt +++ /dev/null @@ -1,40 +0,0 @@ -cmake_minimum_required(VERSION 3.14) -project(runner LANGUAGES CXX) - -# Define the application target. To change its name, change BINARY_NAME in the -# top-level CMakeLists.txt, not the value here, or `flutter run` will no longer -# work. -# -# Any new source files that you add to the application should be added here. -add_executable(${BINARY_NAME} WIN32 - "flutter_window.cpp" - "main.cpp" - "utils.cpp" - "win32_window.cpp" - "${FLUTTER_MANAGED_DIR}/generated_plugin_registrant.cc" - "Runner.rc" - "runner.exe.manifest" -) - -# Apply the standard set of build settings. This can be removed for applications -# that need different build settings. -apply_standard_settings(${BINARY_NAME}) - -# Add preprocessor definitions for the build version. -target_compile_definitions(${BINARY_NAME} PRIVATE "FLUTTER_VERSION=\"${FLUTTER_VERSION}\"") -target_compile_definitions(${BINARY_NAME} PRIVATE "FLUTTER_VERSION_MAJOR=${FLUTTER_VERSION_MAJOR}") -target_compile_definitions(${BINARY_NAME} PRIVATE "FLUTTER_VERSION_MINOR=${FLUTTER_VERSION_MINOR}") -target_compile_definitions(${BINARY_NAME} PRIVATE "FLUTTER_VERSION_PATCH=${FLUTTER_VERSION_PATCH}") -target_compile_definitions(${BINARY_NAME} PRIVATE "FLUTTER_VERSION_BUILD=${FLUTTER_VERSION_BUILD}") - -# Disable Windows macros that collide with C++ standard library functions. -target_compile_definitions(${BINARY_NAME} PRIVATE "NOMINMAX") - -# Add dependency libraries and include directories. Add any application-specific -# dependencies here. -target_link_libraries(${BINARY_NAME} PRIVATE flutter flutter_wrapper_app) -target_link_libraries(${BINARY_NAME} PRIVATE "dwmapi.lib") -target_include_directories(${BINARY_NAME} PRIVATE "${CMAKE_SOURCE_DIR}") - -# Run the Flutter tool portions of the build. This must not be removed. -add_dependencies(${BINARY_NAME} flutter_assemble) diff --git a/apps/driver-archive-cubit/windows/runner/Runner.rc b/apps/driver-archive-cubit/windows/runner/Runner.rc deleted file mode 100755 index ba10230..0000000 --- a/apps/driver-archive-cubit/windows/runner/Runner.rc +++ /dev/null @@ -1,121 +0,0 @@ -// Microsoft Visual C++ generated resource script. -// -#pragma code_page(65001) -#include "resource.h" - -#define APSTUDIO_READONLY_SYMBOLS -///////////////////////////////////////////////////////////////////////////// -// -// Generated from the TEXTINCLUDE 2 resource. -// -#include "winres.h" - -///////////////////////////////////////////////////////////////////////////// -#undef APSTUDIO_READONLY_SYMBOLS - -///////////////////////////////////////////////////////////////////////////// -// English (United States) resources - -#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU) -LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US - -#ifdef APSTUDIO_INVOKED -///////////////////////////////////////////////////////////////////////////// -// -// TEXTINCLUDE -// - -1 TEXTINCLUDE -BEGIN - "resource.h\0" -END - -2 TEXTINCLUDE -BEGIN - "#include ""winres.h""\r\n" - "\0" -END - -3 TEXTINCLUDE -BEGIN - "\r\n" - "\0" -END - -#endif // APSTUDIO_INVOKED - - -///////////////////////////////////////////////////////////////////////////// -// -// Icon -// - -// Icon with lowest ID value placed first to ensure application icon -// remains consistent on all systems. -IDI_APP_ICON ICON "resources\\app_icon.ico" - - -///////////////////////////////////////////////////////////////////////////// -// -// Version -// - -#if defined(FLUTTER_VERSION_MAJOR) && defined(FLUTTER_VERSION_MINOR) && defined(FLUTTER_VERSION_PATCH) && defined(FLUTTER_VERSION_BUILD) -#define VERSION_AS_NUMBER FLUTTER_VERSION_MAJOR,FLUTTER_VERSION_MINOR,FLUTTER_VERSION_PATCH,FLUTTER_VERSION_BUILD -#else -#define VERSION_AS_NUMBER 1,0,0,0 -#endif - -#if defined(FLUTTER_VERSION) -#define VERSION_AS_STRING FLUTTER_VERSION -#else -#define VERSION_AS_STRING "1.0.0" -#endif - -VS_VERSION_INFO VERSIONINFO - FILEVERSION VERSION_AS_NUMBER - PRODUCTVERSION VERSION_AS_NUMBER - FILEFLAGSMASK VS_FFI_FILEFLAGSMASK -#ifdef _DEBUG - FILEFLAGS VS_FF_DEBUG -#else - FILEFLAGS 0x0L -#endif - FILEOS VOS__WINDOWS32 - FILETYPE VFT_APP - FILESUBTYPE 0x0L -BEGIN - BLOCK "StringFileInfo" - BEGIN - BLOCK "040904e4" - BEGIN - VALUE "CompanyName", "com.mobileapp.store" "\0" - VALUE "FileDescription", "ride" "\0" - VALUE "FileVersion", VERSION_AS_STRING "\0" - VALUE "InternalName", "ride" "\0" - VALUE "LegalCopyright", "Copyright (C) 2023 com.mobileapp.store. All rights reserved." "\0" - VALUE "OriginalFilename", "ride.exe" "\0" - VALUE "ProductName", "ride" "\0" - VALUE "ProductVersion", VERSION_AS_STRING "\0" - END - END - BLOCK "VarFileInfo" - BEGIN - VALUE "Translation", 0x409, 1252 - END -END - -#endif // English (United States) resources -///////////////////////////////////////////////////////////////////////////// - - - -#ifndef APSTUDIO_INVOKED -///////////////////////////////////////////////////////////////////////////// -// -// Generated from the TEXTINCLUDE 3 resource. -// - - -///////////////////////////////////////////////////////////////////////////// -#endif // not APSTUDIO_INVOKED diff --git a/apps/driver-archive-cubit/windows/runner/flutter_window.cpp b/apps/driver-archive-cubit/windows/runner/flutter_window.cpp deleted file mode 100755 index 955ee30..0000000 --- a/apps/driver-archive-cubit/windows/runner/flutter_window.cpp +++ /dev/null @@ -1,71 +0,0 @@ -#include "flutter_window.h" - -#include - -#include "flutter/generated_plugin_registrant.h" - -FlutterWindow::FlutterWindow(const flutter::DartProject& project) - : project_(project) {} - -FlutterWindow::~FlutterWindow() {} - -bool FlutterWindow::OnCreate() { - if (!Win32Window::OnCreate()) { - return false; - } - - RECT frame = GetClientArea(); - - // The size here must match the window dimensions to avoid unnecessary surface - // creation / destruction in the startup path. - flutter_controller_ = std::make_unique( - frame.right - frame.left, frame.bottom - frame.top, project_); - // Ensure that basic setup of the controller was successful. - if (!flutter_controller_->engine() || !flutter_controller_->view()) { - return false; - } - RegisterPlugins(flutter_controller_->engine()); - SetChildContent(flutter_controller_->view()->GetNativeWindow()); - - flutter_controller_->engine()->SetNextFrameCallback([&]() { - this->Show(); - }); - - // Flutter can complete the first frame before the "show window" callback is - // registered. The following call ensures a frame is pending to ensure the - // window is shown. It is a no-op if the first frame hasn't completed yet. - flutter_controller_->ForceRedraw(); - - return true; -} - -void FlutterWindow::OnDestroy() { - if (flutter_controller_) { - flutter_controller_ = nullptr; - } - - Win32Window::OnDestroy(); -} - -LRESULT -FlutterWindow::MessageHandler(HWND hwnd, UINT const message, - WPARAM const wparam, - LPARAM const lparam) noexcept { - // Give Flutter, including plugins, an opportunity to handle window messages. - if (flutter_controller_) { - std::optional result = - flutter_controller_->HandleTopLevelWindowProc(hwnd, message, wparam, - lparam); - if (result) { - return *result; - } - } - - switch (message) { - case WM_FONTCHANGE: - flutter_controller_->engine()->ReloadSystemFonts(); - break; - } - - return Win32Window::MessageHandler(hwnd, message, wparam, lparam); -} diff --git a/apps/driver-archive-cubit/windows/runner/flutter_window.h b/apps/driver-archive-cubit/windows/runner/flutter_window.h deleted file mode 100755 index 6da0652..0000000 --- a/apps/driver-archive-cubit/windows/runner/flutter_window.h +++ /dev/null @@ -1,33 +0,0 @@ -#ifndef RUNNER_FLUTTER_WINDOW_H_ -#define RUNNER_FLUTTER_WINDOW_H_ - -#include -#include - -#include - -#include "win32_window.h" - -// A window that does nothing but host a Flutter view. -class FlutterWindow : public Win32Window { - public: - // Creates a new FlutterWindow hosting a Flutter view running |project|. - explicit FlutterWindow(const flutter::DartProject& project); - virtual ~FlutterWindow(); - - protected: - // Win32Window: - bool OnCreate() override; - void OnDestroy() override; - LRESULT MessageHandler(HWND window, UINT const message, WPARAM const wparam, - LPARAM const lparam) noexcept override; - - private: - // The project to run. - flutter::DartProject project_; - - // The Flutter instance hosted by this window. - std::unique_ptr flutter_controller_; -}; - -#endif // RUNNER_FLUTTER_WINDOW_H_ diff --git a/apps/driver-archive-cubit/windows/runner/main.cpp b/apps/driver-archive-cubit/windows/runner/main.cpp deleted file mode 100755 index 46fbd8c..0000000 --- a/apps/driver-archive-cubit/windows/runner/main.cpp +++ /dev/null @@ -1,43 +0,0 @@ -#include -#include -#include - -#include "flutter_window.h" -#include "utils.h" - -int APIENTRY wWinMain(_In_ HINSTANCE instance, _In_opt_ HINSTANCE prev, - _In_ wchar_t *command_line, _In_ int show_command) { - // Attach to console when present (e.g., 'flutter run') or create a - // new console when running with a debugger. - if (!::AttachConsole(ATTACH_PARENT_PROCESS) && ::IsDebuggerPresent()) { - CreateAndAttachConsole(); - } - - // Initialize COM, so that it is available for use in the library and/or - // plugins. - ::CoInitializeEx(nullptr, COINIT_APARTMENTTHREADED); - - flutter::DartProject project(L"data"); - - std::vector command_line_arguments = - GetCommandLineArguments(); - - project.set_dart_entrypoint_arguments(std::move(command_line_arguments)); - - FlutterWindow window(project); - Win32Window::Point origin(10, 10); - Win32Window::Size size(1280, 720); - if (!window.Create(L"ride", origin, size)) { - return EXIT_FAILURE; - } - window.SetQuitOnClose(true); - - ::MSG msg; - while (::GetMessage(&msg, nullptr, 0, 0)) { - ::TranslateMessage(&msg); - ::DispatchMessage(&msg); - } - - ::CoUninitialize(); - return EXIT_SUCCESS; -} diff --git a/apps/driver-archive-cubit/windows/runner/resource.h b/apps/driver-archive-cubit/windows/runner/resource.h deleted file mode 100755 index 66a65d1..0000000 --- a/apps/driver-archive-cubit/windows/runner/resource.h +++ /dev/null @@ -1,16 +0,0 @@ -//{{NO_DEPENDENCIES}} -// Microsoft Visual C++ generated include file. -// Used by Runner.rc -// -#define IDI_APP_ICON 101 - -// Next default values for new objects -// -#ifdef APSTUDIO_INVOKED -#ifndef APSTUDIO_READONLY_SYMBOLS -#define _APS_NEXT_RESOURCE_VALUE 102 -#define _APS_NEXT_COMMAND_VALUE 40001 -#define _APS_NEXT_CONTROL_VALUE 1001 -#define _APS_NEXT_SYMED_VALUE 101 -#endif -#endif diff --git a/apps/driver-archive-cubit/windows/runner/resources/app_icon.ico b/apps/driver-archive-cubit/windows/runner/resources/app_icon.ico deleted file mode 100755 index 14bf987..0000000 Binary files a/apps/driver-archive-cubit/windows/runner/resources/app_icon.ico and /dev/null differ diff --git a/apps/driver-archive-cubit/windows/runner/resources/app_icon.png b/apps/driver-archive-cubit/windows/runner/resources/app_icon.png deleted file mode 100755 index 776785b..0000000 Binary files a/apps/driver-archive-cubit/windows/runner/resources/app_icon.png and /dev/null differ diff --git a/apps/driver-archive-cubit/windows/runner/resources/playstore.png b/apps/driver-archive-cubit/windows/runner/resources/playstore.png deleted file mode 100755 index 7567e84..0000000 Binary files a/apps/driver-archive-cubit/windows/runner/resources/playstore.png and /dev/null differ diff --git a/apps/driver-archive-cubit/windows/runner/resources/ss.ico b/apps/driver-archive-cubit/windows/runner/resources/ss.ico deleted file mode 100755 index c04e20c..0000000 Binary files a/apps/driver-archive-cubit/windows/runner/resources/ss.ico and /dev/null differ diff --git a/apps/driver-archive-cubit/windows/runner/runner.exe.manifest b/apps/driver-archive-cubit/windows/runner/runner.exe.manifest deleted file mode 100755 index a42ea76..0000000 --- a/apps/driver-archive-cubit/windows/runner/runner.exe.manifest +++ /dev/null @@ -1,20 +0,0 @@ - - - - - PerMonitorV2 - - - - - - - - - - - - - - - diff --git a/apps/driver-archive-cubit/windows/runner/utils.cpp b/apps/driver-archive-cubit/windows/runner/utils.cpp deleted file mode 100755 index b2b0873..0000000 --- a/apps/driver-archive-cubit/windows/runner/utils.cpp +++ /dev/null @@ -1,65 +0,0 @@ -#include "utils.h" - -#include -#include -#include -#include - -#include - -void CreateAndAttachConsole() { - if (::AllocConsole()) { - FILE *unused; - if (freopen_s(&unused, "CONOUT$", "w", stdout)) { - _dup2(_fileno(stdout), 1); - } - if (freopen_s(&unused, "CONOUT$", "w", stderr)) { - _dup2(_fileno(stdout), 2); - } - std::ios::sync_with_stdio(); - FlutterDesktopResyncOutputStreams(); - } -} - -std::vector GetCommandLineArguments() { - // Convert the UTF-16 command line arguments to UTF-8 for the Engine to use. - int argc; - wchar_t** argv = ::CommandLineToArgvW(::GetCommandLineW(), &argc); - if (argv == nullptr) { - return std::vector(); - } - - std::vector command_line_arguments; - - // Skip the first argument as it's the binary name. - for (int i = 1; i < argc; i++) { - command_line_arguments.push_back(Utf8FromUtf16(argv[i])); - } - - ::LocalFree(argv); - - return command_line_arguments; -} - -std::string Utf8FromUtf16(const wchar_t* utf16_string) { - if (utf16_string == nullptr) { - return std::string(); - } - int target_length = ::WideCharToMultiByte( - CP_UTF8, WC_ERR_INVALID_CHARS, utf16_string, - -1, nullptr, 0, nullptr, nullptr) - -1; // remove the trailing null character - int input_length = (int)wcslen(utf16_string); - std::string utf8_string; - if (target_length <= 0 || target_length > utf8_string.max_size()) { - return utf8_string; - } - utf8_string.resize(target_length); - int converted_length = ::WideCharToMultiByte( - CP_UTF8, WC_ERR_INVALID_CHARS, utf16_string, - input_length, utf8_string.data(), target_length, nullptr, nullptr); - if (converted_length == 0) { - return std::string(); - } - return utf8_string; -} diff --git a/apps/driver-archive-cubit/windows/runner/utils.h b/apps/driver-archive-cubit/windows/runner/utils.h deleted file mode 100755 index 3879d54..0000000 --- a/apps/driver-archive-cubit/windows/runner/utils.h +++ /dev/null @@ -1,19 +0,0 @@ -#ifndef RUNNER_UTILS_H_ -#define RUNNER_UTILS_H_ - -#include -#include - -// Creates a console for the process, and redirects stdout and stderr to -// it for both the runner and the Flutter library. -void CreateAndAttachConsole(); - -// Takes a null-terminated wchar_t* encoded in UTF-16 and returns a std::string -// encoded in UTF-8. Returns an empty std::string on failure. -std::string Utf8FromUtf16(const wchar_t* utf16_string); - -// Gets the command line arguments passed in as a std::vector, -// encoded in UTF-8. Returns an empty std::vector on failure. -std::vector GetCommandLineArguments(); - -#endif // RUNNER_UTILS_H_ diff --git a/apps/driver-archive-cubit/windows/runner/win32_window.cpp b/apps/driver-archive-cubit/windows/runner/win32_window.cpp deleted file mode 100755 index 60608d0..0000000 --- a/apps/driver-archive-cubit/windows/runner/win32_window.cpp +++ /dev/null @@ -1,288 +0,0 @@ -#include "win32_window.h" - -#include -#include - -#include "resource.h" - -namespace { - -/// Window attribute that enables dark mode window decorations. -/// -/// Redefined in case the developer's machine has a Windows SDK older than -/// version 10.0.22000.0. -/// See: https://docs.microsoft.com/windows/win32/api/dwmapi/ne-dwmapi-dwmwindowattribute -#ifndef DWMWA_USE_IMMERSIVE_DARK_MODE -#define DWMWA_USE_IMMERSIVE_DARK_MODE 20 -#endif - -constexpr const wchar_t kWindowClassName[] = L"FLUTTER_RUNNER_WIN32_WINDOW"; - -/// Registry key for app theme preference. -/// -/// A value of 0 indicates apps should use dark mode. A non-zero or missing -/// value indicates apps should use light mode. -constexpr const wchar_t kGetPreferredBrightnessRegKey[] = - L"Software\\Microsoft\\Windows\\CurrentVersion\\Themes\\Personalize"; -constexpr const wchar_t kGetPreferredBrightnessRegValue[] = L"AppsUseLightTheme"; - -// The number of Win32Window objects that currently exist. -static int g_active_window_count = 0; - -using EnableNonClientDpiScaling = BOOL __stdcall(HWND hwnd); - -// Scale helper to convert logical scaler values to physical using passed in -// scale factor -int Scale(int source, double scale_factor) { - return static_cast(source * scale_factor); -} - -// Dynamically loads the |EnableNonClientDpiScaling| from the User32 module. -// This API is only needed for PerMonitor V1 awareness mode. -void EnableFullDpiSupportIfAvailable(HWND hwnd) { - HMODULE user32_module = LoadLibraryA("User32.dll"); - if (!user32_module) { - return; - } - auto enable_non_client_dpi_scaling = - reinterpret_cast( - GetProcAddress(user32_module, "EnableNonClientDpiScaling")); - if (enable_non_client_dpi_scaling != nullptr) { - enable_non_client_dpi_scaling(hwnd); - } - FreeLibrary(user32_module); -} - -} // namespace - -// Manages the Win32Window's window class registration. -class WindowClassRegistrar { - public: - ~WindowClassRegistrar() = default; - - // Returns the singleton registrar instance. - static WindowClassRegistrar* GetInstance() { - if (!instance_) { - instance_ = new WindowClassRegistrar(); - } - return instance_; - } - - // Returns the name of the window class, registering the class if it hasn't - // previously been registered. - const wchar_t* GetWindowClass(); - - // Unregisters the window class. Should only be called if there are no - // instances of the window. - void UnregisterWindowClass(); - - private: - WindowClassRegistrar() = default; - - static WindowClassRegistrar* instance_; - - bool class_registered_ = false; -}; - -WindowClassRegistrar* WindowClassRegistrar::instance_ = nullptr; - -const wchar_t* WindowClassRegistrar::GetWindowClass() { - if (!class_registered_) { - WNDCLASS window_class{}; - window_class.hCursor = LoadCursor(nullptr, IDC_ARROW); - window_class.lpszClassName = kWindowClassName; - window_class.style = CS_HREDRAW | CS_VREDRAW; - window_class.cbClsExtra = 0; - window_class.cbWndExtra = 0; - window_class.hInstance = GetModuleHandle(nullptr); - window_class.hIcon = - LoadIcon(window_class.hInstance, MAKEINTRESOURCE(IDI_APP_ICON)); - window_class.hbrBackground = 0; - window_class.lpszMenuName = nullptr; - window_class.lpfnWndProc = Win32Window::WndProc; - RegisterClass(&window_class); - class_registered_ = true; - } - return kWindowClassName; -} - -void WindowClassRegistrar::UnregisterWindowClass() { - UnregisterClass(kWindowClassName, nullptr); - class_registered_ = false; -} - -Win32Window::Win32Window() { - ++g_active_window_count; -} - -Win32Window::~Win32Window() { - --g_active_window_count; - Destroy(); -} - -bool Win32Window::Create(const std::wstring& title, - const Point& origin, - const Size& size) { - Destroy(); - - const wchar_t* window_class = - WindowClassRegistrar::GetInstance()->GetWindowClass(); - - const POINT target_point = {static_cast(origin.x), - static_cast(origin.y)}; - HMONITOR monitor = MonitorFromPoint(target_point, MONITOR_DEFAULTTONEAREST); - UINT dpi = FlutterDesktopGetDpiForMonitor(monitor); - double scale_factor = dpi / 96.0; - - HWND window = CreateWindow( - window_class, title.c_str(), WS_OVERLAPPEDWINDOW, - Scale(origin.x, scale_factor), Scale(origin.y, scale_factor), - Scale(size.width, scale_factor), Scale(size.height, scale_factor), - nullptr, nullptr, GetModuleHandle(nullptr), this); - - if (!window) { - return false; - } - - UpdateTheme(window); - - return OnCreate(); -} - -bool Win32Window::Show() { - return ShowWindow(window_handle_, SW_SHOWNORMAL); -} - -// static -LRESULT CALLBACK Win32Window::WndProc(HWND const window, - UINT const message, - WPARAM const wparam, - LPARAM const lparam) noexcept { - if (message == WM_NCCREATE) { - auto window_struct = reinterpret_cast(lparam); - SetWindowLongPtr(window, GWLP_USERDATA, - reinterpret_cast(window_struct->lpCreateParams)); - - auto that = static_cast(window_struct->lpCreateParams); - EnableFullDpiSupportIfAvailable(window); - that->window_handle_ = window; - } else if (Win32Window* that = GetThisFromHandle(window)) { - return that->MessageHandler(window, message, wparam, lparam); - } - - return DefWindowProc(window, message, wparam, lparam); -} - -LRESULT -Win32Window::MessageHandler(HWND hwnd, - UINT const message, - WPARAM const wparam, - LPARAM const lparam) noexcept { - switch (message) { - case WM_DESTROY: - window_handle_ = nullptr; - Destroy(); - if (quit_on_close_) { - PostQuitMessage(0); - } - return 0; - - case WM_DPICHANGED: { - auto newRectSize = reinterpret_cast(lparam); - LONG newWidth = newRectSize->right - newRectSize->left; - LONG newHeight = newRectSize->bottom - newRectSize->top; - - SetWindowPos(hwnd, nullptr, newRectSize->left, newRectSize->top, newWidth, - newHeight, SWP_NOZORDER | SWP_NOACTIVATE); - - return 0; - } - case WM_SIZE: { - RECT rect = GetClientArea(); - if (child_content_ != nullptr) { - // Size and position the child window. - MoveWindow(child_content_, rect.left, rect.top, rect.right - rect.left, - rect.bottom - rect.top, TRUE); - } - return 0; - } - - case WM_ACTIVATE: - if (child_content_ != nullptr) { - SetFocus(child_content_); - } - return 0; - - case WM_DWMCOLORIZATIONCOLORCHANGED: - UpdateTheme(hwnd); - return 0; - } - - return DefWindowProc(window_handle_, message, wparam, lparam); -} - -void Win32Window::Destroy() { - OnDestroy(); - - if (window_handle_) { - DestroyWindow(window_handle_); - window_handle_ = nullptr; - } - if (g_active_window_count == 0) { - WindowClassRegistrar::GetInstance()->UnregisterWindowClass(); - } -} - -Win32Window* Win32Window::GetThisFromHandle(HWND const window) noexcept { - return reinterpret_cast( - GetWindowLongPtr(window, GWLP_USERDATA)); -} - -void Win32Window::SetChildContent(HWND content) { - child_content_ = content; - SetParent(content, window_handle_); - RECT frame = GetClientArea(); - - MoveWindow(content, frame.left, frame.top, frame.right - frame.left, - frame.bottom - frame.top, true); - - SetFocus(child_content_); -} - -RECT Win32Window::GetClientArea() { - RECT frame; - GetClientRect(window_handle_, &frame); - return frame; -} - -HWND Win32Window::GetHandle() { - return window_handle_; -} - -void Win32Window::SetQuitOnClose(bool quit_on_close) { - quit_on_close_ = quit_on_close; -} - -bool Win32Window::OnCreate() { - // No-op; provided for subclasses. - return true; -} - -void Win32Window::OnDestroy() { - // No-op; provided for subclasses. -} - -void Win32Window::UpdateTheme(HWND const window) { - DWORD light_mode; - DWORD light_mode_size = sizeof(light_mode); - LSTATUS result = RegGetValue(HKEY_CURRENT_USER, kGetPreferredBrightnessRegKey, - kGetPreferredBrightnessRegValue, - RRF_RT_REG_DWORD, nullptr, &light_mode, - &light_mode_size); - - if (result == ERROR_SUCCESS) { - BOOL enable_dark_mode = light_mode == 0; - DwmSetWindowAttribute(window, DWMWA_USE_IMMERSIVE_DARK_MODE, - &enable_dark_mode, sizeof(enable_dark_mode)); - } -} diff --git a/apps/driver-archive-cubit/windows/runner/win32_window.h b/apps/driver-archive-cubit/windows/runner/win32_window.h deleted file mode 100755 index e901dde..0000000 --- a/apps/driver-archive-cubit/windows/runner/win32_window.h +++ /dev/null @@ -1,102 +0,0 @@ -#ifndef RUNNER_WIN32_WINDOW_H_ -#define RUNNER_WIN32_WINDOW_H_ - -#include - -#include -#include -#include - -// A class abstraction for a high DPI-aware Win32 Window. Intended to be -// inherited from by classes that wish to specialize with custom -// rendering and input handling -class Win32Window { - public: - struct Point { - unsigned int x; - unsigned int y; - Point(unsigned int x, unsigned int y) : x(x), y(y) {} - }; - - struct Size { - unsigned int width; - unsigned int height; - Size(unsigned int width, unsigned int height) - : width(width), height(height) {} - }; - - Win32Window(); - virtual ~Win32Window(); - - // Creates a win32 window with |title| that is positioned and sized using - // |origin| and |size|. New windows are created on the default monitor. Window - // sizes are specified to the OS in physical pixels, hence to ensure a - // consistent size this function will scale the inputted width and height as - // as appropriate for the default monitor. The window is invisible until - // |Show| is called. Returns true if the window was created successfully. - bool Create(const std::wstring& title, const Point& origin, const Size& size); - - // Show the current window. Returns true if the window was successfully shown. - bool Show(); - - // Release OS resources associated with window. - void Destroy(); - - // Inserts |content| into the window tree. - void SetChildContent(HWND content); - - // Returns the backing Window handle to enable clients to set icon and other - // window properties. Returns nullptr if the window has been destroyed. - HWND GetHandle(); - - // If true, closing this window will quit the application. - void SetQuitOnClose(bool quit_on_close); - - // Return a RECT representing the bounds of the current client area. - RECT GetClientArea(); - - protected: - // Processes and route salient window messages for mouse handling, - // size change and DPI. Delegates handling of these to member overloads that - // inheriting classes can handle. - virtual LRESULT MessageHandler(HWND window, - UINT const message, - WPARAM const wparam, - LPARAM const lparam) noexcept; - - // Called when CreateAndShow is called, allowing subclass window-related - // setup. Subclasses should return false if setup fails. - virtual bool OnCreate(); - - // Called when Destroy is called. - virtual void OnDestroy(); - - private: - friend class WindowClassRegistrar; - - // OS callback called by message pump. Handles the WM_NCCREATE message which - // is passed when the non-client area is being created and enables automatic - // non-client DPI scaling so that the non-client area automatically - // responds to changes in DPI. All other messages are handled by - // MessageHandler. - static LRESULT CALLBACK WndProc(HWND const window, - UINT const message, - WPARAM const wparam, - LPARAM const lparam) noexcept; - - // Retrieves a class instance pointer for |window| - static Win32Window* GetThisFromHandle(HWND const window) noexcept; - - // Update the window frame's theme to match the system theme. - static void UpdateTheme(HWND const window); - - bool quit_on_close_ = false; - - // window handle for top level window. - HWND window_handle_ = nullptr; - - // window handle for hosted content. - HWND child_content_ = nullptr; -}; - -#endif // RUNNER_WIN32_WINDOW_H_ diff --git a/apps/driver_new/.gitignore b/apps/driver_new/.gitignore deleted file mode 100644 index e64ceb9..0000000 --- a/apps/driver_new/.gitignore +++ /dev/null @@ -1,48 +0,0 @@ -# Miscellaneous -*.class -*.log -*.pyc -*.swp -.DS_Store -.atom/ -.build/ -.buildlog/ -.history -.svn/ -.swiftpm/ -migrate_working_dir/ - -# IntelliJ related -*.iml -*.ipr -*.iws -.idea/ - -# The .vscode folder contains launch configuration and tasks you configure in -# VS Code which you may wish to be included in version control, so this line -# is commented out by default. -#.vscode/ - -# Flutter/Dart/Pub related -**/doc/api/ -**/ios/Flutter/.last_build_id -.dart_tool/ -.flutter-plugins-dependencies -.pub-cache/ -.pub/ -/build/ -/coverage/ - -# Symbolication related -app.*.symbols - -# Obfuscation related -app.*.map.json - -# Android Studio will place build artifacts here -/android/app/debug -/android/app/profile -/android/app/release - -# مُولَّد من ARB — لا يُحرَّر -lib/core/l10n/gen/ diff --git a/apps/driver_new/.metadata b/apps/driver_new/.metadata deleted file mode 100644 index d31e83a..0000000 --- a/apps/driver_new/.metadata +++ /dev/null @@ -1,33 +0,0 @@ -# This file tracks properties of this Flutter project. -# Used by Flutter tool to assess capabilities and perform upgrades etc. -# -# This file should be version controlled and should not be manually edited. - -version: - revision: "90673a4eef275d1a6692c26ac80d6d746d41a73a" - channel: "stable" - -project_type: app - -# Tracks metadata for the flutter migrate command -migration: - platforms: - - platform: root - create_revision: 90673a4eef275d1a6692c26ac80d6d746d41a73a - base_revision: 90673a4eef275d1a6692c26ac80d6d746d41a73a - - platform: android - create_revision: 90673a4eef275d1a6692c26ac80d6d746d41a73a - base_revision: 90673a4eef275d1a6692c26ac80d6d746d41a73a - - platform: ios - create_revision: 90673a4eef275d1a6692c26ac80d6d746d41a73a - base_revision: 90673a4eef275d1a6692c26ac80d6d746d41a73a - - # User provided section - - # List of Local paths (relative to this file) that should be - # ignored by the migrate tool. - # - # Files that are not part of the templates will be ignored by default. - unmanaged_files: - - 'lib/main.dart' - - 'ios/Runner.xcodeproj/project.pbxproj' diff --git a/apps/driver_new/README.md b/apps/driver_new/README.md deleted file mode 100644 index cdd8c94..0000000 --- a/apps/driver_new/README.md +++ /dev/null @@ -1,17 +0,0 @@ -# driver_new - -A new Flutter project. - -## Getting Started - -This project is a starting point for a Flutter application. - -A few resources to get you started if this is your first Flutter project: - -- [Learn Flutter](https://docs.flutter.dev/get-started/learn-flutter) -- [Write your first Flutter app](https://docs.flutter.dev/get-started/codelab) -- [Flutter learning resources](https://docs.flutter.dev/reference/learning-resources) - -For help getting started with Flutter development, view the -[online documentation](https://docs.flutter.dev/), which offers tutorials, -samples, guidance on mobile development, and a full API reference. diff --git a/apps/driver_new/analysis_options.yaml b/apps/driver_new/analysis_options.yaml deleted file mode 100644 index 0d29021..0000000 --- a/apps/driver_new/analysis_options.yaml +++ /dev/null @@ -1,28 +0,0 @@ -# This file configures the analyzer, which statically analyzes Dart code to -# check for errors, warnings, and lints. -# -# The issues identified by the analyzer are surfaced in the UI of Dart-enabled -# IDEs (https://dart.dev/tools#ides-and-editors). The analyzer can also be -# invoked from the command line by running `flutter analyze`. - -# The following line activates a set of recommended lints for Flutter apps, -# packages, and plugins designed to encourage good coding practices. -include: package:flutter_lints/flutter.yaml - -linter: - # The lint rules applied to this project can be customized in the - # section below to disable rules from the `package:flutter_lints/flutter.yaml` - # included above or to enable additional rules. A list of all available lints - # and their documentation is published at https://dart.dev/lints. - # - # Instead of disabling a lint rule for the entire project in the - # section below, it can also be suppressed for a single line of code - # or a specific dart file by using the `// ignore: name_of_lint` and - # `// ignore_for_file: name_of_lint` syntax on the line or in the file - # producing the lint. - rules: - # avoid_print: false # Uncomment to disable the `avoid_print` rule - # prefer_single_quotes: true # Uncomment to enable the `prefer_single_quotes` rule - -# Additional information about this file can be found at -# https://dart.dev/guides/language/analysis-options diff --git a/apps/driver_new/android/.gitignore b/apps/driver_new/android/.gitignore deleted file mode 100755 index 16123b5..0000000 --- a/apps/driver_new/android/.gitignore +++ /dev/null @@ -1,14 +0,0 @@ -gradle-wrapper.jar -/.gradle -/captures/ -/gradlew -/gradlew.bat -/local.properties -GeneratedPluginRegistrant.java - -# Remember to never publicly share your keystore. -# See https://flutter.dev/docs/deployment/android#reference-the-keystore-from-the-app -key.properties -gradle.properties -**/*.keystore -**/*.jks diff --git a/apps/driver_new/android/.settings/org.eclipse.buildship.core.prefs b/apps/driver_new/android/.settings/org.eclipse.buildship.core.prefs deleted file mode 100644 index da0e1b9..0000000 --- a/apps/driver_new/android/.settings/org.eclipse.buildship.core.prefs +++ /dev/null @@ -1,13 +0,0 @@ -arguments=--init-script /var/folders/cn/w9j2wl8d11517_kjx3xk_vc00000gn/T/db3b08fc4a9ef609cb16b96b200fa13e563f396e9bb1ed0905fdab7bc3bc513b.gradle --init-script /var/folders/cn/w9j2wl8d11517_kjx3xk_vc00000gn/T/52cde0cfcf3e28b8b7510e992210d9614505e0911af0c190bd590d7158574963.gradle -auto.sync=true -build.scans.enabled=false -connection.gradle.distribution=GRADLE_DISTRIBUTION(WRAPPER) -connection.project.dir= -eclipse.preferences.version=1 -gradle.user.home= -java.home=/Users/hamzaaleghwairyeen/Library/Java/JavaVirtualMachines/openjdk-22.0.2/Contents/Home -jvm.arguments= -offline.mode=false -override.workspace.settings=true -show.console.view=true -show.executions.view=true diff --git a/apps/driver_new/android/app/build.gradle b/apps/driver_new/android/app/build.gradle deleted file mode 100755 index 4509918..0000000 --- a/apps/driver_new/android/app/build.gradle +++ /dev/null @@ -1,130 +0,0 @@ -plugins { - id "com.android.application" - // START: FlutterFire Configuration - id 'com.google.gms.google-services' - // END: FlutterFire Configuration - id "org.jetbrains.kotlin.android" - id "dev.flutter.flutter-gradle-plugin" -} - -def localProperties = new Properties() -def localPropertiesFile = rootProject.file('local.properties') -if (localPropertiesFile.exists()) { - localPropertiesFile.withReader('UTF-8') { reader -> - localProperties.load(reader) - } -} - -def keystoreProperties = new Properties() -def keystorePropertiesFile = rootProject.file('key.properties') -if (keystorePropertiesFile.exists()) { - keystorePropertiesFile.withReader("UTF-8") { reader -> - keystoreProperties.load(reader) - } -} - -def flutterVersionCode = localProperties.getProperty('flutter.versionCode') ?: '12' -def flutterVersionName = localProperties.getProperty('flutter.versionName') ?: '1.1.2' - -android { - namespace "com.sefer_driver" - compileSdk = 36 - ndkVersion "29.0.14033849" - - externalNativeBuild { - cmake { - path "src/main/cpp/CMakeLists.txt" - version "3.22.1" - } - } - // - - defaultConfig { - applicationId "com.sefer_driver" - minSdk 29 - targetSdk 36 - versionCode 152 - versionName '2.0.152' - multiDexEnabled true - ndk { - abiFilters "armeabi-v7a", "arm64-v8a" - } - externalNativeBuild { - cmake { - arguments "-DANDROID_SUPPORT_FLEXIBLE_PAGE_SIZES=ON" - } - } - // استدعاء المفتاح من ملف key.properties - manifestPlaceholders += [mapsApiKey: keystoreProperties['mapsApiKey'] ?: ""] - - } - - signingConfigs { - release { - // Defensively check if properties exist to avoid NullPointerException in BundleTool - if (keystoreProperties.isEmpty()) { - println "BUILD_LOG: ERROR - No properties found in key.properties. Release build will fail." - } else { - storeFile = keystoreProperties['storeFile'] ? file(keystoreProperties['storeFile']) : null - storePassword = keystoreProperties['storePassword'] - keyAlias = keystoreProperties['keyAlias'] - keyPassword = keystoreProperties['keyPassword'] - - // Final check to ensure no crucial signing variable is null - if (!storeFile || !storePassword || !keyAlias || !keyPassword) { - println "BUILD_LOG: ERROR - One or more signing properties are NULL. Check key.properties." - } - } - } - } - - buildTypes { - release { - // Only assign signingConfig if the release config is valid - signingConfig signingConfigs.release - - minifyEnabled true - shrinkResources true - proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' - } - } - - compileOptions { - sourceCompatibility = JavaVersion.VERSION_17 - targetCompatibility = JavaVersion.VERSION_17 - coreLibraryDesugaringEnabled true - } - - kotlinOptions { - jvmTarget = JavaVersion.VERSION_17 - } - - sourceSets { - main { - java.srcDirs += 'src/main/kotlin' - jniLibs.srcDirs = ['src/main/jniLibs'] - } - } -} - -flutter { - source '../..' -} - - -dependencies { - implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version" - // تمت الترقية لتطابق تطبيق الراكب - coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:2.1.5' - - // تمت الترقية لتطابق تطبيق الراكب (لتجنب ملفات 4KB القديمة) - implementation "com.stripe:stripe-android:21.4.2" - implementation 'com.stripe:paymentsheet:21.4.2' - - implementation 'com.scottyab:rootbeer-lib:0.1.0' - - // تمت الترقية لتطابق تطبيق الراكب - implementation 'com.google.android.gms:play-services-safetynet:18.1.0' - - implementation "androidx.concurrent:concurrent-futures:1.2.0" -} \ No newline at end of file diff --git a/apps/driver_new/android/app/proguard-rules.pro b/apps/driver_new/android/app/proguard-rules.pro deleted file mode 100755 index 9af0b7d..0000000 --- a/apps/driver_new/android/app/proguard-rules.pro +++ /dev/null @@ -1,38 +0,0 @@ -# Suppress warnings for specific Google ML Kit and Stripe classes --dontwarn com.google.mlkit.vision.text.chinese.ChineseTextRecognizerOptions$Builder --dontwarn com.google.mlkit.vision.text.chinese.ChineseTextRecognizerOptions --dontwarn com.google.mlkit.vision.text.devanagari.DevanagariTextRecognizerOptions$Builder --dontwarn com.google.mlkit.vision.text.devanagari.DevanagariTextRecognizerOptions --dontwarn com.google.mlkit.vision.text.japanese.JapaneseTextRecognizerOptions$Builder --dontwarn com.google.mlkit.vision.text.japanese.JapaneseTextRecognizerOptions --dontwarn com.google.mlkit.vision.text.korean.KoreanTextRecognizerOptions$Builder --dontwarn com.google.mlkit.vision.text.korean.KoreanTextRecognizerOptions --dontwarn com.stripe.android.pushProvisioning.PushProvisioningActivity$g --dontwarn com.stripe.android.pushProvisioning.PushProvisioningActivityStarter$Args --dontwarn com.stripe.android.pushProvisioning.PushProvisioningActivityStarter$Error --dontwarn com.stripe.android.pushProvisioning.PushProvisioningActivityStarter --dontwarn com.stripe.android.pushProvisioning.PushProvisioningEphemeralKeyProvider - -# Keep rules for Google ML Kit --keep class com.google.mlkit.vision.** { *; } --keep class com.google.mlkit.vision.text.** { *; } --keep class com.google.mlkit.vision.text.chinese.ChineseTextRecognizerOptions { *; } --keep class com.google.mlkit.vision.text.chinese.ChineseTextRecognizerOptions$Builder { *; } --keep class com.google.mlkit.vision.text.devanagari.DevanagariTextRecognizerOptions { *; } --keep class com.google.mlkit.vision.text.devanagari.DevanagariTextRecognizerOptions$Builder { *; } --keep class com.google.mlkit.vision.text.japanese.JapaneseTextRecognizerOptions { *; } --keep class com.google.mlkit.vision.text.japanese.JapaneseTextRecognizerOptions$Builder { *; } --keep class com.google.mlkit.vision.text.korean.KoreanTextRecognizerOptions { *; } --keep class com.google.mlkit.vision.text.korean.KoreanTextRecognizerOptions$Builder { *; } - -# Keep rules for Stripe --keep class com.stripe.android.** { *; } --keep class com.stripe.android.pushProvisioning.** { *; } --keep class com.yalantis.ucrop.** { *; } --keep class com.yalantis.ucrop.util.** { *; } - -# منع قراءة كود RootDetection -#-keep class com.sefer_driver.RootDetection { *; } --keep class com.sefer_driver.RootDetection { - native ; - } \ No newline at end of file diff --git a/apps/driver_new/android/app/src/debug/AndroidManifest.xml b/apps/driver_new/android/app/src/debug/AndroidManifest.xml deleted file mode 100755 index 399f698..0000000 --- a/apps/driver_new/android/app/src/debug/AndroidManifest.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - diff --git a/apps/driver_new/android/app/src/main/AndroidManifest.xml b/apps/driver_new/android/app/src/main/AndroidManifest.xml deleted file mode 100755 index d82148f..0000000 --- a/apps/driver_new/android/app/src/main/AndroidManifest.xml +++ /dev/null @@ -1,176 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/apps/driver_new/android/app/src/main/cpp/CMakeLists.txt b/apps/driver_new/android/app/src/main/cpp/CMakeLists.txt deleted file mode 100755 index 8c11893..0000000 --- a/apps/driver_new/android/app/src/main/cpp/CMakeLists.txt +++ /dev/null @@ -1,11 +0,0 @@ -cmake_minimum_required(VERSION 3.10.2) # 3.10.2 is fine, but no need to go as high as 3.31.5 -project(sefer_driver) # Good - -# Add your C++ source file(s) to create a SHARED library. -add_library(native-lib SHARED native-lib.cpp) - -# Find the Android log library. -find_library(log-lib log) - -# Link your library against the log library. This is essential for debugging. -target_link_libraries(native-lib ${log-lib}) \ No newline at end of file diff --git a/apps/driver_new/android/app/src/main/cpp/native-lib.cpp b/apps/driver_new/android/app/src/main/cpp/native-lib.cpp deleted file mode 100755 index 2238fda..0000000 --- a/apps/driver_new/android/app/src/main/cpp/native-lib.cpp +++ /dev/null @@ -1,167 +0,0 @@ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include // Add this line - - -#define LOG_TAG "NativeLib" -#define LOGD(...) __android_log_print(ANDROID_LOG_DEBUG, LOG_TAG, __VA_ARGS__) -#define LOGE(...) __android_log_print(ANDROID_LOG_ERROR, LOG_TAG, __VA_ARGS__) - -// Function to check for common root binaries -bool isRooted() { - std::string paths[] = { - "/system/app/Superuser.apk", - "/system/xbin/su", - "/system/bin/su", - "/system/bin/magisk", - "/system/xbin/magisk", - "/sbin/magisk" - }; - - for (const auto &path : paths) { - std::ifstream file(path); - if (file.good()) { - return true; - } - } - return false; -} - -// Function to check for the presence of files or directories commonly associated with Frida. -bool checkFridaFiles() { - std::string fridaFiles[] = { - "/data/local/tmp/re.frida.server", //Common Frida server path - "/data/local/tmp/frida-server", - "/usr/lib/libfrida-gadget.so", // Frida gadget (injected library) - "/usr/lib64/libfrida-gadget.so", - "/data/local/re.frida.server", - - }; - - for (const auto &path : fridaFiles) { - if (access(path.c_str(), F_OK) != -1) { - LOGE("Frida file detected: %s", path.c_str()); - return true; - } - } - return false; -} - -// Checks for open ports commonly used by Frida. This is less reliable, as ports can be changed. -bool checkFridaPorts() { - int sock = socket(AF_INET, SOCK_STREAM, 0); - if (sock == -1) { - return false; // Couldn't create socket, not a strong indicator. - } - - sockaddr_in sa; - memset(&sa, 0, sizeof(sa)); - sa.sin_family = AF_INET; - sa.sin_port = htons(27042); // Default Frida port - inet_pton(AF_INET, "127.0.0.1", &sa.sin_addr); - - if (connect(sock, (struct sockaddr *)&sa, sizeof(sa)) != -1) { - LOGE("Frida default port (27042) is open."); - close(sock); - return true; - } - - close(sock); - return false; -} - -// Check the maps file of the current process for any suspicious entries. -bool checkMaps() { - std::ifstream mapsFile("/proc/self/maps"); - std::string line; - - if (mapsFile.is_open()) { - while (std::getline(mapsFile, line)) { - // Look for lines that indicate injected libraries, especially Frida. - if (line.find("frida") != std::string::npos || - line.find("gum-js-") != std::string::npos) { // Gum is Frida's JavaScript engine - LOGE("Suspicious entry in /proc/self/maps: %s", line.c_str()); - return true; - } - } - mapsFile.close(); - } else - { - LOGE("Could not open /proc/self/maps"); - return false; - } - return false; -} - -// Check loaded modules. -bool checkLoadedModules() { - bool found = false; - dl_iterate_phdr([](struct dl_phdr_info *info, size_t size, void *data) { - bool *found_ptr = static_cast(data); - if (std::string(info->dlpi_name).find("frida") != std::string::npos) { - LOGE("Frida module detected: %s", info->dlpi_name); - *found_ptr = true; - return 1; // Stop iterating - } - return 0; // Continue iterating - }, &found); - - return found; -} - - -// This is a simple ptrace check. More sophisticated checks are possible (and necessary for robust detection). -//bool checkPtrace() { -// // Attempt to ptrace ourselves. If another process is already tracing us, this will fail. -// if (ptrace(PTRACE_TRACEME, 0, 1, 0) < 0) { -// LOGE("ptrace failed. Debugger or tracer detected."); -// return true; // Likely being traced -// } -// // Detach. If attached, need to detach to not interfere. -// ptrace(PTRACE_DETACH, 0, 0, 0); -// return false; -//} - -extern "C" -JNIEXPORT jboolean JNICALL -Java_com_sefer_1driver_RootDetection_isNativeRooted(JNIEnv *env, jobject /* this */) { - - if (isRooted()) { - return JNI_TRUE; - } - - if (checkFridaFiles()) { - return JNI_TRUE; - } - - if (checkFridaPorts()) { - return JNI_TRUE; - } - if (checkMaps()) { - return JNI_TRUE; - } - - if (checkLoadedModules()) { - return JNI_TRUE; - } - -// if (checkPtrace()) { -// return JNI_TRUE; -// } - - return JNI_FALSE; -} \ No newline at end of file diff --git a/apps/driver_new/android/app/src/main/java/com/sefer_driver/MyFirebaseMessagingService.kt b/apps/driver_new/android/app/src/main/java/com/sefer_driver/MyFirebaseMessagingService.kt deleted file mode 100755 index 6fb47a0..0000000 --- a/apps/driver_new/android/app/src/main/java/com/sefer_driver/MyFirebaseMessagingService.kt +++ /dev/null @@ -1,15 +0,0 @@ -package com.sefer_driver - -import android.app.IntentService -import android.content.Intent -import android.content.Context - -// TODO: Rename actions, choose action names that describe tasks that this -// IntentService can perform, e.g. ACTION_FETCH_NEW_ITEMS -private const val ACTION_FOO = "com.sefer_driver.action.FOO" -private const val ACTION_BAZ = "com.sefer_driver.action.BAZ" - -// TODO: Rename parameters -private const val EXTRA_PARAM1 = "com.sefer_driver.extra.PARAM1" -private const val EXTRA_PARAM2 = "com.sefer_driver.extra.PARAM2" - diff --git a/apps/driver_new/android/app/src/main/kotlin/com/sefer_driver/MainActivity.kt b/apps/driver_new/android/app/src/main/kotlin/com/sefer_driver/MainActivity.kt deleted file mode 100755 index c79a62a..0000000 --- a/apps/driver_new/android/app/src/main/kotlin/com/sefer_driver/MainActivity.kt +++ /dev/null @@ -1,190 +0,0 @@ -package com.sefer_driver - -import android.app.AlertDialog -import android.content.Intent -import android.os.Bundle -import android.util.Log -import android.widget.LinearLayout -import android.widget.ProgressBar -import android.widget.TextView -import androidx.core.view.setPadding -import com.scottyab.rootbeer.RootBeer -import io.flutter.embedding.android.FlutterFragmentActivity -import io.flutter.embedding.engine.FlutterEngine -import io.flutter.plugin.common.MethodChannel -import java.io.File -import java.util.Timer -import kotlin.concurrent.schedule - -class MainActivity : FlutterFragmentActivity() { - private val SECURITY_CHANNEL = "com.sefer_driver/security" - private val APP_CONTROL_CHANNEL = "com.sefer_driver/app_control" - - // 🔴 1. تعريف القناة لتكون متاحة للوصول من الدوال الأخرى - private var appControlChannel: MethodChannel? = null - - override fun configureFlutterEngine(flutterEngine: FlutterEngine) { - super.configureFlutterEngine(flutterEngine) - - // 🔴 2. تهيئة القناة هنا - appControlChannel = - MethodChannel(flutterEngine.dartExecutor.binaryMessenger, APP_CONTROL_CHANNEL) - - // Channel for security checks (isRooted) - MethodChannel(flutterEngine.dartExecutor.binaryMessenger, SECURITY_CHANNEL) - .setMethodCallHandler { call, result -> - when (call.method) { - "isNativeRooted" -> result.success(isDeviceCompromised()) - else -> result.notImplemented() - } - } - - // Channel for app control (bringing to foreground & overlay events) - appControlChannel?.setMethodCallHandler { call, result -> - when (call.method) { - "bringToForeground" -> { - Log.d("MainActivity", "Received bringToForeground request") - val intent = - Intent(this, MainActivity::class.java).apply { - action = Intent.ACTION_MAIN - addCategory(Intent.CATEGORY_LAUNCHER) - addFlags( - Intent.FLAG_ACTIVITY_NEW_TASK or - Intent.FLAG_ACTIVITY_CLEAR_TOP or - Intent.FLAG_ACTIVITY_SINGLE_TOP - ) - } - try { - startActivity(intent) - Log.d("MainActivity", "App brought to foreground successfully") - result.success(true) - } catch (e: Exception) { - Log.e("MainActivity", "Error bringing app to foreground", e) - result.error("ACTIVITY_START_FAILED", e.message, e.stackTraceToString()) - } - } - else -> result.notImplemented() - } - } - } - - override fun onCreate(savedInstanceState: Bundle?) { - super.onCreate(savedInstanceState) - Log.d("MainActivity", "MainActivity onCreate") - if (isDeviceCompromised()) { - showSecurityWarningDialog() - } - - // 🔴 3. فحص نية فتح التطبيق (هل جاء من زر قبول النافذة؟) - checkIntentForOverlayAccept(intent) - } - - override fun onNewIntent(intent: Intent) { - super.onNewIntent(intent) - setIntent(intent) - Log.d("MainActivity", "Received new intent: ${intent.action}") - - // 🔴 4. فحص نية التطبيق عند الفتح من الخلفية - checkIntentForOverlayAccept(intent) - } - - // ========================================================================= - // 🔴 5. الدالة السحرية لالتقاط زر القبول وإرساله للـ Flutter 🔴 - // ========================================================================= - private fun checkIntentForOverlayAccept(intent: Intent) { - val acceptedTripId = intent.getStringExtra("acceptedTripId") - if (acceptedTripId != null) { - Log.d("MainActivity", "✅ Trip accepted via Native Intent: $acceptedTripId") - // إرسال الإشارة عبر القناة لتطبيق فلاتر - appControlChannel?.invokeMethod("onOverlayTripAccepted", acceptedTripId) - // مسح البيانات حتى لا تتكرر العملية إذا أغلق السائق التطبيق وفتحه يدوياً - intent.removeExtra("acceptedTripId") - } - } - - // ========================================================================= - // --- دوال الحماية الخاصة بك (لم يتم المساس بها) --- - // ========================================================================= - private fun isDeviceCompromised(): Boolean { - return try { - val isRootedByRootBeer = RootBeer(this).isRooted - Log.d("MainActivity", "Root check result: $isRootedByRootBeer") - isRootedByRootBeer - } catch (e: Exception) { - Log.e("MainActivity", "Security check error: ${e.message}", e) - true // Fail-safe: assume compromised if check fails - } - } - - private fun showSecurityWarningDialog() { - var secondsRemaining = 10 - val progressBar = - ProgressBar(this, null, android.R.attr.progressBarStyleHorizontal).apply { - max = 10 - progress = 10 - } - val textView = - TextView(this).apply { - text = getString(R.string.security_warning_message) - textAlignment = TextView.TEXT_ALIGNMENT_CENTER - } - val layout = - LinearLayout(this).apply { - orientation = LinearLayout.VERTICAL - setPadding(48) - addView(textView) - addView(progressBar) - } - val dialog = - AlertDialog.Builder(this) - .setTitle(getString(R.string.security_warning_title)) - .setView(layout) - .setCancelable(false) - .create() - dialog.show() - val timer = Timer() - timer.schedule(0, 1000) { - secondsRemaining-- - runOnUiThread { - progressBar.progress = secondsRemaining - if (secondsRemaining <= 0) { - timer.cancel() - dialog.dismiss() - clearAppDataAndExit() - } - } - } - } - - private fun clearAppDataAndExit() { - try { - Runtime.getRuntime().exec("pm clear $packageName") - Log.d("MainActivity", "Cleared app data via package manager") - } catch (e: Exception) { - Log.e("MainActivity", "Error clearing app data: ${e.message}", e) - clearCache() - clearAppData() - } - finishAffinity() - System.exit(0) - } - - private fun clearCache() { - deleteDir(cacheDir) - deleteDir(externalCacheDir) - Log.d("MainActivity", "Cleared cache directories") - } - - private fun clearAppData() { - Log.d("MainActivity", "App data clearing skipped (commented out)") - } - - private fun deleteDir(dir: File?): Boolean { - if (dir != null && dir.isDirectory) { - dir.list()?.forEach { deleteDir(File(dir, it)) } - } - val deleted = dir?.delete() ?: false - Log.d("MainActivity", "Deleted directory ${dir?.path}: $deleted") - return deleted - } -} diff --git a/apps/driver_new/android/app/src/main/kotlin/com/sefer_driver/MyApplication.kt b/apps/driver_new/android/app/src/main/kotlin/com/sefer_driver/MyApplication.kt deleted file mode 100755 index 75b7ece..0000000 --- a/apps/driver_new/android/app/src/main/kotlin/com/sefer_driver/MyApplication.kt +++ /dev/null @@ -1,41 +0,0 @@ -package com.sefer_driver - -import android.app.Application -import android.content.Intent -import io.flutter.embedding.engine.FlutterEngine -import io.flutter.embedding.engine.dart.DartExecutor -import io.flutter.plugin.common.MethodChannel - -class MyApplication : Application() { - companion object { - lateinit var instance: MyApplication - private set - - val flutterEngine: FlutterEngine by lazy { - FlutterEngine(instance).apply { - dartExecutor.executeDartEntrypoint(DartExecutor.DartEntrypoint.createDefault()) - } - } - } - - override fun onCreate() { - super.onCreate() - instance = this - - MethodChannel(flutterEngine.dartExecutor.binaryMessenger, "com.sefer_driver/app_lifecycle") - .setMethodCallHandler { call, result -> - if (call.method == "bringAppToForeground") { - bringAppToForeground() - result.success(null) - } else { - result.notImplemented() - } - } - } - - private fun bringAppToForeground() { - val intent = Intent(applicationContext, MainActivity::class.java) - intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_REORDER_TO_FRONT) - startActivity(intent) - } -} diff --git a/apps/driver_new/android/app/src/main/kotlin/com/sefer_driver/RootDetection.kt b/apps/driver_new/android/app/src/main/kotlin/com/sefer_driver/RootDetection.kt deleted file mode 100755 index 7dbadd6..0000000 --- a/apps/driver_new/android/app/src/main/kotlin/com/sefer_driver/RootDetection.kt +++ /dev/null @@ -1,10 +0,0 @@ - -package com.sefer_driver - -object RootDetection { - init { - System.loadLibrary("native-lib") // Load the native library - } - - external fun isNativeRooted(): Boolean // Declare the external function -} diff --git a/apps/driver_new/android/app/src/main/kotlin/com/sefer_driver/SafetyNetCheck.kt b/apps/driver_new/android/app/src/main/kotlin/com/sefer_driver/SafetyNetCheck.kt deleted file mode 100755 index 1b8593b..0000000 --- a/apps/driver_new/android/app/src/main/kotlin/com/sefer_driver/SafetyNetCheck.kt +++ /dev/null @@ -1,109 +0,0 @@ -import android.content.Context -import android.util.Base64 -import android.util.Log -import com.google.android.gms.safetynet.SafetyNet -import com.google.android.gms.safetynet.SafetyNetApi -import com.google.android.gms.tasks.OnFailureListener -import com.google.android.gms.tasks.OnSuccessListener -import org.json.JSONObject -import java.io.IOException -import java.security.GeneralSecurityException -import java.security.SecureRandom -import java.util.Arrays - -object SafetyNetCheck { - - private const val TAG = "SafetyNetCheck" - - fun checkSafetyNet(context: Context, apiKey: String, callback: (Boolean) -> Unit) { - // Generate a nonce. A good nonce is large, random, and used only once. - val nonce = generateNonce() - - SafetyNet.getClient(context).attest(nonce, apiKey) - .addOnSuccessListener { response -> - // Success! Now, *verify* the response. - val jwsResult = response.jwsResult - if (jwsResult != null) { - try { - val isSafe = SafetyNetResponseVerifier.verify(jwsResult) - Log.d(TAG, "SafetyNet verification result: $isSafe") - callback(isSafe) // Now passing a *verified* result. - } catch (e: Exception) { - Log.e(TAG, "Error verifying SafetyNet response: ${e.message}", e) - callback(false) // Treat verification errors as failures. - } - } else { - Log.e(TAG, "SafetyNet jwsResult is null") - callback(false) // Null result is a failure. - } - } - .addOnFailureListener { e -> - Log.e(TAG, "SafetyNet attest API call failed: ${e.message}", e) - callback(false) // API call failure. - } - } - - - // Helper function to generate a nonce. - private fun generateNonce(): ByteArray { - val byteGenerator = SecureRandom() - val nonce = ByteArray(32) - byteGenerator.nextBytes(nonce) - return nonce - } -} - - - -// Helper class to verify the SafetyNet response. -object SafetyNetResponseVerifier { - - private const val TAG = "SafetyNetVerifier" - - // This method *must* be implemented on a *backend server* for real security. - // This is just a *simplified example* for demonstration purposes and is - // *not* suitable for production without a backend check. - @Throws(GeneralSecurityException::class, IOException::class) - fun verify(jwsResult: String): Boolean { - // 1. Parse the JWS: Split into header, payload, and signature. - val parts = jwsResult.split(".") - if (parts.size != 3) { - Log.e(TAG, "Invalid JWS format") - return false // Invalid JWS format - } - - val header = parts[0] - val payload = parts[1] - val signature = parts[2] - - // 2. Decode the payload (it's Base64 encoded). - val decodedPayload = Base64.decode(payload, Base64.DEFAULT) - val payloadJson = JSONObject(String(decodedPayload)) - - // 3. Check the ctsProfileMatch and basicIntegrity. - val ctsProfileMatch = payloadJson.optBoolean("ctsProfileMatch", false) - val basicIntegrity = payloadJson.optBoolean("basicIntegrity", false) - - Log.d(TAG, "ctsProfileMatch: $ctsProfileMatch, basicIntegrity: $basicIntegrity") - - // 4. **CRITICAL: In a real application, you *must* send the JWS to your - // backend server for verification. The server should use the - // Google SafetyNet API (or a library that wraps it) to verify - // the signature and check the fields. This prevents attackers - // from tampering with the response on the device.** - // - // // Example (pseudo-code) of what the backend check would do: - // // GoogleCredential credential = ...; - // // SafetyNet safetyNet = new SafetyNet.Builder(httpTransport, jsonFactory) - // // .setApplicationName("YourAppName") - // // .setHttpRequestInitializer(credential) - // // .build(); - // // SafetyNetApi.VerifyJwsRequest request = safetyNet.safetynet().verifyJws(jwsResult); - // // SafetyNetApi.VerifyJwsResponse response = request.execute(); - // // return response.isValidSignature() && response.getCtsProfileMatch() && response.getBasicIntegrity(); - - // 5. For this *example* (without a backend), we'll just check the fields. - // This is *NOT SECURE* for production! - return ctsProfileMatch && basicIntegrity - } -} \ No newline at end of file diff --git a/apps/driver_new/android/app/src/main/res/drawable-v21/launch_background.xml b/apps/driver_new/android/app/src/main/res/drawable-v21/launch_background.xml deleted file mode 100755 index f74085f..0000000 --- a/apps/driver_new/android/app/src/main/res/drawable-v21/launch_background.xml +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - - - diff --git a/apps/driver_new/android/app/src/main/res/drawable/app_icon.png b/apps/driver_new/android/app/src/main/res/drawable/app_icon.png deleted file mode 100755 index c811875..0000000 Binary files a/apps/driver_new/android/app/src/main/res/drawable/app_icon.png and /dev/null differ diff --git a/apps/driver_new/android/app/src/main/res/drawable/launch_background.xml b/apps/driver_new/android/app/src/main/res/drawable/launch_background.xml deleted file mode 100755 index f0bf5d4..0000000 --- a/apps/driver_new/android/app/src/main/res/drawable/launch_background.xml +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - - - \ No newline at end of file diff --git a/apps/driver_new/android/app/src/main/res/drawable/launcher_icon.png b/apps/driver_new/android/app/src/main/res/drawable/launcher_icon.png deleted file mode 100755 index cb1d9cd..0000000 Binary files a/apps/driver_new/android/app/src/main/res/drawable/launcher_icon.png and /dev/null differ diff --git a/apps/driver_new/android/app/src/main/res/layout/custom_notification.xml b/apps/driver_new/android/app/src/main/res/layout/custom_notification.xml deleted file mode 100755 index b9b0215..0000000 --- a/apps/driver_new/android/app/src/main/res/layout/custom_notification.xml +++ /dev/null @@ -1,21 +0,0 @@ - - - - - - - - \ No newline at end of file diff --git a/apps/driver_new/android/app/src/main/res/mipmap-hdpi/launcher_icon.png b/apps/driver_new/android/app/src/main/res/mipmap-hdpi/launcher_icon.png deleted file mode 100755 index d382e98..0000000 Binary files a/apps/driver_new/android/app/src/main/res/mipmap-hdpi/launcher_icon.png and /dev/null differ diff --git a/apps/driver_new/android/app/src/main/res/mipmap-mdpi/launcher_icon.png b/apps/driver_new/android/app/src/main/res/mipmap-mdpi/launcher_icon.png deleted file mode 100755 index ba38ec5..0000000 Binary files a/apps/driver_new/android/app/src/main/res/mipmap-mdpi/launcher_icon.png and /dev/null differ diff --git a/apps/driver_new/android/app/src/main/res/mipmap-xhdpi/launcher_icon.png b/apps/driver_new/android/app/src/main/res/mipmap-xhdpi/launcher_icon.png deleted file mode 100755 index c00c762..0000000 Binary files a/apps/driver_new/android/app/src/main/res/mipmap-xhdpi/launcher_icon.png and /dev/null differ diff --git a/apps/driver_new/android/app/src/main/res/mipmap-xxhdpi/launcher_icon.png b/apps/driver_new/android/app/src/main/res/mipmap-xxhdpi/launcher_icon.png deleted file mode 100755 index 71d0444..0000000 Binary files a/apps/driver_new/android/app/src/main/res/mipmap-xxhdpi/launcher_icon.png and /dev/null differ diff --git a/apps/driver_new/android/app/src/main/res/mipmap-xxxhdpi/launcher_icon.png b/apps/driver_new/android/app/src/main/res/mipmap-xxxhdpi/launcher_icon.png deleted file mode 100755 index f46d9d0..0000000 Binary files a/apps/driver_new/android/app/src/main/res/mipmap-xxxhdpi/launcher_icon.png and /dev/null differ diff --git a/apps/driver_new/android/app/src/main/res/raw/app_icon.png b/apps/driver_new/android/app/src/main/res/raw/app_icon.png deleted file mode 100755 index 96cc55a..0000000 Binary files a/apps/driver_new/android/app/src/main/res/raw/app_icon.png and /dev/null differ diff --git a/apps/driver_new/android/app/src/main/res/raw/cancel.wav b/apps/driver_new/android/app/src/main/res/raw/cancel.wav deleted file mode 100755 index dbe6e7c..0000000 Binary files a/apps/driver_new/android/app/src/main/res/raw/cancel.wav and /dev/null differ diff --git a/apps/driver_new/android/app/src/main/res/raw/ding.wav b/apps/driver_new/android/app/src/main/res/raw/ding.wav deleted file mode 100755 index c53cd50..0000000 Binary files a/apps/driver_new/android/app/src/main/res/raw/ding.wav and /dev/null differ diff --git a/apps/driver_new/android/app/src/main/res/raw/iphone_ringtone.wav b/apps/driver_new/android/app/src/main/res/raw/iphone_ringtone.wav deleted file mode 100755 index aee314f..0000000 Binary files a/apps/driver_new/android/app/src/main/res/raw/iphone_ringtone.wav and /dev/null differ diff --git a/apps/driver_new/android/app/src/main/res/raw/order.wav b/apps/driver_new/android/app/src/main/res/raw/order.wav deleted file mode 100755 index b2b0ba2..0000000 Binary files a/apps/driver_new/android/app/src/main/res/raw/order.wav and /dev/null differ diff --git a/apps/driver_new/android/app/src/main/res/raw/order1.wav b/apps/driver_new/android/app/src/main/res/raw/order1.wav deleted file mode 100755 index 919fdda..0000000 Binary files a/apps/driver_new/android/app/src/main/res/raw/order1.wav and /dev/null differ diff --git a/apps/driver_new/android/app/src/main/res/raw/promo.wav b/apps/driver_new/android/app/src/main/res/raw/promo.wav deleted file mode 100755 index 3bb2d03..0000000 Binary files a/apps/driver_new/android/app/src/main/res/raw/promo.wav and /dev/null differ diff --git a/apps/driver_new/android/app/src/main/res/raw/start.wav b/apps/driver_new/android/app/src/main/res/raw/start.wav deleted file mode 100755 index 0655506..0000000 Binary files a/apps/driver_new/android/app/src/main/res/raw/start.wav and /dev/null differ diff --git a/apps/driver_new/android/app/src/main/res/raw/tone1.mp3 b/apps/driver_new/android/app/src/main/res/raw/tone1.mp3 deleted file mode 100755 index e32e61b..0000000 Binary files a/apps/driver_new/android/app/src/main/res/raw/tone1.mp3 and /dev/null differ diff --git a/apps/driver_new/android/app/src/main/res/raw/tone2.wav b/apps/driver_new/android/app/src/main/res/raw/tone2.wav deleted file mode 100755 index 0582d47..0000000 Binary files a/apps/driver_new/android/app/src/main/res/raw/tone2.wav and /dev/null differ diff --git a/apps/driver_new/android/app/src/main/res/values-ar/strings.xml b/apps/driver_new/android/app/src/main/res/values-ar/strings.xml deleted file mode 100755 index 6b7cb35..0000000 --- a/apps/driver_new/android/app/src/main/res/values-ar/strings.xml +++ /dev/null @@ -1,6 +0,0 @@ - - تحذير أمني - تم اكتشاف مشكلة أمنية أو تعديل على هذا الجهاز. لا يمكن تشغيل التطبيق على هذا الجهاز. - إغلاق التطبيق - الجهاز آمن. الاستمرار بشكل طبيعي. - \ No newline at end of file diff --git a/apps/driver_new/android/app/src/main/res/values-night/styles.xml b/apps/driver_new/android/app/src/main/res/values-night/styles.xml deleted file mode 100755 index 60a2b7e..0000000 --- a/apps/driver_new/android/app/src/main/res/values-night/styles.xml +++ /dev/null @@ -1,20 +0,0 @@ - - - - - - - - - diff --git a/apps/driver_new/android/app/src/main/res/values/strings.xml b/apps/driver_new/android/app/src/main/res/values/strings.xml deleted file mode 100755 index e045415..0000000 --- a/apps/driver_new/android/app/src/main/res/values/strings.xml +++ /dev/null @@ -1,15 +0,0 @@ - - My App - high_importance_channel - kffk - AIzaSyB04YNW3LbvmQ5lX1t2bOwEU18- - FCM Notifications - Notifications from Firebase Cloud Messaging - Security Warning - A security issue or modification has been detected on - this device. The app cannot run on this device. - Exit App - Device is secure. Proceeding normally. - - - \ No newline at end of file diff --git a/apps/driver_new/android/app/src/main/res/values/styles.xml b/apps/driver_new/android/app/src/main/res/values/styles.xml deleted file mode 100755 index 80796a9..0000000 --- a/apps/driver_new/android/app/src/main/res/values/styles.xml +++ /dev/null @@ -1,20 +0,0 @@ - - - - - - - - - diff --git a/apps/driver_new/android/app/src/main/res/xml/network_security_config.xml b/apps/driver_new/android/app/src/main/res/xml/network_security_config.xml deleted file mode 100644 index 7328fde..0000000 --- a/apps/driver_new/android/app/src/main/res/xml/network_security_config.xml +++ /dev/null @@ -1,24 +0,0 @@ - - - - - - - - - - - - - tripz-egypt.com - - - - - - - - - - - \ No newline at end of file diff --git a/apps/driver_new/android/app/src/profile/AndroidManifest.xml b/apps/driver_new/android/app/src/profile/AndroidManifest.xml deleted file mode 100755 index 399f698..0000000 --- a/apps/driver_new/android/app/src/profile/AndroidManifest.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - diff --git a/apps/driver_new/android/build.gradle b/apps/driver_new/android/build.gradle deleted file mode 100755 index 4b28098..0000000 --- a/apps/driver_new/android/build.gradle +++ /dev/null @@ -1,52 +0,0 @@ -buildscript { - ext.kotlin_version = '2.3.10' - repositories { - google() - mavenCentral() - } - dependencies { - classpath 'com.android.tools.build:gradle:8.13.2' - classpath 'com.google.gms:google-services:4.3.15' - classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" - } -} - -allprojects { - repositories { - google() - mavenCentral() - } -} - -rootProject.buildDir = '../build' - -subprojects { - project.buildDir = "${rootProject.buildDir}/${project.name}" - project.evaluationDependsOn(':app') - - def setupAndroid = { - if (project.plugins.hasPlugin('com.android.library') || project.plugins.hasPlugin('com.android.application')) { - project.android { - if (namespace == null || namespace == "") { - namespace = project.group - } - compileSdk 36 - defaultConfig { - targetSdk 36 - } - } - } - } - - if (project.state.executed) { - setupAndroid() - } else { - project.afterEvaluate { - setupAndroid() - } - } -} - -tasks.register("clean", Delete) { - delete rootProject.buildDir -} \ No newline at end of file diff --git a/apps/driver_new/android/gradle/wrapper/gradle-wrapper.properties b/apps/driver_new/android/gradle/wrapper/gradle-wrapper.properties deleted file mode 100755 index a667694..0000000 --- a/apps/driver_new/android/gradle/wrapper/gradle-wrapper.properties +++ /dev/null @@ -1,7 +0,0 @@ - - -distributionBase=GRADLE_USER_HOME -distributionPath=wrapper/dists -zipStoreBase=GRADLE_USER_HOME -zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.13-all.zip diff --git a/apps/driver_new/android/settings.gradle b/apps/driver_new/android/settings.gradle deleted file mode 100755 index 9dae921..0000000 --- a/apps/driver_new/android/settings.gradle +++ /dev/null @@ -1,25 +0,0 @@ -pluginManagement { - def flutterSdkPath = { - def properties = new Properties() - file("local.properties").withInputStream { properties.load(it) } - def flutterSdkPath = properties.getProperty("flutter.sdk") - assert flutterSdkPath != null, "flutter.sdk not set in local.properties" - return flutterSdkPath - }() - includeBuild("$flutterSdkPath/packages/flutter_tools/gradle") - repositories { - google() - mavenCentral() - gradlePluginPortal() - } -} - -plugins { - id "dev.flutter.flutter-plugin-loader" version "1.0.0" - id "com.android.application" version '8.13.2' apply false - id "com.google.gms.google-services" version "4.3.15" apply false - id "org.jetbrains.kotlin.android" version "2.3.10" apply false -} - -include ":app" - diff --git a/apps/driver_new/assets/aggrement.wav b/apps/driver_new/assets/aggrement.wav deleted file mode 100644 index c82ef23..0000000 Binary files a/apps/driver_new/assets/aggrement.wav and /dev/null differ diff --git a/apps/driver_new/assets/alert.wav b/apps/driver_new/assets/alert.wav deleted file mode 100644 index 8722536..0000000 Binary files a/apps/driver_new/assets/alert.wav and /dev/null differ diff --git a/apps/driver_new/assets/fonts/IBMPlexSansArabic-Bold.ttf b/apps/driver_new/assets/fonts/IBMPlexSansArabic-Bold.ttf deleted file mode 100644 index d67d9e8..0000000 Binary files a/apps/driver_new/assets/fonts/IBMPlexSansArabic-Bold.ttf and /dev/null differ diff --git a/apps/driver_new/assets/fonts/IBMPlexSansArabic-Medium.ttf b/apps/driver_new/assets/fonts/IBMPlexSansArabic-Medium.ttf deleted file mode 100644 index 09ec8da..0000000 Binary files a/apps/driver_new/assets/fonts/IBMPlexSansArabic-Medium.ttf and /dev/null differ diff --git a/apps/driver_new/assets/fonts/IBMPlexSansArabic-Regular.ttf b/apps/driver_new/assets/fonts/IBMPlexSansArabic-Regular.ttf deleted file mode 100644 index 5e19284..0000000 Binary files a/apps/driver_new/assets/fonts/IBMPlexSansArabic-Regular.ttf and /dev/null differ diff --git a/apps/driver_new/assets/fonts/IBMPlexSansArabic-SemiBold.ttf b/apps/driver_new/assets/fonts/IBMPlexSansArabic-SemiBold.ttf deleted file mode 100644 index 6b48c75..0000000 Binary files a/apps/driver_new/assets/fonts/IBMPlexSansArabic-SemiBold.ttf and /dev/null differ diff --git a/apps/driver_new/assets/fonts/Inter-Bold.ttf b/apps/driver_new/assets/fonts/Inter-Bold.ttf deleted file mode 100644 index 15e908f..0000000 Binary files a/apps/driver_new/assets/fonts/Inter-Bold.ttf and /dev/null differ diff --git a/apps/driver_new/assets/fonts/Inter-Medium.ttf b/apps/driver_new/assets/fonts/Inter-Medium.ttf deleted file mode 100644 index 9342730..0000000 Binary files a/apps/driver_new/assets/fonts/Inter-Medium.ttf and /dev/null differ diff --git a/apps/driver_new/assets/fonts/Inter-Regular.ttf b/apps/driver_new/assets/fonts/Inter-Regular.ttf deleted file mode 100644 index c544be4..0000000 Binary files a/apps/driver_new/assets/fonts/Inter-Regular.ttf and /dev/null differ diff --git a/apps/driver_new/assets/fonts/Inter-SemiBold.ttf b/apps/driver_new/assets/fonts/Inter-SemiBold.ttf deleted file mode 100644 index a32e2b8..0000000 Binary files a/apps/driver_new/assets/fonts/Inter-SemiBold.ttf and /dev/null differ diff --git a/apps/driver_new/assets/fonts/digit.ttf b/apps/driver_new/assets/fonts/digit.ttf deleted file mode 100755 index 5dbe6f9..0000000 Binary files a/apps/driver_new/assets/fonts/digit.ttf and /dev/null differ diff --git a/apps/driver_new/assets/images/1.png b/apps/driver_new/assets/images/1.png deleted file mode 100644 index 5cc4c86..0000000 Binary files a/apps/driver_new/assets/images/1.png and /dev/null differ diff --git a/apps/driver_new/assets/images/2.png b/apps/driver_new/assets/images/2.png deleted file mode 100644 index 69005af..0000000 Binary files a/apps/driver_new/assets/images/2.png and /dev/null differ diff --git a/apps/driver_new/assets/images/3.png b/apps/driver_new/assets/images/3.png deleted file mode 100644 index 4040f40..0000000 Binary files a/apps/driver_new/assets/images/3.png and /dev/null differ diff --git a/apps/driver_new/assets/images/4.png b/apps/driver_new/assets/images/4.png deleted file mode 100644 index 15b4d56..0000000 Binary files a/apps/driver_new/assets/images/4.png and /dev/null differ diff --git a/apps/driver_new/assets/images/5.png b/apps/driver_new/assets/images/5.png deleted file mode 100644 index 4440755..0000000 Binary files a/apps/driver_new/assets/images/5.png and /dev/null differ diff --git a/apps/driver_new/assets/images/6.png b/apps/driver_new/assets/images/6.png deleted file mode 100755 index 23df2c0..0000000 Binary files a/apps/driver_new/assets/images/6.png and /dev/null differ diff --git a/apps/driver_new/assets/images/A.png b/apps/driver_new/assets/images/A.png deleted file mode 100755 index 246b9d2..0000000 Binary files a/apps/driver_new/assets/images/A.png and /dev/null differ diff --git a/apps/driver_new/assets/images/arrow.png b/apps/driver_new/assets/images/arrow.png deleted file mode 100755 index 3d3db75..0000000 Binary files a/apps/driver_new/assets/images/arrow.png and /dev/null differ diff --git a/apps/driver_new/assets/images/b.png b/apps/driver_new/assets/images/b.png deleted file mode 100755 index b22f96c..0000000 Binary files a/apps/driver_new/assets/images/b.png and /dev/null differ diff --git a/apps/driver_new/assets/images/brand.png b/apps/driver_new/assets/images/brand.png deleted file mode 100755 index 9282720..0000000 Binary files a/apps/driver_new/assets/images/brand.png and /dev/null differ diff --git a/apps/driver_new/assets/images/car.png b/apps/driver_new/assets/images/car.png deleted file mode 100755 index 5932743..0000000 Binary files a/apps/driver_new/assets/images/car.png and /dev/null differ diff --git a/apps/driver_new/assets/images/car_back.png b/apps/driver_new/assets/images/car_back.png deleted file mode 100755 index 72c8a89..0000000 Binary files a/apps/driver_new/assets/images/car_back.png and /dev/null differ diff --git a/apps/driver_new/assets/images/car_front.png b/apps/driver_new/assets/images/car_front.png deleted file mode 100755 index 81c974f..0000000 Binary files a/apps/driver_new/assets/images/car_front.png and /dev/null differ diff --git a/apps/driver_new/assets/images/cashMTN.png b/apps/driver_new/assets/images/cashMTN.png deleted file mode 100644 index bae958b..0000000 Binary files a/apps/driver_new/assets/images/cashMTN.png and /dev/null differ diff --git a/apps/driver_new/assets/images/driver_license.png b/apps/driver_new/assets/images/driver_license.png deleted file mode 100755 index aa6a06f..0000000 Binary files a/apps/driver_new/assets/images/driver_license.png and /dev/null differ diff --git a/apps/driver_new/assets/images/id_back.png b/apps/driver_new/assets/images/id_back.png deleted file mode 100755 index 7c4d8d3..0000000 Binary files a/apps/driver_new/assets/images/id_back.png and /dev/null differ diff --git a/apps/driver_new/assets/images/id_front.png b/apps/driver_new/assets/images/id_front.png deleted file mode 100755 index 290e187..0000000 Binary files a/apps/driver_new/assets/images/id_front.png and /dev/null differ diff --git a/apps/driver_new/assets/images/lady1.png b/apps/driver_new/assets/images/lady1.png deleted file mode 100755 index 2797b75..0000000 Binary files a/apps/driver_new/assets/images/lady1.png and /dev/null differ diff --git a/apps/driver_new/assets/images/logo.gif b/apps/driver_new/assets/images/logo.gif deleted file mode 100755 index 5fa1d0d..0000000 Binary files a/apps/driver_new/assets/images/logo.gif and /dev/null differ diff --git a/apps/driver_new/assets/images/logo.png b/apps/driver_new/assets/images/logo.png deleted file mode 100755 index c811875..0000000 Binary files a/apps/driver_new/assets/images/logo.png and /dev/null differ diff --git a/apps/driver_new/assets/images/logo1.png b/apps/driver_new/assets/images/logo1.png deleted file mode 100755 index 8507dbc..0000000 Binary files a/apps/driver_new/assets/images/logo1.png and /dev/null differ diff --git a/apps/driver_new/assets/images/mtn.png b/apps/driver_new/assets/images/mtn.png deleted file mode 100644 index 6aa6618..0000000 Binary files a/apps/driver_new/assets/images/mtn.png and /dev/null differ diff --git a/apps/driver_new/assets/images/non_id_front.jpeg b/apps/driver_new/assets/images/non_id_front.jpeg deleted file mode 100755 index 3108cb3..0000000 Binary files a/apps/driver_new/assets/images/non_id_front.jpeg and /dev/null differ diff --git a/apps/driver_new/assets/images/notepad.png b/apps/driver_new/assets/images/notepad.png deleted file mode 100755 index 9536a4d..0000000 Binary files a/apps/driver_new/assets/images/notepad.png and /dev/null differ diff --git a/apps/driver_new/assets/images/on1.png b/apps/driver_new/assets/images/on1.png deleted file mode 100755 index c9881c6..0000000 Binary files a/apps/driver_new/assets/images/on1.png and /dev/null differ diff --git a/apps/driver_new/assets/images/on2.png b/apps/driver_new/assets/images/on2.png deleted file mode 100755 index 3b6d28c..0000000 Binary files a/apps/driver_new/assets/images/on2.png and /dev/null differ diff --git a/apps/driver_new/assets/images/on3.png b/apps/driver_new/assets/images/on3.png deleted file mode 100755 index 88af4ae..0000000 Binary files a/apps/driver_new/assets/images/on3.png and /dev/null differ diff --git a/apps/driver_new/assets/images/picker.png b/apps/driver_new/assets/images/picker.png deleted file mode 100755 index 6a35bf3..0000000 Binary files a/apps/driver_new/assets/images/picker.png and /dev/null differ diff --git a/apps/driver_new/assets/images/s.png b/apps/driver_new/assets/images/s.png deleted file mode 100755 index dd3b7b8..0000000 Binary files a/apps/driver_new/assets/images/s.png and /dev/null differ diff --git a/apps/driver_new/assets/images/shamCash.png b/apps/driver_new/assets/images/shamCash.png deleted file mode 100644 index ab13ac0..0000000 Binary files a/apps/driver_new/assets/images/shamCash.png and /dev/null differ diff --git a/apps/driver_new/assets/images/shamcashsend.png b/apps/driver_new/assets/images/shamcashsend.png deleted file mode 100644 index 0814517..0000000 Binary files a/apps/driver_new/assets/images/shamcashsend.png and /dev/null differ diff --git a/apps/driver_new/assets/images/syriatel.jpeg b/apps/driver_new/assets/images/syriatel.jpeg deleted file mode 100644 index 331117b..0000000 Binary files a/apps/driver_new/assets/images/syriatel.jpeg and /dev/null differ diff --git a/apps/driver_new/assets/order.mp3 b/apps/driver_new/assets/order.mp3 deleted file mode 100755 index b2b0ba2..0000000 Binary files a/apps/driver_new/assets/order.mp3 and /dev/null differ diff --git a/apps/driver_new/assets/order1.wav b/apps/driver_new/assets/order1.wav deleted file mode 100755 index 919fdda..0000000 Binary files a/apps/driver_new/assets/order1.wav and /dev/null differ diff --git a/apps/driver_new/assets/style.json b/apps/driver_new/assets/style.json deleted file mode 100644 index feed983..0000000 --- a/apps/driver_new/assets/style.json +++ /dev/null @@ -1,2178 +0,0 @@ -{ - "version": 8, - "name": "Siro Premium — Light v2.9", - "metadata": { - "brand": "Siro", - "version": "2.10.0-light", - "description": "Siro light theme — buildings at close zoom only, on-road labels, improved arrows" - }, - "center": [ - 36.276008, - 33.513685 - ], - "zoom": 15, - "glyphs": "https://cdn.protomaps.com/fonts/pbf/{fontstack}/{range}.pbf", - "sprite": "https://demotiles.maplibre.org/styles/osm-bright-gl-style/sprite", - "sources": { - "local-osm-polygons": { - "type": "vector", - "tiles": [ - "https://tiles.intaleqapp.com/planet_osm_polygon/{z}/{x}/{y}" - ], - "maxzoom": 14, - "attribution": "© Siro | © OpenStreetMap contributors" - }, - "local-osm-lines": { - "type": "vector", - "tiles": [ - "https://tiles.intaleqapp.com/planet_osm_line/{z}/{x}/{y}" - ], - "maxzoom": 14 - }, - "local-osm-points": { - "type": "vector", - "tiles": [ - "https://tiles.intaleqapp.com/planet_osm_point/{z}/{x}/{y}" - ], - "maxzoom": 14 - }, - "places_egypt": { - "type": "vector", - "tiles": [ - "https://tiles.intaleqapp.com/places_egypt/{z}/{x}/{y}" - ], - "maxzoom": 14 - }, - "places_syria": { - "type": "vector", - "tiles": [ - "https://tiles.intaleqapp.com/places_syria/{z}/{x}/{y}" - ], - "maxzoom": 14 - }, - "places_jordan": { - "type": "vector", - "tiles": [ - "https://tiles.intaleqapp.com/places_jordan/{z}/{x}/{y}" - ], - "maxzoom": 14 - }, - "overture_buildings": { - "type": "vector", - "tiles": [ - "https://tiles.intaleqapp.com/overture_building/{z}/{x}/{y}" - ], - "maxzoom": 14 - }, - "overture_segments": { - "type": "vector", - "tiles": [ - "https://tiles.intaleqapp.com/overture_segment/{z}/{x}/{y}" - ], - "maxzoom": 14 - } - }, - "layers": [ - { - "id": "background", - "type": "background", - "paint": { - "background-color": "#EEF2F7" - } - }, - { - "id": "landuse-residential", - "type": "fill", - "source": "local-osm-polygons", - "source-layer": "planet_osm_polygon", - "filter": [ - "==", - "landuse", - "residential" - ], - "paint": { - "fill-color": "#F0F4F8", - "fill-opacity": 1.0 - } - }, - { - "id": "landuse-commercial", - "type": "fill", - "source": "local-osm-polygons", - "source-layer": "planet_osm_polygon", - "filter": [ - "==", - "landuse", - "commercial" - ], - "paint": { - "fill-color": "#FAF5EE", - "fill-opacity": 1.0 - } - }, - { - "id": "landuse-cemetery", - "type": "fill", - "source": "local-osm-polygons", - "source-layer": "planet_osm_polygon", - "filter": [ - "==", - "landuse", - "cemetery" - ], - "paint": { - "fill-color": "#B8D4BA", - "fill-opacity": 1.0 - } - }, - { - "id": "landuse-military", - "type": "fill", - "source": "local-osm-polygons", - "source-layer": "planet_osm_polygon", - "filter": [ - "==", - "landuse", - "military" - ], - "paint": { - "fill-color": "#E2D9CC", - "fill-opacity": 1.0 - } - }, - { - "id": "landuse-industrial", - "type": "fill", - "source": "local-osm-polygons", - "source-layer": "planet_osm_polygon", - "filter": [ - "in", - "landuse", - "industrial", - "railway" - ], - "paint": { - "fill-color": "#E4E8EE", - "fill-opacity": 1 - } - }, - { - "id": "park-layer", - "type": "fill", - "source": "local-osm-polygons", - "source-layer": "planet_osm_polygon", - "filter": [ - "any", - [ - "in", - "leisure", - "park", - "garden", - "nature_reserve", - "pitch", - "playground" - ], - [ - "in", - "landuse", - "grass", - "meadow", - "forest" - ], - [ - "in", - "natural", - "wood", - "scrub", - "heath" - ] - ], - "paint": { - "fill-color": [ - "match", - [ - "get", - "leisure" - ], - "pitch", - "#9ED4A0", - "playground", - "#B8E6B8", - "#C5E8C5" - ], - "fill-opacity": 0.85 - } - }, - { - "id": "park-outline", - "type": "line", - "source": "local-osm-polygons", - "source-layer": "planet_osm_polygon", - "filter": [ - "in", - "leisure", - "park", - "garden", - "nature_reserve" - ], - "paint": { - "line-color": "#9ED4A0", - "line-width": 0.8, - "line-opacity": 0.6 - } - }, - { - "id": "water-polygon", - "type": "fill", - "source": "local-osm-polygons", - "source-layer": "planet_osm_polygon", - "filter": [ - "any", - [ - "in", - "natural", - "water", - "lake", - "bay" - ], - [ - "==", - "waterway", - "riverbank" - ], - [ - "in", - "landuse", - "basin", - "reservoir" - ], - [ - "==", - "amenity", - "fountain" - ] - ], - "paint": { - "fill-color": "#9ECFE8", - "fill-opacity": 0.95 - } - }, - { - "id": "water-polygon-outline", - "type": "line", - "source": "local-osm-polygons", - "source-layer": "planet_osm_polygon", - "filter": [ - "any", - [ - "in", - "natural", - "water", - "lake", - "bay" - ], - [ - "==", - "waterway", - "riverbank" - ], - [ - "in", - "landuse", - "basin", - "reservoir" - ] - ], - "paint": { - "line-color": "#6BB8D8", - "line-width": 0.8, - "line-opacity": 0.8 - } - }, - { - "id": "waterway-river", - "type": "line", - "source": "local-osm-lines", - "source-layer": "planet_osm_line", - "filter": [ - "all", - [ - "in", - "waterway", - "river", - "canal" - ], - [ - "!=", - "intermittent", - "yes" - ], - [ - "!=", - "seasonal", - "yes" - ], - [ - "!=", - "tunnel", - "yes" - ] - ], - "paint": { - "line-color": "#6BB8D8", - "line-width": [ - "interpolate", - [ - "linear" - ], - [ - "zoom" - ], - 10, - 1.5, - 14, - 4, - 16, - 7 - ], - "line-opacity": 0.95 - } - }, - { - "id": "waterway-stream-drain", - "type": "line", - "source": "local-osm-lines", - "source-layer": "planet_osm_line", - "filter": [ - "all", - [ - "in", - "waterway", - "stream", - "drain", - "ditch" - ], - [ - "!=", - "intermittent", - "yes" - ], - [ - "!=", - "seasonal", - "yes" - ], - [ - "!=", - "tunnel", - "yes" - ] - ], - "minzoom": 13, - "paint": { - "line-color": "#7FBFD8", - "line-width": [ - "interpolate", - [ - "linear" - ], - [ - "zoom" - ], - 13, - 0.8, - 16, - 2.5 - ], - "line-opacity": 0.85 - } - }, - { - "id": "railway-area", - "type": "fill", - "source": "local-osm-polygons", - "source-layer": "planet_osm_polygon", - "filter": [ - "==", - "landuse", - "railway" - ], - "paint": { - "fill-color": "#DDE2EA", - "fill-opacity": 0.9 - } - }, - { - "id": "railway-rail-casing", - "type": "line", - "source": "local-osm-lines", - "source-layer": "planet_osm_line", - "filter": [ - "all", - [ - "in", - "railway", - "rail", - "narrow_gauge", - "preserved" - ], - [ - "!=", - "service", - "yard" - ], - [ - "!=", - "service", - "siding" - ] - ], - "minzoom": 8, - "paint": { - "line-color": "#B0B8C5", - "line-width": [ - "interpolate", - [ - "linear" - ], - [ - "zoom" - ], - 8, - 2, - 12, - 4, - 16, - 8 - ] - } - }, - { - "id": "railway-rail-core", - "type": "line", - "source": "local-osm-lines", - "source-layer": "planet_osm_line", - "filter": [ - "all", - [ - "in", - "railway", - "rail", - "narrow_gauge", - "preserved" - ], - [ - "!=", - "service", - "yard" - ], - [ - "!=", - "service", - "siding" - ] - ], - "minzoom": 8, - "paint": { - "line-color": "#6B7A8E", - "line-width": [ - "interpolate", - [ - "linear" - ], - [ - "zoom" - ], - 8, - 1, - 12, - 2.5, - 16, - 5 - ], - "line-dasharray": [ - 6, - 4 - ] - } - }, - { - "id": "railway-subway-casing", - "type": "line", - "source": "local-osm-lines", - "source-layer": "planet_osm_line", - "filter": [ - "in", - "railway", - "subway", - "light_rail", - "tram", - "monorail" - ], - "minzoom": 10, - "paint": { - "line-color": [ - "match", - [ - "get", - "railway" - ], - "subway", - "#CC2233", - "light_rail", - "#0066CC", - "tram", - "#8833BB", - "monorail", - "#008855", - "#BB3344" - ], - "line-width": [ - "interpolate", - [ - "linear" - ], - [ - "zoom" - ], - 10, - 3, - 14, - 6, - 16, - 10 - ] - } - }, - { - "id": "railway-subway-core", - "type": "line", - "source": "local-osm-lines", - "source-layer": "planet_osm_line", - "filter": [ - "in", - "railway", - "subway", - "light_rail", - "tram", - "monorail" - ], - "minzoom": 10, - "paint": { - "line-color": [ - "match", - [ - "get", - "railway" - ], - "subway", - "#FF3347", - "light_rail", - "#2288FF", - "tram", - "#AA44EE", - "monorail", - "#00BB66", - "#FF4455" - ], - "line-width": [ - "interpolate", - [ - "linear" - ], - [ - "zoom" - ], - 10, - 1.5, - 14, - 3.5, - 16, - 6 - ] - } - }, - { - "id": "road-casing-track-path", - "type": "line", - "source": "local-osm-lines", - "source-layer": "planet_osm_line", - "filter": [ - "in", - "highway", - "track", - "path", - "footway", - "cycleway", - "steps" - ], - "minzoom": 14, - "paint": { - "line-color": "#D4D8DF", - "line-width": [ - "interpolate", - [ - "linear" - ], - [ - "zoom" - ], - 14, - 1, - 16, - 4 - ], - "line-dasharray": [ - 4, - 3 - ] - } - }, - { - "id": "road-casing-minor", - "type": "line", - "source": "local-osm-lines", - "source-layer": "planet_osm_line", - "filter": [ - "in", - "highway", - "residential", - "service", - "unclassified", - "living_street", - "pedestrian" - ], - "paint": { - "line-color": "#D4D8DF", - "line-width": [ - "interpolate", - [ - "linear" - ], - [ - "zoom" - ], - 12, - 1.5, - 16, - 10 - ], - "line-opacity": 0.7 - } - }, - { - "id": "road-core-minor", - "type": "line", - "source": "local-osm-lines", - "source-layer": "planet_osm_line", - "filter": [ - "in", - "highway", - "residential", - "service", - "unclassified", - "living_street", - "pedestrian" - ], - "paint": { - "line-color": "#FFFFFF", - "line-width": [ - "interpolate", - [ - "linear" - ], - [ - "zoom" - ], - 12, - 0.8, - 16, - 8 - ] - } - }, - { - "id": "road-casing-tertiary", - "type": "line", - "source": "local-osm-lines", - "source-layer": "planet_osm_line", - "filter": [ - "in", - "highway", - "tertiary", - "tertiary_link" - ], - "paint": { - "line-color": "#C9CED8", - "line-width": [ - "interpolate", - [ - "linear" - ], - [ - "zoom" - ], - 11, - 2, - 16, - 14 - ], - "line-opacity": 0.75 - } - }, - { - "id": "road-core-tertiary", - "type": "line", - "source": "local-osm-lines", - "source-layer": "planet_osm_line", - "filter": [ - "in", - "highway", - "tertiary", - "tertiary_link" - ], - "paint": { - "line-color": "#FFFFFF", - "line-width": [ - "interpolate", - [ - "linear" - ], - [ - "zoom" - ], - 11, - 1.2, - 16, - 11 - ] - } - }, - { - "id": "road-casing-secondary", - "type": "line", - "source": "local-osm-lines", - "source-layer": "planet_osm_line", - "filter": [ - "in", - "highway", - "secondary", - "secondary_link" - ], - "paint": { - "line-color": "#C4CFDE", - "line-width": [ - "interpolate", - [ - "linear" - ], - [ - "zoom" - ], - 11, - 2.5, - 16, - 16 - ], - "line-opacity": 0.8 - } - }, - { - "id": "road-core-secondary", - "type": "line", - "source": "local-osm-lines", - "source-layer": "planet_osm_line", - "filter": [ - "in", - "highway", - "secondary", - "secondary_link" - ], - "paint": { - "line-color": "#F8FBFF", - "line-width": [ - "interpolate", - [ - "linear" - ], - [ - "zoom" - ], - 11, - 1.8, - 16, - 13 - ] - } - }, - { - "id": "road-casing-primary", - "type": "line", - "source": "local-osm-lines", - "source-layer": "planet_osm_line", - "filter": [ - "in", - "highway", - "primary", - "primary_link" - ], - "paint": { - "line-color": "#C8B868", - "line-width": [ - "interpolate", - [ - "linear" - ], - [ - "zoom" - ], - 10, - 3, - 16, - 18 - ], - "line-opacity": 0.7 - } - }, - { - "id": "road-core-primary", - "type": "line", - "source": "local-osm-lines", - "source-layer": "planet_osm_line", - "filter": [ - "in", - "highway", - "primary", - "primary_link" - ], - "paint": { - "line-color": "#EDD870", - "line-width": [ - "interpolate", - [ - "linear" - ], - [ - "zoom" - ], - 10, - 2, - 16, - 14 - ] - } - }, - { - "id": "road-casing-motorway", - "type": "line", - "source": "local-osm-lines", - "source-layer": "planet_osm_line", - "filter": [ - "in", - "highway", - "motorway", - "motorway_link", - "trunk", - "trunk_link" - ], - "paint": { - "line-color": "#C8A84B", - "line-width": [ - "interpolate", - [ - "linear" - ], - [ - "zoom" - ], - 9, - 4, - 16, - 20 - ], - "line-opacity": 0.75 - } - }, - { - "id": "road-core-motorway", - "type": "line", - "source": "local-osm-lines", - "source-layer": "planet_osm_line", - "filter": [ - "in", - "highway", - "motorway", - "motorway_link", - "trunk", - "trunk_link" - ], - "paint": { - "line-color": "#F0C040", - "line-width": [ - "interpolate", - [ - "linear" - ], - [ - "zoom" - ], - 9, - 2.5, - 16, - 16 - ] - } - }, - { - "id": "road-direction-arrows", - "type": "symbol", - "source": "local-osm-lines", - "source-layer": "planet_osm_line", - "minzoom": 15, - "filter": [ - "all", - [ - "in", - "highway", - "motorway", - "trunk", - "primary", - "secondary", - "tertiary", - "residential", - "unclassified", - "living_street" - ], - [ - "==", - "oneway", - "yes" - ] - ], - "layout": { - "symbol-placement": "line", - "symbol-spacing": 120, - "text-field": "→", - "text-font": [ - "Noto Sans Regular" - ], - "text-size": [ - "interpolate", - [ - "linear" - ], - [ - "zoom" - ], - 15, - 16, - 17, - 22, - 19, - 28 - ], - "text-keep-upright": false, - "text-rotation-alignment": "map", - "text-pitch-alignment": "viewport", - "text-allow-overlap": true, - "text-ignore-placement": true, - "text-padding": 0, - "text-letter-spacing": -0.1 - }, - "paint": { - "text-color": "rgba(80,96,120,0.55)", - "text-halo-color": "rgba(255,255,255,0.25)", - "text-halo-width": 1 - } - }, - { - "id": "building-fill-flat", - "type": "fill", - "source": "local-osm-polygons", - "source-layer": "planet_osm_polygon", - "filter": [ - "has", - "building" - ], - "minzoom": 15, - "maxzoom": 16, - "paint": { - "fill-color": "#DDD8D0", - "fill-opacity": 0.85, - "fill-outline-color": "#C4BEB4" - } - }, - { - "id": "building-3d", - "type": "fill-extrusion", - "source": "local-osm-polygons", - "source-layer": "planet_osm_polygon", - "minzoom": 16, - "filter": [ - "has", - "building" - ], - "paint": { - "fill-extrusion-color": "#DDD8D0", - "fill-extrusion-height": [ - "coalesce", - [ - "to-number", - [ - "get", - "height" - ] - ], - [ - "*", - [ - "to-number", - [ - "get", - "building:levels" - ], - 2 - ], - 3.5 - ], - 7 - ], - "fill-extrusion-base": [ - "coalesce", - [ - "to-number", - [ - "get", - "min_height" - ] - ], - 0 - ], - "fill-extrusion-opacity": 0.8, - "fill-extrusion-vertical-gradient": true - } - }, - { - "id": "building-3d-overture", - "type": "fill-extrusion", - "source": "overture_buildings", - "source-layer": "overture_building", - "minzoom": 16, - "paint": { - "fill-extrusion-color": [ - "match", - [ - "get", - "subtype" - ], - "commercial", - "#D8D0C0", - "retail", - "#E0D0B8", - "industrial", - "#C8D0DC", - "religious", - "#C8D4EC", - "education", - "#D4E0C4", - "medical", - "#E8D4D4", - "#DDD8D0" - ], - "fill-extrusion-height": [ - "interpolate", - [ - "linear" - ], - [ - "zoom" - ], - 16, - [ - "coalesce", - [ - "to-number", - [ - "get", - "height" - ] - ], - [ - "*", - [ - "coalesce", - [ - "to-number", - [ - "get", - "num_floors" - ] - ], - 3 - ], - 3.5 - ], - 9 - ], - 18, - [ - "coalesce", - [ - "to-number", - [ - "get", - "height" - ] - ], - [ - "*", - [ - "coalesce", - [ - "to-number", - [ - "get", - "num_floors" - ] - ], - 3 - ], - 3.5 - ], - 12 - ] - ], - "fill-extrusion-base": [ - "coalesce", - [ - "to-number", - [ - "get", - "min_height" - ] - ], - 0 - ], - "fill-extrusion-opacity": [ - "interpolate", - [ - "linear" - ], - [ - "zoom" - ], - 15, - 0, - 16, - 0.6, - 17, - 0.88 - ], - "fill-extrusion-vertical-gradient": true - } - }, - { - "id": "overture-building-footprint", - "type": "fill", - "source": "overture_buildings", - "source-layer": "overture_building", - "minzoom": 15, - "maxzoom": 16, - "paint": { - "fill-color": "#DDD8D0", - "fill-opacity": 0.82, - "fill-outline-color": "#C4BEB4" - } - }, - { - "id": "railway-label", - "type": "symbol", - "source": "local-osm-lines", - "source-layer": "planet_osm_line", - "filter": [ - "in", - "railway", - "rail", - "subway", - "light_rail", - "tram" - ], - "minzoom": 13, - "layout": { - "text-field": [ - "coalesce", - [ - "get", - "name:ar" - ], - [ - "get", - "name" - ], - "" - ], - "text-font": [ - "Noto Sans Regular" - ], - "text-size": 10, - "symbol-placement": "line", - "text-padding": 6, - "text-allow-overlap": false - }, - "paint": { - "text-color": [ - "match", - [ - "get", - "railway" - ], - "subway", - "#CC2233", - "light_rail", - "#0055BB", - "tram", - "#7722AA", - "#4A5568" - ], - "text-halo-color": "rgba(255,255,255,0.93)", - "text-halo-width": 2 - } - }, - { - "id": "waterway-label", - "type": "symbol", - "source": "local-osm-lines", - "source-layer": "planet_osm_line", - "filter": [ - "all", - [ - "in", - "waterway", - "river", - "canal" - ], - [ - "!=", - "intermittent", - "yes" - ], - [ - "has", - "name" - ] - ], - "minzoom": 12, - "layout": { - "text-field": [ - "coalesce", - [ - "get", - "name:ar" - ], - [ - "get", - "name" - ], - "" - ], - "text-font": [ - "Noto Sans Regular" - ], - "text-size": 11, - "symbol-placement": "line", - "text-letter-spacing": 0.1 - }, - "paint": { - "text-color": "#2E86AB", - "text-halo-color": "rgba(255,255,255,0.93)", - "text-halo-width": 2 - } - }, - { - "id": "building-number-polygon", - "type": "symbol", - "source": "local-osm-polygons", - "source-layer": "planet_osm_polygon", - "minzoom": 17, - "filter": [ - "has", - "addr:housenumber" - ], - "layout": { - "text-field": "{addr:housenumber}", - "text-font": [ - "Noto Sans Regular" - ], - "text-size": 10, - "text-allow-overlap": false - }, - "paint": { - "text-color": "#5A5048", - "text-halo-color": "rgba(255,255,255,0.93)", - "text-halo-width": 1.5 - } - }, - { - "id": "building-number-point", - "type": "symbol", - "source": "local-osm-points", - "source-layer": "planet_osm_point", - "minzoom": 17, - "filter": [ - "has", - "addr:housenumber" - ], - "layout": { - "text-field": "{addr:housenumber}", - "text-font": [ - "Noto Sans Regular" - ], - "text-size": 10, - "text-allow-overlap": false - }, - "paint": { - "text-color": "#5A5048", - "text-halo-color": "rgba(255,255,255,0.93)", - "text-halo-width": 1.5 - } - }, - { - "id": "overture-building-names", - "type": "symbol", - "source": "overture_buildings", - "source-layer": "overture_building", - "minzoom": 17, - "filter": [ - "has", - "names" - ], - "layout": { - "text-field": [ - "coalesce", - [ - "get", - "names" - ], - "" - ], - "text-font": [ - "Noto Sans Regular" - ], - "text-size": 10, - "text-anchor": "center", - "text-allow-overlap": false, - "text-max-width": 8 - }, - "paint": { - "text-color": "#5A5048", - "text-halo-color": "rgba(255,255,255,0.93)", - "text-halo-width": 1.5 - } - }, - { - "id": "road-labels-minor", - "type": "symbol", - "source": "local-osm-lines", - "source-layer": "planet_osm_line", - "filter": [ - "in", - "highway", - "residential", - "service", - "unclassified", - "living_street" - ], - "minzoom": 16, - "layout": { - "text-field": [ - "coalesce", - [ - "get", - "name:ar" - ], - [ - "get", - "name" - ], - "" - ], - "text-font": [ - "Noto Sans Regular" - ], - "text-size": [ - "interpolate", - [ - "linear" - ], - [ - "zoom" - ], - 16, - 10, - 18, - 13 - ], - "symbol-placement": "line", - "text-rotation-alignment": "map", - "text-pitch-alignment": "viewport", - "text-keep-upright": true, - "text-max-angle": 25, - "symbol-spacing": 300, - "text-letter-spacing": 0.04, - "text-padding": 8, - "text-allow-overlap": false - }, - "paint": { - "text-color": "#4A5568", - "text-halo-color": "rgba(255,255,255,0.93)", - "text-halo-width": 1.8 - } - }, - { - "id": "road-labels-major", - "type": "symbol", - "source": "local-osm-lines", - "source-layer": "planet_osm_line", - "filter": [ - "in", - "highway", - "primary", - "secondary", - "tertiary", - "motorway", - "trunk" - ], - "minzoom": 12, - "layout": { - "text-field": [ - "coalesce", - [ - "get", - "name:ar" - ], - [ - "get", - "name" - ], - "" - ], - "text-font": [ - "Noto Sans Bold" - ], - "text-size": [ - "interpolate", - [ - "linear" - ], - [ - "zoom" - ], - 12, - 10, - 14, - 13, - 18, - 16 - ], - "symbol-placement": "line", - "text-rotation-alignment": "map", - "text-pitch-alignment": "viewport", - "text-keep-upright": true, - "text-max-angle": 22, - "symbol-spacing": 350, - "text-letter-spacing": 0.05, - "text-padding": 12, - "text-allow-overlap": false - }, - "paint": { - "text-color": "#1A2332", - "text-halo-color": "rgba(255,255,255,0.93)", - "text-halo-width": 2.5 - } - }, - { - "id": "overture-street-names", - "type": "symbol", - "source": "overture_segments", - "source-layer": "overture_segment", - "minzoom": 14, - "filter": [ - "has", - "names" - ], - "layout": { - "text-field": [ - "coalesce", - [ - "get", - "names" - ], - "" - ], - "text-font": [ - "Noto Sans Regular" - ], - "text-size": [ - "interpolate", - [ - "linear" - ], - [ - "zoom" - ], - 14, - 9, - 16, - 12, - 18, - 14 - ], - "symbol-placement": "line", - "text-rotation-alignment": "map", - "text-pitch-alignment": "viewport", - "text-keep-upright": true, - "text-max-angle": 28, - "symbol-spacing": 280, - "text-letter-spacing": 0.04, - "text-padding": 15, - "text-allow-overlap": false - }, - "paint": { - "text-color": "#4A5568", - "text-halo-color": "rgba(255,255,255,0.93)", - "text-halo-width": 2 - } - }, - { - "id": "poi-hospital", - "type": "symbol", - "source": "local-osm-points", - "source-layer": "planet_osm_point", - "minzoom": 13, - "filter": [ - "==", - "amenity", - "hospital" - ], - "layout": { - "icon-image": "hospital", - "icon-size": 1.0, - "text-field": [ - "coalesce", - [ - "get", - "name:ar" - ], - [ - "get", - "name" - ], - "" - ], - "text-font": [ - "Noto Sans Regular" - ], - "text-size": 11, - "text-offset": [ - 0, - 1.2 - ], - "text-anchor": "top", - "text-allow-overlap": false - }, - "paint": { - "text-color": "#C0392B", - "text-halo-color": "rgba(255,255,255,0.93)", - "text-halo-width": 2 - } - }, - { - "id": "poi-pharmacy", - "type": "symbol", - "source": "local-osm-points", - "source-layer": "planet_osm_point", - "minzoom": 15, - "filter": [ - "==", - "amenity", - "pharmacy" - ], - "layout": { - "icon-image": "pharmacy", - "icon-size": 0.8, - "text-field": [ - "coalesce", - [ - "get", - "name:ar" - ], - [ - "get", - "name" - ], - "" - ], - "text-font": [ - "Noto Sans Regular" - ], - "text-size": 11, - "text-offset": [ - 0, - 1.2 - ], - "text-anchor": "top", - "text-allow-overlap": false - }, - "paint": { - "text-color": "#1A7A3C", - "text-halo-color": "rgba(255,255,255,0.93)", - "text-halo-width": 2 - } - }, - { - "id": "poi-place-of-worship", - "type": "symbol", - "source": "local-osm-points", - "source-layer": "planet_osm_point", - "minzoom": 14, - "filter": [ - "==", - "amenity", - "place_of_worship" - ], - "layout": { - "icon-image": "tourist", - "icon-size": 0.8, - "text-field": [ - "coalesce", - [ - "get", - "name:ar" - ], - [ - "get", - "name" - ], - "" - ], - "text-font": [ - "Noto Sans Regular" - ], - "text-size": 11, - "text-offset": [ - 0, - 1.2 - ], - "text-anchor": "top", - "text-allow-overlap": false - }, - "paint": { - "text-color": "#1A6B3A", - "text-halo-color": "rgba(255,255,255,0.93)", - "text-halo-width": 2 - } - }, - { - "id": "poi-school", - "type": "symbol", - "source": "local-osm-points", - "source-layer": "planet_osm_point", - "minzoom": 14, - "filter": [ - "in", - "amenity", - "school", - "university", - "college" - ], - "layout": { - "icon-image": "college", - "icon-size": 0.8, - "text-field": [ - "coalesce", - [ - "get", - "name:ar" - ], - [ - "get", - "name" - ], - "" - ], - "text-font": [ - "Noto Sans Regular" - ], - "text-size": 11, - "text-offset": [ - 0, - 1.2 - ], - "text-anchor": "top", - "text-allow-overlap": false - }, - "paint": { - "text-color": "#5A4A8A", - "text-halo-color": "rgba(255,255,255,0.93)", - "text-halo-width": 2 - } - }, - { - "id": "poi-restaurant-cafe", - "type": "symbol", - "source": "local-osm-points", - "source-layer": "planet_osm_point", - "minzoom": 16, - "filter": [ - "in", - "amenity", - "restaurant", - "cafe", - "fast_food" - ], - "layout": { - "icon-image": [ - "match", - [ - "get", - "amenity" - ], - "cafe", - "cafe", - "restaurant" - ], - "icon-size": 0.8, - "text-field": [ - "coalesce", - [ - "get", - "name:ar" - ], - [ - "get", - "name" - ], - "" - ], - "text-font": [ - "Noto Sans Regular" - ], - "text-size": 10, - "text-offset": [ - 0, - 1.2 - ], - "text-anchor": "top" - }, - "paint": { - "text-color": "#3D4A5C", - "text-halo-color": "rgba(255,255,255,0.93)", - "text-halo-width": 1.5 - } - }, - { - "id": "poi-transit-station", - "type": "symbol", - "source": "local-osm-points", - "source-layer": "planet_osm_point", - "minzoom": 12, - "filter": [ - "any", - [ - "==", - "railway", - "station" - ], - [ - "==", - "railway", - "halt" - ], - [ - "==", - "railway", - "tram_stop" - ], - [ - "==", - "station", - "subway" - ], - [ - "==", - "amenity", - "bus_station" - ] - ], - "layout": { - "icon-image": "rail", - "icon-size": 1, - "text-field": [ - "coalesce", - [ - "get", - "name:ar" - ], - [ - "get", - "name" - ], - "" - ], - "text-font": [ - "Noto Sans Regular" - ], - "text-size": 11, - "text-offset": [ - 0, - 1.4 - ], - "text-anchor": "top", - "text-allow-overlap": false - }, - "paint": { - "text-color": "#CC2233", - "text-halo-color": "rgba(255,255,255,0.93)", - "text-halo-width": 2 - } - }, - { - "id": "place-labels-area", - "type": "symbol", - "source": "local-osm-polygons", - "source-layer": "planet_osm_polygon", - "minzoom": 10, - "filter": [ - "has", - "name" - ], - "layout": { - "text-field": [ - "coalesce", - [ - "get", - "name:ar" - ], - [ - "get", - "name" - ], - "" - ], - "text-font": [ - "Noto Sans Regular" - ], - "text-size": [ - "interpolate", - [ - "linear" - ], - [ - "zoom" - ], - 10, - 10, - 14, - 13 - ], - "text-padding": 8, - "text-allow-overlap": false - }, - "paint": { - "text-color": "#34495E", - "text-halo-color": "rgba(255,255,255,0.93)", - "text-halo-width": 2 - } - }, - { - "id": "place-labels-point", - "type": "symbol", - "source": "local-osm-points", - "source-layer": "planet_osm_point", - "minzoom": 10, - "filter": [ - "any", - [ - "in", - "place", - "city", - "town", - "village", - "suburb", - "neighbourhood", - "hamlet", - "locality", - "quarter" - ], - [ - "in", - "natural", - "peak", - "spring" - ] - ], - "layout": { - "text-field": [ - "coalesce", - [ - "get", - "name:ar" - ], - [ - "get", - "name" - ], - "" - ], - "text-font": [ - "Noto Sans Regular" - ], - "text-size": [ - "interpolate", - [ - "linear" - ], - [ - "zoom" - ], - 10, - [ - "match", - [ - "get", - "place" - ], - "city", - 16, - "town", - 14, - 11 - ], - 14, - [ - "match", - [ - "get", - "place" - ], - "city", - 20, - "town", - 16, - 13 - ], - 17, - 14 - ], - "text-letter-spacing": [ - "match", - [ - "get", - "place" - ], - "city", - 0.08, - "town", - 0.05, - 0.02 - ], - "text-anchor": "center", - "text-padding": 10, - "text-allow-overlap": false - }, - "paint": { - "text-color": [ - "match", - [ - "get", - "place" - ], - "city", - "#1A2740", - "town", - "#2C3E50", - "suburb", - "#34495E", - "neighbourhood", - "#34495E", - "#34495E" - ], - "text-halo-color": "rgba(255,255,255,0.93)", - "text-halo-width": [ - "match", - [ - "get", - "place" - ], - "city", - 3, - "town", - 2.5, - 2 - ] - } - }, - { - "id": "places-egypt-labels", - "type": "symbol", - "source": "places_egypt", - "source-layer": "places_egypt", - "minzoom": 12, - "filter": [ - "!in", - "category", - "street" - ], - "layout": { - "text-field": [ - "coalesce", - [ - "get", - "name_ar" - ], - [ - "get", - "name" - ], - "" - ], - "text-font": [ - "Noto Sans Bold" - ], - "text-size": [ - "interpolate", - [ - "linear" - ], - [ - "zoom" - ], - 12, - 9, - 16, - 13 - ], - "text-offset": [ - 0, - 1.5 - ], - "text-anchor": "top", - "text-padding": 8, - "text-allow-overlap": false - }, - "paint": { - "text-color": "#2D3748", - "text-halo-color": "rgba(255,255,255,0.93)", - "text-halo-width": 2 - } - }, - { - "id": "places-syria-labels", - "type": "symbol", - "source": "places_syria", - "source-layer": "places_syria", - "minzoom": 10, - "filter": [ - "!in", - "category", - "street" - ], - "layout": { - "text-field": [ - "coalesce", - [ - "get", - "name_ar" - ], - [ - "get", - "name" - ], - "" - ], - "text-font": [ - "Noto Sans Bold" - ], - "text-size": [ - "interpolate", - [ - "linear" - ], - [ - "zoom" - ], - 12, - 9, - 16, - 13 - ], - "text-offset": [ - 0, - 1.5 - ], - "text-anchor": "top", - "text-padding": 8, - "text-allow-overlap": false - }, - "paint": { - "text-color": "#2D3748", - "text-halo-color": "rgba(255,255,255,0.93)", - "text-halo-width": 2 - } - }, - { - "id": "places-jordan-labels", - "type": "symbol", - "source": "places_jordan", - "source-layer": "places_jordan", - "minzoom": 10, - "filter": [ - "!in", - "category", - "street" - ], - "layout": { - "text-field": [ - "coalesce", - [ - "get", - "name_ar" - ], - [ - "get", - "name" - ], - "" - ], - "text-font": [ - "Noto Sans Bold" - ], - "text-size": [ - "interpolate", - [ - "linear" - ], - [ - "zoom" - ], - 12, - 9, - 16, - 13 - ], - "text-offset": [ - 0, - 1.5 - ], - "text-anchor": "top", - "text-padding": 8, - "text-allow-overlap": false - }, - "paint": { - "text-color": "#2D3748", - "text-halo-color": "rgba(255,255,255,0.93)", - "text-halo-width": 2 - } - } - ] -} \ No newline at end of file diff --git a/apps/driver_new/assets/style_dark.json b/apps/driver_new/assets/style_dark.json deleted file mode 100644 index 182c721..0000000 --- a/apps/driver_new/assets/style_dark.json +++ /dev/null @@ -1,2178 +0,0 @@ -{ - "version": 8, - "name": "Siro Premium — Dark v2.9", - "metadata": { - "brand": "Siro", - "version": "2.10.0-dark", - "description": "Siro dark theme — buildings at close zoom only, on-road labels, improved arrows" - }, - "center": [ - 36.276008, - 33.513685 - ], - "zoom": 15, - "glyphs": "https://cdn.protomaps.com/fonts/pbf/{fontstack}/{range}.pbf", - "sprite": "https://demotiles.maplibre.org/styles/osm-bright-gl-style/sprite", - "sources": { - "local-osm-polygons": { - "type": "vector", - "tiles": [ - "https://tiles.intaleqapp.com/planet_osm_polygon/{z}/{x}/{y}" - ], - "maxzoom": 14, - "attribution": "© Siro | © OpenStreetMap contributors" - }, - "local-osm-lines": { - "type": "vector", - "tiles": [ - "https://tiles.intaleqapp.com/planet_osm_line/{z}/{x}/{y}" - ], - "maxzoom": 14 - }, - "local-osm-points": { - "type": "vector", - "tiles": [ - "https://tiles.intaleqapp.com/planet_osm_point/{z}/{x}/{y}" - ], - "maxzoom": 14 - }, - "places_egypt": { - "type": "vector", - "tiles": [ - "https://tiles.intaleqapp.com/places_egypt/{z}/{x}/{y}" - ], - "maxzoom": 14 - }, - "places_syria": { - "type": "vector", - "tiles": [ - "https://tiles.intaleqapp.com/places_syria/{z}/{x}/{y}" - ], - "maxzoom": 14 - }, - "places_jordan": { - "type": "vector", - "tiles": [ - "https://tiles.intaleqapp.com/places_jordan/{z}/{x}/{y}" - ], - "maxzoom": 14 - }, - "overture_buildings": { - "type": "vector", - "tiles": [ - "https://tiles.intaleqapp.com/overture_building/{z}/{x}/{y}" - ], - "maxzoom": 14 - }, - "overture_segments": { - "type": "vector", - "tiles": [ - "https://tiles.intaleqapp.com/overture_segment/{z}/{x}/{y}" - ], - "maxzoom": 14 - } - }, - "layers": [ - { - "id": "background", - "type": "background", - "paint": { - "background-color": "#141920" - } - }, - { - "id": "landuse-residential", - "type": "fill", - "source": "local-osm-polygons", - "source-layer": "planet_osm_polygon", - "filter": [ - "==", - "landuse", - "residential" - ], - "paint": { - "fill-color": "#1A2130", - "fill-opacity": 0.9 - } - }, - { - "id": "landuse-commercial", - "type": "fill", - "source": "local-osm-polygons", - "source-layer": "planet_osm_polygon", - "filter": [ - "==", - "landuse", - "commercial" - ], - "paint": { - "fill-color": "#1E1C18", - "fill-opacity": 0.9 - } - }, - { - "id": "landuse-cemetery", - "type": "fill", - "source": "local-osm-polygons", - "source-layer": "planet_osm_polygon", - "filter": [ - "==", - "landuse", - "cemetery" - ], - "paint": { - "fill-color": "#1A2E1A", - "fill-opacity": 0.9 - } - }, - { - "id": "landuse-military", - "type": "fill", - "source": "local-osm-polygons", - "source-layer": "planet_osm_polygon", - "filter": [ - "==", - "landuse", - "military" - ], - "paint": { - "fill-color": "#28241C", - "fill-opacity": 0.9 - } - }, - { - "id": "landuse-industrial", - "type": "fill", - "source": "local-osm-polygons", - "source-layer": "planet_osm_polygon", - "filter": [ - "in", - "landuse", - "industrial", - "railway" - ], - "paint": { - "fill-color": "#1C2028", - "fill-opacity": 1 - } - }, - { - "id": "park-layer", - "type": "fill", - "source": "local-osm-polygons", - "source-layer": "planet_osm_polygon", - "filter": [ - "any", - [ - "in", - "leisure", - "park", - "garden", - "nature_reserve", - "pitch", - "playground" - ], - [ - "in", - "landuse", - "grass", - "meadow", - "forest" - ], - [ - "in", - "natural", - "wood", - "scrub", - "heath" - ] - ], - "paint": { - "fill-color": [ - "match", - [ - "get", - "leisure" - ], - "pitch", - "#1A3020", - "playground", - "#1C2A1C", - "#172217" - ], - "fill-opacity": 0.85 - } - }, - { - "id": "park-outline", - "type": "line", - "source": "local-osm-polygons", - "source-layer": "planet_osm_polygon", - "filter": [ - "in", - "leisure", - "park", - "garden", - "nature_reserve" - ], - "paint": { - "line-color": "#1A3020", - "line-width": 0.8, - "line-opacity": 0.6 - } - }, - { - "id": "water-polygon", - "type": "fill", - "source": "local-osm-polygons", - "source-layer": "planet_osm_polygon", - "filter": [ - "any", - [ - "in", - "natural", - "water", - "lake", - "bay" - ], - [ - "==", - "waterway", - "riverbank" - ], - [ - "in", - "landuse", - "basin", - "reservoir" - ], - [ - "==", - "amenity", - "fountain" - ] - ], - "paint": { - "fill-color": "#0D2A40", - "fill-opacity": 0.95 - } - }, - { - "id": "water-polygon-outline", - "type": "line", - "source": "local-osm-polygons", - "source-layer": "planet_osm_polygon", - "filter": [ - "any", - [ - "in", - "natural", - "water", - "lake", - "bay" - ], - [ - "==", - "waterway", - "riverbank" - ], - [ - "in", - "landuse", - "basin", - "reservoir" - ] - ], - "paint": { - "line-color": "#1A4A6A", - "line-width": 0.8, - "line-opacity": 0.8 - } - }, - { - "id": "waterway-river", - "type": "line", - "source": "local-osm-lines", - "source-layer": "planet_osm_line", - "filter": [ - "all", - [ - "in", - "waterway", - "river", - "canal" - ], - [ - "!=", - "intermittent", - "yes" - ], - [ - "!=", - "seasonal", - "yes" - ], - [ - "!=", - "tunnel", - "yes" - ] - ], - "paint": { - "line-color": "#1A4A6A", - "line-width": [ - "interpolate", - [ - "linear" - ], - [ - "zoom" - ], - 10, - 1.5, - 14, - 4, - 16, - 7 - ], - "line-opacity": 0.95 - } - }, - { - "id": "waterway-stream-drain", - "type": "line", - "source": "local-osm-lines", - "source-layer": "planet_osm_line", - "filter": [ - "all", - [ - "in", - "waterway", - "stream", - "drain", - "ditch" - ], - [ - "!=", - "intermittent", - "yes" - ], - [ - "!=", - "seasonal", - "yes" - ], - [ - "!=", - "tunnel", - "yes" - ] - ], - "minzoom": 13, - "paint": { - "line-color": "#153A52", - "line-width": [ - "interpolate", - [ - "linear" - ], - [ - "zoom" - ], - 13, - 0.8, - 16, - 2.5 - ], - "line-opacity": 0.85 - } - }, - { - "id": "railway-area", - "type": "fill", - "source": "local-osm-polygons", - "source-layer": "planet_osm_polygon", - "filter": [ - "==", - "landuse", - "railway" - ], - "paint": { - "fill-color": "#202830", - "fill-opacity": 0.9 - } - }, - { - "id": "railway-rail-casing", - "type": "line", - "source": "local-osm-lines", - "source-layer": "planet_osm_line", - "filter": [ - "all", - [ - "in", - "railway", - "rail", - "narrow_gauge", - "preserved" - ], - [ - "!=", - "service", - "yard" - ], - [ - "!=", - "service", - "siding" - ] - ], - "minzoom": 8, - "paint": { - "line-color": "#3A4050", - "line-width": [ - "interpolate", - [ - "linear" - ], - [ - "zoom" - ], - 8, - 2, - 12, - 4, - 16, - 8 - ] - } - }, - { - "id": "railway-rail-core", - "type": "line", - "source": "local-osm-lines", - "source-layer": "planet_osm_line", - "filter": [ - "all", - [ - "in", - "railway", - "rail", - "narrow_gauge", - "preserved" - ], - [ - "!=", - "service", - "yard" - ], - [ - "!=", - "service", - "siding" - ] - ], - "minzoom": 8, - "paint": { - "line-color": "#4A5568", - "line-width": [ - "interpolate", - [ - "linear" - ], - [ - "zoom" - ], - 8, - 1, - 12, - 2.5, - 16, - 5 - ], - "line-dasharray": [ - 6, - 4 - ] - } - }, - { - "id": "railway-subway-casing", - "type": "line", - "source": "local-osm-lines", - "source-layer": "planet_osm_line", - "filter": [ - "in", - "railway", - "subway", - "light_rail", - "tram", - "monorail" - ], - "minzoom": 10, - "paint": { - "line-color": [ - "match", - [ - "get", - "railway" - ], - "subway", - "#AA1122", - "light_rail", - "#0055AA", - "tram", - "#7722AA", - "monorail", - "#007744", - "#BB3344" - ], - "line-width": [ - "interpolate", - [ - "linear" - ], - [ - "zoom" - ], - 10, - 3, - 14, - 6, - 16, - 10 - ] - } - }, - { - "id": "railway-subway-core", - "type": "line", - "source": "local-osm-lines", - "source-layer": "planet_osm_line", - "filter": [ - "in", - "railway", - "subway", - "light_rail", - "tram", - "monorail" - ], - "minzoom": 10, - "paint": { - "line-color": [ - "match", - [ - "get", - "railway" - ], - "subway", - "#FF4455", - "light_rail", - "#33AAFF", - "tram", - "#CC55FF", - "monorail", - "#00DD88", - "#FF4455" - ], - "line-width": [ - "interpolate", - [ - "linear" - ], - [ - "zoom" - ], - 10, - 1.5, - 14, - 3.5, - 16, - 6 - ] - } - }, - { - "id": "road-casing-track-path", - "type": "line", - "source": "local-osm-lines", - "source-layer": "planet_osm_line", - "filter": [ - "in", - "highway", - "track", - "path", - "footway", - "cycleway", - "steps" - ], - "minzoom": 14, - "paint": { - "line-color": "#252C38", - "line-width": [ - "interpolate", - [ - "linear" - ], - [ - "zoom" - ], - 14, - 1, - 16, - 4 - ], - "line-dasharray": [ - 4, - 3 - ] - } - }, - { - "id": "road-casing-minor", - "type": "line", - "source": "local-osm-lines", - "source-layer": "planet_osm_line", - "filter": [ - "in", - "highway", - "residential", - "service", - "unclassified", - "living_street", - "pedestrian" - ], - "paint": { - "line-color": "#252C38", - "line-width": [ - "interpolate", - [ - "linear" - ], - [ - "zoom" - ], - 12, - 1.5, - 16, - 10 - ], - "line-opacity": 0.7 - } - }, - { - "id": "road-core-minor", - "type": "line", - "source": "local-osm-lines", - "source-layer": "planet_osm_line", - "filter": [ - "in", - "highway", - "residential", - "service", - "unclassified", - "living_street", - "pedestrian" - ], - "paint": { - "line-color": "#2E3848", - "line-width": [ - "interpolate", - [ - "linear" - ], - [ - "zoom" - ], - 12, - 0.8, - 16, - 8 - ] - } - }, - { - "id": "road-casing-tertiary", - "type": "line", - "source": "local-osm-lines", - "source-layer": "planet_osm_line", - "filter": [ - "in", - "highway", - "tertiary", - "tertiary_link" - ], - "paint": { - "line-color": "#2A3040", - "line-width": [ - "interpolate", - [ - "linear" - ], - [ - "zoom" - ], - 11, - 2, - 16, - 14 - ], - "line-opacity": 0.75 - } - }, - { - "id": "road-core-tertiary", - "type": "line", - "source": "local-osm-lines", - "source-layer": "planet_osm_line", - "filter": [ - "in", - "highway", - "tertiary", - "tertiary_link" - ], - "paint": { - "line-color": "#38465A", - "line-width": [ - "interpolate", - [ - "linear" - ], - [ - "zoom" - ], - 11, - 1.2, - 16, - 11 - ] - } - }, - { - "id": "road-casing-secondary", - "type": "line", - "source": "local-osm-lines", - "source-layer": "planet_osm_line", - "filter": [ - "in", - "highway", - "secondary", - "secondary_link" - ], - "paint": { - "line-color": "#3A3010", - "line-width": [ - "interpolate", - [ - "linear" - ], - [ - "zoom" - ], - 11, - 2.5, - 16, - 16 - ], - "line-opacity": 0.8 - } - }, - { - "id": "road-core-secondary", - "type": "line", - "source": "local-osm-lines", - "source-layer": "planet_osm_line", - "filter": [ - "in", - "highway", - "secondary", - "secondary_link" - ], - "paint": { - "line-color": "#4A3E18", - "line-width": [ - "interpolate", - [ - "linear" - ], - [ - "zoom" - ], - 11, - 1.8, - 16, - 13 - ] - } - }, - { - "id": "road-casing-primary", - "type": "line", - "source": "local-osm-lines", - "source-layer": "planet_osm_line", - "filter": [ - "in", - "highway", - "primary", - "primary_link" - ], - "paint": { - "line-color": "#5A4A10", - "line-width": [ - "interpolate", - [ - "linear" - ], - [ - "zoom" - ], - 10, - 3, - 16, - 18 - ], - "line-opacity": 0.7 - } - }, - { - "id": "road-core-primary", - "type": "line", - "source": "local-osm-lines", - "source-layer": "planet_osm_line", - "filter": [ - "in", - "highway", - "primary", - "primary_link" - ], - "paint": { - "line-color": "#7A6418", - "line-width": [ - "interpolate", - [ - "linear" - ], - [ - "zoom" - ], - 10, - 2, - 16, - 14 - ] - } - }, - { - "id": "road-casing-motorway", - "type": "line", - "source": "local-osm-lines", - "source-layer": "planet_osm_line", - "filter": [ - "in", - "highway", - "motorway", - "motorway_link", - "trunk", - "trunk_link" - ], - "paint": { - "line-color": "#6A5010", - "line-width": [ - "interpolate", - [ - "linear" - ], - [ - "zoom" - ], - 9, - 4, - 16, - 20 - ], - "line-opacity": 0.75 - } - }, - { - "id": "road-core-motorway", - "type": "line", - "source": "local-osm-lines", - "source-layer": "planet_osm_line", - "filter": [ - "in", - "highway", - "motorway", - "motorway_link", - "trunk", - "trunk_link" - ], - "paint": { - "line-color": "#8A6A18", - "line-width": [ - "interpolate", - [ - "linear" - ], - [ - "zoom" - ], - 9, - 2.5, - 16, - 16 - ] - } - }, - { - "id": "road-direction-arrows", - "type": "symbol", - "source": "local-osm-lines", - "source-layer": "planet_osm_line", - "minzoom": 15, - "filter": [ - "all", - [ - "in", - "highway", - "motorway", - "trunk", - "primary", - "secondary", - "tertiary", - "residential", - "unclassified", - "living_street" - ], - [ - "==", - "oneway", - "yes" - ] - ], - "layout": { - "symbol-placement": "line", - "symbol-spacing": 120, - "text-field": "→", - "text-font": [ - "Noto Sans Regular" - ], - "text-size": [ - "interpolate", - [ - "linear" - ], - [ - "zoom" - ], - 15, - 16, - 17, - 22, - 19, - 28 - ], - "text-keep-upright": false, - "text-rotation-alignment": "map", - "text-pitch-alignment": "viewport", - "text-allow-overlap": true, - "text-ignore-placement": true, - "text-padding": 0, - "text-letter-spacing": -0.1 - }, - "paint": { - "text-color": "rgba(160,180,210,0.5)", - "text-halo-color": "rgba(0,0,0,0.3)", - "text-halo-width": 1 - } - }, - { - "id": "building-fill-flat", - "type": "fill", - "source": "local-osm-polygons", - "source-layer": "planet_osm_polygon", - "filter": [ - "has", - "building" - ], - "minzoom": 15, - "maxzoom": 16, - "paint": { - "fill-color": "#252C38", - "fill-opacity": 0.85, - "fill-outline-color": "#1E2530" - } - }, - { - "id": "building-3d", - "type": "fill-extrusion", - "source": "local-osm-polygons", - "source-layer": "planet_osm_polygon", - "minzoom": 16, - "filter": [ - "has", - "building" - ], - "paint": { - "fill-extrusion-color": "#252C38", - "fill-extrusion-height": [ - "coalesce", - [ - "to-number", - [ - "get", - "height" - ] - ], - [ - "*", - [ - "to-number", - [ - "get", - "building:levels" - ], - 2 - ], - 3.5 - ], - 7 - ], - "fill-extrusion-base": [ - "coalesce", - [ - "to-number", - [ - "get", - "min_height" - ] - ], - 0 - ], - "fill-extrusion-opacity": 0.8, - "fill-extrusion-vertical-gradient": true - } - }, - { - "id": "building-3d-overture", - "type": "fill-extrusion", - "source": "overture_buildings", - "source-layer": "overture_building", - "minzoom": 16, - "paint": { - "fill-extrusion-color": [ - "match", - [ - "get", - "subtype" - ], - "commercial", - "#2A3A50", - "retail", - "#2E3A4A", - "industrial", - "#1E2A38", - "religious", - "#24203A", - "education", - "#1E3024", - "medical", - "#3A2020", - "#2A3245" - ], - "fill-extrusion-height": [ - "interpolate", - [ - "linear" - ], - [ - "zoom" - ], - 16, - [ - "coalesce", - [ - "to-number", - [ - "get", - "height" - ] - ], - [ - "*", - [ - "coalesce", - [ - "to-number", - [ - "get", - "num_floors" - ] - ], - 3 - ], - 3.5 - ], - 9 - ], - 18, - [ - "coalesce", - [ - "to-number", - [ - "get", - "height" - ] - ], - [ - "*", - [ - "coalesce", - [ - "to-number", - [ - "get", - "num_floors" - ] - ], - 3 - ], - 3.5 - ], - 12 - ] - ], - "fill-extrusion-base": [ - "coalesce", - [ - "to-number", - [ - "get", - "min_height" - ] - ], - 0 - ], - "fill-extrusion-opacity": [ - "interpolate", - [ - "linear" - ], - [ - "zoom" - ], - 15, - 0, - 16, - 0.6, - 17, - 0.88 - ], - "fill-extrusion-vertical-gradient": true - } - }, - { - "id": "overture-building-footprint", - "type": "fill", - "source": "overture_buildings", - "source-layer": "overture_building", - "minzoom": 15, - "maxzoom": 16, - "paint": { - "fill-color": "#252C38", - "fill-opacity": 0.82, - "fill-outline-color": "#1E2530" - } - }, - { - "id": "railway-label", - "type": "symbol", - "source": "local-osm-lines", - "source-layer": "planet_osm_line", - "filter": [ - "in", - "railway", - "rail", - "subway", - "light_rail", - "tram" - ], - "minzoom": 13, - "layout": { - "text-field": [ - "coalesce", - [ - "get", - "name:ar" - ], - [ - "get", - "name" - ], - "" - ], - "text-font": [ - "Noto Sans Regular" - ], - "text-size": 10, - "symbol-placement": "line", - "text-padding": 6, - "text-allow-overlap": false - }, - "paint": { - "text-color": [ - "match", - [ - "get", - "railway" - ], - "subway", - "#FF5566", - "light_rail", - "#0055BB", - "tram", - "#7722AA", - "#4A5568" - ], - "text-halo-color": "rgba(20,25,32,0.92)", - "text-halo-width": 2 - } - }, - { - "id": "waterway-label", - "type": "symbol", - "source": "local-osm-lines", - "source-layer": "planet_osm_line", - "filter": [ - "all", - [ - "in", - "waterway", - "river", - "canal" - ], - [ - "!=", - "intermittent", - "yes" - ], - [ - "has", - "name" - ] - ], - "minzoom": 12, - "layout": { - "text-field": [ - "coalesce", - [ - "get", - "name:ar" - ], - [ - "get", - "name" - ], - "" - ], - "text-font": [ - "Noto Sans Regular" - ], - "text-size": 11, - "symbol-placement": "line", - "text-letter-spacing": 0.1 - }, - "paint": { - "text-color": "#4AA8D8", - "text-halo-color": "rgba(20,25,32,0.92)", - "text-halo-width": 2 - } - }, - { - "id": "building-number-polygon", - "type": "symbol", - "source": "local-osm-polygons", - "source-layer": "planet_osm_polygon", - "minzoom": 17, - "filter": [ - "has", - "addr:housenumber" - ], - "layout": { - "text-field": "{addr:housenumber}", - "text-font": [ - "Noto Sans Regular" - ], - "text-size": 10, - "text-allow-overlap": false - }, - "paint": { - "text-color": "#8898A8", - "text-halo-color": "rgba(20,25,32,0.92)", - "text-halo-width": 1.5 - } - }, - { - "id": "building-number-point", - "type": "symbol", - "source": "local-osm-points", - "source-layer": "planet_osm_point", - "minzoom": 17, - "filter": [ - "has", - "addr:housenumber" - ], - "layout": { - "text-field": "{addr:housenumber}", - "text-font": [ - "Noto Sans Regular" - ], - "text-size": 10, - "text-allow-overlap": false - }, - "paint": { - "text-color": "#8898A8", - "text-halo-color": "rgba(20,25,32,0.92)", - "text-halo-width": 1.5 - } - }, - { - "id": "overture-building-names", - "type": "symbol", - "source": "overture_buildings", - "source-layer": "overture_building", - "minzoom": 17, - "filter": [ - "has", - "names" - ], - "layout": { - "text-field": [ - "coalesce", - [ - "get", - "names" - ], - "" - ], - "text-font": [ - "Noto Sans Regular" - ], - "text-size": 10, - "text-anchor": "center", - "text-allow-overlap": false, - "text-max-width": 8 - }, - "paint": { - "text-color": "#8898A8", - "text-halo-color": "rgba(20,25,32,0.92)", - "text-halo-width": 1.5 - } - }, - { - "id": "road-labels-minor", - "type": "symbol", - "source": "local-osm-lines", - "source-layer": "planet_osm_line", - "filter": [ - "in", - "highway", - "residential", - "service", - "unclassified", - "living_street" - ], - "minzoom": 16, - "layout": { - "text-field": [ - "coalesce", - [ - "get", - "name:ar" - ], - [ - "get", - "name" - ], - "" - ], - "text-font": [ - "Noto Sans Regular" - ], - "text-size": [ - "interpolate", - [ - "linear" - ], - [ - "zoom" - ], - 16, - 10, - 18, - 13 - ], - "symbol-placement": "line", - "text-rotation-alignment": "map", - "text-pitch-alignment": "viewport", - "text-keep-upright": true, - "text-max-angle": 25, - "symbol-spacing": 300, - "text-letter-spacing": 0.04, - "text-padding": 8, - "text-allow-overlap": false - }, - "paint": { - "text-color": "#8BA0B8", - "text-halo-color": "rgba(20,25,32,0.92)", - "text-halo-width": 1.8 - } - }, - { - "id": "road-labels-major", - "type": "symbol", - "source": "local-osm-lines", - "source-layer": "planet_osm_line", - "filter": [ - "in", - "highway", - "primary", - "secondary", - "tertiary", - "motorway", - "trunk" - ], - "minzoom": 12, - "layout": { - "text-field": [ - "coalesce", - [ - "get", - "name:ar" - ], - [ - "get", - "name" - ], - "" - ], - "text-font": [ - "Noto Sans Bold" - ], - "text-size": [ - "interpolate", - [ - "linear" - ], - [ - "zoom" - ], - 12, - 10, - 14, - 13, - 18, - 16 - ], - "symbol-placement": "line", - "text-rotation-alignment": "map", - "text-pitch-alignment": "viewport", - "text-keep-upright": true, - "text-max-angle": 22, - "symbol-spacing": 350, - "text-letter-spacing": 0.05, - "text-padding": 12, - "text-allow-overlap": false - }, - "paint": { - "text-color": "#C8D8E8", - "text-halo-color": "rgba(20,25,32,0.92)", - "text-halo-width": 2.5 - } - }, - { - "id": "overture-street-names", - "type": "symbol", - "source": "overture_segments", - "source-layer": "overture_segment", - "minzoom": 14, - "filter": [ - "has", - "names" - ], - "layout": { - "text-field": [ - "coalesce", - [ - "get", - "names" - ], - "" - ], - "text-font": [ - "Noto Sans Regular" - ], - "text-size": [ - "interpolate", - [ - "linear" - ], - [ - "zoom" - ], - 14, - 9, - 16, - 12, - 18, - 14 - ], - "symbol-placement": "line", - "text-rotation-alignment": "map", - "text-pitch-alignment": "viewport", - "text-keep-upright": true, - "text-max-angle": 28, - "symbol-spacing": 280, - "text-letter-spacing": 0.04, - "text-padding": 15, - "text-allow-overlap": false - }, - "paint": { - "text-color": "#8BA0B8", - "text-halo-color": "rgba(20,25,32,0.92)", - "text-halo-width": 2 - } - }, - { - "id": "poi-hospital", - "type": "symbol", - "source": "local-osm-points", - "source-layer": "planet_osm_point", - "minzoom": 13, - "filter": [ - "==", - "amenity", - "hospital" - ], - "layout": { - "icon-image": "hospital", - "icon-size": 1.0, - "text-field": [ - "coalesce", - [ - "get", - "name:ar" - ], - [ - "get", - "name" - ], - "" - ], - "text-font": [ - "Noto Sans Regular" - ], - "text-size": 11, - "text-offset": [ - 0, - 1.2 - ], - "text-anchor": "top", - "text-allow-overlap": false - }, - "paint": { - "text-color": "#FF6B6B", - "text-halo-color": "rgba(20,25,32,0.92)", - "text-halo-width": 2 - } - }, - { - "id": "poi-pharmacy", - "type": "symbol", - "source": "local-osm-points", - "source-layer": "planet_osm_point", - "minzoom": 15, - "filter": [ - "==", - "amenity", - "pharmacy" - ], - "layout": { - "icon-image": "pharmacy", - "icon-size": 0.8, - "text-field": [ - "coalesce", - [ - "get", - "name:ar" - ], - [ - "get", - "name" - ], - "" - ], - "text-font": [ - "Noto Sans Regular" - ], - "text-size": 11, - "text-offset": [ - 0, - 1.2 - ], - "text-anchor": "top", - "text-allow-overlap": false - }, - "paint": { - "text-color": "#4ADB80", - "text-halo-color": "rgba(20,25,32,0.92)", - "text-halo-width": 2 - } - }, - { - "id": "poi-place-of-worship", - "type": "symbol", - "source": "local-osm-points", - "source-layer": "planet_osm_point", - "minzoom": 14, - "filter": [ - "==", - "amenity", - "place_of_worship" - ], - "layout": { - "icon-image": "tourist", - "icon-size": 0.8, - "text-field": [ - "coalesce", - [ - "get", - "name:ar" - ], - [ - "get", - "name" - ], - "" - ], - "text-font": [ - "Noto Sans Regular" - ], - "text-size": 11, - "text-offset": [ - 0, - 1.2 - ], - "text-anchor": "top", - "text-allow-overlap": false - }, - "paint": { - "text-color": "#4ACA78", - "text-halo-color": "rgba(20,25,32,0.92)", - "text-halo-width": 2 - } - }, - { - "id": "poi-school", - "type": "symbol", - "source": "local-osm-points", - "source-layer": "planet_osm_point", - "minzoom": 14, - "filter": [ - "in", - "amenity", - "school", - "university", - "college" - ], - "layout": { - "icon-image": "college", - "icon-size": 0.8, - "text-field": [ - "coalesce", - [ - "get", - "name:ar" - ], - [ - "get", - "name" - ], - "" - ], - "text-font": [ - "Noto Sans Regular" - ], - "text-size": 11, - "text-offset": [ - 0, - 1.2 - ], - "text-anchor": "top", - "text-allow-overlap": false - }, - "paint": { - "text-color": "#A888E8", - "text-halo-color": "rgba(20,25,32,0.92)", - "text-halo-width": 2 - } - }, - { - "id": "poi-restaurant-cafe", - "type": "symbol", - "source": "local-osm-points", - "source-layer": "planet_osm_point", - "minzoom": 16, - "filter": [ - "in", - "amenity", - "restaurant", - "cafe", - "fast_food" - ], - "layout": { - "icon-image": [ - "match", - [ - "get", - "amenity" - ], - "cafe", - "cafe", - "restaurant" - ], - "icon-size": 0.8, - "text-field": [ - "coalesce", - [ - "get", - "name:ar" - ], - [ - "get", - "name" - ], - "" - ], - "text-font": [ - "Noto Sans Regular" - ], - "text-size": 10, - "text-offset": [ - 0, - 1.2 - ], - "text-anchor": "top" - }, - "paint": { - "text-color": "#A0B8D0", - "text-halo-color": "rgba(20,25,32,0.92)", - "text-halo-width": 1.5 - } - }, - { - "id": "poi-transit-station", - "type": "symbol", - "source": "local-osm-points", - "source-layer": "planet_osm_point", - "minzoom": 12, - "filter": [ - "any", - [ - "==", - "railway", - "station" - ], - [ - "==", - "railway", - "halt" - ], - [ - "==", - "railway", - "tram_stop" - ], - [ - "==", - "station", - "subway" - ], - [ - "==", - "amenity", - "bus_station" - ] - ], - "layout": { - "icon-image": "rail", - "icon-size": 1, - "text-field": [ - "coalesce", - [ - "get", - "name:ar" - ], - [ - "get", - "name" - ], - "" - ], - "text-font": [ - "Noto Sans Regular" - ], - "text-size": 11, - "text-offset": [ - 0, - 1.4 - ], - "text-anchor": "top", - "text-allow-overlap": false - }, - "paint": { - "text-color": "#FF5566", - "text-halo-color": "rgba(20,25,32,0.92)", - "text-halo-width": 2 - } - }, - { - "id": "place-labels-area", - "type": "symbol", - "source": "local-osm-polygons", - "source-layer": "planet_osm_polygon", - "minzoom": 10, - "filter": [ - "has", - "name" - ], - "layout": { - "text-field": [ - "coalesce", - [ - "get", - "name:ar" - ], - [ - "get", - "name" - ], - "" - ], - "text-font": [ - "Noto Sans Regular" - ], - "text-size": [ - "interpolate", - [ - "linear" - ], - [ - "zoom" - ], - 10, - 10, - 14, - 13 - ], - "text-padding": 8, - "text-allow-overlap": false - }, - "paint": { - "text-color": "#8AA0B8", - "text-halo-color": "rgba(20,25,32,0.92)", - "text-halo-width": 2 - } - }, - { - "id": "place-labels-point", - "type": "symbol", - "source": "local-osm-points", - "source-layer": "planet_osm_point", - "minzoom": 10, - "filter": [ - "any", - [ - "in", - "place", - "city", - "town", - "village", - "suburb", - "neighbourhood", - "hamlet", - "locality", - "quarter" - ], - [ - "in", - "natural", - "peak", - "spring" - ] - ], - "layout": { - "text-field": [ - "coalesce", - [ - "get", - "name:ar" - ], - [ - "get", - "name" - ], - "" - ], - "text-font": [ - "Noto Sans Regular" - ], - "text-size": [ - "interpolate", - [ - "linear" - ], - [ - "zoom" - ], - 10, - [ - "match", - [ - "get", - "place" - ], - "city", - 16, - "town", - 14, - 11 - ], - 14, - [ - "match", - [ - "get", - "place" - ], - "city", - 20, - "town", - 16, - 13 - ], - 17, - 14 - ], - "text-letter-spacing": [ - "match", - [ - "get", - "place" - ], - "city", - 0.08, - "town", - 0.05, - 0.02 - ], - "text-anchor": "center", - "text-padding": 10, - "text-allow-overlap": false - }, - "paint": { - "text-color": [ - "match", - [ - "get", - "place" - ], - "city", - "#D0E0F0", - "town", - "#B8CDE0", - "suburb", - "#8AA0B8", - "neighbourhood", - "#8AA0B8", - "#8AA0B8" - ], - "text-halo-color": "rgba(20,25,32,0.92)", - "text-halo-width": [ - "match", - [ - "get", - "place" - ], - "city", - 3, - "town", - 2.5, - 2 - ] - } - }, - { - "id": "places-egypt-labels", - "type": "symbol", - "source": "places_egypt", - "source-layer": "places_egypt", - "minzoom": 12, - "filter": [ - "!in", - "category", - "street" - ], - "layout": { - "text-field": [ - "coalesce", - [ - "get", - "name_ar" - ], - [ - "get", - "name" - ], - "" - ], - "text-font": [ - "Noto Sans Bold" - ], - "text-size": [ - "interpolate", - [ - "linear" - ], - [ - "zoom" - ], - 12, - 9, - 16, - 13 - ], - "text-offset": [ - 0, - 1.5 - ], - "text-anchor": "top", - "text-padding": 8, - "text-allow-overlap": false - }, - "paint": { - "text-color": "#A8C0D8", - "text-halo-color": "rgba(20,25,32,0.92)", - "text-halo-width": 2 - } - }, - { - "id": "places-syria-labels", - "type": "symbol", - "source": "places_syria", - "source-layer": "places_syria", - "minzoom": 10, - "filter": [ - "!in", - "category", - "street" - ], - "layout": { - "text-field": [ - "coalesce", - [ - "get", - "name_ar" - ], - [ - "get", - "name" - ], - "" - ], - "text-font": [ - "Noto Sans Bold" - ], - "text-size": [ - "interpolate", - [ - "linear" - ], - [ - "zoom" - ], - 12, - 9, - 16, - 13 - ], - "text-offset": [ - 0, - 1.5 - ], - "text-anchor": "top", - "text-padding": 8, - "text-allow-overlap": false - }, - "paint": { - "text-color": "#A8C0D8", - "text-halo-color": "rgba(20,25,32,0.92)", - "text-halo-width": 2 - } - }, - { - "id": "places-jordan-labels", - "type": "symbol", - "source": "places_jordan", - "source-layer": "places_jordan", - "minzoom": 10, - "filter": [ - "!in", - "category", - "street" - ], - "layout": { - "text-field": [ - "coalesce", - [ - "get", - "name_ar" - ], - [ - "get", - "name" - ], - "" - ], - "text-font": [ - "Noto Sans Bold" - ], - "text-size": [ - "interpolate", - [ - "linear" - ], - [ - "zoom" - ], - 12, - 9, - 16, - 13 - ], - "text-offset": [ - 0, - 1.5 - ], - "text-anchor": "top", - "text-padding": 8, - "text-allow-overlap": false - }, - "paint": { - "text-color": "#A8C0D8", - "text-halo-color": "rgba(20,25,32,0.92)", - "text-halo-width": 2 - } - } - ] -} \ No newline at end of file diff --git a/apps/driver_new/ios/.gitignore b/apps/driver_new/ios/.gitignore deleted file mode 100755 index 7a7f987..0000000 --- a/apps/driver_new/ios/.gitignore +++ /dev/null @@ -1,34 +0,0 @@ -**/dgph -*.mode1v3 -*.mode2v3 -*.moved-aside -*.pbxuser -*.perspectivev3 -**/*sync/ -.sconsign.dblite -.tags* -**/.vagrant/ -**/DerivedData/ -Icon? -**/Pods/ -**/.symlinks/ -profile -xcuserdata -**/.generated/ -Flutter/App.framework -Flutter/Flutter.framework -Flutter/Flutter.podspec -Flutter/Generated.xcconfig -Flutter/ephemeral/ -Flutter/app.flx -Flutter/app.zip -Flutter/flutter_assets/ -Flutter/flutter_export_environment.sh -ServiceDefinitions.json -Runner/GeneratedPluginRegistrant.* - -# Exceptions to above rules. -!default.mode1v3 -!default.mode2v3 -!default.pbxuser -!default.perspectivev3 diff --git a/apps/driver_new/ios/Flutter/AppFrameworkInfo.plist b/apps/driver_new/ios/Flutter/AppFrameworkInfo.plist deleted file mode 100755 index 391a902..0000000 --- a/apps/driver_new/ios/Flutter/AppFrameworkInfo.plist +++ /dev/null @@ -1,24 +0,0 @@ - - - - - CFBundleDevelopmentRegion - en - CFBundleExecutable - App - CFBundleIdentifier - io.flutter.flutter.app - CFBundleInfoDictionaryVersion - 6.0 - CFBundleName - App - CFBundlePackageType - FMWK - CFBundleShortVersionString - 1.0 - CFBundleSignature - ???? - CFBundleVersion - 1.0 - - diff --git a/apps/driver_new/ios/Flutter/Debug.xcconfig b/apps/driver_new/ios/Flutter/Debug.xcconfig deleted file mode 100755 index ec97fc6..0000000 --- a/apps/driver_new/ios/Flutter/Debug.xcconfig +++ /dev/null @@ -1,2 +0,0 @@ -#include? "Pods/Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig" -#include "Generated.xcconfig" diff --git a/apps/driver_new/ios/Flutter/Release.xcconfig b/apps/driver_new/ios/Flutter/Release.xcconfig deleted file mode 100755 index c4855bf..0000000 --- a/apps/driver_new/ios/Flutter/Release.xcconfig +++ /dev/null @@ -1,2 +0,0 @@ -#include? "Pods/Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig" -#include "Generated.xcconfig" diff --git a/apps/driver_new/ios/Podfile b/apps/driver_new/ios/Podfile deleted file mode 100755 index 2443338..0000000 --- a/apps/driver_new/ios/Podfile +++ /dev/null @@ -1,63 +0,0 @@ -platform :ios, '14.0' -$iOSVersion = '14.0' # or your desired version - -ENV['COCOAPODS_DISABLE_STATS'] = 'true' - -project 'Runner', { - 'Debug' => :debug, - 'Profile' => :release, - 'Release' => :release, -} - -def flutter_root - generated_xcode_build_settings_path = File.expand_path(File.join('..', 'Flutter', 'Generated.xcconfig'), __FILE__) - unless File.exist?(generated_xcode_build_settings_path) - raise "#{generated_xcode_build_settings_path} must exist. If you're running pod install manually, make sure flutter pub get is executed first" - end - - File.foreach(generated_xcode_build_settings_path) do |line| - matches = line.match(/FLUTTER_ROOT\=(.*)/) - return matches[1].strip if matches - end - raise "FLUTTER_ROOT not found in #{generated_xcode_build_settings_path}. Try deleting Generated.xcconfig, then run flutter pub get" -end - -require File.expand_path(File.join('packages', 'flutter_tools', 'bin', 'podhelper'), flutter_root) - -flutter_ios_podfile_setup - -target 'Runner' do - use_frameworks! :linkage => :dynamic - pod 'Firebase', :modular_headers => true - - # Explicitly enable modular headers for firebase_messaging and other Firebase-related pods - pod 'FirebaseMessaging', :modular_headers => true - pod 'FirebaseCore', :modular_headers => true - pod 'FirebaseAuth', :modular_headers => true - - flutter_install_all_ios_pods File.dirname(File.realpath(__FILE__)) - - target 'RunnerTests' do - inherit! :search_paths - end -end - -post_install do |installer| - installer.pods_project.build_configurations.each do |config| - config.build_settings["EXCLUDED_ARCHS[sdk=*]"] = "armv7" - config.build_settings['IPHONEOS_DEPLOYMENT_TARGET'] = $iOSVersion - end - - installer.pods_project.targets.each do |target| - flutter_additional_ios_build_settings(target) - target.build_configurations.each do |config| - if Gem::Version.new($iOSVersion) > Gem::Version.new(config.build_settings['IPHONEOS_DEPLOYMENT_TARGET']) - config.build_settings['IPHONEOS_DEPLOYMENT_TARGET'] = $iOSVersion - end - config.build_settings['GCC_PREPROCESSOR_DEFINITIONS'] ||= [ - '$(inherited)', - 'PERMISSION_LOCATION=1', - ] - end - end -end diff --git a/apps/driver_new/ios/Runner.xcodeproj/project.pbxproj b/apps/driver_new/ios/Runner.xcodeproj/project.pbxproj deleted file mode 100755 index fa5a6e2..0000000 --- a/apps/driver_new/ios/Runner.xcodeproj/project.pbxproj +++ /dev/null @@ -1,832 +0,0 @@ -// !$*UTF8*$! -{ - archiveVersion = 1; - classes = { - }; - objectVersion = 54; - objects = { - -/* Begin PBXBuildFile section */ - 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */ = {isa = PBXBuildFile; fileRef = 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */; }; - 331C808B294A63AB00263BE5 /* RunnerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 331C807B294A618700263BE5 /* RunnerTests.swift */; }; - 38BFC4984B1B26A880FE76DE /* Pods_RunnerTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 2AC5295B6ADEC13901A4281A /* Pods_RunnerTests.framework */; }; - 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */ = {isa = PBXBuildFile; fileRef = 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */; }; - 3CEA26D0738D4C4B62323122 /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = A1987A597103D3E58DD06571 /* Pods_Runner.framework */; }; - 74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 74858FAE1ED2DC5600515810 /* AppDelegate.swift */; }; - 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FA1CF9000F007C117D /* Main.storyboard */; }; - 97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FD1CF9000F007C117D /* Assets.xcassets */; }; - 97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */; }; - C604FDB02D6C8D6A00CF8873 /* Constants.swift in Sources */ = {isa = PBXBuildFile; fileRef = C604FDAF2D6C8D6000CF8873 /* Constants.swift */; }; - C604FDB22D6C953400CF8873 /* JailbreakDetection.swift in Sources */ = {isa = PBXBuildFile; fileRef = C604FDB12D6C953100CF8873 /* JailbreakDetection.swift */; }; - C604FDB52D6C96D000CF8873 /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = C604FDB32D6C96D000CF8873 /* Localizable.strings */; }; - C624C4642BD56D34002834AF /* tone1.mp3 in Resources */ = {isa = PBXBuildFile; fileRef = C624C45C2BD56D34002834AF /* tone1.mp3 */; }; - C624C4652BD56D34002834AF /* start.wav in Resources */ = {isa = PBXBuildFile; fileRef = C624C45D2BD56D34002834AF /* start.wav */; }; - C624C4672BD56D34002834AF /* promo.wav in Resources */ = {isa = PBXBuildFile; fileRef = C624C45F2BD56D34002834AF /* promo.wav */; }; - C624C4682BD56D34002834AF /* cancel.wav in Resources */ = {isa = PBXBuildFile; fileRef = C624C4602BD56D34002834AF /* cancel.wav */; }; - C624C4692BD56D34002834AF /* iphone_ringtone.wav in Resources */ = {isa = PBXBuildFile; fileRef = C624C4612BD56D34002834AF /* iphone_ringtone.wav */; }; - C624C46A2BD56D34002834AF /* order1.wav in Resources */ = {isa = PBXBuildFile; fileRef = C624C4622BD56D34002834AF /* order1.wav */; }; - C628BC3F2C31427000E4D33B /* ding.wav in Resources */ = {isa = PBXBuildFile; fileRef = C628BC3E2C31427000E4D33B /* ding.wav */; }; - C638D7C62D884B7A009B4DF9 /* SecurityChecks.m in Sources */ = {isa = PBXBuildFile; fileRef = C638D7C52D884B7A009B4DF9 /* SecurityChecks.m */; }; - C638D7C82D884BE3009B4DF9 /* Config.plist in Resources */ = {isa = PBXBuildFile; fileRef = C638D7C72D884BE2009B4DF9 /* Config.plist */; }; - C690B4752A80554500E1D66E /* GoogleService-Info.plist in Resources */ = {isa = PBXBuildFile; fileRef = C690B4742A80554500E1D66E /* GoogleService-Info.plist */; }; - C6B15AA12B5FB24600746405 /* order.wav in Resources */ = {isa = PBXBuildFile; fileRef = C6B15A9F2B5FB24600746405 /* order.wav */; }; - C6B15AA22B5FB24600746405 /* tone2.wav in Resources */ = {isa = PBXBuildFile; fileRef = C6B15AA02B5FB24600746405 /* tone2.wav */; }; -/* End PBXBuildFile section */ - -/* Begin PBXContainerItemProxy section */ - 331C8085294A63A400263BE5 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 97C146E61CF9000F007C117D /* Project object */; - proxyType = 1; - remoteGlobalIDString = 97C146ED1CF9000F007C117D; - remoteInfo = Runner; - }; -/* End PBXContainerItemProxy section */ - -/* Begin PBXCopyFilesBuildPhase section */ - 9705A1C41CF9048500538489 /* Embed Frameworks */ = { - isa = PBXCopyFilesBuildPhase; - buildActionMask = 2147483647; - dstPath = ""; - dstSubfolderSpec = 10; - files = ( - ); - name = "Embed Frameworks"; - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXCopyFilesBuildPhase section */ - -/* Begin PBXFileReference section */ - 0116059C9A3684AC66E6EA10 /* Pods-RunnerTests.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.profile.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.profile.xcconfig"; sourceTree = ""; }; - 0A588BA0B74F002C38F0E4F0 /* Pods-RunnerTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.debug.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.debug.xcconfig"; sourceTree = ""; }; - 1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GeneratedPluginRegistrant.h; sourceTree = ""; }; - 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GeneratedPluginRegistrant.m; sourceTree = ""; }; - 169535ADE82517D8C1F876D0 /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = ""; }; - 20CE5C1BB6B23CE4706F0F53 /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = ""; }; - 2AC5295B6ADEC13901A4281A /* Pods_RunnerTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_RunnerTests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - 331C807B294A618700263BE5 /* RunnerTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RunnerTests.swift; sourceTree = ""; }; - 331C8081294A63A400263BE5 /* RunnerTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = RunnerTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; - 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = AppFrameworkInfo.plist; path = Flutter/AppFrameworkInfo.plist; sourceTree = ""; }; - 74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Runner-Bridging-Header.h"; sourceTree = ""; }; - 74858FAE1ED2DC5600515810 /* AppDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; - 7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = Release.xcconfig; path = Flutter/Release.xcconfig; sourceTree = ""; }; - 9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Debug.xcconfig; path = Flutter/Debug.xcconfig; sourceTree = ""; }; - 9740EEB31CF90195004384FC /* Generated.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Generated.xcconfig; path = Flutter/Generated.xcconfig; sourceTree = ""; }; - 97C146EE1CF9000F007C117D /* Runner.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Runner.app; sourceTree = BUILT_PRODUCTS_DIR; }; - 97C146FB1CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; - 97C146FD1CF9000F007C117D /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; - 97C147001CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; - 97C147021CF9000F007C117D /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - A1987A597103D3E58DD06571 /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - C604FDAF2D6C8D6000CF8873 /* Constants.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Constants.swift; sourceTree = ""; }; - C604FDB12D6C953100CF8873 /* JailbreakDetection.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = JailbreakDetection.swift; sourceTree = ""; }; - C604FDB42D6C96D000CF8873 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/Localizable.strings; sourceTree = ""; }; - C624C45C2BD56D34002834AF /* tone1.mp3 */ = {isa = PBXFileReference; lastKnownFileType = audio.mp3; name = tone1.mp3; path = ../../android/app/src/main/res/raw/tone1.mp3; sourceTree = ""; }; - C624C45D2BD56D34002834AF /* start.wav */ = {isa = PBXFileReference; lastKnownFileType = audio.wav; name = start.wav; path = ../../android/app/src/main/res/raw/start.wav; sourceTree = ""; }; - C624C45F2BD56D34002834AF /* promo.wav */ = {isa = PBXFileReference; lastKnownFileType = audio.wav; name = promo.wav; path = ../../android/app/src/main/res/raw/promo.wav; sourceTree = ""; }; - C624C4602BD56D34002834AF /* cancel.wav */ = {isa = PBXFileReference; lastKnownFileType = audio.wav; name = cancel.wav; path = ../../android/app/src/main/res/raw/cancel.wav; sourceTree = ""; }; - C624C4612BD56D34002834AF /* iphone_ringtone.wav */ = {isa = PBXFileReference; lastKnownFileType = audio.wav; name = iphone_ringtone.wav; path = ../../android/app/src/main/res/raw/iphone_ringtone.wav; sourceTree = ""; }; - C624C4622BD56D34002834AF /* order1.wav */ = {isa = PBXFileReference; lastKnownFileType = audio.wav; name = order1.wav; path = ../../android/app/src/main/res/raw/order1.wav; sourceTree = ""; }; - C628BC3E2C31427000E4D33B /* ding.wav */ = {isa = PBXFileReference; lastKnownFileType = audio.wav; name = ding.wav; path = ../../android/app/src/main/res/raw/ding.wav; sourceTree = ""; }; - C638D7C42D884B54009B4DF9 /* SecurityChecks.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = SecurityChecks.h; sourceTree = ""; }; - C638D7C52D884B7A009B4DF9 /* SecurityChecks.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = SecurityChecks.m; sourceTree = ""; }; - C638D7C72D884BE2009B4DF9 /* Config.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Config.plist; sourceTree = ""; }; - C690B4742A80554500E1D66E /* GoogleService-Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = "GoogleService-Info.plist"; sourceTree = ""; }; - C69588332A8C1F6B00C3AC67 /* Runner.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = Runner.entitlements; sourceTree = ""; }; - C6B15A9F2B5FB24600746405 /* order.wav */ = {isa = PBXFileReference; lastKnownFileType = audio.wav; path = order.wav; sourceTree = ""; }; - C6B15AA02B5FB24600746405 /* tone2.wav */ = {isa = PBXFileReference; lastKnownFileType = audio.wav; path = tone2.wav; sourceTree = ""; }; - F13EEC8BD3BD109D175EA06D /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = ""; }; - F8C2B267C197A536F06ED67A /* Pods-RunnerTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.release.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.release.xcconfig"; sourceTree = ""; }; -/* End PBXFileReference section */ - -/* Begin PBXFrameworksBuildPhase section */ - 7AD318F74F39A70FCC91E66D /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - 38BFC4984B1B26A880FE76DE /* Pods_RunnerTests.framework in Frameworks */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 97C146EB1CF9000F007C117D /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - 3CEA26D0738D4C4B62323122 /* Pods_Runner.framework in Frameworks */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXFrameworksBuildPhase section */ - -/* Begin PBXGroup section */ - 331C8082294A63A400263BE5 /* RunnerTests */ = { - isa = PBXGroup; - children = ( - 331C807B294A618700263BE5 /* RunnerTests.swift */, - ); - path = RunnerTests; - sourceTree = ""; - }; - 5684D45491D29A320AB8001A /* Pods */ = { - isa = PBXGroup; - children = ( - 169535ADE82517D8C1F876D0 /* Pods-Runner.debug.xcconfig */, - F13EEC8BD3BD109D175EA06D /* Pods-Runner.release.xcconfig */, - 20CE5C1BB6B23CE4706F0F53 /* Pods-Runner.profile.xcconfig */, - 0A588BA0B74F002C38F0E4F0 /* Pods-RunnerTests.debug.xcconfig */, - F8C2B267C197A536F06ED67A /* Pods-RunnerTests.release.xcconfig */, - 0116059C9A3684AC66E6EA10 /* Pods-RunnerTests.profile.xcconfig */, - ); - path = Pods; - sourceTree = ""; - }; - 9740EEB11CF90186004384FC /* Flutter */ = { - isa = PBXGroup; - children = ( - 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */, - 9740EEB21CF90195004384FC /* Debug.xcconfig */, - 7AFA3C8E1D35360C0083082E /* Release.xcconfig */, - 9740EEB31CF90195004384FC /* Generated.xcconfig */, - ); - name = Flutter; - sourceTree = ""; - }; - 97C146E51CF9000F007C117D = { - isa = PBXGroup; - children = ( - 9740EEB11CF90186004384FC /* Flutter */, - 97C146F01CF9000F007C117D /* Runner */, - 97C146EF1CF9000F007C117D /* Products */, - 331C8082294A63A400263BE5 /* RunnerTests */, - 5684D45491D29A320AB8001A /* Pods */, - A3767309D6B5681282917CC7 /* Frameworks */, - ); - sourceTree = ""; - }; - 97C146EF1CF9000F007C117D /* Products */ = { - isa = PBXGroup; - children = ( - 97C146EE1CF9000F007C117D /* Runner.app */, - 331C8081294A63A400263BE5 /* RunnerTests.xctest */, - ); - name = Products; - sourceTree = ""; - }; - 97C146F01CF9000F007C117D /* Runner */ = { - isa = PBXGroup; - children = ( - C69588332A8C1F6B00C3AC67 /* Runner.entitlements */, - C638D7C52D884B7A009B4DF9 /* SecurityChecks.m */, - C6B15A9F2B5FB24600746405 /* order.wav */, - C6B15AA02B5FB24600746405 /* tone2.wav */, - C624C4602BD56D34002834AF /* cancel.wav */, - C624C4612BD56D34002834AF /* iphone_ringtone.wav */, - C628BC3E2C31427000E4D33B /* ding.wav */, - C624C4622BD56D34002834AF /* order1.wav */, - C624C45F2BD56D34002834AF /* promo.wav */, - C624C45D2BD56D34002834AF /* start.wav */, - C624C45C2BD56D34002834AF /* tone1.mp3 */, - 97C146FA1CF9000F007C117D /* Main.storyboard */, - 97C146FD1CF9000F007C117D /* Assets.xcassets */, - 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */, - 97C147021CF9000F007C117D /* Info.plist */, - C690B4742A80554500E1D66E /* GoogleService-Info.plist */, - 1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */, - 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */, - 74858FAE1ED2DC5600515810 /* AppDelegate.swift */, - C604FDB12D6C953100CF8873 /* JailbreakDetection.swift */, - C604FDB32D6C96D000CF8873 /* Localizable.strings */, - C604FDAF2D6C8D6000CF8873 /* Constants.swift */, - 74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */, - C638D7C42D884B54009B4DF9 /* SecurityChecks.h */, - C638D7C72D884BE2009B4DF9 /* Config.plist */, - ); - path = Runner; - sourceTree = ""; - }; - A3767309D6B5681282917CC7 /* Frameworks */ = { - isa = PBXGroup; - children = ( - A1987A597103D3E58DD06571 /* Pods_Runner.framework */, - 2AC5295B6ADEC13901A4281A /* Pods_RunnerTests.framework */, - ); - name = Frameworks; - sourceTree = ""; - }; -/* End PBXGroup section */ - -/* Begin PBXNativeTarget section */ - 331C8080294A63A400263BE5 /* RunnerTests */ = { - isa = PBXNativeTarget; - buildConfigurationList = 331C8087294A63A400263BE5 /* Build configuration list for PBXNativeTarget "RunnerTests" */; - buildPhases = ( - 6A195BB0776CA9E53EAA143A /* [CP] Check Pods Manifest.lock */, - 331C807D294A63A400263BE5 /* Sources */, - 331C807F294A63A400263BE5 /* Resources */, - 7AD318F74F39A70FCC91E66D /* Frameworks */, - ); - buildRules = ( - ); - dependencies = ( - 331C8086294A63A400263BE5 /* PBXTargetDependency */, - ); - name = RunnerTests; - productName = RunnerTests; - productReference = 331C8081294A63A400263BE5 /* RunnerTests.xctest */; - productType = "com.apple.product-type.bundle.unit-test"; - }; - 97C146ED1CF9000F007C117D /* Runner */ = { - isa = PBXNativeTarget; - buildConfigurationList = 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */; - buildPhases = ( - 495F1A7DF9442FE345F87EDB /* [CP] Check Pods Manifest.lock */, - 9740EEB61CF901F6004384FC /* Run Script */, - 97C146EA1CF9000F007C117D /* Sources */, - 97C146EB1CF9000F007C117D /* Frameworks */, - 97C146EC1CF9000F007C117D /* Resources */, - 9705A1C41CF9048500538489 /* Embed Frameworks */, - 3B06AD1E1E4923F5004D2608 /* Thin Binary */, - 87F758C3C5B8AE624C4BE481 /* [CP] Embed Pods Frameworks */, - 99A28AAD8EACCE6238494873 /* [CP] Copy Pods Resources */, - ); - buildRules = ( - ); - dependencies = ( - ); - name = Runner; - productName = Runner; - productReference = 97C146EE1CF9000F007C117D /* Runner.app */; - productType = "com.apple.product-type.application"; - }; -/* End PBXNativeTarget section */ - -/* Begin PBXProject section */ - 97C146E61CF9000F007C117D /* Project object */ = { - isa = PBXProject; - attributes = { - BuildIndependentTargetsInParallel = YES; - LastUpgradeCheck = 1510; - ORGANIZATIONNAME = ""; - TargetAttributes = { - 331C8080294A63A400263BE5 = { - CreatedOnToolsVersion = 14.0; - TestTargetID = 97C146ED1CF9000F007C117D; - }; - 97C146ED1CF9000F007C117D = { - CreatedOnToolsVersion = 7.3.1; - LastSwiftMigration = 1100; - }; - }; - }; - buildConfigurationList = 97C146E91CF9000F007C117D /* Build configuration list for PBXProject "Runner" */; - compatibilityVersion = "Xcode 9.3"; - developmentRegion = en; - hasScannedForEncodings = 0; - knownRegions = ( - en, - Base, - ); - mainGroup = 97C146E51CF9000F007C117D; - productRefGroup = 97C146EF1CF9000F007C117D /* Products */; - projectDirPath = ""; - projectRoot = ""; - targets = ( - 97C146ED1CF9000F007C117D /* Runner */, - 331C8080294A63A400263BE5 /* RunnerTests */, - ); - }; -/* End PBXProject section */ - -/* Begin PBXResourcesBuildPhase section */ - 331C807F294A63A400263BE5 /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 97C146EC1CF9000F007C117D /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - C6B15AA22B5FB24600746405 /* tone2.wav in Resources */, - C624C4652BD56D34002834AF /* start.wav in Resources */, - C624C4672BD56D34002834AF /* promo.wav in Resources */, - C624C46A2BD56D34002834AF /* order1.wav in Resources */, - 97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */, - C624C4682BD56D34002834AF /* cancel.wav in Resources */, - C6B15AA12B5FB24600746405 /* order.wav in Resources */, - 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */, - C628BC3F2C31427000E4D33B /* ding.wav in Resources */, - C690B4752A80554500E1D66E /* GoogleService-Info.plist in Resources */, - C604FDB52D6C96D000CF8873 /* Localizable.strings in Resources */, - 97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */, - C638D7C82D884BE3009B4DF9 /* Config.plist in Resources */, - C624C4692BD56D34002834AF /* iphone_ringtone.wav in Resources */, - C624C4642BD56D34002834AF /* tone1.mp3 in Resources */, - 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXResourcesBuildPhase section */ - -/* Begin PBXShellScriptBuildPhase section */ - 3B06AD1E1E4923F5004D2608 /* Thin Binary */ = { - isa = PBXShellScriptBuildPhase; - alwaysOutOfDate = 1; - buildActionMask = 2147483647; - files = ( - ); - inputPaths = ( - "${TARGET_BUILD_DIR}/${INFOPLIST_PATH}", - ); - name = "Thin Binary"; - outputPaths = ( - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" embed_and_thin"; - }; - 495F1A7DF9442FE345F87EDB /* [CP] Check Pods Manifest.lock */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputFileListPaths = ( - ); - inputPaths = ( - "${PODS_PODFILE_DIR_PATH}/Podfile.lock", - "${PODS_ROOT}/Manifest.lock", - ); - name = "[CP] Check Pods Manifest.lock"; - outputFileListPaths = ( - ); - outputPaths = ( - "$(DERIVED_FILE_DIR)/Pods-Runner-checkManifestLockResult.txt", - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; - showEnvVarsInLog = 0; - }; - 6A195BB0776CA9E53EAA143A /* [CP] Check Pods Manifest.lock */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputFileListPaths = ( - ); - inputPaths = ( - "${PODS_PODFILE_DIR_PATH}/Podfile.lock", - "${PODS_ROOT}/Manifest.lock", - ); - name = "[CP] Check Pods Manifest.lock"; - outputFileListPaths = ( - ); - outputPaths = ( - "$(DERIVED_FILE_DIR)/Pods-RunnerTests-checkManifestLockResult.txt", - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; - showEnvVarsInLog = 0; - }; - 87F758C3C5B8AE624C4BE481 /* [CP] Embed Pods Frameworks */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputFileListPaths = ( - "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-input-files.xcfilelist", - ); - name = "[CP] Embed Pods Frameworks"; - outputFileListPaths = ( - "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-output-files.xcfilelist", - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n"; - showEnvVarsInLog = 0; - }; - 9740EEB61CF901F6004384FC /* Run Script */ = { - isa = PBXShellScriptBuildPhase; - alwaysOutOfDate = 1; - buildActionMask = 2147483647; - files = ( - ); - inputPaths = ( - ); - name = "Run Script"; - outputPaths = ( - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" build"; - }; - 99A28AAD8EACCE6238494873 /* [CP] Copy Pods Resources */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputFileListPaths = ( - "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-resources-${CONFIGURATION}-input-files.xcfilelist", - ); - name = "[CP] Copy Pods Resources"; - outputFileListPaths = ( - "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-resources-${CONFIGURATION}-output-files.xcfilelist", - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-resources.sh\"\n"; - showEnvVarsInLog = 0; - }; -/* End PBXShellScriptBuildPhase section */ - -/* Begin PBXSourcesBuildPhase section */ - 331C807D294A63A400263BE5 /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 331C808B294A63AB00263BE5 /* RunnerTests.swift in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 97C146EA1CF9000F007C117D /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */, - C638D7C62D884B7A009B4DF9 /* SecurityChecks.m in Sources */, - 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */, - C604FDB02D6C8D6A00CF8873 /* Constants.swift in Sources */, - C604FDB22D6C953400CF8873 /* JailbreakDetection.swift in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXSourcesBuildPhase section */ - -/* Begin PBXTargetDependency section */ - 331C8086294A63A400263BE5 /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - target = 97C146ED1CF9000F007C117D /* Runner */; - targetProxy = 331C8085294A63A400263BE5 /* PBXContainerItemProxy */; - }; -/* End PBXTargetDependency section */ - -/* Begin PBXVariantGroup section */ - 97C146FA1CF9000F007C117D /* Main.storyboard */ = { - isa = PBXVariantGroup; - children = ( - 97C146FB1CF9000F007C117D /* Base */, - ); - name = Main.storyboard; - sourceTree = ""; - }; - 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */ = { - isa = PBXVariantGroup; - children = ( - 97C147001CF9000F007C117D /* Base */, - ); - name = LaunchScreen.storyboard; - sourceTree = ""; - }; - C604FDB32D6C96D000CF8873 /* Localizable.strings */ = { - isa = PBXVariantGroup; - children = ( - C604FDB42D6C96D000CF8873 /* en */, - ); - name = Localizable.strings; - sourceTree = ""; - }; -/* End PBXVariantGroup section */ - -/* Begin XCBuildConfiguration section */ - 249021D3217E4FDB00AE95B9 /* Profile */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - CLANG_ANALYZER_NONNULL = YES; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; - CLANG_CXX_LIBRARY = "libc++"; - CLANG_ENABLE_MODULES = YES; - CLANG_ENABLE_OBJC_ARC = YES; - CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_COMMA = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; - CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INFINITE_RECURSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; - CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; - CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; - CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; - CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; - 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; - }; - 249021D4217E4FDB00AE95B9 /* Profile */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; - buildSettings = { - ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; - CLANG_ENABLE_MODULES = YES; - CODE_SIGN_ENTITLEMENTS = Runner/Runner.entitlements; - CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; - DEVELOPMENT_TEAM = 63CVT8G5P8; - ENABLE_BITCODE = NO; - INFOPLIST_FILE = Runner/Info.plist; - INFOPLIST_KEY_CFBundleDisplayName = "Sefer Driver"; - INFOPLIST_KEY_LSApplicationCategoryType = "public.app-category.travel"; - LD_RUNPATH_SEARCH_PATHS = ( - "$(inherited)", - "@executable_path/Frameworks", - ); - PRODUCT_BUNDLE_IDENTIFIER = com.sefer.driver; - PRODUCT_NAME = "$(TARGET_NAME)"; - SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; - SWIFT_VERSION = 5.0; - VERSIONING_SYSTEM = "apple-generic"; - }; - name = Profile; - }; - 331C8088294A63A400263BE5 /* Debug */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 0A588BA0B74F002C38F0E4F0 /* Pods-RunnerTests.debug.xcconfig */; - buildSettings = { - BUNDLE_LOADER = "$(TEST_HOST)"; - CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 1; - DEVELOPMENT_TEAM = 63CVT8G5P8; - GENERATE_INFOPLIST_FILE = YES; - MARKETING_VERSION = 1.0; - PRODUCT_BUNDLE_IDENTIFIER = com.sefer.driver.RunnerTests; - 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; - }; - 331C8089294A63A400263BE5 /* Release */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = F8C2B267C197A536F06ED67A /* Pods-RunnerTests.release.xcconfig */; - buildSettings = { - BUNDLE_LOADER = "$(TEST_HOST)"; - CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 1; - DEVELOPMENT_TEAM = 63CVT8G5P8; - GENERATE_INFOPLIST_FILE = YES; - MARKETING_VERSION = 1.0; - PRODUCT_BUNDLE_IDENTIFIER = com.sefer.driver.RunnerTests; - PRODUCT_NAME = "$(TARGET_NAME)"; - SWIFT_VERSION = 5.0; - TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Runner.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/Runner"; - }; - name = Release; - }; - 331C808A294A63A400263BE5 /* Profile */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 0116059C9A3684AC66E6EA10 /* Pods-RunnerTests.profile.xcconfig */; - buildSettings = { - BUNDLE_LOADER = "$(TEST_HOST)"; - CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 1; - DEVELOPMENT_TEAM = 63CVT8G5P8; - GENERATE_INFOPLIST_FILE = YES; - MARKETING_VERSION = 1.0; - PRODUCT_BUNDLE_IDENTIFIER = com.sefer.driver.RunnerTests; - PRODUCT_NAME = "$(TARGET_NAME)"; - SWIFT_VERSION = 5.0; - TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Runner.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/Runner"; - }; - name = Profile; - }; - 97C147031CF9000F007C117D /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - CLANG_ANALYZER_NONNULL = YES; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; - CLANG_CXX_LIBRARY = "libc++"; - CLANG_ENABLE_MODULES = YES; - CLANG_ENABLE_OBJC_ARC = YES; - CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_COMMA = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; - CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INFINITE_RECURSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; - CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; - CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; - CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; - CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; - 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; - }; - 97C147041CF9000F007C117D /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - CLANG_ANALYZER_NONNULL = YES; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; - CLANG_CXX_LIBRARY = "libc++"; - CLANG_ENABLE_MODULES = YES; - CLANG_ENABLE_OBJC_ARC = YES; - CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_COMMA = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; - CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INFINITE_RECURSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; - CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; - CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; - CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; - CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; - 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; - }; - 97C147061CF9000F007C117D /* Debug */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 9740EEB21CF90195004384FC /* Debug.xcconfig */; - buildSettings = { - ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; - CLANG_ENABLE_MODULES = YES; - CODE_SIGN_ENTITLEMENTS = Runner/Runner.entitlements; - CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; - DEVELOPMENT_TEAM = 63CVT8G5P8; - ENABLE_BITCODE = NO; - INFOPLIST_FILE = Runner/Info.plist; - INFOPLIST_KEY_CFBundleDisplayName = "Sefer Driver"; - INFOPLIST_KEY_LSApplicationCategoryType = "public.app-category.travel"; - LD_RUNPATH_SEARCH_PATHS = ( - "$(inherited)", - "@executable_path/Frameworks", - ); - PRODUCT_BUNDLE_IDENTIFIER = com.sefer.driver; - PRODUCT_NAME = "$(TARGET_NAME)"; - SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; - SWIFT_OPTIMIZATION_LEVEL = "-Onone"; - SWIFT_VERSION = 5.0; - VERSIONING_SYSTEM = "apple-generic"; - }; - name = Debug; - }; - 97C147071CF9000F007C117D /* Release */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; - buildSettings = { - ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; - CLANG_ENABLE_MODULES = YES; - CODE_SIGN_ENTITLEMENTS = Runner/Runner.entitlements; - CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; - DEVELOPMENT_TEAM = 63CVT8G5P8; - ENABLE_BITCODE = NO; - INFOPLIST_FILE = Runner/Info.plist; - INFOPLIST_KEY_CFBundleDisplayName = "Sefer Driver"; - INFOPLIST_KEY_LSApplicationCategoryType = "public.app-category.travel"; - LD_RUNPATH_SEARCH_PATHS = ( - "$(inherited)", - "@executable_path/Frameworks", - ); - PRODUCT_BUNDLE_IDENTIFIER = com.sefer.driver; - PRODUCT_NAME = "$(TARGET_NAME)"; - SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; - SWIFT_VERSION = 5.0; - VERSIONING_SYSTEM = "apple-generic"; - }; - name = Release; - }; -/* End XCBuildConfiguration section */ - -/* Begin XCConfigurationList section */ - 331C8087294A63A400263BE5 /* Build configuration list for PBXNativeTarget "RunnerTests" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 331C8088294A63A400263BE5 /* Debug */, - 331C8089294A63A400263BE5 /* Release */, - 331C808A294A63A400263BE5 /* Profile */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - 97C146E91CF9000F007C117D /* Build configuration list for PBXProject "Runner" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 97C147031CF9000F007C117D /* Debug */, - 97C147041CF9000F007C117D /* Release */, - 249021D3217E4FDB00AE95B9 /* Profile */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 97C147061CF9000F007C117D /* Debug */, - 97C147071CF9000F007C117D /* Release */, - 249021D4217E4FDB00AE95B9 /* Profile */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; -/* End XCConfigurationList section */ - }; - rootObject = 97C146E61CF9000F007C117D /* Project object */; -} diff --git a/apps/driver_new/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/apps/driver_new/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata deleted file mode 100755 index 919434a..0000000 --- a/apps/driver_new/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata +++ /dev/null @@ -1,7 +0,0 @@ - - - - - diff --git a/apps/driver_new/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/apps/driver_new/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist deleted file mode 100755 index 18d9810..0000000 --- a/apps/driver_new/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist +++ /dev/null @@ -1,8 +0,0 @@ - - - - - IDEDidComputeMac32BitWarning - - - diff --git a/apps/driver_new/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings b/apps/driver_new/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings deleted file mode 100755 index f9b0d7c..0000000 --- a/apps/driver_new/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings +++ /dev/null @@ -1,8 +0,0 @@ - - - - - PreviewsEnabled - - - diff --git a/apps/driver_new/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/apps/driver_new/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme deleted file mode 100755 index e3773d4..0000000 --- a/apps/driver_new/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +++ /dev/null @@ -1,101 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/apps/driver_new/ios/Runner.xcworkspace/contents.xcworkspacedata b/apps/driver_new/ios/Runner.xcworkspace/contents.xcworkspacedata deleted file mode 100755 index 21a3cc1..0000000 --- a/apps/driver_new/ios/Runner.xcworkspace/contents.xcworkspacedata +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - - diff --git a/apps/driver_new/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/apps/driver_new/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist deleted file mode 100755 index 18d9810..0000000 --- a/apps/driver_new/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist +++ /dev/null @@ -1,8 +0,0 @@ - - - - - IDEDidComputeMac32BitWarning - - - diff --git a/apps/driver_new/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings b/apps/driver_new/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings deleted file mode 100755 index f9b0d7c..0000000 --- a/apps/driver_new/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings +++ /dev/null @@ -1,8 +0,0 @@ - - - - - PreviewsEnabled - - - diff --git a/apps/driver_new/ios/Runner/AppDelegate.swift b/apps/driver_new/ios/Runner/AppDelegate.swift deleted file mode 100755 index 326c490..0000000 --- a/apps/driver_new/ios/Runner/AppDelegate.swift +++ /dev/null @@ -1,149 +0,0 @@ -import UIKit -import Flutter -import FirebaseCore -import CoreLocation - -@main -@objc class AppDelegate: FlutterAppDelegate { - - let locationManager = CLLocationManager() - - override func application( - _ application: UIApplication, - didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]? - ) -> Bool { - - // تهيئة Firebase - FirebaseApp.configure() - GeneratedPluginRegistrant.register(with: self) - - // التأكد من أن الجهاز غير مخترق قبل تشغيل التطبيق - if SecurityChecks.isDeviceCompromised() { - showSecurityAlert() - return false - } - - // تهيئة قنوات الاتصال مع Flutter - setupMethodChannel() - - // ضبط مدير الموقع لمتابعة تغييرات الأذونات - locationManager.delegate = self - locationManager.requestWhenInUseAuthorization() // طلب الأذونات فقط عند الحاجة - - return super.application(application, didFinishLaunchingWithOptions: launchOptions) - } - - // MARK: - تهيئة القناة بين Swift و Flutter - func setupMethodChannel() { - guard let controller = window?.rootViewController as? FlutterViewController else { - return - } - - let channel = FlutterMethodChannel(name: "com.sefer_driver/security", - binaryMessenger: controller.binaryMessenger) - channel.setMethodCallHandler { call, result in - switch call.method { - case "isNativeRooted": - result(SecurityChecks.isDeviceCompromised()) - default: - result(FlutterMethodNotImplemented) - } - } - } - - // MARK: - عرض تنبيه عند اكتشاف جهاز مخترق - func showSecurityAlert() { - guard let rootVC = UIApplication.shared.keyWindow?.rootViewController else { - exit(0) - } - - let alert = UIAlertController( - title: "Security Warning".localized, - message: "Compromised device detected. Exiting.".localized, - preferredStyle: .alert - ) - - alert.addAction(UIAlertAction(title: "OK".localized, style: .destructive) { _ in - self.obfuscatedExit() - }) - - if #available(iOS 15.0, *) { - alert.popoverPresentationController?.sourceView = rootVC.view - alert.popoverPresentationController?.sourceRect = CGRect(x: rootVC.view.bounds.midX, y: rootVC.view.bounds.midY, width: 0, height: 0) - alert.popoverPresentationController?.permittedArrowDirections = [] - alert.presentationController?.delegate = self - - if let presentationController = alert.presentationController as? UISheetPresentationController { - presentationController.detents = [.medium()] - presentationController.preferredCornerRadius = 20 - presentationController.prefersEdgeAttachedInCompactHeight = true - presentationController.prefersGrabberVisible = false - } - } - - rootVC.present(alert, animated: true, completion: nil) - } - - // MARK: - إخفاء عملية الخروج بطريقة مشفرة - func obfuscatedExit() { - let selector = NSSelectorFromString(String(format: "%@%@", "ex", "it:")) - if responds(to: selector) { - perform(selector, with: 0) - } - } - - // MARK: - تحميل مفاتيح API بطريقة آمنة - func loadConfig() -> [String: Any]? { - guard let path = Bundle.main.path(forResource: "Config", ofType: "plist"), - let config = NSDictionary(contentsOfFile: path) as? [String: Any] else { - return nil - } - return config - } -} - -// MARK: - التعامل مع أذونات الموقع بطريقة آمنة -extension AppDelegate: CLLocationManagerDelegate { - func locationManagerDidChangeAuthorization(_ manager: CLLocationManager) { - if #available(iOS 14.0, *) { - let status = manager.authorizationStatus - switch status { - case .authorizedWhenInUse, .authorizedAlways: - print("Authorization granted") - case .denied, .restricted: - print("Authorization denied") - case .notDetermined: - manager.requestWhenInUseAuthorization() - @unknown default: - break - } - } else { - // لنظام iOS 13 وما قبله، نستخدم الطريقة القديمة - let status = CLLocationManager.authorizationStatus() - switch status { - case .authorizedWhenInUse, .authorizedAlways: - print("Authorization granted") - case .denied, .restricted: - print("Authorization denied") - case .notDetermined: - manager.requestWhenInUseAuthorization() - @unknown default: - break - } - } - } -} - -// MARK: - منع إغلاق التنبيهات الأمنية -extension AppDelegate: UIAdaptivePresentationControllerDelegate { - func presentationControllerShouldDismiss(_ presentationController: UIPresentationController) -> Bool { - return false - } -} - -// MARK: - دعم الترجمة للنصوص -extension String { - var localized: String { - return NSLocalizedString(self, tableName: nil, bundle: Bundle.main, value: "", comment: "") - } -} diff --git a/apps/driver_new/ios/Runner/Assets.xcassets/AppIcon.appiconset/100.png b/apps/driver_new/ios/Runner/Assets.xcassets/AppIcon.appiconset/100.png deleted file mode 100755 index b8b1256..0000000 Binary files a/apps/driver_new/ios/Runner/Assets.xcassets/AppIcon.appiconset/100.png and /dev/null differ diff --git a/apps/driver_new/ios/Runner/Assets.xcassets/AppIcon.appiconset/102.png b/apps/driver_new/ios/Runner/Assets.xcassets/AppIcon.appiconset/102.png deleted file mode 100755 index c099ce0..0000000 Binary files a/apps/driver_new/ios/Runner/Assets.xcassets/AppIcon.appiconset/102.png and /dev/null differ diff --git a/apps/driver_new/ios/Runner/Assets.xcassets/AppIcon.appiconset/1024.png b/apps/driver_new/ios/Runner/Assets.xcassets/AppIcon.appiconset/1024.png deleted file mode 100755 index 360d0c8..0000000 Binary files a/apps/driver_new/ios/Runner/Assets.xcassets/AppIcon.appiconset/1024.png and /dev/null differ diff --git a/apps/driver_new/ios/Runner/Assets.xcassets/AppIcon.appiconset/108.png b/apps/driver_new/ios/Runner/Assets.xcassets/AppIcon.appiconset/108.png deleted file mode 100755 index 55d8e8f..0000000 Binary files a/apps/driver_new/ios/Runner/Assets.xcassets/AppIcon.appiconset/108.png and /dev/null differ diff --git a/apps/driver_new/ios/Runner/Assets.xcassets/AppIcon.appiconset/114.png b/apps/driver_new/ios/Runner/Assets.xcassets/AppIcon.appiconset/114.png deleted file mode 100755 index bcecac5..0000000 Binary files a/apps/driver_new/ios/Runner/Assets.xcassets/AppIcon.appiconset/114.png and /dev/null differ diff --git a/apps/driver_new/ios/Runner/Assets.xcassets/AppIcon.appiconset/120.png b/apps/driver_new/ios/Runner/Assets.xcassets/AppIcon.appiconset/120.png deleted file mode 100755 index 390799d..0000000 Binary files a/apps/driver_new/ios/Runner/Assets.xcassets/AppIcon.appiconset/120.png and /dev/null differ diff --git a/apps/driver_new/ios/Runner/Assets.xcassets/AppIcon.appiconset/128.png b/apps/driver_new/ios/Runner/Assets.xcassets/AppIcon.appiconset/128.png deleted file mode 100755 index f8bf6c9..0000000 Binary files a/apps/driver_new/ios/Runner/Assets.xcassets/AppIcon.appiconset/128.png and /dev/null differ diff --git a/apps/driver_new/ios/Runner/Assets.xcassets/AppIcon.appiconset/144.png b/apps/driver_new/ios/Runner/Assets.xcassets/AppIcon.appiconset/144.png deleted file mode 100755 index e272c49..0000000 Binary files a/apps/driver_new/ios/Runner/Assets.xcassets/AppIcon.appiconset/144.png and /dev/null differ diff --git a/apps/driver_new/ios/Runner/Assets.xcassets/AppIcon.appiconset/152.png b/apps/driver_new/ios/Runner/Assets.xcassets/AppIcon.appiconset/152.png deleted file mode 100755 index 2747a44..0000000 Binary files a/apps/driver_new/ios/Runner/Assets.xcassets/AppIcon.appiconset/152.png and /dev/null differ diff --git a/apps/driver_new/ios/Runner/Assets.xcassets/AppIcon.appiconset/16.png b/apps/driver_new/ios/Runner/Assets.xcassets/AppIcon.appiconset/16.png deleted file mode 100755 index fcb6d77..0000000 Binary files a/apps/driver_new/ios/Runner/Assets.xcassets/AppIcon.appiconset/16.png and /dev/null differ diff --git a/apps/driver_new/ios/Runner/Assets.xcassets/AppIcon.appiconset/167.png b/apps/driver_new/ios/Runner/Assets.xcassets/AppIcon.appiconset/167.png deleted file mode 100755 index 337ca39..0000000 Binary files a/apps/driver_new/ios/Runner/Assets.xcassets/AppIcon.appiconset/167.png and /dev/null differ diff --git a/apps/driver_new/ios/Runner/Assets.xcassets/AppIcon.appiconset/172.png b/apps/driver_new/ios/Runner/Assets.xcassets/AppIcon.appiconset/172.png deleted file mode 100755 index 9b26d07..0000000 Binary files a/apps/driver_new/ios/Runner/Assets.xcassets/AppIcon.appiconset/172.png and /dev/null differ diff --git a/apps/driver_new/ios/Runner/Assets.xcassets/AppIcon.appiconset/180.png b/apps/driver_new/ios/Runner/Assets.xcassets/AppIcon.appiconset/180.png deleted file mode 100755 index c6b49f7..0000000 Binary files a/apps/driver_new/ios/Runner/Assets.xcassets/AppIcon.appiconset/180.png and /dev/null differ diff --git a/apps/driver_new/ios/Runner/Assets.xcassets/AppIcon.appiconset/196.png b/apps/driver_new/ios/Runner/Assets.xcassets/AppIcon.appiconset/196.png deleted file mode 100755 index 1e32ea7..0000000 Binary files a/apps/driver_new/ios/Runner/Assets.xcassets/AppIcon.appiconset/196.png and /dev/null differ diff --git a/apps/driver_new/ios/Runner/Assets.xcassets/AppIcon.appiconset/20.png b/apps/driver_new/ios/Runner/Assets.xcassets/AppIcon.appiconset/20.png deleted file mode 100755 index 88039b3..0000000 Binary files a/apps/driver_new/ios/Runner/Assets.xcassets/AppIcon.appiconset/20.png and /dev/null differ diff --git a/apps/driver_new/ios/Runner/Assets.xcassets/AppIcon.appiconset/216.png b/apps/driver_new/ios/Runner/Assets.xcassets/AppIcon.appiconset/216.png deleted file mode 100755 index b5a67ca..0000000 Binary files a/apps/driver_new/ios/Runner/Assets.xcassets/AppIcon.appiconset/216.png and /dev/null differ diff --git a/apps/driver_new/ios/Runner/Assets.xcassets/AppIcon.appiconset/234.png b/apps/driver_new/ios/Runner/Assets.xcassets/AppIcon.appiconset/234.png deleted file mode 100755 index 192635b..0000000 Binary files a/apps/driver_new/ios/Runner/Assets.xcassets/AppIcon.appiconset/234.png and /dev/null differ diff --git a/apps/driver_new/ios/Runner/Assets.xcassets/AppIcon.appiconset/256.png b/apps/driver_new/ios/Runner/Assets.xcassets/AppIcon.appiconset/256.png deleted file mode 100755 index 830d356..0000000 Binary files a/apps/driver_new/ios/Runner/Assets.xcassets/AppIcon.appiconset/256.png and /dev/null differ diff --git a/apps/driver_new/ios/Runner/Assets.xcassets/AppIcon.appiconset/258.png b/apps/driver_new/ios/Runner/Assets.xcassets/AppIcon.appiconset/258.png deleted file mode 100755 index e7adea6..0000000 Binary files a/apps/driver_new/ios/Runner/Assets.xcassets/AppIcon.appiconset/258.png and /dev/null differ diff --git a/apps/driver_new/ios/Runner/Assets.xcassets/AppIcon.appiconset/29.png b/apps/driver_new/ios/Runner/Assets.xcassets/AppIcon.appiconset/29.png deleted file mode 100755 index 62dd2ae..0000000 Binary files a/apps/driver_new/ios/Runner/Assets.xcassets/AppIcon.appiconset/29.png and /dev/null differ diff --git a/apps/driver_new/ios/Runner/Assets.xcassets/AppIcon.appiconset/32.png b/apps/driver_new/ios/Runner/Assets.xcassets/AppIcon.appiconset/32.png deleted file mode 100755 index 6dcb454..0000000 Binary files a/apps/driver_new/ios/Runner/Assets.xcassets/AppIcon.appiconset/32.png and /dev/null differ diff --git a/apps/driver_new/ios/Runner/Assets.xcassets/AppIcon.appiconset/40.png b/apps/driver_new/ios/Runner/Assets.xcassets/AppIcon.appiconset/40.png deleted file mode 100755 index ba727b0..0000000 Binary files a/apps/driver_new/ios/Runner/Assets.xcassets/AppIcon.appiconset/40.png and /dev/null differ diff --git a/apps/driver_new/ios/Runner/Assets.xcassets/AppIcon.appiconset/48.png b/apps/driver_new/ios/Runner/Assets.xcassets/AppIcon.appiconset/48.png deleted file mode 100755 index ded0445..0000000 Binary files a/apps/driver_new/ios/Runner/Assets.xcassets/AppIcon.appiconset/48.png and /dev/null differ diff --git a/apps/driver_new/ios/Runner/Assets.xcassets/AppIcon.appiconset/50.png b/apps/driver_new/ios/Runner/Assets.xcassets/AppIcon.appiconset/50.png deleted file mode 100755 index fe7b959..0000000 Binary files a/apps/driver_new/ios/Runner/Assets.xcassets/AppIcon.appiconset/50.png and /dev/null differ diff --git a/apps/driver_new/ios/Runner/Assets.xcassets/AppIcon.appiconset/512.png b/apps/driver_new/ios/Runner/Assets.xcassets/AppIcon.appiconset/512.png deleted file mode 100755 index 207a10d..0000000 Binary files a/apps/driver_new/ios/Runner/Assets.xcassets/AppIcon.appiconset/512.png and /dev/null differ diff --git a/apps/driver_new/ios/Runner/Assets.xcassets/AppIcon.appiconset/55.png b/apps/driver_new/ios/Runner/Assets.xcassets/AppIcon.appiconset/55.png deleted file mode 100755 index f115281..0000000 Binary files a/apps/driver_new/ios/Runner/Assets.xcassets/AppIcon.appiconset/55.png and /dev/null differ diff --git a/apps/driver_new/ios/Runner/Assets.xcassets/AppIcon.appiconset/57.png b/apps/driver_new/ios/Runner/Assets.xcassets/AppIcon.appiconset/57.png deleted file mode 100755 index b67fa63..0000000 Binary files a/apps/driver_new/ios/Runner/Assets.xcassets/AppIcon.appiconset/57.png and /dev/null differ diff --git a/apps/driver_new/ios/Runner/Assets.xcassets/AppIcon.appiconset/58.png b/apps/driver_new/ios/Runner/Assets.xcassets/AppIcon.appiconset/58.png deleted file mode 100755 index 7011399..0000000 Binary files a/apps/driver_new/ios/Runner/Assets.xcassets/AppIcon.appiconset/58.png and /dev/null differ diff --git a/apps/driver_new/ios/Runner/Assets.xcassets/AppIcon.appiconset/60.png b/apps/driver_new/ios/Runner/Assets.xcassets/AppIcon.appiconset/60.png deleted file mode 100755 index 3d98bd6..0000000 Binary files a/apps/driver_new/ios/Runner/Assets.xcassets/AppIcon.appiconset/60.png and /dev/null differ diff --git a/apps/driver_new/ios/Runner/Assets.xcassets/AppIcon.appiconset/64.png b/apps/driver_new/ios/Runner/Assets.xcassets/AppIcon.appiconset/64.png deleted file mode 100755 index d7aa056..0000000 Binary files a/apps/driver_new/ios/Runner/Assets.xcassets/AppIcon.appiconset/64.png and /dev/null differ diff --git a/apps/driver_new/ios/Runner/Assets.xcassets/AppIcon.appiconset/66.png b/apps/driver_new/ios/Runner/Assets.xcassets/AppIcon.appiconset/66.png deleted file mode 100755 index 2f25a3e..0000000 Binary files a/apps/driver_new/ios/Runner/Assets.xcassets/AppIcon.appiconset/66.png and /dev/null differ diff --git a/apps/driver_new/ios/Runner/Assets.xcassets/AppIcon.appiconset/72.png b/apps/driver_new/ios/Runner/Assets.xcassets/AppIcon.appiconset/72.png deleted file mode 100755 index 93905f9..0000000 Binary files a/apps/driver_new/ios/Runner/Assets.xcassets/AppIcon.appiconset/72.png and /dev/null differ diff --git a/apps/driver_new/ios/Runner/Assets.xcassets/AppIcon.appiconset/76.png b/apps/driver_new/ios/Runner/Assets.xcassets/AppIcon.appiconset/76.png deleted file mode 100755 index 8dcf758..0000000 Binary files a/apps/driver_new/ios/Runner/Assets.xcassets/AppIcon.appiconset/76.png and /dev/null differ diff --git a/apps/driver_new/ios/Runner/Assets.xcassets/AppIcon.appiconset/80.png b/apps/driver_new/ios/Runner/Assets.xcassets/AppIcon.appiconset/80.png deleted file mode 100755 index 3e8a65f..0000000 Binary files a/apps/driver_new/ios/Runner/Assets.xcassets/AppIcon.appiconset/80.png and /dev/null differ diff --git a/apps/driver_new/ios/Runner/Assets.xcassets/AppIcon.appiconset/87.png b/apps/driver_new/ios/Runner/Assets.xcassets/AppIcon.appiconset/87.png deleted file mode 100755 index 722bedf..0000000 Binary files a/apps/driver_new/ios/Runner/Assets.xcassets/AppIcon.appiconset/87.png and /dev/null differ diff --git a/apps/driver_new/ios/Runner/Assets.xcassets/AppIcon.appiconset/88.png b/apps/driver_new/ios/Runner/Assets.xcassets/AppIcon.appiconset/88.png deleted file mode 100755 index 0b9fd37..0000000 Binary files a/apps/driver_new/ios/Runner/Assets.xcassets/AppIcon.appiconset/88.png and /dev/null differ diff --git a/apps/driver_new/ios/Runner/Assets.xcassets/AppIcon.appiconset/92.png b/apps/driver_new/ios/Runner/Assets.xcassets/AppIcon.appiconset/92.png deleted file mode 100755 index ac011bd..0000000 Binary files a/apps/driver_new/ios/Runner/Assets.xcassets/AppIcon.appiconset/92.png and /dev/null differ diff --git a/apps/driver_new/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json b/apps/driver_new/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json deleted file mode 100755 index 1319290..0000000 --- a/apps/driver_new/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json +++ /dev/null @@ -1 +0,0 @@ -{"images":[{"size":"60x60","expected-size":"180","filename":"180.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"iphone","scale":"3x"},{"size":"40x40","expected-size":"80","filename":"80.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"iphone","scale":"2x"},{"size":"40x40","expected-size":"120","filename":"120.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"iphone","scale":"3x"},{"size":"60x60","expected-size":"120","filename":"120.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"iphone","scale":"2x"},{"size":"57x57","expected-size":"57","filename":"57.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"iphone","scale":"1x"},{"size":"29x29","expected-size":"58","filename":"58.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"iphone","scale":"2x"},{"size":"29x29","expected-size":"29","filename":"29.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"iphone","scale":"1x"},{"size":"29x29","expected-size":"87","filename":"87.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"iphone","scale":"3x"},{"size":"57x57","expected-size":"114","filename":"114.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"iphone","scale":"2x"},{"size":"20x20","expected-size":"40","filename":"40.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"iphone","scale":"2x"},{"size":"20x20","expected-size":"60","filename":"60.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"iphone","scale":"3x"},{"size":"1024x1024","filename":"1024.png","expected-size":"1024","idiom":"ios-marketing","folder":"Assets.xcassets/AppIcon.appiconset/","scale":"1x"},{"size":"40x40","expected-size":"80","filename":"80.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"ipad","scale":"2x"},{"size":"72x72","expected-size":"72","filename":"72.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"ipad","scale":"1x"},{"size":"76x76","expected-size":"152","filename":"152.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"ipad","scale":"2x"},{"size":"50x50","expected-size":"100","filename":"100.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"ipad","scale":"2x"},{"size":"29x29","expected-size":"58","filename":"58.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"ipad","scale":"2x"},{"size":"76x76","expected-size":"76","filename":"76.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"ipad","scale":"1x"},{"size":"29x29","expected-size":"29","filename":"29.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"ipad","scale":"1x"},{"size":"50x50","expected-size":"50","filename":"50.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"ipad","scale":"1x"},{"size":"72x72","expected-size":"144","filename":"144.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"ipad","scale":"2x"},{"size":"40x40","expected-size":"40","filename":"40.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"ipad","scale":"1x"},{"size":"83.5x83.5","expected-size":"167","filename":"167.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"ipad","scale":"2x"},{"size":"20x20","expected-size":"20","filename":"20.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"ipad","scale":"1x"},{"size":"20x20","expected-size":"40","filename":"40.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"ipad","scale":"2x"},{"idiom":"watch","filename":"172.png","folder":"Assets.xcassets/AppIcon.appiconset/","subtype":"38mm","scale":"2x","size":"86x86","expected-size":"172","role":"quickLook"},{"idiom":"watch","filename":"80.png","folder":"Assets.xcassets/AppIcon.appiconset/","subtype":"38mm","scale":"2x","size":"40x40","expected-size":"80","role":"appLauncher"},{"idiom":"watch","filename":"88.png","folder":"Assets.xcassets/AppIcon.appiconset/","subtype":"40mm","scale":"2x","size":"44x44","expected-size":"88","role":"appLauncher"},{"idiom":"watch","filename":"102.png","folder":"Assets.xcassets/AppIcon.appiconset/","subtype":"45mm","scale":"2x","size":"51x51","expected-size":"102","role":"appLauncher"},{"idiom":"watch","filename":"108.png","folder":"Assets.xcassets/AppIcon.appiconset/","subtype":"49mm","scale":"2x","size":"54x54","expected-size":"108","role":"appLauncher"},{"idiom":"watch","filename":"92.png","folder":"Assets.xcassets/AppIcon.appiconset/","subtype":"41mm","scale":"2x","size":"46x46","expected-size":"92","role":"appLauncher"},{"idiom":"watch","filename":"100.png","folder":"Assets.xcassets/AppIcon.appiconset/","subtype":"44mm","scale":"2x","size":"50x50","expected-size":"100","role":"appLauncher"},{"idiom":"watch","filename":"196.png","folder":"Assets.xcassets/AppIcon.appiconset/","subtype":"42mm","scale":"2x","size":"98x98","expected-size":"196","role":"quickLook"},{"idiom":"watch","filename":"216.png","folder":"Assets.xcassets/AppIcon.appiconset/","subtype":"44mm","scale":"2x","size":"108x108","expected-size":"216","role":"quickLook"},{"idiom":"watch","filename":"234.png","folder":"Assets.xcassets/AppIcon.appiconset/","subtype":"45mm","scale":"2x","size":"117x117","expected-size":"234","role":"quickLook"},{"idiom":"watch","filename":"258.png","folder":"Assets.xcassets/AppIcon.appiconset/","subtype":"49mm","scale":"2x","size":"129x129","expected-size":"258","role":"quickLook"},{"idiom":"watch","filename":"48.png","folder":"Assets.xcassets/AppIcon.appiconset/","subtype":"38mm","scale":"2x","size":"24x24","expected-size":"48","role":"notificationCenter"},{"idiom":"watch","filename":"55.png","folder":"Assets.xcassets/AppIcon.appiconset/","subtype":"42mm","scale":"2x","size":"27.5x27.5","expected-size":"55","role":"notificationCenter"},{"idiom":"watch","filename":"66.png","folder":"Assets.xcassets/AppIcon.appiconset/","subtype":"45mm","scale":"2x","size":"33x33","expected-size":"66","role":"notificationCenter"},{"size":"29x29","expected-size":"87","filename":"87.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"watch","role":"companionSettings","scale":"3x"},{"size":"29x29","expected-size":"58","filename":"58.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"watch","role":"companionSettings","scale":"2x"},{"size":"1024x1024","expected-size":"1024","filename":"1024.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"watch-marketing","scale":"1x"},{"size":"128x128","expected-size":"128","filename":"128.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"mac","scale":"1x"},{"size":"256x256","expected-size":"256","filename":"256.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"mac","scale":"1x"},{"size":"128x128","expected-size":"256","filename":"256.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"mac","scale":"2x"},{"size":"256x256","expected-size":"512","filename":"512.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"mac","scale":"2x"},{"size":"32x32","expected-size":"32","filename":"32.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"mac","scale":"1x"},{"size":"512x512","expected-size":"512","filename":"512.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"mac","scale":"1x"},{"size":"16x16","expected-size":"16","filename":"16.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"mac","scale":"1x"},{"size":"16x16","expected-size":"32","filename":"32.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"mac","scale":"2x"},{"size":"32x32","expected-size":"64","filename":"64.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"mac","scale":"2x"},{"size":"512x512","expected-size":"1024","filename":"1024.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"mac","scale":"2x"}]} \ No newline at end of file diff --git a/apps/driver_new/ios/Runner/Base.lproj/LaunchScreen.storyboard b/apps/driver_new/ios/Runner/Base.lproj/LaunchScreen.storyboard deleted file mode 100755 index f2e259c..0000000 --- a/apps/driver_new/ios/Runner/Base.lproj/LaunchScreen.storyboard +++ /dev/null @@ -1,37 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/apps/driver_new/ios/Runner/Base.lproj/Main.storyboard b/apps/driver_new/ios/Runner/Base.lproj/Main.storyboard deleted file mode 100755 index 19d3697..0000000 --- a/apps/driver_new/ios/Runner/Base.lproj/Main.storyboard +++ /dev/null @@ -1,29 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/apps/driver_new/ios/Runner/Config.plist b/apps/driver_new/ios/Runner/Config.plist deleted file mode 100755 index 9e656c2..0000000 --- a/apps/driver_new/ios/Runner/Config.plist +++ /dev/null @@ -1,8 +0,0 @@ - - - - - APIKey - AIzaSyCf2mW2h0HD8ZYjwh4VOa2ladw6MJkCDTM - - diff --git a/apps/driver_new/ios/Runner/Constants.swift b/apps/driver_new/ios/Runner/Constants.swift deleted file mode 100755 index 75776b7..0000000 --- a/apps/driver_new/ios/Runner/Constants.swift +++ /dev/null @@ -1,12 +0,0 @@ -// -// Constants.swift -// Runner -// -// Created by Hamza Aleghwairyeen on 24/02/2025. -// - -import Foundation - -struct Constants { - static let googleMapsAPIKey = "AIzaSyCyfwRXTwSTLOFQSQgN5p7QZgGJVZnEKq0" -} diff --git a/apps/driver_new/ios/Runner/Constants1.swift b/apps/driver_new/ios/Runner/Constants1.swift deleted file mode 100755 index 704a451..0000000 --- a/apps/driver_new/ios/Runner/Constants1.swift +++ /dev/null @@ -1,8 +0,0 @@ -// -// Constants1.swift -// Runner -// -// Created by Hamza Aleghwairyeen on 16/03/2025. -// - -import Foundation diff --git a/apps/driver_new/ios/Runner/Info.plist b/apps/driver_new/ios/Runner/Info.plist deleted file mode 100755 index ad7c2d6..0000000 --- a/apps/driver_new/ios/Runner/Info.plist +++ /dev/null @@ -1,109 +0,0 @@ - - - - - LSMinimumSystemVersion - 12.0 - UIBackgroundModes - - fetch - location - remote-notification - - BGTaskSchedulerPermittedIdentifiers - - $(PRODUCT_BUNDLE_IDENTIFIER) - - NSContactsUsageDescription - This app requires contacts access to function properly. - CADisableMinimumFrameDurationOnPhone - - CFBundleDevelopmentRegion - $(DEVELOPMENT_LANGUAGE) - CFBundleDisplayName - Tripz Driver - CFBundleExecutable - $(EXECUTABLE_NAME) - CFBundleGetInfoString - - CFBundleIdentifier - $(PRODUCT_BUNDLE_IDENTIFIER) - CFBundleInfoDictionaryVersion - 6.0 - CFBundleName - Tripz Driver - CFBundlePackageType - APPL - CFBundleShortVersionString - 109 - CFBundleSignature - ???? - CFBundleURLTypes - - - CFBundleTypeRole - Editor - CFBundleURLSchemes - - com.googleusercontent.apps.594687661098-9fnj82nef9oagl98prigdf8qne3ddbto - - - - CFBundleVersion - 5.0.109 - FirebaseAppDelegateProxyEnabled - NO - GMSApiKey - YOUR_API_KEY - LSApplicationCategoryType - - LSApplicationQueriesSchemes - - googlechromes - comgooglemaps - - LSRequiresIPhoneOS - - NSCameraUsageDescription - This app requires access to your camera in order to scan QR codes and capture images - for uploading and access to connect to a call. - NSFaceIDUsageDescription - Use Face ID to securely authenticate payment accounts. - NSLocationAlwaysAndWhenInUseUsageDescription - This app needs access to your location to provide you with the best ride experience. - Your location data will be used to find the nearest available cars and connect you with - the closest captain for efficient and convenient rides. - NSLocationAlwaysUsageDescription - This app needs access to location. - NSLocationWhenInUseUsageDescription - This app needs access to your location to provide you with the best ride experience. - Your location data will be used to find the nearest available cars and connect you with - the closest captain for efficient and convenient rides. - NSMicrophoneUsageDescription - This app requires access to your microphone to record audio, allowing you to add - voice recordings to your photos and videos and access to connect to a call. - NSPhotoLibraryUsageDescription - Explanation of why your app needs access to the photo library. - UIApplicationSupportsIndirectInputEvents - - UILaunchStoryboardName - LaunchScreen - UIMainStoryboardFile - Main - UISupportedInterfaceOrientations - - UIInterfaceOrientationPortrait - UIInterfaceOrientationLandscapeLeft - UIInterfaceOrientationLandscapeRight - - UISupportedInterfaceOrientations~ipad - - UIInterfaceOrientationPortrait - UIInterfaceOrientationPortraitUpsideDown - UIInterfaceOrientationLandscapeLeft - UIInterfaceOrientationLandscapeRight - - UIViewControllerBasedStatusBarAppearance - - - diff --git a/apps/driver_new/ios/Runner/JailbreakDetection.swift b/apps/driver_new/ios/Runner/JailbreakDetection.swift deleted file mode 100755 index 17eb672..0000000 --- a/apps/driver_new/ios/Runner/JailbreakDetection.swift +++ /dev/null @@ -1,26 +0,0 @@ -// -// JailbreakDetection.swift -// Runner -// -// Created by Hamza Aleghwairyeen on 24/02/2025. -// - - -import Foundation - -class JailbreakDetection { - static func isJailbroken() -> Bool { - let paths = [ - "/Applications/Cydia.app", - "/Library/MobileSubstrate/MobileSubstrate.dylib", - "/usr/sbin/sshd", - "/etc/apt" - ] - for path in paths { - if FileManager.default.fileExists(atPath: path) { - return true - } - } - return false - } -} diff --git a/apps/driver_new/ios/Runner/KeychainHelper.swift b/apps/driver_new/ios/Runner/KeychainHelper.swift deleted file mode 100755 index a7418db..0000000 --- a/apps/driver_new/ios/Runner/KeychainHelper.swift +++ /dev/null @@ -1,8 +0,0 @@ -// -// KeychainHelper.swift -// Runner -// -// Created by Hamza Aleghwairyeen on 16/03/2025. -// - -import Foundation diff --git a/apps/driver_new/ios/Runner/Runner-Bridging-Header.h b/apps/driver_new/ios/Runner/Runner-Bridging-Header.h deleted file mode 100755 index 2dd4564..0000000 --- a/apps/driver_new/ios/Runner/Runner-Bridging-Header.h +++ /dev/null @@ -1,2 +0,0 @@ -#import "GeneratedPluginRegistrant.h" -#import "SecurityChecks.h" diff --git a/apps/driver_new/ios/Runner/Runner.entitlements b/apps/driver_new/ios/Runner/Runner.entitlements deleted file mode 100755 index 80b5221..0000000 --- a/apps/driver_new/ios/Runner/Runner.entitlements +++ /dev/null @@ -1,12 +0,0 @@ - - - - - aps-environment - development - com.apple.developer.applesignin - - Default - - - diff --git a/apps/driver_new/ios/Runner/SecurityChecks.h b/apps/driver_new/ios/Runner/SecurityChecks.h deleted file mode 100755 index 7c62f85..0000000 --- a/apps/driver_new/ios/Runner/SecurityChecks.h +++ /dev/null @@ -1,16 +0,0 @@ -// -// SecurityChecks.h -// Runner -// -// Created by Hamza Aleghwairyeen on 17/03/2025. -// - -// SecurityChecks.h -#import -#import // Import UIKit - -@interface SecurityChecks : NSObject - -+ (BOOL)isDeviceCompromised; // Combined check - -@end diff --git a/apps/driver_new/ios/Runner/SecurityChecks.m b/apps/driver_new/ios/Runner/SecurityChecks.m deleted file mode 100755 index b9ab3e3..0000000 --- a/apps/driver_new/ios/Runner/SecurityChecks.m +++ /dev/null @@ -1,197 +0,0 @@ -// -// SecurityChecks.m -// Runner -// -// Created by Hamza Aleghwairyeen on 17/03/2025. -// - -#import - - - -#import "SecurityChecks.h" -#import -#include -#import -#include // For _dyld_image_count and _dyld_get_image_name -#include // for fork() -#include //for socket, connect -#include // for sockaddr_in -#include // for inet_pton - -@implementation SecurityChecks - -+ (BOOL)isDeviceJailbroken { - // (Same jailbreak checks as before - from previous responses) - // 1. Check for common jailbreak files - NSArray *jailbreakPaths = @[ - @"/Applications/Cydia.app", -// #if !TARGET_IPHONE_SIMULATOR -// @"/bin/bash", -// #endif - @"/Library/MobileSubstrate/MobileSubstrate.dylib", - @"/bin/bash", - @"/usr/sbin/sshd", - @"/etc/apt", - @"/private/var/lib/apt/", - @"/private/var/tmp/cydia.log", - ]; - - for (NSString *path in jailbreakPaths) { - if ([[NSFileManager defaultManager] fileExistsAtPath:path]) { - NSLog(@"Jailbreak file detected: %@", path); - return YES; - } - } - - // 2. Check if we can write outside the sandbox (a strong indicator) - NSError *error = nil; - NSString *testPath = @"/private/jailbreaktest.txt"; - [@"test" writeToFile:testPath atomically:YES encoding:NSUTF8StringEncoding error:&error]; - - if (!error) { - // If we can write, it's jailbroken. Remove the file immediately. - [[NSFileManager defaultManager] removeItemAtPath:testPath error:nil]; - NSLog(@"Sandbox write test indicates jailbreak."); - return YES; - } - //3: Check for existence of the symbolic link /Applications. - struct stat s; - if (lstat("/Applications", &s) == 0) { - if (S_ISLNK(s.st_mode)) { - NSLog(@"Symbolic link /Applications exists, jailbroken"); - return YES; - } - } - - //4:Check for dyld Libraries - uint32_t count = _dyld_image_count(); - for (uint32_t i = 0 ; i < count ; ++i) { - const char *dyld = _dyld_get_image_name(i); - if (strstr(dyld, "MobileSubstrate") != NULL || strstr(dyld, "libcycript") != NULL) { - NSLog(@"Suspicious dyld library found: %s", dyld); - return YES; - } - } - - //5 Check if fork() is available. Sandboxed apps should not be able to call fork(). - #if !TARGET_IPHONE_SIMULATOR // Don't run this on the simulator - int pid = fork(); - if (pid == 0) - { - //in child, exit immediately to avoid crashing. - exit(0); - } else if (pid > 0) - { - NSLog(@"Fork available. Likely jailbroken."); - return YES; // Fork succeeded; likely jailbroken - } - #endif - - return NO; // No jailbreak indicators found -} -+ (BOOL)isDebuggerAttached { - int mib[4]; - struct kinfo_proc info; - size_t size = sizeof(info); - - mib[0] = CTL_KERN; - mib[1] = KERN_PROC; - mib[2] = KERN_PROC_PID; - mib[3] = getpid(); - - sysctl(mib, 4, &info, &size, NULL, 0); - - return (info.kp_proc.p_flag & P_TRACED) != 0; -} - -// Check for Frida's default port -+ (BOOL)isFridaListeningOnDefaultPort { - int sock = socket(AF_INET, SOCK_STREAM, 0); - if (sock == -1) { - return NO; // Couldn't create socket - } - - struct sockaddr_in sa; - memset(&sa, 0, sizeof(sa)); - sa.sin_family = AF_INET; - sa.sin_port = htons(27042); // Default Frida port - inet_pton(AF_INET, "127.0.0.1", &sa.sin_addr); - - if (connect(sock, (struct sockaddr *)&sa, sizeof(sa)) != -1) { - NSLog(@"Frida default port (27042) is open."); - close(sock); - return YES; - } - - close(sock); - return NO; -} - - -+ (BOOL)isFridaDetected { - int name[] = { CTL_KERN, KERN_PROC, KERN_PROC_ALL, 0 }; - size_t length; - struct kinfo_proc *procs, *proc; - - sysctl(name, 3, NULL, &length, NULL, 0); - procs = malloc(length); - sysctl(name, 3, procs, &length, NULL, 0); - - for (proc = procs; (char *)proc < (char *)procs + length; proc++) { - if (strstr(proc->kp_proc.p_comm, "frida") != NULL) { - free(procs); - return YES; - } - } - - free(procs); - return NO; -} -// Check for loaded dylibs that indicate Frida -+(BOOL) checkForFridaDylib{ - uint32_t count = _dyld_image_count(); - for (uint32_t i = 0 ; i < count ; ++i) { - const char *dyld = _dyld_get_image_name(i); - if (strstr(dyld, "FridaGadget") != NULL) { // Look for FridaGadget - NSLog(@"FridaGadget dylib found: %s", dyld); - return YES; - } - } - return NO; -} - -// Check process name -+ (BOOL)checkProcessName { - NSString* processName = [[NSProcessInfo processInfo] processName]; - if ([processName containsString:@"Frida"]) { - return YES; - } - return NO; -} - -// A combined check for jailbreak and Frida -+ (BOOL)isDeviceCompromised { - if ([SecurityChecks isDeviceJailbroken]) { - return YES; - } - if ([SecurityChecks isFridaListeningOnDefaultPort]) { - return YES; - } - if ([SecurityChecks checkForFridaDylib]) { - return YES; - } - if([SecurityChecks checkProcessName]){ - return YES; - } - if ([SecurityChecks isDebuggerAttached]) { - return YES; - } -// if ([SecurityChecks isFridaDetected]) { -// return YES; -// } - - return NO; -} - -@end diff --git a/apps/driver_new/ios/Runner/en.lproj/Localizable.strings b/apps/driver_new/ios/Runner/en.lproj/Localizable.strings deleted file mode 100755 index dda4b9d..0000000 --- a/apps/driver_new/ios/Runner/en.lproj/Localizable.strings +++ /dev/null @@ -1,7 +0,0 @@ -/* - Localizable.strings - Runner - - Created by Hamza Aleghwairyeen on 24/02/2025. - -*/ diff --git a/apps/driver_new/ios/Runner/order.wav b/apps/driver_new/ios/Runner/order.wav deleted file mode 100755 index b2b0ba2..0000000 Binary files a/apps/driver_new/ios/Runner/order.wav and /dev/null differ diff --git a/apps/driver_new/ios/Runner/tone2.wav b/apps/driver_new/ios/Runner/tone2.wav deleted file mode 100755 index 0582d47..0000000 Binary files a/apps/driver_new/ios/Runner/tone2.wav and /dev/null differ diff --git a/apps/driver_new/ios/RunnerTests/RunnerTests.swift b/apps/driver_new/ios/RunnerTests/RunnerTests.swift deleted file mode 100755 index 86a7c3b..0000000 --- a/apps/driver_new/ios/RunnerTests/RunnerTests.swift +++ /dev/null @@ -1,12 +0,0 @@ -import Flutter -import UIKit -import XCTest - -class RunnerTests: XCTestCase { - - func testExample() { - // If you add code to the Runner application, consider adding tests here. - // See https://developer.apple.com/documentation/xctest for more information about using XCTest. - } - -} diff --git a/apps/driver_new/ios/firebase_app_id_file.json b/apps/driver_new/ios/firebase_app_id_file.json deleted file mode 100755 index 5236662..0000000 --- a/apps/driver_new/ios/firebase_app_id_file.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "file_generated_by": "FlutterFire CLI", - "purpose": "FirebaseAppID & ProjectID for this Firebase app in this directory", - "GOOGLE_APP_ID": "1:594687661098:ios:6f69eee1449be943595f53", - "FIREBASE_PROJECT_ID": "ride-b1bd8", - "GCM_SENDER_ID": "594687661098" -} \ No newline at end of file diff --git a/apps/driver_new/l10n.yaml b/apps/driver_new/l10n.yaml deleted file mode 100644 index c22781d..0000000 --- a/apps/driver_new/l10n.yaml +++ /dev/null @@ -1,7 +0,0 @@ -# توليد الترجمة القياسي (docs/26 §4): ARB + gen_l10n. لا نص مرئي داخل widget. -arb-dir: lib/core/l10n -template-arb-file: app_ar.arb -output-localization-file: app_localizations.dart -output-class: L10n -output-dir: lib/core/l10n/gen -nullable-getter: false diff --git a/apps/driver_new/lib/app.dart b/apps/driver_new/lib/app.dart deleted file mode 100644 index fb42a30..0000000 --- a/apps/driver_new/lib/app.dart +++ /dev/null @@ -1,59 +0,0 @@ -import 'package:flutter/material.dart'; -import 'package:flutter_bloc/flutter_bloc.dart'; -import 'package:flutter_localizations/flutter_localizations.dart'; - -import 'core/build_config.dart'; -import 'core/design/theme.dart'; -import 'core/di.dart'; -import 'core/l10n/l10n.dart'; -import 'core/router.dart'; -import 'core/tenant/tenant_cubit.dart'; -import 'features/settings/cubit/settings_cubit.dart'; -import 'features/settings/cubit/settings_state.dart'; - -class TripzApp extends StatelessWidget { - const TripzApp({super.key}); - - @override - Widget build(BuildContext context) { - return MultiBlocProvider( - providers: [ - BlocProvider.value(value: sl()), - // إعداد المستأجر فوق الشجرة: كل شاشة تسأله عن ميزاتها بلا تمرير. - BlocProvider.value(value: sl()), - ], - child: BlocBuilder( - builder: (context, settings) { - return MaterialApp.router( - title: BuildConfig.appName, - debugShowCheckedModeBanner: false, - routerConfig: appRouter, - - // الثيم يُبنى من مدخلين لا ثالث لهما (docs/26 §4). - theme: buildTheme(Brightness.light, settings.locale), - darkTheme: buildTheme(Brightness.dark, settings.locale), - themeMode: settings.themeMode, - - // الاتجاه يتبع اللغة آلياً — لا `Directionality` مفروضة فوق كل - // شيء، وإلا انكسرت الإنجليزية (docs/26 §4). - locale: settings.locale, - supportedLocales: L10n.supportedLocales, - localizationsDelegates: const [ - ...L10n.localizationsDelegates, - GlobalMaterialLocalizations.delegate, - GlobalWidgetsLocalizations.delegate, - GlobalCupertinoLocalizations.delegate, - ], - - // سقف تكبير النص 1.3 — وهو ما تُفحص عليه الشاشات (docs/26 §9). - // ما فوقه يكسر التخطيط بلا مكسب قرائي. - builder: (context, child) => MediaQuery.withClampedTextScaling( - maxScaleFactor: 1.3, - child: child ?? const SizedBox.shrink(), - ), - ); - }, - ), - ); - } -} diff --git a/apps/driver_new/lib/core/api/antlaq_api.dart b/apps/driver_new/lib/core/api/antlaq_api.dart deleted file mode 100644 index 9470484..0000000 --- a/apps/driver_new/lib/core/api/antlaq_api.dart +++ /dev/null @@ -1,34 +0,0 @@ -import 'package:dio/dio.dart'; - -import '../config.dart'; -import 'api_exception.dart'; - -/// عميل map-saas — **منفصل تماماً** عن `ApiClient`. -/// -/// عمداً بلا `AuthInterceptor`: توكن تريبز لا شأن لخادم الخرائط، وإرساله -/// إليه تسريبٌ بلا مقابل. المصادقة هنا ترويسة `x-api-key` وحدها. -class AntlaqApi { - AntlaqApi._(this._dio); - - final Dio _dio; - - factory AntlaqApi.create() { - return AntlaqApi._(Dio(BaseOptions( - baseUrl: AppConfig.mapBaseUrl, - connectTimeout: AppConfig.connectTimeout, - receiveTimeout: AppConfig.receiveTimeout, - // المفتاح ترويسةً لا استعلاماً: map-saas يرفض `api_key` في الـquery - // بـ400 `property api_key should not exist`. - headers: {'x-api-key': AppConfig.mapApiKey}, - ))); - } - - Future get(String path, {Map? query}) async { - try { - final res = await _dio.get(path, queryParameters: query); - return res.data as T; - } on DioException catch (e) { - throw ApiException.from(e); - } - } -} diff --git a/apps/driver_new/lib/core/api/api_client.dart b/apps/driver_new/lib/core/api/api_client.dart deleted file mode 100644 index 053330c..0000000 --- a/apps/driver_new/lib/core/api/api_client.dart +++ /dev/null @@ -1,71 +0,0 @@ -import 'package:dio/dio.dart'; - -import '../config.dart'; -import '../storage/token_store.dart'; -import 'api_exception.dart'; -import 'auth_interceptor.dart'; - -/// الواجهة الوحيدة للخادم. لا تُنشأ `Dio` في أي مكان آخر. -class ApiClient { - ApiClient._(this._dio); - - final Dio _dio; - - factory ApiClient.create({ - required TokenStore tokens, - required Future Function() onSessionExpired, - }) { - final options = BaseOptions( - baseUrl: AppConfig.apiBaseUrl, - connectTimeout: AppConfig.connectTimeout, - receiveTimeout: AppConfig.receiveTimeout, - contentType: Headers.jsonContentType, - // نتولّى كل ما ليس 2xx بأنفسنا في ApiException. - validateStatus: (s) => s != null && s >= 200 && s < 300, - ); - - final dio = Dio(options); - dio.interceptors.add(AuthInterceptor( - tokens: tokens, - refreshClient: Dio(options), - onSessionExpired: onSessionExpired, - )); - return ApiClient._(dio); - } - - Future get(String path, {Map? query}) => - _send(() => _dio.get(path, queryParameters: query)); - - Future post(String path, {Object? body}) => - _send(() => _dio.post(path, data: body)); - - Future patch(String path, {Object? body}) => - _send(() => _dio.patch(path, data: body)); - - Future delete(String path) => _send(() => _dio.delete(path)); - - /// رفع ملف — الحقل اسمه `file` كما يتوقّعه `FileInterceptor` على الخادم. - /// يمرّ بنفس الـinterceptor فيحمل التوكن والمستأجر والجهاز. - Future upload( - String path, { - required String filePath, - Map fields = const {}, - }) { - return _send(() async { - final form = FormData.fromMap({ - ...fields, - 'file': await MultipartFile.fromFile(filePath), - }); - return _dio.post(path, data: form); - }); - } - - Future _send(Future> Function() call) async { - try { - final res = await call(); - return res.data as T; - } on DioException catch (e) { - throw ApiException.from(e); - } - } -} diff --git a/apps/driver_new/lib/core/api/api_exception.dart b/apps/driver_new/lib/core/api/api_exception.dart deleted file mode 100644 index 6514cc1..0000000 --- a/apps/driver_new/lib/core/api/api_exception.dart +++ /dev/null @@ -1,65 +0,0 @@ -import 'package:dio/dio.dart'; - -/// خطأ موحّد تراه طبقة الميزات — لا `DioException` يتسرّب فوق طبقة الشبكة. -class ApiException implements Exception { - const ApiException({ - required this.message, - this.statusCode, - this.kind = ApiErrorKind.unknown, - }); - - final String message; - final int? statusCode; - final ApiErrorKind kind; - - bool get isUnauthorized => statusCode == 401; - bool get isForbidden => statusCode == 403; - - /// حدّ المعدّل — `send-otp` ثلاث مرات كل خمس دقائق (docs/38 §2). الواجهة - /// تعرض عدّاداً تنازلياً بدل رسالة خطأ عامة. - bool get isRateLimited => statusCode == 429; - - factory ApiException.from(DioException e) { - switch (e.type) { - case DioExceptionType.connectionTimeout: - case DioExceptionType.sendTimeout: - case DioExceptionType.receiveTimeout: - return const ApiException( - message: 'انتهت مهلة الاتصال', - kind: ApiErrorKind.timeout, - ); - case DioExceptionType.connectionError: - return const ApiException( - message: 'تعذّر الاتصال بالخادم', - kind: ApiErrorKind.network, - ); - case DioExceptionType.cancel: - return const ApiException( - message: 'أُلغي الطلب', - kind: ApiErrorKind.cancelled, - ); - default: - final code = e.response?.statusCode; - return ApiException( - message: _messageOf(e.response?.data) ?? 'حدث خطأ غير متوقّع', - statusCode: code, - kind: ApiErrorKind.server, - ); - } - } - - /// NestJS يرجّع `message` نصاً أو مصفوفة نصوص (أخطاء التحقق). - static String? _messageOf(dynamic data) { - if (data is Map) { - final m = data['message']; - if (m is String && m.isNotEmpty) return m; - if (m is List && m.isNotEmpty) return m.join('\n'); - } - return null; - } - - @override - String toString() => 'ApiException($statusCode): $message'; -} - -enum ApiErrorKind { network, timeout, server, cancelled, unknown } diff --git a/apps/driver_new/lib/core/api/api_failure.dart b/apps/driver_new/lib/core/api/api_failure.dart deleted file mode 100644 index 4fb19da..0000000 --- a/apps/driver_new/lib/core/api/api_failure.dart +++ /dev/null @@ -1,38 +0,0 @@ -import 'api_exception.dart'; - -/// سبب الفشل كـ**رمز** لا كنصّ. -/// -/// docs/23 §3 يقول إن الـCubit يحوّل خطأ الشبكة إلى رسالة عربية؛ وdocs/26 §4 -/// (الأحدث، وهو الذي «يفعّل قاعدة docs/23 §2 التي كانت بلا أداة») يوجب مرور -/// كل نص مرئي بطبقة الترجمة. والـCubit لا يعرف `BuildContext` (docs/23 §3). -/// الجمع بينها: الـCubit يُصدر الرمز، والواجهة تترجمه سطراً واحداً — فتبقى -/// الشاشة بلا منطق، والنص بلغتين. -enum ApiFailure { - /// رمز خاطئ أو منتهي الصلاحية. - invalidCode, - - /// تجاوز عدد المحاولات — الخادم يُبطل الرمز فوراً (docs/38 §2). - tooManyAttempts, - - /// تجاوز حدّ طلب الرمز: ثلاثة كل خمس دقائق. - rateLimited, - - network, - timeout, - server, -} - -extension ApiFailureX on ApiException { - ApiFailure toApiFailure() { - if (isRateLimited) return ApiFailure.rateLimited; - if (kind == ApiErrorKind.network) return ApiFailure.network; - if (kind == ApiErrorKind.timeout) return ApiFailure.timeout; - if (isUnauthorized) { - // الخادم يفرّق بين «رمز خاطئ» و«محاولات كثيرة» بالنصّ وحده. - return message.contains('Too many') - ? ApiFailure.tooManyAttempts - : ApiFailure.invalidCode; - } - return ApiFailure.server; - } -} diff --git a/apps/driver_new/lib/core/api/auth_interceptor.dart b/apps/driver_new/lib/core/api/auth_interceptor.dart deleted file mode 100644 index 4663e27..0000000 --- a/apps/driver_new/lib/core/api/auth_interceptor.dart +++ /dev/null @@ -1,126 +0,0 @@ -import 'dart:async'; - -import 'package:dio/dio.dart'; - -import '../build_config.dart'; -import '../config.dart'; -import '../storage/token_store.dart'; - -/// يثبّت ترويسات كل طلب، ويجدّد التوكن **استباقياً** قبل انتهائه. -/// -/// عمر `access_token` خمس عشرة دقيقة فقط (docs/38 §2). لذلك لا ننتظر 401: -/// نجدّد قبل الإرسال إن قاربت الصلاحية. الـ401 يبقى شبكة أمان لا الآلية. -/// -/// التجديد **بطلقة واحدة**: عشرة طلبات متزامنة بتوكن منتهٍ تُنتج نداء تجديد -/// واحداً لا عشرة — وإلا أبطل الخادم رمز التحديث تحت أقدامنا. -class AuthInterceptor extends Interceptor { - AuthInterceptor({ - required TokenStore tokens, - required Dio refreshClient, - required Future Function() onSessionExpired, - }) : _tokens = tokens, - _refreshClient = refreshClient, - _onSessionExpired = onSessionExpired; - - final TokenStore _tokens; - - /// عميل منفصل بلا هذا الـinterceptor — وإلا استدعى التجديدُ نفسَه. - final Dio _refreshClient; - - final Future Function() _onSessionExpired; - - Future? _inFlight; - - @override - Future onRequest( - RequestOptions options, - RequestInterceptorHandler handler, - ) async { - options.headers['x-tenant-id'] = BuildConfig.tenantSlug; - options.headers['x-app-role'] = AppConfig.appRole; - - final deviceId = await _tokens.deviceId(); - if (deviceId != null) options.headers['x-device-id'] = deviceId; - - // نقاط المصادقة لا تحمل توكناً ولا تُشغّل تجديداً. - if (!_needsAuth(options.path)) return handler.next(options); - - if (_tokens.isLoggedIn && - _tokens.isAccessExpired(AppConfig.tokenRefreshLeeway)) { - await _refresh(); - } - - final access = _tokens.accessToken; - if (access != null && access.isNotEmpty) { - options.headers['Authorization'] = 'Bearer $access'; - } - handler.next(options); - } - - @override - Future onError( - DioException err, - ErrorInterceptorHandler handler, - ) async { - final options = err.requestOptions; - final retried = options.extra['__retried'] == true; - - if (err.response?.statusCode != 401 || - retried || - !_needsAuth(options.path) || - !_tokens.isLoggedIn) { - return handler.next(err); - } - - if (!await _refresh()) return handler.next(err); - - options.extra['__retried'] = true; - options.headers['Authorization'] = 'Bearer ${_tokens.accessToken}'; - try { - handler.resolve(await _refreshClient.fetch(options)); - } on DioException catch (e) { - handler.next(e); - } - } - - static bool _needsAuth(String path) => - !path.startsWith('/auth/') && - !path.startsWith('/maps/') && - !path.startsWith('/tenant/config'); - - Future _refresh() { - return _inFlight ??= _doRefresh().whenComplete(() => _inFlight = null); - } - - Future _doRefresh() async { - final refresh = _tokens.refreshToken; - if (refresh == null || refresh.isEmpty) return false; - try { - final deviceId = await _tokens.deviceId(); - final res = await _refreshClient.post>( - '/auth/refresh', - data: {'refresh_token': refresh}, - options: Options(headers: { - 'x-tenant-id': BuildConfig.tenantSlug, - 'x-app-role': AppConfig.appRole, - 'x-device-id': ?deviceId, - }), - ); - final body = res.data; - final access = body?['access_token'] as String?; - if (access == null || access.isEmpty) return false; - await _tokens.save( - accessToken: access, - // الخادم قد لا يدوّر رمز التحديث — نحتفظ بالقديم حينها. - refreshToken: (body?['refresh_token'] as String?) ?? refresh, - signingKey: body?['signing_key'] as String?, - ); - return true; - } on DioException { - // رمز تحديث ميّت = جلسة منتهية. لا معنى للمحاولة مجدداً. - await _tokens.clear(); - await _onSessionExpired(); - return false; - } - } -} diff --git a/apps/driver_new/lib/core/build_config.dart b/apps/driver_new/lib/core/build_config.dart deleted file mode 100644 index 4b22cfb..0000000 --- a/apps/driver_new/lib/core/build_config.dart +++ /dev/null @@ -1,85 +0,0 @@ -// ⚠️ ملف مُولَّد (docs/23 §1 — N3). لا يُحرَّر يدوياً؛ يُعاد توليده لكل -// مستأجر/طبقة عند البناء. القيم هنا هي القيم الافتراضية للمستأجر التجريبي. - -import 'package:flutter/material.dart'; - -/// المتغيّر الوحيد بين المستأجرين: **لون · لوغو · اسم** (docs/26 §0). -/// أي شيء آخر يتغيّر بين مستأجرين = خطأ يُصحَّح. -class BuildConfig { - const BuildConfig._(); - - static const String appName = 'Tripz Driver'; - static const String tenantSlug = 'siro'; - - /// اللون البذرة — منه تُشتقّ `ColorScheme` للوضعين. - /// - /// كحليّ سيرو (`#1A2340`) بقرار المالك 2026-08-05: الهوية البصرية تقترب من - /// سيرو المجرَّب ميدانياً بدل الأزرق العام. - static const Color seedColor = Color(0xFF1A2340); - - /// اللون الثانوي — بنفسجي فاتح، يُستعمل للتمييز والحالات النشطة. - static const Color accentColor = Color(0xFF8C9CF8); - - static const String logoAsset = 'assets/images/logo.png'; - static const String splashLogoAsset = 'assets/images/splash_logo.png'; - - /// روابط المتاجر الأربعة — **صفحات المتجر الحقيقية المنشورة**، أعطاها - /// المالك 2026-08-05. لا تُستعمل مباشرةً: `StoreLinks` هو من يختار الرابط - /// حسب المنصّة والدور، لأن «قيّم التطبيق» على آيفون سائق ≠ نفس الرابط على - /// أندرويد راكب. - /// - /// المعرّفات تطابق هوية النشر المقفلة: `com.mobileapp.store.ride` للراكب - /// و`com.sefer_driver` للسائق. - static const String riderIosUrl = String.fromEnvironment( - 'RIDER_IOS_URL', - defaultValue: 'https://apps.apple.com/eg/app/tripz-rider/id6458734951', - ); - static const String driverIosUrl = String.fromEnvironment( - 'DRIVER_IOS_URL', - defaultValue: 'https://apps.apple.com/eg/app/tripz-driver/id6502189302', - ); - static const String riderAndroidUrl = String.fromEnvironment( - 'RIDER_ANDROID_URL', - defaultValue: - 'https://play.google.com/store/apps/details?id=com.mobileapp.store.ride', - ); - static const String driverAndroidUrl = String.fromEnvironment( - 'DRIVER_ANDROID_URL', - defaultValue: - 'https://play.google.com/store/apps/details?id=com.sefer_driver', - ); - - static const String privacyUrl = String.fromEnvironment( - 'PRIVACY_URL', - defaultValue: 'https://tripz.app/privacy', - ); - - /// رقم دعم واتساب المستأجر — بصيغة دولية بلا `+`. - static const String supportPhone = String.fromEnvironment( - 'SUPPORT_PHONE', - defaultValue: '962790000000', - ); -} - -/// أعلام الاستحقاقات (docs/23 §5). **`const` إجبارياً** كي يُحذف كود الميزة -/// من الـbinary عند إطفائها — خريطة في وقت التشغيل تُبقي الكود قابلاً -/// للاستخراج. -/// -/// هذه طبقة **الطبقة المُباعة** (lite/pro/max). طبقة ثانية مستقلة تأتي من -/// `GET /tenant/config/:slug` وقت التشغيل (docs/38 §10) وتخفي ما اشتراه -/// المستأجر فعلاً — الاثنتان تتقاطعان: العَلَم `const` يقرّر ما يُبنى، وردّ -/// الخادم يقرّر ما يُعرض ممّا بُني. -class Features { - const Features._(); - - static const bool wallet = true; - static const bool chat = true; - /// WebRTC غير مبنيّ بعد — الخادم يدعمه (`call:*` في docs/38 §9) لكن - /// التطبيق لا. يبقى مطفأً حتى يُبنى ويُختبر على جهاز حقيقي. - static const bool calls = false; - static const bool rideTypes = true; - static const bool coupons = true; - static const bool geofence = false; - static const bool transit = false; - static const bool marketIntel = false; -} diff --git a/apps/driver_new/lib/core/config.dart b/apps/driver_new/lib/core/config.dart deleted file mode 100644 index 0314ffa..0000000 --- a/apps/driver_new/lib/core/config.dart +++ /dev/null @@ -1,66 +0,0 @@ -/// إعداد وقت التشغيل — يُمرَّر بـ`--dart-define` عند البناء (docs/23 §1). -/// -/// ما يخصّ **هوية المستأجر البصرية** (لون · لوغو · اسم) يعيش في -/// `build_config.dart` المُولَّد، لا هنا. -class AppConfig { - const AppConfig._(); - - /// أصل الـAPI **مع** `/api` (docs/38). - static const String apiBaseUrl = String.fromEnvironment( - 'API_BASE_URL', - defaultValue: 'https://tripz-api.intaleqapp.com/api', - ); - - /// أصل الـWebSocket — بلا `/api` (docs/38 §9). - static const String wsBaseUrl = String.fromEnvironment( - 'WS_BASE_URL', - defaultValue: 'https://tripz-api.intaleqapp.com', - ); - - /// يحدّد هوية المستخدم على الخادم: نفس الرقم بدورين = حسابان منفصلان - /// (docs/38 §1). **يُثبَّت عند البناء ولا يتغيّر في وقت التشغيل أبداً.** - static const String appRole = 'driver'; - - // ── الخرائط ────────────────────────────────────────────────────────── - // قرار المالك 2026-07-20: كل الخرائط — البلاطات والجيوكودنغ والمسار — - // **مباشرة** إلى map-saas بلا مرور بباك إند تريبز. map-saas مِلك المالك، - // والمفتاح يُقيَّد ببصمة التطبيق (نفس نموذج Google Maps SDK). هذا يُلغي - // نقاط `/maps/*` في باك إند تريبز، وهو ما حسم التعارض المسجّل في - // docs/38 §7 — ومنها `/maps/geocode` المعطوب على الخادم المنشور. - - static const String mapBaseUrl = String.fromEnvironment( - 'MAP_BASE_URL', - defaultValue: 'https://map-saas.intaleqapp.com/api', - ); - - /// المفتاح ترويسة **`x-api-key`** لا معامل استعلام — map-saas يرفض - /// المفتاح في الـquery بـ400. الحالي مفتاح سيرو حتى يُصدر المالك مفتاح - /// تريبز المقيّد بالبصمة. - static const String mapApiKey = String.fromEnvironment( - 'MAP_API_KEY', - defaultValue: 'in_9478b32836d19cff73db3063', - ); - - /// كل كم متر يُرفع موقع السائق. أقل من ذلك يستنزف البطارية بلا فائدة. - static const int locationFilterMeters = 25; - - /// مهلة البحث عن سائق قبل عرض «لا يوجد سائقون». - /// - /// **إلزامية**: الخادم قد لا يُطلق `expired`/`no_drivers` أبداً (ثغرة R1، - /// docs/38 §4)، فانتظار حدثٍ قد لا يصل يعني شاشة بحث أبدية. - static const Duration searchingTimeout = Duration(seconds: 90); - - /// طول رمز التحقّق كما يولّده الخادم (docs/38 §2). - static const int otpLength = 4; - - /// مهلة إعادة إرسال الرمز. الخادم يحدّ `send-otp` بثلاثة طلبات كل خمس - /// دقائق، فبلا عدّاد تنازلي يُحظر المستخدم بثلاث ضغطات (docs/39 §2). - static const Duration otpResendCooldown = Duration(seconds: 60); - - /// هامش التجديد الاستباقي. عمر التوكن 15 دقيقة فقط (docs/38 §2)، - /// فالانتظار حتى 401 يعني فشل طلب في منتصف رحلة. - static const Duration tokenRefreshLeeway = Duration(seconds: 60); - - static const Duration connectTimeout = Duration(seconds: 20); - static const Duration receiveTimeout = Duration(seconds: 30); -} diff --git a/apps/driver_new/lib/core/design/theme.dart b/apps/driver_new/lib/core/design/theme.dart deleted file mode 100644 index fe1141b..0000000 --- a/apps/driver_new/lib/core/design/theme.dart +++ /dev/null @@ -1,117 +0,0 @@ -import 'package:flutter/material.dart'; - -import '../build_config.dart'; -import 'tokens.dart'; -import 'tripz_colors.dart'; -import 'typography.dart'; - -/// دالة بناء الثيم الوحيدة (docs/26 §4): مدخلان لا ثالث لهما. -/// -/// الاتجاه (RTL/LTR) **لا يُفرض هنا** — `MaterialApp` يشتقّه من الـlocale -/// وحده. فرض `Directionality.rtl` يكسر الإنجليزية (docs/26 §4). -ThemeData buildTheme(Brightness brightness, Locale locale) { - // البذرة الكحلية داكنة جداً، و`fromSeed` وحدها تنتج منها أسطحاً باهتة. - // نثبّت الأساسي والثانوي صراحةً ونترك للمشتقّ باقي الأدوار — فيبقى الشكل - // قريباً من سيرو مع ضمان التباين الذي يوفّره M3. - final scheme = ColorScheme.fromSeed( - seedColor: BuildConfig.seedColor, - brightness: brightness, - ).copyWith( - primary: brightness == Brightness.dark - ? BuildConfig.accentColor - : BuildConfig.seedColor, - onPrimary: brightness == Brightness.dark - ? BuildConfig.seedColor - : Colors.white, - secondary: BuildConfig.accentColor, - surface: brightness == Brightness.dark - ? const Color(0xFF161618) - : const Color(0xFFF8FAFC), - onSurface: brightness == Brightness.dark - ? Colors.white - : const Color(0xFF0F172A), - onSurfaceVariant: brightness == Brightness.dark - ? const Color(0xFFB0B3B8) - : const Color(0xFF64748B), - outlineVariant: brightness == Brightness.dark - ? const Color(0xFF3A3A3C) - : const Color(0xFFE2E8F0), - ); - final isDark = brightness == Brightness.dark; - final texts = buildTextTheme(brightness, locale); - final tripz = isDark ? TripzColors.dark : TripzColors.light; - - return ThemeData( - useMaterial3: true, - colorScheme: scheme, - brightness: brightness, - fontFamily: AppFonts.familyFor(locale), - textTheme: texts, - scaffoldBackgroundColor: scheme.surface, - extensions: [tripz], - - // AppBar مسطّح بلا ظل (docs/26 §6). - appBarTheme: AppBarTheme( - backgroundColor: scheme.surface, - foregroundColor: scheme.onSurface, - elevation: 0, - scrolledUnderElevation: 0, - centerTitle: false, - titleTextStyle: texts.titleLarge?.copyWith(color: scheme.onSurface), - ), - - cardTheme: CardThemeData( - color: tripz.surfaceRaised, - elevation: 0, - margin: EdgeInsets.zero, - shape: RoundedRectangleBorder( - borderRadius: Radii.card_, - side: BorderSide(color: scheme.outlineVariant), - ), - ), - - bottomSheetTheme: BottomSheetThemeData( - backgroundColor: scheme.surface, - surfaceTintColor: Colors.transparent, - elevation: 0, - showDragHandle: true, - shape: const RoundedRectangleBorder(borderRadius: Radii.sheetTop), - ), - - inputDecorationTheme: InputDecorationTheme( - filled: true, - fillColor: isDark ? scheme.surfaceContainerHigh : scheme.surface, - contentPadding: const EdgeInsets.symmetric( - horizontal: Space.md, - vertical: Space.sm, - ), - border: _fieldBorder(scheme.outlineVariant), - enabledBorder: _fieldBorder(scheme.outlineVariant), - focusedBorder: _fieldBorder(scheme.primary, width: 1.5), - errorBorder: _fieldBorder(scheme.error), - focusedErrorBorder: _fieldBorder(scheme.error, width: 1.5), - errorStyle: texts.bodySmall?.copyWith(color: scheme.error), - ), - - dividerTheme: DividerThemeData( - color: scheme.outlineVariant, - space: 1, - thickness: 1, - ), - - snackBarTheme: SnackBarThemeData( - behavior: SnackBarBehavior.floating, - backgroundColor: scheme.inverseSurface, - contentTextStyle: - texts.bodyMedium?.copyWith(color: scheme.onInverseSurface), - shape: const RoundedRectangleBorder(borderRadius: Radii.card_), - ), - ); -} - -OutlineInputBorder _fieldBorder(Color color, {double width = 1}) { - return OutlineInputBorder( - borderRadius: Radii.field_, - borderSide: BorderSide(color: color, width: width), - ); -} diff --git a/apps/driver_new/lib/core/design/tokens.dart b/apps/driver_new/lib/core/design/tokens.dart deleted file mode 100644 index 3ae168d..0000000 --- a/apps/driver_new/lib/core/design/tokens.dart +++ /dev/null @@ -1,69 +0,0 @@ -import 'package:flutter/widgets.dart'; - -/// الرموز الثابتة (docs/26 §3). **الشاشة لا تخترع رقماً** — لا مسافة ولا زاوية -/// ولا مدّة خارج هذا الملف. -class Space { - const Space._(); - - /// سلّم مضاعفات الأربعة. - static const double xxs = 4; - static const double xs = 8; - static const double sm = 12; - - /// حشوة الصفحة الافتراضية. - static const double md = 16; - static const double lg = 24; - static const double xl = 32; - static const double xxl = 48; - - static const EdgeInsets page = EdgeInsets.all(md); - static const EdgeInsets pageH = EdgeInsets.symmetric(horizontal: md); -} - -class Radii { - const Radii._(); - - /// حقول وشارات. - static const double field = 8; - - /// أزرار وبطاقات. - static const double card = 12; - - /// الأوراق السفلية. - static const double sheet = 24; - - static const BorderRadius field_ = BorderRadius.all(Radius.circular(field)); - static const BorderRadius card_ = BorderRadius.all(Radius.circular(card)); - static const BorderRadius sheetTop = BorderRadius.vertical( - top: Radius.circular(sheet), - ); -} - -class Motion { - const Motion._(); - - /// استجابة لمسة. - static const Duration tap = Duration(milliseconds: 120); - - /// انتقال ضمن الشاشة. - static const Duration inScreen = Duration(milliseconds: 240); - - /// ورقة سفلية أو صفحة. - static const Duration page = Duration(milliseconds: 400); - - static const Curve curve = Curves.easeOutCubic; -} - -class Sizes { - const Sizes._(); - - static const double iconSm = 20; - static const double icon = 24; - static const double iconLg = 32; - - /// ارتفاع زر الـCTA وحقل الإدخال. - static const double control = 52; - - /// أدنى هدف لمس مقبول. - static const double touchTarget = 48; -} diff --git a/apps/driver_new/lib/core/design/tripz_colors.dart b/apps/driver_new/lib/core/design/tripz_colors.dart deleted file mode 100644 index 97f59e4..0000000 --- a/apps/driver_new/lib/core/design/tripz_colors.dart +++ /dev/null @@ -1,131 +0,0 @@ -import 'package:flutter/material.dart'; - -/// الأدوار الدلالية التي لا يوفّرها `ColorScheme` (docs/26 §2). -/// -/// الشاشة تقول `context.tripzColors.success` — **ولا تقرّر درجة اللون بنفسها، -/// ولا تكتب hex**. تُشتقّ كلها من السطوع لا من لون المستأجر، فتبقى ثابتة عبر -/// كل المستأجرين كما يفرض عقد §0. -@immutable -class TripzColors extends ThemeExtension { - const TripzColors({ - required this.success, - required this.onSuccess, - required this.warning, - required this.onWarning, - required this.danger, - required this.onDanger, - required this.info, - required this.surfaceRaised, - required this.mapRoute, - required this.mapOrigin, - required this.mapDestination, - required this.skeleton, - }); - - final Color success; - final Color onSuccess; - final Color warning; - final Color onWarning; - final Color danger; - final Color onDanger; - final Color info; - - /// السطح المرتفع — في الليلي ارتفاعٌ **بالسطوع لا بالظل** (docs/26 §2). - final Color surfaceRaised; - - final Color mapRoute; - final Color mapOrigin; - final Color mapDestination; - - /// لون هيكل التحميل (skeleton) — لا spinner فارغ (docs/26 §8.4). - final Color skeleton; - - // الأرقام من نظام سيرو الميداني: نجاح `#22C55E` · تحذير `#F59E0B` · - // خطأ `#EF4444` — مألوفة لمستخدمي سيرو ومجرَّبة على شاشات الشمس. - static const light = TripzColors( - success: Color(0xFF22C55E), - onSuccess: Color(0xFFFFFFFF), - warning: Color(0xFFF59E0B), - onWarning: Color(0xFF2A1A00), - danger: Color(0xFFEF4444), - onDanger: Color(0xFFFFFFFF), - info: Color(0xFF8C9CF8), - surfaceRaised: Color(0xFFFFFFFF), - mapRoute: Color(0xFF1A2340), - mapOrigin: Color(0xFF22C55E), - mapDestination: Color(0xFFEF4444), - skeleton: Color(0xFFE2E8F0), - ); - - static const dark = TripzColors( - success: Color(0xFF4ADE80), - onSuccess: Color(0xFF00281A), - warning: Color(0xFFFBBF24), - onWarning: Color(0xFF2A1A00), - danger: Color(0xFFF87171), - onDanger: Color(0xFF33000A), - info: Color(0xFF8C9CF8), - // ليس أسود صرفاً — رمادي داكن متدرّج (بطاقة سيرو `#2C2C2E`). - surfaceRaised: Color(0xFF2C2C2E), - mapRoute: Color(0xFF8C9CF8), - mapOrigin: Color(0xFF4ADE80), - mapDestination: Color(0xFFF87171), - skeleton: Color(0xFF3A3A3C), - ); - - @override - TripzColors copyWith({ - Color? success, - Color? onSuccess, - Color? warning, - Color? onWarning, - Color? danger, - Color? onDanger, - Color? info, - Color? surfaceRaised, - Color? mapRoute, - Color? mapOrigin, - Color? mapDestination, - Color? skeleton, - }) { - return TripzColors( - success: success ?? this.success, - onSuccess: onSuccess ?? this.onSuccess, - warning: warning ?? this.warning, - onWarning: onWarning ?? this.onWarning, - danger: danger ?? this.danger, - onDanger: onDanger ?? this.onDanger, - info: info ?? this.info, - surfaceRaised: surfaceRaised ?? this.surfaceRaised, - mapRoute: mapRoute ?? this.mapRoute, - mapOrigin: mapOrigin ?? this.mapOrigin, - mapDestination: mapDestination ?? this.mapDestination, - skeleton: skeleton ?? this.skeleton, - ); - } - - @override - TripzColors lerp(ThemeExtension? other, double t) { - if (other is! TripzColors) return this; - return TripzColors( - success: Color.lerp(success, other.success, t)!, - onSuccess: Color.lerp(onSuccess, other.onSuccess, t)!, - warning: Color.lerp(warning, other.warning, t)!, - onWarning: Color.lerp(onWarning, other.onWarning, t)!, - danger: Color.lerp(danger, other.danger, t)!, - onDanger: Color.lerp(onDanger, other.onDanger, t)!, - info: Color.lerp(info, other.info, t)!, - surfaceRaised: Color.lerp(surfaceRaised, other.surfaceRaised, t)!, - mapRoute: Color.lerp(mapRoute, other.mapRoute, t)!, - mapOrigin: Color.lerp(mapOrigin, other.mapOrigin, t)!, - mapDestination: Color.lerp(mapDestination, other.mapDestination, t)!, - skeleton: Color.lerp(skeleton, other.skeleton, t)!, - ); - } -} - -extension TripzColorsX on BuildContext { - TripzColors get tripzColors => Theme.of(this).extension()!; - ColorScheme get colors => Theme.of(this).colorScheme; - TextTheme get texts => Theme.of(this).textTheme; -} diff --git a/apps/driver_new/lib/core/design/typography.dart b/apps/driver_new/lib/core/design/typography.dart deleted file mode 100644 index cd53abf..0000000 --- a/apps/driver_new/lib/core/design/typography.dart +++ /dev/null @@ -1,75 +0,0 @@ - -import 'package:flutter/material.dart'; - -/// الخطوط (docs/26 §1) — ملفات محلية في `assets/fonts/`. حزمة `google_fonts` -/// ممنوعة: الشكل يجب أن يكون حتمياً من أول إقلاع بلا شبكة. -class AppFonts { - const AppFonts._(); - - static const arabic = 'IBMPlexSansArabic'; - static const latin = 'Inter'; - - /// الخط يتبع اللغة، والآخر احتياط — كي لا تنكسر كلمة عربية داخل جملة - /// إنجليزية ولا العكس. - static String familyFor(Locale locale) => - locale.languageCode == 'ar' ? arabic : latin; - - static List fallbackFor(Locale locale) => - locale.languageCode == 'ar' ? const [latin] : const [arabic]; -} - -/// أرقام tabular: تمنع «رقص» الأعمدة حين تتغيّر القيمة — للأسعار والعدّادات -/// والمسافات الحيّة (docs/26 §1). يُغني عن خط `digit` المتقاعد. -const tabularFigures = [FontFeature.tabularFigures()]; - -TextTheme buildTextTheme(Brightness brightness, Locale locale) { - final base = brightness == Brightness.dark - ? Typography.material2021().white - : Typography.material2021().black; - - final family = AppFonts.familyFor(locale); - final fallback = AppFonts.fallbackFor(locale); - - return base - .apply(fontFamily: family, fontFamilyFallback: fallback) - .copyWith( - displaySmall: base.displaySmall?.copyWith( - fontFamily: family, - fontFamilyFallback: fallback, - fontWeight: FontWeight.w700, - ), - headlineMedium: base.headlineMedium?.copyWith( - fontFamily: family, - fontFamilyFallback: fallback, - fontWeight: FontWeight.w700, - ), - headlineSmall: base.headlineSmall?.copyWith( - fontFamily: family, - fontFamilyFallback: fallback, - fontWeight: FontWeight.w600, - ), - titleLarge: base.titleLarge?.copyWith( - fontFamily: family, - fontFamilyFallback: fallback, - fontWeight: FontWeight.w600, - ), - titleMedium: base.titleMedium?.copyWith( - fontFamily: family, - fontFamilyFallback: fallback, - fontWeight: FontWeight.w600, - ), - labelLarge: base.labelLarge?.copyWith( - fontFamily: family, - fontFamilyFallback: fallback, - fontWeight: FontWeight.w600, - ), - ); -} - -/// نمط الأرقام الحيّة — يُستعمل للأجرة والرصيد والعدّاد التنازلي. -/// دائماً Inter بأرقام tabular، مهما كانت لغة الواجهة (docs/26 §5: الأرقام -/// لاتينية في اللغتين). -TextStyle numericStyle(TextStyle? base) => (base ?? const TextStyle()).copyWith( - fontFamily: AppFonts.latin, - fontFeatures: tabularFigures, - ); diff --git a/apps/driver_new/lib/core/di.dart b/apps/driver_new/lib/core/di.dart deleted file mode 100644 index c331f4f..0000000 --- a/apps/driver_new/lib/core/di.dart +++ /dev/null @@ -1,164 +0,0 @@ -import 'package:device_info_plus/device_info_plus.dart'; - -import 'package:flutter/foundation.dart'; - -import 'package:flutter_secure_storage/flutter_secure_storage.dart'; - -import 'package:get_it/get_it.dart'; - -import 'package:shared_preferences/shared_preferences.dart'; - -import '../features/auth/cubit/login_cubit.dart'; - -import '../features/auth/data/auth_repository.dart'; -import '../features/profile/data/profile_repository.dart'; - -import '../features/rating/cubit/rating_cubit.dart'; - -import '../features/rating/data/rating_repository.dart'; -import '../features/rewards/cubit/rewards_cubit.dart'; -import '../features/rewards/data/rewards_repository.dart'; - -import '../features/settings/cubit/settings_cubit.dart'; - -import '../features/trip/cubit/history_cubit.dart'; - -import '../features/chat/cubit/chat_cubit.dart'; -import '../features/chat/data/chat_repository.dart'; -import '../features/onboarding/cubit/onboarding_cubit.dart'; -import '../features/onboarding/data/driver_repository.dart'; -import '../features/trip/cubit/duty_cubit.dart'; - -import '../features/trip/data/history_repository.dart'; - -import '../features/trip/data/maps_repository.dart'; - -import '../features/trip/data/trip_repository.dart'; - -import '../features/wallet/cubit/payout_cubit.dart'; -import '../features/wallet/cubit/wallet_cubit.dart'; - -import '../features/wallet/data/wallet_repository.dart'; - -import 'api/antlaq_api.dart'; - -import 'api/api_client.dart'; - -import 'build_config.dart'; - -import 'location/location_service.dart'; - -import 'notifications/push_service.dart'; - -import 'realtime/realtime_service.dart'; - -import 'session/session_cubit.dart'; -import 'session/session_source.dart'; - -import 'storage/token_store.dart'; - -import 'tenant/tenant_cubit.dart'; - -final sl = GetIt.instance; - -/// نقطة الإقفال الوحيدة (docs/23 §5): الميزة المطفأة **لا تُسجَّل**، بدل -/// `if` مبعثرة في الشاشات. -Future setupInjector() async { - final prefs = await SharedPreferences.getInstance(); - sl.registerSingleton(prefs); - - const secure = FlutterSecureStorage( - iOptions: IOSOptions(accessibility: KeychainAccessibility.first_unlock), - ); - - final tokens = TokenStore(secure); - await tokens.load(); - await _ensureDeviceId(tokens); - sl.registerSingleton(tokens); - - sl.registerSingleton(SettingsCubit(prefs)); - - // انتهاء الجلسة يصعد من طبقة الشبكة إلى `SessionCubit` مباشرة — الراوتر - // يستمع إليه فيخرج المستخدم بلا `BuildContext` في الـinterceptor. - sl.registerSingleton( - ApiClient.create( - tokens: tokens, - onSessionExpired: () async => sl().onSessionExpired(), - ), - ); - - final authRepo = AuthRepository(sl(), sl()); - sl.registerSingleton(authRepo); - sl.registerSingleton(authRepo); - sl.registerSingleton(ProfileRepository(sl())); - sl.registerSingleton( - SessionCubit(authRepo, onAuthenticated: () => sl().register()), - ); - - // تدفّق الدخول قصير العمر: نسخة جديدة لكل دخول، لا نسخة واحدة أبدية. - sl.registerFactory(() => LoginCubit(sl(), sl())); - - // الخرائط عميل منفصل بلا توكن تريبز — map-saas لا شأن له بجلستنا. - sl.registerSingleton(AntlaqApi.create()); - sl.registerSingleton(MapsRepository(sl())); - sl.registerSingleton(TripRepository(sl())); - sl.registerSingleton(LocationService()); - sl.registerSingleton(RealtimeService(tokens)); - - sl.registerSingleton(TenantCubit(sl(), prefs)); - sl.registerSingleton(PushService(sl())); - - sl.registerSingleton(DriverRepository(sl())); - sl.registerFactory(() => OnboardingCubit(sl())); - - sl.registerSingleton(HistoryRepository(sl())); - sl.registerFactory(() => HistoryCubit(sl())); - - sl.registerSingleton(RatingRepository(sl())); - - // المكافآت خلف علم الكوبونات: الدعوات والكوبونات وجهان لنفس الوحدة. - if (Features.coupons) { - sl.registerSingleton(RewardsRepository(sl())); - sl.registerFactory(() => RewardsCubit(sl())); - } - sl.registerFactory(() => RatingCubit(sl())); - - // الدردشة خلف علمها: إطفاؤه يحذف كودها من الـbinary (docs/23 §5). - if (Features.chat) { - sl.registerSingleton(ChatRepository(sl())); - sl.registerFactory(() => ChatCubit(sl())); - } - - // المحفظة خلف علم الاستحقاق: الميزة المطفأة لا تُسجَّل أصلاً (docs/23 §5). - if (Features.wallet) { - sl.registerSingleton(WalletRepository(sl())); - sl.registerFactory(() => WalletCubit(sl())); - sl.registerFactory(() => PayoutCubit(sl())); - } - - sl.registerFactory(() => DutyCubit( - trips: sl(), - location: sl(), - realtime: sl(), - maps: sl(), - )); -} - -/// بصمة الجهاز (`x-device-id`) — يفرضها الخادم عند تفعيل -/// `AUTH_REQUIRE_DEVICE_BINDING` (docs/38 §8). تُرسَل من الآن كي يُفعَّل -/// العَلَم لاحقاً بلا تعديل التطبيق: **أرسل أولاً ثم فعّل الخادم**. -Future _ensureDeviceId(TokenStore tokens) async { - if (await tokens.deviceId() != null) return; - final info = DeviceInfoPlugin(); - String? id; - try { - if (defaultTargetPlatform == TargetPlatform.android) { - id = (await info.androidInfo).id; - } else if (defaultTargetPlatform == TargetPlatform.iOS) { - id = (await info.iosInfo).identifierForVendor; - } - } catch (_) { - // منصّة لا تجيب — المعرّف الفارغ أفضل من إقلاع فاشل. - } - if (id != null && id.isNotEmpty) await tokens.setDeviceId(id); -} diff --git a/apps/driver_new/lib/core/format/money.dart b/apps/driver_new/lib/core/format/money.dart deleted file mode 100644 index 69ae013..0000000 --- a/apps/driver_new/lib/core/format/money.dart +++ /dev/null @@ -1,34 +0,0 @@ -import 'package:intl/intl.dart'; - -/// كل المبالغ تصل من الخادم **نصوصاً** لا أرقاماً (`"0.000"` — docs/38 §12.2). -/// تمريرها لعملية حسابية بلا تحويل يعطي نتائج صامتة خاطئة، لذلك التحويل -/// والعرض يمرّان من هنا وحدهما. -class Money { - const Money._(); - - /// `null` عند نصّ غير صالح — لا صفر: الصفر رصيدٌ حقيقي، والغياب ليس رصيداً. - static double? parse(String? raw) => - raw == null ? null : double.tryParse(raw); - - /// العملة ورمزها من إعداد المستأجر (country pack)، لا ثابتة في التطبيق - /// (docs/26 §5). الأرقام لاتينية في اللغتين. - static String format(String? raw, String currency, {String locale = 'en'}) { - final value = parse(raw); - if (value == null) return '—'; - final digits = currency == 'JOD' ? 3 : 2; - final text = NumberFormat.decimalPatternDigits( - locale: locale, - decimalDigits: digits, - ).format(value); - return currency.isEmpty ? text : '$text $currency'; - } - - static String formatNum(num value, String currency, {int? decimalDigits}) { - final digits = decimalDigits ?? (currency == 'JOD' ? 3 : 2); - final text = NumberFormat.decimalPatternDigits( - locale: 'en', - decimalDigits: digits, - ).format(value); - return currency.isEmpty ? text : '$text $currency'; - } -} diff --git a/apps/driver_new/lib/core/l10n/app_ar.arb b/apps/driver_new/lib/core/l10n/app_ar.arb deleted file mode 100644 index 71aa33c..0000000 --- a/apps/driver_new/lib/core/l10n/app_ar.arb +++ /dev/null @@ -1,296 +0,0 @@ -{ - "@@locale": "ar", - "appTitle": "Tripz", - "actionRetry": "أعد المحاولة", - "actionCancel": "إلغاء", - "actionContinue": "متابعة", - "actionSave": "حفظ", - "actionOpenSettings": "افتح الإعدادات", - "errorGeneric": "حدث خطأ غير متوقّع", - "errorNetwork": "تعذّر الاتصال بالخادم", - "errorTimeout": "انتهت مهلة الاتصال", - "emptyDefault": "لا يوجد شيء هنا بعد", - "splashRider": "تطبيق الراكب", - "splashDriver": "تطبيق السائق", - "agreementTitle": "شروط الاستخدام", - "agreementLead": "قبل أن نبدأ، اقرأ الشروط ووافق عليها.", - "agreementCheckbox": "قرأت الشروط وأوافق عليها", - "agreementAccept": "أوافق وأتابع", - "permissionTitle": "نحتاج موقعك", - "permissionLead": "الموقع هو ما يجعل الرحلة ممكنة: به نعرف أين أنت وأين السائق.", - "permissionAllow": "السماح بالوصول للموقع", - "permissionDeniedForever": "رفضتَ الإذن نهائياً. افتح الإعدادات وفعّله يدوياً ثم عُد.", - "phoneTitle": "أهلاً بك، كابتن", - "phoneLead": "أدخل رقم هاتفك، ونرسل لك رمز تحقّق.", - "phoneLabel": "رقم الهاتف", - "phoneHint": "بلا الصفر في البداية", - "phoneSend": "أرسل رمز التحقّق", - "phoneErrEmpty": "أدخل رقم هاتفك", - "phoneErrLeadingZero": "أدخل الرقم بلا الصفر في البداية", - "phoneErrShort": "الرقم قصير جداً", - "otpTitle": "أدخل رمز التحقّق", - "otpLead": "أرسلنا رمزاً من أربع خانات إلى {phone}", - "@otpLead": { - "placeholders": { - "phone": { - "type": "String" - } - } - }, - "otpVerify": "تحقّق وتابع", - "otpResend": "إعادة إرسال الرمز", - "otpResendIn": "إعادة الإرسال بعد {seconds} ثانية", - "@otpResendIn": { - "placeholders": { - "seconds": { - "type": "int" - } - } - }, - "otpErrIncomplete": "أدخل الرمز كاملاً", - "otpErrInvalid": "الرمز غير صحيح أو انتهت صلاحيته", - "otpErrTooManyAttempts": "محاولات كثيرة. اطلب رمزاً جديداً.", - "otpErrRateLimited": "طلبتَ الرمز مرات كثيرة. انتظر قليلاً ثم أعد المحاولة.", - "otpChangeNumber": "تعديل الرقم", - "profileTitle": "أكمل ملفك", - "profileLead": "اسمك يظهر للراكب عند الرحلة.", - "profileNameLabel": "الاسم", - "profileNameErrEmpty": "أدخل اسمك", - "sessionExpired": "انتهت جلستك. سجّل الدخول من جديد.", - "settingsTitle": "الإعدادات", - "settingsTheme": "المظهر", - "settingsThemeSystem": "حسب النظام", - "settingsThemeLight": "فاتح", - "settingsThemeDark": "داكن", - "settingsLanguage": "اللغة", - "settingsLanguageArabic": "العربية", - "settingsLanguageEnglish": "English", - "settingsSectionGeneral": "عام", - "settingsSectionSupport": "الدعم والمعلومات", - "settingsSupportLead": "أسئلة شائعة وطرق التواصل", - "settingsShareLead": "شارك التطبيق مع أصدقائك", - "paymentCash": "نقداً", - "paymentWallet": "من المحفظة", - "rideWhereTo": "إلى أين؟", - "rideOrigin": "من", - "rideDestination": "إلى", - "rideSearchHint": "ابحث عن مكان", - "rideAddStop": "إضافة محطة", - "rideStop": "محطة {n}", - "@rideStop": { - "placeholders": { - "n": { - "type": "int" - } - } - }, - "ridePickOnMap": "تحديد من الخريطة", - "rideConfirmPoint": "تأكيد هذه النقطة", - "rideConfirmTrip": "اطلب الرحلة", - "rideSearchingTitle": "نبحث لك عن سائق", - "rideSearchingLead": "عادةً أقل من دقيقة", - "rideCancelSearch": "إلغاء البحث", - "rideNoDrivers": "لا يوجد سائقون متاحون الآن. جرّب بعد قليل.", - "rideQuoteFailed": "تعذّر حساب الأجرة", - "rideRouteFailed": "تعذّر حساب المسار", - "rideRequestFailed": "تعذّر إرسال الطلب", - "rideSurge": "الطلب مرتفع الآن", - "rideCancelTrip": "إلغاء الرحلة", - "rideEta": "{min} دقيقة", - "@rideEta": { - "placeholders": { - "min": { - "type": "String" - } - } - }, - "rideDistanceKm": "{km} كم", - "@rideDistanceKm": { - "placeholders": { - "km": { - "type": "String" - } - } - }, - "tripAssigned": "السائق في الطريق إليك", - "tripDriverArriving": "السائق يقترب", - "tripDriverArrived": "السائق وصل وينتظرك", - "tripInProgress": "في الطريق إلى وجهتك", - "tripCompleted": "وصلت — رحلة موفّقة", - "driverGoOnline": "ابدأ الاستقبال", - "driverGoOffline": "إيقاف الاستقبال", - "driverOnline": "متصل", - "driverOffline": "غير متصل", - "driverNoOffers": "لا طلبات الآن. ابقَ متصلاً.", - "driverOfferTitle": "طلب رحلة جديد", - "driverAccept": "قبول", - "driverReject": "تجاهل", - "driverOfferTaken": "سبقك سائق آخر لهذا الطلب", - "driverArrivedAction": "وصلت لموقع الراكب", - "driverStartTrip": "بدء الرحلة", - "driverEndTrip": "إنهاء الرحلة", - "driverOnTheWay": "في الطريق للراكب", - "rateTitle": "كيف كانت رحلتك؟", - "rateTitleDriver": "كيف كان الراكب؟", - "rateLead": "تقييمك يساعدنا على تحسين الخدمة", - "rateComment": "أضف ملاحظة (اختياري)", - "rateSubmit": "إرسال التقييم", - "rateSkip": "لاحقاً", - "rateAlready": "سبق أن قيّمت هذه الرحلة", - "tripFareTitle": "تفاصيل الأجرة", - "tripFare": "الأجرة", - "tripEarnings": "أرباحك", - "tripCommission": "العمولة", - "tripCancelTitle": "سبب الإلغاء", - "tripCancelReasonWait": "الانتظار طويل", - "tripCancelReasonMistake": "طلبت بالخطأ", - "tripCancelReasonOther": "سبب آخر", - "tripCancelConfirm": "تأكيد الإلغاء", - "tripCancelKeep": "متابعة الرحلة", - "walletTitle": "المحفظة", - "walletBalance": "الرصيد", - "walletTopup": "شحن الرصيد", - "walletTopupAmount": "المبلغ", - "walletTransactions": "الحركات", - "walletEmpty": "لا حركات بعد", - "walletTopupFailed": "تعذّر الشحن", - "creditTitle": "الرصيد التشغيلي", - "creditLead": "تُخصم منه العمولة عند إنهاء كل رحلة", - "creditBlocked": "رصيدك التشغيلي نفد — اشحنه لتستقبل الطلبات", - "payoutTitle": "سحب الأرباح", - "payoutAmount": "مبلغ السحب", - "payoutChannel": "قناة الاستلام", - "payoutRequest": "أرسل رمز التأكيد", - "payoutOtpTitle": "أكّد السحب", - "payoutOtpLead": "أرسلنا رمزاً إلى رقمك لتأكيد السحب", - "payoutConfirm": "تأكيد السحب", - "payoutDone": "تم إرسال طلب السحب", - "payoutFailed": "تعذّر إتمام السحب", - "payoutInsufficient": "الرصيد لا يكفي", - "payoutHistory": "طلبات السحب", - "menuTitle": "القائمة", - "menuProfile": "حسابي", - "menuTrips": "رحلاتي", - "menuWallet": "المحفظة", - "menuEarnings": "أرباحي", - "menuSettings": "الإعدادات", - "menuSupport": "المساعدة", - "menuAbout": "عن التطبيق", - "menuLogout": "تسجيل الخروج", - "menuLogoutConfirm": "هل تريد الخروج من حسابك؟", - "historyTitle": "رحلاتي", - "historyEmpty": "لا رحلات بعد — اتصل لتصلك الطلبات", - "historyStatusCompleted": "مكتملة", - "historyStatusCancelled": "ملغاة", - "historyStatusLive": "جارية", - "profileEditTitle": "تعديل الحساب", - "profilePhone": "رقم الهاتف", - "profilePhoneLocked": "لا يمكن تغيير الرقم — هو هوية حسابك", - "profileSaved": "حُفظت التعديلات", - "supportTitle": "المساعدة", - "supportFaq": "الأسئلة الشائعة", - "supportContact": "تواصل معنا", - "supportWhatsapp": "مراسلة عبر واتساب", - "aboutVersion": "الإصدار", - "notifTitle": "الإشعارات", - "notifEnable": "تفعيل الإشعارات", - "notifDenied": "الإشعارات موقوفة من إعدادات النظام", - "chatTitle": "المحادثة", - "chatHint": "اكتب رسالة", - "chatEmpty": "لا رسائل بعد", - "rideCoupon": "كود خصم", - "rideCouponApply": "تطبيق", - "rideNoLocation": "فعّل الموقع لنعرف أين أنت", - "rideBack": "رجوع", - "rideRetryQuote": "أعد حساب الأجرة", - "rideFrom": "من", - "rideTo": "إلى", - "walletChannel": "طريقة الدفع", - "rideTypeUnavailable": "غير متاح", - "rideSearchNoResults": "لا نتائج — جرّب اسماً آخر أو حدّد من الخريطة", - "walletInvoiceTitle": "أكمل التحويل", - "walletInvoiceRef": "رقم المرجع", - "walletInvoiceTarget": "حوّل إلى", - "walletInvoicePending": "سيُضاف الرصيد فور تأكيد التحويل", - "walletCopy": "نسخ", - "walletCopied": "نُسخ", - "walletNoTarget": "لم يُضبط حساب استلام لهذه القناة بعد — راجع المشغّل", - "rewardsTitle": "مكافآتي", - "rewardsInviteTitle": "ادعُ سائقاً", - "rewardsInviteLead": "شارك كودك — تربح عن كل سائق ينضم", - "rewardsCode": "كود الدعوة", - "rewardsInvited": "دعوتَهم", - "rewardsPending": "قيد التأكيد", - "rewardsPaid": "مكافآت مدفوعة", - "rewardsCoupons": "كوبوناتي", - "rewardsCouponsEmpty": "لا كوبونات صالحة الآن", - "menuRewards": "مكافآتي", - "menuInvite": "ادعُ سائقاً", - "menuShare": "شارك التطبيق", - "menuNotifications": "الإشعارات", - "menuPrivacy": "سياسة الخصوصية", - "menuRateApp": "قيّم التطبيق", - "shareMessage": "انضم لـTripz كسائق — استعمل كودي {code}\n{link}", - "shareMessagePlain": "انضم لـTripz كسائق\n{link}", - "menuRiderApp": "تطبيق الراكب", - "menuDriverApp": "تطبيق الراكب", - "@shareMessage": { - "placeholders": { - "code": { - "type": "String" - }, - "link": { - "type": "String" - } - } - }, - "@shareMessagePlain": { - "placeholders": { - "link": { - "type": "String" - } - } - }, - "supportFaqQ1": "كيف أطلب رحلة؟", - "supportFaqA1": "حدّد وجهتك من البحث أو من الخريطة، اختر نوع الرحلة، ثم اضغط «اطلب الرحلة».", - "supportFaqQ2": "كيف أشحن رصيدي؟", - "supportFaqA2": "من المحفظة اختر المبلغ وطريقة الدفع. ستظهر لك تعليمات التحويل ورقم مرجع — يُضاف الرصيد بعد تأكيد التحويل.", - "supportFaqQ3": "لماذا لا يظهر سائق؟", - "supportFaqA3": "قد لا يوجد سائقون قريبون في هذا الوقت. جرّب بعد قليل أو غيّر نوع الرحلة.", - "supportFaqQ4": "كيف ألغي رحلة؟", - "supportFaqA4": "من بطاقة الرحلة اضغط «إلغاء الرحلة». الإلغاء بعد وصول السائق قد يترتّب عليه رسم.", - "supportDeviceCheck": "فحص توافق الجهاز", - "supportDeviceOk": "جهازك متوافق", - "supportDeviceIssues": "مشاكل قد تؤثّر على عمل التطبيق", - "obApplyTitle": "سجّل كسائق", - "obApplyLead": "خطوات قصيرة ثم تبدأ العمل", - "obVehicleMake": "شركة السيارة", - "obServiceClass": "نوع الخدمة", - "obApplySubmit": "ابدأ التسجيل", - "obProfileTitle": "بياناتك", - "obNameArabic": "الاسم كما في الهوية", - "obNationalNumber": "الرقم الوطني", - "obGender": "الجنس", - "obGenderMale": "ذكر", - "obGenderFemale": "أنثى", - "obVehicleTitle": "مركبتك", - "obVehicleModel": "الطراز", - "obVehicleYear": "سنة الصنع", - "obVehicleColor": "اللون", - "obVehiclePlate": "رقم اللوحة", - "obDocsTitle": "وثائقك", - "obDocsLead": "صوّر كل وثيقة بوضوح — الاعتماد يتم بعد مراجعتها", - "obDocMissing": "مطلوبة", - "obDocPending": "قيد المراجعة", - "obDocApproved": "مقبولة", - "obDocRejected": "مرفوضة — أعد الرفع", - "obDocSideFront": "الوجه الأمامي", - "obDocSideBack": "الوجه الخلفي", - "obDocUpload": "رفع", - "obPendingTitle": "طلبك قيد المراجعة", - "obPendingLead": "سنُعلمك فور اعتماد حسابك. عادةً خلال يوم عمل.", - "obPendingRefresh": "تحديث الحالة", - "obApprovedTitle": "تم اعتمادك", - "obApprovedLead": "سجّل الدخول من جديد لتفعيل صلاحيات السائق", - "obRelogin": "إعادة تسجيل الدخول" -} \ No newline at end of file diff --git a/apps/driver_new/lib/core/l10n/app_en.arb b/apps/driver_new/lib/core/l10n/app_en.arb deleted file mode 100644 index 464024f..0000000 --- a/apps/driver_new/lib/core/l10n/app_en.arb +++ /dev/null @@ -1,296 +0,0 @@ -{ - "@@locale": "en", - "appTitle": "Tripz", - "actionRetry": "Try again", - "actionCancel": "Cancel", - "actionContinue": "Continue", - "actionSave": "Save", - "actionOpenSettings": "Open settings", - "errorGeneric": "Something went wrong", - "errorNetwork": "Could not reach the server", - "errorTimeout": "The connection timed out", - "emptyDefault": "Nothing here yet", - "splashRider": "Rider app", - "splashDriver": "Driver app", - "agreementTitle": "Terms of use", - "agreementLead": "Before we start, read the terms and accept them.", - "agreementCheckbox": "I have read and accept the terms", - "agreementAccept": "Accept and continue", - "permissionTitle": "We need your location", - "permissionLead": "Location is what makes a trip possible: it tells us where you are and where your driver is.", - "permissionAllow": "Allow location access", - "permissionDeniedForever": "You denied the permission permanently. Open settings, enable it, then come back.", - "phoneTitle": "Welcome, captain", - "phoneLead": "Enter your phone number and we'll send you a verification code.", - "phoneLabel": "Phone number", - "phoneHint": "without the leading zero", - "phoneSend": "Send verification code", - "phoneErrEmpty": "Enter your phone number", - "phoneErrLeadingZero": "Enter the number without the leading zero", - "phoneErrShort": "That number is too short", - "otpTitle": "Enter your code", - "otpLead": "We sent a 4-digit code to {phone}", - "@otpLead": { - "placeholders": { - "phone": { - "type": "String" - } - } - }, - "otpVerify": "Verify and continue", - "otpResend": "Resend the code", - "otpResendIn": "Resend in {seconds}s", - "@otpResendIn": { - "placeholders": { - "seconds": { - "type": "int" - } - } - }, - "otpErrIncomplete": "Enter the full code", - "otpErrInvalid": "That code is wrong or expired", - "otpErrTooManyAttempts": "Too many attempts. Request a new code.", - "otpErrRateLimited": "You requested the code too many times. Wait a moment and try again.", - "otpChangeNumber": "Change number", - "profileTitle": "Complete your profile", - "profileLead": "Your name is shown to the rider during a trip.", - "profileNameLabel": "Name", - "profileNameErrEmpty": "Enter your name", - "sessionExpired": "Your session ended. Please sign in again.", - "settingsTitle": "Settings", - "settingsTheme": "Appearance", - "settingsThemeSystem": "Follow system", - "settingsThemeLight": "Light", - "settingsThemeDark": "Dark", - "settingsLanguage": "Language", - "settingsLanguageArabic": "العربية", - "settingsLanguageEnglish": "English", - "settingsSectionGeneral": "General", - "settingsSectionSupport": "Support & info", - "settingsSupportLead": "FAQ and ways to reach us", - "settingsShareLead": "Share the app with your friends", - "paymentCash": "Cash", - "paymentWallet": "Wallet", - "rideWhereTo": "Where to?", - "rideOrigin": "From", - "rideDestination": "To", - "rideSearchHint": "Search for a place", - "rideAddStop": "Add a stop", - "rideStop": "Stop {n}", - "@rideStop": { - "placeholders": { - "n": { - "type": "int" - } - } - }, - "ridePickOnMap": "Pick on the map", - "rideConfirmPoint": "Confirm this point", - "rideConfirmTrip": "Request ride", - "rideSearchingTitle": "Finding you a driver", - "rideSearchingLead": "Usually under a minute", - "rideCancelSearch": "Cancel search", - "rideNoDrivers": "No drivers available right now. Try again shortly.", - "rideQuoteFailed": "Could not price this trip", - "rideRouteFailed": "Could not build the route", - "rideRequestFailed": "Could not send the request", - "rideSurge": "Demand is high right now", - "rideCancelTrip": "Cancel ride", - "rideEta": "{min} min", - "@rideEta": { - "placeholders": { - "min": { - "type": "String" - } - } - }, - "rideDistanceKm": "{km} km", - "@rideDistanceKm": { - "placeholders": { - "km": { - "type": "String" - } - } - }, - "tripAssigned": "Your driver is on the way", - "tripDriverArriving": "Your driver is close", - "tripDriverArrived": "Your driver is waiting", - "tripInProgress": "On the way to your destination", - "tripCompleted": "You've arrived", - "driverGoOnline": "Go online", - "driverGoOffline": "Go offline", - "driverOnline": "Online", - "driverOffline": "Offline", - "driverNoOffers": "No requests yet. Stay online.", - "driverOfferTitle": "New ride request", - "driverAccept": "Accept", - "driverReject": "Dismiss", - "driverOfferTaken": "Another driver took this request", - "driverArrivedAction": "I've arrived", - "driverStartTrip": "Start trip", - "driverEndTrip": "End trip", - "driverOnTheWay": "Heading to rider", - "rateTitle": "How was your ride?", - "rateTitleDriver": "How was your rider?", - "rateLead": "Your rating helps us improve", - "rateComment": "Add a note (optional)", - "rateSubmit": "Submit rating", - "rateSkip": "Later", - "rateAlready": "You already rated this trip", - "tripFareTitle": "Fare breakdown", - "tripFare": "Fare", - "tripEarnings": "Your earnings", - "tripCommission": "Commission", - "tripCancelTitle": "Why are you cancelling?", - "tripCancelReasonWait": "The wait is too long", - "tripCancelReasonMistake": "I requested by mistake", - "tripCancelReasonOther": "Another reason", - "tripCancelConfirm": "Confirm cancellation", - "tripCancelKeep": "Keep the ride", - "walletTitle": "Wallet", - "walletBalance": "Balance", - "walletTopup": "Top up", - "walletTopupAmount": "Amount", - "walletTransactions": "Transactions", - "walletEmpty": "No transactions yet", - "walletTopupFailed": "Top-up failed", - "creditTitle": "Operating credit", - "creditLead": "Commission is deducted from it when each trip ends", - "creditBlocked": "Your operating credit ran out — top it up to receive requests", - "payoutTitle": "Withdraw earnings", - "payoutAmount": "Amount", - "payoutChannel": "Payout channel", - "payoutRequest": "Send confirmation code", - "payoutOtpTitle": "Confirm withdrawal", - "payoutOtpLead": "We sent a code to your number to confirm this withdrawal", - "payoutConfirm": "Confirm withdrawal", - "payoutDone": "Withdrawal request sent", - "payoutFailed": "Withdrawal failed", - "payoutInsufficient": "Insufficient balance", - "payoutHistory": "Withdrawal requests", - "menuTitle": "Menu", - "menuProfile": "Account", - "menuTrips": "My trips", - "menuWallet": "Wallet", - "menuEarnings": "Earnings", - "menuSettings": "Settings", - "menuSupport": "Help", - "menuAbout": "About", - "menuLogout": "Sign out", - "menuLogoutConfirm": "Sign out of your account?", - "historyTitle": "My trips", - "historyEmpty": "No trips yet — go online to receive requests", - "historyStatusCompleted": "Completed", - "historyStatusCancelled": "Cancelled", - "historyStatusLive": "In progress", - "profileEditTitle": "Edit account", - "profilePhone": "Phone number", - "profilePhoneLocked": "Your number can't be changed — it identifies your account", - "profileSaved": "Changes saved", - "supportTitle": "Help", - "supportFaq": "FAQ", - "supportContact": "Contact us", - "supportWhatsapp": "Message on WhatsApp", - "aboutVersion": "Version", - "notifTitle": "Notifications", - "notifEnable": "Enable notifications", - "notifDenied": "Notifications are disabled in system settings", - "chatTitle": "Chat", - "chatHint": "Type a message", - "chatEmpty": "No messages yet", - "rideCoupon": "Promo code", - "rideCouponApply": "Apply", - "rideNoLocation": "Turn on location so we know where you are", - "rideBack": "Back", - "rideRetryQuote": "Recalculate fare", - "rideFrom": "From", - "rideTo": "To", - "walletChannel": "Payment method", - "rideTypeUnavailable": "Unavailable", - "rideSearchNoResults": "No results — try another name or pick on the map", - "walletInvoiceTitle": "Complete the transfer", - "walletInvoiceRef": "Reference", - "walletInvoiceTarget": "Transfer to", - "walletInvoicePending": "Your balance updates once the transfer is confirmed", - "walletCopy": "Copy", - "walletCopied": "Copied", - "walletNoTarget": "No receiving account is configured for this channel yet — contact the operator", - "rewardsTitle": "My rewards", - "rewardsInviteTitle": "Invite a driver", - "rewardsInviteLead": "Share your code — earn for every driver who joins", - "rewardsCode": "Invite code", - "rewardsInvited": "Invited", - "rewardsPending": "Pending", - "rewardsPaid": "Rewards paid", - "rewardsCoupons": "My coupons", - "rewardsCouponsEmpty": "No valid coupons right now", - "menuRewards": "My rewards", - "menuInvite": "Invite a driver", - "menuShare": "Share the app", - "menuNotifications": "Notifications", - "menuPrivacy": "Privacy policy", - "menuRateApp": "Rate the app", - "shareMessage": "Join Tripz as a driver — use my code {code}\n{link}", - "shareMessagePlain": "Join Tripz as a driver\n{link}", - "menuRiderApp": "Rider app", - "menuDriverApp": "Rider app", - "@shareMessage": { - "placeholders": { - "code": { - "type": "String" - }, - "link": { - "type": "String" - } - } - }, - "@shareMessagePlain": { - "placeholders": { - "link": { - "type": "String" - } - } - }, - "supportFaqQ1": "How do I request a ride?", - "supportFaqA1": "Pick your destination from search or the map, choose a ride type, then tap “Request ride”.", - "supportFaqQ2": "How do I top up?", - "supportFaqA2": "In the wallet, choose an amount and a payment method. You'll get transfer instructions and a reference — your balance updates once the transfer is confirmed.", - "supportFaqQ3": "Why is no driver showing up?", - "supportFaqA3": "There may be no drivers nearby right now. Try again shortly or change the ride type.", - "supportFaqQ4": "How do I cancel?", - "supportFaqA4": "Tap “Cancel ride” on the trip card. Cancelling after the driver arrives may incur a fee.", - "supportDeviceCheck": "Check device compatibility", - "supportDeviceOk": "Your device is compatible", - "supportDeviceIssues": "Issues that may affect the app", - "obApplyTitle": "Register as a driver", - "obApplyLead": "A few short steps, then you're working", - "obVehicleMake": "Car make", - "obServiceClass": "Service class", - "obApplySubmit": "Start registration", - "obProfileTitle": "Your details", - "obNameArabic": "Name as on your ID", - "obNationalNumber": "National ID number", - "obGender": "Gender", - "obGenderMale": "Male", - "obGenderFemale": "Female", - "obVehicleTitle": "Your vehicle", - "obVehicleModel": "Model", - "obVehicleYear": "Year", - "obVehicleColor": "Colour", - "obVehiclePlate": "Plate number", - "obDocsTitle": "Your documents", - "obDocsLead": "Photograph each document clearly — approval follows review", - "obDocMissing": "Required", - "obDocPending": "Under review", - "obDocApproved": "Approved", - "obDocRejected": "Rejected — upload again", - "obDocSideFront": "Front", - "obDocSideBack": "Back", - "obDocUpload": "Upload", - "obPendingTitle": "Your application is under review", - "obPendingLead": "We'll notify you as soon as it's approved. Usually within a business day.", - "obPendingRefresh": "Refresh status", - "obApprovedTitle": "You're approved", - "obApprovedLead": "Sign in again to activate your driver permissions", - "obRelogin": "Sign in again" -} \ No newline at end of file diff --git a/apps/driver_new/lib/core/l10n/l10n.dart b/apps/driver_new/lib/core/l10n/l10n.dart deleted file mode 100644 index abd1e2c..0000000 --- a/apps/driver_new/lib/core/l10n/l10n.dart +++ /dev/null @@ -1,10 +0,0 @@ -import 'package:flutter/widgets.dart'; - -import 'gen/app_localizations.dart'; - -export 'gen/app_localizations.dart'; - -/// كل نص مرئي يمرّ من هنا: `context.l10n.phoneTitle` (docs/26 §4). -extension L10nX on BuildContext { - L10n get l10n => L10n.of(this); -} diff --git a/apps/driver_new/lib/core/location/location_service.dart b/apps/driver_new/lib/core/location/location_service.dart deleted file mode 100644 index 0aa0fab..0000000 --- a/apps/driver_new/lib/core/location/location_service.dart +++ /dev/null @@ -1,59 +0,0 @@ -import 'dart:async'; - -import 'package:geolocator/geolocator.dart'; - -import '../config.dart'; - -/// الموقع — نقطة واحدة. لا `Geolocator` منثوراً في الشاشات. -class LocationService { - StreamSubscription? _sub; - - /// بلا هذا الفحص يرمي `getCurrentPosition` ونبتلع الخطأ فتبقى الكاميرا - /// على الاحتياطي بلا سبب ظاهر — وهو ما كان يبدو «الخريطة لا تتبع موقعي». - Future ensureReady() async { - if (!await Geolocator.isLocationServiceEnabled()) return false; - var permission = await Geolocator.checkPermission(); - if (permission == LocationPermission.denied) { - permission = await Geolocator.requestPermission(); - } - return permission == LocationPermission.always || - permission == LocationPermission.whileInUse; - } - - Future<({double lat, double lng})?> current() async { - if (!await ensureReady()) return null; - try { - final p = await Geolocator.getCurrentPosition( - locationSettings: const LocationSettings( - accuracy: LocationAccuracy.high, - timeLimit: Duration(seconds: 12), - ), - ); - return (lat: p.latitude, lng: p.longitude); - } catch (_) { - // آخر موقع معروف أفضل من لا شيء: خريطة تفتح على الصفر تجربة مكسورة. - final last = await Geolocator.getLastKnownPosition(); - return last == null ? null : (lat: last.latitude, lng: last.longitude); - } - } - - /// تدفّق المواقع بمرشّح مسافة — رفع كل متر يستنزف البطارية بلا فائدة. - Stream watch() { - return Geolocator.getPositionStream( - locationSettings: LocationSettings( - accuracy: LocationAccuracy.high, - distanceFilter: AppConfig.locationFilterMeters, - ), - ); - } - - void listen(void Function(Position) onPosition) { - _sub?.cancel(); - _sub = watch().listen(onPosition); - } - - Future stop() async { - await _sub?.cancel(); - _sub = null; - } -} diff --git a/apps/driver_new/lib/core/notifications/push_service.dart b/apps/driver_new/lib/core/notifications/push_service.dart deleted file mode 100644 index 8001472..0000000 --- a/apps/driver_new/lib/core/notifications/push_service.dart +++ /dev/null @@ -1,63 +0,0 @@ -import 'package:firebase_core/firebase_core.dart'; -import 'package:firebase_messaging/firebase_messaging.dart'; -import 'package:flutter/foundation.dart'; - -import '../api/api_client.dart'; -import '../api/api_exception.dart'; - -/// إشعارات FCM — **الطبقة الوحيدة التي تعرف Firebase**. -/// -/// عقد الخادم نقطة واحدة: `POST /notifications/token { token, platform }` -/// (docs/38 §11). لا نقطة سرد إشعارات، فلا شاشة «صندوق إشعارات» تُبنى على -/// وهم — ما يصل يصل من النظام. -/// -/// الإعداد الأصلي جاهز مسبقاً: `google-services.json` و -/// `GoogleService-Info.plist` منقولان مع الطبقة الأصلية، و`build.gradle` -/// يطبّق `com.google.gms.google-services` أصلاً. -class PushService { - PushService(this._api); - - final ApiClient _api; - - /// يُنادى **بعد** الدخول: التسجيل يربط الجهاز بالمستخدم، فقبل الجلسة - /// لا معنى له. - Future register() async { - try { - await Firebase.initializeApp(); - final messaging = FirebaseMessaging.instance; - - final settings = await messaging.requestPermission(); - if (settings.authorizationStatus == AuthorizationStatus.denied) return; - - final token = await messaging.getToken(); - if (token != null) await _send(token); - - // الرمز يُدوَّر من Google دورياً — بلا هذا الاشتراك تتوقّف الإشعارات - // بصمت بعد أسابيع. - messaging.onTokenRefresh.listen(_send); - } catch (_) { - // غياب الإشعارات لا يمنع استعمال التطبيق — لا يُسقط الإقلاع. - } - } - - Future _send(String token) async { - try { - await _api.post>( - '/notifications/token', - body: { - 'token': token, - 'platform': defaultTargetPlatformName, - }, - ); - } on ApiException { - // يُعاد في الإقلاع التالي. - } - } -} - -/// المنصّة كما يتوقّعها الخادم — تُقرأ من المنصّة الفعلية لا من عَلَم بناء. -String get defaultTargetPlatformName => switch (defaultTargetPlatform) { - TargetPlatform.iOS => 'ios', - TargetPlatform.android => 'android', - _ => 'unknown', - }; diff --git a/apps/driver_new/lib/core/payments/country_codes.dart b/apps/driver_new/lib/core/payments/country_codes.dart deleted file mode 100644 index 0c64dfe..0000000 --- a/apps/driver_new/lib/core/payments/country_codes.dart +++ /dev/null @@ -1,48 +0,0 @@ -/// مفاتيح الدول المدعومة. -/// -/// حزمة `intl_phone_field` التي يستعملها سيرو تحمل **240 دولة** ولا نحتاج -/// منها إلا أربعاً، وتجرّ معها أصولاً وتبعيّات. القائمة هنا صريحة ومقصورة -/// على أسواقنا — وتتوسّع بسطر واحد. -/// -/// ترتيب العرض يبدأ بحزمة دولة المستأجر (`countryPack`)، فالمشغّل الأردني -/// يرى الأردن أولاً بلا بحث. -enum CountryCode { - jordan('jo', '962', 'الأردن', 'Jordan', '🇯🇴', 9), - syria('sy', '963', 'سوريا', 'Syria', '🇸🇾', 9), - egypt('eg', '20', 'مصر', 'Egypt', '🇪🇬', 10), - iraq('iq', '964', 'العراق', 'Iraq', '🇮🇶', 10); - - const CountryCode( - this.pack, - this.dial, - this.nameAr, - this.nameEn, - this.flag, - this.nationalLength, - ); - - /// يطابق `countryPack` في إعداد المستأجر. - final String pack; - - /// المفتاح الدولي بلا `+`. - final String dial; - - final String nameAr; - final String nameEn; - final String flag; - - /// طول الرقم الوطني **بلا الصفر البادئ** — أساس التحقّق المحلّي. - final int nationalLength; - - String nameFor(String languageCode) => - languageCode == 'ar' ? nameAr : nameEn; - - static CountryCode fromPack(String pack) => - values.firstWhere((c) => c.pack == pack, orElse: () => jordan); - - /// المستأجر أولاً ثم الباقي — لا ترتيب أبجدي يدفن سوق المشغّل للأسفل. - static List orderedFor(String pack) { - final first = fromPack(pack); - return [first, ...values.where((c) => c != first)]; - } -} diff --git a/apps/driver_new/lib/core/payments/payment_channels.dart b/apps/driver_new/lib/core/payments/payment_channels.dart deleted file mode 100644 index 2bb7195..0000000 --- a/apps/driver_new/lib/core/payments/payment_channels.dart +++ /dev/null @@ -1,61 +0,0 @@ -/// قنوات الدفع والسحب حسب **حزمة دولة المستأجر** (`countryPack` من -/// `GET /tenant/config/:slug` — docs/38 §10)، لا حسب لغة الجهاز ولا موقعه. -/// -/// المستأجر هو من يحدّد السوق: مشغّل أردني يخدم مستخدماً هاتفه إنجليزي -/// وموقعه خارج الأردن يبقى أردنيّ القنوات. -/// -/// الشحن يمرّ بـ**`POST /payments/charge`** لا `POST /wallet/topup` — الأخير -/// كاش-إن تجريبي يزيد الرصيد بلا دفع. -/// -/// كليك وشام كاش وزين كاش تعمل بنمط **الفاتورة**: الخادم يولّد مرجعاً ويعرض -/// حساب الاستلام، والمستخدم يحوّل، والتسوية تصل لاحقاً عبر مطابقة رسالة -/// المزوّد (SMS) — وهو **نفس ما يفعله سيرو** حرفياً -/// (`create_cliq_invoice.php`). لا بوابة تحويل حيّة لأيٍّ منها. -/// PayMob وحده يعمل بإعادة توجيه فعلية. -enum PaymentChannel { - // ⚠️ `wire` يجب أن يطابق اسم المحوّل في `PaymentGatewayRegistry` حرفياً — - // أي اسم آخر يرجّع 400 `unsupported provider`. - cliq('cliq', 'CliQ', 'كليك'), - syriatel('syriatel', 'Syriatel Cash', 'سيرياتيل كاش'), - mtn('mtn', 'MTN Cash', 'إم تي إن كاش'), - shamCash('shamcash', 'Sham Cash', 'شام كاش'), - zainCash('zaincash', 'ZainCash', 'زين كاش'), - paymob('paymob', 'PayMob', 'باي موب'), - cash('cash', 'Cash', 'نقداً'); - - const PaymentChannel(this.wire, this.nameEn, this.nameAr); - - /// القيمة المرسلة للخادم في حقل `channel`. - final String wire; - final String nameEn; - final String nameAr; - - String nameFor(String languageCode) => - languageCode == 'ar' ? nameAr : nameEn; - - /// القنوات المتاحة لكل حزمة دولة — مطابقة لما هو مدعوم فعلياً في السوق - /// (نفس قنوات سيرو الميدانية). - static List forCountry(String countryPack) => - switch (countryPack) { - 'jo' => const [PaymentChannel.cliq, PaymentChannel.cash], - 'sy' => const [ - PaymentChannel.syriatel, - PaymentChannel.mtn, - PaymentChannel.shamCash, - PaymentChannel.cash, - ], - 'eg' => const [PaymentChannel.paymob, PaymentChannel.cash], - // العراق: المحافظ الأشيع محلياً. ⚠️ الباك إند لا يعرف حزمة `iq` بعد - // (`default-tariffs.ts` فيه jo/sy/eg فقط) — مستأجر عراقي يُزوَّد بلا - // تعرفة، وهذا شغل خادم يسبق أي إطلاق عراقي. - 'iq' => const [PaymentChannel.zainCash, PaymentChannel.cash], - // حزمة غير معروفة: النقد وحده — لا نعرض قناة قد لا تعمل في سوقها. - _ => const [PaymentChannel.cash], - }; - - /// قنوات السحب — النقد ليس قناة سحب. - static List payoutFor(String countryPack) => - forCountry(countryPack) - .where((c) => c != PaymentChannel.cash) - .toList(growable: false); -} diff --git a/apps/driver_new/lib/core/realtime/realtime_service.dart b/apps/driver_new/lib/core/realtime/realtime_service.dart deleted file mode 100644 index 29b0022..0000000 --- a/apps/driver_new/lib/core/realtime/realtime_service.dart +++ /dev/null @@ -1,95 +0,0 @@ -import 'dart:async'; - -import 'package:socket_io_client/socket_io_client.dart' as io; - -import '../config.dart'; - -import '../storage/token_store.dart'; - -/// أحداث الخادم كما هي في `backend-archive/src/realtime` (docs/38 §9). -class RealtimeEvent { - const RealtimeEvent(this.name, this.data); - - final String name; - final Map data; - - static const tripUpdate = 'trip:update'; - static const driverLocation = 'driver:location'; - static const tripOffer = 'trip:offer'; - static const tripOfferTaken = 'trip:offer_taken'; -} - -/// اتصال Socket.IO واحد للتطبيق كله. -/// -/// **الاتصال ليس مصدر الحقيقة**: كل ما يصل عبره يجب أن يكون قابلاً للاستنتاج -/// من REST أيضاً. حدثٌ ضائع (شبكة سيّئة، أو ثغرة R1 التي قد تمنع -/// `expired`/`no_drivers` أصلاً) يجب ألّا يُجمّد شاشة. -class RealtimeService { - RealtimeService(this._tokens); - - final TokenStore _tokens; - - io.Socket? _socket; - final _events = StreamController.broadcast(); - - Stream get events => _events.stream; - bool get isConnected => _socket?.connected ?? false; - - Future connect() async { - if (_socket != null) return; - final token = _tokens.accessToken; - if (token == null) return; - - // الأصل بلا `/api` — الـSocket.IO ليس على مسار الـREST (docs/38 §9). - final socket = io.io( - AppConfig.wsBaseUrl, - io.OptionBuilder() - .setTransports(['websocket']) - .setAuth({'token': token}) - .enableReconnection() - .build(), - ); - - for (final name in const [ - RealtimeEvent.tripUpdate, - RealtimeEvent.driverLocation, - RealtimeEvent.tripOffer, - RealtimeEvent.tripOfferTaken, - ]) { - socket.on(name, (data) { - if (data is Map) { - _events.add(RealtimeEvent(name, Map.from(data))); - } - }); - } - - _socket = socket; - } - - /// الانضمام **قبل** أي انتقال حالة، وإلا فاتت الأحداث (docs/38 §9). - void joinTrip(String tripId) => _socket?.emit('trip:join', {'tripId': tripId}); - - void sendDriverLocation(double lat, double lng, {double? heading}) { - _socket?.emit(RealtimeEvent.driverLocation, { - 'lat': lat, - 'lng': lng, - 'heading': ?heading, - }); - } - - /// عند تجديد التوكن أو تبديل المستخدم: قطعٌ وإعادة اتصال بالتوكن الجديد. - Future reconnect() async { - disconnect(); - await connect(); - } - - void disconnect() { - _socket?.dispose(); - _socket = null; - } - - Future dispose() async { - disconnect(); - await _events.close(); - } -} diff --git a/apps/driver_new/lib/core/router.dart b/apps/driver_new/lib/core/router.dart deleted file mode 100644 index 1bf7a7c..0000000 --- a/apps/driver_new/lib/core/router.dart +++ /dev/null @@ -1,168 +0,0 @@ -import 'dart:async'; - -import 'package:flutter/widgets.dart'; - -import 'package:go_router/go_router.dart'; - -import '../features/auth/view/login_page.dart'; - -import '../features/profile/view/profile_edit_page.dart'; - -import '../features/profile/view/profile_setup_page.dart'; - -import '../features/rating/data/rating_repository.dart'; -import '../features/rewards/view/rewards_page.dart'; - -import '../features/rating/view/rating_page.dart'; - -import '../features/settings/view/settings_page.dart'; - -import '../features/splash/view/splash_page.dart'; - -import '../features/support/view/support_page.dart'; - -import '../features/trip/view/history_page.dart'; - -import '../features/chat/view/chat_page.dart'; -import '../features/onboarding/view/onboarding_page.dart'; -import '../features/trip/view/duty_page.dart'; - -import '../features/wallet/view/earnings_page.dart'; - -import 'di.dart'; - -import 'session/session_cubit.dart'; - -import 'session/session_state.dart'; - -class Routes { - const Routes._(); - static const splash = '/'; - static const login = '/login'; - static const profile = '/profile'; - static const home = '/home'; - static const rating = '/rating'; - static const wallet = '/wallet'; - static const history = '/history'; - static const profileEdit = '/account'; - static const settings = '/settings'; - static const support = '/support'; - static const rewards = '/rewards'; - static const chat = '/chat'; - static const onboarding = '/onboarding'; -} - -/// التوجيه يُشتقّ من `SessionCubit` وحده — لا `Navigator.push` بعد الدخول -/// موزّعة في الشاشات، فلا تتناقض حالتان. -final appRouter = GoRouter( - initialLocation: Routes.splash, - refreshListenable: _CubitListenable(sl().stream), - redirect: (context, state) { - final session = sl().state; - final loc = state.matchedLocation; - - // قبل أن نعرف: نبقى على الإقلاع ولا نقرّر شيئاً. - if (!session.isReady) return loc == Routes.splash ? null : Routes.splash; - - return switch (session.status) { - SessionStatus.unauthenticated => - loc == Routes.login ? null : Routes.login, - SessionStatus.needsProfile => loc == Routes.profile ? null : Routes.profile, - // التقييم المعلّق يحجز التطبيق كله: لا شاشة أخرى قبل حسمه - // (docs/38 §7 — يُفرض عند الفتح). - SessionStatus.authenticated when session.pendingRating != null => - loc == Routes.rating ? null : Routes.rating, - // السائق غير المعتمد يُحجز في التسجيل: دوره لا يزال `rider` على - // الخادم، فكل نقاط السائق ترجّع 403 (docs/38 §5). - SessionStatus.authenticated - when session.user?.role != 'driver' && loc != Routes.onboarding => - Routes.onboarding, - SessionStatus.authenticated => (loc == Routes.login || - loc == Routes.profile || - loc == Routes.splash || - loc == Routes.rating) - ? Routes.home - : null, - SessionStatus.unknown => Routes.splash, - }; - }, - routes: [ - GoRoute( - path: Routes.splash, - builder: (context, state) => const SplashPage(), - ), - GoRoute( - path: Routes.login, - builder: (context, state) => const LoginPage(), - ), - GoRoute( - path: Routes.profile, - builder: (context, state) => const ProfileSetupPage(), - ), - GoRoute( - path: Routes.rating, - builder: (context, state) { - final pending = sl().state.pendingRating!; - return RatingPage( - pending: PendingRating( - tripId: pending.tripId, - role: pending.role, - ), - onDone: sl().onRatingResolved, - ); - }, - ), - GoRoute( - path: Routes.wallet, - builder: (context, state) => const EarningsPage(), - ), - GoRoute( - path: Routes.history, - builder: (context, state) => const HistoryPage(), - ), - GoRoute( - path: Routes.profileEdit, - builder: (context, state) => const ProfileEditPage(), - ), - GoRoute( - path: Routes.settings, - builder: (context, state) => const SettingsPage(), - ), - GoRoute( - path: Routes.chat, - builder: (context, state) => - ChatPage(tripId: state.uri.queryParameters['trip'] ?? ''), - ), - GoRoute( - path: Routes.onboarding, - builder: (context, state) => const OnboardingPage(), - ), - GoRoute( - path: Routes.rewards, - builder: (context, state) => const RewardsPage(), - ), - GoRoute( - path: Routes.support, - builder: (context, state) => const SupportPage(), - ), - GoRoute( - path: Routes.home, - builder: (context, state) => const DutyPage(), - ), - ], -); - -/// جسر بين تيّار الـCubit و`refreshListenable` الذي يطلبه go_router. -class _CubitListenable extends ChangeNotifier { - _CubitListenable(Stream stream) { - _sub = stream.listen((_) => notifyListeners()); - } - - late final StreamSubscription _sub; - - @override - void dispose() { - _sub.cancel(); - super.dispose(); - } -} diff --git a/apps/driver_new/lib/core/session/app_user.dart b/apps/driver_new/lib/core/session/app_user.dart deleted file mode 100644 index d6aac53..0000000 --- a/apps/driver_new/lib/core/session/app_user.dart +++ /dev/null @@ -1,50 +0,0 @@ -import 'package:equatable/equatable.dart'; - -/// المستخدم كما يرجّعه الخادم (docs/38 §2 — شكل مُتحقَّق حيّاً). -class AppUser extends Equatable { - const AppUser({ - required this.id, - required this.tenantId, - required this.phone, - required this.role, - required this.status, - required this.language, - this.name, - this.rating, - }); - - final String id; - final String tenantId; - - /// مطبَّع دولياً من الخادم (`0790000001` ← `962790000001`) — لا يُقارن نصّياً - /// بما أدخله المستخدم (docs/38 §2). - final String phone; - - final String role; - final String status; - final String language; - final String? name; - - /// نصّ لا رقم — كل الأرقام العشرية تصل نصوصاً (docs/38 §12.2). - final String? rating; - - /// `phone_bidx` يصل في الرد لكنه فهرس أعمى للخادم — **لا يُخزَّن ولا يُعرض**. - factory AppUser.fromJson(Map json) { - return AppUser( - id: json['id'] as String, - tenantId: json['tenant_id'] as String, - phone: json['phone'] as String, - role: json['role'] as String? ?? 'rider', - status: json['status'] as String? ?? 'active', - language: json['language'] as String? ?? 'ar', - name: json['name'] as String?, - rating: json['rating']?.toString(), - ); - } - - /// الملف ناقص ما لم يُدخل المستخدم اسمه — يقود شاشة إكمال الملف. - bool get needsProfile => name == null || name!.trim().isEmpty; - - @override - List get props => [id, tenantId, phone, role, status, language, name]; -} diff --git a/apps/driver_new/lib/core/session/session_cubit.dart b/apps/driver_new/lib/core/session/session_cubit.dart deleted file mode 100644 index d390208..0000000 --- a/apps/driver_new/lib/core/session/session_cubit.dart +++ /dev/null @@ -1,90 +0,0 @@ -import 'dart:async'; - -import 'package:flutter_bloc/flutter_bloc.dart'; - -import '../api/api_exception.dart'; -import 'app_user.dart'; -import 'session_source.dart'; -import 'session_state.dart'; - -/// حالة الجلسة على مستوى التطبيق — مصدر قرار التوجيه الوحيد -/// (`core/router.dart` يستمع إليها). -class SessionCubit extends Cubit { - SessionCubit(this._repo, {Future Function()? onAuthenticated}) - : _onAuthenticated = onAuthenticated, - super(const SessionState()); - - final SessionSource _repo; - - /// خطّاف يُنفَّذ مرة عند إثبات الجلسة — يبقي `core/session` جاهلاً بمن - /// يستمع إليه. - final Future Function()? _onAuthenticated; - - /// تُستدعى مرة عند الإقلاع من شاشة الـsplash. - Future restore() async { - if (!_repo.hasSession) { - emit(const SessionState(status: SessionStatus.unauthenticated)); - return; - } - try { - _apply(await _repo.me()); - } on ApiException catch (e) { - // 401 هنا يعني رمز تحديث ميّت — الـinterceptor مسح المخزن أصلاً. - // أي خطأ آخر (شبكة) لا يُسقط الجلسة: المستخدم مسجّل، الشبكة هي الغائبة. - if (e.isUnauthorized) { - emit(const SessionState(status: SessionStatus.unauthenticated)); - } else { - emit(const SessionState(status: SessionStatus.authenticated)); - } - } - } - - void onLoggedIn(AppUser user) => _apply(user); - - void onProfileCompleted(AppUser user) => _apply(user); - - Future logout() async { - await _repo.logout(); - emit(const SessionState(status: SessionStatus.unauthenticated)); - } - - /// انتهاء الجلسة من طبقة الشبكة (رمز تحديث ميّت) — لا يمرّ بالمستودع. - void onSessionExpired() { - emit(const SessionState(status: SessionStatus.unauthenticated)); - } - - /// يُنادى بعد التقييم أو تخطّيه — يرفع الحجز عن بقية التطبيق. - void onRatingResolved() => - emit(state.copyWith(clearPendingRating: true)); - - void _apply(AppUser user) { - emit(SessionState( - status: user.needsProfile - ? SessionStatus.needsProfile - : SessionStatus.authenticated, - user: user, - pendingRating: state.pendingRating, - )); - // بعد إثبات الجلسة: التقييم المعلّق، وتسجيل رمز الإشعارات (يربط الجهاز - // بالمستخدم، فلا معنى له قبل الدخول). - if (!user.needsProfile) { - unawaited(_checkPendingRating()); - unawaited(_onAuthenticated?.call() ?? Future.value()); - } - } - - Future _checkPendingRating() async { - try { - final pending = await _repo.pendingRating(); - if (isClosed || pending == null) return; - emit(state.copyWith( - pendingRating: PendingRatingRef( - tripId: pending.tripId, - role: pending.role, - ), - )); - } on ApiException { - // فحصٌ مساعد لا حاجز دخول. - } - } -} diff --git a/apps/driver_new/lib/core/session/session_source.dart b/apps/driver_new/lib/core/session/session_source.dart deleted file mode 100644 index 6e2e0b3..0000000 --- a/apps/driver_new/lib/core/session/session_source.dart +++ /dev/null @@ -1,16 +0,0 @@ -import 'app_user.dart'; - -/// ما تحتاجه الجلسة من طبقة المصادقة — **ولا شيء أكثر**. -/// -/// `SessionCubit` حالةٌ على مستوى التطبيق (الراوتر والشاشات كلها تقرأها)، -/// فمحلّها `core/`. ولأن `core/` لا يجوز أن يستورد من `features/` كما لا -/// تستورد ميزةٌ من أخرى (docs/23 §1)، تُعرّف الحاجة هنا كواجهة ضيّقة -/// ويُنفّذها `AuthRepository` في ميزة المصادقة. -abstract interface class SessionSource { - Future me(); - - /// رحلة تنتظر تقييماً، أو `null`. يُنفّذها `RatingRepository`. - Future<({String tripId, String role})?> pendingRating(); - Future logout(); - bool get hasSession; -} diff --git a/apps/driver_new/lib/core/session/session_state.dart b/apps/driver_new/lib/core/session/session_state.dart deleted file mode 100644 index 9d0b92d..0000000 --- a/apps/driver_new/lib/core/session/session_state.dart +++ /dev/null @@ -1,56 +0,0 @@ -import 'package:equatable/equatable.dart'; - -import 'app_user.dart'; - -/// رحلة تنتظر تقييماً — تُفحص عند كل فتح للتطبيق (docs/38 §7). -class PendingRatingRef { - const PendingRatingRef({required this.tripId, required this.role}); - - final String tripId; - final String role; - - bool get isDriver => role == 'driver'; -} - -enum SessionStatus { - /// قبل أن نعرف — تُعرض شاشة الإقلاع، ولا يُتّخذ قرار توجيه. - unknown, - authenticated, - - /// مصادَق لكن بلا اسم — يُوجَّه لإكمال الملف قبل أي شاشة أخرى. - needsProfile, - unauthenticated, -} - -class SessionState extends Equatable { - const SessionState({ - this.status = SessionStatus.unknown, - this.user, - this.pendingRating, - }); - - final SessionStatus status; - final AppUser? user; - - /// وجودها يفرض شاشة التقييم قبل أي شاشة أخرى. - final PendingRatingRef? pendingRating; - - bool get isReady => status != SessionStatus.unknown; - - SessionState copyWith({ - SessionStatus? status, - AppUser? user, - PendingRatingRef? pendingRating, - bool clearPendingRating = false, - }) { - return SessionState( - status: status ?? this.status, - user: user ?? this.user, - pendingRating: - clearPendingRating ? null : (pendingRating ?? this.pendingRating), - ); - } - - @override - List get props => [status, user, pendingRating?.tripId]; -} diff --git a/apps/driver_new/lib/core/storage/token_store.dart b/apps/driver_new/lib/core/storage/token_store.dart deleted file mode 100644 index 481b770..0000000 --- a/apps/driver_new/lib/core/storage/token_store.dart +++ /dev/null @@ -1,94 +0,0 @@ -import 'dart:convert'; - -import 'package:flutter_secure_storage/flutter_secure_storage.dart'; - -/// مخزن الرموز — التخزين الآمن وحده. لا يُكتب توكن في `SharedPreferences`. -class TokenStore { - TokenStore(this._storage); - - final FlutterSecureStorage _storage; - - static const _kAccess = 'access_token'; - static const _kRefresh = 'refresh_token'; - static const _kSigning = 'signing_key'; - static const _kDeviceId = 'device_id'; - - // نسخة في الذاكرة: الـinterceptor يقرأ التوكن عند كل طلب، وقراءة Keychain - // في كل مرة عمل ثقيل على المسار الساخن. - String? _access; - String? _refresh; - - Future load() async { - _access = await _storage.read(key: _kAccess); - _refresh = await _storage.read(key: _kRefresh); - } - - String? get accessToken => _access; - String? get refreshToken => _refresh; - bool get isLoggedIn => _refresh != null && _refresh!.isNotEmpty; - - Future save({ - required String accessToken, - required String refreshToken, - String? signingKey, - }) async { - _access = accessToken; - _refresh = refreshToken; - await _write(_kAccess, accessToken); - await _write(_kRefresh, refreshToken); - if (signingKey != null) { - await _write(_kSigning, signingKey); - } - } - - Future clear() async { - _access = null; - _refresh = null; - await _storage.delete(key: _kAccess); - await _storage.delete(key: _kRefresh); - await _storage.delete(key: _kSigning); - // مُعرّف الجهاز لا يُمسح عند الخروج — هو بصمة الجهاز لا بصمة الجلسة. - } - - /// مفتاح توقيع الطلبات — يعود مع رد الدخول (docs/38 §8). يُستهلك في م3. - Future signingKey() => _storage.read(key: _kSigning); - - Future deviceId() => _storage.read(key: _kDeviceId); - Future setDeviceId(String id) => _write(_kDeviceId, id); - - Future _write(String key, String value) async { - try { - await _storage.write(key: key, value: value); - } catch (_) { - await _storage.delete(key: key); - await _storage.write(key: key, value: value); - } - } - - /// هل انتهت صلاحية التوكن (أو ستنتهي خلال [leeway])؟ - /// - /// قراءة محليّة لحقل `exp` — بلا حزمة خارجية. أي عطب في التوكن يُعامل - /// كمنتهٍ: الأسوأ تجديد زائد، لا طلب فاشل. - bool isAccessExpired(Duration leeway) { - final token = _access; - if (token == null || token.isEmpty) return true; - final exp = _expiryOf(token); - if (exp == null) return true; - return DateTime.now().add(leeway).isAfter(exp); - } - - static DateTime? _expiryOf(String jwt) { - try { - final parts = jwt.split('.'); - if (parts.length != 3) return null; - final payload = json.decode( - utf8.decode(base64Url.decode(base64Url.normalize(parts[1]))), - ) as Map; - final exp = payload['exp']; - if (exp is! int) return null; - return DateTime.fromMillisecondsSinceEpoch(exp * 1000); - } catch (_) { - return null; - } - } -} diff --git a/apps/driver_new/lib/core/store_links.dart b/apps/driver_new/lib/core/store_links.dart deleted file mode 100644 index 6b3d8a9..0000000 --- a/apps/driver_new/lib/core/store_links.dart +++ /dev/null @@ -1,37 +0,0 @@ -import 'package:flutter/foundation.dart'; - -import 'build_config.dart'; -import 'config.dart'; - -/// اختيار رابط المتجر الصحيح — **بالمنصّة والدور معاً**. -/// -/// كان الخطأ (مثبت 2026-08-05): رابط واحد ثابت `https://tripz.app` لكل -/// شيء — فـ«قيّم التطبيق» لا يفتح صفحة تقييم، و«شارك التطبيق» يرسل رسالة -/// بلا رابط أصلاً، و«سجّل كسائق» يفتح صفحة تسويقية لا تطبيق السائق. -/// -/// أربع حالات لا واحدة: {آيفون، أندرويد} × {راكب، سائق}. والدور يأتي من -/// [AppConfig.appRole] الذي يميّز البناءين أصلاً. -class StoreLinks { - const StoreLinks._(); - - static bool get _isIos => defaultTargetPlatform == TargetPlatform.iOS; - - static bool get _isDriverBuild => AppConfig.appRole == 'driver'; - - /// رابط تطبيق الراكب على منصّة هذا الجهاز. - static String get rider => - _isIos ? BuildConfig.riderIosUrl : BuildConfig.riderAndroidUrl; - - /// رابط تطبيق السائق على منصّة هذا الجهاز. - static String get driver => - _isIos ? BuildConfig.driverIosUrl : BuildConfig.driverAndroidUrl; - - /// **هذا** التطبيق في متجر هذا الجهاز — لـ«قيّم التطبيق» ولرابط المشاركة. - /// - /// السائق يشارك رابط السائق، والراكب رابط الراكب: مشاركةُ راكبٍ لرابط - /// السائق تُنزِّل المدعوَّ تطبيقاً خاطئاً. - static String get thisApp => _isDriverBuild ? driver : rider; - - /// تطبيق الطرف الآخر — «سجّل كسائق» في تطبيق الراكب، والعكس. - static String get otherApp => _isDriverBuild ? rider : driver; -} diff --git a/apps/driver_new/lib/core/tenant/feature_gate.dart b/apps/driver_new/lib/core/tenant/feature_gate.dart deleted file mode 100644 index 9e5d07a..0000000 --- a/apps/driver_new/lib/core/tenant/feature_gate.dart +++ /dev/null @@ -1,13 +0,0 @@ -import 'package:flutter/widgets.dart'; -import 'package:flutter_bloc/flutter_bloc.dart'; - -import 'tenant_cubit.dart'; - -extension FeatureGateX on BuildContext { - /// هل الميزة مفعّلة **لهذا المستأجر** وقت التشغيل؟ - /// - /// تُقرأ مع علم `Features` الثابت: الأول يقرّر ما بُني، وهذا ما يُعرض. - /// أيّهما `false` يُخفي الميزة. - bool tenantHas(String feature) => - watch().state.has(feature); -} diff --git a/apps/driver_new/lib/core/tenant/tenant_config.dart b/apps/driver_new/lib/core/tenant/tenant_config.dart deleted file mode 100644 index daad1c4..0000000 --- a/apps/driver_new/lib/core/tenant/tenant_config.dart +++ /dev/null @@ -1,79 +0,0 @@ -import 'dart:convert'; - -import 'package:equatable/equatable.dart'; - -/// إعداد المستأجر من `GET /tenant/config/:slug` (شكل مُتحقَّق حيّاً، -/// docs/38 §10) — بلا توكن، فيُجلب قبل الدخول. -/// -/// **طبقتا الميزات**، ولكلٍّ دورها: -/// - `Features` (`const` في `build_config.dart`) يقرّر ما **يُبنى** في -/// الـbinary — إطفاؤه يحذف الكود فلا يُستخرج (docs/23 §5). -/// - هذا الإعداد يقرّر ما **يُعرض** ممّا بُني، حسب ما اشتراه المستأجر فعلاً. -/// الشاشة تتحقّق من الاثنتين: `Features.wallet && tenant.has('wallet')`. -class TenantConfig extends Equatable { - const TenantConfig({ - required this.slug, - required this.name, - required this.countryPack, - required this.plan, - required this.features, - }); - - final String slug; - final String name; - - /// يحدّد مزوّد الرسائل والعملة وصيغة الهاتف — `jo`/`eg`/`sy`. - final String countryPack; - - final String plan; - final Map features; - - static const empty = TenantConfig( - slug: '', - name: '', - countryPack: '', - plan: '', - features: {}, - ); - - /// الافتراض `false` عند غياب المفتاح: ميزة غير معلنة = غير مشتراة. - bool has(String feature) => features[feature] ?? false; - - factory TenantConfig.fromJson(Map json) { - final raw = json['features']; - return TenantConfig( - slug: json['slug'] as String? ?? '', - name: json['name'] as String? ?? '', - countryPack: json['countryPack'] as String? ?? '', - plan: json['plan'] as String? ?? '', - features: raw is Map - ? { - for (final e in raw.entries) - e.key.toString(): e.value == true, - } - : const {}, - ); - } - - Map toJson() => { - 'slug': slug, - 'name': name, - 'countryPack': countryPack, - 'plan': plan, - 'features': features, - }; - - String encode() => json.encode(toJson()); - - static TenantConfig? decode(String? raw) { - if (raw == null || raw.isEmpty) return null; - try { - return TenantConfig.fromJson(json.decode(raw) as Map); - } catch (_) { - return null; - } - } - - @override - List get props => [slug, name, countryPack, plan, features]; -} diff --git a/apps/driver_new/lib/core/tenant/tenant_cubit.dart b/apps/driver_new/lib/core/tenant/tenant_cubit.dart deleted file mode 100644 index c56eebd..0000000 --- a/apps/driver_new/lib/core/tenant/tenant_cubit.dart +++ /dev/null @@ -1,35 +0,0 @@ -import 'package:flutter_bloc/flutter_bloc.dart'; -import 'package:shared_preferences/shared_preferences.dart'; - -import '../api/api_client.dart'; -import '../api/api_exception.dart'; -import '../build_config.dart'; -import 'tenant_config.dart'; - -/// يجلب إعداد المستأجر مرة عند الإقلاع، ويخزّنه محلياً. -/// -/// **النسخة المخزّنة تُعرض فوراً** ثم تُحدَّث من الشبكة: إقلاعٌ بلا إنترنت -/// يجب أن يعرض التطبيق بميزاته المعروفة آخر مرة، لا شاشة فارغة. -class TenantCubit extends Cubit { - TenantCubit(this._api, this._prefs) - : super(TenantConfig.decode(_prefs.getString(_key)) ?? TenantConfig.empty); - - final ApiClient _api; - final SharedPreferences _prefs; - - static const _key = 'tenant.config'; - - Future load() async { - try { - final res = await _api.get>( - '/tenant/config/${BuildConfig.tenantSlug}', - ); - final config = TenantConfig.fromJson(res); - emit(config); - await _prefs.setString(_key, config.encode()); - } on ApiException { - // الفشل يُبقي النسخة المخزّنة — لا يُطفئ ميزات المستخدم لأن الشبكة - // تعثّرت لحظة الإقلاع. - } - } -} diff --git a/apps/driver_new/lib/core/ui/app_drawer.dart b/apps/driver_new/lib/core/ui/app_drawer.dart deleted file mode 100644 index d1d0cac..0000000 --- a/apps/driver_new/lib/core/ui/app_drawer.dart +++ /dev/null @@ -1,251 +0,0 @@ -import 'package:flutter/material.dart'; -import 'package:flutter_bloc/flutter_bloc.dart'; -import 'package:go_router/go_router.dart'; -import 'package:share_plus/share_plus.dart'; -import 'package:url_launcher/url_launcher.dart'; - -import '../build_config.dart'; -import '../config.dart'; -import '../design/tokens.dart'; -import '../design/tripz_colors.dart'; -import '../l10n/l10n.dart'; -import '../router.dart'; -import '../session/session_cubit.dart'; -import '../session/session_state.dart'; -import '../store_links.dart'; -import '../tenant/feature_gate.dart'; - -/// الدراور — نقطة تطبيق **طبقتَي الميزات** معاً (docs/23 §5 + docs/38 §10): -/// -/// * `Features.x` ثابت: يقرّر ما بُني في الـbinary. إطفاؤه يحذف الكود. -/// * `context.tenantHas('x')`: يقرّر ما يُعرض ممّا بُني، حسب اشتراك المستأجر. -/// -/// أيّهما `false` يُخفي المدخل — ولا يُكتب `if` ثانٍ في أي شاشة. -class AppDrawer extends StatelessWidget { - const AppDrawer({super.key}); - - @override - Widget build(BuildContext context) { - final l10n = context.l10n; - final isDriver = AppConfig.appRole == 'driver'; - - return Drawer( - child: SafeArea( - child: Column( - children: [ - const _Header(), - const Divider(height: 1), - Expanded( - child: ListView( - padding: const EdgeInsets.symmetric(vertical: Space.xs), - children: [ - _Item( - icon: Icons.person_outline_rounded, - label: l10n.menuProfile, - route: Routes.profileEdit, - ), - _Item( - icon: Icons.route_outlined, - label: l10n.menuTrips, - route: Routes.history, - ), - if (Features.wallet && context.tenantHas('wallet')) - _Item( - icon: Icons.account_balance_wallet_outlined, - label: isDriver ? l10n.menuEarnings : l10n.menuWallet, - route: Routes.wallet, - ), - if (Features.coupons && context.tenantHas('coupons')) - _Item( - icon: Icons.card_giftcard_rounded, - label: l10n.menuRewards, - route: Routes.rewards, - ), - const Divider(indent: Space.md, endIndent: Space.md), - _Item( - icon: Icons.settings_outlined, - label: l10n.menuSettings, - route: Routes.settings, - ), - _Item( - icon: Icons.help_outline_rounded, - label: l10n.menuSupport, - route: Routes.support, - ), - // مداخل محليّة بلا نقطة خادم — تُنفَّذ في الجهاز مباشرة. - // - // الروابط من `StoreLinks` لا من ثابتٍ واحد: هذا البناء - // يشارك **رابط نفسه** (سائق يشارك رابط السائق)، ويفتح - // متجر منصّته هو. - _Action( - icon: Icons.share_outlined, - label: l10n.menuShare, - onTap: () => SharePlus.instance.share( - ShareParams( - text: l10n.shareMessagePlain(StoreLinks.thisApp), - ), - ), - ), - _Action( - icon: Icons.star_outline_rounded, - label: l10n.menuRateApp, - onTap: () => _open(StoreLinks.thisApp), - ), - _Action( - icon: Icons.shield_outlined, - label: l10n.menuPrivacy, - onTap: () => _open(BuildConfig.privacyUrl), - ), - // كان `if (!isDriver)` — وهذا البناء سائق دائماً، فالمدخل - // لم يكن يظهر أبداً. الطرف الآخر يُحسب لا يُخفى. - _Action( - icon: isDriver - ? Icons.person_outline_rounded - : Icons.local_taxi_outlined, - label: isDriver ? l10n.menuRiderApp : l10n.menuDriverApp, - onTap: () => _open(StoreLinks.otherApp), - ), - ], - ), - ), - const Divider(height: 1), - ListTile( - leading: Icon( - Icons.logout_rounded, - color: context.tripzColors.danger, - ), - title: Text( - l10n.menuLogout, - style: TextStyle(color: context.tripzColors.danger), - ), - onTap: () => _confirmLogout(context), - ), - ], - ), - ), - ); - } - - static Future _open(String url) async { - final uri = Uri.tryParse(url); - if (uri == null) return; - // فشل الفتح لا يُسقط شيئاً — رابط خارجي ليس جزءاً من التطبيق. - await launchUrl(uri, mode: LaunchMode.externalApplication); - } - - Future _confirmLogout(BuildContext context) async { - final l10n = context.l10n; - final session = context.read(); - final ok = await showDialog( - context: context, - builder: (context) => AlertDialog( - content: Text(l10n.menuLogoutConfirm), - actions: [ - TextButton( - onPressed: () => Navigator.of(context).pop(false), - child: Text(l10n.actionCancel), - ), - TextButton( - onPressed: () => Navigator.of(context).pop(true), - child: Text(l10n.menuLogout), - ), - ], - ), - ); - // الخروج يمرّ بالجلسة وحدها؛ الراوتر يعيد التوجيه من تلقائه. - if (ok == true) await session.logout(); - } -} - -class _Header extends StatelessWidget { - const _Header(); - - @override - Widget build(BuildContext context) { - return BlocBuilder( - builder: (context, session) { - final user = session.user; - return Padding( - padding: Space.page, - child: Row( - children: [ - CircleAvatar( - radius: 26, - backgroundColor: context.colors.primaryContainer, - child: Icon( - Icons.person_rounded, - color: context.colors.onPrimaryContainer, - ), - ), - const SizedBox(width: Space.sm), - Expanded( - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Text( - user?.name ?? BuildConfig.appName, - style: context.texts.titleMedium, - overflow: TextOverflow.ellipsis, - ), - Text( - user?.phone ?? '', - textDirection: TextDirection.ltr, - style: context.texts.bodySmall?.copyWith( - color: context.colors.onSurfaceVariant, - ), - ), - ], - ), - ), - ], - ), - ); - }, - ); - } -} - -/// مدخل ينفّذ فعلاً محلياً (مشاركة · رابط خارجي) لا تنقّلاً. -class _Action extends StatelessWidget { - const _Action({ - required this.icon, - required this.label, - required this.onTap, - }); - - final IconData icon; - final String label; - final VoidCallback onTap; - - @override - Widget build(BuildContext context) { - return ListTile( - leading: Icon(icon), - title: Text(label), - onTap: () { - Navigator.of(context).pop(); - onTap(); - }, - ); - } -} - -class _Item extends StatelessWidget { - const _Item({required this.icon, required this.label, required this.route}); - - final IconData icon; - final String label; - final String route; - - @override - Widget build(BuildContext context) { - return ListTile( - leading: Icon(icon), - title: Text(label), - onTap: () { - Navigator.of(context).pop(); - context.push(route); - }, - ); - } -} diff --git a/apps/driver_new/lib/core/ui/channel_picker.dart b/apps/driver_new/lib/core/ui/channel_picker.dart deleted file mode 100644 index a17a570..0000000 --- a/apps/driver_new/lib/core/ui/channel_picker.dart +++ /dev/null @@ -1,48 +0,0 @@ -import 'package:flutter/material.dart'; - -import '../design/tokens.dart'; -import '../design/tripz_colors.dart'; -import '../payments/payment_channels.dart'; - -/// اختيار قناة الدفع/السحب. القائمة تأتي من حزمة دولة المستأجر، فلا يرى -/// الأردنيُّ «شام كاش» ولا السوريُّ «كليك». -class ChannelPicker extends StatelessWidget { - const ChannelPicker({ - super.key, - required this.channels, - required this.selected, - required this.onSelect, - }); - - final List channels; - final PaymentChannel? selected; - final ValueChanged onSelect; - - @override - Widget build(BuildContext context) { - if (channels.isEmpty) return const SizedBox.shrink(); - final lang = Localizations.localeOf(context).languageCode; - - return Wrap( - spacing: Space.xs, - runSpacing: Space.xs, - children: [ - for (final channel in channels) - ChoiceChip( - selected: channel == selected, - onSelected: (_) => onSelect(channel), - avatar: Icon(_iconOf(channel), size: Sizes.iconSm), - label: Text(channel.nameFor(lang)), - labelStyle: context.texts.labelLarge, - ), - ], - ); - } - - static IconData _iconOf(PaymentChannel channel) => switch (channel) { - PaymentChannel.cash => Icons.payments_outlined, - PaymentChannel.cliq => Icons.account_balance_outlined, - PaymentChannel.paymob => Icons.credit_card_outlined, - _ => Icons.smartphone_outlined, - }; -} diff --git a/apps/driver_new/lib/core/ui/empty_view.dart b/apps/driver_new/lib/core/ui/empty_view.dart deleted file mode 100644 index bae9cdb..0000000 --- a/apps/driver_new/lib/core/ui/empty_view.dart +++ /dev/null @@ -1,54 +0,0 @@ -import 'package:flutter/material.dart'; - -import '../design/tokens.dart'; -import '../design/tripz_colors.dart'; -import '../l10n/l10n.dart'; -import 'tripz_button.dart'; - -/// حالة الفراغ: رسالة **تدلّ على الفعل التالي** لا مجرّد «لا يوجد» -/// (docs/26 §8.4). -class EmptyView extends StatelessWidget { - const EmptyView({ - super.key, - this.icon = Icons.inbox_rounded, - this.message, - this.actionLabel, - this.onAction, - }); - - final IconData icon; - final String? message; - final String? actionLabel; - final VoidCallback? onAction; - - @override - Widget build(BuildContext context) { - return Center( - child: Padding( - padding: Space.page, - child: Column( - mainAxisSize: MainAxisSize.min, - children: [ - Icon( - icon, - size: Sizes.iconLg, - color: context.colors.onSurfaceVariant, - ), - const SizedBox(height: Space.md), - Text( - message ?? context.l10n.emptyDefault, - textAlign: TextAlign.center, - style: context.texts.bodyMedium?.copyWith( - color: context.colors.onSurfaceVariant, - ), - ), - if (onAction != null && actionLabel != null) ...[ - const SizedBox(height: Space.lg), - TripzButton.secondary(label: actionLabel!, onPressed: onAction), - ], - ], - ), - ), - ); - } -} diff --git a/apps/driver_new/lib/core/ui/error_view.dart b/apps/driver_new/lib/core/ui/error_view.dart deleted file mode 100644 index 0e0eb7c..0000000 --- a/apps/driver_new/lib/core/ui/error_view.dart +++ /dev/null @@ -1,47 +0,0 @@ -import 'package:flutter/material.dart'; - -import '../design/tokens.dart'; -import '../design/tripz_colors.dart'; -import '../l10n/l10n.dart'; -import 'tripz_button.dart'; - -/// حالة الخطأ: رسالة **بالعربية** مع «أعد المحاولة» — لا شاشة صامتة -/// (docs/26 §8.4). الرسالة تأتي جاهزة من الـCubit (docs/23 §3). -class ErrorView extends StatelessWidget { - const ErrorView({super.key, this.message, this.onRetry}); - - final String? message; - final VoidCallback? onRetry; - - @override - Widget build(BuildContext context) { - return Center( - child: Padding( - padding: Space.page, - child: Column( - mainAxisSize: MainAxisSize.min, - children: [ - Icon( - Icons.error_outline_rounded, - size: Sizes.iconLg, - color: context.tripzColors.danger, - ), - const SizedBox(height: Space.md), - Text( - message ?? context.l10n.errorGeneric, - textAlign: TextAlign.center, - style: context.texts.bodyMedium, - ), - if (onRetry != null) ...[ - const SizedBox(height: Space.lg), - TripzButton.secondary( - label: context.l10n.actionRetry, - onPressed: onRetry, - ), - ], - ], - ), - ), - ); - } -} diff --git a/apps/driver_new/lib/core/ui/failure_text.dart b/apps/driver_new/lib/core/ui/failure_text.dart deleted file mode 100644 index 50e14d1..0000000 --- a/apps/driver_new/lib/core/ui/failure_text.dart +++ /dev/null @@ -1,61 +0,0 @@ -import 'package:flutter/material.dart'; - -import '../../features/auth/cubit/phone_error.dart'; -import '../api/api_failure.dart'; -import '../design/tokens.dart'; -import '../design/tripz_colors.dart'; -import '../l10n/l10n.dart'; - -/// النقطة **الوحيدة** التي تُترجَم فيها رموز الفشل إلى نصّ. -/// الشاشات لا تكتب رسائل خطأ، والـCubit لا يعرف اللغة (راجع `auth_failure.dart`). -class ApiFailureText extends StatelessWidget { - const ApiFailureText({super.key, required this.failure}); - - final ApiFailure failure; - - static String messageOf(BuildContext context, ApiFailure failure) { - final l10n = context.l10n; - return switch (failure) { - ApiFailure.invalidCode => l10n.otpErrInvalid, - ApiFailure.tooManyAttempts => l10n.otpErrTooManyAttempts, - ApiFailure.rateLimited => l10n.otpErrRateLimited, - ApiFailure.network => l10n.errorNetwork, - ApiFailure.timeout => l10n.errorTimeout, - ApiFailure.server => l10n.errorGeneric, - }; - } - - static String phoneMessageOf(BuildContext context, PhoneError error) { - final l10n = context.l10n; - return switch (error) { - PhoneError.empty => l10n.phoneErrEmpty, - PhoneError.leadingZero => l10n.phoneErrLeadingZero, - PhoneError.tooShort => l10n.phoneErrShort, - }; - } - - @override - Widget build(BuildContext context) { - return Padding( - padding: const EdgeInsets.only(top: Space.sm), - child: Row( - children: [ - Icon( - Icons.error_outline_rounded, - size: Sizes.iconSm, - color: context.tripzColors.danger, - ), - const SizedBox(width: Space.xs), - Expanded( - child: Text( - messageOf(context, failure), - style: context.texts.bodySmall?.copyWith( - color: context.tripzColors.danger, - ), - ), - ), - ], - ), - ); - } -} diff --git a/apps/driver_new/lib/core/ui/form_header.dart b/apps/driver_new/lib/core/ui/form_header.dart deleted file mode 100644 index 5f4ae60..0000000 --- a/apps/driver_new/lib/core/ui/form_header.dart +++ /dev/null @@ -1,49 +0,0 @@ -import 'package:flutter/material.dart'; - -import '../design/tokens.dart'; -import '../design/tripz_colors.dart'; - -/// ترويسة موحّدة لشاشات الدخول: أيقونة ثم عنوان ثم سطر شارح. -/// «الشاشة مهمة واحدة» — سؤال واحد وزر أساسي واحد أسفلها (docs/26 §8.1). -class FormHeader extends StatelessWidget { - const FormHeader({ - super.key, - required this.icon, - required this.title, - required this.lead, - }); - - final IconData icon; - final String title; - final String lead; - - @override - Widget build(BuildContext context) { - return Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Container( - padding: const EdgeInsets.all(Space.sm), - decoration: BoxDecoration( - color: context.colors.primaryContainer, - borderRadius: Radii.card_, - ), - child: Icon( - icon, - size: Sizes.icon, - color: context.colors.onPrimaryContainer, - ), - ), - const SizedBox(height: Space.md), - Text(title, style: context.texts.headlineSmall), - const SizedBox(height: Space.xs), - Text( - lead, - style: context.texts.bodyMedium?.copyWith( - color: context.colors.onSurfaceVariant, - ), - ), - ], - ); - } -} diff --git a/apps/driver_new/lib/core/ui/phone_field.dart b/apps/driver_new/lib/core/ui/phone_field.dart deleted file mode 100644 index 95e0024..0000000 --- a/apps/driver_new/lib/core/ui/phone_field.dart +++ /dev/null @@ -1,141 +0,0 @@ -import 'package:flutter/material.dart'; -import 'package:flutter/services.dart'; - -import '../design/tokens.dart'; -import '../design/tripz_colors.dart'; -import '../design/typography.dart'; -import '../payments/country_codes.dart'; - -/// حقل الهاتف بمفتاح دولة — النمط المجرَّب في سيرو. -/// -/// المفتاح يُختار من ورقة سفلية لا من قائمة منسدلة: الأصابع على الهاتف -/// أدقّ مع أهداف كبيرة، والقائمة أربع دول لا مئتان. -/// -/// يُخرج الرقم **كاملاً بالمفتاح بلا `+`** (`962790000001`) — وهو ما يقبله -/// الخادم ويطبّعه (docs/38 §2). -class PhoneField extends StatelessWidget { - const PhoneField({ - super.key, - required this.controller, - required this.country, - required this.onCountryChanged, - this.label, - this.hint, - this.errorText, - this.enabled = true, - this.onSubmitted, - }); - - final TextEditingController controller; - final CountryCode country; - final ValueChanged onCountryChanged; - final String? label; - final String? hint; - final String? errorText; - final bool enabled; - final ValueChanged? onSubmitted; - - @override - Widget build(BuildContext context) { - return TextField( - controller: controller, - enabled: enabled, - autofocus: true, - keyboardType: TextInputType.phone, - textInputAction: TextInputAction.done, - onSubmitted: onSubmitted, - maxLength: country.nationalLength + 1, - inputFormatters: [FilteringTextInputFormatter.digitsOnly], - autofillHints: const [AutofillHints.telephoneNumber], - style: numericStyle(context.texts.bodyLarge), - // الرقم يُقرأ يساراً-ليميناً حتى في واجهة عربية. - textDirection: TextDirection.ltr, - decoration: InputDecoration( - labelText: label, - hintText: hint, - errorText: errorText, - counterText: '', - prefixIcon: _DialPrefix( - country: country, - enabled: enabled, - onTap: () => _pickCountry(context), - ), - prefixIconConstraints: const BoxConstraints(minWidth: 0), - ), - ); - } - - Future _pickCountry(BuildContext context) async { - final lang = Localizations.localeOf(context).languageCode; - final picked = await showModalBottomSheet( - context: context, - builder: (context) => SafeArea( - child: Column( - mainAxisSize: MainAxisSize.min, - children: [ - for (final c in CountryCode.values) - ListTile( - leading: Text(c.flag, style: const TextStyle(fontSize: 24)), - title: Text(c.nameFor(lang)), - trailing: Text( - '+${c.dial}', - textDirection: TextDirection.ltr, - style: numericStyle(context.texts.bodyMedium), - ), - selected: c == country, - onTap: () => Navigator.of(context).pop(c), - ), - ], - ), - ), - ); - if (picked != null) onCountryChanged(picked); - } -} - -class _DialPrefix extends StatelessWidget { - const _DialPrefix({ - required this.country, - required this.enabled, - required this.onTap, - }); - - final CountryCode country; - final bool enabled; - final VoidCallback onTap; - - @override - Widget build(BuildContext context) { - return InkWell( - onTap: enabled ? onTap : null, - borderRadius: Radii.field_, - child: Padding( - padding: const EdgeInsets.symmetric(horizontal: Space.sm), - child: Row( - mainAxisSize: MainAxisSize.min, - textDirection: TextDirection.ltr, - children: [ - Text(country.flag, style: const TextStyle(fontSize: 20)), - const SizedBox(width: Space.xxs), - Text( - '+${country.dial}', - style: numericStyle(context.texts.bodyLarge), - ), - Icon( - Icons.arrow_drop_down_rounded, - color: context.colors.onSurfaceVariant, - ), - const SizedBox(width: Space.xxs), - SizedBox( - height: 24, - child: VerticalDivider( - width: 1, - color: context.colors.outlineVariant, - ), - ), - ], - ), - ), - ); - } -} diff --git a/apps/driver_new/lib/core/ui/skeleton.dart b/apps/driver_new/lib/core/ui/skeleton.dart deleted file mode 100644 index 9c5fddb..0000000 --- a/apps/driver_new/lib/core/ui/skeleton.dart +++ /dev/null @@ -1,83 +0,0 @@ -import 'package:flutter/material.dart'; - -import '../design/tokens.dart'; -import '../design/tripz_colors.dart'; - -/// هيكل تحميل — **لا spinner فارغ** (docs/26 §8.4). -/// -/// النبض `AnimatedBuilder` على `Opacity` وحدها: لا يُعاد بناء الشجرة تحته، -/// وهذا ما يفرق بين skeleton رخيص وآخر يأكل إطارات. -class Skeleton extends StatefulWidget { - const Skeleton({ - super.key, - this.width, - this.height = 16, - this.radius = Radii.field, - }); - - /// ثلاثة أسطر بأطوال متفاوتة — الشكل الافتراضي لأي قائمة تُحمَّل. - const Skeleton.lines({super.key}) - : width = null, - height = -1, - radius = Radii.field; - - final double? width; - final double height; - final double radius; - - @override - State createState() => _SkeletonState(); -} - -class _SkeletonState extends State - with SingleTickerProviderStateMixin { - late final AnimationController _controller = AnimationController( - vsync: this, - duration: const Duration(milliseconds: 900), - )..repeat(reverse: true); - - @override - void dispose() { - _controller.dispose(); - super.dispose(); - } - - @override - Widget build(BuildContext context) { - final color = context.tripzColors.skeleton; - - final child = widget.height < 0 - ? Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - _bar(color, double.infinity), - const SizedBox(height: Space.sm), - _bar(color, 220), - const SizedBox(height: Space.sm), - _bar(color, 140), - ], - ) - : _bar(color, widget.width ?? double.infinity, widget.height); - - // تُحترم إعدادات تقليل الحركة في النظام (docs/26 §8.5). - if (MediaQuery.disableAnimationsOf(context)) return child; - - return AnimatedBuilder( - animation: _controller, - builder: (_, inner) => Opacity( - opacity: 0.45 + (_controller.value * 0.35), - child: inner, - ), - child: child, - ); - } - - Widget _bar(Color color, double width, [double height = 16]) => Container( - width: width, - height: height, - decoration: BoxDecoration( - color: color, - borderRadius: BorderRadius.circular(widget.radius), - ), - ); -} diff --git a/apps/driver_new/lib/core/ui/status_banner.dart b/apps/driver_new/lib/core/ui/status_banner.dart deleted file mode 100644 index b2e3c9d..0000000 --- a/apps/driver_new/lib/core/ui/status_banner.dart +++ /dev/null @@ -1,56 +0,0 @@ -import 'package:flutter/material.dart'; - -import '../design/tokens.dart'; -import '../design/tripz_colors.dart'; - -enum BannerTone { info, success, warning, danger } - -/// شريط الحالة الحيّ (docs/26 §7) — حالة الرحلة، تحذير الرصيد، انقطاع الشبكة. -/// اللون من الأدوار الدلالية لا من hex. -class StatusBanner extends StatelessWidget { - const StatusBanner({ - super.key, - required this.message, - this.tone = BannerTone.info, - this.icon, - this.trailing, - }); - - final String message; - final BannerTone tone; - final IconData? icon; - final Widget? trailing; - - @override - Widget build(BuildContext context) { - final c = context.tripzColors; - final color = switch (tone) { - BannerTone.info => c.info, - BannerTone.success => c.success, - BannerTone.warning => c.warning, - BannerTone.danger => c.danger, - }; - - return Container( - padding: const EdgeInsets.symmetric( - horizontal: Space.sm, - vertical: Space.xs, - ), - decoration: BoxDecoration( - color: color.withValues(alpha: 0.12), - borderRadius: Radii.field_, - border: Border.all(color: color.withValues(alpha: 0.35)), - ), - child: Row( - children: [ - Icon(icon ?? Icons.info_outline_rounded, size: Sizes.iconSm, color: color), - const SizedBox(width: Space.xs), - Expanded( - child: Text(message, style: context.texts.bodySmall), - ), - ?trailing, - ], - ), - ); - } -} diff --git a/apps/driver_new/lib/core/ui/tripz_button.dart b/apps/driver_new/lib/core/ui/tripz_button.dart deleted file mode 100644 index 76e4bf2..0000000 --- a/apps/driver_new/lib/core/ui/tripz_button.dart +++ /dev/null @@ -1,114 +0,0 @@ -import 'package:flutter/material.dart'; - -import '../design/tokens.dart'; - -enum _ButtonKind { primary, secondary, text } - -/// الزر الموحّد (docs/26 §7). ارتفاع 52، وحالة تحميل **داخلية**: الشاشة -/// تمرّر `loading: true` ولا تستبدل الزر بمؤشّر — فلا يقفز التخطيط. -class TripzButton extends StatelessWidget { - const TripzButton.primary({ - super.key, - required this.label, - this.onPressed, - this.loading = false, - this.icon, - this.expanded = true, - }) : _kind = _ButtonKind.primary; - - const TripzButton.secondary({ - super.key, - required this.label, - this.onPressed, - this.loading = false, - this.icon, - this.expanded = false, - }) : _kind = _ButtonKind.secondary; - - const TripzButton.text({ - super.key, - required this.label, - this.onPressed, - this.loading = false, - this.icon, - this.expanded = false, - }) : _kind = _ButtonKind.text; - - final String label; - final VoidCallback? onPressed; - final bool loading; - final IconData? icon; - final bool expanded; - final _ButtonKind _kind; - - @override - Widget build(BuildContext context) { - // أثناء التحميل يُعطَّل الزر — يمنع الإرسال المزدوج بلا حارس في كل شاشة. - final onTap = loading ? null : onPressed; - final child = _Content(label: label, icon: icon, loading: loading); - - final button = switch (_kind) { - _ButtonKind.primary => FilledButton( - onPressed: onTap, - style: _style(context), - child: child, - ), - _ButtonKind.secondary => OutlinedButton( - onPressed: onTap, - style: _style(context), - child: child, - ), - _ButtonKind.text => TextButton( - onPressed: onTap, - style: _style(context), - child: child, - ), - }; - - if (!expanded) return button; - return SizedBox(width: double.infinity, child: button); - } - - ButtonStyle _style(BuildContext context) => ButtonStyle( - minimumSize: const WidgetStatePropertyAll( - Size(0, Sizes.control), - ), - shape: const WidgetStatePropertyAll( - RoundedRectangleBorder(borderRadius: Radii.card_), - ), - padding: const WidgetStatePropertyAll( - EdgeInsets.symmetric(horizontal: Space.lg), - ), - textStyle: WidgetStatePropertyAll( - Theme.of(context).textTheme.labelLarge, - ), - ); -} - -class _Content extends StatelessWidget { - const _Content({required this.label, this.icon, required this.loading}); - - final String label; - final IconData? icon; - final bool loading; - - @override - Widget build(BuildContext context) { - if (loading) { - return const SizedBox( - width: Sizes.iconSm, - height: Sizes.iconSm, - child: CircularProgressIndicator(strokeWidth: 2.2), - ); - } - if (icon == null) return Text(label); - return Row( - mainAxisSize: MainAxisSize.min, - children: [ - Icon(icon, size: Sizes.iconSm), - const SizedBox(width: Space.xs), - Text(label), - ], - ); - } -} diff --git a/apps/driver_new/lib/core/ui/tripz_card.dart b/apps/driver_new/lib/core/ui/tripz_card.dart deleted file mode 100644 index 9bf35ca..0000000 --- a/apps/driver_new/lib/core/ui/tripz_card.dart +++ /dev/null @@ -1,29 +0,0 @@ -import 'package:flutter/material.dart'; - -import '../design/tokens.dart'; - -/// بطاقة موحّدة (docs/26 §7): الرحلة · السائق · المحفظة. -/// الحدّ لا الظل — «الوضوح قبل الزينة» (docs/26 §8.2). -class TripzCard extends StatelessWidget { - const TripzCard({ - super.key, - required this.child, - this.onTap, - this.padding = Space.page, - }); - - final Widget child; - final VoidCallback? onTap; - final EdgeInsets padding; - - @override - Widget build(BuildContext context) { - final content = Padding(padding: padding, child: child); - return Card( - clipBehavior: Clip.antiAlias, - child: onTap == null - ? content - : InkWell(onTap: onTap, child: content), - ); - } -} diff --git a/apps/driver_new/lib/core/ui/tripz_otp_field.dart b/apps/driver_new/lib/core/ui/tripz_otp_field.dart deleted file mode 100644 index 0779f88..0000000 --- a/apps/driver_new/lib/core/ui/tripz_otp_field.dart +++ /dev/null @@ -1,131 +0,0 @@ -import 'package:flutter/material.dart'; -import 'package:flutter/services.dart'; - -import '../design/tokens.dart'; -import '../design/typography.dart'; - -/// حقل رمز التحقّق — أربع خانات (طول رمز تريبز، docs/38 §2). -/// -/// حقل حقيقي واحد تحت خانات معروضة: يُبقي اللصق والإكمال التلقائي من الرسالة -/// (`AutofillHints.oneTimeCode`) يعملان — وهو ما يكسره تقسيمُه إلى أربعة -/// حقول منفصلة. يُستدعى [onCompleted] عند اكتمال الطول. -class TripzOtpField extends StatefulWidget { - const TripzOtpField({ - super.key, - required this.controller, - this.length = 4, - this.onCompleted, - this.enabled = true, - this.hasError = false, - }); - - final TextEditingController controller; - final int length; - final ValueChanged? onCompleted; - final bool enabled; - final bool hasError; - - @override - State createState() => _TripzOtpFieldState(); -} - -class _TripzOtpFieldState extends State { - final _focus = FocusNode(); - - @override - void dispose() { - _focus.dispose(); - super.dispose(); - } - - @override - Widget build(BuildContext context) { - return Stack( - alignment: Alignment.center, - children: [ - // الحقل الفعلي — شفّاف بلا حجم بصري، يستقبل الكيبورد واللصق. - SizedBox( - height: Sizes.control, - child: Opacity( - opacity: 0, - child: TextField( - controller: widget.controller, - focusNode: _focus, - enabled: widget.enabled, - autofocus: true, - keyboardType: TextInputType.number, - maxLength: widget.length, - inputFormatters: [FilteringTextInputFormatter.digitsOnly], - autofillHints: const [AutofillHints.oneTimeCode], - onChanged: (v) { - if (v.length == widget.length) widget.onCompleted?.call(v); - }, - ), - ), - ), - GestureDetector( - onTap: () => _focus.requestFocus(), - behavior: HitTestBehavior.opaque, - child: ValueListenableBuilder( - valueListenable: widget.controller, - builder: (context, value, _) => Row( - mainAxisAlignment: MainAxisAlignment.center, - textDirection: TextDirection.ltr, - children: List.generate(widget.length, (i) { - return Padding( - padding: const EdgeInsets.symmetric(horizontal: Space.xxs), - child: _Box( - char: i < value.text.length ? value.text[i] : null, - focused: _focus.hasFocus && i == value.text.length, - hasError: widget.hasError, - ), - ); - }), - ), - ), - ), - ], - ); - } -} - -class _Box extends StatelessWidget { - const _Box({ - required this.char, - required this.focused, - required this.hasError, - }); - - final String? char; - final bool focused; - final bool hasError; - - @override - Widget build(BuildContext context) { - final scheme = Theme.of(context).colorScheme; - final borderColor = hasError - ? scheme.error - : focused - ? scheme.primary - : scheme.outlineVariant; - - return AnimatedContainer( - duration: Motion.tap, - curve: Motion.curve, - width: 56, - height: Sizes.control, - alignment: Alignment.center, - decoration: BoxDecoration( - borderRadius: Radii.field_, - border: Border.all( - color: borderColor, - width: focused || hasError ? 1.5 : 1, - ), - ), - child: Text( - char ?? '', - style: numericStyle(Theme.of(context).textTheme.headlineSmall), - ), - ); - } -} diff --git a/apps/driver_new/lib/core/ui/tripz_scaffold.dart b/apps/driver_new/lib/core/ui/tripz_scaffold.dart deleted file mode 100644 index 8e5fdcf..0000000 --- a/apps/driver_new/lib/core/ui/tripz_scaffold.dart +++ /dev/null @@ -1,130 +0,0 @@ -import 'package:flutter/material.dart'; - -import '../design/tokens.dart'; -import 'empty_view.dart'; -import 'error_view.dart'; -import 'skeleton.dart'; -import 'view_status.dart'; - -/// نقطة التنظيم المركزية (docs/26 §6). **ممنوع `Scaffold` خام في -/// `features/`.** -/// -/// هو ما يحوّل `status` القادم من الـCubit إلى skeleton/خطأ/فراغ/محتوى — فلا -/// تكتب أي شاشة `if (loading)`، وتغيير شكل «التحميل» في التطبيق كله يصير -/// سطراً واحداً هنا. -class TripzScaffold extends StatelessWidget { - const TripzScaffold({ - super.key, - required this.child, - this.title, - this.status = ViewStatus.success, - this.error, - this.onRetry, - this.empty, - this.loading, - this.bottomAction, - this.actions, - this.leading, - this.showAppBar = true, - this.padded = true, - this.resizeToAvoidBottomInset = true, - }); - - /// المحتوى — يُبنى **عند النجاح فقط**. - final Widget child; - - final String? title; - final ViewStatus status; - - /// رسالة الخطأ كما أصدرها الـCubit، بلا إعادة صياغة في الواجهة. - final String? error; - final VoidCallback? onRetry; - - /// شكل الفراغ الخاص بالشاشة — وإلا فالافتراضي. - final Widget? empty; - - /// شكل التحميل الخاص بالشاشة — وإلا فهيكل ثلاثة أسطر. - final Widget? loading; - - /// خانة الـCTA السفلية: ترتفع فوق الكيبورد، وتحترم المنطقة الآمنة. - final Widget? bottomAction; - - final List? actions; - final Widget? leading; - final bool showAppBar; - final bool padded; - final bool resizeToAvoidBottomInset; - - @override - Widget build(BuildContext context) { - return Scaffold( - resizeToAvoidBottomInset: resizeToAvoidBottomInset, - appBar: !showAppBar - ? null - : AppBar( - title: title == null ? null : Text(title!), - actions: actions, - leading: leading, - ), - body: SafeArea( - top: !showAppBar, - child: Padding( - padding: padded ? Space.page : EdgeInsets.zero, - child: _Body( - status: status, - error: error, - onRetry: onRetry, - empty: empty, - loading: loading, - child: child, - ), - ), - ), - bottomNavigationBar: bottomAction == null - ? null - : SafeArea( - top: false, - child: Padding( - // ‏viewInsets يرفع الـCTA فوق الكيبورد بدل أن يختفي تحته. - padding: EdgeInsets.fromLTRB( - Space.md, - Space.xs, - Space.md, - Space.md + MediaQuery.viewInsetsOf(context).bottom, - ), - child: bottomAction, - ), - ), - ); - } -} - -class _Body extends StatelessWidget { - const _Body({ - required this.status, - required this.error, - required this.onRetry, - required this.empty, - required this.loading, - required this.child, - }); - - final ViewStatus status; - final String? error; - final VoidCallback? onRetry; - final Widget? empty; - final Widget? loading; - final Widget child; - - @override - Widget build(BuildContext context) { - return switch (status) { - ViewStatus.idle || - ViewStatus.loading => - loading ?? const Skeleton.lines(), - ViewStatus.error => ErrorView(message: error, onRetry: onRetry), - ViewStatus.empty => empty ?? const EmptyView(), - ViewStatus.success => child, - }; - } -} diff --git a/apps/driver_new/lib/core/ui/tripz_sheet.dart b/apps/driver_new/lib/core/ui/tripz_sheet.dart deleted file mode 100644 index 331e8bb..0000000 --- a/apps/driver_new/lib/core/ui/tripz_sheet.dart +++ /dev/null @@ -1,71 +0,0 @@ -import 'package:flutter/material.dart'; - -import '../design/tokens.dart'; - -/// الورقة السفلية — **الحوار الافتراضي في التطبيق sheet لا dialog** -/// (docs/26 §7). المقبض والزوايا من الثيم، فلا تُعاد كتابتهما في كل نداء. -class TripzSheet extends StatelessWidget { - const TripzSheet({ - super.key, - required this.child, - this.title, - this.bottomAction, - }); - - final Widget child; - final String? title; - final Widget? bottomAction; - - /// [dismissible] = false للحالات التي لا تُغلق بالسحب — مثل شاشة البحث عن - /// سائق: تُغلق بزر الإلغاء وحده كي لا يزيحها المستخدم بالخطأ (docs/39 §3). - static Future show( - BuildContext context, { - required Widget child, - String? title, - Widget? bottomAction, - bool dismissible = true, - }) { - return showModalBottomSheet( - context: context, - isScrollControlled: true, - isDismissible: dismissible, - enableDrag: dismissible, - showDragHandle: dismissible, - builder: (_) => TripzSheet( - title: title, - bottomAction: bottomAction, - child: child, - ), - ); - } - - @override - Widget build(BuildContext context) { - return SafeArea( - top: false, - child: Padding( - padding: EdgeInsets.fromLTRB( - Space.md, - Space.xs, - Space.md, - Space.md + MediaQuery.viewInsetsOf(context).bottom, - ), - child: Column( - mainAxisSize: MainAxisSize.min, - crossAxisAlignment: CrossAxisAlignment.stretch, - children: [ - if (title != null) ...[ - Text(title!, style: Theme.of(context).textTheme.titleLarge), - const SizedBox(height: Space.md), - ], - Flexible(child: child), - if (bottomAction != null) ...[ - const SizedBox(height: Space.md), - bottomAction!, - ], - ], - ), - ), - ); - } -} diff --git a/apps/driver_new/lib/core/ui/tripz_text_field.dart b/apps/driver_new/lib/core/ui/tripz_text_field.dart deleted file mode 100644 index b0e0acb..0000000 --- a/apps/driver_new/lib/core/ui/tripz_text_field.dart +++ /dev/null @@ -1,109 +0,0 @@ -import 'package:flutter/material.dart'; -import 'package:flutter/services.dart'; - -import '../design/tokens.dart'; -import '../design/typography.dart'; - -/// حقل الإدخال الموحّد (docs/26 §7): نصّ · هاتف · بحث. -/// -/// رسالة الخطأ تحته بالعربية، والأرقام لاتينية tabular دائماً — رقم الهاتف -/// ورمز التحقّق لا «يرقصان» أثناء الكتابة. -class TripzTextField extends StatelessWidget { - const TripzTextField({ - super.key, - this.controller, - this.label, - this.hint, - this.errorText, - this.keyboardType, - this.textInputAction, - this.onChanged, - this.onSubmitted, - this.autofocus = false, - this.enabled = true, - this.maxLength, - this.prefixIcon, - this.suffix, - this.inputFormatters, - this.autofillHints, - this.numeric = false, - }); - - /// حقل هاتف: أرقام فقط، لوحة مفاتيح هاتف، إكمال تلقائي من النظام. - factory TripzTextField.phone({ - Key? key, - TextEditingController? controller, - String? label, - String? hint, - String? errorText, - ValueChanged? onChanged, - ValueChanged? onSubmitted, - bool enabled = true, - }) { - return TripzTextField( - key: key, - controller: controller, - label: label, - hint: hint, - errorText: errorText, - enabled: enabled, - numeric: true, - autofocus: true, - keyboardType: TextInputType.phone, - textInputAction: TextInputAction.done, - onChanged: onChanged, - onSubmitted: onSubmitted, - maxLength: 15, - prefixIcon: Icons.phone_outlined, - inputFormatters: [FilteringTextInputFormatter.digitsOnly], - autofillHints: const [AutofillHints.telephoneNumber], - ); - } - - final TextEditingController? controller; - final String? label; - final String? hint; - final String? errorText; - final TextInputType? keyboardType; - final TextInputAction? textInputAction; - final ValueChanged? onChanged; - final ValueChanged? onSubmitted; - final bool autofocus; - final bool enabled; - final int? maxLength; - final IconData? prefixIcon; - final Widget? suffix; - final List? inputFormatters; - final Iterable? autofillHints; - final bool numeric; - - @override - Widget build(BuildContext context) { - final base = Theme.of(context).textTheme.bodyLarge; - return TextField( - controller: controller, - enabled: enabled, - autofocus: autofocus, - keyboardType: keyboardType, - textInputAction: textInputAction, - onChanged: onChanged, - onSubmitted: onSubmitted, - maxLength: maxLength, - inputFormatters: inputFormatters, - autofillHints: autofillHints, - style: numeric ? numericStyle(base) : base, - // الأرقام تُقرأ يساراً-ليميناً حتى في واجهة عربية. - textDirection: numeric ? TextDirection.ltr : null, - decoration: InputDecoration( - labelText: label, - hintText: hint, - errorText: errorText, - counterText: '', - prefixIcon: prefixIcon == null - ? null - : Icon(prefixIcon, size: Sizes.iconSm), - suffixIcon: suffix, - ), - ); - } -} diff --git a/apps/driver_new/lib/core/ui/view_status.dart b/apps/driver_new/lib/core/ui/view_status.dart deleted file mode 100644 index d94443c..0000000 --- a/apps/driver_new/lib/core/ui/view_status.dart +++ /dev/null @@ -1,22 +0,0 @@ -/// حالة العرض الموحّدة التي يُصدرها كل Cubit (docs/23 §3) ويستهلكها -/// `TripzScaffold` (docs/26 §6). -/// -/// هذا ما يجعل نظام التصميم متوافقاً مع Cubit **بالبنية لا بالاتفاق**: -/// الشاشة لا تكتب `if (loading)` أبداً. -enum ViewStatus { - /// لم يبدأ شيء بعد — يُعرض كتحميل لأن المستخدم لا يفرّق. - idle, - loading, - success, - - /// نجح النداء ولا بيانات — يُعرض `EmptyView`. - empty, - error, -} - -extension ViewStatusX on ViewStatus { - bool get isLoading => this == ViewStatus.idle || this == ViewStatus.loading; - bool get isError => this == ViewStatus.error; - bool get isEmpty => this == ViewStatus.empty; - bool get isSuccess => this == ViewStatus.success; -} diff --git a/apps/driver_new/lib/features/auth/cubit/login_cubit.dart b/apps/driver_new/lib/features/auth/cubit/login_cubit.dart deleted file mode 100644 index 7ba625d..0000000 --- a/apps/driver_new/lib/features/auth/cubit/login_cubit.dart +++ /dev/null @@ -1,212 +0,0 @@ -import 'dart:async'; - -import 'package:flutter_bloc/flutter_bloc.dart'; -import 'package:geolocator/geolocator.dart'; -import 'package:permission_handler/permission_handler.dart'; -import 'package:shared_preferences/shared_preferences.dart'; - -import '../../../core/api/api_exception.dart'; -import '../../../core/api/api_failure.dart'; -import '../../../core/config.dart'; -import '../../../core/payments/country_codes.dart'; -import '../data/auth_repository.dart'; -import 'login_state.dart'; -import 'phone_error.dart'; - -/// تدفّق الدخول كاملاً: الشروط ← إذن الموقع ← الهاتف ← الرمز. -/// -/// الـCubit لا يعرف Flutter: لا `BuildContext` ولا تنقّل ولا `SnackBar` -/// (docs/23 §3). يُصدر حالة، والواجهة تتصرّف. -class LoginCubit extends Cubit { - LoginCubit(this._repo, this._prefs) : super(const LoginState()) { - _resolveInitialStep(); - } - - final AuthRepository _repo; - final SharedPreferences _prefs; - - static const _kAgreed = 'auth.agreed_terms'; - - Timer? _resendTimer; - - @override - Future close() { - _resendTimer?.cancel(); - return super.close(); - } - - // ── البوابتان ────────────────────────────────────────────────────────── - - void _resolveInitialStep() { - if (_prefs.getBool(_kAgreed) != true) { - emit(state.copyWith(step: LoginStep.agreement)); - return; - } - emit(state.copyWith(step: LoginStep.permission, agreed: true)); - unawaited(checkLocationPermission()); - } - - void toggleAgreement(bool value) => emit(state.copyWith(agreed: value)); - - Future acceptAgreement() async { - if (!state.agreed) return; - await _prefs.setBool(_kAgreed, true); - emit(state.copyWith(step: LoginStep.permission)); - await checkLocationPermission(); - } - - /// تُستدعى أيضاً عند **العودة من إعدادات النظام**: بلا إعادة الفحص تبقى - /// الشاشة عالقة بعد أن يمنح المستخدم الإذن يدوياً (حالة حافة من docs/39 §2). - Future checkLocationPermission() async { - final geoStatus = await Geolocator.checkPermission(); - if (geoStatus == LocationPermission.always || - geoStatus == LocationPermission.whileInUse) { - emit(state.copyWith( - step: LoginStep.phone, - permissionPermanentlyDenied: false, - )); - return; - } - - final status = await Permission.locationWhenInUse.status; - if (status.isGranted || status.isLimited) { - emit(state.copyWith( - step: LoginStep.phone, - permissionPermanentlyDenied: false, - )); - return; - } - - emit(state.copyWith( - permissionPermanentlyDenied: - geoStatus == LocationPermission.deniedForever || - status.isPermanentlyDenied, - )); - } - - Future requestLocationPermission() async { - final geoStatus = await Geolocator.requestPermission(); - if (geoStatus == LocationPermission.always || - geoStatus == LocationPermission.whileInUse) { - emit(state.copyWith( - step: LoginStep.phone, - permissionPermanentlyDenied: false, - )); - return; - } - - final status = await Permission.locationWhenInUse.request(); - if (status.isGranted || status.isLimited) { - emit(state.copyWith( - step: LoginStep.phone, - permissionPermanentlyDenied: false, - )); - return; - } - - emit(state.copyWith( - permissionPermanentlyDenied: - geoStatus == LocationPermission.deniedForever || - status.isPermanentlyDenied, - )); - } - - Future openSystemSettings() => openAppSettings(); - - // ── الهاتف ───────────────────────────────────────────────────────────── - - /// يُنادى عند الإقلاع بحزمة دولة المستأجر — فيرى الأردنيُّ الأردن أولاً. - void applyTenantCountry(String countryPack) { - if (state.phone.isNotEmpty) return; // لا نغيّر اختياراً واعياً للمستخدم - emit(state.copyWith(country: CountryCode.fromPack(countryPack))); - } - - void countryChanged(CountryCode country) => - emit(state.copyWith(country: country, clearPhoneError: true)); - - void phoneChanged(String value) { - emit(state.copyWith( - phone: value, - clearPhoneError: true, - clearFailure: true, - )); - } - - Future submitPhone() async { - final error = validatePhone(state.phone, state.country); - if (error != null) { - emit(state.copyWith(phoneError: error)); - return; - } - emit(state.copyWith(status: LoginStatus.submitting, clearFailure: true)); - try { - await _repo.sendOtp(state.e164); - emit(state.copyWith(status: LoginStatus.idle, step: LoginStep.otp)); - _startResendCountdown(); - } on ApiException catch (e) { - emit(state.copyWith( - status: LoginStatus.failure, - failure: e.toApiFailure(), - )); - } - } - - void editPhone() { - _resendTimer?.cancel(); - emit(state.copyWith( - step: LoginStep.phone, - status: LoginStatus.idle, - resendIn: 0, - clearFailure: true, - )); - } - - // ── الرمز ────────────────────────────────────────────────────────────── - - Future resendOtp() async { - if (!state.canResend) return; - emit(state.copyWith(status: LoginStatus.submitting, clearFailure: true)); - try { - await _repo.sendOtp(state.e164); - emit(state.copyWith(status: LoginStatus.idle)); - _startResendCountdown(); - } on ApiException catch (e) { - emit(state.copyWith( - status: LoginStatus.failure, - failure: e.toApiFailure(), - )); - // حتى عند الرفض بحدّ المعدّل نبدأ العدّاد — وإلا ضغط المستخدم مجدداً - // فوراً وعمّق الحظر. - _startResendCountdown(); - } - } - - Future submitOtp(String code) async { - if (code.length != AppConfig.otpLength) return; - emit(state.copyWith(status: LoginStatus.submitting, clearFailure: true)); - try { - final user = await _repo.verifyOtp(phone: state.e164, code: code); - _resendTimer?.cancel(); - emit(state.copyWith( - status: LoginStatus.success, - step: LoginStep.done, - user: user, - )); - } on ApiException catch (e) { - emit(state.copyWith( - status: LoginStatus.failure, - failure: e.toApiFailure(), - )); - } - } - - void _startResendCountdown() { - _resendTimer?.cancel(); - emit(state.copyWith(resendIn: AppConfig.otpResendCooldown.inSeconds)); - _resendTimer = Timer.periodic(const Duration(seconds: 1), (timer) { - final next = state.resendIn - 1; - if (next <= 0) timer.cancel(); - emit(state.copyWith(resendIn: next < 0 ? 0 : next)); - }); - } -} diff --git a/apps/driver_new/lib/features/auth/cubit/login_state.dart b/apps/driver_new/lib/features/auth/cubit/login_state.dart deleted file mode 100644 index b599375..0000000 --- a/apps/driver_new/lib/features/auth/cubit/login_state.dart +++ /dev/null @@ -1,99 +0,0 @@ -import 'package:equatable/equatable.dart'; - -import '../../../core/api/api_failure.dart'; -import '../../../core/payments/country_codes.dart'; -import '../../../core/session/app_user.dart'; -import 'phone_error.dart'; - -/// خطوات الدخول بالترتيب الميداني المثبت في سيرو (docs/39 §2): بوابتان -/// كاملتان **قبل** أي حقل إدخال، ثم الهاتف فالرمز. -enum LoginStep { agreement, permission, phone, otp, done } - -enum LoginStatus { idle, submitting, failure, success } - -class LoginState extends Equatable { - const LoginState({ - this.step = LoginStep.agreement, - this.status = LoginStatus.idle, - this.phone = '', - this.country = CountryCode.jordan, - this.agreed = false, - this.failure, - this.phoneError, - this.resendIn = 0, - this.permissionPermanentlyDenied = false, - this.user, - }); - - final LoginStep step; - final LoginStatus status; - - /// الرقم كما أدخله المستخدم — الخادم يطبّعه، فلا نطبّعه نحن (docs/38 §2). - final String phone; - - /// الدولة المختارة — تحدّد المفتاح الدولي وطول التحقّق. تُبدأ من - /// `countryPack` المستأجر لا من لغة الجهاز. - final CountryCode country; - - /// ما يُرسل للخادم: المفتاح + الرقم بلا `+` (`962790000001`). - String get e164 => '${country.dial}${phone.trim()}'; - - final bool agreed; - final ApiFailure? failure; - final PhoneError? phoneError; - - /// ثوانٍ متبقّية قبل السماح بإعادة الإرسال. الخادم يحدّ بثلاثة طلبات كل - /// خمس دقائق، فالعدّاد ليس تجميلاً (docs/39 §2). - final int resendIn; - - /// رُفض الإذن نهائياً — الحل الوحيد فتح إعدادات النظام. - final bool permissionPermanentlyDenied; - - final AppUser? user; - - bool get isSubmitting => status == LoginStatus.submitting; - bool get canResend => resendIn == 0 && !isSubmitting; - - LoginState copyWith({ - LoginStep? step, - LoginStatus? status, - String? phone, - CountryCode? country, - bool? agreed, - ApiFailure? failure, - PhoneError? phoneError, - int? resendIn, - bool? permissionPermanentlyDenied, - AppUser? user, - bool clearFailure = false, - bool clearPhoneError = false, - }) { - return LoginState( - step: step ?? this.step, - status: status ?? this.status, - phone: phone ?? this.phone, - country: country ?? this.country, - agreed: agreed ?? this.agreed, - failure: clearFailure ? null : (failure ?? this.failure), - phoneError: clearPhoneError ? null : (phoneError ?? this.phoneError), - resendIn: resendIn ?? this.resendIn, - permissionPermanentlyDenied: - permissionPermanentlyDenied ?? this.permissionPermanentlyDenied, - user: user ?? this.user, - ); - } - - @override - List get props => [ - step, - status, - phone, - country, - agreed, - failure, - phoneError, - resendIn, - permissionPermanentlyDenied, - user, - ]; -} diff --git a/apps/driver_new/lib/features/auth/cubit/phone_error.dart b/apps/driver_new/lib/features/auth/cubit/phone_error.dart deleted file mode 100644 index 70e754f..0000000 --- a/apps/driver_new/lib/features/auth/cubit/phone_error.dart +++ /dev/null @@ -1,15 +0,0 @@ -import '../../../core/payments/country_codes.dart'; - -/// أخطاء تحقّق **محليّة** لرقم الهاتف — تُكتشف قبل أي نداء شبكة. -/// الشروط الثلاثة منقولة من التحقّق المطبَّق ميدانياً في سيرو (docs/39 §2). -enum PhoneError { empty, leadingZero, tooShort } - -/// الطول المتوقّع من **الدولة المختارة** لا رقماً ثابتاً: الأردن وسوريا 9 -/// خانات، ومصر والعراق 10. -PhoneError? validatePhone(String raw, CountryCode country) { - final v = raw.trim(); - if (v.isEmpty) return PhoneError.empty; - if (v.startsWith('0')) return PhoneError.leadingZero; - if (v.length < country.nationalLength) return PhoneError.tooShort; - return null; -} diff --git a/apps/driver_new/lib/features/auth/data/auth_repository.dart b/apps/driver_new/lib/features/auth/data/auth_repository.dart deleted file mode 100644 index fc7473d..0000000 --- a/apps/driver_new/lib/features/auth/data/auth_repository.dart +++ /dev/null @@ -1,83 +0,0 @@ -import '../../../core/api/api_client.dart'; -import '../../../core/session/app_user.dart'; -import '../../../core/session/session_source.dart'; -import '../../../core/storage/token_store.dart'; - -/// كل نداءات المصادقة (docs/38 §2). الـCubit لا ينادي Dio مباشرة أبداً -/// (docs/23 §3). -class AuthRepository implements SessionSource { - AuthRepository(this._api, this._tokens); - - final ApiClient _api; - final TokenStore _tokens; - - /// حدّ الخادم: ثلاثة طلبات كل خمس دقائق — الواجهة تمنع الضغط المتكرر - /// بعدّاد تنازلي (docs/39 §2). - Future sendOtp(String phone) async { - await _api.post>( - '/auth/send-otp', - body: {'phone': phone}, - ); - } - - /// عند النجاح تُحفظ الرموز **قبل** أن يعود المستخدم — أي نداء تالٍ يجدها. - Future verifyOtp({ - required String phone, - required String code, - String? referralCode, - }) async { - final res = await _api.post>( - '/auth/verify-otp', - body: { - 'phone': phone, - 'code': code, - if (referralCode != null && referralCode.isNotEmpty) - 'referral_code': referralCode, - }, - ); - - await _tokens.save( - accessToken: res['access_token'] as String, - refreshToken: res['refresh_token'] as String, - // مفتاح توقيع الطلبات المالية (docs/38 §8) — يُخزَّن الآن ويُستهلك لاحقاً. - signingKey: res['signing_key'] as String?, - ); - - return AppUser.fromJson(res['user'] as Map); - } - - @override - Future me() async { - final res = await _api.get>('/users/me'); - return AppUser.fromJson(res); - } - - Future updateProfile({String? name, String? language}) async { - final res = await _api.patch>( - '/users/me', - body: { - 'name': ?name, - 'language': ?language, - }, - ); - return AppUser.fromJson(res); - } - - /// من عقد `SessionSource`: الجلسة تحتاج معرفة التقييم المعلّق، ولا يجوز - /// أن يستورد `core` ميزةَ التقييم — فتمرّ عبر الواجهة نفسها. - @override - Future<({String tripId, String role})?> pendingRating() async { - final res = await _api.get>('/trips/rating/pending'); - final pending = res['pending']; - if (pending is! Map) return null; - final tripId = pending['tripId'] as String?; - if (tripId == null) return null; - return (tripId: tripId, role: pending['role'] as String? ?? 'rider'); - } - - @override - Future logout() => _tokens.clear(); - - @override - bool get hasSession => _tokens.isLoggedIn; -} diff --git a/apps/driver_new/lib/features/auth/view/agreement_view.dart b/apps/driver_new/lib/features/auth/view/agreement_view.dart deleted file mode 100644 index 6750178..0000000 --- a/apps/driver_new/lib/features/auth/view/agreement_view.dart +++ /dev/null @@ -1,56 +0,0 @@ -import 'package:flutter/material.dart'; -import 'package:flutter_bloc/flutter_bloc.dart'; - -import '../../../core/design/tokens.dart'; -import '../../../core/design/tripz_colors.dart'; -import '../../../core/l10n/l10n.dart'; -import '../../../core/ui/form_header.dart'; -import '../../../core/ui/tripz_button.dart'; -import '../../../core/ui/tripz_scaffold.dart'; -import '../cubit/login_cubit.dart'; -import '../cubit/login_state.dart'; - -/// البوابة الأولى: شاشة كاملة لا حوار، وزر متابعة **معطّل حتى يُؤشَّر** -/// (docs/39 §2). تُحفظ الموافقة فلا تتكرر. -class AgreementView extends StatelessWidget { - const AgreementView({super.key}); - - @override - Widget build(BuildContext context) { - final l10n = context.l10n; - return BlocBuilder( - buildWhen: (p, n) => p.agreed != n.agreed, - builder: (context, state) { - final cubit = context.read(); - return TripzScaffold( - showAppBar: false, - bottomAction: TripzButton.primary( - label: l10n.agreementAccept, - onPressed: state.agreed ? cubit.acceptAgreement : null, - ), - child: ListView( - children: [ - const SizedBox(height: Space.xl), - FormHeader( - icon: Icons.policy_outlined, - title: l10n.agreementTitle, - lead: l10n.agreementLead, - ), - const SizedBox(height: Space.lg), - CheckboxListTile( - value: state.agreed, - onChanged: (v) => cubit.toggleAgreement(v ?? false), - contentPadding: EdgeInsets.zero, - controlAffinity: ListTileControlAffinity.leading, - title: Text( - l10n.agreementCheckbox, - style: context.texts.bodyMedium, - ), - ), - ], - ), - ); - }, - ); - } -} diff --git a/apps/driver_new/lib/features/auth/view/login_page.dart b/apps/driver_new/lib/features/auth/view/login_page.dart deleted file mode 100644 index 64c4c38..0000000 --- a/apps/driver_new/lib/features/auth/view/login_page.dart +++ /dev/null @@ -1,70 +0,0 @@ -import 'package:flutter/material.dart'; -import 'package:flutter_bloc/flutter_bloc.dart'; - -import '../../../core/di.dart'; -import '../../../core/session/session_cubit.dart'; -import '../cubit/login_cubit.dart'; -import '../cubit/login_state.dart'; -import 'agreement_view.dart'; -import 'otp_view.dart'; -import 'permission_view.dart'; -import 'phone_view.dart'; - -/// مضيف تدفّق الدخول: خطوة واحدة معروضة في كل لحظة، والانتقال بينها من -/// الـCubit لا من التنقّل — فلا يستطيع المستخدم الرجوع لخطوة تخطّاها. -class LoginPage extends StatefulWidget { - const LoginPage({super.key}); - - @override - State createState() => _LoginPageState(); -} - -class _LoginPageState extends State with WidgetsBindingObserver { - late final LoginCubit _cubit = sl(); - - @override - void initState() { - super.initState(); - WidgetsBinding.instance.addObserver(this); - } - - @override - void dispose() { - WidgetsBinding.instance.removeObserver(this); - _cubit.close(); - super.dispose(); - } - - @override - void didChangeAppLifecycleState(AppLifecycleState lifecycle) { - // العودة من إعدادات النظام بعد منح الإذن يدوياً — بلا هذا الفحص تبقى - // شاشة الإذن عالقة (حالة حافة مثبتة ميدانياً، docs/39 §2). - if (lifecycle == AppLifecycleState.resumed && - _cubit.state.step == LoginStep.permission) { - _cubit.checkLocationPermission(); - } - } - - @override - Widget build(BuildContext context) { - return BlocProvider.value( - value: _cubit, - child: BlocListener( - listenWhen: (prev, next) => next.step == LoginStep.done, - listener: (context, state) { - final user = state.user; - if (user != null) context.read().onLoggedIn(user); - }, - child: BlocBuilder( - buildWhen: (prev, next) => prev.step != next.step, - builder: (context, state) => switch (state.step) { - LoginStep.agreement => const AgreementView(), - LoginStep.permission => const PermissionView(), - LoginStep.phone => const PhoneView(), - LoginStep.otp || LoginStep.done => const OtpView(), - }, - ), - ), - ); - } -} diff --git a/apps/driver_new/lib/features/auth/view/otp_view.dart b/apps/driver_new/lib/features/auth/view/otp_view.dart deleted file mode 100644 index 82a8cb4..0000000 --- a/apps/driver_new/lib/features/auth/view/otp_view.dart +++ /dev/null @@ -1,89 +0,0 @@ -import 'package:flutter/material.dart'; -import 'package:flutter_bloc/flutter_bloc.dart'; - -import '../../../core/design/tokens.dart'; -import '../../../core/design/tripz_colors.dart'; -import '../../../core/l10n/l10n.dart'; -import '../../../core/ui/failure_text.dart'; -import '../../../core/ui/form_header.dart'; -import '../../../core/ui/tripz_button.dart'; -import '../../../core/ui/tripz_otp_field.dart'; -import '../../../core/ui/tripz_scaffold.dart'; -import '../cubit/login_cubit.dart'; -import '../cubit/login_state.dart'; - -class OtpView extends StatefulWidget { - const OtpView({super.key}); - - @override - State createState() => _OtpViewState(); -} - -class _OtpViewState extends State { - final _code = TextEditingController(); - - @override - void dispose() { - _code.dispose(); - super.dispose(); - } - - @override - Widget build(BuildContext context) { - final l10n = context.l10n; - return BlocBuilder( - builder: (context, state) { - final cubit = context.read(); - return TripzScaffold( - showAppBar: false, - bottomAction: TripzButton.primary( - label: l10n.otpVerify, - loading: state.isSubmitting, - onPressed: () => cubit.submitOtp(_code.text), - ), - child: ListView( - children: [ - const SizedBox(height: Space.xl), - FormHeader( - icon: Icons.mark_email_read_outlined, - title: l10n.otpTitle, - lead: l10n.otpLead(state.phone), - ), - const SizedBox(height: Space.lg), - TripzOtpField( - controller: _code, - enabled: !state.isSubmitting, - hasError: state.failure != null, - onCompleted: cubit.submitOtp, - ), - if (state.failure != null) - ApiFailureText(failure: state.failure!), - const SizedBox(height: Space.md), - // العدّاد التنازلي ليس تجميلاً: بلا حارس تُحظر ثلاث ضغطات - // المستخدمَ خمس دقائق (docs/38 §2). - Center( - child: state.canResend - ? TripzButton.text( - label: l10n.otpResend, - onPressed: cubit.resendOtp, - ) - : Text( - l10n.otpResendIn(state.resendIn), - style: context.texts.bodySmall?.copyWith( - color: context.colors.onSurfaceVariant, - ), - ), - ), - Center( - child: TripzButton.text( - label: l10n.otpChangeNumber, - onPressed: cubit.editPhone, - ), - ), - ], - ), - ); - }, - ); - } -} diff --git a/apps/driver_new/lib/features/auth/view/permission_view.dart b/apps/driver_new/lib/features/auth/view/permission_view.dart deleted file mode 100644 index e086f51..0000000 --- a/apps/driver_new/lib/features/auth/view/permission_view.dart +++ /dev/null @@ -1,56 +0,0 @@ -import 'package:flutter/material.dart'; -import 'package:flutter_bloc/flutter_bloc.dart'; - -import '../../../core/design/tokens.dart'; -import '../../../core/l10n/l10n.dart'; -import '../../../core/ui/form_header.dart'; -import '../../../core/ui/status_banner.dart'; -import '../../../core/ui/tripz_button.dart'; -import '../../../core/ui/tripz_scaffold.dart'; -import '../cubit/login_cubit.dart'; -import '../cubit/login_state.dart'; - -/// البوابة الثانية: إذن الموقع. عند الرفض النهائي لا يبقى إلا فتح إعدادات -/// النظام — والعودة منها يلتقطها `LoginPage` بمراقبة دورة الحياة. -class PermissionView extends StatelessWidget { - const PermissionView({super.key}); - - @override - Widget build(BuildContext context) { - final l10n = context.l10n; - return BlocBuilder( - buildWhen: (p, n) => - p.permissionPermanentlyDenied != n.permissionPermanentlyDenied, - builder: (context, state) { - final cubit = context.read(); - final denied = state.permissionPermanentlyDenied; - return TripzScaffold( - showAppBar: false, - bottomAction: TripzButton.primary( - label: denied ? l10n.actionOpenSettings : l10n.permissionAllow, - onPressed: denied - ? cubit.openSystemSettings - : cubit.requestLocationPermission, - ), - child: ListView( - children: [ - const SizedBox(height: Space.xl), - FormHeader( - icon: Icons.my_location_rounded, - title: l10n.permissionTitle, - lead: l10n.permissionLead, - ), - if (denied) ...[ - const SizedBox(height: Space.lg), - StatusBanner( - message: l10n.permissionDeniedForever, - tone: BannerTone.warning, - ), - ], - ], - ), - ); - }, - ); - } -} diff --git a/apps/driver_new/lib/features/auth/view/phone_view.dart b/apps/driver_new/lib/features/auth/view/phone_view.dart deleted file mode 100644 index 91106de..0000000 --- a/apps/driver_new/lib/features/auth/view/phone_view.dart +++ /dev/null @@ -1,93 +0,0 @@ -import 'package:flutter/material.dart'; -import 'package:flutter_bloc/flutter_bloc.dart'; - -import '../../../core/design/tokens.dart'; -import '../../../core/l10n/l10n.dart'; -import '../../../core/tenant/tenant_cubit.dart'; -import '../../../core/ui/failure_text.dart'; -import '../../../core/ui/form_header.dart'; -import '../../../core/ui/phone_field.dart'; -import '../../../core/ui/tripz_button.dart'; -import '../../../core/ui/tripz_scaffold.dart'; -import '../cubit/login_cubit.dart'; -import '../cubit/login_state.dart'; - -class PhoneView extends StatefulWidget { - const PhoneView({super.key}); - - @override - State createState() => _PhoneViewState(); -} - -class _PhoneViewState extends State { - final _phone = TextEditingController(); - - @override - void initState() { - super.initState(); - _phone.addListener( - () => context.read().phoneChanged(_phone.text), - ); - // الدولة الافتراضية من المستأجر — يُطبَّق بعد أول إطار كي يتوفّر السياق. - WidgetsBinding.instance.addPostFrameCallback((_) { - if (!mounted) return; - context - .read() - .applyTenantCountry(context.read().state.countryPack); - }); - } - - @override - void dispose() { - _phone.dispose(); - super.dispose(); - } - - @override - Widget build(BuildContext context) { - final l10n = context.l10n; - return BlocBuilder( - buildWhen: (p, n) => - p.status != n.status || - p.phoneError != n.phoneError || - p.country != n.country || - p.failure != n.failure, - builder: (context, state) { - final cubit = context.read(); - return TripzScaffold( - showAppBar: false, - bottomAction: TripzButton.primary( - label: l10n.phoneSend, - loading: state.isSubmitting, - onPressed: cubit.submitPhone, - ), - child: ListView( - children: [ - const SizedBox(height: Space.xl), - FormHeader( - icon: Icons.phone_outlined, - title: l10n.phoneTitle, - lead: l10n.phoneLead, - ), - const SizedBox(height: Space.lg), - PhoneField( - controller: _phone, - country: state.country, - onCountryChanged: cubit.countryChanged, - label: l10n.phoneLabel, - hint: l10n.phoneHint, - enabled: !state.isSubmitting, - onSubmitted: (_) => cubit.submitPhone(), - errorText: state.phoneError == null - ? null - : ApiFailureText.phoneMessageOf(context, state.phoneError!), - ), - if (state.failure != null) - ApiFailureText(failure: state.failure!), - ], - ), - ); - }, - ); - } -} diff --git a/apps/driver_new/lib/features/chat/cubit/chat_cubit.dart b/apps/driver_new/lib/features/chat/cubit/chat_cubit.dart deleted file mode 100644 index a71266a..0000000 --- a/apps/driver_new/lib/features/chat/cubit/chat_cubit.dart +++ /dev/null @@ -1,81 +0,0 @@ -import 'dart:async'; - -import 'package:flutter_bloc/flutter_bloc.dart'; - -import '../../../core/api/api_exception.dart'; -import '../../../core/ui/view_status.dart'; -import '../data/chat_repository.dart'; - -class ChatState { - const ChatState({ - this.status = ViewStatus.idle, - this.messages = const [], - this.sending = false, - this.error, - }); - - final ViewStatus status; - final List messages; - final bool sending; - final String? error; -} - -class ChatCubit extends Cubit { - ChatCubit(this._repo) : super(const ChatState()); - - final ChatRepository _repo; - Timer? _poll; - String? _tripId; - - @override - Future close() { - _poll?.cancel(); - return super.close(); - } - - /// استطلاع كل خمس ثوانٍ — الخادم لا يبثّ الرسائل عبر السوكت - /// (راجع `ChatRepository`). يتوقّف مع إغلاق الشاشة. - Future open(String tripId) async { - _tripId = tripId; - emit(const ChatState(status: ViewStatus.loading)); - await _refresh(); - _poll = Timer.periodic(const Duration(seconds: 5), (_) => _refresh()); - } - - Future _refresh() async { - final tripId = _tripId; - if (tripId == null || isClosed) return; - try { - final messages = await _repo.messages(tripId); - if (isClosed) return; - emit(ChatState( - status: ViewStatus.success, - messages: messages, - sending: state.sending, - )); - } on ApiException catch (e) { - // فشل الاستطلاع لا يمسح ما وصل: الرسائل المعروضة تبقى. - if (!isClosed && state.messages.isEmpty) { - emit(ChatState(status: ViewStatus.error, error: e.message)); - } - } - } - - Future send(String body) async { - final tripId = _tripId; - if (tripId == null || body.trim().isEmpty) return; - emit(ChatState( - status: state.status, - messages: state.messages, - sending: true, - )); - try { - await _repo.send(tripId, body.trim()); - await _refresh(); - } on ApiException { - if (!isClosed) { - emit(ChatState(status: state.status, messages: state.messages)); - } - } - } -} diff --git a/apps/driver_new/lib/features/chat/data/chat_repository.dart b/apps/driver_new/lib/features/chat/data/chat_repository.dart deleted file mode 100644 index a54749a..0000000 --- a/apps/driver_new/lib/features/chat/data/chat_repository.dart +++ /dev/null @@ -1,46 +0,0 @@ -import '../../../core/api/api_client.dart'; - -class ChatMessage { - const ChatMessage({ - required this.id, - required this.body, - required this.senderId, - this.createdAt, - }); - - final String id; - final String body; - final String senderId; - final DateTime? createdAt; - - factory ChatMessage.fromJson(Map json) => ChatMessage( - id: json['id']?.toString() ?? '', - body: json['body'] as String? ?? json['message'] as String? ?? '', - senderId: json['sender_id']?.toString() ?? '', - createdAt: DateTime.tryParse(json['created_at']?.toString() ?? ''), - ); -} - -/// دردشة الرحلة (docs/38 §11). -/// -/// ⚠️ **لا حدث سوكت للرسائل**: قائمة أحداث الخادم لا تتضمّن الدردشة -/// (docs/38 §9)، فالتحديث **باستطلاع دوري** لا ببثّ. هذا قيد الخادم لا -/// اختيار تصميمي — ويُلغى فور إضافة الحدث. -class ChatRepository { - ChatRepository(this._api); - - final ApiClient _api; - - Future> messages(String tripId) async { - final res = await _api.get>('/trips/$tripId/messages'); - return res - .whereType>() - .map(ChatMessage.fromJson) - .toList(growable: false); - } - - Future send(String tripId, String body) => _api.post>( - '/trips/$tripId/messages', - body: {'body': body}, - ); -} diff --git a/apps/driver_new/lib/features/chat/view/chat_page.dart b/apps/driver_new/lib/features/chat/view/chat_page.dart deleted file mode 100644 index 1488e4b..0000000 --- a/apps/driver_new/lib/features/chat/view/chat_page.dart +++ /dev/null @@ -1,114 +0,0 @@ -import 'package:flutter/material.dart'; -import 'package:flutter_bloc/flutter_bloc.dart'; - -import '../../../core/design/tokens.dart'; -import '../../../core/design/tripz_colors.dart'; -import '../../../core/di.dart'; -import '../../../core/l10n/l10n.dart'; -import '../../../core/session/session_cubit.dart'; -import '../../../core/ui/empty_view.dart'; -import '../../../core/ui/tripz_scaffold.dart'; -import '../../../core/ui/tripz_text_field.dart'; -import '../cubit/chat_cubit.dart'; -import '../data/chat_repository.dart'; - -class ChatPage extends StatefulWidget { - const ChatPage({super.key, required this.tripId}); - - final String tripId; - - @override - State createState() => _ChatPageState(); -} - -class _ChatPageState extends State { - late final ChatCubit _cubit = sl()..open(widget.tripId); - final _input = TextEditingController(); - - @override - void dispose() { - _input.dispose(); - _cubit.close(); - super.dispose(); - } - - @override - Widget build(BuildContext context) { - final l10n = context.l10n; - final myId = sl().state.user?.id; - - return BlocProvider.value( - value: _cubit, - child: BlocBuilder( - builder: (context, state) => TripzScaffold( - title: l10n.chatTitle, - status: state.status, - error: state.error, - bottomAction: TripzTextField( - controller: _input, - hint: l10n.chatHint, - textInputAction: TextInputAction.send, - onSubmitted: (v) { - _cubit.send(v); - _input.clear(); - }, - suffix: IconButton( - icon: const Icon(Icons.send_rounded), - onPressed: () { - _cubit.send(_input.text); - _input.clear(); - }, - ), - ), - child: state.messages.isEmpty - ? EmptyView( - icon: Icons.forum_outlined, - message: l10n.chatEmpty, - ) - : ListView.builder( - // الأحدث أسفل، والقائمة مقلوبة كي تبقى عند آخر رسالة. - reverse: true, - itemCount: state.messages.length, - itemBuilder: (context, i) { - final msg = state.messages[state.messages.length - 1 - i]; - return _Bubble(msg: msg, mine: msg.senderId == myId); - }, - ), - ), - ), - ); - } -} - -class _Bubble extends StatelessWidget { - const _Bubble({required this.msg, required this.mine}); - - final ChatMessage msg; - final bool mine; - - @override - Widget build(BuildContext context) { - return Align( - alignment: - mine ? AlignmentDirectional.centerEnd : AlignmentDirectional.centerStart, - child: Container( - margin: const EdgeInsets.symmetric(vertical: Space.xxs), - padding: const EdgeInsets.symmetric( - horizontal: Space.sm, - vertical: Space.xs, - ), - constraints: BoxConstraints( - maxWidth: MediaQuery.sizeOf(context).width * 0.75, - ), - decoration: BoxDecoration( - color: mine - ? context.colors.primaryContainer - : context.tripzColors.surfaceRaised, - borderRadius: Radii.card_, - border: mine ? null : Border.all(color: context.colors.outlineVariant), - ), - child: Text(msg.body, style: context.texts.bodyMedium), - ), - ); - } -} diff --git a/apps/driver_new/lib/features/onboarding/cubit/onboarding_cubit.dart b/apps/driver_new/lib/features/onboarding/cubit/onboarding_cubit.dart deleted file mode 100644 index 9822a6a..0000000 --- a/apps/driver_new/lib/features/onboarding/cubit/onboarding_cubit.dart +++ /dev/null @@ -1,123 +0,0 @@ -import 'package:flutter_bloc/flutter_bloc.dart'; - -import '../../../core/api/api_exception.dart'; -import '../../../core/api/api_failure.dart'; -import '../data/driver_repository.dart'; -import 'onboarding_state.dart'; - -/// تسجيل السائق حتى الاعتماد. -/// -/// **الخطوة تُشتقّ من حالة الخادم لا من تقدّم محلّي**: سائق يعيد تثبيت -/// التطبيق يجب أن يعود إلى حيث وقف، لا أن يبدأ من الصفر. -class OnboardingCubit extends Cubit { - OnboardingCubit(this._repo) : super(const OnboardingState()); - - final DriverRepository _repo; - - Future load() async { - emit(state.copyWith(step: OnboardingStep.loading, clearFailure: true)); - try { - final driver = await _repo.me(); - if (isClosed) return; - - if (driver == null) { - emit(state.copyWith(step: OnboardingStep.apply, driver: null)); - return; - } - if (driver.isApproved) { - emit(state.copyWith(step: OnboardingStep.approved, driver: driver)); - return; - } - - // الملف ناقص ما لم يُدخل الاسم العربي — أول ما يطلبه الخادم. - if (driver.nameArabic == null || driver.nameArabic!.isEmpty) { - emit(state.copyWith(step: OnboardingStep.profile, driver: driver)); - return; - } - - final vehicles = await _repo.vehicles(); - if (isClosed) return; - if (vehicles.isEmpty) { - emit(state.copyWith( - step: OnboardingStep.vehicle, - driver: driver, - vehicles: vehicles, - )); - return; - } - - final reqs = await _repo.requirements(); - if (isClosed) return; - emit(state.copyWith( - // اكتملت الوثائق ولم يُعتمد بعد: مراجعة بشرية جارية. - step: reqs.complete ? OnboardingStep.pending : OnboardingStep.documents, - driver: driver, - vehicles: vehicles, - requirements: reqs.items, - )); - } on ApiException catch (e) { - if (!isClosed) { - emit(state.copyWith( - step: OnboardingStep.apply, - failure: e.toApiFailure(), - )); - } - } - } - - Future apply({required String vehicleMake, required String serviceClass}) => - _run(() => _repo.apply(vehicleMake: vehicleMake, serviceClass: serviceClass)); - - Future saveProfile({ - required String nameArabic, - required String nationalNumber, - String? gender, - }) => - _run(() => _repo.setProfile( - nameArabic: nameArabic, - nationalNumber: nationalNumber, - gender: gender, - )); - - Future addVehicle({ - required String make, - required String model, - required int year, - required String color, - required String plate, - }) => - _run(() => _repo.addVehicle( - make: make, - model: model, - year: year, - color: color, - plate: plate, - )); - - Future uploadDocument({ - required String filePath, - required String type, - required String side, - }) => - _run(() => _repo.uploadDocument( - filePath: filePath, - type: type, - side: side, - )); - - /// كل فعل ينتهي بإعادة قراءة الحالة من الخادم — فلا يتقدّم التطبيق خطوةً - /// لم يقبلها الخادم فعلاً. - Future _run(Future Function() action) async { - emit(state.copyWith(busy: true, clearFailure: true)); - try { - await action(); - if (isClosed) return; - emit(state.copyWith(busy: false)); - await load(); - } on ApiException catch (e) { - if (!isClosed) { - emit(state.copyWith(busy: false, failure: e.toApiFailure())); - } - } - } -} diff --git a/apps/driver_new/lib/features/onboarding/cubit/onboarding_state.dart b/apps/driver_new/lib/features/onboarding/cubit/onboarding_state.dart deleted file mode 100644 index e3c99fa..0000000 --- a/apps/driver_new/lib/features/onboarding/cubit/onboarding_state.dart +++ /dev/null @@ -1,51 +0,0 @@ -import 'package:equatable/equatable.dart'; - -import '../../../core/api/api_failure.dart'; -import '../data/models/document_requirement.dart'; -import '../data/models/driver_profile.dart'; -import '../data/models/vehicle.dart'; - -/// خطوات تسجيل السائق بالترتيب الميداني (docs/39 §2): تقديم ← ملف ← -/// مركبة ← وثائق ← انتظار الاعتماد. -enum OnboardingStep { loading, apply, profile, vehicle, documents, pending, approved } - -class OnboardingState extends Equatable { - const OnboardingState({ - this.step = OnboardingStep.loading, - this.driver, - this.vehicles = const [], - this.requirements = const [], - this.busy = false, - this.failure, - }); - - final OnboardingStep step; - final DriverProfile? driver; - final List vehicles; - final List requirements; - final bool busy; - final ApiFailure? failure; - - OnboardingState copyWith({ - OnboardingStep? step, - DriverProfile? driver, - List? vehicles, - List? requirements, - bool? busy, - ApiFailure? failure, - bool clearFailure = false, - }) { - return OnboardingState( - step: step ?? this.step, - driver: driver ?? this.driver, - vehicles: vehicles ?? this.vehicles, - requirements: requirements ?? this.requirements, - busy: busy ?? this.busy, - failure: clearFailure ? null : (failure ?? this.failure), - ); - } - - @override - List get props => - [step, driver, vehicles, requirements, busy, failure]; -} diff --git a/apps/driver_new/lib/features/onboarding/data/driver_repository.dart b/apps/driver_new/lib/features/onboarding/data/driver_repository.dart deleted file mode 100644 index 18a6042..0000000 --- a/apps/driver_new/lib/features/onboarding/data/driver_repository.dart +++ /dev/null @@ -1,108 +0,0 @@ -import '../../../core/api/api_client.dart'; -import '../../../core/api/api_exception.dart'; -import 'models/document_requirement.dart'; -import 'models/driver_profile.dart'; -import 'models/vehicle.dart'; - -class DriverRepository { - DriverRepository(this._api); - - final ApiClient _api; - - /// `null` حين لا سجلّ سائق بعد — 404 هنا حالة طبيعية لا عطل. - Future me() async { - try { - final res = await _api.get>('/drivers/me'); - return DriverProfile.fromJson(res); - } on ApiException catch (e) { - if (e.statusCode == 404) return null; - rethrow; - } - } - - Future apply({ - required String vehicleMake, - required String serviceClass, - }) async { - final res = await _api.post>('/drivers/apply', body: { - 'vehicle_make': vehicleMake, - 'service_class': serviceClass, - }); - return DriverProfile.fromJson(res); - } - - Future setProfile({ - required String nameArabic, - required String nationalNumber, - String? gender, - String? birthdate, - String? address, - String? licenseType, - String? licenseExpiry, - }) { - return _api.patch>('/drivers/profile', body: { - 'name_arabic': nameArabic, - 'national_number': nationalNumber, - 'gender': ?gender, - 'birthdate': ?birthdate, - 'address': ?address, - 'license_type': ?licenseType, - 'license_expiry': ?licenseExpiry, - }); - } - - Future> vehicles() async { - final res = await _api.get>('/vehicles/mine'); - return res - .whereType>() - .map(Vehicle.fromJson) - .toList(growable: false); - } - - Future addVehicle({ - required String make, - required String model, - required int year, - required String color, - required String plate, - }) async { - final res = await _api.post>('/vehicles', body: { - 'make': make, - 'model': model, - 'year': year, - 'color': color, - 'plate': plate, - }); - return Vehicle.fromJson(res); - } - - Future<({bool complete, List items})> requirements() async { - final res = await _api.get>( - '/drivers/documents/requirements', - ); - final raw = res['items']; - return ( - complete: res['complete'] as bool? ?? false, - items: raw is List - ? raw - .whereType>() - .map(DocumentRequirement.fromJson) - .toList(growable: false) - : const [], - ); - } - - /// رفع وثيقة. الاعتماد **يقع على الخادم تلقائياً** حين تكتمل كل الوثائق — - /// التطبيق لا يعتمد أحداً. - Future uploadDocument({ - required String filePath, - required String type, - required String side, - }) { - return _api.upload>( - '/drivers/documents', - filePath: filePath, - fields: {'type': type, 'side': side}, - ); - } -} diff --git a/apps/driver_new/lib/features/onboarding/data/models/document_requirement.dart b/apps/driver_new/lib/features/onboarding/data/models/document_requirement.dart deleted file mode 100644 index 59d4704..0000000 --- a/apps/driver_new/lib/features/onboarding/data/models/document_requirement.dart +++ /dev/null @@ -1,39 +0,0 @@ -import 'package:equatable/equatable.dart'; - -/// وثيقة مطلوبة وحالتها — من `GET /drivers/documents/requirements`. -/// الخادم يعتمد السائق **تلقائياً** حين تصير كلها `approved`. -class DocumentRequirement extends Equatable { - const DocumentRequirement({ - required this.type, - required this.nameAr, - required this.side, - required this.status, - this.documentId, - }); - - final String type; - final String nameAr; - - /// وجه المستند: `front` أو `back` — بعضها يحتاج الوجهين. - final String side; - - /// `missing` · `pending` · `approved` · `rejected`. - final String status; - - final String? documentId; - - factory DocumentRequirement.fromJson(Map json) => - DocumentRequirement( - type: json['type'] as String? ?? '', - nameAr: json['name_ar'] as String? ?? '', - side: json['side'] as String? ?? 'front', - status: json['status'] as String? ?? 'missing', - documentId: json['document_id'] as String?, - ); - - bool get isMissing => status == 'missing' || status == 'rejected'; - bool get isApproved => status == 'approved'; - - @override - List get props => [type, side, status]; -} diff --git a/apps/driver_new/lib/features/onboarding/data/models/driver_profile.dart b/apps/driver_new/lib/features/onboarding/data/models/driver_profile.dart deleted file mode 100644 index 8ba5f8f..0000000 --- a/apps/driver_new/lib/features/onboarding/data/models/driver_profile.dart +++ /dev/null @@ -1,48 +0,0 @@ -import 'package:equatable/equatable.dart'; - -/// حالة اعتماد السائق كما يعرّفها الخادم: `pending` · `approved` · `rejected`. -enum VerificationStatus { - pending, - approved, - rejected, - - /// لا سجلّ سائق بعد — لم يقدّم أصلاً. - none; - - static VerificationStatus parse(String? raw) => switch (raw) { - 'approved' => VerificationStatus.approved, - 'rejected' => VerificationStatus.rejected, - 'pending' => VerificationStatus.pending, - _ => VerificationStatus.none, - }; -} - -class DriverProfile extends Equatable { - const DriverProfile({ - required this.id, - required this.verification, - this.serviceClass = 'economy', - this.nameArabic, - this.online = false, - }); - - final String id; - final VerificationStatus verification; - final String serviceClass; - final String? nameArabic; - final bool online; - - factory DriverProfile.fromJson(Map json) => DriverProfile( - id: json['id'] as String? ?? '', - verification: - VerificationStatus.parse(json['verification_status'] as String?), - serviceClass: json['service_class'] as String? ?? 'economy', - nameArabic: json['name_arabic'] as String?, - online: json['online'] as bool? ?? false, - ); - - bool get isApproved => verification == VerificationStatus.approved; - - @override - List get props => [id, verification, serviceClass, online]; -} diff --git a/apps/driver_new/lib/features/onboarding/data/models/vehicle.dart b/apps/driver_new/lib/features/onboarding/data/models/vehicle.dart deleted file mode 100644 index 7fb84c9..0000000 --- a/apps/driver_new/lib/features/onboarding/data/models/vehicle.dart +++ /dev/null @@ -1,45 +0,0 @@ -import 'package:equatable/equatable.dart'; - -class Vehicle extends Equatable { - const Vehicle({ - required this.id, - this.make, - this.model, - this.year, - this.color, - this.plate, - this.isDefault = false, - this.status = 'pending', - }); - - final String id; - final String? make; - final String? model; - final int? year; - final String? color; - final String? plate; - - /// أول مركبة تصير الافتراضية تلقائياً على الخادم (docs/38 §5). - final bool isDefault; - - final String status; - - factory Vehicle.fromJson(Map json) => Vehicle( - id: json['id'] as String? ?? '', - make: json['make'] as String?, - model: json['model'] as String?, - year: (json['year'] as num?)?.toInt(), - color: json['color'] as String?, - plate: json['plate'] as String?, - isDefault: json['is_default'] as bool? ?? false, - status: json['status'] as String? ?? 'pending', - ); - - String get label => [make, model, year?.toString()] - .whereType() - .where((s) => s.isNotEmpty) - .join(' '); - - @override - List get props => [id, plate, isDefault, status]; -} diff --git a/apps/driver_new/lib/features/onboarding/view/onboarding_page.dart b/apps/driver_new/lib/features/onboarding/view/onboarding_page.dart deleted file mode 100644 index fe657b6..0000000 --- a/apps/driver_new/lib/features/onboarding/view/onboarding_page.dart +++ /dev/null @@ -1,54 +0,0 @@ -import 'package:flutter/material.dart'; -import 'package:flutter_bloc/flutter_bloc.dart'; - -import '../../../core/di.dart'; -import '../../../core/ui/view_status.dart'; -import '../../../core/ui/tripz_scaffold.dart'; -import '../cubit/onboarding_cubit.dart'; -import '../cubit/onboarding_state.dart'; -import 'steps/apply_step.dart'; -import 'steps/documents_step.dart'; -import 'steps/pending_step.dart'; -import 'steps/profile_step.dart'; -import 'steps/vehicle_step.dart'; - -/// مضيف تسجيل السائق. الخطوة تُشتقّ من حالة الخادم في كل مرة — سائق يعيد -/// تثبيت التطبيق يعود إلى حيث وقف لا إلى البداية. -class OnboardingPage extends StatefulWidget { - const OnboardingPage({super.key}); - - @override - State createState() => _OnboardingPageState(); -} - -class _OnboardingPageState extends State { - late final OnboardingCubit _cubit = sl()..load(); - - @override - void dispose() { - _cubit.close(); - super.dispose(); - } - - @override - Widget build(BuildContext context) { - return BlocProvider.value( - value: _cubit, - child: BlocBuilder( - builder: (context, state) => switch (state.step) { - OnboardingStep.loading => const TripzScaffold( - showAppBar: false, - status: ViewStatus.loading, - child: SizedBox.shrink(), - ), - OnboardingStep.apply => ApplyStep(state: state), - OnboardingStep.profile => ProfileStep(state: state), - OnboardingStep.vehicle => VehicleStep(state: state), - OnboardingStep.documents => DocumentsStep(state: state), - OnboardingStep.pending => const PendingStep(approved: false), - OnboardingStep.approved => const PendingStep(approved: true), - }, - ), - ); - } -} diff --git a/apps/driver_new/lib/features/onboarding/view/steps/apply_step.dart b/apps/driver_new/lib/features/onboarding/view/steps/apply_step.dart deleted file mode 100644 index 2e48f5c..0000000 --- a/apps/driver_new/lib/features/onboarding/view/steps/apply_step.dart +++ /dev/null @@ -1,64 +0,0 @@ -import 'package:flutter/material.dart'; -import 'package:flutter_bloc/flutter_bloc.dart'; - -import '../../../../core/design/tokens.dart'; -import '../../../../core/l10n/l10n.dart'; -import '../../../../core/ui/form_header.dart'; -import '../../../../core/ui/tripz_button.dart'; -import '../../../../core/ui/tripz_scaffold.dart'; -import '../../../../core/ui/tripz_text_field.dart'; -import '../../cubit/onboarding_cubit.dart'; -import '../../cubit/onboarding_state.dart'; - -class ApplyStep extends StatefulWidget { - const ApplyStep({super.key, required this.state}); - - final OnboardingState state; - - @override - State createState() => _ApplyStepState(); -} - -class _ApplyStepState extends State { - final _make = TextEditingController(); - - @override - void dispose() { - _make.dispose(); - super.dispose(); - } - - @override - Widget build(BuildContext context) { - final l10n = context.l10n; - final cubit = context.read(); - return TripzScaffold( - showAppBar: false, - bottomAction: TripzButton.primary( - label: l10n.obApplySubmit, - loading: widget.state.busy, - onPressed: () => cubit.apply( - vehicleMake: _make.text.trim(), - // فئة الخدمة الافتراضية؛ يعدّلها الأدمن لاحقاً حسب المركبة المعتمدة. - serviceClass: 'economy', - ), - ), - child: ListView( - children: [ - const SizedBox(height: Space.xl), - FormHeader( - icon: Icons.badge_outlined, - title: l10n.obApplyTitle, - lead: l10n.obApplyLead, - ), - const SizedBox(height: Space.lg), - TripzTextField( - controller: _make, - label: l10n.obVehicleMake, - autofocus: true, - ), - ], - ), - ); - } -} diff --git a/apps/driver_new/lib/features/onboarding/view/steps/documents_step.dart b/apps/driver_new/lib/features/onboarding/view/steps/documents_step.dart deleted file mode 100644 index 722f32b..0000000 --- a/apps/driver_new/lib/features/onboarding/view/steps/documents_step.dart +++ /dev/null @@ -1,114 +0,0 @@ -import 'package:flutter/material.dart'; -import 'package:flutter_bloc/flutter_bloc.dart'; -import 'package:image_picker/image_picker.dart'; - -import '../../../../core/design/tokens.dart'; -import '../../../../core/design/tripz_colors.dart'; -import '../../../../core/l10n/l10n.dart'; -import '../../../../core/ui/form_header.dart'; -import '../../../../core/ui/tripz_card.dart'; -import '../../../../core/ui/tripz_scaffold.dart'; -import '../../cubit/onboarding_cubit.dart'; -import '../../cubit/onboarding_state.dart'; -import '../../data/models/document_requirement.dart'; - -/// قائمة الوثائق المطلوبة وحالتها. **الخادم يعتمد السائق تلقائياً** حين -/// تصير كلها `approved` — التطبيق لا يعتمد أحداً ولا يخمّن الاكتمال. -class DocumentsStep extends StatelessWidget { - const DocumentsStep({super.key, required this.state}); - - final OnboardingState state; - - @override - Widget build(BuildContext context) { - final l10n = context.l10n; - return TripzScaffold( - showAppBar: false, - child: ListView( - children: [ - const SizedBox(height: Space.xl), - FormHeader( - icon: Icons.folder_open_outlined, - title: l10n.obDocsTitle, - lead: l10n.obDocsLead, - ), - const SizedBox(height: Space.lg), - for (final req in state.requirements) ...[ - _DocTile(req: req, busy: state.busy), - const SizedBox(height: Space.xs), - ], - ], - ), - ); - } -} - -class _DocTile extends StatelessWidget { - const _DocTile({required this.req, required this.busy}); - - final DocumentRequirement req; - final bool busy; - - @override - Widget build(BuildContext context) { - final l10n = context.l10n; - final colors = context.tripzColors; - - final (label, color) = switch (req.status) { - 'approved' => (l10n.obDocApproved, colors.success), - 'pending' => (l10n.obDocPending, colors.warning), - 'rejected' => (l10n.obDocRejected, colors.danger), - _ => (l10n.obDocMissing, context.colors.onSurfaceVariant), - }; - - return TripzCard( - onTap: req.isMissing && !busy ? () => _pick(context) : null, - child: Row( - children: [ - Icon( - req.isApproved - ? Icons.check_circle_rounded - : Icons.upload_file_outlined, - color: color, - ), - const SizedBox(width: Space.sm), - Expanded( - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Text(req.nameAr, style: context.texts.bodyMedium), - Text( - '${req.side == 'back' ? l10n.obDocSideBack : l10n.obDocSideFront} · $label', - style: context.texts.bodySmall?.copyWith(color: color), - ), - ], - ), - ), - if (req.isMissing) - Text( - l10n.obDocUpload, - style: context.texts.labelLarge?.copyWith( - color: context.colors.primary, - ), - ), - ], - ), - ); - } - - Future _pick(BuildContext context) async { - final cubit = context.read(); - // الكاميرا لا المعرض: صورة وثيقة تُلتقط الآن أصعب تزويراً من ملف محفوظ. - final file = await ImagePicker().pickImage( - source: ImageSource.camera, - imageQuality: 80, - maxWidth: 1600, - ); - if (file == null) return; - await cubit.uploadDocument( - filePath: file.path, - type: req.type, - side: req.side, - ); - } -} diff --git a/apps/driver_new/lib/features/onboarding/view/steps/pending_step.dart b/apps/driver_new/lib/features/onboarding/view/steps/pending_step.dart deleted file mode 100644 index a60ad4b..0000000 --- a/apps/driver_new/lib/features/onboarding/view/steps/pending_step.dart +++ /dev/null @@ -1,58 +0,0 @@ -import 'package:flutter/material.dart'; -import 'package:flutter_bloc/flutter_bloc.dart'; - -import '../../../../core/design/tokens.dart'; -import '../../../../core/design/tripz_colors.dart'; -import '../../../../core/l10n/l10n.dart'; -import '../../../../core/session/session_cubit.dart'; -import '../../../../core/ui/form_header.dart'; -import '../../../../core/ui/tripz_button.dart'; -import '../../../../core/ui/tripz_scaffold.dart'; -import '../../cubit/onboarding_cubit.dart'; - -/// انتظار المراجعة، أو الاعتماد. -/// -/// عند الاعتماد **لا بد من إعادة دخول**: الدور يتغيّر على الخادم بعد -/// `approve`، والتوكن القديم ما زال يحمل الدور القديم — فتفشل نقاط السائق -/// بـ403 (مصيدة docs/38 §5). فالخروج هنا فعلٌ مقصود لا خطأ. -class PendingStep extends StatelessWidget { - const PendingStep({super.key, required this.approved}); - - final bool approved; - - @override - Widget build(BuildContext context) { - final l10n = context.l10n; - return TripzScaffold( - showAppBar: false, - bottomAction: approved - ? TripzButton.primary( - label: l10n.obRelogin, - onPressed: context.read().logout, - ) - : TripzButton.secondary( - label: l10n.obPendingRefresh, - expanded: true, - onPressed: context.read().load, - ), - child: ListView( - children: [ - const SizedBox(height: Space.xxl), - Icon( - approved ? Icons.verified_rounded : Icons.hourglass_top_rounded, - size: 56, - color: approved - ? context.tripzColors.success - : context.tripzColors.warning, - ), - const SizedBox(height: Space.md), - FormHeader( - icon: approved ? Icons.verified_outlined : Icons.schedule_rounded, - title: approved ? l10n.obApprovedTitle : l10n.obPendingTitle, - lead: approved ? l10n.obApprovedLead : l10n.obPendingLead, - ), - ], - ), - ); - } -} diff --git a/apps/driver_new/lib/features/onboarding/view/steps/profile_step.dart b/apps/driver_new/lib/features/onboarding/view/steps/profile_step.dart deleted file mode 100644 index ed1d81f..0000000 --- a/apps/driver_new/lib/features/onboarding/view/steps/profile_step.dart +++ /dev/null @@ -1,95 +0,0 @@ -import 'package:flutter/material.dart'; -import 'package:flutter_bloc/flutter_bloc.dart'; - -import '../../../../core/design/tokens.dart'; -import '../../../../core/l10n/l10n.dart'; -import '../../../../core/ui/form_header.dart'; -import '../../../../core/ui/tripz_button.dart'; -import '../../../../core/ui/tripz_scaffold.dart'; -import '../../../../core/ui/tripz_text_field.dart'; -import '../../cubit/onboarding_cubit.dart'; -import '../../cubit/onboarding_state.dart'; - -class ProfileStep extends StatefulWidget { - const ProfileStep({super.key, required this.state}); - - final OnboardingState state; - - @override - State createState() => _ProfileStepState(); -} - -class _ProfileStepState extends State { - final _name = TextEditingController(); - final _national = TextEditingController(); - String _gender = 'male'; - - @override - void dispose() { - _name.dispose(); - _national.dispose(); - super.dispose(); - } - - @override - Widget build(BuildContext context) { - final l10n = context.l10n; - final cubit = context.read(); - return TripzScaffold( - showAppBar: false, - bottomAction: TripzButton.primary( - label: l10n.actionContinue, - loading: widget.state.busy, - onPressed: () => cubit.saveProfile( - nameArabic: _name.text.trim(), - nationalNumber: _national.text.trim(), - gender: _gender, - ), - ), - child: ListView( - children: [ - const SizedBox(height: Space.xl), - FormHeader( - icon: Icons.person_outline_rounded, - title: l10n.obProfileTitle, - lead: l10n.obApplyLead, - ), - const SizedBox(height: Space.lg), - TripzTextField( - controller: _name, - label: l10n.obNameArabic, - autofocus: true, - ), - const SizedBox(height: Space.md), - // الرقم الوطني يُشفَّر على الخادم مع فهرس أعمى — يُدخل مرة واحدة. - TripzTextField( - controller: _national, - label: l10n.obNationalNumber, - numeric: true, - keyboardType: TextInputType.number, - ), - const SizedBox(height: Space.md), - Text(l10n.obGender, style: Theme.of(context).textTheme.titleSmall), - RadioGroup( - groupValue: _gender, - onChanged: (v) => setState(() => _gender = v ?? 'male'), - child: Column( - children: [ - RadioListTile( - value: 'male', - contentPadding: EdgeInsets.zero, - title: Text(l10n.obGenderMale), - ), - RadioListTile( - value: 'female', - contentPadding: EdgeInsets.zero, - title: Text(l10n.obGenderFemale), - ), - ], - ), - ), - ], - ), - ); - } -} diff --git a/apps/driver_new/lib/features/onboarding/view/steps/vehicle_step.dart b/apps/driver_new/lib/features/onboarding/view/steps/vehicle_step.dart deleted file mode 100644 index 6981921..0000000 --- a/apps/driver_new/lib/features/onboarding/view/steps/vehicle_step.dart +++ /dev/null @@ -1,82 +0,0 @@ -import 'package:flutter/material.dart'; -import 'package:flutter_bloc/flutter_bloc.dart'; - -import '../../../../core/design/tokens.dart'; -import '../../../../core/l10n/l10n.dart'; -import '../../../../core/ui/form_header.dart'; -import '../../../../core/ui/tripz_button.dart'; -import '../../../../core/ui/tripz_scaffold.dart'; -import '../../../../core/ui/tripz_text_field.dart'; -import '../../cubit/onboarding_cubit.dart'; -import '../../cubit/onboarding_state.dart'; - -class VehicleStep extends StatefulWidget { - const VehicleStep({super.key, required this.state}); - - final OnboardingState state; - - @override - State createState() => _VehicleStepState(); -} - -class _VehicleStepState extends State { - final _make = TextEditingController(); - final _model = TextEditingController(); - final _year = TextEditingController(); - final _color = TextEditingController(); - final _plate = TextEditingController(); - - @override - void dispose() { - for (final c in [_make, _model, _year, _color, _plate]) { - c.dispose(); - } - super.dispose(); - } - - @override - Widget build(BuildContext context) { - final l10n = context.l10n; - final cubit = context.read(); - return TripzScaffold( - showAppBar: false, - bottomAction: TripzButton.primary( - label: l10n.actionContinue, - loading: widget.state.busy, - onPressed: () => cubit.addVehicle( - make: _make.text.trim(), - model: _model.text.trim(), - year: int.tryParse(_year.text.trim()) ?? 0, - color: _color.text.trim(), - plate: _plate.text.trim(), - ), - ), - child: ListView( - children: [ - const SizedBox(height: Space.xl), - FormHeader( - icon: Icons.directions_car_outlined, - title: l10n.obVehicleTitle, - lead: l10n.obApplyLead, - ), - const SizedBox(height: Space.lg), - TripzTextField(controller: _make, label: l10n.obVehicleMake), - const SizedBox(height: Space.md), - TripzTextField(controller: _model, label: l10n.obVehicleModel), - const SizedBox(height: Space.md), - TripzTextField( - controller: _year, - label: l10n.obVehicleYear, - numeric: true, - keyboardType: TextInputType.number, - ), - const SizedBox(height: Space.md), - TripzTextField(controller: _color, label: l10n.obVehicleColor), - const SizedBox(height: Space.md), - // اللوحة تُشفَّر على الخادم — تُدخل كما هي على المركبة. - TripzTextField(controller: _plate, label: l10n.obVehiclePlate), - ], - ), - ); - } -} diff --git a/apps/driver_new/lib/features/profile/cubit/profile_cubit.dart b/apps/driver_new/lib/features/profile/cubit/profile_cubit.dart deleted file mode 100644 index 3736c18..0000000 --- a/apps/driver_new/lib/features/profile/cubit/profile_cubit.dart +++ /dev/null @@ -1,56 +0,0 @@ -import 'package:flutter_bloc/flutter_bloc.dart'; - -import '../../../core/api/api_exception.dart'; -import '../../../core/api/api_failure.dart'; -import '../../../core/session/app_user.dart'; -import '../../../core/ui/view_status.dart'; -import '../data/profile_repository.dart'; - -class ProfileState { - const ProfileState({ - this.status = ViewStatus.success, - this.saving = false, - this.failure, - this.user, - }); - - final ViewStatus status; - final bool saving; - final ApiFailure? failure; - final AppUser? user; - - ProfileState copyWith({ - ViewStatus? status, - bool? saving, - ApiFailure? failure, - AppUser? user, - bool clearFailure = false, - }) { - return ProfileState( - status: status ?? this.status, - saving: saving ?? this.saving, - failure: clearFailure ? null : (failure ?? this.failure), - user: user ?? this.user, - ); - } -} - -/// إكمال الملف بعد أول دخول. عقد الخادم يقبل `{ name, language }` فقط -/// (docs/38 §3) — لا اسم أول/أخير ولا بريد كما في سيرو (docs/39 §2). -class ProfileCubit extends Cubit { - ProfileCubit(this._repo) : super(const ProfileState()); - - final ProfileRepository _repo; - - Future save(String name) async { - emit(state.copyWith(saving: true, clearFailure: true)); - try { - final user = await _repo.update(name: name.trim()); - emit(state.copyWith(saving: false, user: user)); - return user; - } on ApiException catch (e) { - emit(state.copyWith(saving: false, failure: e.toApiFailure())); - return null; - } - } -} diff --git a/apps/driver_new/lib/features/profile/data/profile_repository.dart b/apps/driver_new/lib/features/profile/data/profile_repository.dart deleted file mode 100644 index 758fbc3..0000000 --- a/apps/driver_new/lib/features/profile/data/profile_repository.dart +++ /dev/null @@ -1,20 +0,0 @@ -import '../../../core/api/api_client.dart'; -import '../../../core/session/app_user.dart'; - -/// `PATCH /users/me` — يقبل `{ name, language }` فقط (docs/38 §3). -/// -/// مستودع مستقلّ عن `AuthRepository` عمداً: تعديل الملف ليس مصادقة، وربطهما -/// كان يجعل ميزة الملف تستورد ميزة المصادقة — وهو ممنوع (docs/23 §1). -class ProfileRepository { - ProfileRepository(this._api); - - final ApiClient _api; - - Future update({String? name, String? language}) async { - final res = await _api.patch>( - '/users/me', - body: {'name': ?name, 'language': ?language}, - ); - return AppUser.fromJson(res); - } -} diff --git a/apps/driver_new/lib/features/profile/view/profile_edit_page.dart b/apps/driver_new/lib/features/profile/view/profile_edit_page.dart deleted file mode 100644 index b9c10a5..0000000 --- a/apps/driver_new/lib/features/profile/view/profile_edit_page.dart +++ /dev/null @@ -1,179 +0,0 @@ -import 'package:flutter/material.dart'; -import 'package:flutter_bloc/flutter_bloc.dart'; - -import '../../../core/design/tokens.dart'; -import '../../../core/design/tripz_colors.dart'; -import '../../../core/design/typography.dart'; -import '../../../core/di.dart'; -import '../../../core/l10n/l10n.dart'; -import '../../../core/session/session_cubit.dart'; -import '../../../core/ui/tripz_button.dart'; -import '../../../core/ui/tripz_scaffold.dart'; -import '../../../core/ui/tripz_text_field.dart'; -import '../cubit/profile_cubit.dart'; - -/// تعديل الاسم. **الرقم لا يُعدَّل**: هو هوية الحساب على الخادم، وتغييره -/// يعني حساباً آخر (docs/38 §1) — فيُعرض معطّلاً مع سبب واضح لا مخفياً. -class ProfileEditPage extends StatefulWidget { - const ProfileEditPage({super.key}); - - @override - State createState() => _ProfileEditPageState(); -} - -class _ProfileEditPageState extends State { - late final TextEditingController _name; - - @override - void initState() { - super.initState(); - _name = TextEditingController( - text: sl().state.user?.name ?? '', - ); - } - - @override - void dispose() { - _name.dispose(); - super.dispose(); - } - - @override - Widget build(BuildContext context) { - final l10n = context.l10n; - return BlocProvider( - create: (_) => ProfileCubit(sl()), - child: BlocBuilder( - builder: (context, state) { - final user = context.watch().state.user; - return TripzScaffold( - title: l10n.profileEditTitle, - bottomAction: TripzButton.primary( - label: l10n.actionSave, - loading: state.saving, - onPressed: () => _save(context), - ), - child: ListView( - children: [ - // ترويسة الحساب — الاسم والرقم والتقييم في مكان واحد. - // **التقييم كان يصل ولا يُعرض أبداً**: `AppUser.rating` مقروء - // من `GET /users/me` (docs/38 §2) ولم تكن أي شاشة تستعمله، - // بينما الراكب يُقيَّم من السائق ويحقّ له أن يرى نتيجته. - _ProfileHeader( - name: user?.name ?? '', - phone: user?.phone ?? '', - rating: user?.rating, - ), - const SizedBox(height: Space.lg), - TripzTextField( - controller: _name, - label: l10n.profileNameLabel, - enabled: !state.saving, - ), - const SizedBox(height: Space.md), - TripzTextField( - controller: TextEditingController(text: user?.phone ?? ''), - label: l10n.profilePhone, - enabled: false, - numeric: true, - ), - const SizedBox(height: Space.xxs), - Text( - l10n.profilePhoneLocked, - style: context.texts.bodySmall?.copyWith( - color: context.colors.onSurfaceVariant, - ), - ), - ], - ), - ); - }, - ), - ); - } - - Future _save(BuildContext context) async { - final l10n = context.l10n; - final messenger = ScaffoldMessenger.of(context); - final session = context.read(); - final user = await context.read().save(_name.text); - if (user == null) return; - session.onProfileCompleted(user); - messenger.showSnackBar(SnackBar(content: Text(l10n.profileSaved))); - } -} - -/// ترويسة الحساب: حرف الاسم الأول في دائرة، ثم الاسم والرقم والتقييم. -/// -/// لا صورة شخصية: الخادم لا يوفّر رفع صور للمستخدم (سيرو يفعل عبر PHP)، -/// وحرفُ الاسم أصدق من رمزٍ عام يوحي بإمكانية لا توجد. -class _ProfileHeader extends StatelessWidget { - const _ProfileHeader({ - required this.name, - required this.phone, - this.rating, - }); - - final String name; - final String phone; - final String? rating; - - @override - Widget build(BuildContext context) { - final initial = name.trim().isEmpty ? '?' : name.trim().characters.first; - return Row( - children: [ - CircleAvatar( - radius: 32, - backgroundColor: context.colors.primaryContainer, - child: Text( - initial, - style: context.texts.headlineSmall?.copyWith( - color: context.colors.onPrimaryContainer, - ), - ), - ), - const SizedBox(width: Space.md), - Expanded( - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - if (name.trim().isNotEmpty) - Text( - name, - style: context.texts.titleMedium, - maxLines: 1, - overflow: TextOverflow.ellipsis, - ), - Text( - phone, - // الرقم يُقرأ يساراً-يميناً حتى في واجهة عربية. - textDirection: TextDirection.ltr, - style: numericStyle(context.texts.bodySmall).copyWith( - color: context.colors.onSurfaceVariant, - ), - ), - if (rating != null && rating!.isNotEmpty) ...[ - const SizedBox(height: Space.xxs), - Row( - children: [ - Icon( - Icons.star_rounded, - size: Sizes.iconSm, - color: context.tripzColors.warning, - ), - const SizedBox(width: Space.xxs), - Text( - rating!, - style: numericStyle(context.texts.bodySmall), - ), - ], - ), - ], - ], - ), - ), - ], - ); - } -} diff --git a/apps/driver_new/lib/features/profile/view/profile_setup_page.dart b/apps/driver_new/lib/features/profile/view/profile_setup_page.dart deleted file mode 100644 index fb381b6..0000000 --- a/apps/driver_new/lib/features/profile/view/profile_setup_page.dart +++ /dev/null @@ -1,85 +0,0 @@ -import 'package:flutter/material.dart'; -import 'package:flutter_bloc/flutter_bloc.dart'; - -import '../../../core/design/tokens.dart'; -import '../../../core/di.dart'; -import '../../../core/l10n/l10n.dart'; -import '../../../core/session/session_cubit.dart'; -import '../../../core/ui/failure_text.dart'; -import '../../../core/ui/form_header.dart'; -import '../../../core/ui/tripz_button.dart'; -import '../../../core/ui/tripz_scaffold.dart'; -import '../../../core/ui/tripz_text_field.dart'; -import '../cubit/profile_cubit.dart'; - -class ProfileSetupPage extends StatefulWidget { - const ProfileSetupPage({super.key}); - - @override - State createState() => _ProfileSetupPageState(); -} - -class _ProfileSetupPageState extends State { - final _name = TextEditingController(); - String? _error; - - @override - void dispose() { - _name.dispose(); - super.dispose(); - } - - @override - Widget build(BuildContext context) { - final l10n = context.l10n; - return BlocProvider( - create: (_) => ProfileCubit(sl()), - child: BlocBuilder( - builder: (context, state) { - return TripzScaffold( - showAppBar: false, - bottomAction: TripzButton.primary( - label: l10n.actionSave, - loading: state.saving, - onPressed: () => _submit(context), - ), - child: ListView( - children: [ - const SizedBox(height: Space.xl), - FormHeader( - icon: Icons.person_outline_rounded, - title: l10n.profileTitle, - lead: l10n.profileLead, - ), - const SizedBox(height: Space.lg), - TripzTextField( - controller: _name, - label: l10n.profileNameLabel, - autofocus: true, - enabled: !state.saving, - errorText: _error, - textInputAction: TextInputAction.done, - autofillHints: const [AutofillHints.name], - onChanged: (_) => setState(() => _error = null), - onSubmitted: (_) => _submit(context), - ), - if (state.failure != null) - ApiFailureText(failure: state.failure!), - ], - ), - ); - }, - ), - ); - } - - Future _submit(BuildContext context) async { - if (_name.text.trim().isEmpty) { - setState(() => _error = context.l10n.profileNameErrEmpty); - return; - } - final session = context.read(); - final user = await context.read().save(_name.text); - if (user != null) session.onProfileCompleted(user); - } -} diff --git a/apps/driver_new/lib/features/rating/cubit/rating_cubit.dart b/apps/driver_new/lib/features/rating/cubit/rating_cubit.dart deleted file mode 100644 index 05c47e0..0000000 --- a/apps/driver_new/lib/features/rating/cubit/rating_cubit.dart +++ /dev/null @@ -1,40 +0,0 @@ -import 'package:flutter_bloc/flutter_bloc.dart'; - -import '../../../core/api/api_exception.dart'; -import '../data/rating_repository.dart'; -import 'rating_state.dart'; - -class RatingCubit extends Cubit { - RatingCubit(this._repo) : super(const RatingState()); - - final RatingRepository _repo; - - void attach(PendingRating pending) => emit(RatingState(pending: pending)); - - void setStars(int stars) => emit(state.copyWith(stars: stars)); - - void setComment(String comment) => emit(state.copyWith(comment: comment)); - - Future submit() async { - final pending = state.pending; - if (pending == null || !state.canSubmit) return; - - emit(state.copyWith(status: RatingStatus.submitting)); - try { - await _repo.rate( - pending.tripId, - state.stars, - comment: state.comment.trim().isEmpty ? null : state.comment.trim(), - ); - emit(state.copyWith(status: RatingStatus.done)); - } on ApiException catch (e) { - // 400 هنا = تقييم مزدوج، وهو نجاحٌ من منظور المستخدم: الرحلة مُقيَّمة - // فعلاً، فلا يُحبس في شاشة لا مخرج منها. - emit(state.copyWith( - status: e.statusCode == 400 - ? RatingStatus.alreadyRated - : RatingStatus.failed, - )); - } - } -} diff --git a/apps/driver_new/lib/features/rating/cubit/rating_state.dart b/apps/driver_new/lib/features/rating/cubit/rating_state.dart deleted file mode 100644 index 3053676..0000000 --- a/apps/driver_new/lib/features/rating/cubit/rating_state.dart +++ /dev/null @@ -1,38 +0,0 @@ -import 'package:equatable/equatable.dart'; - -import '../data/rating_repository.dart'; - -enum RatingStatus { idle, submitting, done, alreadyRated, failed } - -class RatingState extends Equatable { - const RatingState({ - this.status = RatingStatus.idle, - this.pending, - this.stars = 0, - this.comment = '', - }); - - final RatingStatus status; - final PendingRating? pending; - final int stars; - final String comment; - - bool get canSubmit => stars > 0 && status != RatingStatus.submitting; - - RatingState copyWith({ - RatingStatus? status, - PendingRating? pending, - int? stars, - String? comment, - }) { - return RatingState( - status: status ?? this.status, - pending: pending ?? this.pending, - stars: stars ?? this.stars, - comment: comment ?? this.comment, - ); - } - - @override - List get props => [status, pending?.tripId, stars, comment]; -} diff --git a/apps/driver_new/lib/features/rating/data/rating_repository.dart b/apps/driver_new/lib/features/rating/data/rating_repository.dart deleted file mode 100644 index 7ed24c4..0000000 --- a/apps/driver_new/lib/features/rating/data/rating_repository.dart +++ /dev/null @@ -1,40 +0,0 @@ -import '../../../core/api/api_client.dart'; - -/// رحلة تنتظر تقييماً — يرجّعها الخادم عند كل فتح للتطبيق (docs/38 §7). -class PendingRating { - const PendingRating({required this.tripId, required this.role}); - - final String tripId; - - /// الدور يحدّد نصّ السؤال: الراكب يقيّم السائق والعكس. - final String role; - - bool get isDriver => role == 'driver'; -} - -class RatingRepository { - RatingRepository(this._api); - - final ApiClient _api; - - /// `{"pending": null, "count": 0}` حين لا شيء — شكل مُتحقَّق حيّاً. - Future pending() async { - final res = await _api.get>('/trips/rating/pending'); - final pending = res['pending']; - if (pending is! Map) return null; - final tripId = pending['tripId'] as String?; - if (tripId == null) return null; - return PendingRating( - tripId: tripId, - role: pending['role'] as String? ?? 'rider', - ); - } - - /// التقييم المزدوج يرجّع **400** — تُعامَل كحالة معروفة لا كعطل. - Future rate(String tripId, int stars, {String? comment}) { - return _api.post>( - '/trips/$tripId/rate', - body: {'stars': stars, 'comment': ?comment}, - ); - } -} diff --git a/apps/driver_new/lib/features/rating/view/rating_page.dart b/apps/driver_new/lib/features/rating/view/rating_page.dart deleted file mode 100644 index 24074fc..0000000 --- a/apps/driver_new/lib/features/rating/view/rating_page.dart +++ /dev/null @@ -1,123 +0,0 @@ -import 'package:flutter/material.dart'; -import 'package:flutter_bloc/flutter_bloc.dart'; - -import '../../../core/design/tokens.dart'; -import '../../../core/design/tripz_colors.dart'; -import '../../../core/di.dart'; -import '../../../core/l10n/l10n.dart'; -import '../../../core/ui/tripz_button.dart'; -import '../../../core/ui/tripz_scaffold.dart'; -import '../../../core/ui/tripz_text_field.dart'; -import '../cubit/rating_cubit.dart'; -import '../cubit/rating_state.dart'; -import '../data/rating_repository.dart'; -import 'star_row.dart'; - -/// شاشة التقييم — **تُفرض عند فتح التطبيق** إن كانت هناك رحلة معلّقة -/// (`GET /trips/rating/pending`، docs/38 §7). لذلك بلا زرّ رجوع في الشريط: -/// الطريق الوحيد للخروج هو التقييم أو التخطّي الصريح. -class RatingPage extends StatefulWidget { - const RatingPage({super.key, required this.pending, required this.onDone}); - - final PendingRating pending; - final VoidCallback onDone; - - @override - State createState() => _RatingPageState(); -} - -class _RatingPageState extends State { - late final RatingCubit _cubit = sl()..attach(widget.pending); - final _comment = TextEditingController(); - - @override - void dispose() { - _comment.dispose(); - _cubit.close(); - super.dispose(); - } - - @override - Widget build(BuildContext context) { - final l10n = context.l10n; - // من يقيّم مَن: دور **هذا** المستخدم في الرحلة يأتي من الخادم، ولا - // يُستنتج من نوع التطبيق — الرقم نفسه قد يكون له حسابان (docs/38 §1). - final title = widget.pending.isDriver ? l10n.rateTitleDriver : l10n.rateTitle; - - return BlocProvider.value( - value: _cubit, - child: BlocConsumer( - listenWhen: (p, n) => p.status != n.status, - listener: (context, state) { - if (state.status == RatingStatus.done || - state.status == RatingStatus.alreadyRated) { - widget.onDone(); - } - }, - builder: (context, state) { - return TripzScaffold( - showAppBar: false, - bottomAction: Column( - mainAxisSize: MainAxisSize.min, - children: [ - TripzButton.primary( - label: l10n.rateSubmit, - loading: state.status == RatingStatus.submitting, - onPressed: state.canSubmit ? _cubit.submit : null, - ), - TripzButton.text( - label: l10n.rateSkip, - onPressed: widget.onDone, - ), - ], - ), - child: ListView( - children: [ - const SizedBox(height: Space.xxl), - Icon( - Icons.star_rounded, - size: 56, - color: context.tripzColors.warning, - ), - const SizedBox(height: Space.md), - Text( - title, - textAlign: TextAlign.center, - style: context.texts.headlineSmall, - ), - const SizedBox(height: Space.xs), - Text( - l10n.rateLead, - textAlign: TextAlign.center, - style: context.texts.bodyMedium?.copyWith( - color: context.colors.onSurfaceVariant, - ), - ), - const SizedBox(height: Space.lg), - StarRow(value: state.stars, onChanged: _cubit.setStars), - const SizedBox(height: Space.lg), - TripzTextField( - controller: _comment, - hint: l10n.rateComment, - onChanged: _cubit.setComment, - ), - if (state.status == RatingStatus.failed) ...[ - const SizedBox(height: Space.sm), - Text( - l10n.errorGeneric, - textAlign: TextAlign.center, - style: context.texts.bodySmall?.copyWith( - color: context.tripzColors.danger, - ), - ), - ], - // مساحة للـCTA السفلي كي لا يغطّي الحقل عند فتح الكيبورد. - const SizedBox(height: Sizes.control), - ], - ), - ); - }, - ), - ); - } -} diff --git a/apps/driver_new/lib/features/rating/view/star_row.dart b/apps/driver_new/lib/features/rating/view/star_row.dart deleted file mode 100644 index bd8f664..0000000 --- a/apps/driver_new/lib/features/rating/view/star_row.dart +++ /dev/null @@ -1,43 +0,0 @@ -import 'package:flutter/material.dart'; - -import '../../../core/design/tokens.dart'; -import '../../../core/design/tripz_colors.dart'; - -/// خمس نجوم — أهداف لمس ≥ 48 لأن الشاشة تُستعمل عادةً والمستخدم مستعجل. -class StarRow extends StatelessWidget { - const StarRow({super.key, required this.value, required this.onChanged}); - - final int value; - final ValueChanged onChanged; - - @override - Widget build(BuildContext context) { - return Row( - mainAxisAlignment: MainAxisAlignment.center, - // النجوم تُقرأ يساراً-ليميناً في اللغتين: ترتيبها ليس نصّاً. - textDirection: TextDirection.ltr, - children: List.generate(5, (i) { - final star = i + 1; - final filled = star <= value; - return IconButton( - onPressed: () => onChanged(star), - iconSize: Sizes.iconLg, - constraints: const BoxConstraints( - minWidth: Sizes.touchTarget, - minHeight: Sizes.touchTarget, - ), - icon: AnimatedSwitcher( - duration: Motion.tap, - child: Icon( - filled ? Icons.star_rounded : Icons.star_outline_rounded, - key: ValueKey(filled), - color: filled - ? context.tripzColors.warning - : context.colors.onSurfaceVariant, - ), - ), - ); - }), - ); - } -} diff --git a/apps/driver_new/lib/features/rewards/cubit/rewards_cubit.dart b/apps/driver_new/lib/features/rewards/cubit/rewards_cubit.dart deleted file mode 100644 index 4c5e601..0000000 --- a/apps/driver_new/lib/features/rewards/cubit/rewards_cubit.dart +++ /dev/null @@ -1,46 +0,0 @@ -import 'package:flutter_bloc/flutter_bloc.dart'; - -import '../../../core/api/api_exception.dart'; -import '../../../core/ui/view_status.dart'; -import '../data/rewards_repository.dart'; - -class RewardsState { - const RewardsState({ - this.status = ViewStatus.idle, - this.referrals, - this.coupons = const [], - this.error, - }); - - final ViewStatus status; - final ReferralSummary? referrals; - final List coupons; - final String? error; -} - -class RewardsCubit extends Cubit { - RewardsCubit(this._repo) : super(const RewardsState()); - - final RewardsRepository _repo; - - Future load() async { - emit(const RewardsState(status: ViewStatus.loading)); - try { - // النداءان متوازيان: لا سبب لانتظار أحدهما الآخر. - final results = await Future.wait([ - _repo.referrals(), - _repo.coupons(), - ]); - if (isClosed) return; - emit(RewardsState( - status: ViewStatus.success, - referrals: results[0] as ReferralSummary, - coupons: results[1] as List, - )); - } on ApiException catch (e) { - if (!isClosed) { - emit(RewardsState(status: ViewStatus.error, error: e.message)); - } - } - } -} diff --git a/apps/driver_new/lib/features/rewards/data/rewards_repository.dart b/apps/driver_new/lib/features/rewards/data/rewards_repository.dart deleted file mode 100644 index 7e7fcfd..0000000 --- a/apps/driver_new/lib/features/rewards/data/rewards_repository.dart +++ /dev/null @@ -1,65 +0,0 @@ -import '../../../core/api/api_client.dart'; - -/// ملخّص الدعوات — شكل مُتحقَّق حيّاً: `{code, total, pending, paid}`. -class ReferralSummary { - const ReferralSummary({ - required this.code, - required this.total, - required this.pending, - required this.paid, - }); - - /// كود دعوتي الذي أشاركه. - final String code; - - final int total; - final int pending; - final int paid; - - factory ReferralSummary.fromJson(Map json) => - ReferralSummary( - code: json['code'] as String? ?? '', - total: (json['total'] as num?)?.toInt() ?? 0, - pending: (json['pending'] as num?)?.toInt() ?? 0, - paid: (json['paid'] as num?)?.toInt() ?? 0, - ); -} - -class Coupon { - const Coupon({ - required this.code, - this.description = '', - this.expiresAt, - }); - - final String code; - final String description; - final DateTime? expiresAt; - - factory Coupon.fromJson(Map json) => Coupon( - code: json['code'] as String? ?? '', - description: json['description'] as String? ?? - json['title'] as String? ?? - '', - expiresAt: DateTime.tryParse(json['expires_at']?.toString() ?? ''), - ); -} - -class RewardsRepository { - RewardsRepository(this._api); - - final ApiClient _api; - - Future referrals() async { - final res = await _api.get>('/rewards/referrals'); - return ReferralSummary.fromJson(res); - } - - Future> coupons() async { - final res = await _api.get>('/rewards/coupons'); - return res - .whereType>() - .map(Coupon.fromJson) - .toList(growable: false); - } -} diff --git a/apps/driver_new/lib/features/rewards/view/rewards_page.dart b/apps/driver_new/lib/features/rewards/view/rewards_page.dart deleted file mode 100644 index f1ce8fc..0000000 --- a/apps/driver_new/lib/features/rewards/view/rewards_page.dart +++ /dev/null @@ -1,205 +0,0 @@ -import 'package:flutter/material.dart'; -import 'package:flutter/services.dart'; -import 'package:flutter_bloc/flutter_bloc.dart'; -import 'package:share_plus/share_plus.dart'; - -import '../../../core/design/tokens.dart'; -import '../../../core/design/tripz_colors.dart'; -import '../../../core/design/typography.dart'; -import '../../../core/di.dart'; -import '../../../core/l10n/l10n.dart'; -import '../../../core/store_links.dart'; -import '../../../core/ui/tripz_button.dart'; -import '../../../core/ui/tripz_card.dart'; -import '../../../core/ui/tripz_scaffold.dart'; -import '../cubit/rewards_cubit.dart'; - -/// «مكافآتي» — الدعوات والكوبونات في شاشة واحدة (نمط سيرو: Promos + Invite). -class RewardsPage extends StatefulWidget { - const RewardsPage({super.key}); - - @override - State createState() => _RewardsPageState(); -} - -class _RewardsPageState extends State { - late final RewardsCubit _cubit = sl()..load(); - - @override - void dispose() { - _cubit.close(); - super.dispose(); - } - - @override - Widget build(BuildContext context) { - final l10n = context.l10n; - return BlocProvider.value( - value: _cubit, - child: BlocBuilder( - builder: (context, state) { - final ref = state.referrals; - return TripzScaffold( - title: l10n.rewardsTitle, - status: state.status, - error: state.error, - onRetry: _cubit.load, - child: ListView( - children: [ - if (ref != null) _InviteCard(code: ref.code, summary: ref), - const SizedBox(height: Space.lg), - Text(l10n.rewardsCoupons, style: context.texts.titleMedium), - const SizedBox(height: Space.xs), - if (state.coupons.isEmpty) - Text( - l10n.rewardsCouponsEmpty, - style: context.texts.bodySmall?.copyWith( - color: context.colors.onSurfaceVariant, - ), - ) - else - for (final coupon in state.coupons) ...[ - TripzCard( - child: Row( - children: [ - Icon( - Icons.local_offer_outlined, - color: context.tripzColors.success, - ), - const SizedBox(width: Space.sm), - Expanded( - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Text( - coupon.code, - textDirection: TextDirection.ltr, - style: numericStyle(context.texts.titleSmall), - ), - if (coupon.description.isNotEmpty) - Text( - coupon.description, - style: context.texts.bodySmall?.copyWith( - color: context.colors.onSurfaceVariant, - ), - ), - ], - ), - ), - ], - ), - ), - const SizedBox(height: Space.xs), - ], - ], - ), - ); - }, - ), - ); - } -} - -class _InviteCard extends StatelessWidget { - const _InviteCard({required this.code, required this.summary}); - - final String code; - final dynamic summary; - - @override - Widget build(BuildContext context) { - final l10n = context.l10n; - return Container( - padding: Space.page, - decoration: BoxDecoration( - color: context.colors.primaryContainer, - borderRadius: Radii.card_, - ), - child: Column( - crossAxisAlignment: CrossAxisAlignment.stretch, - children: [ - Text( - l10n.rewardsInviteTitle, - style: context.texts.titleMedium?.copyWith( - color: context.colors.onPrimaryContainer, - ), - ), - const SizedBox(height: Space.xxs), - Text( - l10n.rewardsInviteLead, - style: context.texts.bodySmall?.copyWith( - color: context.colors.onPrimaryContainer.withValues(alpha: 0.8), - ), - ), - const SizedBox(height: Space.md), - // الكود يُنسخ ويُشارك — الطريقان اللذان يستعملهما الناس فعلاً. - Row( - children: [ - Expanded( - child: SelectableText( - code, - textDirection: TextDirection.ltr, - style: numericStyle(context.texts.headlineSmall).copyWith( - letterSpacing: 3, - color: context.colors.onPrimaryContainer, - ), - ), - ), - IconButton( - icon: const Icon(Icons.copy_rounded), - color: context.colors.onPrimaryContainer, - onPressed: () => Clipboard.setData(ClipboardData(text: code)), - ), - ], - ), - const SizedBox(height: Space.sm), - TripzButton.primary( - label: l10n.menuShare, - icon: Icons.share_outlined, - // الكود بلا رابط لا ينفع: المدعوّ لا يعرف من أين يُنزّل. ورابطُ - // **هذا** البناء لا رابطٌ ثابت — سائق يدعو سائقاً وراكب راكباً. - onPressed: () => SharePlus.instance.share( - ShareParams(text: l10n.shareMessage(code, StoreLinks.thisApp)), - ), - ), - const SizedBox(height: Space.md), - Row( - mainAxisAlignment: MainAxisAlignment.spaceAround, - children: [ - _Stat(label: l10n.rewardsInvited, value: summary.total), - _Stat(label: l10n.rewardsPending, value: summary.pending), - _Stat(label: l10n.rewardsPaid, value: summary.paid), - ], - ), - ], - ), - ); - } -} - -class _Stat extends StatelessWidget { - const _Stat({required this.label, required this.value}); - - final String label; - final int value; - - @override - Widget build(BuildContext context) { - return Column( - children: [ - Text( - '$value', - style: numericStyle(context.texts.titleLarge).copyWith( - color: context.colors.onPrimaryContainer, - ), - ), - Text( - label, - style: context.texts.labelSmall?.copyWith( - color: context.colors.onPrimaryContainer.withValues(alpha: 0.8), - ), - ), - ], - ); - } -} diff --git a/apps/driver_new/lib/features/settings/cubit/settings_cubit.dart b/apps/driver_new/lib/features/settings/cubit/settings_cubit.dart deleted file mode 100644 index 4875dff..0000000 --- a/apps/driver_new/lib/features/settings/cubit/settings_cubit.dart +++ /dev/null @@ -1,37 +0,0 @@ -import 'package:flutter/material.dart'; -import 'package:flutter_bloc/flutter_bloc.dart'; -import 'package:shared_preferences/shared_preferences.dart'; - -import 'settings_state.dart'; - -class SettingsCubit extends Cubit { - SettingsCubit(this._prefs) : super(_read(_prefs)); - - final SharedPreferences _prefs; - - static const _kTheme = 'settings.theme_mode'; - static const _kLocale = 'settings.locale'; - - /// تُقرأ **متزامنة** في الباني: تأخير القراءة يعني ومضة بالثيم الخاطئ عند - /// كل إقلاع. - static SettingsState _read(SharedPreferences prefs) { - return SettingsState( - themeMode: switch (prefs.getString(_kTheme)) { - 'light' => ThemeMode.light, - 'dark' => ThemeMode.dark, - _ => ThemeMode.system, - }, - locale: Locale(prefs.getString(_kLocale) ?? 'ar'), - ); - } - - Future setThemeMode(ThemeMode mode) async { - emit(state.copyWith(themeMode: mode)); - await _prefs.setString(_kTheme, mode.name); - } - - Future setLocale(Locale locale) async { - emit(state.copyWith(locale: locale)); - await _prefs.setString(_kLocale, locale.languageCode); - } -} diff --git a/apps/driver_new/lib/features/settings/cubit/settings_state.dart b/apps/driver_new/lib/features/settings/cubit/settings_state.dart deleted file mode 100644 index f841895..0000000 --- a/apps/driver_new/lib/features/settings/cubit/settings_state.dart +++ /dev/null @@ -1,24 +0,0 @@ -import 'package:equatable/equatable.dart'; -import 'package:flutter/material.dart'; - -/// المظهر واللغة (docs/26 §4) — محفوظان محلياً، وليسا سرّاً فيذهبان إلى -/// `SharedPreferences` لا إلى التخزين الآمن. -class SettingsState extends Equatable { - const SettingsState({ - this.themeMode = ThemeMode.system, - this.locale = const Locale('ar'), - }); - - final ThemeMode themeMode; - final Locale locale; - - SettingsState copyWith({ThemeMode? themeMode, Locale? locale}) { - return SettingsState( - themeMode: themeMode ?? this.themeMode, - locale: locale ?? this.locale, - ); - } - - @override - List get props => [themeMode, locale]; -} diff --git a/apps/driver_new/lib/features/settings/view/settings_page.dart b/apps/driver_new/lib/features/settings/view/settings_page.dart deleted file mode 100644 index c654a53..0000000 --- a/apps/driver_new/lib/features/settings/view/settings_page.dart +++ /dev/null @@ -1,213 +0,0 @@ -import 'package:flutter/material.dart'; -import 'package:flutter_bloc/flutter_bloc.dart'; -import 'package:go_router/go_router.dart'; -import 'package:package_info_plus/package_info_plus.dart'; -import 'package:share_plus/share_plus.dart'; -import 'package:url_launcher/url_launcher.dart'; - -import '../../../core/build_config.dart'; -import '../../../core/design/tokens.dart'; -import '../../../core/design/tripz_colors.dart'; -import '../../../core/design/typography.dart'; -import '../../../core/di.dart'; -import '../../../core/l10n/l10n.dart'; -import '../../../core/router.dart'; -import '../../../core/session/session_cubit.dart'; -import '../../../core/store_links.dart'; -import '../../../core/ui/tripz_scaffold.dart'; -import '../../profile/data/profile_repository.dart'; -import '../cubit/settings_cubit.dart'; -import '../cubit/settings_state.dart'; - -/// المظهر واللغة ومعلومات التطبيق — بأقسام كما في سيرو -/// (`setting_page.dart`: General · Preferences · Support & Info) بدل قائمة -/// مسطّحة بلا عناوين. -/// -/// تبديل اللغة **يقلب الاتجاه كاملاً** بلا إعادة تشغيل — `MaterialApp` -/// يشتقّ RTL/LTR من الـlocale (docs/26 §4). -class SettingsPage extends StatelessWidget { - const SettingsPage({super.key}); - - @override - Widget build(BuildContext context) { - final l10n = context.l10n; - return BlocBuilder( - builder: (context, state) { - final cubit = context.read(); - return TripzScaffold( - title: l10n.settingsTitle, - child: ListView( - children: [ - _SectionHeader(title: l10n.settingsSectionGeneral), - Text(l10n.settingsTheme, style: context.texts.titleSmall), - RadioGroup( - groupValue: state.themeMode, - onChanged: (v) => cubit.setThemeMode(v ?? ThemeMode.system), - child: Column( - children: [ - RadioListTile( - value: ThemeMode.system, - contentPadding: EdgeInsets.zero, - title: Text(l10n.settingsThemeSystem), - ), - RadioListTile( - value: ThemeMode.light, - contentPadding: EdgeInsets.zero, - title: Text(l10n.settingsThemeLight), - ), - RadioListTile( - value: ThemeMode.dark, - contentPadding: EdgeInsets.zero, - title: Text(l10n.settingsThemeDark), - ), - ], - ), - ), - const SizedBox(height: Space.md), - Text(l10n.settingsLanguage, style: context.texts.titleSmall), - RadioGroup( - groupValue: state.locale.languageCode, - // اللغة تُحفظ محلياً **وتُرسل للخادم**: الإشعارات تُصاغ على - // الخادم بلغة المستخدم المخزّنة عنده (`PATCH /users/me` - // يقبل `language` — docs/38 §3)، فلغةٌ محليّة وحدها تعني - // واجهةً عربية وإشعاراتٍ إنجليزية. - onChanged: (v) => _setLanguage(context, v ?? 'ar'), - child: Column( - children: [ - RadioListTile( - value: 'ar', - contentPadding: EdgeInsets.zero, - title: Text(l10n.settingsLanguageArabic), - ), - RadioListTile( - value: 'en', - contentPadding: EdgeInsets.zero, - title: Text(l10n.settingsLanguageEnglish), - ), - ], - ), - ), - - _SectionHeader(title: l10n.settingsSectionSupport), - _Tile( - icon: Icons.help_outline_rounded, - title: l10n.menuSupport, - subtitle: l10n.settingsSupportLead, - onTap: () => context.push(Routes.support), - ), - _Tile( - icon: Icons.share_outlined, - title: l10n.menuShare, - subtitle: l10n.settingsShareLead, - onTap: () => SharePlus.instance.share( - ShareParams(text: l10n.shareMessagePlain(StoreLinks.thisApp)), - ), - ), - _Tile( - icon: Icons.shield_outlined, - title: l10n.menuPrivacy, - onTap: () async { - final uri = Uri.tryParse(BuildConfig.privacyUrl); - if (uri == null) return; - await launchUrl(uri, mode: LaunchMode.externalApplication); - }, - ), - const _VersionTile(), - ], - ), - ); - }, - ); - } - - /// فشل الخادم **لا يمنع** تبديل اللغة محلياً: الواجهة تستجيب فوراً، - /// والمزامنة تُعاد عند التبديل التالي. عكسه يعني زرّاً لا يستجيب بلا شبكة. - static Future _setLanguage(BuildContext context, String code) async { - await context.read().setLocale(Locale(code)); - try { - final user = await sl().update(language: code); - sl().onProfileCompleted(user); - } catch (_) { - // المزامنة أفضل-جهد — لا رسالة خطأ على تبديل نجح محلياً. - } - } -} - -class _SectionHeader extends StatelessWidget { - const _SectionHeader({required this.title}); - - final String title; - - @override - Widget build(BuildContext context) { - return Padding( - padding: const EdgeInsets.only(top: Space.lg, bottom: Space.xs), - child: Text( - title, - style: context.texts.labelMedium?.copyWith( - color: context.colors.primary, - ), - ), - ); - } -} - -class _Tile extends StatelessWidget { - const _Tile({ - required this.icon, - required this.title, - required this.onTap, - this.subtitle, - }); - - final IconData icon; - final String title; - final String? subtitle; - final VoidCallback onTap; - - @override - Widget build(BuildContext context) { - return ListTile( - contentPadding: EdgeInsets.zero, - leading: Icon(icon), - title: Text(title), - subtitle: subtitle == null ? null : Text(subtitle!), - trailing: Icon( - Icons.chevron_left_rounded, - color: context.colors.onSurfaceVariant, - ), - onTap: onTap, - ); - } -} - -/// رقم الإصدار — أول ما يُسأل عنه في الدعم، وكان غائباً رغم وجود مفتاح -/// ترجمته أصلاً. -class _VersionTile extends StatelessWidget { - const _VersionTile(); - - @override - Widget build(BuildContext context) { - final l10n = context.l10n; - return FutureBuilder( - future: PackageInfo.fromPlatform(), - builder: (context, snapshot) { - final info = snapshot.data; - return ListTile( - contentPadding: EdgeInsets.zero, - leading: const Icon(Icons.info_outline_rounded), - title: Text(l10n.aboutVersion), - trailing: Text( - // قبل وصول المعلومة يُترك المكان فارغاً لا «—»: القيمة تصل - // في إطار واحد، والشرطة تومض بلا داعٍ. - info == null ? '' : '${info.version} (${info.buildNumber})', - textDirection: TextDirection.ltr, - style: numericStyle(context.texts.bodySmall).copyWith( - color: context.colors.onSurfaceVariant, - ), - ), - ); - }, - ); - } -} diff --git a/apps/driver_new/lib/features/splash/view/splash_page.dart b/apps/driver_new/lib/features/splash/view/splash_page.dart deleted file mode 100644 index c043869..0000000 --- a/apps/driver_new/lib/features/splash/view/splash_page.dart +++ /dev/null @@ -1,69 +0,0 @@ -import 'package:flutter/material.dart'; -import 'package:flutter_bloc/flutter_bloc.dart'; - -import '../../../core/build_config.dart'; -import '../../../core/config.dart'; -import '../../../core/design/tokens.dart'; -import '../../../core/design/tripz_colors.dart'; -import '../../../core/l10n/l10n.dart'; -import '../../../core/session/session_cubit.dart'; -import '../../../core/tenant/tenant_cubit.dart'; - -/// شاشة الإقلاع: تستعيد الجلسة ثم يتولّى الراوتر التوجيه. لا تنقّل من هنا — -/// قرار الوجهة في مكان واحد (`core/router.dart`). -class SplashPage extends StatefulWidget { - const SplashPage({super.key}); - - @override - State createState() => _SplashPageState(); -} - -class _SplashPageState extends State { - @override - void initState() { - super.initState(); - // بعد أول إطار: `restore` قد يُصدر حالة فوراً، وإصدارها أثناء البناء خطأ. - WidgetsBinding.instance.addPostFrameCallback((_) { - if (!mounted) return; - // إعداد المستأجر بلا توكن — يُجلب بالتوازي مع استعادة الجلسة لا بعدها. - context.read().load(); - context.read().restore(); - }); - } - - @override - Widget build(BuildContext context) { - return Scaffold( - body: Center( - child: Column( - mainAxisSize: MainAxisSize.min, - children: [ - Image.asset(BuildConfig.logoAsset, width: 140, height: 140), - const SizedBox(height: Space.lg), - Text( - BuildConfig.appName, - style: context.texts.headlineMedium?.copyWith( - color: context.colors.primary, - ), - ), - const SizedBox(height: Space.xs), - Text( - AppConfig.appRole == 'driver' - ? context.l10n.splashDriver - : context.l10n.splashRider, - style: context.texts.bodyMedium?.copyWith( - color: context.colors.onSurfaceVariant, - ), - ), - const SizedBox(height: Space.xl), - const SizedBox( - width: 28, - height: 28, - child: CircularProgressIndicator(strokeWidth: 2.5), - ), - ], - ), - ), - ); - } -} diff --git a/apps/driver_new/lib/features/support/view/support_page.dart b/apps/driver_new/lib/features/support/view/support_page.dart deleted file mode 100644 index 1e74afd..0000000 --- a/apps/driver_new/lib/features/support/view/support_page.dart +++ /dev/null @@ -1,169 +0,0 @@ -import 'package:flutter/material.dart'; -import 'package:geolocator/geolocator.dart'; -import 'package:permission_handler/permission_handler.dart'; -import 'package:url_launcher/url_launcher.dart'; - -import '../../../core/build_config.dart'; -import '../../../core/design/tokens.dart'; -import '../../../core/design/tripz_colors.dart'; -import '../../../core/l10n/l10n.dart'; -import '../../../core/ui/tripz_card.dart'; -import '../../../core/ui/tripz_scaffold.dart'; - -/// المساعدة: أسئلة شائعة · تواصل · فحص توافق الجهاز · عن التطبيق. -/// -/// المحتوى **محلّي عمداً**: الخادم لا يوفّر نقطة أسئلة شائعة، وربطها بالشبكة -/// يعني شاشة فارغة حين ينقطع الاتصال — وهو بالضبط الوقت الذي يفتح فيه -/// المستخدم المساعدة. -class SupportPage extends StatelessWidget { - const SupportPage({super.key}); - - @override - Widget build(BuildContext context) { - final l10n = context.l10n; - final faq = [ - (l10n.supportFaqQ1, l10n.supportFaqA1), - (l10n.supportFaqQ2, l10n.supportFaqA2), - (l10n.supportFaqQ3, l10n.supportFaqA3), - (l10n.supportFaqQ4, l10n.supportFaqA4), - ]; - - return TripzScaffold( - title: l10n.supportTitle, - child: ListView( - children: [ - Text(l10n.supportFaq, style: context.texts.titleMedium), - const SizedBox(height: Space.xs), - for (final (q, a) in faq) - Card( - margin: const EdgeInsets.only(bottom: Space.xs), - child: ExpansionTile( - shape: const RoundedRectangleBorder(borderRadius: Radii.card_), - title: Text(q, style: context.texts.bodyMedium), - children: [ - Padding( - padding: Space.page, - child: Text( - a, - style: context.texts.bodySmall?.copyWith( - color: context.colors.onSurfaceVariant, - ), - ), - ), - ], - ), - ), - - const SizedBox(height: Space.lg), - Text(l10n.supportContact, style: context.texts.titleMedium), - const SizedBox(height: Space.xs), - TripzCard( - onTap: () => _openWhatsapp(BuildConfig.supportPhone), - child: Row( - children: [ - Icon(Icons.chat_outlined, color: context.tripzColors.success), - const SizedBox(width: Space.sm), - Expanded(child: Text(l10n.supportWhatsapp)), - const Icon(Icons.chevron_left_rounded), - ], - ), - ), - - const SizedBox(height: Space.md), - TripzCard( - onTap: () => _showDeviceCheck(context), - child: Row( - children: [ - const Icon(Icons.phonelink_setup_outlined), - const SizedBox(width: Space.sm), - Expanded(child: Text(l10n.supportDeviceCheck)), - const Icon(Icons.chevron_left_rounded), - ], - ), - ), - - const SizedBox(height: Space.lg), - TripzCard( - child: Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - Text(l10n.aboutVersion, style: context.texts.bodyMedium), - Text( - BuildConfig.appName, - style: context.texts.bodyMedium?.copyWith( - color: context.colors.onSurfaceVariant, - ), - ), - ], - ), - ), - ], - ), - ); - } - - static Future _openWhatsapp(String phone) async { - final uri = Uri.parse('https://wa.me/$phone'); - await launchUrl(uri, mode: LaunchMode.externalApplication); - } - - /// فحص توافق الجهاز — نمط سيرو. يفحص ما يُعطّل التطبيق فعلاً: خدمة الموقع - /// وإذنها وإذن الإشعارات. أسبابٌ حقيقية لشكاوى «التطبيق لا يعمل». - static Future _showDeviceCheck(BuildContext context) async { - final l10n = context.l10n; - final issues = []; - - if (!await Geolocator.isLocationServiceEnabled()) { - issues.add(l10n.rideNoLocation); - } - final locationPermission = await Permission.locationWhenInUse.status; - if (!locationPermission.isGranted && !locationPermission.isLimited) { - issues.add(l10n.permissionDeniedForever); - } - if (await Permission.notification.isDenied) { - issues.add(l10n.notifDenied); - } - - if (!context.mounted) return; - showDialog( - context: context, - builder: (context) => AlertDialog( - title: Text(l10n.supportDeviceCheck), - content: Column( - mainAxisSize: MainAxisSize.min, - crossAxisAlignment: CrossAxisAlignment.start, - children: issues.isEmpty - ? [ - Row(children: [ - Icon(Icons.check_circle_rounded, - color: context.tripzColors.success), - const SizedBox(width: Space.xs), - Expanded(child: Text(l10n.supportDeviceOk)), - ]), - ] - : [ - Text(l10n.supportDeviceIssues), - const SizedBox(height: Space.xs), - for (final issue in issues) - Padding( - padding: const EdgeInsets.only(bottom: Space.xxs), - child: Row(children: [ - Icon(Icons.error_outline_rounded, - size: Sizes.iconSm, - color: context.tripzColors.warning), - const SizedBox(width: Space.xs), - Expanded(child: Text(issue)), - ]), - ), - ], - ), - actions: [ - TextButton( - onPressed: () => Navigator.of(context).pop(), - child: Text(l10n.actionContinue), - ), - ], - ), - ); - } -} diff --git a/apps/driver_new/lib/features/trip/cubit/duty_cubit.dart b/apps/driver_new/lib/features/trip/cubit/duty_cubit.dart deleted file mode 100644 index b3a6dd9..0000000 --- a/apps/driver_new/lib/features/trip/cubit/duty_cubit.dart +++ /dev/null @@ -1,278 +0,0 @@ -import 'dart:async'; - -import 'package:flutter_bloc/flutter_bloc.dart'; - -import '../../../core/api/api_exception.dart'; -import '../../../core/location/location_service.dart'; -import '../../../core/realtime/realtime_service.dart'; -import '../data/models/geo_point.dart'; -import '../data/maps_repository.dart'; -import '../data/models/trip.dart'; -import '../data/trip_repository.dart'; -import 'duty_state.dart'; - -/// دوام السائق: الاتصال ← استقبال العروض ← القبول ← إدارة الرحلة. -class DutyCubit extends Cubit { - DutyCubit({ - required TripRepository trips, - required LocationService location, - required RealtimeService realtime, - required MapsRepository maps, - }) : _trips = trips, - _location = location, - _realtime = realtime, - _maps = maps, - super(const DutyState()); - - final TripRepository _trips; - final LocationService _location; - final RealtimeService _realtime; - final MapsRepository _maps; - - StreamSubscription? _events; - Timer? _offerTimer; - - @override - Future close() { - _events?.cancel(); - _offerTimer?.cancel(); - _location.stop(); - return super.close(); - } - - Future init() async { - _events = _realtime.events.listen(_onRealtime); - await _realtime.connect(); - unawaited(_loadCredit()); - unawaited(_resumeActiveTrip()); - } - - Future _loadCredit() async { - try { - final credit = await _trips.credit(); - if (isClosed) return; - emit(state.copyWith( - creditBalance: credit.balance, - creditBlocked: credit.blocked, - )); - } on ApiException { - // الرصيد معلومة مساعدة لا حاجز إقلاع. - } - } - - Future _resumeActiveTrip() async { - try { - final live = (await _trips.mine()).where((t) => t.status.isLive); - if (isClosed || live.isEmpty) return; - _attachTrip(live.first); - } on ApiException { - // لا رحلة جارية. - } - } - - // ── الاتصال ──────────────────────────────────────────────────────────── - - Future toggleOnline() async { - final goingOnline = !state.isOnline; - emit(state.copyWith(busy: true, error: DutyError.none)); - try { - await _trips.setOnline(goingOnline); - if (isClosed) return; - - if (goingOnline) { - // الموقع يُرفع فور الاتصال: سائقٌ متصل بلا موقع لا يصله عمل. - _location.listen(_onPosition); - emit(state.copyWith(phase: DutyPhase.waiting, busy: false)); - } else { - await _location.stop(); - emit(state.copyWith( - phase: DutyPhase.offline, - busy: false, - clearOffer: true, - )); - } - } on ApiException { - if (!isClosed) { - emit(state.copyWith(busy: false, error: DutyError.goOnlineFailed)); - } - } - } - - void _onPosition(dynamic position) { - final lat = position.latitude as double; - final lng = position.longitude as double; - final heading = position.heading as double?; - - emit(state.copyWith(myLocation: GeoPoint(lat, lng))); - _refreshNavRoute(GeoPoint(lat, lng)); - - // مساران عمداً: REST يغذّي المطابقة في Redis، والسوكت يغذّي خريطة - // الراكب الحيّة. سقوط أحدهما لا يُعمي الآخر. - unawaited(_trips - .pushLocation(GeoPoint(lat, lng), heading: heading) - .catchError((_) {})); - _realtime.sendDriverLocation(lat, lng, heading: heading); - } - - // ── العروض ───────────────────────────────────────────────────────────── - - void _showOffer(Trip offer) { - if (state.phase == DutyPhase.active) return; // مشغول برحلة - _offerTimer?.cancel(); - emit(state.copyWith( - offer: offer, - phase: DutyPhase.offered, - error: DutyError.none, - )); - - // العرض لا يبقى معلّقاً إلى الأبد: الخادم قد يعطيه لغيره بلا إشعارنا. - _offerTimer = Timer(const Duration(seconds: 25), dismissOffer); - } - - void dismissOffer() { - _offerTimer?.cancel(); - if (isClosed) return; - emit(state.copyWith( - clearOffer: true, - phase: state.trip != null ? DutyPhase.active : DutyPhase.waiting, - )); - } - - Future acceptOffer() async { - final offer = state.offer; - if (offer == null) return; - _offerTimer?.cancel(); - emit(state.copyWith(busy: true, error: DutyError.none)); - try { - await _trips.accept(offer.id); - _attachTrip(await _trips.get(offer.id)); - } on ApiException catch (e) { - if (isClosed) return; - // القبول ذرّي: أول سائق يفوز، والباقي يُرفض. هذا ليس عطلاً — يُعرض - // «سبقك سائق آخر» لا رسالة خطأ عامة. - emit(state.copyWith( - busy: false, - clearOffer: true, - phase: DutyPhase.waiting, - error: e.isForbidden || e.statusCode == 409 - ? DutyError.offerTaken - : DutyError.acceptFailed, - )); - } - } - - // ── الرحلة ───────────────────────────────────────────────────────────── - - /// الانتقال التالي في آلة الحالات — الشاشة لا تقرّره (docs/38 §4). - TripStatus? get nextStatus => switch (state.trip?.status) { - TripStatus.assigned => TripStatus.driverArriving, - TripStatus.driverArriving => TripStatus.driverArrived, - TripStatus.driverArrived => TripStatus.inProgress, - TripStatus.inProgress => TripStatus.completed, - _ => null, - }; - - Future advanceTrip() async { - final trip = state.trip; - final next = nextStatus; - if (trip == null || next == null) return; - - emit(state.copyWith(busy: true, error: DutyError.none)); - try { - await _trips.updateStatus(trip.id, next); - _attachTrip(await _trips.get(trip.id)); - // العمولة تُخصم من الرصيد التشغيلي عند الإنهاء — يُحدَّث فوراً. - if (next == TripStatus.completed) unawaited(_loadCredit()); - } on ApiException { - if (!isClosed) { - emit(state.copyWith(busy: false, error: DutyError.statusFailed)); - } - } - } - - void _attachTrip(Trip trip) { - _realtime.joinTrip(trip.id); - if (trip.status.isOver) { - emit(state.copyWith( - clearTrip: true, - clearOffer: true, - busy: false, - phase: state.isOnline ? DutyPhase.waiting : DutyPhase.offline, - )); - return; - } - emit(state.copyWith( - trip: trip, - clearOffer: true, - busy: false, - phase: DutyPhase.active, - )); - - // الهدف يتبدّل مع الحالة (الراكب ← الوجهة)، فالمسار يُعاد فوراً عند كل - // انتقال بدل انتظار نبضة الموقع التالية. - _lastNavFrom = null; - final me = state.myLocation; - if (me != null) _refreshNavRoute(me); - } - - // ── مسار القيادة ─────────────────────────────────────────────────────── - - /// أقلّ إزاحة تستدعي إعادة الحساب (~50 متراً) — نفس منطق الراكب: يلتقط - /// الانعطاف الفعلي ويتجاهل رجفة GPS. - static const double _redrawThreshold = 0.0005; - - GeoPoint? _lastNavFrom; - bool _routing = false; - - void _refreshNavRoute(GeoPoint from) { - final target = state.navTarget; - if (target == null) { - if (state.navRoute != null) emit(state.copyWith(clearNavRoute: true)); - _lastNavFrom = null; - return; - } - if (_routing) return; - - final last = _lastNavFrom; - final moved = last == null || - (from.lat - last.lat).abs() > _redrawThreshold || - (from.lng - last.lng).abs() > _redrawThreshold; - if (!moved) return; - - _lastNavFrom = from; - unawaited(_route(from, target)); - } - - Future _route(GeoPoint from, GeoPoint to) async { - _routing = true; - try { - final route = await _maps.route(from, to); - if (!isClosed) emit(state.copyWith(navRoute: route)); - } on ApiException { - // مسارٌ متعذّر لا يوقف الرحلة — السائق يرى النقطة ولو بلا خط، - // وتُعاد المحاولة مع الحركة التالية. - } finally { - _routing = false; - } - } - - void _onRealtime(RealtimeEvent event) { - switch (event.name) { - case RealtimeEvent.tripOffer: - _showOffer(Trip.fromJson(event.data)); - - case RealtimeEvent.tripOfferTaken: - final id = event.data['id'] ?? event.data['tripId']; - if (id == state.offer?.id) { - dismissOffer(); - emit(state.copyWith(error: DutyError.offerTaken)); - } - - case RealtimeEvent.tripUpdate: - final id = event.data['id'] ?? event.data['tripId']; - if (id != null && id == state.trip?.id) { - _attachTrip(Trip.fromJson(event.data)); - } - } - } -} diff --git a/apps/driver_new/lib/features/trip/cubit/duty_state.dart b/apps/driver_new/lib/features/trip/cubit/duty_state.dart deleted file mode 100644 index 5867c96..0000000 --- a/apps/driver_new/lib/features/trip/cubit/duty_state.dart +++ /dev/null @@ -1,113 +0,0 @@ -import 'package:equatable/equatable.dart'; - -import '../data/models/geo_point.dart'; -import '../data/models/route_info.dart'; -import '../data/models/trip.dart'; - -/// حالة السائق. الفرق الجوهري عن الراكب: السائق **يستقبل** عملاً بدل أن -/// يطلبه، فالمحور هنا الاتصال والعرض لا التخطيط. -enum DutyPhase { - /// غير متصل — لا يصله شيء. - offline, - - /// متصل بانتظار عرض. - waiting, - - /// عرض معروض بمؤقّت. - offered, - - /// رحلة مقبولة جارية. - active, -} - -enum DutyError { none, goOnlineFailed, acceptFailed, offerTaken, statusFailed } - -class DutyState extends Equatable { - const DutyState({ - this.phase = DutyPhase.offline, - this.myLocation, - this.offer, - this.trip, - this.busy = false, - this.error = DutyError.none, - this.creditBalance, - this.creditBlocked = false, - this.navRoute, - }); - - final DutyPhase phase; - final GeoPoint? myLocation; - - /// العرض المعروض حالياً — يختفي إن سبق إليه سائق آخر. - final Trip? offer; - - final Trip? trip; - final bool busy; - final DutyError error; - - /// الرصيد التشغيلي: العمولة تُخصم منه عند الإنهاء (docs/38 §5). - final String? creditBalance; - - /// محجوب لنفاد الرصيد — لا يصله عمل، ولا بد أن يعرف السبب صراحةً. - final bool creditBlocked; - - /// المسار الذي يقوده السائق الآن: إليه إن كان مقترباً، وإلى وجهة الراكب - /// إن كانت الرحلة جارية. **بلا هذا السائق أعمى** — كان يرى موقعه وحده. - final RouteInfo? navRoute; - - /// الهدف الحالي للقيادة — نقطة الراكب أثناء الاقتراب، ثم الوجهة. - /// - /// آلة الحالات هي من تقرّره لا الشاشة (docs/38 §4). - GeoPoint? get navTarget => switch (trip?.status) { - TripStatus.assigned || - TripStatus.driverArriving || - TripStatus.driverArrived => - trip?.origin, - TripStatus.inProgress => trip?.destination, - _ => null, - }; - - bool get isOnline => phase != DutyPhase.offline; - - DutyState copyWith({ - DutyPhase? phase, - GeoPoint? myLocation, - Trip? offer, - Trip? trip, - bool? busy, - DutyError? error, - String? creditBalance, - bool? creditBlocked, - RouteInfo? navRoute, - bool clearOffer = false, - bool clearTrip = false, - bool clearNavRoute = false, - }) { - return DutyState( - phase: phase ?? this.phase, - myLocation: myLocation ?? this.myLocation, - offer: clearOffer ? null : (offer ?? this.offer), - trip: clearTrip ? null : (trip ?? this.trip), - busy: busy ?? this.busy, - error: error ?? this.error, - creditBalance: creditBalance ?? this.creditBalance, - creditBlocked: creditBlocked ?? this.creditBlocked, - navRoute: clearNavRoute || clearTrip - ? null - : (navRoute ?? this.navRoute), - ); - } - - @override - List get props => [ - phase, - myLocation, - offer, - trip, - busy, - error, - creditBalance, - creditBlocked, - navRoute, - ]; -} diff --git a/apps/driver_new/lib/features/trip/cubit/history_cubit.dart b/apps/driver_new/lib/features/trip/cubit/history_cubit.dart deleted file mode 100644 index 3901e20..0000000 --- a/apps/driver_new/lib/features/trip/cubit/history_cubit.dart +++ /dev/null @@ -1,41 +0,0 @@ -import 'package:flutter_bloc/flutter_bloc.dart'; - -import '../../../core/api/api_exception.dart'; -import '../../../core/ui/view_status.dart'; -import '../data/history_repository.dart'; -import '../data/models/trip.dart'; - -class HistoryState { - const HistoryState({ - this.status = ViewStatus.idle, - this.trips = const [], - this.error, - }); - - final ViewStatus status; - final List trips; - final String? error; -} - -class HistoryCubit extends Cubit { - HistoryCubit(this._repo) : super(const HistoryState()); - - final HistoryRepository _repo; - - Future load() async { - emit(const HistoryState(status: ViewStatus.loading)); - try { - final trips = await _repo.trips(); - if (isClosed) return; - // قائمة فارغة ليست خطأ — لها حالتها الخاصة في TripzScaffold. - emit(HistoryState( - status: trips.isEmpty ? ViewStatus.empty : ViewStatus.success, - trips: trips, - )); - } on ApiException catch (e) { - if (!isClosed) { - emit(HistoryState(status: ViewStatus.error, error: e.message)); - } - } - } -} diff --git a/apps/driver_new/lib/features/trip/data/history_repository.dart b/apps/driver_new/lib/features/trip/data/history_repository.dart deleted file mode 100644 index 7667b08..0000000 --- a/apps/driver_new/lib/features/trip/data/history_repository.dart +++ /dev/null @@ -1,18 +0,0 @@ -import '../../../core/api/api_client.dart'; -import 'models/trip.dart'; - -/// سجلّ الرحلات. لا يستورد ميزة الرحلة كمنطق — يعيد استعمال نموذجها فقط، -/// وهو الشكل الذي يرجّعه الخادم نفسه لكلا النقطتين. -class HistoryRepository { - HistoryRepository(this._api); - - final ApiClient _api; - - Future> trips() async { - final res = await _api.get>('/trips/mine'); - return res - .whereType>() - .map(Trip.fromJson) - .toList(growable: false); - } -} diff --git a/apps/driver_new/lib/features/trip/data/maps_repository.dart b/apps/driver_new/lib/features/trip/data/maps_repository.dart deleted file mode 100644 index b89c500..0000000 --- a/apps/driver_new/lib/features/trip/data/maps_repository.dart +++ /dev/null @@ -1,58 +0,0 @@ -import '../../../core/api/antlaq_api.dart'; -import 'models/geo_point.dart'; -import 'models/place.dart'; -import 'models/route_info.dart'; - -/// كل الخرائط من map-saas مباشرة (قرار 2026-07-20). نقاط `/maps/*` في باك إند -/// تريبز **لا تُستعمل** — إحداها (`geocode`) معطوبة على المنشور أصلاً. -class MapsRepository { - MapsRepository(this._api); - - final AntlaqApi _api; - - /// ⚠️ **الغلافان مختلفان بين النقطتين** (مثبت بـcurl 2026-08-05): - /// `search` يرجّع `{"results":[…]}` بينما `reverse` يرجّع **مصفوفة عارية**. - /// افتراض أن كليهما مصفوفة كان يُفشل البحث صامتاً — فيبدو للمستخدم أن - /// «البحث لا يستجيب» بينما التحديد من الخريطة يعمل. - Future> search(String query, {GeoPoint? near}) async { - if (query.trim().isEmpty) return const []; - final res = await _api.get>( - '/geocoding/search', - query: { - 'q': query.trim(), - if (near != null) 'lat': near.lat, - if (near != null) 'lng': near.lng, - }, - ); - final results = res['results']; - if (results is! List) return const []; - return results - .whereType>() - .map(Place.fromJson) - .toList(growable: false); - } - - /// يرجّع **مصفوفة** مرتّبة بالأقرب — الأول هو المطلوب. تفكيكها ككائن مفرد - /// كان باگ سيرو الذي أُصلح 2026-07-20. - Future reverse(GeoPoint point) async { - final res = await _api.get>( - '/geocoding/reverse', - query: {'lat': point.lat, 'lng': point.lng}, - ); - final first = res.whereType>().firstOrNull; - return first == null ? null : Place.fromJson(first); - } - - Future route(GeoPoint from, GeoPoint to) async { - final res = await _api.get>( - '/maps/route', - query: { - 'fromLat': from.lat, - 'fromLng': from.lng, - 'toLat': to.lat, - 'toLng': to.lng, - }, - ); - return RouteInfo.fromJson(res); - } -} diff --git a/apps/driver_new/lib/features/trip/data/models/fare_quote.dart b/apps/driver_new/lib/features/trip/data/models/fare_quote.dart deleted file mode 100644 index 898993c..0000000 --- a/apps/driver_new/lib/features/trip/data/models/fare_quote.dart +++ /dev/null @@ -1,42 +0,0 @@ -import 'package:equatable/equatable.dart'; - -/// تسعيرة مسبقة من `POST /tariff/quote`. -/// -/// ⚠️ مصيدتان مثبتتان (docs/38 §7): -/// 1. هذه النقطة **camelCase وحدها** بخلاف كل الـAPI. -/// 2. بالمعاملات الخطأ ترجّع **200 بقيم `null` صامتة** لا خطأً — لذلك -/// [isUsable] شرطٌ قبل عرض أي رقم للمستخدم. -class FareQuote extends Equatable { - const FareQuote({ - required this.total, - required this.currency, - this.subtotal, - this.surgeMultiplier = 1, - this.window = '', - }); - - final double? total; - final String currency; - final double? subtotal; - final double surgeMultiplier; - final String window; - - factory FareQuote.fromJson(Map json) { - final quote = (json['quote'] as Map?) ?? const {}; - return FareQuote( - total: (quote['total'] as num?)?.toDouble(), - currency: quote['currency'] as String? ?? '', - subtotal: (quote['subtotal'] as num?)?.toDouble(), - surgeMultiplier: (quote['surgeMultiplier'] as num?)?.toDouble() ?? 1, - window: quote['window'] as String? ?? '', - ); - } - - bool get isUsable => total != null && total! > 0; - - /// تسعير مرتفع — يُعرض للمستخدم صراحةً قبل التأكيد لا بعده. - bool get hasSurge => surgeMultiplier > 1; - - @override - List get props => [total, currency, subtotal, surgeMultiplier]; -} diff --git a/apps/driver_new/lib/features/trip/data/models/geo_point.dart b/apps/driver_new/lib/features/trip/data/models/geo_point.dart deleted file mode 100644 index b9a5f3a..0000000 --- a/apps/driver_new/lib/features/trip/data/models/geo_point.dart +++ /dev/null @@ -1,22 +0,0 @@ -import 'package:equatable/equatable.dart'; - -/// إحداثية في طبقة النطاق — **مستقلة عن حزمة الخريطة** عمداً. -/// -/// الكيوبت والمستودع لا يعرفان `intaleq_maps`؛ التحويل يقع في الواجهة وحدها. -/// تغيير محرّك الخريطة لاحقاً لا يلمس منطقاً. -class GeoPoint extends Equatable { - const GeoPoint(this.lat, this.lng); - - final double lat; - final double lng; - - factory GeoPoint.fromJson(Map json) => GeoPoint( - (json['lat'] as num).toDouble(), - (json['lng'] as num).toDouble(), - ); - - Map toJson() => {'lat': lat, 'lng': lng}; - - @override - List get props => [lat, lng]; -} diff --git a/apps/driver_new/lib/features/trip/data/models/place.dart b/apps/driver_new/lib/features/trip/data/models/place.dart deleted file mode 100644 index 547c39f..0000000 --- a/apps/driver_new/lib/features/trip/data/models/place.dart +++ /dev/null @@ -1,44 +0,0 @@ -import 'package:equatable/equatable.dart'; - -import 'geo_point.dart'; - -/// مكان من map-saas. حقول الاسم `name`/`name_ar`/`address` — **لا -/// `formattedAddress`** (عقد مثبت بـcurl، راجع قرار الخرائط 2026-07-20). -class Place extends Equatable { - const Place({ - required this.id, - required this.name, - required this.point, - this.address = '', - this.category = '', - }); - - final String id; - final String name; - final GeoPoint point; - final String address; - final String category; - - factory Place.fromJson(Map json) { - return Place( - id: json['id']?.toString() ?? '', - // العربي أولاً — الواجهة عربية افتراضاً، والإنجليزي احتياط. - name: (json['name_ar'] as String?)?.trim().isNotEmpty == true - ? json['name_ar'] as String - : (json['name'] as String? ?? ''), - // `address` قد يصل `null` صراحةً من map-saas — لا يُسقِط النتيجة. - address: json['address'] as String? ?? '', - category: json['category'] as String? ?? '', - point: GeoPoint( - (json['latitude'] as num).toDouble(), - (json['longitude'] as num).toDouble(), - ), - ); - } - - /// ما يُعرض في حقل العنوان: الاسم، وإن غاب فالعنوان. - String get label => name.isNotEmpty ? name : address; - - @override - List get props => [id, name, point, address]; -} diff --git a/apps/driver_new/lib/features/trip/data/models/ride_type.dart b/apps/driver_new/lib/features/trip/data/models/ride_type.dart deleted file mode 100644 index eaf80e5..0000000 --- a/apps/driver_new/lib/features/trip/data/models/ride_type.dart +++ /dev/null @@ -1,47 +0,0 @@ -import 'package:equatable/equatable.dart'; - -/// نوع الرحلة كما يرجّعه `GET /ride-types` (شكل مُتحقَّق حيّاً، docs/38 §7). -/// **شاشة الاختيار تُبنى من هنا** — لا قائمة مكتوبة في التطبيق. -class RideType extends Equatable { - const RideType({ - required this.id, - required this.code, - required this.nameAr, - required this.nameEn, - required this.vehicleKind, - required this.womenOnly, - required this.roundTripSupported, - required this.sort, - this.icon, - }); - - final String id; - final String code; - final String nameAr; - final String nameEn; - final String vehicleKind; - final bool womenOnly; - final bool roundTripSupported; - final int sort; - final String? icon; - - factory RideType.fromJson(Map json) { - return RideType( - id: json['id'] as String, - code: json['code'] as String, - nameAr: json['name_ar'] as String? ?? '', - nameEn: json['name_en'] as String? ?? '', - vehicleKind: json['vehicle_kind'] as String? ?? 'car', - womenOnly: json['women_only'] as bool? ?? false, - roundTripSupported: json['round_trip_supported'] as bool? ?? false, - sort: (json['sort'] as num?)?.toInt() ?? 0, - icon: json['icon'] as String?, - ); - } - - String nameFor(String languageCode) => - languageCode == 'ar' ? nameAr : (nameEn.isEmpty ? nameAr : nameEn); - - @override - List get props => [id, code, sort]; -} diff --git a/apps/driver_new/lib/features/trip/data/models/route_info.dart b/apps/driver_new/lib/features/trip/data/models/route_info.dart deleted file mode 100644 index b913802..0000000 --- a/apps/driver_new/lib/features/trip/data/models/route_info.dart +++ /dev/null @@ -1,33 +0,0 @@ -import 'package:equatable/equatable.dart'; - -/// مسار من map-saas. المسار نفسه **encoded polyline** في حقل `points`، -/// ويُفكّ في الواجهة لا هنا (طبقة النطاق لا تعرف حزمة الخريطة). -class RouteInfo extends Equatable { - const RouteInfo({ - required this.distanceMeters, - required this.durationSeconds, - required this.encodedPoints, - this.name = '', - }); - - final double distanceMeters; - final int durationSeconds; - final String encodedPoints; - final String name; - - factory RouteInfo.fromJson(Map json) { - return RouteInfo( - distanceMeters: (json['distance'] as num?)?.toDouble() ?? 0, - durationSeconds: (json['duration'] as num?)?.round() ?? 0, - encodedPoints: json['points'] as String? ?? '', - name: json['routeName'] as String? ?? '', - ); - } - - /// التعرفة تُطلب بالكيلومترات والدقائق (docs/38 §7). - double get distanceKm => distanceMeters / 1000; - double get durationMin => durationSeconds / 60; - - @override - List get props => [distanceMeters, durationSeconds, encodedPoints]; -} diff --git a/apps/driver_new/lib/features/trip/data/models/trip.dart b/apps/driver_new/lib/features/trip/data/models/trip.dart deleted file mode 100644 index 28ee48b..0000000 --- a/apps/driver_new/lib/features/trip/data/models/trip.dart +++ /dev/null @@ -1,178 +0,0 @@ -import 'package:equatable/equatable.dart'; - -import 'geo_point.dart'; - -/// حالات الرحلة كما يعرّفها الخادم (docs/38 §4). -enum TripStatus { - searching, - assigned, - driverArriving, - driverArrived, - inProgress, - completed, - paid, - cancelled, - expired, - noDrivers, - unknown; - - static TripStatus parse(String? raw) => switch (raw) { - 'searching' => TripStatus.searching, - 'assigned' => TripStatus.assigned, - 'driver_arriving' => TripStatus.driverArriving, - 'driver_arrived' => TripStatus.driverArrived, - 'in_progress' => TripStatus.inProgress, - 'completed' => TripStatus.completed, - 'paid' => TripStatus.paid, - 'cancelled' => TripStatus.cancelled, - 'expired' => TripStatus.expired, - 'no_drivers' => TripStatus.noDrivers, - _ => TripStatus.unknown, - }; - - String get wire => switch (this) { - TripStatus.driverArriving => 'driver_arriving', - TripStatus.driverArrived => 'driver_arrived', - TripStatus.inProgress => 'in_progress', - TripStatus.noDrivers => 'no_drivers', - _ => name, - }; - - /// رحلة جارية تُستأنف عند فتح التطبيق. - bool get isLive => const { - TripStatus.searching, - TripStatus.assigned, - TripStatus.driverArriving, - TripStatus.driverArrived, - TripStatus.inProgress, - }.contains(this); - - bool get isOver => const { - TripStatus.completed, - TripStatus.paid, - TripStatus.cancelled, - TripStatus.expired, - TripStatus.noDrivers, - }.contains(this); -} - -class Trip extends Equatable { - const Trip({ - required this.id, - required this.status, - this.origin, - this.destination, - this.quotedFare, - this.priceForPassenger, - this.priceForDriver, - this.currency = '', - this.driverName, - this.driverPhone, - this.vehiclePlate, - this.vehicleModel, - this.vehicleColor, - this.vehicleColorHex, - this.driverRating, - this.requestedAt, - this.distanceKm, - this.durationMin, - this.paymentMethod, - this.serviceClass, - }); - - final String id; - final TripStatus status; - final GeoPoint? origin; - final GeoPoint? destination; - - /// أجرة مقفولة عند الطلب. - final String? quotedFare; - - /// **حقلان منفصلان** لا حقل واحد — الفرق هو العمولة (docs/38 §4). - final String? priceForPassenger; - final String? priceForDriver; - - final String currency; - final String? driverName; - final String? driverPhone; - final String? vehiclePlate; - final String? vehicleModel; - - /// لون المركبة كاسم (`White`, `أبيض`) — **ما يبحث عنه الراكب في الشارع - /// قبل اللوحة**. الخادم يرسله في `vehicle.color` - /// (`trips.service.ts:427`). - final String? vehicleColor; - - /// اللون كـhex إن وُجد (`vehicles` عندها `color_hex`). يُقدَّم على الاسم - /// عند الرسم لأنه دقيق، والاسم يبقى للعرض النصّي. - final String? vehicleColorHex; - - final String? driverRating; - - // ── حقول السجلّ ──────────────────────────────────────────────────────── - // كلها موجودة في `trip.entity.ts` وتصل مع `GET /trips/mine`، وكانت - // مُهمَلة في القراءة — فبدت بطاقة «رحلاتي» فارغة إلا من سعر وحالة. - - /// وقت الطلب (`requested_at`, `CreateDateColumn`). - final DateTime? requestedAt; - - final double? distanceKm; - final double? durationMin; - - /// `cash` افتراضاً في الخادم — يُعرض كي يعرف الراكب كيف دفع. - final String? paymentMethod; - - /// نوع الخدمة (`economy` افتراضاً). - final String? serviceClass; - - factory Trip.fromJson(Map json) { - GeoPoint? point(String key) { - final v = json[key]; - return v is Map ? GeoPoint.fromJson(v) : null; - } - - final driver = json['driver'] as Map?; - // المركبة تصل بشكلين: مسطّحة (`vehicle_plate`) في ردّ الرحلة، ومتداخلة - // (`vehicle: {plate, color}`) في حدث `assigned` (`trips.service.ts:423`). - // القراءة تقبل الاثنين بدل أن تُفرغ البطاقة عند أحدهما. - final vehicle = (json['vehicle'] ?? driver?['vehicle']) - as Map?; - return Trip( - id: json['id'] as String, - status: TripStatus.parse(json['status'] as String?), - origin: point('origin'), - destination: point('destination'), - // كل المبالغ نصوص (docs/38 §12.2) — تُحفظ كما وصلت ولا تُحوَّل هنا. - quotedFare: json['quoted_fare']?.toString(), - priceForPassenger: json['price_for_passenger']?.toString(), - priceForDriver: json['price_for_driver']?.toString(), - currency: json['currency'] as String? ?? '', - driverName: driver?['name'] as String? ?? json['driver_name'] as String?, - driverPhone: - driver?['phone'] as String? ?? json['driver_phone'] as String?, - vehiclePlate: vehicle?['plate'] as String? ?? - driver?['vehicle_plate'] as String? ?? - json['vehicle_plate'] as String?, - vehicleModel: vehicle?['model'] as String? ?? - driver?['vehicle_model'] as String? ?? - json['vehicle_model'] as String?, - vehicleColor: vehicle?['color'] as String? ?? - driver?['vehicle_color'] as String? ?? - json['vehicle_color'] as String?, - vehicleColorHex: vehicle?['color_hex'] as String? ?? - driver?['vehicle_color_hex'] as String? ?? - json['vehicle_color_hex'] as String?, - driverRating: driver?['rating']?.toString(), - requestedAt: DateTime.tryParse(json['requested_at']?.toString() ?? ''), - // المسافة الفعلية أدقّ من المقدّرة حين تتوفّر بعد انتهاء الرحلة. - distanceKm: (json['actual_distance_km'] as num?)?.toDouble() ?? - (json['distance_km'] as num?)?.toDouble(), - durationMin: (json['duration_min'] as num?)?.toDouble(), - paymentMethod: json['payment_method'] as String?, - serviceClass: json['service_class'] as String?, - ); - } - - @override - List get props => [id, status, priceForPassenger, driverName]; -} diff --git a/apps/driver_new/lib/features/trip/data/trip_repository.dart b/apps/driver_new/lib/features/trip/data/trip_repository.dart deleted file mode 100644 index 9b1afe9..0000000 --- a/apps/driver_new/lib/features/trip/data/trip_repository.dart +++ /dev/null @@ -1,128 +0,0 @@ -import '../../../core/api/api_client.dart'; -import 'models/fare_quote.dart'; -import 'models/geo_point.dart'; -import 'models/ride_type.dart'; -import 'models/trip.dart'; - -class TripRepository { - TripRepository(this._api); - - final ApiClient _api; - - Future> rideTypes() async { - final res = await _api.get>('/ride-types'); - return res - .whereType>() - .map(RideType.fromJson) - .where((t) => true) - .toList(growable: false) - ..sort((a, b) => a.sort.compareTo(b.sort)); - } - - /// ⚠️ camelCase وحدها في كل الـAPI، وتحتاج **مسافة ومدة محسوبتين مسبقاً** - /// من `/maps/route` — إرسال الإحداثيات يرجّع 200 بقيم `null` صامتة - /// (docs/38 §7). - Future quote({ - required String city, - required String serviceClass, - required double distanceKm, - required double durationMin, - }) async { - final res = await _api.post>( - '/tariff/quote', - body: { - 'city': city, - 'serviceClass': serviceClass, - 'distanceKm': distanceKm, - 'durationMin': durationMin, - }, - ); - return FareQuote.fromJson(res); - } - - /// يرجّع الرحلة وعدد السائقين الذين عُرضت عليهم — الصفر يعني «لا سائقين - /// قريبين» فوراً، بلا انتظار مهلة. - Future<({Trip trip, int offeredDrivers})> request({ - required GeoPoint origin, - required GeoPoint destination, - required String serviceClass, - String paymentMethod = 'wallet', - List stops = const [], - String? couponCode, - bool isRoundTrip = false, - }) async { - final res = await _api.post>('/trips', body: { - 'origin': origin.toJson(), - 'destination': destination.toJson(), - 'service_class': serviceClass, - 'payment_method': paymentMethod, - 'is_round_trip': isRoundTrip, - if (stops.isNotEmpty) - 'stops': stops.map((s) => s.toJson()).toList(growable: false), - 'coupon_code': ?couponCode, - }); - return ( - trip: Trip.fromJson(res['trip'] as Map), - offeredDrivers: (res['offeredDrivers'] as num?)?.toInt() ?? 0, - ); - } - - Future get(String tripId) async { - final res = await _api.get>('/trips/$tripId'); - return Trip.fromJson(res); - } - - Future> mine() async { - final res = await _api.get>('/trips/mine'); - return res - .whereType>() - .map(Trip.fromJson) - .toList(growable: false); - } - - Future cancel(String tripId) => - _api.post>('/trips/$tripId/cancel'); - - // ── طرف السائق ───────────────────────────────────────────────────────── - - Future> available() async { - final res = await _api.get>('/trips/available'); - return res - .whereType>() - .map(Trip.fromJson) - .toList(growable: false); - } - - Future accept(String tripId) => - _api.post>('/trips/$tripId/accept'); - - Future setOnline(bool online) => _api.patch>( - '/drivers/status', - body: {'online': online}, - ); - - /// نبضة الموقع إلى Redis — أساس المطابقة. مرشّح المسافة في - /// `LocationService` يمنع إغراقها. - Future pushLocation(GeoPoint point, {double? heading, double? speed}) => - _api.post>('/drivers/location', body: { - ...point.toJson(), - 'heading': ?heading, - 'speed': ?speed, - }); - - /// الرصيد التشغيلي. للراكب يرجّع 403 `Not a driver` — لا يُنادى إلا من - /// تطبيق السائق (docs/38 §5). - Future<({String balance, bool blocked})> credit() async { - final res = await _api.get>('/credit'); - return ( - balance: res['balance']?.toString() ?? '0', - blocked: res['blocked'] as bool? ?? false, - ); - } - - Future updateStatus(String tripId, TripStatus status) => - _api.patch>( - '/trips/$tripId/status', - body: {'status': status.wire}, - ); -} diff --git a/apps/driver_new/lib/features/trip/view/duty_page.dart b/apps/driver_new/lib/features/trip/view/duty_page.dart deleted file mode 100644 index e3850de..0000000 --- a/apps/driver_new/lib/features/trip/view/duty_page.dart +++ /dev/null @@ -1,220 +0,0 @@ -import 'package:flutter/material.dart'; -import 'package:flutter_bloc/flutter_bloc.dart'; - -import '../../../core/design/tokens.dart'; -import '../../../core/design/tripz_colors.dart'; -import '../../../core/di.dart'; -import '../../../core/l10n/l10n.dart'; -import '../../../core/ui/status_banner.dart'; -import '../../../core/ui/app_drawer.dart'; -import '../cubit/duty_cubit.dart'; -import '../cubit/duty_state.dart'; -import '../data/models/geo_point.dart'; -import '../data/models/route_info.dart'; -import 'widgets/active_duty_sheet.dart'; -import 'widgets/duty_toggle.dart'; -import 'widgets/offer_sheet.dart'; -import 'widgets/ride_map.dart'; - -/// نصيب الورقة السفلية من ارتفاع الشاشة — مطابق لتطبيق الراكب. -const double _sheetFraction = 0.33; - -/// ما تحتاجه الخريطة وحدها — تغيّرُ الرصيد أو الانشغال لا يعيد بناءها. -class _MapData { - const _MapData({this.me, this.pickup, this.dropoff, this.route, this.target}); - - final GeoPoint? me; - final GeoPoint? pickup; - final GeoPoint? dropoff; - final RouteInfo? route; - final GeoPoint? target; - - @override - bool operator ==(Object other) => - other is _MapData && - other.me == me && - other.pickup == pickup && - other.dropoff == dropoff && - other.route == route && - other.target == target; - - @override - int get hashCode => Object.hash(me, pickup, dropoff, route, target); -} - -/// شاشة السائق: خريطة + مفتاح الاتصال أعلى + ورقة تتبدّل بالمرحلة. -class DutyPage extends StatefulWidget { - const DutyPage({super.key}); - - @override - State createState() => _DutyPageState(); -} - -class _DutyPageState extends State { - late final DutyCubit _cubit = sl()..init(); - - @override - void dispose() { - _cubit.close(); - super.dispose(); - } - - @override - Widget build(BuildContext context) { - return BlocProvider.value( - value: _cubit, - child: Scaffold( - drawer: const AppDrawer(), - body: Stack( - children: [ - // الخريطة معزولة عن بقية الحالة: نبضة موقع كل 25 متراً يجب ألّا - // تعيد بناء الورقة والمفتاح معها. - // - // **مرفوعة عن القاع بالثلث** كما في تطبيق الراكب — الورقة لها - // مساحتها ولا تغطّي الخريطة. - Positioned( - top: 0, - left: 0, - right: 0, - bottom: MediaQuery.sizeOf(context).height * _sheetFraction, - child: BlocSelector( - selector: (s) => _MapData( - me: s.myLocation, - pickup: s.trip?.origin, - dropoff: s.trip?.destination, - route: s.navRoute, - target: s.navTarget, - ), - // السائق كان يرى **موقعه وحده**: بلا نقطة الراكب ولا الوجهة - // ولا خط يقوده. الخريطة الآن تعرض ما تعرضه خريطة الراكب: - // نقطتَي الرحلة والمسار الحيّ إلى الهدف الحالي. - builder: (context, d) => RideMap( - origin: d.pickup ?? d.me, - destination: d.dropoff, - driver: d.pickup == null ? null : d.me, - route: d.route, - // الكاميرا تتبع الهدف حين يوجد، وإلا فموقع السائق. - cameraTarget: d.target ?? d.me, - ), - ), - ), - - SafeArea( - child: Padding( - padding: Space.page, - child: Column( - children: [ - Builder( - builder: (context) => Align( - alignment: AlignmentDirectional.topStart, - child: Material( - color: context.tripzColors.surfaceRaised, - shape: const CircleBorder(), - clipBehavior: Clip.antiAlias, - child: InkWell( - onTap: Scaffold.of(context).openDrawer, - child: const Padding( - padding: EdgeInsets.all(Space.sm), - child: Icon(Icons.menu_rounded, size: Sizes.icon), - ), - ), - ), - ), - ), - const SizedBox(height: Space.xs), - BlocSelector( - selector: (s) => (online: s.isOnline, busy: s.busy), - builder: (context, d) => DutyToggle( - isOnline: d.online, - busy: d.busy, - onToggle: _cubit.toggleOnline, - ), - ), - const SizedBox(height: Space.xs), - BlocSelector( - selector: (s) => s.creditBlocked, - builder: (context, blocked) => blocked - ? StatusBanner( - message: context.l10n.creditBlocked, - tone: BannerTone.danger, - icon: Icons.account_balance_wallet_outlined, - ) - : const SizedBox.shrink(), - ), - ], - ), - ), - ), - - Align( - alignment: Alignment.bottomCenter, - child: BlocBuilder( - builder: (context, state) => _Sheet(state: state), - ), - ), - ], - ), - ), - ); - } -} - -class _Sheet extends StatelessWidget { - const _Sheet({required this.state}); - - final DutyState state; - - @override - Widget build(BuildContext context) { - final l10n = context.l10n; - - final child = switch (state.phase) { - DutyPhase.offline => const SizedBox.shrink(), - DutyPhase.waiting => Padding( - padding: const EdgeInsets.symmetric(vertical: Space.md), - child: Text( - state.error == DutyError.offerTaken - ? l10n.driverOfferTaken - : l10n.driverNoOffers, - textAlign: TextAlign.center, - style: context.texts.bodyMedium?.copyWith( - color: context.colors.onSurfaceVariant, - ), - ), - ), - DutyPhase.offered => OfferSheet(offer: state.offer!), - DutyPhase.active => - ActiveDutySheet( - trip: state.trip!, - busy: state.busy, - navRoute: state.navRoute, - ), - }; - - if (state.phase == DutyPhase.offline) return const SizedBox.shrink(); - - return Container( - width: double.infinity, - // الحدّ الأدنى = المساحة المحجوزة تحت الخريطة، وإلا ظهر فراغ بينهما. - constraints: BoxConstraints( - minHeight: MediaQuery.sizeOf(context).height * _sheetFraction, - ), - decoration: BoxDecoration( - color: context.colors.surface, - borderRadius: Radii.sheetTop, - ), - child: SafeArea( - top: false, - child: Padding( - padding: Space.page, - child: AnimatedSize( - duration: Motion.inScreen, - curve: Motion.curve, - alignment: Alignment.bottomCenter, - child: child, - ), - ), - ), - ); - } -} diff --git a/apps/driver_new/lib/features/trip/view/history_page.dart b/apps/driver_new/lib/features/trip/view/history_page.dart deleted file mode 100644 index 19381a1..0000000 --- a/apps/driver_new/lib/features/trip/view/history_page.dart +++ /dev/null @@ -1,193 +0,0 @@ -import 'package:flutter/material.dart'; -import 'package:flutter_bloc/flutter_bloc.dart'; -import 'package:intl/intl.dart'; - -import '../../../core/design/tokens.dart'; -import '../../../core/design/tripz_colors.dart'; -import '../../../core/design/typography.dart'; -import '../../../core/di.dart'; -import '../../../core/format/money.dart'; -import '../../../core/l10n/l10n.dart'; -import '../../../core/ui/empty_view.dart'; -import '../../../core/ui/tripz_card.dart'; -import '../../../core/ui/tripz_scaffold.dart'; -import '../cubit/history_cubit.dart'; -import '../data/models/trip.dart'; - -class HistoryPage extends StatefulWidget { - const HistoryPage({super.key}); - - @override - State createState() => _HistoryPageState(); -} - -class _HistoryPageState extends State { - late final HistoryCubit _cubit = sl()..load(); - - @override - void dispose() { - _cubit.close(); - super.dispose(); - } - - @override - Widget build(BuildContext context) { - final l10n = context.l10n; - return BlocProvider.value( - value: _cubit, - child: BlocBuilder( - builder: (context, state) => TripzScaffold( - title: l10n.historyTitle, - status: state.status, - error: state.error, - onRetry: _cubit.load, - empty: EmptyView( - icon: Icons.route_outlined, - message: l10n.historyEmpty, - ), - child: ListView.separated( - itemCount: state.trips.length, - separatorBuilder: (context, i) => const SizedBox(height: Space.xs), - itemBuilder: (context, i) => _TripCard(trip: state.trips[i]), - ), - ), - ), - ); - } -} - -/// بطاقة رحلة في السجلّ. -/// -/// كانت ثلاثة عناصر فقط (نقطة · حالة · سعر) — بلا تاريخ ولا مسافة ولا طريقة -/// دفع، رغم أن الخادم يرسلها كلها في `GET /trips/mine` -/// (`trip.entity.ts`: `requested_at`, `distance_km`, `duration_min`, -/// `payment_method`, `service_class`). البطاقة الآن تقرأ ما كان يصل ويُهمَل. -/// -/// **العناوين النصّية غائبة عمداً**: `trip.entity.ts` يخزّن إحداثيات -/// (`origin_lat/lng`) بلا `origin_address`، فسيرو يعرض عناوين ونحن لا نقدر -/// حتى يُضاف الحقل على الخادم. عرضُ إحداثيات خام للراكب أسوأ من لا شيء. -class _TripCard extends StatelessWidget { - const _TripCard({required this.trip}); - - final Trip trip; - - @override - Widget build(BuildContext context) { - final l10n = context.l10n; - final colors = context.tripzColors; - - final (label, color) = switch (trip.status) { - TripStatus.completed || TripStatus.paid => ( - l10n.historyStatusCompleted, - colors.success, - ), - TripStatus.cancelled || - TripStatus.expired || - TripStatus.noDrivers => - (l10n.historyStatusCancelled, colors.danger), - _ => (l10n.historyStatusLive, colors.info), - }; - - // سطر التفاصيل: ما توفّر منه فقط، بفواصل — رحلة ملغاة بلا مسافة لا - // تعرض «0 كم». - final details = [ - if (trip.distanceKm != null && trip.distanceKm! > 0) - l10n.rideDistanceKm(trip.distanceKm!.toStringAsFixed(1)), - if (trip.durationMin != null && trip.durationMin! > 0) - l10n.rideEta(trip.durationMin!.round().toString()), - ].join(' · '); - - return TripzCard( - child: Column( - crossAxisAlignment: CrossAxisAlignment.stretch, - children: [ - Row( - children: [ - Container( - width: 8, - height: 8, - decoration: BoxDecoration(color: color, shape: BoxShape.circle), - ), - const SizedBox(width: Space.sm), - Expanded( - child: Text( - label, - style: context.texts.bodyMedium?.copyWith(color: color), - ), - ), - Text( - Money.format( - trip.priceForPassenger ?? trip.quotedFare, - trip.currency, - ), - style: numericStyle(context.texts.titleSmall), - ), - ], - ), - if (trip.requestedAt != null) ...[ - const SizedBox(height: Space.xs), - Text( - DateFormat.yMMMd().add_jm().format(trip.requestedAt!.toLocal()), - style: context.texts.bodySmall?.copyWith( - color: context.colors.onSurfaceVariant, - ), - ), - ], - if (details.isNotEmpty || trip.paymentMethod != null) ...[ - const SizedBox(height: Space.xs), - Row( - children: [ - if (details.isNotEmpty) - Expanded( - child: Text( - details, - style: numericStyle(context.texts.bodySmall).copyWith( - color: context.colors.onSurfaceVariant, - ), - ), - ) - else - const Spacer(), - if (trip.paymentMethod != null) - _Tag(text: _paymentLabel(context, trip.paymentMethod!)), - ], - ), - ], - ], - ), - ); - } - - /// طرق الدفع المعروفة تُترجم؛ وأي قيمة جديدة من الخادم تُعرض كما هي بدل - /// أن تختفي. - String _paymentLabel(BuildContext context, String method) { - final l10n = context.l10n; - return switch (method) { - 'cash' => l10n.paymentCash, - 'wallet' => l10n.paymentWallet, - _ => method, - }; - } -} - -/// شارة صغيرة — طريقة الدفع في السجلّ. -class _Tag extends StatelessWidget { - const _Tag({required this.text}); - - final String text; - - @override - Widget build(BuildContext context) { - return Container( - padding: const EdgeInsets.symmetric( - horizontal: Space.xs, - vertical: Space.xxs / 2, - ), - decoration: BoxDecoration( - color: context.colors.surfaceContainerHighest, - borderRadius: Radii.field_, - ), - child: Text(text, style: context.texts.labelSmall), - ); - } -} diff --git a/apps/driver_new/lib/features/trip/view/widgets/active_duty_sheet.dart b/apps/driver_new/lib/features/trip/view/widgets/active_duty_sheet.dart deleted file mode 100644 index c1924a8..0000000 --- a/apps/driver_new/lib/features/trip/view/widgets/active_duty_sheet.dart +++ /dev/null @@ -1,95 +0,0 @@ -import 'package:flutter/material.dart'; -import 'package:flutter_bloc/flutter_bloc.dart'; -import 'package:go_router/go_router.dart'; - -import '../../../../core/design/tokens.dart'; -import '../../../../core/design/tripz_colors.dart'; -import '../../../../core/build_config.dart'; -import '../../../../core/l10n/l10n.dart'; -import '../../../../core/router.dart'; -import '../../../../core/tenant/feature_gate.dart'; -import '../../../../core/ui/tripz_button.dart'; -import '../../cubit/duty_cubit.dart'; -import '../../data/models/trip.dart'; -import '../../data/models/route_info.dart'; -import 'fare_summary.dart'; -import 'nav_eta_strip.dart'; - -/// الرحلة من طرف السائق: **زر واحد** يدفع آلة الحالات خطوة واحدة. -/// السائق لا يختار الحالة التالية — الكيوبت يشتقّها (docs/38 §4). -class ActiveDutySheet extends StatelessWidget { - const ActiveDutySheet({ - super.key, - required this.trip, - required this.busy, - this.navRoute, - }); - - final Trip trip; - final bool busy; - - /// مسار القيادة إلى الهدف الحالي — منه شريط الوقت والمسافة. - final RouteInfo? navRoute; - - @override - Widget build(BuildContext context) { - final l10n = context.l10n; - final cubit = context.read(); - - return Column( - mainAxisSize: MainAxisSize.min, - crossAxisAlignment: CrossAxisAlignment.stretch, - children: [ - Text(_statusText(context), style: context.texts.titleMedium), - if (navRoute != null) ...[ - const SizedBox(height: Space.sm), - NavEtaStrip( - minutes: navRoute!.durationMin, - km: navRoute!.distanceKm, - ), - ], - if (trip.priceForDriver != null) ...[ - const SizedBox(height: Space.sm), - // السائق يرى **أرباحه** لا أجرة الراكب: حقلان منفصلان والفرق عمولة. - FareSummary(trip: trip, forDriver: true), - ], - if (Features.chat && context.tenantHas('chat')) ...[ - const SizedBox(height: Space.sm), - TripzButton.secondary( - label: l10n.chatTitle, - icon: Icons.forum_outlined, - expanded: true, - onPressed: () => context.push('${Routes.chat}?trip=${trip.id}'), - ), - ], - const SizedBox(height: Space.md), - TripzButton.primary( - label: _actionLabel(context, cubit), - loading: busy, - onPressed: cubit.nextStatus == null ? null : cubit.advanceTrip, - ), - ], - ); - } - - String _statusText(BuildContext context) { - final l10n = context.l10n; - return switch (trip.status) { - TripStatus.assigned || TripStatus.driverArriving => l10n.driverOnTheWay, - TripStatus.driverArrived => l10n.tripDriverArrived, - TripStatus.inProgress => l10n.tripInProgress, - _ => l10n.tripCompleted, - }; - } - - String _actionLabel(BuildContext context, DutyCubit cubit) { - final l10n = context.l10n; - return switch (cubit.nextStatus) { - TripStatus.driverArriving => l10n.driverOnTheWay, - TripStatus.driverArrived => l10n.driverArrivedAction, - TripStatus.inProgress => l10n.driverStartTrip, - TripStatus.completed => l10n.driverEndTrip, - _ => l10n.tripCompleted, - }; - } -} diff --git a/apps/driver_new/lib/features/trip/view/widgets/driver_badge.dart b/apps/driver_new/lib/features/trip/view/widgets/driver_badge.dart deleted file mode 100644 index 1c5e890..0000000 --- a/apps/driver_new/lib/features/trip/view/widgets/driver_badge.dart +++ /dev/null @@ -1,140 +0,0 @@ -import 'package:flutter/material.dart'; - -import '../../../../core/design/tokens.dart'; -import '../../../../core/design/tripz_colors.dart'; -import '../../../../core/design/typography.dart'; -import '../../data/models/trip.dart'; -import 'vehicle_color.dart'; - -/// بطاقة السائق ولوحة المركبة — أهم ما يبحث عنه الراكب في الشارع، فيأخذ -/// أوضح موضع وأكبر تباين. -class DriverBadge extends StatelessWidget { - const DriverBadge({super.key, required this.trip}); - - final Trip trip; - - @override - Widget build(BuildContext context) { - if (trip.driverName == null) return const SizedBox.shrink(); - - // اللون **يُرسم لا يُكتب فقط**: الراكب يمسح الشارع بعينه بحثاً عن سيارة - // بيضاء، لا يقرأ كلمة «أبيض». نمط سيرو (`apply_order_widget.dart:333`) - // يلوّن رمز السيارة بلون المركبة الفعلي — وهذا مقابله. - final carColor = VehicleColor.resolve( - hex: trip.vehicleColorHex, - name: trip.vehicleColor, - ); - - // سطر المركبة: الموديل واللون معاً بفاصل — أحدهما قد يغيب. - final vehicleLine = [ - if (trip.vehicleModel != null && trip.vehicleModel!.isNotEmpty) - trip.vehicleModel!, - if (trip.vehicleColor != null && trip.vehicleColor!.isNotEmpty) - trip.vehicleColor!, - ].join(' • '); - - return Row( - children: [ - _CarAvatar(color: carColor), - const SizedBox(width: Space.sm), - Expanded( - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Text(trip.driverName!, style: context.texts.titleSmall), - if (vehicleLine.isNotEmpty) - Text( - vehicleLine, - style: context.texts.bodySmall?.copyWith( - color: context.colors.onSurfaceVariant, - ), - ), - if (trip.driverRating != null) - Row( - children: [ - Icon( - Icons.star_rounded, - size: Sizes.iconSm, - color: context.tripzColors.warning, - ), - const SizedBox(width: Space.xxs), - Text( - trip.driverRating!, - style: numericStyle(context.texts.bodySmall), - ), - ], - ), - ], - ), - ), - if (trip.vehiclePlate != null) _Plate(plate: trip.vehiclePlate!), - ], - ); - } -} - -/// رمز سيارة ملوّن بلون المركبة الحقيقي. -/// -/// اللون الفاتح (أبيض/بيج) يختفي على سطح فاتح، فتُرسم حلقة حدّ حوله دائماً — -/// وبها تبقى السيارة البيضاء مقروءة في الوضع النهاري. -class _CarAvatar extends StatelessWidget { - const _CarAvatar({this.color}); - - final Color? color; - - @override - Widget build(BuildContext context) { - final resolved = color ?? context.colors.onSurfaceVariant; - return Container( - width: 48, - height: 48, - decoration: BoxDecoration( - // ‏10% من لون السيارة خلفيةً — يربط الرمز بلونه بلا صراخ. - color: color?.withValues(alpha: 0.12) ?? - context.colors.surfaceContainerHighest, - shape: BoxShape.circle, - border: Border.all(color: context.colors.outlineVariant), - ), - child: Center( - child: Icon( - Icons.directions_car_filled_rounded, - size: Sizes.icon, - color: resolved, - // ظلّ خفيف كي لا تذوب السيارة البيضاء في الخلفية الفاتحة. - shadows: const [ - Shadow(color: Color(0x33000000), blurRadius: 2), - ], - ), - ), - ); - } -} - -/// لوحة مرسومة لا نصّ عادي — تُقرأ من بعيد ومن زاوية. -class _Plate extends StatelessWidget { - const _Plate({required this.plate}); - - final String plate; - - @override - Widget build(BuildContext context) { - return Container( - padding: const EdgeInsets.symmetric( - horizontal: Space.sm, - vertical: Space.xxs, - ), - decoration: BoxDecoration( - borderRadius: Radii.field_, - border: Border.all(color: context.colors.outline, width: 1.5), - color: context.tripzColors.surfaceRaised, - ), - child: Text( - plate, - textDirection: TextDirection.ltr, - style: numericStyle(context.texts.titleMedium).copyWith( - letterSpacing: 1.5, - ), - ), - ); - } -} diff --git a/apps/driver_new/lib/features/trip/view/widgets/duty_toggle.dart b/apps/driver_new/lib/features/trip/view/widgets/duty_toggle.dart deleted file mode 100644 index 5884b5f..0000000 --- a/apps/driver_new/lib/features/trip/view/widgets/duty_toggle.dart +++ /dev/null @@ -1,68 +0,0 @@ -import 'package:flutter/material.dart'; - -import '../../../../core/design/tokens.dart'; -import '../../../../core/design/tripz_colors.dart'; -import '../../../../core/l10n/l10n.dart'; - -/// مفتاح الاتصال — أهم عنصر في تطبيق السائق، فيأخذ أعلى الشاشة وأوضح تباين. -/// الحالة معروضة نصّاً ولوناً معاً: لا يعتمد السائق على لون وحده وهو يقود. -class DutyToggle extends StatelessWidget { - const DutyToggle({ - super.key, - required this.isOnline, - required this.busy, - required this.onToggle, - }); - - final bool isOnline; - final bool busy; - final VoidCallback onToggle; - - @override - Widget build(BuildContext context) { - final l10n = context.l10n; - final colors = context.tripzColors; - final color = isOnline ? colors.success : context.colors.onSurfaceVariant; - - return Material( - color: context.tripzColors.surfaceRaised, - borderRadius: Radii.card_, - child: InkWell( - onTap: busy ? null : onToggle, - borderRadius: Radii.card_, - child: Padding( - padding: Space.page, - child: Row( - children: [ - Container( - width: 12, - height: 12, - decoration: BoxDecoration(color: color, shape: BoxShape.circle), - ), - const SizedBox(width: Space.sm), - Expanded( - child: Text( - isOnline ? l10n.driverOnline : l10n.driverOffline, - style: context.texts.titleMedium?.copyWith(color: color), - ), - ), - if (busy) - const SizedBox( - width: Sizes.iconSm, - height: Sizes.iconSm, - child: CircularProgressIndicator(strokeWidth: 2.2), - ) - else - Text( - isOnline ? l10n.driverGoOffline : l10n.driverGoOnline, - style: context.texts.labelLarge?.copyWith( - color: context.colors.primary, - ), - ), - ], - ), - ), - ), - ); - } -} diff --git a/apps/driver_new/lib/features/trip/view/widgets/fare_summary.dart b/apps/driver_new/lib/features/trip/view/widgets/fare_summary.dart deleted file mode 100644 index baf4f83..0000000 --- a/apps/driver_new/lib/features/trip/view/widgets/fare_summary.dart +++ /dev/null @@ -1,51 +0,0 @@ -import 'package:flutter/material.dart'; - -import '../../../../core/design/tokens.dart'; -import '../../../../core/design/tripz_colors.dart'; -import '../../../../core/design/typography.dart'; -import '../../../../core/format/money.dart'; -import '../../../../core/l10n/l10n.dart'; -import '../../data/models/trip.dart'; - -/// ملخّص الأجرة عند الإنهاء. -/// -/// ⚠️ `price_for_passenger` و`price_for_driver` **حقلان منفصلان** والفرق -/// بينهما هو العمولة (docs/38 §4). كلٌّ يرى رقمه: الراكب ما يدفع، والسائق ما -/// يكسب — عرض رقم واحد للطرفين خطأ لا اختصار. -class FareSummary extends StatelessWidget { - const FareSummary({super.key, required this.trip, this.forDriver = false}); - - final Trip trip; - final bool forDriver; - - @override - Widget build(BuildContext context) { - final l10n = context.l10n; - final amount = forDriver ? trip.priceForDriver : trip.priceForPassenger; - - return Column( - crossAxisAlignment: CrossAxisAlignment.stretch, - children: [ - Text(l10n.tripFareTitle, style: context.texts.titleMedium), - const SizedBox(height: Space.sm), - Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - Text( - forDriver ? l10n.tripEarnings : l10n.tripFare, - style: context.texts.bodyMedium?.copyWith( - color: context.colors.onSurfaceVariant, - ), - ), - Text( - Money.format(amount, trip.currency), - style: numericStyle(context.texts.headlineSmall).copyWith( - color: forDriver ? context.tripzColors.success : null, - ), - ), - ], - ), - ], - ); - } -} diff --git a/apps/driver_new/lib/features/trip/view/widgets/map_label.dart b/apps/driver_new/lib/features/trip/view/widgets/map_label.dart deleted file mode 100644 index a30d64f..0000000 --- a/apps/driver_new/lib/features/trip/view/widgets/map_label.dart +++ /dev/null @@ -1,66 +0,0 @@ -import 'package:flutter/material.dart'; - -import '../../../../core/design/tokens.dart'; -import '../../../../core/design/tripz_colors.dart'; - -/// بطاقة اسم فوق نقطة على الخريطة — نمط سيرو: الراكب يقرأ «دوّار عبدون» على -/// الخريطة نفسها لا في الورقة السفلية وحدها، فيتأكّد أن النقطة صحيحة قبل -/// أن يطلب. -/// -/// تُرسم في طبقة فلاتر فوق الخريطة لا كـmarker: نصّ عربي داخل صورة علامة -/// يصعب ضبطه، وطبقة فلاتر تعطينا الخط والاتجاه والثيم مجاناً. -class MapLabel extends StatelessWidget { - const MapLabel({ - super.key, - required this.text, - required this.color, - this.icon, - }); - - final String text; - final Color color; - final IconData? icon; - - @override - Widget build(BuildContext context) { - if (text.isEmpty) return const SizedBox.shrink(); - return Container( - constraints: const BoxConstraints(maxWidth: 200), - padding: const EdgeInsets.symmetric( - horizontal: Space.xs, - vertical: Space.xxs, - ), - decoration: BoxDecoration( - color: context.tripzColors.surfaceRaised, - borderRadius: Radii.field_, - border: Border.all(color: color, width: 1.5), - boxShadow: [ - BoxShadow( - color: Colors.black.withValues(alpha: 0.18), - blurRadius: 6, - offset: const Offset(0, 2), - ), - ], - ), - child: Row( - mainAxisSize: MainAxisSize.min, - children: [ - Container( - width: 8, - height: 8, - decoration: BoxDecoration(color: color, shape: BoxShape.circle), - ), - const SizedBox(width: Space.xxs), - Flexible( - child: Text( - text, - maxLines: 1, - overflow: TextOverflow.ellipsis, - style: context.texts.labelMedium, - ), - ), - ], - ), - ); - } -} diff --git a/apps/driver_new/lib/features/trip/view/widgets/map_pin.dart b/apps/driver_new/lib/features/trip/view/widgets/map_pin.dart deleted file mode 100644 index 193e1e6..0000000 --- a/apps/driver_new/lib/features/trip/view/widgets/map_pin.dart +++ /dev/null @@ -1,41 +0,0 @@ -import 'package:flutter/material.dart'; - -import '../../../../core/design/tripz_colors.dart'; - -/// نقطة على الخريطة — **طبقة فلاتر لا annotation**. -/// -/// السبب في `ride_map.dart`: مديرو تعليقات MapLibre يُهدمون مع كل إعادة -/// تحميل ستايل، وإضافة دائرة في تلك النافذة تُسقط التطبيق من الطبقة الأصلية. -/// رسمها بفلاتر يزيل هذا الصنف من الأعطال كلياً، ويعطينا الثيم والحدّ الأبيض -/// مجاناً. -class MapPin extends StatelessWidget { - const MapPin({super.key, required this.color, this.icon, this.size = 28}); - - final Color color; - final IconData? icon; - final double size; - - @override - Widget build(BuildContext context) { - return Container( - width: size, - height: size, - decoration: BoxDecoration( - color: color, - shape: BoxShape.circle, - // حدّ أبيض يفصل النقطة عن أي لون بلاطة تحتها. - border: Border.all(color: context.tripzColors.surfaceRaised, width: 3), - boxShadow: [ - BoxShadow( - color: Colors.black.withValues(alpha: 0.25), - blurRadius: 4, - offset: const Offset(0, 2), - ), - ], - ), - child: icon == null - ? null - : Icon(icon, size: size * 0.5, color: Colors.white), - ); - } -} diff --git a/apps/driver_new/lib/features/trip/view/widgets/nav_eta_strip.dart b/apps/driver_new/lib/features/trip/view/widgets/nav_eta_strip.dart deleted file mode 100644 index c9cceee..0000000 --- a/apps/driver_new/lib/features/trip/view/widgets/nav_eta_strip.dart +++ /dev/null @@ -1,56 +0,0 @@ -import 'package:flutter/material.dart'; - -import '../../../../core/design/tokens.dart'; -import '../../../../core/design/tripz_colors.dart'; -import '../../../../core/l10n/l10n.dart'; - -/// «كم بقي للهدف» — الوقت والمسافة من مسار القيادة الحيّ. -/// -/// الهدف يتبدّل مع آلة الحالات: الراكب أثناء الاقتراب، ثم وجهته بعد بدء -/// الرحلة (`DutyState.navTarget`). فالشريط نفسه يخدم المرحلتين. -class NavEtaStrip extends StatelessWidget { - const NavEtaStrip({super.key, required this.minutes, required this.km}); - - final double minutes; - final double km; - - @override - Widget build(BuildContext context) { - final l10n = context.l10n; - return Container( - padding: const EdgeInsets.symmetric( - horizontal: Space.md, - vertical: Space.sm, - ), - decoration: BoxDecoration( - color: context.tripzColors.info.withValues(alpha: 0.10), - borderRadius: Radii.card_, - ), - child: Row( - mainAxisAlignment: MainAxisAlignment.center, - children: [ - Icon( - Icons.navigation_outlined, - size: Sizes.iconSm, - color: context.tripzColors.info, - ), - const SizedBox(width: Space.xs), - Text( - // أقلّ من دقيقة تُعرض «1»: «0 دقيقة» تعني «وصلتُ» وهي كذبة. - l10n.rideEta(minutes < 1 ? '1' : minutes.round().toString()), - style: context.texts.titleSmall, - ), - const SizedBox(width: Space.sm), - Text('·', style: context.texts.titleSmall), - const SizedBox(width: Space.sm), - Text( - l10n.rideDistanceKm(km.toStringAsFixed(1)), - style: context.texts.bodyMedium?.copyWith( - color: context.colors.onSurfaceVariant, - ), - ), - ], - ), - ); - } -} diff --git a/apps/driver_new/lib/features/trip/view/widgets/offer_sheet.dart b/apps/driver_new/lib/features/trip/view/widgets/offer_sheet.dart deleted file mode 100644 index b5a82bd..0000000 --- a/apps/driver_new/lib/features/trip/view/widgets/offer_sheet.dart +++ /dev/null @@ -1,126 +0,0 @@ -import 'package:flutter/material.dart'; -import 'package:flutter_bloc/flutter_bloc.dart'; - -import '../../../../core/design/tokens.dart'; -import '../../../../core/design/tripz_colors.dart'; -import '../../../../core/design/typography.dart'; -import '../../../../core/l10n/l10n.dart'; -import '../../../../core/ui/tripz_button.dart'; -import '../../cubit/duty_cubit.dart'; -import '../../data/models/trip.dart'; - -/// عرض رحلة: **رقم الأرباح أولاً**، ثم العناوين، ثم الأزرار. السائق يقرّر -/// في ثوانٍ وهو خلف المقود — الترتيب هنا ليس ذوقاً. -/// -/// شريط المؤقّت ينفد فيختفي العرض تلقائياً (`dismissOffer` في الكيوبت). -class OfferSheet extends StatefulWidget { - const OfferSheet({super.key, required this.offer}); - - final Trip offer; - - @override - State createState() => _OfferSheetState(); -} - -class _OfferSheetState extends State - with SingleTickerProviderStateMixin { - late final AnimationController _timer = AnimationController( - vsync: this, - duration: const Duration(seconds: 25), - )..forward(); - - @override - void dispose() { - _timer.dispose(); - super.dispose(); - } - - @override - Widget build(BuildContext context) { - final l10n = context.l10n; - final cubit = context.read(); - final offer = widget.offer; - - return Column( - mainAxisSize: MainAxisSize.min, - crossAxisAlignment: CrossAxisAlignment.stretch, - children: [ - AnimatedBuilder( - animation: _timer, - builder: (context, _) => LinearProgressIndicator( - value: 1 - _timer.value, - minHeight: 3, - ), - ), - const SizedBox(height: Space.md), - Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - Text(l10n.driverOfferTitle, style: context.texts.titleMedium), - if (offer.priceForDriver != null) - Text( - '${offer.priceForDriver} ${offer.currency}', - style: numericStyle(context.texts.headlineSmall).copyWith( - color: context.tripzColors.success, - ), - ), - ], - ), - const SizedBox(height: Space.md), - _AddressRow( - color: context.tripzColors.mapOrigin, - label: l10n.rideOrigin, - ), - _AddressRow( - color: context.tripzColors.mapDestination, - label: l10n.rideDestination, - ), - const SizedBox(height: Space.lg), - Row( - children: [ - Expanded( - child: TripzButton.secondary( - label: l10n.driverReject, - expanded: true, - onPressed: cubit.dismissOffer, - ), - ), - const SizedBox(width: Space.sm), - Expanded( - flex: 2, - child: TripzButton.primary( - label: l10n.driverAccept, - onPressed: cubit.acceptOffer, - ), - ), - ], - ), - ], - ); - } -} - -class _AddressRow extends StatelessWidget { - const _AddressRow({required this.color, required this.label}); - - final Color color; - final String label; - - @override - Widget build(BuildContext context) { - return Padding( - padding: const EdgeInsets.symmetric(vertical: Space.xxs), - child: Row( - children: [ - Container( - width: 10, - height: 10, - decoration: BoxDecoration(color: color, shape: BoxShape.circle), - ), - const SizedBox(width: Space.sm), - Text(label, style: context.texts.bodyMedium), - ], - ), - ); - } -} diff --git a/apps/driver_new/lib/features/trip/view/widgets/ride_map.dart b/apps/driver_new/lib/features/trip/view/widgets/ride_map.dart deleted file mode 100644 index 859cc61..0000000 --- a/apps/driver_new/lib/features/trip/view/widgets/ride_map.dart +++ /dev/null @@ -1,359 +0,0 @@ -import 'dart:developer' as dev; - -import 'package:flutter/material.dart'; -import 'package:intaleq_maps/intaleq_maps.dart' as im; - -import '../../../../core/config.dart'; -import '../../../../core/design/tripz_colors.dart'; -import '../../data/models/geo_point.dart'; -import '../../data/models/route_info.dart'; -import 'map_label.dart'; -import 'map_pin.dart'; - -/// الخريطة — **الطبقة الوحيدة التي تعرف `intaleq_maps`**. ما فوقها يتعامل -/// مع `GeoPoint` وحده، فتبديل محرّك الخريطة لاحقاً لا يلمس منطقاً. -/// -/// البلاطات تُجلب مباشرة من map-saas بمفتاح مقيّد ببصمة التطبيق -/// (قرار 2026-07-20). -/// -/// ## لماذا النقاط مرسومة بفلاتر لا كـ annotations -/// -/// MapLibre يُنشئ «مديري التعليقات» (circle/symbol/line) **عند تحميل الستايل -/// وحده**، ويهدمهم عند كل إعادة تحميل له — وتبديل الوضع الليلي إعادةُ تحميل. -/// وأي `addCircle` في تلك النافذة يرمي -/// `This Annotation Manager has not been initialized`، وقد رأيناه يُسقط -/// التطبيق بـ`std::domain_error` من الطبقة الأصلية (2026-08-05). -/// -/// حارسٌ زمنيّ لا يكفي: `didUpdateWidget` في الحزمة يستدعي `diffCircles` -/// بمجرّد وجود المتحكّم، وهو موجود قبل تحميل الستايل وأثناء إعادة تحميله. -/// -/// لذلك: **الدائرتان والاسمان والسائق كلهم طبقة فلاتر** فوق الخريطة، محسوبة -/// من `getScreenCoordinate`. المسار وحده يبقى `Polyline` لأنه لا بديل له، -/// ومحروسٌ بعَلَم يُصفَّر عند كل تغيير ستايل. -class RideMap extends StatefulWidget { - const RideMap({ - super.key, - this.origin, - this.destination, - this.driver, - this.route, - this.cameraTarget, - this.onCameraIdle, - this.bottomInset = 280, - this.originLabel = '', - this.destinationLabel = '', - }); - - final GeoPoint? origin; - final GeoPoint? destination; - final GeoPoint? driver; - final RouteInfo? route; - final GeoPoint? cameraTarget; - - /// مركز الخريطة عند استقرارها — يغذّي اختيار النقطة بالدبّوس الثابت. - final ValueChanged? onCameraIdle; - - /// ارتفاع ما تغطّيه الورقة السفلية — يُحسب منه إطار المسار. - final double bottomInset; - - /// أسماء النقطتين — تُرسم بطاقاتها فوق الخريطة (نمط سيرو). - final String originLabel; - final String destinationLabel; - - @override - State createState() => _RideMapState(); -} - -class _RideMapState extends State { - im.IntaleqMapController? _controller; - im.LatLng? _center; - - /// يُصفَّر عند كل تغيير ستايل: المديرون يُهدمون وتُعاد تهيئتهم. - bool _styleReady = false; - - String? _styleUrl; - - /// مواضع النقاط على الشاشة — تُحدَّث مع حركة الكاميرا. - Offset? _originPx; - Offset? _destPx; - Offset? _driverPx; - - /// حارس تزامن: `onCameraMove` يُطلق عشرات المرات في الثانية أثناء السحب، - /// وكل مزامنة ثلاثة نداءات منصّة. بلا هذا الحارس تتكدّس النداءات وتلتهم - /// الإطارات — وهو بالضبط ما تمنعه ميزانية الأداء (docs/37 م2.12). - bool _syncing = false; - - static const _fallback = im.LatLng(31.9539, 35.9106); // عمّان - - /// حارس الإحداثيات — **بلا هذا يسقط التطبيق أصلاً لا استثناءً في دارت**. - /// - /// `std::domain_error` الذي رأيناه (2026-08-05) يأتي من `mbgl::LatLng` - /// في MapLibre الأصلي، وهو يرمي حرفياً عند: `latitude must not be NaN` · - /// `longitude must not be NaN` · `latitude must be between -90 and 90` · - /// `longitude must not be infinite`. (السلاسل الأربع موجودة في ثنائي - /// `MapLibre.framework`، وهي مصدر `std::domain_error` الوحيد فيه — أمّا - /// الستايل فبريء: الملفّات الخمسة كلها اجتازت `validateStyleMin` بصفر - /// أخطاء.) - /// - /// وهو استثناء **C++ يعبر حدّ المنصّة**، فلا `try/catch` في دارت يمسكه: - /// المنع قبل التمرير هو العلاج الوحيد. - static im.LatLng? _safe(GeoPoint? p, String tag) { - if (p == null) return null; - final ok = p.lat.isFinite && p.lng.isFinite && p.lat.abs() <= 90; - if (!ok) { - dev.log('إحداثية غير صالحة رُفضت [$tag]: ${p.lat}, ${p.lng}', - name: 'RideMap'); - return null; - } - return im.LatLng(p.lat, p.lng); - } - - /// الستايلان مرفقان في `assets/` — منقولان من سيرو الميداني. - static const _lightStyleAsset = 'assets/style.json'; - static const _darkStyleAsset = 'assets/style_dark.json'; - - @override - void didUpdateWidget(RideMap old) { - super.didUpdateWidget(old); - if (widget.route != null && widget.route != old.route) { - _fitRoute(); - } else { - final target = widget.cameraTarget; - if (target != null && target != old.cameraTarget) _moveTo(target); - } - // النقاط قد تتغيّر بلا حركة كاميرا — نعيد حساب مواضعها. - if (widget.origin != old.origin || - widget.destination != old.destination || - widget.driver != old.driver) { - _syncPixels(); - } - } - - /// الموقع الحالي غالباً يصل *قبل* إنشاء الخريطة، فالتحريك في - /// `didUpdateWidget` وحده يضيع وتبقى الكاميرا على الاحتياطي. هنا نلحق بما فات. - void _onCreated(im.IntaleqMapController controller) { - _controller = controller; - final target = widget.cameraTarget ?? widget.origin; - if (widget.route != null) { - _fitRoute(); - } else if (target != null) { - _moveTo(target); - } - } - - void _onStyleLoaded() { - if (!mounted) return; - setState(() => _styleReady = true); - _syncPixels(); - } - - void _moveTo(GeoPoint p) { - final target = _safe(p, 'moveTo'); - if (target == null) return; - _controller?.animateCamera(im.CameraUpdate.newLatLngZoom(target, 15.5)); - } - - /// يفكّ ترميز المسار **مصفّىً**: مسار مشوّه من الخادم (أو سلسلة مقطوعة) - /// يعطي خطوط عرض خارج ±90، وتلك تصل `mbgl::LatLng` فتُسقط التطبيق أصلاً. - static List _decodeRoute(String encoded) { - final all = im.PolylineUtils.decode(encoded); - final good = all - .where((p) => - p.latitude.isFinite && - p.longitude.isFinite && - p.latitude.abs() <= 90) - .toList(); - if (good.length != all.length) { - dev.log('نقاط مسار غير صالحة رُفضت: ${all.length - good.length}', - name: 'RideMap'); - } - return good; - } - - /// المسار كطبقة `Polyline` — مجموعة فارغة ما لم يكن الستايل جاهزاً - /// والنقاط صالحة. - Set _routePolylines(Color color) { - final encoded = widget.route?.encodedPoints; - if (!_styleReady || encoded == null || encoded.isEmpty) return const {}; - final points = _decodeRoute(encoded); - if (points.length < 2) return const {}; - return { - im.Polyline( - polylineId: const im.PolylineId('route'), - points: points, - color: color, - width: 5, - ), - }; - } - - /// يضبط الكاميرا على المسار كاملاً بدل نقطة واحدة. - /// - /// الحشوة السفلية أكبر لأن الورقة السفلية تغطّي نحو ثلث الشاشة — بلا ذلك - /// يختفي نصف المسار تحتها. - void _fitRoute() { - final encoded = widget.route?.encodedPoints; - if (encoded == null || encoded.isEmpty) return; - final points = _decodeRoute(encoded); - if (points.length < 2) return; - - var minLat = points.first.latitude, maxLat = points.first.latitude; - var minLng = points.first.longitude, maxLng = points.first.longitude; - for (final p in points) { - if (p.latitude < minLat) minLat = p.latitude; - if (p.latitude > maxLat) maxLat = p.latitude; - if (p.longitude < minLng) minLng = p.longitude; - if (p.longitude > maxLng) maxLng = p.longitude; - } - - // `mbgl::EdgeInsets` يرمي هو الآخر على NaN (`bottom must not be NaN`)، - // و`bottomInset` مشتقّ من `MediaQuery` فقد يصل صفراً أو NaN في أوّل إطار. - final bottom = widget.bottomInset.isFinite ? widget.bottomInset : 280.0; - - _controller?.animateCamera( - im.CameraUpdate.newLatLngBounds( - im.LatLngBounds( - southwest: im.LatLng(minLat, minLng), - northeast: im.LatLng(maxLat, maxLng), - ), - left: 48, - right: 48, - top: 120, - bottom: bottom, - ), - ); - } - - /// يحوّل الإحداثيات إلى بكسلات الشاشة لرسم الطبقة الفلاترية فوقها. - Future _syncPixels() async { - final controller = _controller; - if (controller == null || _syncing) return; - _syncing = true; - - // `getScreenCoordinate` يعبر إلى `mbgl::LatLng` هو الآخر — نفس الحارس. - Future px(GeoPoint? p, String tag) async { - final target = _safe(p, tag); - if (target == null) return null; - final point = await controller.getScreenCoordinate(target); - return Offset(point.x.toDouble(), point.y.toDouble()); - } - - try { - final results = await Future.wait([ - px(widget.origin, 'origin'), - px(widget.destination, 'destination'), - px(widget.driver, 'driver'), - ]); - if (!mounted) return; - setState(() { - _originPx = results[0]; - _destPx = results[1]; - _driverPx = results[2]; - }); - } catch (_) { - // الخريطة بين حالتين — تُخفى الطبقة بدل أن تُرسم في مكان خاطئ. - if (mounted) { - setState(() => _originPx = _destPx = _driverPx = null); - } - } finally { - _syncing = false; - } - } - - @override - Widget build(BuildContext context) { - final colors = context.tripzColors; - final isDark = Theme.of(context).brightness == Brightness.dark; - - // الخريطة تبدّل ستايلها مع الثيم — خريطة نهارية في وضع ليلي تكسر - // الغرض (docs/26 §2). وتبديله يهدم مديري التعليقات، فيُصفَّر العَلَم. - // - // **ستايل محلّي لا بعيد** — كما في سيرو الميداني حرفياً: - // `apps/rider/lib/views/home/map_widget.dart/google_map_passenger_widget.dart` - // يمرّر `'assets/style.json'` / `'assets/style_dark.json'` نفسهما، وملفّاه - // مطابقان لهذين طبقةً بطبقة (لا يختلفان إلا في اسم العلامة التجارية). - // ومعها نكسب الإقلاع بلا انتظار شبكة — وهو ما يعنيه «الشكل حتمي من أول - // إقلاع» (docs/26 §1). - // - // ملاحظة تصحيحية (2026-08-05): كان مكتوباً هنا أن ستايل map-saas البعيد - // هو سبب `std::domain_error` لأنه بلا `sprite`. **هذا خطأ.** الستايلات - // الخمسة (المحلّيان + البعيد + ستايلا الحزمة) اجتازت - // `validateStyleMin` من `@maplibre/maplibre-gl-style-spec` بصفر أخطاء، - // والسقوط تكرّر بالستايل المحلّي أيضاً. المصدر الحقيقي هو حارس - // الإحداثيات في `mbgl::LatLng`/`mbgl::EdgeInsets` — انظر `_safe` أعلاه. - final styleUrl = isDark ? _darkStyleAsset : _lightStyleAsset; - if (_styleUrl != null && _styleUrl != styleUrl) _styleReady = false; - _styleUrl = styleUrl; - - return Stack( - children: [ - im.IntaleqMap( - apiKey: AppConfig.mapApiKey, - // التنزيل المسبق للمناطق لا معنى له مع ستايل من `assets/` — الحزمة - // تتخطّاه على iOS أصلاً لكنها تترك عَلَم «جارٍ التنزيل» مرفوعاً، - // فنقفله من هنا بدل الاتّكال على ذلك. - autoCache: false, - initialCameraPosition: im.CameraPosition( - target: _safe(widget.origin, 'initialCamera') ?? _fallback, - zoom: 15, - ), - styleUrl: styleUrl, - // نقطة «موقعي» تُفعَّل **بعد** أن يصلنا موقع حقيقي لا عند الإنشاء. - // قبل ذلك يكون `MLNMapView.userLocation.coordinate` هو - // `kCLLocationCoordinate2DInvalid` أي (-180, -180) — وخط عرض -180 - // يخترق حارس `mbgl::LatLng` نفسه (`latitude must be between -90 - // and 90`). و`origin` لا يصير غير فارغ إلا بعد منح الإذن ووصول - // قراءة فعلية، فهو الشرط الصحيح تماماً. - myLocationEnabled: widget.origin != null, - compassEnabled: false, - zoomControlsEnabled: false, - onMapCreated: _onCreated, - onStyleLoaded: _onStyleLoaded, - onCameraMove: (position) { - _center = position.target; - // الطبقة تتبع الخريطة أثناء السحب لا بعده فقط. - _syncPixels(); - }, - onCameraIdle: () { - final c = _center; - if (c != null) { - widget.onCameraIdle?.call(GeoPoint(c.latitude, c.longitude)); - } - _syncPixels(); - }, - // **المسار وحده annotation** — لا بديل عنه، ومحروسٌ بعَلَم الستايل - // وبتصفية الإحداثيات (نقاط المسار تعبر إلى `mbgl::LatLng` أيضاً). - polylines: _routePolylines(colors.mapRoute), - ), - - // ── الطبقة الفلاترية: نقاط وأسماء وسائق ────────────────────────── - _pin(_originPx, colors.mapOrigin, null), - _pin(_destPx, colors.mapDestination, Icons.place_rounded), - _pin(_driverPx, colors.info, Icons.local_taxi_rounded), - _label(_originPx, widget.originLabel, colors.mapOrigin), - _label(_destPx, widget.destinationLabel, colors.mapDestination), - ], - ); - } - - Widget _pin(Offset? px, Color color, IconData? icon) { - if (px == null) return const SizedBox.shrink(); - return Positioned( - left: px.dx - 14, - top: px.dy - 14, - child: IgnorePointer(child: MapPin(color: color, icon: icon)), - ); - } - - Widget _label(Offset? px, String text, Color color) { - if (px == null || text.isEmpty) return const SizedBox.shrink(); - return Positioned( - left: px.dx - 100, - top: px.dy - 52, - width: 200, - child: IgnorePointer( - child: Center(child: MapLabel(text: text, color: color)), - ), - ); - } -} diff --git a/apps/driver_new/lib/features/trip/view/widgets/vehicle_color.dart b/apps/driver_new/lib/features/trip/view/widgets/vehicle_color.dart deleted file mode 100644 index cd9ddc2..0000000 --- a/apps/driver_new/lib/features/trip/view/widgets/vehicle_color.dart +++ /dev/null @@ -1,67 +0,0 @@ -import 'package:flutter/material.dart'; - -/// يحوّل لون المركبة — hex أو اسماً — إلى لون يُرسم به. -/// -/// الخادم غير متّسق عمداً: `vehicles` عندها `color_hex` بينما حدث `assigned` -/// يرسل `color` اسماً (`trips.service.ts:427`). فالمُحوِّل يقبل الاثنين -/// ويُقدّم الـhex لأنه دقيق. -/// -/// الأسماء تُطابَق **بالعربية والإنجليزية معاً**: السائقون يُدخلونها بلغتهم، -/// وقائمة إنجليزية وحدها تعني رمادياً افتراضياً لنصف الأسطول. -class VehicleColor { - const VehicleColor._(); - - /// اللون الذي يُرسم به رمز السيارة، أو `null` إن تعذّرت المطابقة — - /// و`null` تعني «لا تلوّن» لا «لوّن رمادياً»، فالرمادي لونُ سيارةٍ حقيقي - /// ولا يصحّ أن يعني «مجهول». - static Color? resolve({String? hex, String? name}) => - _fromHex(hex) ?? _fromName(name); - - static Color? _fromHex(String? hex) { - if (hex == null) return null; - var raw = hex.replaceFirst('#', '').trim(); - if (raw.length == 3) { - // ‏`#f00` → `#ff0000`: صيغة مختصرة شائعة في لوحات الإدارة. - raw = raw.split('').map((c) => '$c$c').join(); - } - if (raw.length == 6) raw = 'FF$raw'; - if (raw.length != 8) return null; - final value = int.tryParse(raw, radix: 16); - return value == null ? null : Color(value); - } - - static const _names = { - 'white': Colors.white, - 'أبيض': Colors.white, - 'black': Colors.black, - 'أسود': Colors.black, - 'silver': Color(0xFFC0C0C0), - 'فضي': Color(0xFFC0C0C0), - 'grey': Color(0xFF808080), - 'gray': Color(0xFF808080), - 'رمادي': Color(0xFF808080), - 'red': Color(0xFFD32F2F), - 'أحمر': Color(0xFFD32F2F), - 'blue': Color(0xFF1976D2), - 'أزرق': Color(0xFF1976D2), - 'green': Color(0xFF388E3C), - 'أخضر': Color(0xFF388E3C), - 'yellow': Color(0xFFFBC02D), - 'أصفر': Color(0xFFFBC02D), - 'orange': Color(0xFFF57C00), - 'برتقالي': Color(0xFFF57C00), - 'brown': Color(0xFF6D4C41), - 'بني': Color(0xFF6D4C41), - 'beige': Color(0xFFE8DCC4), - 'بيج': Color(0xFFE8DCC4), - 'gold': Color(0xFFC9A227), - 'ذهبي': Color(0xFFC9A227), - 'navy': Color(0xFF1A2340), - 'كحلي': Color(0xFF1A2340), - }; - - static Color? _fromName(String? name) { - if (name == null) return null; - return _names[name.trim().toLowerCase()]; - } -} diff --git a/apps/driver_new/lib/features/wallet/cubit/payout_cubit.dart b/apps/driver_new/lib/features/wallet/cubit/payout_cubit.dart deleted file mode 100644 index 69dda90..0000000 --- a/apps/driver_new/lib/features/wallet/cubit/payout_cubit.dart +++ /dev/null @@ -1,88 +0,0 @@ -import 'package:flutter_bloc/flutter_bloc.dart'; - -import '../../../core/api/api_exception.dart'; -import '../data/wallet_repository.dart'; - -/// خطوتا السحب (docs/38 §6): `request` يرسل رمزاً **بلا خصم**، و`confirm` -/// هو ما يخصم ويحجز. شاشة سيرو كانت خطوة واحدة — لا تُقلَّد (docs/39 §4). -enum PayoutStep { amount, code, done } - -enum PayoutFailure { none, insufficient, rejected, network } - -class PayoutState { - const PayoutState({ - this.step = PayoutStep.amount, - this.busy = false, - this.payoutId, - this.devCode, - this.failure = PayoutFailure.none, - }); - - final PayoutStep step; - final bool busy; - final String? payoutId; - - /// يعود من الخادم في وضع التطوير وحده — يملأ الحقل لتسريع الاختبار. - final String? devCode; - - final PayoutFailure failure; - - PayoutState copyWith({ - PayoutStep? step, - bool? busy, - String? payoutId, - String? devCode, - PayoutFailure? failure, - }) { - return PayoutState( - step: step ?? this.step, - busy: busy ?? this.busy, - payoutId: payoutId ?? this.payoutId, - devCode: devCode ?? this.devCode, - failure: failure ?? this.failure, - ); - } -} - -class PayoutCubit extends Cubit { - PayoutCubit(this._repo) : super(const PayoutState()); - - final WalletRepository _repo; - - Future request({required num amount, required String channel}) async { - if (amount <= 0) return; - emit(state.copyWith(busy: true, failure: PayoutFailure.none)); - try { - final res = await _repo.requestPayout(amount: amount, channel: channel); - emit(state.copyWith( - busy: false, - step: PayoutStep.code, - payoutId: res.payoutId, - devCode: res.devCode, - )); - } on ApiException catch (e) { - emit(state.copyWith( - busy: false, - failure: e.statusCode == 400 - ? PayoutFailure.insufficient - : PayoutFailure.network, - )); - } - } - - Future confirm(String code) async { - final id = state.payoutId; - if (id == null || code.isEmpty) return; - emit(state.copyWith(busy: true, failure: PayoutFailure.none)); - try { - await _repo.confirmPayout(id, code); - emit(state.copyWith(busy: false, step: PayoutStep.done)); - } on ApiException { - // الرمز الخاطئ لا يُرجع المستخدم لخطوة المبلغ: يبقى على الرمز ويعيد - // المحاولة — الطلب قائم على الخادم أصلاً. - emit(state.copyWith(busy: false, failure: PayoutFailure.rejected)); - } - } - - void reset() => emit(const PayoutState()); -} diff --git a/apps/driver_new/lib/features/wallet/cubit/wallet_cubit.dart b/apps/driver_new/lib/features/wallet/cubit/wallet_cubit.dart deleted file mode 100644 index 5dca2d2..0000000 --- a/apps/driver_new/lib/features/wallet/cubit/wallet_cubit.dart +++ /dev/null @@ -1,59 +0,0 @@ -import 'package:flutter_bloc/flutter_bloc.dart'; - -import '../../../core/api/api_exception.dart'; -import '../../../core/ui/view_status.dart'; -import '../data/wallet_repository.dart'; -import 'wallet_state.dart'; - -class WalletCubit extends Cubit { - WalletCubit(this._repo) : super(const WalletState()); - - final WalletRepository _repo; - - Future load() async { - emit(state.copyWith(status: ViewStatus.loading)); - try { - final wallet = await _repo.wallet(); - final txns = await _repo.transactions(); - if (isClosed) return; - emit(state.copyWith( - status: ViewStatus.success, - wallet: wallet, - transactions: txns, - )); - } on ApiException catch (e) { - if (!isClosed) { - emit(state.copyWith(status: ViewStatus.error, error: e.message)); - } - } - } - - /// شحن حقيقي. **لا يزيد الرصيد فوراً** إلا في نمط الدفع الفوري — الفاتورة - /// تُعرض للمستخدم ويحوّل، والتسوية تصل لاحقاً عبر مطابقة رسالة المزوّد. - Future topup({required num amount, required String provider}) async { - if (amount <= 0) return; - emit(state.copyWith(action: WalletAction.toppingUp)); - try { - final result = await _repo.charge( - amount: amount, - provider: provider, - currency: state.currency, - ); - if (isClosed) return; - - if (result.isInstant) { - emit(state.copyWith(action: WalletAction.topupDone)); - // الرصيد يُعاد جلبه من الخادم لا يُحسب محلياً: المال لا يُقدَّر - // في التطبيق (docs/23 §0.2). - await load(); - return; - } - emit(state.copyWith( - action: WalletAction.invoiceReady, - invoice: result, - )); - } on ApiException { - if (!isClosed) emit(state.copyWith(action: WalletAction.topupFailed)); - } - } -} diff --git a/apps/driver_new/lib/features/wallet/cubit/wallet_state.dart b/apps/driver_new/lib/features/wallet/cubit/wallet_state.dart deleted file mode 100644 index 121258f..0000000 --- a/apps/driver_new/lib/features/wallet/cubit/wallet_state.dart +++ /dev/null @@ -1,56 +0,0 @@ -import 'package:equatable/equatable.dart'; - -import '../../../core/ui/view_status.dart'; -import '../data/models/wallet.dart'; -import '../data/models/wallet_txn.dart'; -import '../data/wallet_repository.dart'; - -enum WalletAction { none, toppingUp, topupFailed, topupDone, invoiceReady } - -class WalletState extends Equatable { - const WalletState({ - this.status = ViewStatus.idle, - this.wallet, - this.transactions = const [], - this.action = WalletAction.none, - this.invoice, - this.error, - }); - - final ViewStatus status; - final Wallet? wallet; - final List transactions; - - /// فعلٌ جارٍ داخل الشاشة — منفصل عن [status] كي لا يُخفي الشحنُ الرصيدَ - /// المعروض خلفه. - final WalletAction action; - - /// فاتورة تحويل بانتظار الدفع — تُعرض للمستخدم بمرجعها وحساب الاستلام. - final TopupResult? invoice; - - final String? error; - - String get currency => wallet?.currency ?? ''; - - WalletState copyWith({ - ViewStatus? status, - Wallet? wallet, - List? transactions, - WalletAction? action, - TopupResult? invoice, - String? error, - }) { - return WalletState( - status: status ?? this.status, - wallet: wallet ?? this.wallet, - transactions: transactions ?? this.transactions, - action: action ?? this.action, - invoice: invoice ?? this.invoice, - error: error ?? this.error, - ); - } - - @override - List get props => - [status, wallet, transactions, action, invoice?.reference, error]; -} diff --git a/apps/driver_new/lib/features/wallet/data/models/wallet.dart b/apps/driver_new/lib/features/wallet/data/models/wallet.dart deleted file mode 100644 index b10a0e1..0000000 --- a/apps/driver_new/lib/features/wallet/data/models/wallet.dart +++ /dev/null @@ -1,31 +0,0 @@ -import 'package:equatable/equatable.dart'; - -/// المحفظة كما يرجّعها `GET /wallet` (شكل مُتحقَّق حيّاً، docs/38 §6). -/// -/// ⚠️ **محفظتان لا واحدة**: محفظة الراكب **التزام** على المنصّة (رصيدٌ دفعه -/// ولم يستهلكه بعد)، ومحفظة السائق **إيراد** له. دمجهما في شاشة أو حساب -/// واحد خطأ محاسبي لا تجميلي — لذلك لا تُوحَّد شاشتاهما (docs/39 §4). -class Wallet extends Equatable { - const Wallet({ - required this.id, - required this.balance, - required this.currency, - }); - - final String id; - - /// نصّ لا رقم (`"0.000"`) — يُحوَّل عبر `Money` عند الحاجة فقط. - final String balance; - - /// من إعداد المستأجر: `JOD`/`EGP`/`SYP` — لا تُثبَّت في التطبيق. - final String currency; - - factory Wallet.fromJson(Map json) => Wallet( - id: json['id'] as String? ?? '', - balance: json['balance']?.toString() ?? '0', - currency: json['currency'] as String? ?? '', - ); - - @override - List get props => [id, balance, currency]; -} diff --git a/apps/driver_new/lib/features/wallet/data/models/wallet_txn.dart b/apps/driver_new/lib/features/wallet/data/models/wallet_txn.dart deleted file mode 100644 index 75e5204..0000000 --- a/apps/driver_new/lib/features/wallet/data/models/wallet_txn.dart +++ /dev/null @@ -1,29 +0,0 @@ -import 'package:equatable/equatable.dart'; - -class WalletTxn extends Equatable { - const WalletTxn({ - required this.id, - required this.amount, - required this.reason, - this.createdAt, - }); - - final String id; - - /// موجب = دخول، سالب = خروج. النصّ كما وصل، والإشارة تُقرأ منه. - final String amount; - final String reason; - final DateTime? createdAt; - - factory WalletTxn.fromJson(Map json) => WalletTxn( - id: json['id']?.toString() ?? '', - amount: json['amount']?.toString() ?? '0', - reason: json['reason'] as String? ?? json['type'] as String? ?? '', - createdAt: DateTime.tryParse(json['created_at']?.toString() ?? ''), - ); - - bool get isCredit => !amount.trim().startsWith('-'); - - @override - List get props => [id, amount, reason, createdAt]; -} diff --git a/apps/driver_new/lib/features/wallet/data/wallet_repository.dart b/apps/driver_new/lib/features/wallet/data/wallet_repository.dart deleted file mode 100644 index 70ea750..0000000 --- a/apps/driver_new/lib/features/wallet/data/wallet_repository.dart +++ /dev/null @@ -1,109 +0,0 @@ -import '../../../core/api/api_client.dart'; -import 'models/wallet.dart'; -import 'models/wallet_txn.dart'; - -/// نتيجة الشحن — ثلاثة أنماط: فوري · فاتورة · إعادة توجيه. -class TopupResult { - const TopupResult({ - required this.status, - this.reference, - this.transferTarget, - this.instructions, - this.redirectUrl, - }); - - final String status; - - /// مرجع الفاتورة الذي يذكره المستخدم عند التحويل — به تُطابَق رسالة - /// المزوّد لاحقاً. - final String? reference; - - /// حساب/رقم استلام المستأجر عند هذا المزوّد. - final String? transferTarget; - - final String? instructions; - final String? redirectUrl; - - bool get isInvoice => reference != null; - bool get isInstant => status == 'success'; - bool get isRedirect => redirectUrl != null; -} - -class WalletRepository { - WalletRepository(this._api); - - final ApiClient _api; - - Future wallet() async { - final res = await _api.get>('/wallet'); - return Wallet.fromJson(res); - } - - Future> transactions() async { - final res = await _api.get>('/wallet/transactions'); - return res - .whereType>() - .map(WalletTxn.fromJson) - .toList(growable: false); - } - - /// شحن حقيقي عبر `POST /payments/charge`. - /// - /// **لا يزيد الرصيد فوراً.** كليك وشام كاش وزين كاش تعمل بنمط الفاتورة: - /// الخادم يولّد مرجعاً ويعرض حساب الاستلام، ثم يحوّل المستخدم، والتسوية - /// تصل لاحقاً عبر مطابقة رسالة المزوّد. هذا **نفس مسار سيرو** حرفياً. - /// PayMob وحده يرجّع رابط إعادة توجيه، و`cash` وحده فوري. - Future charge({ - required num amount, - required String provider, - required String currency, - }) async { - final res = await _api.post>( - '/payments/charge', - body: { - 'amount': amount, - 'provider': provider, - 'purpose': 'topup', - 'currency': currency, - }, - ); - final payment = res['payment'] as Map?; - return TopupResult( - status: payment?['status'] as String? ?? 'pending', - reference: res['reference'] as String?, - transferTarget: res['transferTarget'] as String?, - instructions: res['instructions'] as String?, - redirectUrl: res['redirectUrl'] as String?, - ); - } - - // ── السحب: خطوتان لا خطوة ──────────────────────────────────────────── - // `request` يرسل رمزاً **بلا خصم**، و`confirm` هو ما يخصم ويحجز - // (docs/38 §6). شاشة سيرو كانت خطوة واحدة — لا تُقلَّد. - - Future<({String payoutId, String? devCode})> requestPayout({ - required num amount, - required String channel, - }) async { - final res = await _api.post>( - '/payouts/request', - body: {'amount': amount, 'channel': channel}, - ); - final payout = res['payout'] as Map?; - return ( - payoutId: payout?['id'] as String? ?? '', - devCode: res['dev_code']?.toString(), - ); - } - - Future confirmPayout(String payoutId, String code) => - _api.post>( - '/payouts/$payoutId/confirm', - body: {'code': code}, - ); - - Future>> payouts() async { - final res = await _api.get>('/payouts/mine'); - return res.whereType>().toList(growable: false); - } -} diff --git a/apps/driver_new/lib/features/wallet/view/earnings_page.dart b/apps/driver_new/lib/features/wallet/view/earnings_page.dart deleted file mode 100644 index ec8aff5..0000000 --- a/apps/driver_new/lib/features/wallet/view/earnings_page.dart +++ /dev/null @@ -1,103 +0,0 @@ -import 'package:flutter/material.dart'; -import 'package:flutter_bloc/flutter_bloc.dart'; - -import '../../../core/design/tokens.dart'; -import '../../../core/design/tripz_colors.dart'; -import '../../../core/di.dart'; -import '../../../core/l10n/l10n.dart'; -import '../../../core/ui/empty_view.dart'; -import '../../../core/ui/status_banner.dart'; -import '../../../core/ui/tripz_button.dart'; -import '../../../core/ui/tripz_scaffold.dart'; -import '../../../core/ui/tripz_sheet.dart'; -import '../cubit/payout_cubit.dart'; -import '../cubit/wallet_cubit.dart'; -import '../cubit/wallet_state.dart'; -import 'widgets/balance_card.dart'; -import 'widgets/payout_sheet.dart'; -import 'widgets/txn_tile.dart'; - -/// شاشة السائق المالية — **مختلفة عن محفظة الراكب عمداً**. -/// -/// محفظة السائق **إيراد** له (أرباح تُسحب)، ومحفظة الراكب **التزام** على -/// المنصّة (رصيد مدفوع لم يُستهلك). دمجهما في شاشة واحدة خطأ محاسبي، ولذلك -/// لا تُوحَّد الشاشتان مهما تشابه شكلهما (docs/39 §4). -class EarningsPage extends StatefulWidget { - const EarningsPage({super.key}); - - @override - State createState() => _EarningsPageState(); -} - -class _EarningsPageState extends State { - late final WalletCubit _wallet = sl()..load(); - - @override - void dispose() { - _wallet.close(); - super.dispose(); - } - - @override - Widget build(BuildContext context) { - final l10n = context.l10n; - return BlocProvider.value( - value: _wallet, - child: BlocBuilder( - builder: (context, state) { - return TripzScaffold( - title: l10n.payoutTitle, - status: state.status, - error: state.error, - onRetry: _wallet.load, - child: ListView( - children: [ - BalanceCard( - label: l10n.tripEarnings, - balance: state.wallet?.balance, - currency: state.currency, - action: TripzButton.primary( - label: l10n.payoutTitle, - onPressed: () => _openPayout(context), - ), - ), - const SizedBox(height: Space.md), - // الرصيد التشغيلي **ليس** أرباحاً: منه تُخصم العمولة، ونفاده - // يوقف وصول الطلبات. يُعرض منفصلاً كي لا يُخلط بالأرباح. - StatusBanner( - message: l10n.creditLead, - tone: BannerTone.info, - icon: Icons.account_balance_wallet_outlined, - ), - const SizedBox(height: Space.lg), - Text(l10n.walletTransactions, style: context.texts.titleMedium), - const SizedBox(height: Space.xs), - if (state.transactions.isEmpty) - Padding( - padding: const EdgeInsets.only(top: Space.xl), - child: EmptyView( - icon: Icons.receipt_long_outlined, - message: l10n.walletEmpty, - ), - ) - else - for (final txn in state.transactions) - TxnTile(txn: txn, currency: state.currency), - ], - ), - ); - }, - ), - ); - } - - void _openPayout(BuildContext context) { - TripzSheet.show( - context, - child: BlocProvider( - create: (_) => sl(), - child: PayoutSheet(onDone: _wallet.load), - ), - ); - } -} diff --git a/apps/driver_new/lib/features/wallet/view/widgets/balance_card.dart b/apps/driver_new/lib/features/wallet/view/widgets/balance_card.dart deleted file mode 100644 index 469815a..0000000 --- a/apps/driver_new/lib/features/wallet/view/widgets/balance_card.dart +++ /dev/null @@ -1,67 +0,0 @@ -import 'package:flutter/material.dart'; - -import '../../../../core/design/tokens.dart'; -import '../../../../core/design/tripz_colors.dart'; -import '../../../../core/design/typography.dart'; -import '../../../../core/format/money.dart'; - -/// بطاقة الرصيد — الرقم هو بطل الشاشة، فيأخذ أكبر حجم وأعلى تباين. -class BalanceCard extends StatelessWidget { - const BalanceCard({ - super.key, - required this.label, - required this.balance, - required this.currency, - this.hint, - this.action, - }); - - final String label; - final String? balance; - final String currency; - final String? hint; - final Widget? action; - - @override - Widget build(BuildContext context) { - return Container( - width: double.infinity, - padding: Space.page, - decoration: BoxDecoration( - color: context.colors.primaryContainer, - borderRadius: Radii.card_, - ), - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Text( - label, - style: context.texts.labelLarge?.copyWith( - color: context.colors.onPrimaryContainer, - ), - ), - const SizedBox(height: Space.xs), - Text( - Money.format(balance, currency), - style: numericStyle(context.texts.displaySmall).copyWith( - color: context.colors.onPrimaryContainer, - ), - ), - if (hint != null) ...[ - const SizedBox(height: Space.xxs), - Text( - hint!, - style: context.texts.bodySmall?.copyWith( - color: context.colors.onPrimaryContainer.withValues(alpha: 0.8), - ), - ), - ], - if (action != null) ...[ - const SizedBox(height: Space.md), - action!, - ], - ], - ), - ); - } -} diff --git a/apps/driver_new/lib/features/wallet/view/widgets/invoice_sheet.dart b/apps/driver_new/lib/features/wallet/view/widgets/invoice_sheet.dart deleted file mode 100644 index 3e3834c..0000000 --- a/apps/driver_new/lib/features/wallet/view/widgets/invoice_sheet.dart +++ /dev/null @@ -1,105 +0,0 @@ -import 'package:flutter/material.dart'; -import 'package:flutter/services.dart'; - -import '../../../../core/design/tokens.dart'; -import '../../../../core/design/tripz_colors.dart'; -import '../../../../core/design/typography.dart'; -import '../../../../core/l10n/l10n.dart'; -import '../../../../core/ui/status_banner.dart'; -import '../../data/wallet_repository.dart'; - -/// فاتورة التحويل — نمط سيرو حرفياً (`create_cliq_invoice.php`). -/// -/// المستخدم يحوّل بنفسه إلى حساب المشغّل ويذكر المرجع، والتسوية تصل لاحقاً -/// بمطابقة رسالة المزوّد. **الرصيد لا يزيد الآن** — وهذا يُقال صراحةً بدل -/// أن ينتظر المستخدم رقماً لن يتغيّر. -class InvoiceSheet extends StatelessWidget { - const InvoiceSheet({super.key, required this.invoice}); - - final TopupResult invoice; - - @override - Widget build(BuildContext context) { - final l10n = context.l10n; - final target = invoice.transferTarget; - - return Column( - mainAxisSize: MainAxisSize.min, - crossAxisAlignment: CrossAxisAlignment.stretch, - children: [ - Text(l10n.walletInvoiceTitle, style: context.texts.titleLarge), - const SizedBox(height: Space.md), - - // حساب الاستلام قد لا يكون مضبوطاً للمستأجر — يُقال بوضوح بدل تعليمات - // ناقصة تُرسل المال إلى لا مكان. - if (target == null || target.isEmpty) - StatusBanner(message: l10n.walletNoTarget, tone: BannerTone.danger) - else - _CopyRow(label: l10n.walletInvoiceTarget, value: target), - - const SizedBox(height: Space.sm), - if (invoice.reference != null) - _CopyRow(label: l10n.walletInvoiceRef, value: invoice.reference!), - - const SizedBox(height: Space.md), - StatusBanner( - message: l10n.walletInvoicePending, - tone: BannerTone.info, - icon: Icons.schedule_rounded, - ), - ], - ); - } -} - -/// قيمة مع زرّ نسخ — الرقم يُحوَّل يدوياً في تطبيق بنك آخر، فالنسخ ليس رفاهية. -class _CopyRow extends StatelessWidget { - const _CopyRow({required this.label, required this.value}); - - final String label; - final String value; - - @override - Widget build(BuildContext context) { - return Container( - padding: Space.page, - decoration: BoxDecoration( - color: context.colors.surfaceContainerHighest, - borderRadius: Radii.card_, - ), - child: Row( - children: [ - Expanded( - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Text( - label, - style: context.texts.labelSmall?.copyWith( - color: context.colors.onSurfaceVariant, - ), - ), - const SizedBox(height: Space.xxs), - SelectableText( - value, - textDirection: TextDirection.ltr, - style: numericStyle(context.texts.titleMedium), - ), - ], - ), - ), - IconButton( - icon: const Icon(Icons.copy_rounded), - tooltip: context.l10n.walletCopy, - onPressed: () { - Clipboard.setData(ClipboardData(text: value)); - ScaffoldMessenger.of(context).showSnackBar( - SnackBar(content: Text(context.l10n.walletCopied)), - ); - }, - ), - ], - ), - ); - } -} diff --git a/apps/driver_new/lib/features/wallet/view/widgets/payout_sheet.dart b/apps/driver_new/lib/features/wallet/view/widgets/payout_sheet.dart deleted file mode 100644 index c8a8883..0000000 --- a/apps/driver_new/lib/features/wallet/view/widgets/payout_sheet.dart +++ /dev/null @@ -1,142 +0,0 @@ -import 'package:flutter/material.dart'; -import 'package:flutter_bloc/flutter_bloc.dart'; - -import '../../../../core/config.dart'; -import '../../../../core/design/tokens.dart'; -import '../../../../core/design/tripz_colors.dart'; -import '../../../../core/payments/payment_channels.dart'; -import '../../../../core/tenant/tenant_cubit.dart'; -import '../../../../core/ui/channel_picker.dart'; -import '../../../../core/l10n/l10n.dart'; -import '../../../../core/ui/tripz_button.dart'; -import '../../../../core/ui/tripz_otp_field.dart'; -import '../../../../core/ui/tripz_text_field.dart'; -import '../../cubit/payout_cubit.dart'; - -/// سحب الأرباح بخطوتيه. الخطوة الثانية رمز OTP — والمستخدم يرى صراحةً أن -/// المبلغ **لم يُخصم بعد** حتى يؤكّد. -class PayoutSheet extends StatefulWidget { - const PayoutSheet({super.key, required this.onDone}); - - final VoidCallback onDone; - - @override - State createState() => _PayoutSheetState(); -} - -class _PayoutSheetState extends State { - final _amount = TextEditingController(); - final _code = TextEditingController(); - PaymentChannel? _channel; - - @override - void dispose() { - _amount.dispose(); - _code.dispose(); - super.dispose(); - } - - @override - Widget build(BuildContext context) { - final l10n = context.l10n; - - return BlocConsumer( - listenWhen: (p, n) => p.step != n.step, - listener: (context, state) { - if (state.step == PayoutStep.done) { - Navigator.of(context).pop(); - widget.onDone(); - } - // في وضع التطوير يصل الرمز في الرد — يُملأ لاختصار الاختبار. - if (state.step == PayoutStep.code && state.devCode != null) { - _code.text = state.devCode!; - } - }, - builder: (context, state) { - final cubit = context.read(); - final isCodeStep = state.step == PayoutStep.code; - - return Column( - mainAxisSize: MainAxisSize.min, - crossAxisAlignment: CrossAxisAlignment.stretch, - children: [ - Text( - isCodeStep ? l10n.payoutOtpTitle : l10n.payoutTitle, - style: context.texts.titleLarge, - ), - const SizedBox(height: Space.xs), - Text( - isCodeStep ? l10n.payoutOtpLead : l10n.creditLead, - style: context.texts.bodySmall?.copyWith( - color: context.colors.onSurfaceVariant, - ), - ), - const SizedBox(height: Space.lg), - if (isCodeStep) - TripzOtpField( - controller: _code, - length: AppConfig.otpLength, - hasError: state.failure == PayoutFailure.rejected, - onCompleted: cubit.confirm, - ) - else ...[ - TripzTextField( - controller: _amount, - label: l10n.payoutAmount, - numeric: true, - autofocus: true, - keyboardType: const TextInputType.numberWithOptions( - decimal: true, - ), - ), - const SizedBox(height: Space.md), - Text(l10n.payoutChannel, style: context.texts.titleSmall), - const SizedBox(height: Space.xs), - Builder(builder: (context) { - // قنوات السحب من حزمة دولة المستأجر — والنقد ليس قناة سحب. - final channels = PaymentChannel.payoutFor( - context.watch().state.countryPack, - ); - _channel ??= channels.isEmpty ? null : channels.first; - return ChannelPicker( - channels: channels, - selected: _channel, - onSelect: (c) => setState(() => _channel = c), - ); - }), - ], - if (state.failure != PayoutFailure.none) ...[ - const SizedBox(height: Space.sm), - Text( - switch (state.failure) { - PayoutFailure.insufficient => l10n.payoutInsufficient, - PayoutFailure.rejected => l10n.otpErrInvalid, - _ => l10n.payoutFailed, - }, - style: context.texts.bodySmall?.copyWith( - color: context.tripzColors.danger, - ), - ), - ], - const SizedBox(height: Space.lg), - TripzButton.primary( - label: isCodeStep ? l10n.payoutConfirm : l10n.payoutRequest, - loading: state.busy, - onPressed: () { - if (isCodeStep) { - cubit.confirm(_code.text.trim()); - } else { - final amount = num.tryParse(_amount.text.trim()); - final channel = _channel; - if (amount != null && channel != null) { - cubit.request(amount: amount, channel: channel.wire); - } - } - }, - ), - ], - ); - }, - ); - } -} diff --git a/apps/driver_new/lib/features/wallet/view/widgets/txn_tile.dart b/apps/driver_new/lib/features/wallet/view/widgets/txn_tile.dart deleted file mode 100644 index dacd33f..0000000 --- a/apps/driver_new/lib/features/wallet/view/widgets/txn_tile.dart +++ /dev/null @@ -1,49 +0,0 @@ -import 'package:flutter/material.dart'; - -import '../../../../core/design/tokens.dart'; -import '../../../../core/design/tripz_colors.dart'; -import '../../../../core/design/typography.dart'; -import '../../../../core/format/money.dart'; -import '../../data/models/wallet_txn.dart'; - -class TxnTile extends StatelessWidget { - const TxnTile({super.key, required this.txn, required this.currency}); - - final WalletTxn txn; - final String currency; - - @override - Widget build(BuildContext context) { - final colors = context.tripzColors; - final isCredit = txn.isCredit; - - return ListTile( - contentPadding: EdgeInsets.zero, - leading: CircleAvatar( - backgroundColor: - (isCredit ? colors.success : colors.danger).withValues(alpha: 0.12), - child: Icon( - isCredit ? Icons.south_west_rounded : Icons.north_east_rounded, - size: Sizes.iconSm, - color: isCredit ? colors.success : colors.danger, - ), - ), - title: Text(txn.reason, style: context.texts.bodyMedium), - subtitle: txn.createdAt == null - ? null - : Text( - // التاريخ بصيغة الـlocale (docs/26 §5). - MaterialLocalizations.of(context).formatFullDate(txn.createdAt!), - style: context.texts.bodySmall?.copyWith( - color: context.colors.onSurfaceVariant, - ), - ), - trailing: Text( - Money.format(txn.amount, currency), - style: numericStyle(context.texts.titleSmall).copyWith( - color: isCredit ? colors.success : colors.danger, - ), - ), - ); - } -} diff --git a/apps/driver_new/lib/main.dart b/apps/driver_new/lib/main.dart deleted file mode 100644 index 955cded..0000000 --- a/apps/driver_new/lib/main.dart +++ /dev/null @@ -1,15 +0,0 @@ -import 'package:flutter/material.dart'; -import 'package:flutter_bloc/flutter_bloc.dart'; - -import 'app.dart'; -import 'core/di.dart'; -import 'core/session/session_cubit.dart'; - -Future main() async { - WidgetsFlutterBinding.ensureInitialized(); - await setupInjector(); - runApp( - // الجلسة فوق الجميع: الراوتر والشاشات يقرآنها من نقطة واحدة. - BlocProvider.value(value: sl(), child: const TripzApp()), - ); -} diff --git a/apps/driver_new/pubspec.lock b/apps/driver_new/pubspec.lock deleted file mode 100644 index 63c1022..0000000 --- a/apps/driver_new/pubspec.lock +++ /dev/null @@ -1,1175 +0,0 @@ -# Generated by pub -# See https://dart.dev/tools/pub/glossary#lockfile -packages: - _flutterfire_internals: - dependency: transitive - description: - name: _flutterfire_internals - sha256: "6727cf2ced9b104abca9daa278380be2eca2b98ce33d4b46f11708e387dc6b4d" - url: "https://pub.dev" - source: hosted - version: "1.3.76" - archive: - dependency: transitive - description: - name: archive - sha256: a96e8b390886ee8abb49b7bd3ac8df6f451c621619f52a26e815fdcf568959ff - url: "https://pub.dev" - source: hosted - version: "4.0.9" - args: - dependency: transitive - description: - name: args - sha256: d0481093c50b1da8910eb0bb301626d4d8eb7284aa739614d2b394ee09e3ea04 - url: "https://pub.dev" - source: hosted - version: "2.7.0" - async: - dependency: transitive - description: - name: async - sha256: e2eb0491ba5ddb6177742d2da23904574082139b07c1e33b8503b9f46f3e1a37 - url: "https://pub.dev" - source: hosted - version: "2.13.1" - bloc: - dependency: transitive - description: - name: bloc - sha256: e03b235924e4f509c27b5d6b2f949200e0a91149a9818b4f65eeb56662b75413 - url: "https://pub.dev" - source: hosted - version: "9.2.1" - boolean_selector: - dependency: transitive - description: - name: boolean_selector - sha256: "8aab1771e1243a5063b8b0ff68042d67334e3feab9e95b9490f9a6ebf73b42ea" - url: "https://pub.dev" - source: hosted - version: "2.1.2" - characters: - dependency: transitive - description: - name: characters - sha256: faf38497bda5ead2a8c7615f4f7939df04333478bf32e4173fcb06d428b5716b - url: "https://pub.dev" - source: hosted - version: "1.4.1" - clock: - dependency: transitive - description: - name: clock - sha256: fddb70d9b5277016c77a80201021d40a2247104d9f4aa7bab7157b7e3f05b84b - url: "https://pub.dev" - source: hosted - version: "1.1.2" - code_assets: - dependency: transitive - description: - name: code_assets - sha256: bf394f466ba9205f1812a0433b392d6af280f155f56651eda7c18cc32ed493b8 - url: "https://pub.dev" - source: hosted - version: "1.2.1" - collection: - dependency: transitive - description: - name: collection - sha256: "2f5709ae4d3d59dd8f7cd309b4e023046b57d8a6c82130785d2b0e5868084e76" - url: "https://pub.dev" - source: hosted - version: "1.19.1" - cross_file: - dependency: transitive - description: - name: cross_file - sha256: "92c9c43c383bfa1c32079d3bc492d55d6d4318044b7b47edaff8971cbb555c51" - url: "https://pub.dev" - source: hosted - version: "0.3.5+4" - crypto: - dependency: transitive - description: - name: crypto - sha256: c8ea0233063ba03258fbcf2ca4d6dadfefe14f02fab57702265467a19f27fadf - url: "https://pub.dev" - source: hosted - version: "3.0.7" - cupertino_icons: - dependency: "direct main" - description: - name: cupertino_icons - sha256: "41e005c33bd814be4d3096aff55b1908d419fde52ca656c8c47719ec745873cd" - url: "https://pub.dev" - source: hosted - version: "1.0.9" - dbus: - dependency: transitive - description: - name: dbus - sha256: "0ce9b0a839e6dee59a37a623d2fc26a35bbbe6404213e419b0d6411023d62645" - url: "https://pub.dev" - source: hosted - version: "0.7.14" - device_info_plus: - dependency: "direct main" - description: - name: device_info_plus - sha256: "4df8babf73058181227e18b08e6ea3520cf5fc5d796888d33b7cb0f33f984b7c" - url: "https://pub.dev" - source: hosted - version: "12.3.0" - device_info_plus_platform_interface: - dependency: transitive - description: - name: device_info_plus_platform_interface - sha256: e1ea89119e34903dca74b883d0dd78eb762814f97fb6c76f35e9ff74d261a18f - url: "https://pub.dev" - source: hosted - version: "7.0.3" - dio: - dependency: "direct main" - description: - name: dio - sha256: "0df44ebba85e503958eb75d07eedd3c86275a58c1d3eda2f2ce8f0a2c3abbb3c" - url: "https://pub.dev" - source: hosted - version: "5.11.0" - dio_web_adapter: - dependency: transitive - description: - name: dio_web_adapter - sha256: "0786d0b7295a373de356fc0af4f6f1d0ab2844ed31b19dfc5e7556b70e24212c" - url: "https://pub.dev" - source: hosted - version: "2.2.1" - equatable: - dependency: "direct main" - description: - name: equatable - sha256: "3bce007a596ff8b3119c45d68aaef631272537c03d30e5d4534dd24bf4c5eaa2" - url: "https://pub.dev" - source: hosted - version: "2.1.0" - fake_async: - dependency: transitive - description: - name: fake_async - sha256: "5368f224a74523e8d2e7399ea1638b37aecfca824a3cc4dfdf77bf1fa905ac44" - url: "https://pub.dev" - source: hosted - version: "1.3.3" - ffi: - dependency: transitive - description: - name: ffi - sha256: "6d7fd89431262d8f3125e81b50d3847a091d846eafcd4fdb88dd06f36d705a45" - url: "https://pub.dev" - source: hosted - version: "2.2.0" - file: - dependency: transitive - description: - name: file - sha256: a3b4f84adafef897088c160faf7dfffb7696046cb13ae90b508c2cbc95d3b8d4 - url: "https://pub.dev" - source: hosted - version: "7.0.1" - file_selector_linux: - dependency: transitive - description: - name: file_selector_linux - sha256: "2567f398e06ac72dcf2e98a0c95df2a9edd03c2c2e0cacd4780f20cdf56263a0" - url: "https://pub.dev" - source: hosted - version: "0.9.4" - file_selector_macos: - dependency: transitive - description: - name: file_selector_macos - sha256: "5e0bbe9c312416f1787a68259ea1505b52f258c587f12920422671807c4d618a" - url: "https://pub.dev" - source: hosted - version: "0.9.5" - file_selector_platform_interface: - dependency: transitive - description: - name: file_selector_platform_interface - sha256: "35e0bd61ebcdb91a3505813b055b09b79dfdc7d0aee9c09a7ba59ae4bb13dc85" - url: "https://pub.dev" - source: hosted - version: "2.7.0" - file_selector_windows: - dependency: transitive - description: - name: file_selector_windows - sha256: "62197474ae75893a62df75939c777763d39c2bc5f73ce5b88497208bc269abfd" - url: "https://pub.dev" - source: hosted - version: "0.9.3+5" - firebase_core: - dependency: "direct main" - description: - name: firebase_core - sha256: "9478ca6700c02d315c6aba37e206e612317f98bb4f335bb1cbd6e0ce67dcf764" - url: "https://pub.dev" - source: hosted - version: "4.13.0" - firebase_core_platform_interface: - dependency: transitive - description: - name: firebase_core_platform_interface - sha256: e28f9afdcb5b0f0a8ea74ea3b322f5a7592c81cb45dd9d189913bdae08a2089a - url: "https://pub.dev" - source: hosted - version: "8.1.0" - firebase_core_web: - dependency: transitive - description: - name: firebase_core_web - sha256: f471a288b0101a45567548322ac4a5ad31e3ecbf87a576dcc0e424e6a11e04ea - url: "https://pub.dev" - source: hosted - version: "3.10.0" - firebase_messaging: - dependency: "direct main" - description: - name: firebase_messaging - sha256: "55cf1000dd72d229ebff3ce6a399bd35705a7675275478b31308afd90ac85751" - url: "https://pub.dev" - source: hosted - version: "16.5.0" - firebase_messaging_platform_interface: - dependency: transitive - description: - name: firebase_messaging_platform_interface - sha256: e5fbb62bd23a27c983825277877ac91fdfdb6bfb31c6e5399700963ae586e339 - url: "https://pub.dev" - source: hosted - version: "4.9.3" - firebase_messaging_web: - dependency: transitive - description: - name: firebase_messaging_web - sha256: "663d320e90a41fe57d651ec79df2bc831bf29e051bc0c2cd41faf3106eb412d9" - url: "https://pub.dev" - source: hosted - version: "4.2.4" - fixnum: - dependency: transitive - description: - name: fixnum - sha256: b6dc7065e46c974bc7c5f143080a6764ec7a4be6da1285ececdc37be96de53be - url: "https://pub.dev" - source: hosted - version: "1.1.1" - flutter: - dependency: "direct main" - description: flutter - source: sdk - version: "0.0.0" - flutter_bloc: - dependency: "direct main" - description: - name: flutter_bloc - sha256: cf51747952201a455a1c840f8171d273be009b932c75093020f9af64f2123e38 - url: "https://pub.dev" - source: hosted - version: "9.1.1" - flutter_lints: - dependency: "direct dev" - description: - name: flutter_lints - sha256: "3105dc8492f6183fb076ccf1f351ac3d60564bff92e20bfc4af9cc1651f4e7e1" - url: "https://pub.dev" - source: hosted - version: "6.0.0" - flutter_localizations: - dependency: "direct main" - description: flutter - source: sdk - version: "0.0.0" - flutter_plugin_android_lifecycle: - dependency: transitive - description: - name: flutter_plugin_android_lifecycle - sha256: "3854fe5e3bff0b113c658f260b90c95dea17c92db0f2addeac2e343dd9969785" - url: "https://pub.dev" - source: hosted - version: "2.0.35" - flutter_secure_storage: - dependency: "direct main" - description: - name: flutter_secure_storage - sha256: "7686b1d6a29985dcbb808c59518226e603e3bfa7c0ddfd1a0d00e4cda77c868e" - url: "https://pub.dev" - source: hosted - version: "10.3.1" - flutter_secure_storage_darwin: - dependency: transitive - description: - name: flutter_secure_storage_darwin - sha256: "82329fa5cdf343773b1b6897dea959105a29f092454259edff92f9f6637e8149" - url: "https://pub.dev" - source: hosted - version: "0.3.2" - flutter_secure_storage_linux: - dependency: transitive - description: - name: flutter_secure_storage_linux - sha256: a5f35ddab43cf5c8215d2feb4ce1957851f28c5c37e6f04335066a0602087bf5 - url: "https://pub.dev" - source: hosted - version: "3.0.1" - flutter_secure_storage_platform_interface: - dependency: transitive - description: - name: flutter_secure_storage_platform_interface - sha256: "06686df417f34fe9f963ed217b7fdce250e2f637ddd6c374d7eb054549770633" - url: "https://pub.dev" - source: hosted - version: "2.0.2" - flutter_secure_storage_web: - dependency: transitive - description: - name: flutter_secure_storage_web - sha256: "073a62b3aeb866ab4ce795f960413948e51e5a42a9b0c8333b6daf5bb3208a1c" - url: "https://pub.dev" - source: hosted - version: "2.1.1" - flutter_secure_storage_windows: - dependency: transitive - description: - name: flutter_secure_storage_windows - sha256: "3b7c8e068875dfd46719ff57c90d8c459c87f2302ed6b00ff006b3c9fcad1613" - url: "https://pub.dev" - source: hosted - version: "4.1.0" - flutter_test: - dependency: "direct dev" - description: flutter - source: sdk - version: "0.0.0" - flutter_web_plugins: - dependency: transitive - description: flutter - source: sdk - version: "0.0.0" - geoclue: - dependency: transitive - description: - name: geoclue - sha256: c2a998c77474fc57aa00c6baa2928e58f4b267649057a1c76738656e9dbd2a7f - url: "https://pub.dev" - source: hosted - version: "0.1.1" - geolocator: - dependency: "direct main" - description: - name: geolocator - sha256: "79939537046c9025be47ec645f35c8090ecadb6fe98eba146a0d25e8c1357516" - url: "https://pub.dev" - source: hosted - version: "14.0.2" - geolocator_android: - dependency: transitive - description: - name: geolocator_android - sha256: "86ea1654e4f61ff51466848e91c116b422d6010ea269fda0fbe1af7e9e742ce1" - url: "https://pub.dev" - source: hosted - version: "5.0.3" - geolocator_apple: - dependency: transitive - description: - name: geolocator_apple - sha256: "853803d6bb1713c094e935b4a5ae5f19c0308acf81da13fa9ff84fb4c70c0b73" - url: "https://pub.dev" - source: hosted - version: "2.3.14" - geolocator_linux: - dependency: transitive - description: - name: geolocator_linux - sha256: c4e966f0a7a87e70049eac7a2617f9e16fd4c585a26e4330bdfc3a71e6a721f3 - url: "https://pub.dev" - source: hosted - version: "0.2.3" - geolocator_platform_interface: - dependency: transitive - description: - name: geolocator_platform_interface - sha256: cdb082e4f048b69da244117b7914cc60d2a8897546ffaa4f2529c786ded7aee2 - url: "https://pub.dev" - source: hosted - version: "4.2.8" - geolocator_web: - dependency: transitive - description: - name: geolocator_web - sha256: "19e485a0f8d6a88abcf9c53cba3a4105e14b7435ed8ac1c108c067b938fe8429" - url: "https://pub.dev" - source: hosted - version: "4.1.4" - geolocator_windows: - dependency: transitive - description: - name: geolocator_windows - sha256: "175435404d20278ffd220de83c2ca293b73db95eafbdc8131fe8609be1421eb6" - url: "https://pub.dev" - source: hosted - version: "0.2.5" - get_it: - dependency: "direct main" - description: - name: get_it - sha256: ae78de7c3f2304b8d81f2bb6e320833e5e81de942188542328f074978cc0efa9 - url: "https://pub.dev" - source: hosted - version: "8.3.0" - go_router: - dependency: "direct main" - description: - name: go_router - sha256: f02fd7d2a4dc512fec615529824fdd217fecb3a3d3de68360293a551f21634b3 - url: "https://pub.dev" - source: hosted - version: "14.8.1" - gsettings: - dependency: transitive - description: - name: gsettings - sha256: "1b0ce661f5436d2db1e51f3c4295a49849f03d304003a7ba177d01e3a858249c" - url: "https://pub.dev" - source: hosted - version: "0.2.8" - hooks: - dependency: transitive - description: - name: hooks - sha256: "9a62a50b50b769a737bc0a8ff381f333529df3ab746b2f6b02e83760231455ba" - url: "https://pub.dev" - source: hosted - version: "2.0.2" - http: - dependency: transitive - description: - name: http - sha256: "87721a4a50b19c7f1d49001e51409bddc46303966ce89a65af4f4e6004896412" - url: "https://pub.dev" - source: hosted - version: "1.6.0" - http_parser: - dependency: transitive - description: - name: http_parser - sha256: "178d74305e7866013777bab2c3d8726205dc5a4dd935297175b19a23a2e66571" - url: "https://pub.dev" - source: hosted - version: "4.1.2" - image: - dependency: transitive - description: - name: image - sha256: f9881ff4998044947ec38d098bc7c8316ae1186fa786eddffdb867b9bc94dfce - url: "https://pub.dev" - source: hosted - version: "4.8.0" - image_picker: - dependency: "direct main" - description: - name: image_picker - sha256: d8402284df184bc05f4a2210c6c23983b0720f4cd87cbd05c5390a78af602667 - url: "https://pub.dev" - source: hosted - version: "1.2.3" - image_picker_android: - dependency: transitive - description: - name: image_picker_android - sha256: d5b3e1774af29c9ab00103afb0d4614070f924d2e0057ac867ec98800114793f - url: "https://pub.dev" - source: hosted - version: "0.8.13+17" - image_picker_for_web: - dependency: transitive - description: - name: image_picker_for_web - sha256: "66257a3191ab360d23a55c8241c91a6e329d31e94efa7be9cf7a212e65850214" - url: "https://pub.dev" - source: hosted - version: "3.1.1" - image_picker_ios: - dependency: transitive - description: - name: image_picker_ios - sha256: b9c4a438a9ff4f60808c9cf0039b93a42bb6c2211ef6ebb647394b2b3fa84588 - url: "https://pub.dev" - source: hosted - version: "0.8.13+6" - image_picker_linux: - dependency: transitive - description: - name: image_picker_linux - sha256: "1f81c5f2046b9ab724f85523e4af65be1d47b038160a8c8deed909762c308ed4" - url: "https://pub.dev" - source: hosted - version: "0.2.2" - image_picker_macos: - dependency: transitive - description: - name: image_picker_macos - sha256: "86f0f15a309de7e1a552c12df9ce5b59fe927e71385329355aec4776c6a8ec91" - url: "https://pub.dev" - source: hosted - version: "0.2.2+1" - image_picker_platform_interface: - dependency: transitive - description: - name: image_picker_platform_interface - sha256: "567e056716333a1647c64bb6bd873cff7622233a5c3f694be28a583d4715690c" - url: "https://pub.dev" - source: hosted - version: "2.11.1" - image_picker_windows: - dependency: transitive - description: - name: image_picker_windows - sha256: d248c86554a72b5495a31c56f060cf73a41c7ff541689327b1a7dbccc33adfae - url: "https://pub.dev" - source: hosted - version: "0.2.2" - intaleq_maps: - dependency: "direct main" - description: - name: intaleq_maps - sha256: "755ed2f28350cbef80deb055f4d98f94a8a23370f8dbf77d7eb4cd91a1ffd76b" - url: "https://pub.dev" - source: hosted - version: "2.3.0" - intl: - dependency: "direct main" - description: - name: intl - sha256: "3df61194eb431efc39c4ceba583b95633a403f46c9fd341e550ce0bfa50e9aa5" - url: "https://pub.dev" - source: hosted - version: "0.20.2" - jni: - dependency: transitive - description: - name: jni - sha256: f038e58b4dc2c9037f50e233175086337e0b305e356d28211bf55f21c504cbd3 - url: "https://pub.dev" - source: hosted - version: "1.0.3" - jni_flutter: - dependency: transitive - description: - name: jni_flutter - sha256: "7b717011ea40d04fd47c2731d3d1d36eb99eba3435c2753d62489e8c3c9991d5" - url: "https://pub.dev" - source: hosted - version: "1.0.2" - jni_util: - dependency: transitive - description: - name: jni_util - sha256: "1ba86da04a5f2bf18fde2edb235587e70c5b0fc5bd4ba955f46b00942c3fc35f" - url: "https://pub.dev" - source: hosted - version: "1.0.0" - leak_tracker: - dependency: transitive - description: - name: leak_tracker - sha256: "33e2e26bdd85a0112ec15400c8cbffea70d0f9c3407491f672a2fad47915e2de" - url: "https://pub.dev" - source: hosted - version: "11.0.2" - leak_tracker_flutter_testing: - dependency: transitive - description: - name: leak_tracker_flutter_testing - sha256: "1dbc140bb5a23c75ea9c4811222756104fbcd1a27173f0c34ca01e16bea473c1" - url: "https://pub.dev" - source: hosted - version: "3.0.10" - leak_tracker_testing: - dependency: transitive - description: - name: leak_tracker_testing - sha256: "8d5a2d49f4a66b49744b23b018848400d23e54caf9463f4eb20df3eb8acb2eb1" - url: "https://pub.dev" - source: hosted - version: "3.0.2" - lints: - dependency: transitive - description: - name: lints - sha256: "12f842a479589fea194fe5c5a3095abc7be0c1f2ddfa9a0e76aed1dbd26a87df" - url: "https://pub.dev" - source: hosted - version: "6.1.0" - logging: - dependency: transitive - description: - name: logging - sha256: c8245ada5f1717ed44271ed1c26b8ce85ca3228fd2ffdb75468ab01979309d61 - url: "https://pub.dev" - source: hosted - version: "1.3.0" - maplibre_gl: - dependency: transitive - description: - name: maplibre_gl - sha256: d9773555ae4ebab94bbc3ae2176b077cfda486ec729eefe01e1613f164cb8410 - url: "https://pub.dev" - source: hosted - version: "0.25.0" - maplibre_gl_platform_interface: - dependency: transitive - description: - name: maplibre_gl_platform_interface - sha256: bd7de401dea24dd7e8a6f2fa736ddee7dbbee3e24a9027f0afdd619994702047 - url: "https://pub.dev" - source: hosted - version: "0.25.0" - maplibre_gl_web: - dependency: transitive - description: - name: maplibre_gl_web - sha256: af0e48bf96e8dd99f8b958a1953126971eb8a0527b9735441d4f24df3913f5a2 - url: "https://pub.dev" - source: hosted - version: "0.25.0" - matcher: - dependency: transitive - description: - name: matcher - sha256: "12956d0ad8390bbcc63ca2e1469c0619946ccb52809807067a7020d57e647aa6" - url: "https://pub.dev" - source: hosted - version: "0.12.18" - material_color_utilities: - dependency: transitive - description: - name: material_color_utilities - sha256: "9c337007e82b1889149c82ed242ed1cb24a66044e30979c44912381e9be4c48b" - url: "https://pub.dev" - source: hosted - version: "0.13.0" - meta: - dependency: transitive - description: - name: meta - sha256: "23f08335362185a5ea2ad3a4e597f1375e78bce8a040df5c600c8d3552ef2394" - url: "https://pub.dev" - source: hosted - version: "1.17.0" - mime: - dependency: transitive - description: - name: mime - sha256: "41a20518f0cb1256669420fdba0cd90d21561e560ac240f26ef8322e45bb7ed6" - url: "https://pub.dev" - source: hosted - version: "2.0.0" - nested: - dependency: transitive - description: - name: nested - sha256: "03bac4c528c64c95c722ec99280375a6f2fc708eec17c7b3f07253b626cd2a20" - url: "https://pub.dev" - source: hosted - version: "1.0.0" - objective_c: - dependency: transitive - description: - name: objective_c - sha256: b7fb95a6d9a4f009edd63dc5ac69f07420b23a16161c6dd8660290b59c602e8e - url: "https://pub.dev" - source: hosted - version: "9.5.0" - package_config: - dependency: transitive - description: - name: package_config - sha256: ffcf4cf3d6c0b74ac43708d9f56625506e8a68aa935abe9d267a7330f320eb5d - url: "https://pub.dev" - source: hosted - version: "3.0.0" - package_info_plus: - dependency: "direct main" - description: - name: package_info_plus - sha256: "16eee997588c60225bda0488b6dcfac69280a6b7a3cf02c741895dd370a02968" - url: "https://pub.dev" - source: hosted - version: "8.3.1" - package_info_plus_platform_interface: - dependency: transitive - description: - name: package_info_plus_platform_interface - sha256: "202a487f08836a592a6bd4f901ac69b3a8f146af552bbd14407b6b41e1c3f086" - url: "https://pub.dev" - source: hosted - version: "3.2.1" - path: - dependency: transitive - description: - name: path - sha256: "75cca69d1490965be98c73ceaea117e8a04dd21217b37b292c9ddbec0d955bc5" - url: "https://pub.dev" - source: hosted - version: "1.9.1" - path_provider: - dependency: transitive - description: - name: path_provider - sha256: a7f4874f987173da295a61c181b8ee71dab59b332a486b391babf26a1b884825 - url: "https://pub.dev" - source: hosted - version: "2.1.6" - path_provider_android: - dependency: transitive - description: - name: path_provider_android - sha256: "69cbd515a62b94d32a7944f086b2f82b4ac40a1d45bebfc00813a430ab2dabcd" - url: "https://pub.dev" - source: hosted - version: "2.3.1" - path_provider_foundation: - dependency: transitive - description: - name: path_provider_foundation - sha256: "2a376b7d6392d80cd3705782d2caa734ca4727776db0b6ec36ef3f1855197699" - url: "https://pub.dev" - source: hosted - version: "2.6.0" - path_provider_linux: - dependency: transitive - description: - name: path_provider_linux - sha256: "58c2005f147315b11e9b4a7bc889cd5203e250cba8e3f012dae259b4972b5c16" - url: "https://pub.dev" - source: hosted - version: "2.2.2" - path_provider_platform_interface: - dependency: transitive - description: - name: path_provider_platform_interface - sha256: "484838772624c3a4b94f1e44a3e19897fee738f2d5c4ce448443b0417f7c9dda" - url: "https://pub.dev" - source: hosted - version: "2.1.3" - path_provider_windows: - dependency: transitive - description: - name: path_provider_windows - sha256: bd6f00dbd873bfb70d0761682da2b3a2c2fccc2b9e84c495821639601d81afe7 - url: "https://pub.dev" - source: hosted - version: "2.3.0" - permission_handler: - dependency: "direct main" - description: - name: permission_handler - sha256: fe54465bcc62a4564c6e4db337bbaded6c0c0fa6e10487414436d163114784f6 - url: "https://pub.dev" - source: hosted - version: "12.0.3" - permission_handler_android: - dependency: transitive - description: - name: permission_handler_android - sha256: "1e3bc410ca1bf84662104b100eb126e066cb55791b7451307f9708d4007350e6" - url: "https://pub.dev" - source: hosted - version: "13.0.1" - permission_handler_apple: - dependency: transitive - description: - name: permission_handler_apple - sha256: "11b7e94a9d2fbee23c27f0cae0105c6266c03fd83b9a2eda6cf09141fc82624b" - url: "https://pub.dev" - source: hosted - version: "9.5.0" - permission_handler_html: - dependency: transitive - description: - name: permission_handler_html - sha256: "6ea98b3f17f60d3b527f2647ed2ab4dc0f6bfe25b22cb1c363f5d8f62252f6ac" - url: "https://pub.dev" - source: hosted - version: "0.1.4+1" - permission_handler_platform_interface: - dependency: transitive - description: - name: permission_handler_platform_interface - sha256: a5c8a97ecf5616112a5b16d4b8e9ec0e5ae90ef63ac69c0d7b8ae240be760b23 - url: "https://pub.dev" - source: hosted - version: "4.4.0" - permission_handler_windows: - dependency: transitive - description: - name: permission_handler_windows - sha256: caeae01858a0a7d2df67a445ac98e1ad95e55a0e77c73044f4e9b1c8c2289cbd - url: "https://pub.dev" - source: hosted - version: "0.2.2" - petitparser: - dependency: transitive - description: - name: petitparser - sha256: "91bd59303e9f769f108f8df05e371341b15d59e995e6806aefab827b58336675" - url: "https://pub.dev" - source: hosted - version: "7.0.2" - platform: - dependency: transitive - description: - name: platform - sha256: "5d6b1b0036a5f331ebc77c850ebc8506cbc1e9416c27e59b439f917a902a4984" - url: "https://pub.dev" - source: hosted - version: "3.1.6" - plugin_platform_interface: - dependency: transitive - description: - name: plugin_platform_interface - sha256: "4820fbfdb9478b1ebae27888254d445073732dae3d6ea81f0b7e06d5dedc3f02" - url: "https://pub.dev" - source: hosted - version: "2.1.8" - posix: - dependency: transitive - description: - name: posix - sha256: bc1bad54ad2b735816e31f8d4600cfde6c7839975085ddfbca48b6c9f7c4044e - url: "https://pub.dev" - source: hosted - version: "6.5.2" - provider: - dependency: transitive - description: - name: provider - sha256: "4e82183fa20e5ca25703ead7e05de9e4cceed1fbd1eadc1ac3cb6f565a09f272" - url: "https://pub.dev" - source: hosted - version: "6.1.5+1" - pub_semver: - dependency: transitive - description: - name: pub_semver - sha256: "5bfcf68ca79ef689f8990d1160781b4bad40a3bd5e5218ad4076ddb7f4081585" - url: "https://pub.dev" - source: hosted - version: "2.2.0" - record_use: - dependency: transitive - description: - name: record_use - sha256: "2551bd8eecfe95d14ae75f6021ad0248be5c27f138c2ec12fcb52b500b3ba1ed" - url: "https://pub.dev" - source: hosted - version: "0.6.0" - share_plus: - dependency: "direct main" - description: - name: share_plus - sha256: "223873d106614442ea6f20db5a038685cc5b32a2fba81cdecaefbbae0523f7fa" - url: "https://pub.dev" - source: hosted - version: "12.0.2" - share_plus_platform_interface: - dependency: transitive - description: - name: share_plus_platform_interface - sha256: "88023e53a13429bd65d8e85e11a9b484f49d4c190abbd96c7932b74d6927cc9a" - url: "https://pub.dev" - source: hosted - version: "6.1.0" - shared_preferences: - dependency: "direct main" - description: - name: shared_preferences - sha256: c3025c5534b01739267eb7d76959bbc25a6d10f6988e1c2a3036940133dd10bf - url: "https://pub.dev" - source: hosted - version: "2.5.5" - shared_preferences_android: - dependency: transitive - description: - name: shared_preferences_android - sha256: e8d4762b1e2e8578fc4d0fd548cebf24afd24f49719c08974df92834565e2c53 - url: "https://pub.dev" - source: hosted - version: "2.4.23" - shared_preferences_foundation: - dependency: transitive - description: - name: shared_preferences_foundation - sha256: "4e7eaffc2b17ba398759f1151415869a34771ba11ebbccd1b0145472a619a64f" - url: "https://pub.dev" - source: hosted - version: "2.5.6" - shared_preferences_linux: - dependency: transitive - description: - name: shared_preferences_linux - sha256: "580abfd40f415611503cae30adf626e6656dfb2f0cee8f465ece7b6defb40f2f" - url: "https://pub.dev" - source: hosted - version: "2.4.1" - shared_preferences_platform_interface: - dependency: transitive - description: - name: shared_preferences_platform_interface - sha256: "649dc798a33931919ea356c4305c2d1f81619ea6e92244070b520187b5140ef9" - url: "https://pub.dev" - source: hosted - version: "2.4.2" - shared_preferences_web: - dependency: transitive - description: - name: shared_preferences_web - sha256: c49bd060261c9a3f0ff445892695d6212ff603ef3115edbb448509d407600019 - url: "https://pub.dev" - source: hosted - version: "2.4.3" - shared_preferences_windows: - dependency: transitive - description: - name: shared_preferences_windows - sha256: "94ef0f72b2d71bc3e700e025db3710911bd51a71cefb65cc609dd0d9a982e3c1" - url: "https://pub.dev" - source: hosted - version: "2.4.1" - sky_engine: - dependency: transitive - description: flutter - source: sdk - version: "0.0.0" - socket_io_client: - dependency: "direct main" - description: - name: socket_io_client - sha256: f5990ff303d385e7b2150f0e57cca097a8d20c6a2ae0a22cb2d496661ea8ed9b - url: "https://pub.dev" - source: hosted - version: "3.1.6" - socket_io_common: - dependency: transitive - description: - name: socket_io_common - sha256: "162fbaecbf4bf9a9372a62a341b3550b51dcef2f02f3e5830a297fd48203d45b" - url: "https://pub.dev" - source: hosted - version: "3.1.1" - source_span: - dependency: transitive - description: - name: source_span - sha256: "56a02f1f4cd1a2d96303c0144c93bd6d909eea6bee6bf5a0e0b685edbd4c47ab" - url: "https://pub.dev" - source: hosted - version: "1.10.2" - stack_trace: - dependency: transitive - description: - name: stack_trace - sha256: "8b27215b45d22309b5cddda1aa2b19bdfec9df0e765f2de506401c071d38d1b1" - url: "https://pub.dev" - source: hosted - version: "1.12.1" - stream_channel: - dependency: transitive - description: - name: stream_channel - sha256: "969e04c80b8bcdf826f8f16579c7b14d780458bd97f56d107d3950fdbeef059d" - url: "https://pub.dev" - source: hosted - version: "2.1.4" - string_scanner: - dependency: transitive - description: - name: string_scanner - sha256: "921cd31725b72fe181906c6a94d987c78e3b98c2e205b397ea399d4054872b43" - url: "https://pub.dev" - source: hosted - version: "1.4.1" - term_glyph: - dependency: transitive - description: - name: term_glyph - sha256: "7f554798625ea768a7518313e58f83891c7f5024f88e46e7182a4558850a4b8e" - url: "https://pub.dev" - source: hosted - version: "1.2.2" - test_api: - dependency: transitive - description: - name: test_api - sha256: "93167629bfc610f71560ab9312acdda4959de4df6fac7492c89ff0d3886f6636" - url: "https://pub.dev" - source: hosted - version: "0.7.9" - typed_data: - dependency: transitive - description: - name: typed_data - sha256: f9049c039ebfeb4cf7a7104a675823cd72dba8297f264b6637062516699fa006 - url: "https://pub.dev" - source: hosted - version: "1.4.0" - url_launcher: - dependency: "direct main" - description: - name: url_launcher - sha256: f6a7e5c4835bb4e3026a04793a4199ca2d14c739ec378fdfe23fc8075d0439f8 - url: "https://pub.dev" - source: hosted - version: "6.3.2" - url_launcher_android: - dependency: transitive - description: - name: url_launcher_android - sha256: "17bc677f0b301615530dd1d67e0a9828cafa2d0b6b6eae4cd3679b7eac4a273c" - url: "https://pub.dev" - source: hosted - version: "6.3.30" - url_launcher_ios: - dependency: transitive - description: - name: url_launcher_ios - sha256: "580fe5dfb51671ae38191d316e027f6b76272b026370708c2d898799750a02b0" - url: "https://pub.dev" - source: hosted - version: "6.4.1" - url_launcher_linux: - dependency: transitive - description: - name: url_launcher_linux - sha256: d5e14138b3bc193a0f63c10a53c94b91d399df0512b1f29b94a043db7482384a - url: "https://pub.dev" - source: hosted - version: "3.2.2" - url_launcher_macos: - dependency: transitive - description: - name: url_launcher_macos - sha256: "368adf46f71ad3c21b8f06614adb38346f193f3a59ba8fe9a2fd74133070ba18" - url: "https://pub.dev" - source: hosted - version: "3.2.5" - url_launcher_platform_interface: - dependency: transitive - description: - name: url_launcher_platform_interface - sha256: "552f8a1e663569be95a8190206a38187b531910283c3e982193e4f2733f01029" - url: "https://pub.dev" - source: hosted - version: "2.3.2" - url_launcher_web: - dependency: transitive - description: - name: url_launcher_web - sha256: "85c81589622fbc87c1c683aaea164d3604a7777495a79d91e39ffcdec39ddb34" - url: "https://pub.dev" - source: hosted - version: "2.4.3" - url_launcher_windows: - dependency: transitive - description: - name: url_launcher_windows - sha256: "712c70ab1b99744ff066053cbe3e80c73332b38d46e5e945c98689b2e66fc15f" - url: "https://pub.dev" - source: hosted - version: "3.1.5" - uuid: - dependency: transitive - description: - name: uuid - sha256: "9b129329f58692f6e6578329498a8fe9fbe98f090beb764ffbb8ee2eadd01dcd" - url: "https://pub.dev" - source: hosted - version: "4.6.0" - vector_math: - dependency: transitive - description: - name: vector_math - sha256: d530bd74fea330e6e364cda7a85019c434070188383e1cd8d9777ee586914c5b - url: "https://pub.dev" - source: hosted - version: "2.2.0" - vm_service: - dependency: transitive - description: - name: vm_service - sha256: "0016aef94fc66495ac78af5859181e3f3bf2026bd8eecc72b9565601e19ab360" - url: "https://pub.dev" - source: hosted - version: "15.2.0" - web: - dependency: transitive - description: - name: web - sha256: "868d88a33d8a87b18ffc05f9f030ba328ffefba92d6c127917a2ba740f9cfe4a" - url: "https://pub.dev" - source: hosted - version: "1.1.1" - web_socket: - dependency: transitive - description: - name: web_socket - sha256: "34d64019aa8e36bf9842ac014bb5d2f5586ca73df5e4d9bf5c936975cae6982c" - url: "https://pub.dev" - source: hosted - version: "1.0.1" - win32: - dependency: transitive - description: - name: win32 - sha256: d7cb55e04cd34096cd3a79b3330245f54cb96a370a1c27adb3c84b917de8b08e - url: "https://pub.dev" - source: hosted - version: "5.15.0" - win32_registry: - dependency: transitive - description: - name: win32_registry - sha256: "6f1b564492d0147b330dd794fee8f512cec4977957f310f9951b5f9d83618dae" - url: "https://pub.dev" - source: hosted - version: "2.1.0" - xdg_directories: - dependency: transitive - description: - name: xdg_directories - sha256: "7a3f37b05d989967cdddcbb571f1ea834867ae2faa29725fd085180e0883aa15" - url: "https://pub.dev" - source: hosted - version: "1.1.0" - xml: - dependency: transitive - description: - name: xml - sha256: "971043b3a0d3da28727e40ed3e0b5d18b742fa5a68665cca88e74b7876d5e025" - url: "https://pub.dev" - source: hosted - version: "6.6.1" - yaml: - dependency: transitive - description: - name: yaml - sha256: b9da305ac7c39faa3f030eccd175340f968459dae4af175130b3fc47e40d76ce - url: "https://pub.dev" - source: hosted - version: "3.1.3" -sdks: - dart: ">=3.11.0 <4.0.0" - flutter: ">=3.38.4" diff --git a/apps/driver_new/pubspec.yaml b/apps/driver_new/pubspec.yaml deleted file mode 100644 index 0fcddfc..0000000 --- a/apps/driver_new/pubspec.yaml +++ /dev/null @@ -1,107 +0,0 @@ -name: driver_new -description: "تطبيق السائق — Tripz. مبنيّ من الصفر على Bloc/Cubit وباك إند NestJS (docs/37)." -publish_to: "none" - -# يطابق هوية النشر في android/app/build.gradle — لا يُغيَّر إلا مع رفع إصدار -# حقيقي في المتجر (docs/37 §2.ج). -version: 2.0.152+152 - -environment: - sdk: ^3.11.0 - -dependencies: - flutter: - sdk: flutter - flutter_localizations: - sdk: flutter - - # الحالة والتوجيه والحقن — الإصدارات موحّدة حرفياً مع rider_new (docs/23 §9): - # تباعدهما يعني سلوكاً مختلفاً في كود مشترك. - flutter_bloc: ^9.1.1 - equatable: ^2.0.7 - get_it: ^8.0.3 - go_router: ^14.6.2 - - # الشبكة - dio: ^5.9.1 - - # التخزين — الرموز في التخزين الآمن، والتفضيلات في العادي - flutter_secure_storage: ^10.0.0 - shared_preferences: ^2.3.3 - - intl: ^0.20.2 - - # م4: الخريطة والموقع والواقع اللحظي - intaleq_maps: ^2.3.0 - geolocator: ^14.0.2 - socket_io_client: ^3.0.2 - - # الدراور: المشاركة وفتح الروابط - share_plus: ^12.0.1 - url_launcher: ^6.3.2 - - # م6: الإشعارات — الإعداد الأصلي (google-services) منقول مع الطبقة الأصلية - firebase_core: ^4.4.0 - firebase_messaging: ^16.1.1 - - # تسجيل السائق: تصوير الوثائق - image_picker: ^1.2.1 - - # م3: الأذونات وبصمة الجهاز - permission_handler: ^12.0.1 - device_info_plus: 12.3.0 - - # رقم الإصدار في شاشة الإعدادات — كانت موجودة كاعتماد غير مباشر أصلاً، - # فترقيتها لمباشر لا تجرّ كوداً أصلياً جديداً. - package_info_plus: ^8.1.1 - - cupertino_icons: ^1.0.8 - -# باقي الحزم تُضاف في مرحلتها لا قبلها (docs/37 §1.7): -# م3 لاحقاً: crypto (توقيع طلبات النقاط المالية) -# م4: الخريطة · geolocator · socket_io_client -# م5: التقييم والمحفظة م6: الإشعارات والدردشة - -dev_dependencies: - flutter_test: - sdk: flutter - flutter_lints: ^6.0.0 - -flutter: - uses-material-design: true - - # توليد الترجمة من ARB (docs/26 §4) - generate: true - - assets: - - assets/ - - assets/images/ - - shorebird.yaml - - fonts: - # عربية — تايبوغرافيا نظام التصميم (docs/26) - - family: IBMPlexSansArabic - fonts: - - asset: assets/fonts/IBMPlexSansArabic-Regular.ttf - weight: 400 - - asset: assets/fonts/IBMPlexSansArabic-Medium.ttf - weight: 500 - - asset: assets/fonts/IBMPlexSansArabic-SemiBold.ttf - weight: 600 - - asset: assets/fonts/IBMPlexSansArabic-Bold.ttf - weight: 700 - # لاتينية - - family: Inter - fonts: - - asset: assets/fonts/Inter-Regular.ttf - weight: 400 - - asset: assets/fonts/Inter-Medium.ttf - weight: 500 - - asset: assets/fonts/Inter-SemiBold.ttf - weight: 600 - - asset: assets/fonts/Inter-Bold.ttf - weight: 700 - # أرقام العدّادات (الأجرة/المؤقّت) - - family: Digit - fonts: - - asset: assets/fonts/digit.ttf diff --git a/apps/driver_new/shorebird.yaml b/apps/driver_new/shorebird.yaml deleted file mode 100755 index 4c0bb21..0000000 --- a/apps/driver_new/shorebird.yaml +++ /dev/null @@ -1,14 +0,0 @@ -# This file is used to configure the Shorebird updater used by your app. -# Learn more at https://docs.shorebird.dev -# This file does not contain any sensitive information and should be checked into version control. - -# Your app_id is the unique identifier assigned to your app. -# It is used to identify your app when requesting patches from Shorebird's servers. -# It is not a secret and can be shared publicly. -app_id: 68cc9345-6270-439e-ae58-437fb195836d - -# auto_update controls if Shorebird should automatically update in the background on launch. -# If auto_update: false, you will need to use package:shorebird_code_push to trigger updates. -# https://pub.dev/packages/shorebird_code_push -# Uncomment the following line to disable automatic updates. -# auto_update: false diff --git a/apps/driver_new/tool/driver_l10n_extra.py b/apps/driver_new/tool/driver_l10n_extra.py deleted file mode 100644 index 0f884bc..0000000 --- a/apps/driver_new/tool/driver_l10n_extra.py +++ /dev/null @@ -1,103 +0,0 @@ -"""مفاتيح ترجمة تخصّ تطبيق السائق وحده. - -التطبيقان توأمان (docs/23 §0.1) ونصوصهما المشتركة تُزامَن بـ`rsync` من -الراكب — وهو ينسخ ملفَّي ARB كما هما فيمحو ما يخصّ السائق. لذلك يُعاد -تشغيل هذا السكربت بعد كل مزامنة، ثم `flutter gen-l10n`. -""" -import json -import os - -BASE = os.path.join(os.path.dirname(__file__), '..', 'lib', 'core', 'l10n') - -EXTRA = { - 'ar': { - "obApplyTitle": "سجّل كسائق", - "obApplyLead": "خطوات قصيرة ثم تبدأ العمل", - "obVehicleMake": "شركة السيارة", - "obServiceClass": "نوع الخدمة", - "obApplySubmit": "ابدأ التسجيل", - "obProfileTitle": "بياناتك", - "obNameArabic": "الاسم كما في الهوية", - "obNationalNumber": "الرقم الوطني", - "obGender": "الجنس", - "obGenderMale": "ذكر", - "obGenderFemale": "أنثى", - "obVehicleTitle": "مركبتك", - "obVehicleModel": "الطراز", - "obVehicleYear": "سنة الصنع", - "obVehicleColor": "اللون", - "obVehiclePlate": "رقم اللوحة", - "obDocsTitle": "وثائقك", - "obDocsLead": "صوّر كل وثيقة بوضوح — الاعتماد يتم بعد مراجعتها", - "obDocMissing": "مطلوبة", - "obDocPending": "قيد المراجعة", - "obDocApproved": "مقبولة", - "obDocRejected": "مرفوضة — أعد الرفع", - "obDocSideFront": "الوجه الأمامي", - "obDocSideBack": "الوجه الخلفي", - "obDocUpload": "رفع", - "obPendingTitle": "طلبك قيد المراجعة", - "obPendingLead": "سنُعلمك فور اعتماد حسابك. عادةً خلال يوم عمل.", - "obPendingRefresh": "تحديث الحالة", - "obApprovedTitle": "تم اعتمادك", - "obApprovedLead": "سجّل الدخول من جديد لتفعيل صلاحيات السائق", - "obRelogin": "إعادة تسجيل الدخول", - "phoneTitle": "أهلاً بك، كابتن", - "profileLead": "اسمك يظهر للراكب عند الرحلة.", - "historyEmpty": "لا رحلات بعد — اتصل لتصلك الطلبات", - "rewardsInviteTitle": "ادعُ سائقاً", - "rewardsInviteLead": "شارك كودك — تربح عن كل سائق ينضم", - "menuInvite": "ادعُ سائقاً", - "menuDriverApp": "تطبيق الراكب", - "shareMessage": "انضم لـTripz كسائق — استعمل كودي {code}", - }, - 'en': { - "obApplyTitle": "Register as a driver", - "obApplyLead": "A few short steps, then you're working", - "obVehicleMake": "Car make", - "obServiceClass": "Service class", - "obApplySubmit": "Start registration", - "obProfileTitle": "Your details", - "obNameArabic": "Name as on your ID", - "obNationalNumber": "National ID number", - "obGender": "Gender", - "obGenderMale": "Male", - "obGenderFemale": "Female", - "obVehicleTitle": "Your vehicle", - "obVehicleModel": "Model", - "obVehicleYear": "Year", - "obVehicleColor": "Colour", - "obVehiclePlate": "Plate number", - "obDocsTitle": "Your documents", - "obDocsLead": "Photograph each document clearly — approval follows review", - "obDocMissing": "Required", - "obDocPending": "Under review", - "obDocApproved": "Approved", - "obDocRejected": "Rejected — upload again", - "obDocSideFront": "Front", - "obDocSideBack": "Back", - "obDocUpload": "Upload", - "obPendingTitle": "Your application is under review", - "obPendingLead": "We'll notify you as soon as it's approved. Usually within a business day.", - "obPendingRefresh": "Refresh status", - "obApprovedTitle": "You're approved", - "obApprovedLead": "Sign in again to activate your driver permissions", - "obRelogin": "Sign in again", - "phoneTitle": "Welcome, captain", - "profileLead": "Your name is shown to the rider during a trip.", - "historyEmpty": "No trips yet — go online to receive requests", - "rewardsInviteTitle": "Invite a driver", - "rewardsInviteLead": "Share your code — earn for every driver who joins", - "menuInvite": "Invite a driver", - "menuDriverApp": "Rider app", - "shareMessage": "Join Tripz as a driver — use my code {code}", - }, -} - -for loc, extra in EXTRA.items(): - path = os.path.join(BASE, f'app_{loc}.arb') - data = json.load(open(path)) - data.update(extra) - json.dump(data, open(path, 'w'), ensure_ascii=False, indent=2) - -print(f"أُضيف {len(EXTRA['ar'])} مفتاحاً خاصاً بتطبيق السائق") diff --git a/apps/driver_new/tool/sync_from_rider.sh b/apps/driver_new/tool/sync_from_rider.sh deleted file mode 100755 index d752677..0000000 --- a/apps/driver_new/tool/sync_from_rider.sh +++ /dev/null @@ -1,56 +0,0 @@ -#!/usr/bin/env bash -# مزامنة الكود المشترك من rider_new إلى driver_new. -# -# التطبيقان توأمان في البنية ومختلفان في الميزات (docs/23 §0.1)، ولا حزمة -# مشتركة بينهما لأن docs/23 §1 و docs/26 §10 يفرضان core/ داخل كل تطبيق. -# البديل الوحيد إذن مزامنة منضبطة — وهذا الملف هو تعريفها الوحيد. -# -# التشغيل: bash tool/sync_from_rider.sh -set -euo pipefail -cd "$(dirname "$0")/.." - -# ملفات يملكها السائق ولا تُنسخ من الراكب أبداً -OWN=( - "core/config.dart" # appRole = driver - "core/build_config.dart" # اسم التطبيق + روابط الطرف الآخر - "core/di.dart" # DutyCubit + OnboardingCubit + PayoutCubit - "core/router.dart" # DutyPage + EarningsPage + بوابة التسجيل - "core/l10n/gen" - "features/onboarding" # تسجيل السائق — لا مقابل له عند الراكب - "features/trip/cubit/duty_cubit.dart" - "features/trip/cubit/duty_state.dart" - "features/trip/view/duty_page.dart" - "features/trip/view/widgets/duty_toggle.dart" - "features/trip/view/widgets/offer_sheet.dart" - "features/trip/view/widgets/active_duty_sheet.dart" - "features/wallet/cubit/payout_cubit.dart" - "features/wallet/view/earnings_page.dart" - "features/wallet/view/widgets/payout_sheet.dart" -) - -# ملفات تخصّ الراكب ولا مكان لها عند السائق -RIDER_ONLY=( - "features/trip/cubit/ride_cubit.dart" - "features/trip/cubit/ride_state.dart" - "features/trip/view/ride_page.dart" - "features/trip/view/widgets/planner_sheet.dart" - "features/trip/view/widgets/confirm_sheet.dart" - "features/trip/view/widgets/searching_sheet.dart" - "features/trip/view/widgets/route_timeline.dart" - "features/trip/view/widgets/ride_type_picker.dart" - "features/trip/view/widgets/center_pin.dart" - "features/trip/view/widgets/active_trip_sheet.dart" - "features/trip/view/widgets/cancel_sheet.dart" - "features/wallet/view/wallet_page.dart" -) - -args=() -for p in "${OWN[@]}" "${RIDER_ONLY[@]}"; do args+=(--exclude "$p"); done - -rsync -a "${args[@]}" ../rider_new/lib/ lib/ - -# ملفّا ARB **يُنسخان** من الراكب كي تصل المفاتيح المشتركة الجديدة، ثم -# يُعاد فرض نصوص السائق فوقهما. استثناؤهما من النسخ كان يُسقط كل مفتاح -# مشترك جديد ويكسر البناء — تكرّر ثلاث مرات قبل هذا التصحيح. -python3 tool/driver_l10n_extra.py -echo "✅ تمّت المزامنة — شغّل: flutter gen-l10n && flutter analyze" diff --git a/apps/rider-archive-cubit/README.md b/apps/rider-archive-cubit/README.md deleted file mode 100644 index 5da228d..0000000 --- a/apps/rider-archive-cubit/README.md +++ /dev/null @@ -1,16 +0,0 @@ -# ride - -A new Flutter project. - -## Getting Started - -This project is a starting point for a Flutter application. - -A few resources to get you started if this is your first Flutter project: - -- [Lab: Write your first Flutter app](https://docs.flutter.dev/get-started/codelab) -- [Cookbook: Useful Flutter samples](https://docs.flutter.dev/cookbook) - -For help getting started with Flutter development, view the -[online documentation](https://docs.flutter.dev/), which offers tutorials, -samples, guidance on mobile development, and a full API reference. diff --git a/apps/rider-archive-cubit/analysis_options.yaml b/apps/rider-archive-cubit/analysis_options.yaml deleted file mode 100644 index 61b6c4d..0000000 --- a/apps/rider-archive-cubit/analysis_options.yaml +++ /dev/null @@ -1,29 +0,0 @@ -# This file configures the analyzer, which statically analyzes Dart code to -# check for errors, warnings, and lints. -# -# The issues identified by the analyzer are surfaced in the UI of Dart-enabled -# IDEs (https://dart.dev/tools#ides-and-editors). The analyzer can also be -# invoked from the command line by running `flutter analyze`. - -# The following line activates a set of recommended lints for Flutter apps, -# packages, and plugins designed to encourage good coding practices. -include: package:flutter_lints/flutter.yaml - -linter: - # The lint rules applied to this project can be customized in the - # section below to disable rules from the `package:flutter_lints/flutter.yaml` - # included above or to enable additional rules. A list of all available lints - # and their documentation is published at - # https://dart-lang.github.io/linter/lints/index.html. - # - # Instead of disabling a lint rule for the entire project in the - # section below, it can also be suppressed for a single line of code - # or a specific dart file by using the `// ignore: name_of_lint` and - # `// ignore_for_file: name_of_lint` syntax on the line or in the file - # producing the lint. - rules: - # avoid_print: false # Uncomment to disable the `avoid_print` rule - # prefer_single_quotes: true # Uncomment to enable the `prefer_single_quotes` rule - -# Additional information about this file can be found at -# https://dart.dev/guides/language/analysis-options diff --git a/apps/rider-archive-cubit/android/.gitignore b/apps/rider-archive-cubit/android/.gitignore deleted file mode 100644 index ff01b1d..0000000 --- a/apps/rider-archive-cubit/android/.gitignore +++ /dev/null @@ -1,15 +0,0 @@ -gradle-wrapper.jar -/.gradle -/captures/ -/gradlew -/gradlew.bat -/local.properties -GeneratedPluginRegistrant.java -/.cxx - -# Remember to never publicly share your keystore. -# See https://flutter.dev/docs/deployment/android#reference-the-keystore-from-the-app -key.properties -gradle.properties -**/*.keystore -**/*.jks diff --git a/apps/rider-archive-cubit/android/app/build.gradle b/apps/rider-archive-cubit/android/app/build.gradle deleted file mode 100644 index 5b6de45..0000000 --- a/apps/rider-archive-cubit/android/app/build.gradle +++ /dev/null @@ -1,90 +0,0 @@ - -plugins { - id "com.android.application" - // START: FlutterFire Configuration - id 'com.google.gms.google-services' - // END: FlutterFire Configuration - id "kotlin-android" - // The Flutter Gradle Plugin must be applied after the Android and Kotlin Gradle plugins. - id "dev.flutter.flutter-gradle-plugin" -} - -def keystoreProperties = new Properties() -def keystorePropertiesFile = rootProject.file('key.properties') -// Load keystore properties if the file exists -if (keystorePropertiesFile.exists()) { - keystoreProperties.load(new FileInputStream(keystorePropertiesFile)) -} -android { - namespace = "com.mobileapp.store.ride" - compileSdk = 36 - ndkVersion "29.0.14033849" - - compileOptions { - sourceCompatibility = JavaVersion.VERSION_1_8 - targetCompatibility = JavaVersion.VERSION_1_8 - coreLibraryDesugaringEnabled true - } - externalNativeBuild { - cmake { - path "src/main/cpp/CMakeLists.txt" - version "3.22.1" - } - } - - kotlinOptions { - jvmTarget = JavaVersion.VERSION_1_8 - } - sourceSets { - main { - jniLibs.srcDirs = ['src/main/jniLibs'] - } - } - - defaultConfig { - // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). - applicationId = "com.mobileapp.store.ride" - // You can update the following values to match your application needs. - // For more information, see: https://flutter.dev/to/review-gradle-config. - minSdk = 29 - targetSdk = 36 - versionCode 135 - versionName "2.0.135" - multiDexEnabled = true - ndk { - abiFilters "armeabi-v7a", "arm64-v8a" - } - } - - signingConfigs { - release { - // Check if properties are defined before using them - storeFile = keystoreProperties['storeFile'] ? file(keystoreProperties['storeFile']) : null - storePassword = keystoreProperties['storePassword'] - keyAlias = keystoreProperties['keyAlias'] - keyPassword = keystoreProperties['keyPassword'] - } - } - - buildTypes { - release { - signingConfig signingConfigs.release - minifyEnabled true - shrinkResources true - proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' - } - } -} - -flutter { - source = "../.." -} - -dependencies { - implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version" - coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:2.1.5' - implementation "com.stripe:stripe-android:21.4.2" - implementation 'com.stripe:paymentsheet:21.4.2' - implementation 'com.scottyab:rootbeer-lib:0.1.0' - implementation 'com.google.android.gms:play-services-safetynet:18.1.0' -} \ No newline at end of file diff --git a/apps/rider-archive-cubit/android/app/proguard-rules.pro b/apps/rider-archive-cubit/android/app/proguard-rules.pro deleted file mode 100644 index 8843bb1..0000000 --- a/apps/rider-archive-cubit/android/app/proguard-rules.pro +++ /dev/null @@ -1,44 +0,0 @@ -# Suppress warnings for specific Google ML Kit and Stripe classes --dontwarn com.google.mlkit.vision.text.chinese.ChineseTextRecognizerOptions$Builder --dontwarn com.google.mlkit.vision.text.chinese.ChineseTextRecognizerOptions --dontwarn com.google.mlkit.vision.text.devanagari.DevanagariTextRecognizerOptions$Builder --dontwarn com.google.mlkit.vision.text.devanagari.DevanagariTextRecognizerOptions --dontwarn com.google.mlkit.vision.text.japanese.JapaneseTextRecognizerOptions$Builder --dontwarn com.google.mlkit.vision.text.japanese.JapaneseTextRecognizerOptions --dontwarn com.google.mlkit.vision.text.korean.KoreanTextRecognizerOptions$Builder --dontwarn com.google.mlkit.vision.text.korean.KoreanTextRecognizerOptions --dontwarn com.stripe.android.pushProvisioning.PushProvisioningActivity$g --dontwarn com.stripe.android.pushProvisioning.PushProvisioningActivityStarter$Args --dontwarn com.stripe.android.pushProvisioning.PushProvisioningActivityStarter$Error --dontwarn com.stripe.android.pushProvisioning.PushProvisioningActivityStarter --dontwarn com.stripe.android.pushProvisioning.PushProvisioningEphemeralKeyProvider - -# NEW: Add the -dontwarn rules from missing_rules.txt --dontwarn com.stripe.android.view.AddPaymentMethodActivityStarter$Args$Builder --dontwarn com.stripe.android.view.AddPaymentMethodActivityStarter$Args --dontwarn com.stripe.android.view.AddPaymentMethodActivityStarter$Result$Canceled --dontwarn com.stripe.android.view.AddPaymentMethodActivityStarter$Result$Companion --dontwarn com.stripe.android.view.AddPaymentMethodActivityStarter$Result$Failure --dontwarn com.stripe.android.view.AddPaymentMethodActivityStarter$Result$Success --dontwarn com.stripe.android.view.AddPaymentMethodActivityStarter$Result --dontwarn com.stripe.android.view.AddPaymentMethodActivityStarter - -# Keep rules for Google ML Kit --keep class com.google.mlkit.vision.** { *; } --keep class com.google.mlkit.vision.text.** { *; } --keep class com.google.mlkit.vision.text.chinese.ChineseTextRecognizerOptions { *; } --keep class com.google.mlkit.vision.text.chinese.ChineseTextRecognizerOptions$Builder { *; } --keep class com.google.mlkit.vision.text.devanagari.DevanagariTextRecognizerOptions { *; } --keep class com.google.mlkit.vision.text.devanagari.DevanagariTextRecognizerOptions$Builder { *; } --keep class com.google.mlkit.vision.text.japanese.JapaneseTextRecognizerOptions { *; } --keep class com.google.mlkit.vision.text.japanese.JapaneseTextRecognizerOptions$Builder { *; } --keep class com.google.mlkit.vision.text.korean.KoreanTextRecognizerOptions { *; } --keep class com.google.mlkit.vision.text.korean.KoreanTextRecognizerOptions$Builder { *; } - -# Keep rules for Stripe (Use the broad rule - most reliable) --keep class com.stripe.android.** { *; } - -# Keep rule for RootDetection --keep class com.mobileapp.store.ride.RootDetection { - native ; -} \ No newline at end of file diff --git a/apps/rider-archive-cubit/android/app/src/debug/AndroidManifest.xml b/apps/rider-archive-cubit/android/app/src/debug/AndroidManifest.xml deleted file mode 100644 index 399f698..0000000 --- a/apps/rider-archive-cubit/android/app/src/debug/AndroidManifest.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - diff --git a/apps/rider-archive-cubit/android/app/src/main/AndroidManifest.xml b/apps/rider-archive-cubit/android/app/src/main/AndroidManifest.xml deleted file mode 100644 index 3908172..0000000 --- a/apps/rider-archive-cubit/android/app/src/main/AndroidManifest.xml +++ /dev/null @@ -1,85 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/apps/rider-archive-cubit/android/app/src/main/cpp/CMakeLists.txt b/apps/rider-archive-cubit/android/app/src/main/cpp/CMakeLists.txt deleted file mode 100644 index 6099f41..0000000 --- a/apps/rider-archive-cubit/android/app/src/main/cpp/CMakeLists.txt +++ /dev/null @@ -1,8 +0,0 @@ -cmake_minimum_required(VERSION 3.10.2) # Use 3.10.2 for consistency. -project(ride) - -add_library(native-lib SHARED native-lib.cpp) - -find_library(log-lib log) - -target_link_libraries(native-lib ${log-lib}) \ No newline at end of file diff --git a/apps/rider-archive-cubit/android/app/src/main/cpp/native-lib.cpp b/apps/rider-archive-cubit/android/app/src/main/cpp/native-lib.cpp deleted file mode 100644 index cd96d10..0000000 --- a/apps/rider-archive-cubit/android/app/src/main/cpp/native-lib.cpp +++ /dev/null @@ -1,166 +0,0 @@ -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include // Add this line - - -#define LOG_TAG "NativeLib" -#define LOGD(...) __android_log_print(ANDROID_LOG_DEBUG, LOG_TAG, __VA_ARGS__) -#define LOGE(...) __android_log_print(ANDROID_LOG_ERROR, LOG_TAG, __VA_ARGS__) - -// Function to check for common root binaries -bool isRooted() { - std::string paths[] = { - "/system/app/Superuser.apk", - "/system/xbin/su", - "/system/bin/su", - "/system/bin/magisk", - "/system/xbin/magisk", - "/sbin/magisk" - }; - - for (const auto &path : paths) { - std::ifstream file(path); - if (file.good()) { - return true; - } - } - return false; -} - -// Function to check for the presence of files or directories commonly associated with Frida. -bool checkFridaFiles() { - std::string fridaFiles[] = { - "/data/local/tmp/re.frida.server", //Common Frida server path - "/data/local/tmp/frida-server", - "/usr/lib/libfrida-gadget.so", // Frida gadget (injected library) - "/usr/lib64/libfrida-gadget.so", - "/data/local/re.frida.server", - - }; - - for (const auto &path : fridaFiles) { - if (access(path.c_str(), F_OK) != -1) { - LOGE("Frida file detected: %s", path.c_str()); - return true; - } - } - return false; -} - -// Checks for open ports commonly used by Frida. This is less reliable, as ports can be changed. -bool checkFridaPorts() { - int sock = socket(AF_INET, SOCK_STREAM, 0); - if (sock == -1) { - return false; // Couldn't create socket, not a strong indicator. - } - - sockaddr_in sa; - memset(&sa, 0, sizeof(sa)); - sa.sin_family = AF_INET; - sa.sin_port = htons(27042); // Default Frida port - inet_pton(AF_INET, "127.0.0.1", &sa.sin_addr); - - if (connect(sock, (struct sockaddr *)&sa, sizeof(sa)) != -1) { - LOGE("Frida default port (27042) is open."); - close(sock); - return true; - } - - close(sock); - return false; -} - -// Check the maps file of the current process for any suspicious entries. -bool checkMaps() { - std::ifstream mapsFile("/proc/self/maps"); - std::string line; - - if (mapsFile.is_open()) { - while (std::getline(mapsFile, line)) { - // Look for lines that indicate injected libraries, especially Frida. - if (line.find("frida") != std::string::npos || - line.find("gum-js-") != std::string::npos) { // Gum is Frida's JavaScript engine - LOGE("Suspicious entry in /proc/self/maps: %s", line.c_str()); - return true; - } - } - mapsFile.close(); - } else - { - LOGE("Could not open /proc/self/maps"); - return false; - } - return false; -} - -// Check loaded modules. -bool checkLoadedModules() { - bool found = false; - dl_iterate_phdr([](struct dl_phdr_info *info, size_t size, void *data) { - bool *found_ptr = static_cast(data); - if (std::string(info->dlpi_name).find("frida") != std::string::npos) { - LOGE("Frida module detected: %s", info->dlpi_name); - *found_ptr = true; - return 1; // Stop iterating - } - return 0; // Continue iterating - }, &found); - - return found; -} - - -// This is a simple ptrace check. More sophisticated checks are possible (and necessary for robust detection). -//bool checkPtrace() { -// // Attempt to ptrace ourselves. If another process is already tracing us, this will fail. -// if (ptrace(PTRACE_TRACEME, 0, 1, 0) < 0) { -// LOGE("ptrace failed. Debugger or tracer detected."); -// return true; // Likely being traced -// } -// // Detach. If attached, need to detach to not interfere. -// ptrace(PTRACE_DETACH, 0, 0, 0); -// return false; -//} - -extern "C" -JNIEXPORT jboolean JNICALL -Java_com_mobileapp_store_ride_RootDetection_isNativeRooted(JNIEnv *env, jobject /* this */) { - - if (isRooted()) { - return JNI_TRUE; - } - - if (checkFridaFiles()) { - return JNI_TRUE; - } - - if (checkFridaPorts()) { - return JNI_TRUE; - } - if (checkMaps()) { - return JNI_TRUE; - } - - if (checkLoadedModules()) { - return JNI_TRUE; - } - -// if (checkPtrace()) { -// return JNI_TRUE; -// } - - return JNI_FALSE; -} \ No newline at end of file diff --git a/apps/rider-archive-cubit/android/app/src/main/kotlin/com/mobileapp/store/ride/MainActivity.kt b/apps/rider-archive-cubit/android/app/src/main/kotlin/com/mobileapp/store/ride/MainActivity.kt deleted file mode 100644 index 66da379..0000000 --- a/apps/rider-archive-cubit/android/app/src/main/kotlin/com/mobileapp/store/ride/MainActivity.kt +++ /dev/null @@ -1,203 +0,0 @@ -package com.mobileapp.store.ride - -import android.app.AlertDialog -import android.os.Bundle -import android.util.Log -import android.widget.LinearLayout -import android.widget.ProgressBar -import android.widget.TextView -import androidx.core.view.setPadding -import com.scottyab.rootbeer.RootBeer -import io.flutter.embedding.android.FlutterFragmentActivity -import java.io.File -import java.util.Timer -import kotlin.concurrent.schedule -import io.flutter.embedding.engine.FlutterEngine // Import FlutterEngine -import io.flutter.plugin.common.MethodChannel // Import MethodChannel -import io.flutter.plugin.common.MethodCall // Import MethodCall -import io.flutter.plugin.common.MethodChannel.Result // Import Result - - -class MainActivity : FlutterFragmentActivity() { - - private lateinit var channel: MethodChannel // Declare a MethodChannel variable - - override fun configureFlutterEngine(flutterEngine: FlutterEngine) { - super.configureFlutterEngine(flutterEngine) - - // Initialize the MethodChannel - channel = MethodChannel(flutterEngine.dartExecutor.binaryMessenger, "com.mobileapp.store.ride/security") - - // Set a MethodCallHandler to handle method calls from Flutter - channel.setMethodCallHandler { call, result -> - when (call.method) { - "isNativeRooted" -> { - val isCompromised = isDeviceCompromised() - result.success(isCompromised) // Send the result back to Flutter - } - else -> { - result.notImplemented() // Handle unknown method calls - } - } - } - } - - - override fun onCreate(savedInstanceState: Bundle?) { - super.onCreate(savedInstanceState) - - // Perform all checks. The order can matter; you might want to prioritize - // the faster checks first. - if (isDeviceCompromised()) { - showSecurityWarningDialog() - } - } - - private fun isDeviceCompromised(): Boolean { - return try { - nativeRootCheck() || rootBeerCheck() //|| !safetyNetCheck() - } catch (e: Exception) { - Log.e("DEBUG", "Error during security checks: ${e.message}", e) - true // Consider the device compromised on error - } - } - - private fun nativeRootCheck(): Boolean { - Log.d("DEBUG", "Starting native root detection...") - return try { - val isNativeRooted = RootDetection.isNativeRooted() - Log.d("DEBUG", "Native root detection result: $isNativeRooted") - isNativeRooted - } catch (e: Exception) { - Log.e("DEBUG", "Error in native root detection: ${e.message}", e) - true // Consider rooted on exception - } - } - - private fun rootBeerCheck(): Boolean { - Log.d("DEBUG", "Starting RootBeer root detection...") - val rootBeer = RootBeer(this) - val isRooted = rootBeer.isRooted - Log.d("DEBUG", "RootBeer detection result: $isRooted") - return isRooted - } - - private fun safetyNetCheck(): Boolean { - Log.d("DEBUG", "Starting SafetyNet check...") - var isSafe = false // Initialize a variable to store result - val semaphore = java.util.concurrent.Semaphore(0) // Create a semaphore - - SafetyNetCheck.checkSafetyNet(this, getString(R.string.api_key_safety)) { result -> - isSafe = result - Log.d("DEBUG", "SafetyNet check result: $isSafe") - semaphore.release() // Release the semaphore when the callback is executed - } - - try { - semaphore.acquire() // Wait for the callback to complete - } catch (e: InterruptedException) { - Log.e("DEBUG", "Interrupted while waiting for SafetyNet check", e) - return false // Or handle as appropriate for your app - } - return isSafe - } - - private fun showSecurityWarningDialog() { - var secondsRemaining = 10 // Start at 10 seconds - - // Create views programmatically - val progressBar = ProgressBar(this, null, android.R.attr.progressBarStyleHorizontal) - progressBar.max = 10 // Set max to 10 for 10 seconds - progressBar.progress = 10 // Start full - val textView = TextView(this) - textView.text = getString(R.string.security_warning_message) // Your message - textView.textAlignment = TextView.TEXT_ALIGNMENT_CENTER - - val layout = LinearLayout(this) - layout.orientation = LinearLayout.VERTICAL - layout.setPadding(48) - layout.addView(textView) - layout.addView(progressBar) - - val dialog = - AlertDialog.Builder(this) - .setTitle(getString(R.string.security_warning_title)) // Your title - .setView(layout) // Set the custom layout - .setCancelable( - false - ) // Prevent dismissing by tapping outside or back button - .create() - - dialog.show() - - // Use a Timer to update the progress bar and countdown - val timer = Timer() - timer.schedule(0, 1000) { // Update every 1000ms (1 second) - secondsRemaining-- - runOnUiThread { // Update UI on the main thread - progressBar.progress = - secondsRemaining // Set the progress bar to show remaining seconds - if (secondsRemaining <= 0) { - timer.cancel() // Stop the timer - dialog.dismiss() // Dismiss the dialog - clearAppDataAndExit() // Clear data and exit - } - } - } - } - - private fun clearAppDataAndExit() { - try { - val packageName = applicationContext.packageName - val runtime = Runtime.getRuntime() - runtime.exec("pm clear $packageName") // Clear app data - } catch (e: Exception) { - clearCache() - clearAppData() - } - - finishAffinity() // Finish all activities from this app - System.exit(0) // Terminate the app's process - } - - private fun clearCache() { - try { - val cacheDir = cacheDir - if (cacheDir != null && cacheDir.isDirectory) { - deleteDir(cacheDir) - } - val externalCacheDir = externalCacheDir - if (externalCacheDir != null && externalCacheDir.isDirectory) { - deleteDir(externalCacheDir) - } - } catch (e: Exception) { - Log.e("DEBUG", "Error clearing cache: ${e.message}", e) - } - } - - private fun clearAppData() { - try { - val dataDir = applicationContext.dataDir - if (dataDir != null && dataDir.isDirectory) { - deleteDir(dataDir) - } - } catch (e: Exception) { - Log.e("DEBUG", "Error clearing app data: ${e.message}", e) - } - } - - private fun deleteDir(dir: File?): Boolean { - if (dir != null && dir.isDirectory) { - val children = dir.list() - if (children != null) { - for (child in children) { - val success = deleteDir(File(dir, child)) - if (!success) { - return false - } - } - } - } - return dir?.delete() ?: false - } -} \ No newline at end of file diff --git a/apps/rider-archive-cubit/android/app/src/main/kotlin/com/mobileapp/store/ride/RootDetection.kt b/apps/rider-archive-cubit/android/app/src/main/kotlin/com/mobileapp/store/ride/RootDetection.kt deleted file mode 100644 index 98fbc9a..0000000 --- a/apps/rider-archive-cubit/android/app/src/main/kotlin/com/mobileapp/store/ride/RootDetection.kt +++ /dev/null @@ -1,9 +0,0 @@ -package com.mobileapp.store.ride - -object RootDetection { - init { - System.loadLibrary("native-lib") // Load the native library - } - - external fun isNativeRooted(): Boolean // Declare the external function -} diff --git a/apps/rider-archive-cubit/android/app/src/main/kotlin/com/mobileapp/store/ride/SafetyNetCheck.kt b/apps/rider-archive-cubit/android/app/src/main/kotlin/com/mobileapp/store/ride/SafetyNetCheck.kt deleted file mode 100644 index 1b8593b..0000000 --- a/apps/rider-archive-cubit/android/app/src/main/kotlin/com/mobileapp/store/ride/SafetyNetCheck.kt +++ /dev/null @@ -1,109 +0,0 @@ -import android.content.Context -import android.util.Base64 -import android.util.Log -import com.google.android.gms.safetynet.SafetyNet -import com.google.android.gms.safetynet.SafetyNetApi -import com.google.android.gms.tasks.OnFailureListener -import com.google.android.gms.tasks.OnSuccessListener -import org.json.JSONObject -import java.io.IOException -import java.security.GeneralSecurityException -import java.security.SecureRandom -import java.util.Arrays - -object SafetyNetCheck { - - private const val TAG = "SafetyNetCheck" - - fun checkSafetyNet(context: Context, apiKey: String, callback: (Boolean) -> Unit) { - // Generate a nonce. A good nonce is large, random, and used only once. - val nonce = generateNonce() - - SafetyNet.getClient(context).attest(nonce, apiKey) - .addOnSuccessListener { response -> - // Success! Now, *verify* the response. - val jwsResult = response.jwsResult - if (jwsResult != null) { - try { - val isSafe = SafetyNetResponseVerifier.verify(jwsResult) - Log.d(TAG, "SafetyNet verification result: $isSafe") - callback(isSafe) // Now passing a *verified* result. - } catch (e: Exception) { - Log.e(TAG, "Error verifying SafetyNet response: ${e.message}", e) - callback(false) // Treat verification errors as failures. - } - } else { - Log.e(TAG, "SafetyNet jwsResult is null") - callback(false) // Null result is a failure. - } - } - .addOnFailureListener { e -> - Log.e(TAG, "SafetyNet attest API call failed: ${e.message}", e) - callback(false) // API call failure. - } - } - - - // Helper function to generate a nonce. - private fun generateNonce(): ByteArray { - val byteGenerator = SecureRandom() - val nonce = ByteArray(32) - byteGenerator.nextBytes(nonce) - return nonce - } -} - - - -// Helper class to verify the SafetyNet response. -object SafetyNetResponseVerifier { - - private const val TAG = "SafetyNetVerifier" - - // This method *must* be implemented on a *backend server* for real security. - // This is just a *simplified example* for demonstration purposes and is - // *not* suitable for production without a backend check. - @Throws(GeneralSecurityException::class, IOException::class) - fun verify(jwsResult: String): Boolean { - // 1. Parse the JWS: Split into header, payload, and signature. - val parts = jwsResult.split(".") - if (parts.size != 3) { - Log.e(TAG, "Invalid JWS format") - return false // Invalid JWS format - } - - val header = parts[0] - val payload = parts[1] - val signature = parts[2] - - // 2. Decode the payload (it's Base64 encoded). - val decodedPayload = Base64.decode(payload, Base64.DEFAULT) - val payloadJson = JSONObject(String(decodedPayload)) - - // 3. Check the ctsProfileMatch and basicIntegrity. - val ctsProfileMatch = payloadJson.optBoolean("ctsProfileMatch", false) - val basicIntegrity = payloadJson.optBoolean("basicIntegrity", false) - - Log.d(TAG, "ctsProfileMatch: $ctsProfileMatch, basicIntegrity: $basicIntegrity") - - // 4. **CRITICAL: In a real application, you *must* send the JWS to your - // backend server for verification. The server should use the - // Google SafetyNet API (or a library that wraps it) to verify - // the signature and check the fields. This prevents attackers - // from tampering with the response on the device.** - // - // // Example (pseudo-code) of what the backend check would do: - // // GoogleCredential credential = ...; - // // SafetyNet safetyNet = new SafetyNet.Builder(httpTransport, jsonFactory) - // // .setApplicationName("YourAppName") - // // .setHttpRequestInitializer(credential) - // // .build(); - // // SafetyNetApi.VerifyJwsRequest request = safetyNet.safetynet().verifyJws(jwsResult); - // // SafetyNetApi.VerifyJwsResponse response = request.execute(); - // // return response.isValidSignature() && response.getCtsProfileMatch() && response.getBasicIntegrity(); - - // 5. For this *example* (without a backend), we'll just check the fields. - // This is *NOT SECURE* for production! - return ctsProfileMatch && basicIntegrity - } -} \ No newline at end of file diff --git a/apps/rider-archive-cubit/android/app/src/main/res/drawable-hdpi/android12splash.png b/apps/rider-archive-cubit/android/app/src/main/res/drawable-hdpi/android12splash.png deleted file mode 100644 index 05b0cb9..0000000 Binary files a/apps/rider-archive-cubit/android/app/src/main/res/drawable-hdpi/android12splash.png and /dev/null differ diff --git a/apps/rider-archive-cubit/android/app/src/main/res/drawable-hdpi/splash.png b/apps/rider-archive-cubit/android/app/src/main/res/drawable-hdpi/splash.png deleted file mode 100644 index 05b0cb9..0000000 Binary files a/apps/rider-archive-cubit/android/app/src/main/res/drawable-hdpi/splash.png and /dev/null differ diff --git a/apps/rider-archive-cubit/android/app/src/main/res/drawable-mdpi/android12splash.png b/apps/rider-archive-cubit/android/app/src/main/res/drawable-mdpi/android12splash.png deleted file mode 100644 index 6694368..0000000 Binary files a/apps/rider-archive-cubit/android/app/src/main/res/drawable-mdpi/android12splash.png and /dev/null differ diff --git a/apps/rider-archive-cubit/android/app/src/main/res/drawable-mdpi/splash.png b/apps/rider-archive-cubit/android/app/src/main/res/drawable-mdpi/splash.png deleted file mode 100644 index 6694368..0000000 Binary files a/apps/rider-archive-cubit/android/app/src/main/res/drawable-mdpi/splash.png and /dev/null differ diff --git a/apps/rider-archive-cubit/android/app/src/main/res/drawable-night-hdpi/android12splash.png b/apps/rider-archive-cubit/android/app/src/main/res/drawable-night-hdpi/android12splash.png deleted file mode 100644 index 05b0cb9..0000000 Binary files a/apps/rider-archive-cubit/android/app/src/main/res/drawable-night-hdpi/android12splash.png and /dev/null differ diff --git a/apps/rider-archive-cubit/android/app/src/main/res/drawable-night-mdpi/android12splash.png b/apps/rider-archive-cubit/android/app/src/main/res/drawable-night-mdpi/android12splash.png deleted file mode 100644 index 6694368..0000000 Binary files a/apps/rider-archive-cubit/android/app/src/main/res/drawable-night-mdpi/android12splash.png and /dev/null differ diff --git a/apps/rider-archive-cubit/android/app/src/main/res/drawable-night-xhdpi/android12splash.png b/apps/rider-archive-cubit/android/app/src/main/res/drawable-night-xhdpi/android12splash.png deleted file mode 100644 index 769f7c4..0000000 Binary files a/apps/rider-archive-cubit/android/app/src/main/res/drawable-night-xhdpi/android12splash.png and /dev/null differ diff --git a/apps/rider-archive-cubit/android/app/src/main/res/drawable-night-xxhdpi/android12splash.png b/apps/rider-archive-cubit/android/app/src/main/res/drawable-night-xxhdpi/android12splash.png deleted file mode 100644 index 5fd14db..0000000 Binary files a/apps/rider-archive-cubit/android/app/src/main/res/drawable-night-xxhdpi/android12splash.png and /dev/null differ diff --git a/apps/rider-archive-cubit/android/app/src/main/res/drawable-night-xxxhdpi/android12splash.png b/apps/rider-archive-cubit/android/app/src/main/res/drawable-night-xxxhdpi/android12splash.png deleted file mode 100644 index 1c91252..0000000 Binary files a/apps/rider-archive-cubit/android/app/src/main/res/drawable-night-xxxhdpi/android12splash.png and /dev/null differ diff --git a/apps/rider-archive-cubit/android/app/src/main/res/drawable-v21/background.png b/apps/rider-archive-cubit/android/app/src/main/res/drawable-v21/background.png deleted file mode 100644 index 8e21404..0000000 Binary files a/apps/rider-archive-cubit/android/app/src/main/res/drawable-v21/background.png and /dev/null differ diff --git a/apps/rider-archive-cubit/android/app/src/main/res/drawable-v21/launch_background.xml b/apps/rider-archive-cubit/android/app/src/main/res/drawable-v21/launch_background.xml deleted file mode 100644 index 3cc4948..0000000 --- a/apps/rider-archive-cubit/android/app/src/main/res/drawable-v21/launch_background.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - - - diff --git a/apps/rider-archive-cubit/android/app/src/main/res/drawable-xhdpi/android12splash.png b/apps/rider-archive-cubit/android/app/src/main/res/drawable-xhdpi/android12splash.png deleted file mode 100644 index 769f7c4..0000000 Binary files a/apps/rider-archive-cubit/android/app/src/main/res/drawable-xhdpi/android12splash.png and /dev/null differ diff --git a/apps/rider-archive-cubit/android/app/src/main/res/drawable-xhdpi/splash.png b/apps/rider-archive-cubit/android/app/src/main/res/drawable-xhdpi/splash.png deleted file mode 100644 index 769f7c4..0000000 Binary files a/apps/rider-archive-cubit/android/app/src/main/res/drawable-xhdpi/splash.png and /dev/null differ diff --git a/apps/rider-archive-cubit/android/app/src/main/res/drawable-xxhdpi/android12splash.png b/apps/rider-archive-cubit/android/app/src/main/res/drawable-xxhdpi/android12splash.png deleted file mode 100644 index 5fd14db..0000000 Binary files a/apps/rider-archive-cubit/android/app/src/main/res/drawable-xxhdpi/android12splash.png and /dev/null differ diff --git a/apps/rider-archive-cubit/android/app/src/main/res/drawable-xxhdpi/splash.png b/apps/rider-archive-cubit/android/app/src/main/res/drawable-xxhdpi/splash.png deleted file mode 100644 index 5fd14db..0000000 Binary files a/apps/rider-archive-cubit/android/app/src/main/res/drawable-xxhdpi/splash.png and /dev/null differ diff --git a/apps/rider-archive-cubit/android/app/src/main/res/drawable-xxxhdpi/android12splash.png b/apps/rider-archive-cubit/android/app/src/main/res/drawable-xxxhdpi/android12splash.png deleted file mode 100644 index 1c91252..0000000 Binary files a/apps/rider-archive-cubit/android/app/src/main/res/drawable-xxxhdpi/android12splash.png and /dev/null differ diff --git a/apps/rider-archive-cubit/android/app/src/main/res/drawable-xxxhdpi/splash.png b/apps/rider-archive-cubit/android/app/src/main/res/drawable-xxxhdpi/splash.png deleted file mode 100644 index 1c91252..0000000 Binary files a/apps/rider-archive-cubit/android/app/src/main/res/drawable-xxxhdpi/splash.png and /dev/null differ diff --git a/apps/rider-archive-cubit/android/app/src/main/res/drawable/app_icon.png b/apps/rider-archive-cubit/android/app/src/main/res/drawable/app_icon.png deleted file mode 100644 index ab0309f..0000000 Binary files a/apps/rider-archive-cubit/android/app/src/main/res/drawable/app_icon.png and /dev/null differ diff --git a/apps/rider-archive-cubit/android/app/src/main/res/drawable/background.png b/apps/rider-archive-cubit/android/app/src/main/res/drawable/background.png deleted file mode 100644 index 8e21404..0000000 Binary files a/apps/rider-archive-cubit/android/app/src/main/res/drawable/background.png and /dev/null differ diff --git a/apps/rider-archive-cubit/android/app/src/main/res/drawable/icon_share.png b/apps/rider-archive-cubit/android/app/src/main/res/drawable/icon_share.png deleted file mode 100644 index ae92be6..0000000 Binary files a/apps/rider-archive-cubit/android/app/src/main/res/drawable/icon_share.png and /dev/null differ diff --git a/apps/rider-archive-cubit/android/app/src/main/res/drawable/icon_support.png b/apps/rider-archive-cubit/android/app/src/main/res/drawable/icon_support.png deleted file mode 100644 index 5a9fef9..0000000 Binary files a/apps/rider-archive-cubit/android/app/src/main/res/drawable/icon_support.png and /dev/null differ diff --git a/apps/rider-archive-cubit/android/app/src/main/res/drawable/icon_user.png b/apps/rider-archive-cubit/android/app/src/main/res/drawable/icon_user.png deleted file mode 100644 index c8802f2..0000000 Binary files a/apps/rider-archive-cubit/android/app/src/main/res/drawable/icon_user.png and /dev/null differ diff --git a/apps/rider-archive-cubit/android/app/src/main/res/drawable/icon_wallet.png b/apps/rider-archive-cubit/android/app/src/main/res/drawable/icon_wallet.png deleted file mode 100644 index 551f8a4..0000000 Binary files a/apps/rider-archive-cubit/android/app/src/main/res/drawable/icon_wallet.png and /dev/null differ diff --git a/apps/rider-archive-cubit/android/app/src/main/res/drawable/launch_background.xml b/apps/rider-archive-cubit/android/app/src/main/res/drawable/launch_background.xml deleted file mode 100644 index 3cc4948..0000000 --- a/apps/rider-archive-cubit/android/app/src/main/res/drawable/launch_background.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - - - diff --git a/apps/rider-archive-cubit/android/app/src/main/res/mipmap-hdpi/launcher_icon.png b/apps/rider-archive-cubit/android/app/src/main/res/mipmap-hdpi/launcher_icon.png deleted file mode 100644 index 5f35220..0000000 Binary files a/apps/rider-archive-cubit/android/app/src/main/res/mipmap-hdpi/launcher_icon.png and /dev/null differ diff --git a/apps/rider-archive-cubit/android/app/src/main/res/mipmap-mdpi/launcher_icon.png b/apps/rider-archive-cubit/android/app/src/main/res/mipmap-mdpi/launcher_icon.png deleted file mode 100644 index 3a2be81..0000000 Binary files a/apps/rider-archive-cubit/android/app/src/main/res/mipmap-mdpi/launcher_icon.png and /dev/null differ diff --git a/apps/rider-archive-cubit/android/app/src/main/res/mipmap-xhdpi/launcher_icon.png b/apps/rider-archive-cubit/android/app/src/main/res/mipmap-xhdpi/launcher_icon.png deleted file mode 100644 index 2165361..0000000 Binary files a/apps/rider-archive-cubit/android/app/src/main/res/mipmap-xhdpi/launcher_icon.png and /dev/null differ diff --git a/apps/rider-archive-cubit/android/app/src/main/res/mipmap-xxhdpi/launcher_icon.png b/apps/rider-archive-cubit/android/app/src/main/res/mipmap-xxhdpi/launcher_icon.png deleted file mode 100644 index 7514dfe..0000000 Binary files a/apps/rider-archive-cubit/android/app/src/main/res/mipmap-xxhdpi/launcher_icon.png and /dev/null differ diff --git a/apps/rider-archive-cubit/android/app/src/main/res/mipmap-xxxhdpi/launcher_icon.png b/apps/rider-archive-cubit/android/app/src/main/res/mipmap-xxxhdpi/launcher_icon.png deleted file mode 100644 index 8df33f2..0000000 Binary files a/apps/rider-archive-cubit/android/app/src/main/res/mipmap-xxxhdpi/launcher_icon.png and /dev/null differ diff --git a/apps/rider-archive-cubit/android/app/src/main/res/raw/app_icon.png b/apps/rider-archive-cubit/android/app/src/main/res/raw/app_icon.png deleted file mode 100644 index 96cc55a..0000000 Binary files a/apps/rider-archive-cubit/android/app/src/main/res/raw/app_icon.png and /dev/null differ diff --git a/apps/rider-archive-cubit/android/app/src/main/res/raw/cancel.wav b/apps/rider-archive-cubit/android/app/src/main/res/raw/cancel.wav deleted file mode 100644 index dbe6e7c..0000000 Binary files a/apps/rider-archive-cubit/android/app/src/main/res/raw/cancel.wav and /dev/null differ diff --git a/apps/rider-archive-cubit/android/app/src/main/res/raw/ding.wav b/apps/rider-archive-cubit/android/app/src/main/res/raw/ding.wav deleted file mode 100644 index c53cd50..0000000 Binary files a/apps/rider-archive-cubit/android/app/src/main/res/raw/ding.wav and /dev/null differ diff --git a/apps/rider-archive-cubit/android/app/src/main/res/raw/promo.wav b/apps/rider-archive-cubit/android/app/src/main/res/raw/promo.wav deleted file mode 100644 index 3bb2d03..0000000 Binary files a/apps/rider-archive-cubit/android/app/src/main/res/raw/promo.wav and /dev/null differ diff --git a/apps/rider-archive-cubit/android/app/src/main/res/raw/start.wav b/apps/rider-archive-cubit/android/app/src/main/res/raw/start.wav deleted file mode 100644 index 0655506..0000000 Binary files a/apps/rider-archive-cubit/android/app/src/main/res/raw/start.wav and /dev/null differ diff --git a/apps/rider-archive-cubit/android/app/src/main/res/raw/tone1.mp3 b/apps/rider-archive-cubit/android/app/src/main/res/raw/tone1.mp3 deleted file mode 100644 index e32e61b..0000000 Binary files a/apps/rider-archive-cubit/android/app/src/main/res/raw/tone1.mp3 and /dev/null differ diff --git a/apps/rider-archive-cubit/android/app/src/main/res/raw/tone2.wav b/apps/rider-archive-cubit/android/app/src/main/res/raw/tone2.wav deleted file mode 100644 index 0582d47..0000000 Binary files a/apps/rider-archive-cubit/android/app/src/main/res/raw/tone2.wav and /dev/null differ diff --git a/apps/rider-archive-cubit/android/app/src/main/res/values-ar/strings.xml b/apps/rider-archive-cubit/android/app/src/main/res/values-ar/strings.xml deleted file mode 100644 index 6b7cb35..0000000 --- a/apps/rider-archive-cubit/android/app/src/main/res/values-ar/strings.xml +++ /dev/null @@ -1,6 +0,0 @@ - - تحذير أمني - تم اكتشاف مشكلة أمنية أو تعديل على هذا الجهاز. لا يمكن تشغيل التطبيق على هذا الجهاز. - إغلاق التطبيق - الجهاز آمن. الاستمرار بشكل طبيعي. - \ No newline at end of file diff --git a/apps/rider-archive-cubit/android/app/src/main/res/values-night-v31/styles.xml b/apps/rider-archive-cubit/android/app/src/main/res/values-night-v31/styles.xml deleted file mode 100644 index 1b8e45f..0000000 --- a/apps/rider-archive-cubit/android/app/src/main/res/values-night-v31/styles.xml +++ /dev/null @@ -1,22 +0,0 @@ - - - - - - - diff --git a/apps/rider-archive-cubit/android/app/src/main/res/values-night/styles.xml b/apps/rider-archive-cubit/android/app/src/main/res/values-night/styles.xml deleted file mode 100644 index 90b2656..0000000 --- a/apps/rider-archive-cubit/android/app/src/main/res/values-night/styles.xml +++ /dev/null @@ -1,24 +0,0 @@ - - - - - - - - - diff --git a/apps/rider-archive-cubit/android/app/src/main/res/values-v31/styles.xml b/apps/rider-archive-cubit/android/app/src/main/res/values-v31/styles.xml deleted file mode 100644 index 8012d02..0000000 --- a/apps/rider-archive-cubit/android/app/src/main/res/values-v31/styles.xml +++ /dev/null @@ -1,22 +0,0 @@ - - - - - - - diff --git a/apps/rider-archive-cubit/android/app/src/main/res/values/strings.xml b/apps/rider-archive-cubit/android/app/src/main/res/values/strings.xml deleted file mode 100644 index 6bf8cf7..0000000 --- a/apps/rider-archive-cubit/android/app/src/main/res/values/strings.xml +++ /dev/null @@ -1,15 +0,0 @@ - - My App - - - high_importance_channel - AIzaSyCyfwRXTwSTLOFQSQgN5p7QZgGJVZnEKq0 - Security Warning - AIzaSyB04YNW3LbvmQ5lX1t2bOwEU18-KUoovzw - - A security issue or modification has been detected on - this device. The app cannot run on this device. - Exit App - Device is secure. Proceeding normally. - - \ No newline at end of file diff --git a/apps/rider-archive-cubit/android/app/src/main/res/values/styles.xml b/apps/rider-archive-cubit/android/app/src/main/res/values/styles.xml deleted file mode 100644 index ec51116..0000000 --- a/apps/rider-archive-cubit/android/app/src/main/res/values/styles.xml +++ /dev/null @@ -1,24 +0,0 @@ - - - - - - - - - diff --git a/apps/rider-archive-cubit/android/app/src/profile/AndroidManifest.xml b/apps/rider-archive-cubit/android/app/src/profile/AndroidManifest.xml deleted file mode 100644 index 399f698..0000000 --- a/apps/rider-archive-cubit/android/app/src/profile/AndroidManifest.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - diff --git a/apps/rider-archive-cubit/android/build.gradle b/apps/rider-archive-cubit/android/build.gradle deleted file mode 100644 index e3d1a86..0000000 --- a/apps/rider-archive-cubit/android/build.gradle +++ /dev/null @@ -1,37 +0,0 @@ -buildscript { - ext.kotlin_version = '1.9.10' - repositories { - google() - mavenCentral() - } - - dependencies { - // START: FlutterFire Configuration -// classpath 'com.google.gms:google-services:4.4.2' -// // END: FlutterFire Configuration -// classpath 'com.android.tools.build:gradle:7.3.1' - classpath 'com.google.gms:google-services:4.3.15' - // END: FlutterFire Configuration - classpath 'com.android.tools.build:gradle:8.8.0' - classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" - } -} - -allprojects { - repositories { - google() - mavenCentral() - } -} - -rootProject.buildDir = '../build' -subprojects { - project.buildDir = "${rootProject.buildDir}/${project.name}" -} -subprojects { - project.evaluationDependsOn(':app') -} - -tasks.register("clean", Delete) { - delete rootProject.buildDir -} diff --git a/apps/rider-archive-cubit/android/gradle/wrapper/gradle-wrapper.properties b/apps/rider-archive-cubit/android/gradle/wrapper/gradle-wrapper.properties deleted file mode 100644 index 8970476..0000000 --- a/apps/rider-archive-cubit/android/gradle/wrapper/gradle-wrapper.properties +++ /dev/null @@ -1,7 +0,0 @@ -#Thu Aug 03 17:06:53 EET 2023 -distributionBase=GRADLE_USER_HOME -# distributionUrl=https\://services.gradle.org/distributions/gradle-7.4.2-bin.zip -distributionPath=wrapper/dists -zipStorePath=wrapper/dists -zipStoreBase=GRADLE_USER_HOME -distributionUrl=https\://services.gradle.org/distributions/gradle-8.13-bin.zip \ No newline at end of file diff --git a/apps/rider-archive-cubit/android/settings.gradle b/apps/rider-archive-cubit/android/settings.gradle deleted file mode 100644 index 05abf8b..0000000 --- a/apps/rider-archive-cubit/android/settings.gradle +++ /dev/null @@ -1,28 +0,0 @@ -pluginManagement { - def flutterSdkPath = { - def properties = new Properties() - file("local.properties").withInputStream { properties.load(it) } - def flutterSdkPath = properties.getProperty("flutter.sdk") - assert flutterSdkPath != null, "flutter.sdk not set in local.properties" - return flutterSdkPath - }() - - includeBuild("$flutterSdkPath/packages/flutter_tools/gradle") - - repositories { - google() - mavenCentral() - gradlePluginPortal() - } -} - -plugins { - id "dev.flutter.flutter-plugin-loader" version "1.0.0" - id "com.android.application" version '8.13.0' apply false - // START: FlutterFire Configuration - id "com.google.gms.google-services" version "4.3.10" apply false - // END: FlutterFire Configuration - id "org.jetbrains.kotlin.android" version "2.2.20" apply false -} - -include ":app" diff --git a/apps/rider-archive-cubit/assets/fonts/IBMPlexSansArabic-Bold.ttf b/apps/rider-archive-cubit/assets/fonts/IBMPlexSansArabic-Bold.ttf deleted file mode 100644 index d67d9e8..0000000 Binary files a/apps/rider-archive-cubit/assets/fonts/IBMPlexSansArabic-Bold.ttf and /dev/null differ diff --git a/apps/rider-archive-cubit/assets/fonts/IBMPlexSansArabic-Medium.ttf b/apps/rider-archive-cubit/assets/fonts/IBMPlexSansArabic-Medium.ttf deleted file mode 100644 index 09ec8da..0000000 Binary files a/apps/rider-archive-cubit/assets/fonts/IBMPlexSansArabic-Medium.ttf and /dev/null differ diff --git a/apps/rider-archive-cubit/assets/fonts/IBMPlexSansArabic-Regular.ttf b/apps/rider-archive-cubit/assets/fonts/IBMPlexSansArabic-Regular.ttf deleted file mode 100644 index 5e19284..0000000 Binary files a/apps/rider-archive-cubit/assets/fonts/IBMPlexSansArabic-Regular.ttf and /dev/null differ diff --git a/apps/rider-archive-cubit/assets/fonts/IBMPlexSansArabic-SemiBold.ttf b/apps/rider-archive-cubit/assets/fonts/IBMPlexSansArabic-SemiBold.ttf deleted file mode 100644 index 6b48c75..0000000 Binary files a/apps/rider-archive-cubit/assets/fonts/IBMPlexSansArabic-SemiBold.ttf and /dev/null differ diff --git a/apps/rider-archive-cubit/assets/fonts/Inter-Bold.ttf b/apps/rider-archive-cubit/assets/fonts/Inter-Bold.ttf deleted file mode 100644 index 15e908f..0000000 Binary files a/apps/rider-archive-cubit/assets/fonts/Inter-Bold.ttf and /dev/null differ diff --git a/apps/rider-archive-cubit/assets/fonts/Inter-Medium.ttf b/apps/rider-archive-cubit/assets/fonts/Inter-Medium.ttf deleted file mode 100644 index 9342730..0000000 Binary files a/apps/rider-archive-cubit/assets/fonts/Inter-Medium.ttf and /dev/null differ diff --git a/apps/rider-archive-cubit/assets/fonts/Inter-Regular.ttf b/apps/rider-archive-cubit/assets/fonts/Inter-Regular.ttf deleted file mode 100644 index c544be4..0000000 Binary files a/apps/rider-archive-cubit/assets/fonts/Inter-Regular.ttf and /dev/null differ diff --git a/apps/rider-archive-cubit/assets/fonts/Inter-SemiBold.ttf b/apps/rider-archive-cubit/assets/fonts/Inter-SemiBold.ttf deleted file mode 100644 index a32e2b8..0000000 Binary files a/apps/rider-archive-cubit/assets/fonts/Inter-SemiBold.ttf and /dev/null differ diff --git a/apps/rider-archive-cubit/assets/fonts/digit.ttf b/apps/rider-archive-cubit/assets/fonts/digit.ttf deleted file mode 100644 index 5dbe6f9..0000000 Binary files a/apps/rider-archive-cubit/assets/fonts/digit.ttf and /dev/null differ diff --git a/apps/rider-archive-cubit/assets/fonts/josefin.ttf b/apps/rider-archive-cubit/assets/fonts/josefin.ttf deleted file mode 100644 index 98deb67..0000000 Binary files a/apps/rider-archive-cubit/assets/fonts/josefin.ttf and /dev/null differ diff --git a/apps/rider-archive-cubit/assets/fonts/mohanad.ttf b/apps/rider-archive-cubit/assets/fonts/mohanad.ttf deleted file mode 100644 index 854341c..0000000 Binary files a/apps/rider-archive-cubit/assets/fonts/mohanad.ttf and /dev/null differ diff --git a/apps/rider-archive-cubit/assets/images/2.png b/apps/rider-archive-cubit/assets/images/2.png deleted file mode 100644 index 7567e84..0000000 Binary files a/apps/rider-archive-cubit/assets/images/2.png and /dev/null differ diff --git a/apps/rider-archive-cubit/assets/images/A.png b/apps/rider-archive-cubit/assets/images/A.png deleted file mode 100644 index 246b9d2..0000000 Binary files a/apps/rider-archive-cubit/assets/images/A.png and /dev/null differ diff --git a/apps/rider-archive-cubit/assets/images/b.png b/apps/rider-archive-cubit/assets/images/b.png deleted file mode 100644 index b22f96c..0000000 Binary files a/apps/rider-archive-cubit/assets/images/b.png and /dev/null differ diff --git a/apps/rider-archive-cubit/assets/images/balash.png b/apps/rider-archive-cubit/assets/images/balash.png deleted file mode 100644 index 84977a2..0000000 Binary files a/apps/rider-archive-cubit/assets/images/balash.png and /dev/null differ diff --git a/apps/rider-archive-cubit/assets/images/blob.png b/apps/rider-archive-cubit/assets/images/blob.png deleted file mode 100644 index e45e42c..0000000 Binary files a/apps/rider-archive-cubit/assets/images/blob.png and /dev/null differ diff --git a/apps/rider-archive-cubit/assets/images/brand.png b/apps/rider-archive-cubit/assets/images/brand.png deleted file mode 100644 index 9282720..0000000 Binary files a/apps/rider-archive-cubit/assets/images/brand.png and /dev/null differ diff --git a/apps/rider-archive-cubit/assets/images/bus.png b/apps/rider-archive-cubit/assets/images/bus.png deleted file mode 100644 index a1e3958..0000000 Binary files a/apps/rider-archive-cubit/assets/images/bus.png and /dev/null differ diff --git a/apps/rider-archive-cubit/assets/images/car.png b/apps/rider-archive-cubit/assets/images/car.png deleted file mode 100644 index b078ecc..0000000 Binary files a/apps/rider-archive-cubit/assets/images/car.png and /dev/null differ diff --git a/apps/rider-archive-cubit/assets/images/car3.png b/apps/rider-archive-cubit/assets/images/car3.png deleted file mode 100644 index 41627ae..0000000 Binary files a/apps/rider-archive-cubit/assets/images/car3.png and /dev/null differ diff --git a/apps/rider-archive-cubit/assets/images/carspeed.png b/apps/rider-archive-cubit/assets/images/carspeed.png deleted file mode 100644 index b8b2d37..0000000 Binary files a/apps/rider-archive-cubit/assets/images/carspeed.png and /dev/null differ diff --git a/apps/rider-archive-cubit/assets/images/cashMTN.png b/apps/rider-archive-cubit/assets/images/cashMTN.png deleted file mode 100644 index bae958b..0000000 Binary files a/apps/rider-archive-cubit/assets/images/cashMTN.png and /dev/null differ diff --git a/apps/rider-archive-cubit/assets/images/education.png b/apps/rider-archive-cubit/assets/images/education.png deleted file mode 100644 index fcadd1b..0000000 Binary files a/apps/rider-archive-cubit/assets/images/education.png and /dev/null differ diff --git a/apps/rider-archive-cubit/assets/images/electric.png b/apps/rider-archive-cubit/assets/images/electric.png deleted file mode 100644 index b2889b8..0000000 Binary files a/apps/rider-archive-cubit/assets/images/electric.png and /dev/null differ diff --git a/apps/rider-archive-cubit/assets/images/electric_car.jpg b/apps/rider-archive-cubit/assets/images/electric_car.jpg deleted file mode 100644 index b57b770..0000000 Binary files a/apps/rider-archive-cubit/assets/images/electric_car.jpg and /dev/null differ diff --git a/apps/rider-archive-cubit/assets/images/employmentType.png b/apps/rider-archive-cubit/assets/images/employmentType.png deleted file mode 100644 index 8fdcf14..0000000 Binary files a/apps/rider-archive-cubit/assets/images/employmentType.png and /dev/null differ diff --git a/apps/rider-archive-cubit/assets/images/freeRide.png b/apps/rider-archive-cubit/assets/images/freeRide.png deleted file mode 100644 index 0667d42..0000000 Binary files a/apps/rider-archive-cubit/assets/images/freeRide.png and /dev/null differ diff --git a/apps/rider-archive-cubit/assets/images/gender.png b/apps/rider-archive-cubit/assets/images/gender.png deleted file mode 100644 index 134dccb..0000000 Binary files a/apps/rider-archive-cubit/assets/images/gender.png and /dev/null differ diff --git a/apps/rider-archive-cubit/assets/images/jeep.png b/apps/rider-archive-cubit/assets/images/jeep.png deleted file mode 100644 index 8f1cbf3..0000000 Binary files a/apps/rider-archive-cubit/assets/images/jeep.png and /dev/null differ diff --git a/apps/rider-archive-cubit/assets/images/lady.png b/apps/rider-archive-cubit/assets/images/lady.png deleted file mode 100644 index 76277fe..0000000 Binary files a/apps/rider-archive-cubit/assets/images/lady.png and /dev/null differ diff --git a/apps/rider-archive-cubit/assets/images/lady1.png b/apps/rider-archive-cubit/assets/images/lady1.png deleted file mode 100644 index 2797b75..0000000 Binary files a/apps/rider-archive-cubit/assets/images/lady1.png and /dev/null differ diff --git a/apps/rider-archive-cubit/assets/images/login_hero.png b/apps/rider-archive-cubit/assets/images/login_hero.png deleted file mode 100644 index 34bd669..0000000 Binary files a/apps/rider-archive-cubit/assets/images/login_hero.png and /dev/null differ diff --git a/apps/rider-archive-cubit/assets/images/logo.gif b/apps/rider-archive-cubit/assets/images/logo.gif deleted file mode 100644 index 6bb621e..0000000 Binary files a/apps/rider-archive-cubit/assets/images/logo.gif and /dev/null differ diff --git a/apps/rider-archive-cubit/assets/images/logo.png b/apps/rider-archive-cubit/assets/images/logo.png deleted file mode 100644 index 34bd669..0000000 Binary files a/apps/rider-archive-cubit/assets/images/logo.png and /dev/null differ diff --git a/apps/rider-archive-cubit/assets/images/maritalStatus.png b/apps/rider-archive-cubit/assets/images/maritalStatus.png deleted file mode 100644 index 121d555..0000000 Binary files a/apps/rider-archive-cubit/assets/images/maritalStatus.png and /dev/null differ diff --git a/apps/rider-archive-cubit/assets/images/moto.png b/apps/rider-archive-cubit/assets/images/moto.png deleted file mode 100644 index 8257812..0000000 Binary files a/apps/rider-archive-cubit/assets/images/moto.png and /dev/null differ diff --git a/apps/rider-archive-cubit/assets/images/moto1.png b/apps/rider-archive-cubit/assets/images/moto1.png deleted file mode 100644 index 80322db..0000000 Binary files a/apps/rider-archive-cubit/assets/images/moto1.png and /dev/null differ diff --git a/apps/rider-archive-cubit/assets/images/mtn.png b/apps/rider-archive-cubit/assets/images/mtn.png deleted file mode 100644 index 6aa6618..0000000 Binary files a/apps/rider-archive-cubit/assets/images/mtn.png and /dev/null differ diff --git a/apps/rider-archive-cubit/assets/images/name_hero.png b/apps/rider-archive-cubit/assets/images/name_hero.png deleted file mode 100644 index 34bd669..0000000 Binary files a/apps/rider-archive-cubit/assets/images/name_hero.png and /dev/null differ diff --git a/apps/rider-archive-cubit/assets/images/notepad.png b/apps/rider-archive-cubit/assets/images/notepad.png deleted file mode 100644 index 9536a4d..0000000 Binary files a/apps/rider-archive-cubit/assets/images/notepad.png and /dev/null differ diff --git a/apps/rider-archive-cubit/assets/images/on1.png b/apps/rider-archive-cubit/assets/images/on1.png deleted file mode 100644 index 4f75853..0000000 Binary files a/apps/rider-archive-cubit/assets/images/on1.png and /dev/null differ diff --git a/apps/rider-archive-cubit/assets/images/on2.png b/apps/rider-archive-cubit/assets/images/on2.png deleted file mode 100644 index 83b4e38..0000000 Binary files a/apps/rider-archive-cubit/assets/images/on2.png and /dev/null differ diff --git a/apps/rider-archive-cubit/assets/images/on3.png b/apps/rider-archive-cubit/assets/images/on3.png deleted file mode 100644 index 3fe9574..0000000 Binary files a/apps/rider-archive-cubit/assets/images/on3.png and /dev/null differ diff --git a/apps/rider-archive-cubit/assets/images/onboarding_1.png b/apps/rider-archive-cubit/assets/images/onboarding_1.png deleted file mode 100644 index 7f04ae5..0000000 Binary files a/apps/rider-archive-cubit/assets/images/onboarding_1.png and /dev/null differ diff --git a/apps/rider-archive-cubit/assets/images/onboarding_2.png b/apps/rider-archive-cubit/assets/images/onboarding_2.png deleted file mode 100644 index 2b08791..0000000 Binary files a/apps/rider-archive-cubit/assets/images/onboarding_2.png and /dev/null differ diff --git a/apps/rider-archive-cubit/assets/images/onboarding_3.png b/apps/rider-archive-cubit/assets/images/onboarding_3.png deleted file mode 100644 index cdcb027..0000000 Binary files a/apps/rider-archive-cubit/assets/images/onboarding_3.png and /dev/null differ diff --git a/apps/rider-archive-cubit/assets/images/picker.png b/apps/rider-archive-cubit/assets/images/picker.png deleted file mode 100644 index 6a35bf3..0000000 Binary files a/apps/rider-archive-cubit/assets/images/picker.png and /dev/null differ diff --git a/apps/rider-archive-cubit/assets/images/pinkBike.png b/apps/rider-archive-cubit/assets/images/pinkBike.png deleted file mode 100644 index 0ed4ec5..0000000 Binary files a/apps/rider-archive-cubit/assets/images/pinkBike.png and /dev/null differ diff --git a/apps/rider-archive-cubit/assets/images/roundtrip.png b/apps/rider-archive-cubit/assets/images/roundtrip.png deleted file mode 100644 index c6088ba..0000000 Binary files a/apps/rider-archive-cubit/assets/images/roundtrip.png and /dev/null differ diff --git a/apps/rider-archive-cubit/assets/images/sedan.png b/apps/rider-archive-cubit/assets/images/sedan.png deleted file mode 100644 index c69e86d..0000000 Binary files a/apps/rider-archive-cubit/assets/images/sedan.png and /dev/null differ diff --git a/apps/rider-archive-cubit/assets/images/shamCash.png b/apps/rider-archive-cubit/assets/images/shamCash.png deleted file mode 100644 index ab13ac0..0000000 Binary files a/apps/rider-archive-cubit/assets/images/shamCash.png and /dev/null differ diff --git a/apps/rider-archive-cubit/assets/images/shamcashsend.png b/apps/rider-archive-cubit/assets/images/shamcashsend.png deleted file mode 100644 index 0814517..0000000 Binary files a/apps/rider-archive-cubit/assets/images/shamcashsend.png and /dev/null differ diff --git a/apps/rider-archive-cubit/assets/images/splash_logo.png b/apps/rider-archive-cubit/assets/images/splash_logo.png deleted file mode 100644 index 34bd669..0000000 Binary files a/apps/rider-archive-cubit/assets/images/splash_logo.png and /dev/null differ diff --git a/apps/rider-archive-cubit/assets/images/syriatel.png b/apps/rider-archive-cubit/assets/images/syriatel.png deleted file mode 100644 index 2facd27..0000000 Binary files a/apps/rider-archive-cubit/assets/images/syriatel.png and /dev/null differ diff --git a/apps/rider-archive-cubit/assets/start.wav b/apps/rider-archive-cubit/assets/start.wav deleted file mode 100644 index 0655506..0000000 Binary files a/apps/rider-archive-cubit/assets/start.wav and /dev/null differ diff --git a/apps/rider-archive-cubit/debug-info/app.android-arm.symbols b/apps/rider-archive-cubit/debug-info/app.android-arm.symbols deleted file mode 100644 index 7e3c426..0000000 Binary files a/apps/rider-archive-cubit/debug-info/app.android-arm.symbols and /dev/null differ diff --git a/apps/rider-archive-cubit/debug-info/app.android-arm64.symbols b/apps/rider-archive-cubit/debug-info/app.android-arm64.symbols deleted file mode 100644 index ad53d8b..0000000 Binary files a/apps/rider-archive-cubit/debug-info/app.android-arm64.symbols and /dev/null differ diff --git a/apps/rider-archive-cubit/debug-info/app.android-x64.symbols b/apps/rider-archive-cubit/debug-info/app.android-x64.symbols deleted file mode 100644 index 189ede5..0000000 Binary files a/apps/rider-archive-cubit/debug-info/app.android-x64.symbols and /dev/null differ diff --git a/apps/rider-archive-cubit/debug-info/app.ios-arm64.symbols b/apps/rider-archive-cubit/debug-info/app.ios-arm64.symbols deleted file mode 100644 index 1d0c85f..0000000 Binary files a/apps/rider-archive-cubit/debug-info/app.ios-arm64.symbols and /dev/null differ diff --git a/apps/rider-archive-cubit/devtools_options.yaml b/apps/rider-archive-cubit/devtools_options.yaml deleted file mode 100644 index 7e7e7f6..0000000 --- a/apps/rider-archive-cubit/devtools_options.yaml +++ /dev/null @@ -1 +0,0 @@ -extensions: diff --git a/apps/rider-archive-cubit/firebase.json b/apps/rider-archive-cubit/firebase.json deleted file mode 100644 index f559057..0000000 --- a/apps/rider-archive-cubit/firebase.json +++ /dev/null @@ -1 +0,0 @@ -{"functions":[{"source":"functions","codebase":"default","ignore":["node_modules",".git","firebase-debug.log","firebase-debug.*.log"],"predeploy":["npm --prefix \"$RESOURCE_DIR\" run lint"]}],"flutter":{"platforms":{"android":{"default":{"projectId":"tripz-7883a","appId":"1:139325012385:android:552cbaeca54851979fb3e0","fileOutput":"android/app/google-services.json"}},"ios":{"default":{"projectId":"tripz-7883a","appId":"1:139325012385:ios:964034e702133d609fb3e0","uploadDebugSymbols":false,"fileOutput":"ios/Runner/GoogleService-Info.plist"}},"macos":{"default":{"projectId":"tripz-7883a","appId":"1:139325012385:ios:964034e702133d609fb3e0","uploadDebugSymbols":false,"fileOutput":"macos/Runner/GoogleService-Info.plist"}},"dart":{"lib/firebase_options.dart":{"projectId":"tripz-7883a","configurations":{"android":"1:139325012385:android:552cbaeca54851979fb3e0","ios":"1:139325012385:ios:964034e702133d609fb3e0","macos":"1:139325012385:ios:964034e702133d609fb3e0","web":"1:139325012385:web:0820c0966e1dca869fb3e0"}}}}}} \ No newline at end of file diff --git a/apps/rider-archive-cubit/functions/.eslintrc.js b/apps/rider-archive-cubit/functions/.eslintrc.js deleted file mode 100644 index f4cb76c..0000000 --- a/apps/rider-archive-cubit/functions/.eslintrc.js +++ /dev/null @@ -1,28 +0,0 @@ -module.exports = { - env: { - es6: true, - node: true, - }, - parserOptions: { - "ecmaVersion": 2018, - }, - extends: [ - "eslint:recommended", - "google", - ], - rules: { - "no-restricted-globals": ["error", "name", "length"], - "prefer-arrow-callback": "error", - "quotes": ["error", "double", {"allowTemplateLiterals": true}], - }, - overrides: [ - { - files: ["**/*.spec.*"], - env: { - mocha: true, - }, - rules: {}, - }, - ], - globals: {}, -}; diff --git a/apps/rider-archive-cubit/functions/.gitignore b/apps/rider-archive-cubit/functions/.gitignore deleted file mode 100644 index 40b878d..0000000 --- a/apps/rider-archive-cubit/functions/.gitignore +++ /dev/null @@ -1 +0,0 @@ -node_modules/ \ No newline at end of file diff --git a/apps/rider-archive-cubit/functions/index.js b/apps/rider-archive-cubit/functions/index.js deleted file mode 100644 index 9789068..0000000 --- a/apps/rider-archive-cubit/functions/index.js +++ /dev/null @@ -1,39 +0,0 @@ -const express = require("express"); -const {RtcTokenBuilder, RtcRole} = require("agora-access-token"); -const functions = require("firebase-functions"); -const admin = require("firebase-admin"); - -admin.initializeApp(); - -const app = express(); - -const port = 8080; -const appId = "12994c6e707543e68d5638894d04f989"; -const appCertificate = "e21a388f83034a159f2783889a6d7bcf"; - -app.get("/token", (req, res) => { - const channelName = req.query.channelName; - if (!channelName) { - return res.status(500).json({"error": "channelName is required"}); - } - let uid = req.query.uid; - if (!uid) { - uid = 0; - } - let role = RtcRole.SUBSCRIBER; - if (req.query.role == "publisher") { - role = RtcRole.PUBLISHER; - } - let expireTime = req.query.expireTime; - if (!expireTime || expireTime == "") { - expireTime = parseInt(expireTime, 10); - } - const currentTime = Math.floor(Date.now() / 1000); - const privilegeExpireTime = currentTime + expireTime; - - const token = RtcTokenBuilder.buildTokenWithUid(appId, appCertificate, channelName, uid, role, privilegeExpireTime); - - res.json({token}); -}); - -exports.rtcTokenServer = functions.https.onRequest(app); diff --git a/apps/rider-archive-cubit/functions/package-lock.json b/apps/rider-archive-cubit/functions/package-lock.json deleted file mode 100644 index c1c8042..0000000 --- a/apps/rider-archive-cubit/functions/package-lock.json +++ /dev/null @@ -1,7677 +0,0 @@ -{ - "name": "functions", - "lockfileVersion": 3, - "requires": true, - "packages": { - "": { - "name": "functions", - "dependencies": { - "agora-access-token": "^2.0.4", - "express": "^4.18.2", - "firebase": "^10.6.0", - "firebase-admin": "^11.8.0", - "firebase-functions": "^4.7.0" - }, - "devDependencies": { - "eslint": "^8.15.0", - "eslint-config-google": "^0.14.0", - "firebase-functions-test": "^3.1.0" - }, - "engines": { - "node": "18" - } - }, - "node_modules/@aashutoshrathi/word-wrap": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz", - "integrity": "sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/@ampproject/remapping": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.1.tgz", - "integrity": "sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==", - "dev": true, - "peer": true, - "dependencies": { - "@jridgewell/gen-mapping": "^0.3.0", - "@jridgewell/trace-mapping": "^0.3.9" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@babel/code-frame": { - "version": "7.23.5", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.23.5.tgz", - "integrity": "sha512-CgH3s1a96LipHCmSUmYFPwY7MNx8C3avkq7i4Wl3cfa662ldtUe4VM1TPXX70pfmrlWTb6jLqTYrZyT2ZTJBgA==", - "dev": true, - "peer": true, - "dependencies": { - "@babel/highlight": "^7.23.4", - "chalk": "^2.4.2" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/code-frame/node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "peer": true, - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/code-frame/node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "peer": true, - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/code-frame/node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "peer": true, - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/@babel/code-frame/node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true, - "peer": true - }, - "node_modules/@babel/code-frame/node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "dev": true, - "peer": true, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/@babel/code-frame/node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "dev": true, - "peer": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/code-frame/node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "peer": true, - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/compat-data": { - "version": "7.23.5", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.23.5.tgz", - "integrity": "sha512-uU27kfDRlhfKl+w1U6vp16IuvSLtjAxdArVXPa9BvLkrr7CYIsxH5adpHObeAGY/41+syctUWOZ140a2Rvkgjw==", - "dev": true, - "peer": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/core": { - "version": "7.23.9", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.23.9.tgz", - "integrity": "sha512-5q0175NOjddqpvvzU+kDiSOAk4PfdO6FvwCWoQ6RO7rTzEe8vlo+4HVfcnAREhD4npMs0e9uZypjTwzZPCf/cw==", - "dev": true, - "peer": true, - "dependencies": { - "@ampproject/remapping": "^2.2.0", - "@babel/code-frame": "^7.23.5", - "@babel/generator": "^7.23.6", - "@babel/helper-compilation-targets": "^7.23.6", - "@babel/helper-module-transforms": "^7.23.3", - "@babel/helpers": "^7.23.9", - "@babel/parser": "^7.23.9", - "@babel/template": "^7.23.9", - "@babel/traverse": "^7.23.9", - "@babel/types": "^7.23.9", - "convert-source-map": "^2.0.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.2", - "json5": "^2.2.3", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/babel" - } - }, - "node_modules/@babel/generator": { - "version": "7.23.6", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.23.6.tgz", - "integrity": "sha512-qrSfCYxYQB5owCmGLbl8XRpX1ytXlpueOb0N0UmQwA073KZxejgQTzAmJezxvpwQD9uGtK2shHdi55QT+MbjIw==", - "dev": true, - "peer": true, - "dependencies": { - "@babel/types": "^7.23.6", - "@jridgewell/gen-mapping": "^0.3.2", - "@jridgewell/trace-mapping": "^0.3.17", - "jsesc": "^2.5.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-compilation-targets": { - "version": "7.23.6", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.23.6.tgz", - "integrity": "sha512-9JB548GZoQVmzrFgp8o7KxdgkTGm6xs9DW0o/Pim72UDjzr5ObUQ6ZzYPqA+g9OTS2bBQoctLJrky0RDCAWRgQ==", - "dev": true, - "peer": true, - "dependencies": { - "@babel/compat-data": "^7.23.5", - "@babel/helper-validator-option": "^7.23.5", - "browserslist": "^4.22.2", - "lru-cache": "^5.1.1", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-compilation-targets/node_modules/lru-cache": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", - "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", - "dev": true, - "peer": true, - "dependencies": { - "yallist": "^3.0.2" - } - }, - "node_modules/@babel/helper-compilation-targets/node_modules/yallist": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", - "dev": true, - "peer": true - }, - "node_modules/@babel/helper-environment-visitor": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz", - "integrity": "sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==", - "dev": true, - "peer": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-function-name": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz", - "integrity": "sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==", - "dev": true, - "peer": true, - "dependencies": { - "@babel/template": "^7.22.15", - "@babel/types": "^7.23.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-hoist-variables": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz", - "integrity": "sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==", - "dev": true, - "peer": true, - "dependencies": { - "@babel/types": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-module-imports": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.22.15.tgz", - "integrity": "sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w==", - "dev": true, - "peer": true, - "dependencies": { - "@babel/types": "^7.22.15" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-module-transforms": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.23.3.tgz", - "integrity": "sha512-7bBs4ED9OmswdfDzpz4MpWgSrV7FXlc3zIagvLFjS5H+Mk7Snr21vQ6QwrsoCGMfNC4e4LQPdoULEt4ykz0SRQ==", - "dev": true, - "peer": true, - "dependencies": { - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-module-imports": "^7.22.15", - "@babel/helper-simple-access": "^7.22.5", - "@babel/helper-split-export-declaration": "^7.22.6", - "@babel/helper-validator-identifier": "^7.22.20" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/helper-plugin-utils": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz", - "integrity": "sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==", - "dev": true, - "peer": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-simple-access": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz", - "integrity": "sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==", - "dev": true, - "peer": true, - "dependencies": { - "@babel/types": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-split-export-declaration": { - "version": "7.22.6", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz", - "integrity": "sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==", - "dev": true, - "peer": true, - "dependencies": { - "@babel/types": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-string-parser": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.23.4.tgz", - "integrity": "sha512-803gmbQdqwdf4olxrX4AJyFBV/RTr3rSmOj0rKwesmzlfhYNDEs+/iOcznzpNWlJlIlTJC2QfPFcHB6DlzdVLQ==", - "dev": true, - "peer": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-validator-identifier": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz", - "integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==", - "dev": true, - "peer": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-validator-option": { - "version": "7.23.5", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.23.5.tgz", - "integrity": "sha512-85ttAOMLsr53VgXkTbkx8oA6YTfT4q7/HzXSLEYmjcSTJPMPQtvq1BD79Byep5xMUYbGRzEpDsjUf3dyp54IKw==", - "dev": true, - "peer": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helpers": { - "version": "7.23.9", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.23.9.tgz", - "integrity": "sha512-87ICKgU5t5SzOT7sBMfCOZQ2rHjRU+Pcb9BoILMYz600W6DkVRLFBPwQ18gwUVvggqXivaUakpnxWQGbpywbBQ==", - "dev": true, - "peer": true, - "dependencies": { - "@babel/template": "^7.23.9", - "@babel/traverse": "^7.23.9", - "@babel/types": "^7.23.9" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/highlight": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.23.4.tgz", - "integrity": "sha512-acGdbYSfp2WheJoJm/EBBBLh/ID8KDc64ISZ9DYtBmC8/Q204PZJLHyzeB5qMzJ5trcOkybd78M4x2KWsUq++A==", - "dev": true, - "peer": true, - "dependencies": { - "@babel/helper-validator-identifier": "^7.22.20", - "chalk": "^2.4.2", - "js-tokens": "^4.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/highlight/node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "peer": true, - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/highlight/node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "peer": true, - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/highlight/node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "peer": true, - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/@babel/highlight/node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true, - "peer": true - }, - "node_modules/@babel/highlight/node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "dev": true, - "peer": true, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/@babel/highlight/node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "dev": true, - "peer": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/highlight/node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "peer": true, - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/parser": { - "version": "7.23.9", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.23.9.tgz", - "integrity": "sha512-9tcKgqKbs3xGJ+NtKF2ndOBBLVwPjl1SHxPQkd36r3Dlirw3xWUeGaTbqr7uGZcTaxkVNwc+03SVP7aCdWrTlA==", - "devOptional": true, - "bin": { - "parser": "bin/babel-parser.js" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@babel/plugin-syntax-async-generators": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", - "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", - "dev": true, - "peer": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-bigint": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz", - "integrity": "sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==", - "dev": true, - "peer": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-class-properties": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", - "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", - "dev": true, - "peer": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.12.13" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-import-meta": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", - "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", - "dev": true, - "peer": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-json-strings": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", - "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", - "dev": true, - "peer": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-jsx": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.23.3.tgz", - "integrity": "sha512-EB2MELswq55OHUoRZLGg/zC7QWUKfNLpE57m/S2yr1uEneIgsTgrSzXP3NXEsMkVn76OlaVVnzN+ugObuYGwhg==", - "dev": true, - "peer": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-logical-assignment-operators": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", - "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", - "dev": true, - "peer": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-nullish-coalescing-operator": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", - "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", - "dev": true, - "peer": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-numeric-separator": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", - "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", - "dev": true, - "peer": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-object-rest-spread": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", - "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", - "dev": true, - "peer": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-optional-catch-binding": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", - "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", - "dev": true, - "peer": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-optional-chaining": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", - "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", - "dev": true, - "peer": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-top-level-await": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", - "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", - "dev": true, - "peer": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-typescript": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.23.3.tgz", - "integrity": "sha512-9EiNjVJOMwCO+43TqoTrgQ8jMwcAd0sWyXi9RPfIsLTj4R2MADDDQXELhffaUx/uJv2AYcxBgPwH6j4TIA4ytQ==", - "dev": true, - "peer": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/template": { - "version": "7.23.9", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.23.9.tgz", - "integrity": "sha512-+xrD2BWLpvHKNmX2QbpdpsBaWnRxahMwJjO+KZk2JOElj5nSmKezyS1B4u+QbHMTX69t4ukm6hh9lsYQ7GHCKA==", - "dev": true, - "peer": true, - "dependencies": { - "@babel/code-frame": "^7.23.5", - "@babel/parser": "^7.23.9", - "@babel/types": "^7.23.9" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/traverse": { - "version": "7.23.9", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.23.9.tgz", - "integrity": "sha512-I/4UJ9vs90OkBtY6iiiTORVMyIhJ4kAVmsKo9KFc8UOxMeUfi2hvtIBsET5u9GizXE6/GFSuKCTNfgCswuEjRg==", - "dev": true, - "peer": true, - "dependencies": { - "@babel/code-frame": "^7.23.5", - "@babel/generator": "^7.23.6", - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-function-name": "^7.23.0", - "@babel/helper-hoist-variables": "^7.22.5", - "@babel/helper-split-export-declaration": "^7.22.6", - "@babel/parser": "^7.23.9", - "@babel/types": "^7.23.9", - "debug": "^4.3.1", - "globals": "^11.1.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/traverse/node_modules/globals": { - "version": "11.12.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", - "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", - "dev": true, - "peer": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/types": { - "version": "7.23.9", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.23.9.tgz", - "integrity": "sha512-dQjSq/7HaSjRM43FFGnv5keM2HsxpmyV1PfaSVm0nzzjwwTmjOe6J4bC8e3+pTEIgHaHj+1ZlLThRJ2auc/w1Q==", - "dev": true, - "peer": true, - "dependencies": { - "@babel/helper-string-parser": "^7.23.4", - "@babel/helper-validator-identifier": "^7.22.20", - "to-fast-properties": "^2.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@bcoe/v8-coverage": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", - "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", - "dev": true, - "peer": true - }, - "node_modules/@eslint-community/eslint-utils": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", - "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", - "dev": true, - "dependencies": { - "eslint-visitor-keys": "^3.3.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" - } - }, - "node_modules/@eslint-community/regexpp": { - "version": "4.10.0", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.10.0.tgz", - "integrity": "sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==", - "dev": true, - "engines": { - "node": "^12.0.0 || ^14.0.0 || >=16.0.0" - } - }, - "node_modules/@eslint/eslintrc": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz", - "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==", - "dev": true, - "dependencies": { - "ajv": "^6.12.4", - "debug": "^4.3.2", - "espree": "^9.6.0", - "globals": "^13.19.0", - "ignore": "^5.2.0", - "import-fresh": "^3.2.1", - "js-yaml": "^4.1.0", - "minimatch": "^3.1.2", - "strip-json-comments": "^3.1.1" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/@eslint/js": { - "version": "8.56.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.56.0.tgz", - "integrity": "sha512-gMsVel9D7f2HLkBma9VbtzZRehRogVRfbr++f06nL2vnCGCNlzOD+/MUov/F4p8myyAHspEhVobgjpX64q5m6A==", - "dev": true, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - } - }, - "node_modules/@fastify/busboy": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@fastify/busboy/-/busboy-1.2.1.tgz", - "integrity": "sha512-7PQA7EH43S0CxcOa9OeAnaeA0oQ+e/DHNPZwSQM9CQHW76jle5+OvLdibRp/Aafs9KXbLhxyjOTkRjWUbQEd3Q==", - "dependencies": { - "text-decoding": "^1.0.0" - }, - "engines": { - "node": ">=14" - } - }, - "node_modules/@firebase/analytics": { - "version": "0.10.0", - "resolved": "https://registry.npmjs.org/@firebase/analytics/-/analytics-0.10.0.tgz", - "integrity": "sha512-Locv8gAqx0e+GX/0SI3dzmBY5e9kjVDtD+3zCFLJ0tH2hJwuCAiL+5WkHuxKj92rqQj/rvkBUCfA1ewlX2hehg==", - "dependencies": { - "@firebase/component": "0.6.4", - "@firebase/installations": "0.6.4", - "@firebase/logger": "0.4.0", - "@firebase/util": "1.9.3", - "tslib": "^2.1.0" - }, - "peerDependencies": { - "@firebase/app": "0.x" - } - }, - "node_modules/@firebase/analytics-compat": { - "version": "0.2.6", - "resolved": "https://registry.npmjs.org/@firebase/analytics-compat/-/analytics-compat-0.2.6.tgz", - "integrity": "sha512-4MqpVLFkGK7NJf/5wPEEP7ePBJatwYpyjgJ+wQHQGHfzaCDgntOnl9rL2vbVGGKCnRqWtZDIWhctB86UWXaX2Q==", - "dependencies": { - "@firebase/analytics": "0.10.0", - "@firebase/analytics-types": "0.8.0", - "@firebase/component": "0.6.4", - "@firebase/util": "1.9.3", - "tslib": "^2.1.0" - }, - "peerDependencies": { - "@firebase/app-compat": "0.x" - } - }, - "node_modules/@firebase/analytics-types": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/@firebase/analytics-types/-/analytics-types-0.8.0.tgz", - "integrity": "sha512-iRP+QKI2+oz3UAh4nPEq14CsEjrjD6a5+fuypjScisAh9kXKFvdJOZJDwk7kikLvWVLGEs9+kIUS4LPQV7VZVw==" - }, - "node_modules/@firebase/app": { - "version": "0.9.23", - "resolved": "https://registry.npmjs.org/@firebase/app/-/app-0.9.23.tgz", - "integrity": "sha512-CA5pQ88We3FhyuesGKn1thaPBsJSGJGm6AlFToOmEJagWqBeDoNJqBkry/BsHnCs9xeYWWIprKxvuFmAFkdqoA==", - "dependencies": { - "@firebase/component": "0.6.4", - "@firebase/logger": "0.4.0", - "@firebase/util": "1.9.3", - "idb": "7.1.1", - "tslib": "^2.1.0" - } - }, - "node_modules/@firebase/app-check": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/@firebase/app-check/-/app-check-0.8.0.tgz", - "integrity": "sha512-dRDnhkcaC2FspMiRK/Vbp+PfsOAEP6ZElGm9iGFJ9fDqHoPs0HOPn7dwpJ51lCFi1+2/7n5pRPGhqF/F03I97g==", - "dependencies": { - "@firebase/component": "0.6.4", - "@firebase/logger": "0.4.0", - "@firebase/util": "1.9.3", - "tslib": "^2.1.0" - }, - "peerDependencies": { - "@firebase/app": "0.x" - } - }, - "node_modules/@firebase/app-check-compat": { - "version": "0.3.7", - "resolved": "https://registry.npmjs.org/@firebase/app-check-compat/-/app-check-compat-0.3.7.tgz", - "integrity": "sha512-cW682AxsyP1G+Z0/P7pO/WT2CzYlNxoNe5QejVarW2o5ZxeWSSPAiVEwpEpQR/bUlUmdeWThYTMvBWaopdBsqw==", - "dependencies": { - "@firebase/app-check": "0.8.0", - "@firebase/app-check-types": "0.5.0", - "@firebase/component": "0.6.4", - "@firebase/logger": "0.4.0", - "@firebase/util": "1.9.3", - "tslib": "^2.1.0" - }, - "peerDependencies": { - "@firebase/app-compat": "0.x" - } - }, - "node_modules/@firebase/app-check-interop-types": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/@firebase/app-check-interop-types/-/app-check-interop-types-0.3.0.tgz", - "integrity": "sha512-xAxHPZPIgFXnI+vb4sbBjZcde7ZluzPPaSK7Lx3/nmuVk4TjZvnL8ONnkd4ERQKL8WePQySU+pRcWkh8rDf5Sg==" - }, - "node_modules/@firebase/app-check-types": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/@firebase/app-check-types/-/app-check-types-0.5.0.tgz", - "integrity": "sha512-uwSUj32Mlubybw7tedRzR24RP8M8JUVR3NPiMk3/Z4bCmgEKTlQBwMXrehDAZ2wF+TsBq0SN1c6ema71U/JPyQ==" - }, - "node_modules/@firebase/app-compat": { - "version": "0.2.23", - "resolved": "https://registry.npmjs.org/@firebase/app-compat/-/app-compat-0.2.23.tgz", - "integrity": "sha512-UCv0LEzcoqAgY+sLsau7aOZz0CJNLN2gESY68bHKmukNXEN6onLPxBKJzn68CsZZGcdiIEXwvrum1riWNPe9Gw==", - "dependencies": { - "@firebase/app": "0.9.23", - "@firebase/component": "0.6.4", - "@firebase/logger": "0.4.0", - "@firebase/util": "1.9.3", - "tslib": "^2.1.0" - } - }, - "node_modules/@firebase/app-types": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/@firebase/app-types/-/app-types-0.9.0.tgz", - "integrity": "sha512-AeweANOIo0Mb8GiYm3xhTEBVCmPwTYAu9Hcd2qSkLuga/6+j9b1Jskl5bpiSQWy9eJ/j5pavxj6eYogmnuzm+Q==" - }, - "node_modules/@firebase/auth": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/@firebase/auth/-/auth-1.4.0.tgz", - "integrity": "sha512-SfFXZCHDbY+7oSR52NSwx0U7LjYiA+N8imloxphCf3/F+MFty/+mhdjSXGtrJYd0Gbud/qcyedfn2XnWJeIB/g==", - "dependencies": { - "@firebase/component": "0.6.4", - "@firebase/logger": "0.4.0", - "@firebase/util": "1.9.3", - "node-fetch": "2.6.7", - "tslib": "^2.1.0" - }, - "peerDependencies": { - "@firebase/app": "0.x", - "@react-native-async-storage/async-storage": "^1.18.1" - }, - "peerDependenciesMeta": { - "@react-native-async-storage/async-storage": { - "optional": true - } - } - }, - "node_modules/@firebase/auth-compat": { - "version": "0.4.9", - "resolved": "https://registry.npmjs.org/@firebase/auth-compat/-/auth-compat-0.4.9.tgz", - "integrity": "sha512-Fw03i7vduIciEBG4imLtA1duJbljgkfbxiBo/EuekcB+BnPxHp+e8OGMUfemPYeO7Munj6kUC9gr5DelsQkiNA==", - "dependencies": { - "@firebase/auth": "1.4.0", - "@firebase/auth-types": "0.12.0", - "@firebase/component": "0.6.4", - "@firebase/util": "1.9.3", - "node-fetch": "2.6.7", - "tslib": "^2.1.0" - }, - "peerDependencies": { - "@firebase/app-compat": "0.x" - } - }, - "node_modules/@firebase/auth-compat/node_modules/node-fetch": { - "version": "2.6.7", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz", - "integrity": "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==", - "dependencies": { - "whatwg-url": "^5.0.0" - }, - "engines": { - "node": "4.x || >=6.0.0" - }, - "peerDependencies": { - "encoding": "^0.1.0" - }, - "peerDependenciesMeta": { - "encoding": { - "optional": true - } - } - }, - "node_modules/@firebase/auth-interop-types": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/@firebase/auth-interop-types/-/auth-interop-types-0.2.1.tgz", - "integrity": "sha512-VOaGzKp65MY6P5FI84TfYKBXEPi6LmOCSMMzys6o2BN2LOsqy7pCuZCup7NYnfbk5OkkQKzvIfHOzTm0UDpkyg==" - }, - "node_modules/@firebase/auth-types": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/@firebase/auth-types/-/auth-types-0.12.0.tgz", - "integrity": "sha512-pPwaZt+SPOshK8xNoiQlK5XIrS97kFYc3Rc7xmy373QsOJ9MmqXxLaYssP5Kcds4wd2qK//amx/c+A8O2fVeZA==", - "peerDependencies": { - "@firebase/app-types": "0.x", - "@firebase/util": "1.x" - } - }, - "node_modules/@firebase/auth/node_modules/node-fetch": { - "version": "2.6.7", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz", - "integrity": "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==", - "dependencies": { - "whatwg-url": "^5.0.0" - }, - "engines": { - "node": "4.x || >=6.0.0" - }, - "peerDependencies": { - "encoding": "^0.1.0" - }, - "peerDependenciesMeta": { - "encoding": { - "optional": true - } - } - }, - "node_modules/@firebase/component": { - "version": "0.6.4", - "resolved": "https://registry.npmjs.org/@firebase/component/-/component-0.6.4.tgz", - "integrity": "sha512-rLMyrXuO9jcAUCaQXCMjCMUsWrba5fzHlNK24xz5j2W6A/SRmK8mZJ/hn7V0fViLbxC0lPMtrK1eYzk6Fg03jA==", - "dependencies": { - "@firebase/util": "1.9.3", - "tslib": "^2.1.0" - } - }, - "node_modules/@firebase/database": { - "version": "0.14.4", - "resolved": "https://registry.npmjs.org/@firebase/database/-/database-0.14.4.tgz", - "integrity": "sha512-+Ea/IKGwh42jwdjCyzTmeZeLM3oy1h0mFPsTy6OqCWzcu/KFqRAr5Tt1HRCOBlNOdbh84JPZC47WLU18n2VbxQ==", - "dependencies": { - "@firebase/auth-interop-types": "0.2.1", - "@firebase/component": "0.6.4", - "@firebase/logger": "0.4.0", - "@firebase/util": "1.9.3", - "faye-websocket": "0.11.4", - "tslib": "^2.1.0" - } - }, - "node_modules/@firebase/database-compat": { - "version": "0.3.4", - "resolved": "https://registry.npmjs.org/@firebase/database-compat/-/database-compat-0.3.4.tgz", - "integrity": "sha512-kuAW+l+sLMUKBThnvxvUZ+Q1ZrF/vFJ58iUY9kAcbX48U03nVzIF6Tmkf0p3WVQwMqiXguSgtOPIB6ZCeF+5Gg==", - "dependencies": { - "@firebase/component": "0.6.4", - "@firebase/database": "0.14.4", - "@firebase/database-types": "0.10.4", - "@firebase/logger": "0.4.0", - "@firebase/util": "1.9.3", - "tslib": "^2.1.0" - } - }, - "node_modules/@firebase/database-types": { - "version": "0.10.4", - "resolved": "https://registry.npmjs.org/@firebase/database-types/-/database-types-0.10.4.tgz", - "integrity": "sha512-dPySn0vJ/89ZeBac70T+2tWWPiJXWbmRygYv0smT5TfE3hDrQ09eKMF3Y+vMlTdrMWq7mUdYW5REWPSGH4kAZQ==", - "dependencies": { - "@firebase/app-types": "0.9.0", - "@firebase/util": "1.9.3" - } - }, - "node_modules/@firebase/firestore": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/@firebase/firestore/-/firestore-4.3.2.tgz", - "integrity": "sha512-K4TwMbgArWw+XAEUYX/vtk+TVy9n1uLeJKSrQeb89lwfkfyFINGLPME6YleaS0ovD1ziLM5/0WgL1CR4s53fDg==", - "dependencies": { - "@firebase/component": "0.6.4", - "@firebase/logger": "0.4.0", - "@firebase/util": "1.9.3", - "@firebase/webchannel-wrapper": "0.10.3", - "@grpc/grpc-js": "~1.9.0", - "@grpc/proto-loader": "^0.7.8", - "node-fetch": "2.6.7", - "tslib": "^2.1.0" - }, - "engines": { - "node": ">=10.10.0" - }, - "peerDependencies": { - "@firebase/app": "0.x" - } - }, - "node_modules/@firebase/firestore-compat": { - "version": "0.3.22", - "resolved": "https://registry.npmjs.org/@firebase/firestore-compat/-/firestore-compat-0.3.22.tgz", - "integrity": "sha512-M166UvFvRri0CK/+5N0MIeXJVxR6BsX0/96xFT506DxRPIFezLjLcvfddtyFgfe0CtyQWoxBXt060uWUg3d/sw==", - "dependencies": { - "@firebase/component": "0.6.4", - "@firebase/firestore": "4.3.2", - "@firebase/firestore-types": "3.0.0", - "@firebase/util": "1.9.3", - "tslib": "^2.1.0" - }, - "peerDependencies": { - "@firebase/app-compat": "0.x" - } - }, - "node_modules/@firebase/firestore-types": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@firebase/firestore-types/-/firestore-types-3.0.0.tgz", - "integrity": "sha512-Meg4cIezHo9zLamw0ymFYBD4SMjLb+ZXIbuN7T7ddXN6MGoICmOTq3/ltdCGoDCS2u+H1XJs2u/cYp75jsX9Qw==", - "peerDependencies": { - "@firebase/app-types": "0.x", - "@firebase/util": "1.x" - } - }, - "node_modules/@firebase/firestore/node_modules/@grpc/grpc-js": { - "version": "1.9.14", - "resolved": "https://registry.npmjs.org/@grpc/grpc-js/-/grpc-js-1.9.14.tgz", - "integrity": "sha512-nOpuzZ2G3IuMFN+UPPpKrC6NsLmWsTqSsm66IRfnBt1D4pwTqE27lmbpcPM+l2Ua4gE7PfjRHI6uedAy7hoXUw==", - "dependencies": { - "@grpc/proto-loader": "^0.7.8", - "@types/node": ">=12.12.47" - }, - "engines": { - "node": "^8.13.0 || >=10.10.0" - } - }, - "node_modules/@firebase/firestore/node_modules/node-fetch": { - "version": "2.6.7", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz", - "integrity": "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==", - "dependencies": { - "whatwg-url": "^5.0.0" - }, - "engines": { - "node": "4.x || >=6.0.0" - }, - "peerDependencies": { - "encoding": "^0.1.0" - }, - "peerDependenciesMeta": { - "encoding": { - "optional": true - } - } - }, - "node_modules/@firebase/functions": { - "version": "0.10.0", - "resolved": "https://registry.npmjs.org/@firebase/functions/-/functions-0.10.0.tgz", - "integrity": "sha512-2U+fMNxTYhtwSpkkR6WbBcuNMOVaI7MaH3cZ6UAeNfj7AgEwHwMIFLPpC13YNZhno219F0lfxzTAA0N62ndWzA==", - "dependencies": { - "@firebase/app-check-interop-types": "0.3.0", - "@firebase/auth-interop-types": "0.2.1", - "@firebase/component": "0.6.4", - "@firebase/messaging-interop-types": "0.2.0", - "@firebase/util": "1.9.3", - "node-fetch": "2.6.7", - "tslib": "^2.1.0" - }, - "peerDependencies": { - "@firebase/app": "0.x" - } - }, - "node_modules/@firebase/functions-compat": { - "version": "0.3.5", - "resolved": "https://registry.npmjs.org/@firebase/functions-compat/-/functions-compat-0.3.5.tgz", - "integrity": "sha512-uD4jwgwVqdWf6uc3NRKF8cSZ0JwGqSlyhPgackyUPe+GAtnERpS4+Vr66g0b3Gge0ezG4iyHo/EXW/Hjx7QhHw==", - "dependencies": { - "@firebase/component": "0.6.4", - "@firebase/functions": "0.10.0", - "@firebase/functions-types": "0.6.0", - "@firebase/util": "1.9.3", - "tslib": "^2.1.0" - }, - "peerDependencies": { - "@firebase/app-compat": "0.x" - } - }, - "node_modules/@firebase/functions-types": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/@firebase/functions-types/-/functions-types-0.6.0.tgz", - "integrity": "sha512-hfEw5VJtgWXIRf92ImLkgENqpL6IWpYaXVYiRkFY1jJ9+6tIhWM7IzzwbevwIIud/jaxKVdRzD7QBWfPmkwCYw==" - }, - "node_modules/@firebase/functions/node_modules/node-fetch": { - "version": "2.6.7", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz", - "integrity": "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==", - "dependencies": { - "whatwg-url": "^5.0.0" - }, - "engines": { - "node": "4.x || >=6.0.0" - }, - "peerDependencies": { - "encoding": "^0.1.0" - }, - "peerDependenciesMeta": { - "encoding": { - "optional": true - } - } - }, - "node_modules/@firebase/installations": { - "version": "0.6.4", - "resolved": "https://registry.npmjs.org/@firebase/installations/-/installations-0.6.4.tgz", - "integrity": "sha512-u5y88rtsp7NYkCHC3ElbFBrPtieUybZluXyzl7+4BsIz4sqb4vSAuwHEUgCgCeaQhvsnxDEU6icly8U9zsJigA==", - "dependencies": { - "@firebase/component": "0.6.4", - "@firebase/util": "1.9.3", - "idb": "7.0.1", - "tslib": "^2.1.0" - }, - "peerDependencies": { - "@firebase/app": "0.x" - } - }, - "node_modules/@firebase/installations-compat": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/@firebase/installations-compat/-/installations-compat-0.2.4.tgz", - "integrity": "sha512-LI9dYjp0aT9Njkn9U4JRrDqQ6KXeAmFbRC0E7jI7+hxl5YmRWysq5qgQl22hcWpTk+cm3es66d/apoDU/A9n6Q==", - "dependencies": { - "@firebase/component": "0.6.4", - "@firebase/installations": "0.6.4", - "@firebase/installations-types": "0.5.0", - "@firebase/util": "1.9.3", - "tslib": "^2.1.0" - }, - "peerDependencies": { - "@firebase/app-compat": "0.x" - } - }, - "node_modules/@firebase/installations-types": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/@firebase/installations-types/-/installations-types-0.5.0.tgz", - "integrity": "sha512-9DP+RGfzoI2jH7gY4SlzqvZ+hr7gYzPODrbzVD82Y12kScZ6ZpRg/i3j6rleto8vTFC8n6Len4560FnV1w2IRg==", - "peerDependencies": { - "@firebase/app-types": "0.x" - } - }, - "node_modules/@firebase/installations/node_modules/idb": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/idb/-/idb-7.0.1.tgz", - "integrity": "sha512-UUxlE7vGWK5RfB/fDwEGgRf84DY/ieqNha6msMV99UsEMQhJ1RwbCd8AYBj3QMgnE3VZnfQvm4oKVCJTYlqIgg==" - }, - "node_modules/@firebase/logger": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/@firebase/logger/-/logger-0.4.0.tgz", - "integrity": "sha512-eRKSeykumZ5+cJPdxxJRgAC3G5NknY2GwEbKfymdnXtnT0Ucm4pspfR6GT4MUQEDuJwRVbVcSx85kgJulMoFFA==", - "dependencies": { - "tslib": "^2.1.0" - } - }, - "node_modules/@firebase/messaging": { - "version": "0.12.4", - "resolved": "https://registry.npmjs.org/@firebase/messaging/-/messaging-0.12.4.tgz", - "integrity": "sha512-6JLZct6zUaex4g7HI3QbzeUrg9xcnmDAPTWpkoMpd/GoSVWH98zDoWXMGrcvHeCAIsLpFMe4MPoZkJbrPhaASw==", - "dependencies": { - "@firebase/component": "0.6.4", - "@firebase/installations": "0.6.4", - "@firebase/messaging-interop-types": "0.2.0", - "@firebase/util": "1.9.3", - "idb": "7.0.1", - "tslib": "^2.1.0" - }, - "peerDependencies": { - "@firebase/app": "0.x" - } - }, - "node_modules/@firebase/messaging-compat": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/@firebase/messaging-compat/-/messaging-compat-0.2.4.tgz", - "integrity": "sha512-lyFjeUhIsPRYDPNIkYX1LcZMpoVbBWXX4rPl7c/rqc7G+EUea7IEtSt4MxTvh6fDfPuzLn7+FZADfscC+tNMfg==", - "dependencies": { - "@firebase/component": "0.6.4", - "@firebase/messaging": "0.12.4", - "@firebase/util": "1.9.3", - "tslib": "^2.1.0" - }, - "peerDependencies": { - "@firebase/app-compat": "0.x" - } - }, - "node_modules/@firebase/messaging-interop-types": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/@firebase/messaging-interop-types/-/messaging-interop-types-0.2.0.tgz", - "integrity": "sha512-ujA8dcRuVeBixGR9CtegfpU4YmZf3Lt7QYkcj693FFannwNuZgfAYaTmbJ40dtjB81SAu6tbFPL9YLNT15KmOQ==" - }, - "node_modules/@firebase/messaging/node_modules/idb": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/idb/-/idb-7.0.1.tgz", - "integrity": "sha512-UUxlE7vGWK5RfB/fDwEGgRf84DY/ieqNha6msMV99UsEMQhJ1RwbCd8AYBj3QMgnE3VZnfQvm4oKVCJTYlqIgg==" - }, - "node_modules/@firebase/performance": { - "version": "0.6.4", - "resolved": "https://registry.npmjs.org/@firebase/performance/-/performance-0.6.4.tgz", - "integrity": "sha512-HfTn/bd8mfy/61vEqaBelNiNnvAbUtME2S25A67Nb34zVuCSCRIX4SseXY6zBnOFj3oLisaEqhVcJmVPAej67g==", - "dependencies": { - "@firebase/component": "0.6.4", - "@firebase/installations": "0.6.4", - "@firebase/logger": "0.4.0", - "@firebase/util": "1.9.3", - "tslib": "^2.1.0" - }, - "peerDependencies": { - "@firebase/app": "0.x" - } - }, - "node_modules/@firebase/performance-compat": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/@firebase/performance-compat/-/performance-compat-0.2.4.tgz", - "integrity": "sha512-nnHUb8uP9G8islzcld/k6Bg5RhX62VpbAb/Anj7IXs/hp32Eb2LqFPZK4sy3pKkBUO5wcrlRWQa6wKOxqlUqsg==", - "dependencies": { - "@firebase/component": "0.6.4", - "@firebase/logger": "0.4.0", - "@firebase/performance": "0.6.4", - "@firebase/performance-types": "0.2.0", - "@firebase/util": "1.9.3", - "tslib": "^2.1.0" - }, - "peerDependencies": { - "@firebase/app-compat": "0.x" - } - }, - "node_modules/@firebase/performance-types": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/@firebase/performance-types/-/performance-types-0.2.0.tgz", - "integrity": "sha512-kYrbr8e/CYr1KLrLYZZt2noNnf+pRwDq2KK9Au9jHrBMnb0/C9X9yWSXmZkFt4UIdsQknBq8uBB7fsybZdOBTA==" - }, - "node_modules/@firebase/remote-config": { - "version": "0.4.4", - "resolved": "https://registry.npmjs.org/@firebase/remote-config/-/remote-config-0.4.4.tgz", - "integrity": "sha512-x1ioTHGX8ZwDSTOVp8PBLv2/wfwKzb4pxi0gFezS5GCJwbLlloUH4YYZHHS83IPxnua8b6l0IXUaWd0RgbWwzQ==", - "dependencies": { - "@firebase/component": "0.6.4", - "@firebase/installations": "0.6.4", - "@firebase/logger": "0.4.0", - "@firebase/util": "1.9.3", - "tslib": "^2.1.0" - }, - "peerDependencies": { - "@firebase/app": "0.x" - } - }, - "node_modules/@firebase/remote-config-compat": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/@firebase/remote-config-compat/-/remote-config-compat-0.2.4.tgz", - "integrity": "sha512-FKiki53jZirrDFkBHglB3C07j5wBpitAaj8kLME6g8Mx+aq7u9P7qfmuSRytiOItADhWUj7O1JIv7n9q87SuwA==", - "dependencies": { - "@firebase/component": "0.6.4", - "@firebase/logger": "0.4.0", - "@firebase/remote-config": "0.4.4", - "@firebase/remote-config-types": "0.3.0", - "@firebase/util": "1.9.3", - "tslib": "^2.1.0" - }, - "peerDependencies": { - "@firebase/app-compat": "0.x" - } - }, - "node_modules/@firebase/remote-config-types": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/@firebase/remote-config-types/-/remote-config-types-0.3.0.tgz", - "integrity": "sha512-RtEH4vdcbXZuZWRZbIRmQVBNsE7VDQpet2qFvq6vwKLBIQRQR5Kh58M4ok3A3US8Sr3rubYnaGqZSurCwI8uMA==" - }, - "node_modules/@firebase/storage": { - "version": "0.11.2", - "resolved": "https://registry.npmjs.org/@firebase/storage/-/storage-0.11.2.tgz", - "integrity": "sha512-CtvoFaBI4hGXlXbaCHf8humajkbXhs39Nbh6MbNxtwJiCqxPy9iH3D3CCfXAvP0QvAAwmJUTK3+z9a++Kc4nkA==", - "dependencies": { - "@firebase/component": "0.6.4", - "@firebase/util": "1.9.3", - "node-fetch": "2.6.7", - "tslib": "^2.1.0" - }, - "peerDependencies": { - "@firebase/app": "0.x" - } - }, - "node_modules/@firebase/storage-compat": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/@firebase/storage-compat/-/storage-compat-0.3.2.tgz", - "integrity": "sha512-wvsXlLa9DVOMQJckbDNhXKKxRNNewyUhhbXev3t8kSgoCotd1v3MmqhKKz93ePhDnhHnDs7bYHy+Qa8dRY6BXw==", - "dependencies": { - "@firebase/component": "0.6.4", - "@firebase/storage": "0.11.2", - "@firebase/storage-types": "0.8.0", - "@firebase/util": "1.9.3", - "tslib": "^2.1.0" - }, - "peerDependencies": { - "@firebase/app-compat": "0.x" - } - }, - "node_modules/@firebase/storage-types": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/@firebase/storage-types/-/storage-types-0.8.0.tgz", - "integrity": "sha512-isRHcGrTs9kITJC0AVehHfpraWFui39MPaU7Eo8QfWlqW7YPymBmRgjDrlOgFdURh6Cdeg07zmkLP5tzTKRSpg==", - "peerDependencies": { - "@firebase/app-types": "0.x", - "@firebase/util": "1.x" - } - }, - "node_modules/@firebase/storage/node_modules/node-fetch": { - "version": "2.6.7", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz", - "integrity": "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==", - "dependencies": { - "whatwg-url": "^5.0.0" - }, - "engines": { - "node": "4.x || >=6.0.0" - }, - "peerDependencies": { - "encoding": "^0.1.0" - }, - "peerDependenciesMeta": { - "encoding": { - "optional": true - } - } - }, - "node_modules/@firebase/util": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/@firebase/util/-/util-1.9.3.tgz", - "integrity": "sha512-DY02CRhOZwpzO36fHpuVysz6JZrscPiBXD0fXp6qSrL9oNOx5KWICKdR95C0lSITzxp0TZosVyHqzatE8JbcjA==", - "dependencies": { - "tslib": "^2.1.0" - } - }, - "node_modules/@firebase/webchannel-wrapper": { - "version": "0.10.3", - "resolved": "https://registry.npmjs.org/@firebase/webchannel-wrapper/-/webchannel-wrapper-0.10.3.tgz", - "integrity": "sha512-+ZplYUN3HOpgCfgInqgdDAbkGGVzES1cs32JJpeqoh87SkRobGXElJx+1GZSaDqzFL+bYiX18qEcBK76mYs8uA==" - }, - "node_modules/@google-cloud/firestore": { - "version": "6.8.0", - "resolved": "https://registry.npmjs.org/@google-cloud/firestore/-/firestore-6.8.0.tgz", - "integrity": "sha512-JRpk06SmZXLGz0pNx1x7yU3YhkUXheKgH5hbDZ4kMsdhtfV5qPLJLRI4wv69K0cZorIk+zTMOwptue7hizo0eA==", - "optional": true, - "dependencies": { - "fast-deep-equal": "^3.1.1", - "functional-red-black-tree": "^1.0.1", - "google-gax": "^3.5.7", - "protobufjs": "^7.2.5" - }, - "engines": { - "node": ">=12.0.0" - } - }, - "node_modules/@google-cloud/paginator": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/@google-cloud/paginator/-/paginator-3.0.7.tgz", - "integrity": "sha512-jJNutk0arIQhmpUUQJPJErsojqo834KcyB6X7a1mxuic8i1tKXxde8E69IZxNZawRIlZdIK2QY4WALvlK5MzYQ==", - "optional": true, - "dependencies": { - "arrify": "^2.0.0", - "extend": "^3.0.2" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@google-cloud/projectify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@google-cloud/projectify/-/projectify-3.0.0.tgz", - "integrity": "sha512-HRkZsNmjScY6Li8/kb70wjGlDDyLkVk3KvoEo9uIoxSjYLJasGiCch9+PqRVDOCGUFvEIqyogl+BeqILL4OJHA==", - "optional": true, - "engines": { - "node": ">=12.0.0" - } - }, - "node_modules/@google-cloud/promisify": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@google-cloud/promisify/-/promisify-3.0.1.tgz", - "integrity": "sha512-z1CjRjtQyBOYL+5Qr9DdYIfrdLBe746jRTYfaYU6MeXkqp7UfYs/jX16lFFVzZ7PGEJvqZNqYUEtb1mvDww4pA==", - "optional": true, - "engines": { - "node": ">=12" - } - }, - "node_modules/@google-cloud/storage": { - "version": "6.12.0", - "resolved": "https://registry.npmjs.org/@google-cloud/storage/-/storage-6.12.0.tgz", - "integrity": "sha512-78nNAY7iiZ4O/BouWMWTD/oSF2YtYgYB3GZirn0To6eBOugjXVoK+GXgUXOl+HlqbAOyHxAVXOlsj3snfbQ1dw==", - "optional": true, - "dependencies": { - "@google-cloud/paginator": "^3.0.7", - "@google-cloud/projectify": "^3.0.0", - "@google-cloud/promisify": "^3.0.0", - "abort-controller": "^3.0.0", - "async-retry": "^1.3.3", - "compressible": "^2.0.12", - "duplexify": "^4.0.0", - "ent": "^2.2.0", - "extend": "^3.0.2", - "fast-xml-parser": "^4.2.2", - "gaxios": "^5.0.0", - "google-auth-library": "^8.0.1", - "mime": "^3.0.0", - "mime-types": "^2.0.8", - "p-limit": "^3.0.1", - "retry-request": "^5.0.0", - "teeny-request": "^8.0.0", - "uuid": "^8.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/@google-cloud/storage/node_modules/uuid": { - "version": "8.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", - "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", - "optional": true, - "bin": { - "uuid": "dist/bin/uuid" - } - }, - "node_modules/@grpc/grpc-js": { - "version": "1.8.21", - "resolved": "https://registry.npmjs.org/@grpc/grpc-js/-/grpc-js-1.8.21.tgz", - "integrity": "sha512-KeyQeZpxeEBSqFVTi3q2K7PiPXmgBfECc4updA1ejCLjYmoAlvvM3ZMp5ztTDUCUQmoY3CpDxvchjO1+rFkoHg==", - "optional": true, - "dependencies": { - "@grpc/proto-loader": "^0.7.0", - "@types/node": ">=12.12.47" - }, - "engines": { - "node": "^8.13.0 || >=10.10.0" - } - }, - "node_modules/@grpc/proto-loader": { - "version": "0.7.10", - "resolved": "https://registry.npmjs.org/@grpc/proto-loader/-/proto-loader-0.7.10.tgz", - "integrity": "sha512-CAqDfoaQ8ykFd9zqBDn4k6iWT9loLAlc2ETmDFS9JCD70gDcnA4L3AFEo2iV7KyAtAAHFW9ftq1Fz+Vsgq80RQ==", - "dependencies": { - "lodash.camelcase": "^4.3.0", - "long": "^5.0.0", - "protobufjs": "^7.2.4", - "yargs": "^17.7.2" - }, - "bin": { - "proto-loader-gen-types": "build/bin/proto-loader-gen-types.js" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/@humanwhocodes/config-array": { - "version": "0.11.14", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.14.tgz", - "integrity": "sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==", - "dev": true, - "dependencies": { - "@humanwhocodes/object-schema": "^2.0.2", - "debug": "^4.3.1", - "minimatch": "^3.0.5" - }, - "engines": { - "node": ">=10.10.0" - } - }, - "node_modules/@humanwhocodes/module-importer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", - "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", - "dev": true, - "engines": { - "node": ">=12.22" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/nzakas" - } - }, - "node_modules/@humanwhocodes/object-schema": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.2.tgz", - "integrity": "sha512-6EwiSjwWYP7pTckG6I5eyFANjPhmPjUX9JRLUSfNPC7FX7zK9gyZAfUEaECL6ALTpGX5AjnBq3C9XmVWPitNpw==", - "dev": true - }, - "node_modules/@istanbuljs/load-nyc-config": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", - "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", - "dev": true, - "peer": true, - "dependencies": { - "camelcase": "^5.3.1", - "find-up": "^4.1.0", - "get-package-type": "^0.1.0", - "js-yaml": "^3.13.1", - "resolve-from": "^5.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "dev": true, - "peer": true, - "dependencies": { - "sprintf-js": "~1.0.2" - } - }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dev": true, - "peer": true, - "dependencies": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/js-yaml": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", - "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", - "dev": true, - "peer": true, - "dependencies": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dev": true, - "peer": true, - "dependencies": { - "p-locate": "^4.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, - "peer": true, - "dependencies": { - "p-try": "^2.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dev": true, - "peer": true, - "dependencies": { - "p-limit": "^2.2.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", - "dev": true, - "peer": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/@istanbuljs/schema": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", - "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", - "dev": true, - "peer": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/@jest/console": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/console/-/console-29.7.0.tgz", - "integrity": "sha512-5Ni4CU7XHQi32IJ398EEP4RrB8eV09sXP2ROqD4bksHrnTree52PsxvX8tpL8LvTZ3pFzXyPbNQReSN41CAhOg==", - "dev": true, - "peer": true, - "dependencies": { - "@jest/types": "^29.6.3", - "@types/node": "*", - "chalk": "^4.0.0", - "jest-message-util": "^29.7.0", - "jest-util": "^29.7.0", - "slash": "^3.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/core": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/core/-/core-29.7.0.tgz", - "integrity": "sha512-n7aeXWKMnGtDA48y8TLWJPJmLmmZ642Ceo78cYWEpiD7FzDgmNDV/GCVRorPABdXLJZ/9wzzgZAlHjXjxDHGsg==", - "dev": true, - "peer": true, - "dependencies": { - "@jest/console": "^29.7.0", - "@jest/reporters": "^29.7.0", - "@jest/test-result": "^29.7.0", - "@jest/transform": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/node": "*", - "ansi-escapes": "^4.2.1", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "exit": "^0.1.2", - "graceful-fs": "^4.2.9", - "jest-changed-files": "^29.7.0", - "jest-config": "^29.7.0", - "jest-haste-map": "^29.7.0", - "jest-message-util": "^29.7.0", - "jest-regex-util": "^29.6.3", - "jest-resolve": "^29.7.0", - "jest-resolve-dependencies": "^29.7.0", - "jest-runner": "^29.7.0", - "jest-runtime": "^29.7.0", - "jest-snapshot": "^29.7.0", - "jest-util": "^29.7.0", - "jest-validate": "^29.7.0", - "jest-watcher": "^29.7.0", - "micromatch": "^4.0.4", - "pretty-format": "^29.7.0", - "slash": "^3.0.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - }, - "peerDependencies": { - "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" - }, - "peerDependenciesMeta": { - "node-notifier": { - "optional": true - } - } - }, - "node_modules/@jest/environment": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-29.7.0.tgz", - "integrity": "sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw==", - "dev": true, - "peer": true, - "dependencies": { - "@jest/fake-timers": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/node": "*", - "jest-mock": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/expect": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-29.7.0.tgz", - "integrity": "sha512-8uMeAMycttpva3P1lBHB8VciS9V0XAr3GymPpipdyQXbBcuhkLQOSe8E/p92RyAdToS6ZD1tFkX+CkhoECE0dQ==", - "dev": true, - "peer": true, - "dependencies": { - "expect": "^29.7.0", - "jest-snapshot": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/expect-utils": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-29.7.0.tgz", - "integrity": "sha512-GlsNBWiFQFCVi9QVSx7f5AgMeLxe9YCCs5PuP2O2LdjDAA8Jh9eX7lA1Jq/xdXw3Wb3hyvlFNfZIfcRetSzYcA==", - "dev": true, - "peer": true, - "dependencies": { - "jest-get-type": "^29.6.3" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/fake-timers": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-29.7.0.tgz", - "integrity": "sha512-q4DH1Ha4TTFPdxLsqDXK1d3+ioSL7yL5oCMJZgDYm6i+6CygW5E5xVr/D1HdsGxjt1ZWSfUAs9OxSB/BNelWrQ==", - "dev": true, - "peer": true, - "dependencies": { - "@jest/types": "^29.6.3", - "@sinonjs/fake-timers": "^10.0.2", - "@types/node": "*", - "jest-message-util": "^29.7.0", - "jest-mock": "^29.7.0", - "jest-util": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/globals": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-29.7.0.tgz", - "integrity": "sha512-mpiz3dutLbkW2MNFubUGUEVLkTGiqW6yLVTA+JbP6fI6J5iL9Y0Nlg8k95pcF8ctKwCS7WVxteBs29hhfAotzQ==", - "dev": true, - "peer": true, - "dependencies": { - "@jest/environment": "^29.7.0", - "@jest/expect": "^29.7.0", - "@jest/types": "^29.6.3", - "jest-mock": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/reporters": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-29.7.0.tgz", - "integrity": "sha512-DApq0KJbJOEzAFYjHADNNxAE3KbhxQB1y5Kplb5Waqw6zVbuWatSnMjE5gs8FUgEPmNsnZA3NCWl9NG0ia04Pg==", - "dev": true, - "peer": true, - "dependencies": { - "@bcoe/v8-coverage": "^0.2.3", - "@jest/console": "^29.7.0", - "@jest/test-result": "^29.7.0", - "@jest/transform": "^29.7.0", - "@jest/types": "^29.6.3", - "@jridgewell/trace-mapping": "^0.3.18", - "@types/node": "*", - "chalk": "^4.0.0", - "collect-v8-coverage": "^1.0.0", - "exit": "^0.1.2", - "glob": "^7.1.3", - "graceful-fs": "^4.2.9", - "istanbul-lib-coverage": "^3.0.0", - "istanbul-lib-instrument": "^6.0.0", - "istanbul-lib-report": "^3.0.0", - "istanbul-lib-source-maps": "^4.0.0", - "istanbul-reports": "^3.1.3", - "jest-message-util": "^29.7.0", - "jest-util": "^29.7.0", - "jest-worker": "^29.7.0", - "slash": "^3.0.0", - "string-length": "^4.0.1", - "strip-ansi": "^6.0.0", - "v8-to-istanbul": "^9.0.1" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - }, - "peerDependencies": { - "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" - }, - "peerDependenciesMeta": { - "node-notifier": { - "optional": true - } - } - }, - "node_modules/@jest/schemas": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz", - "integrity": "sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==", - "dev": true, - "peer": true, - "dependencies": { - "@sinclair/typebox": "^0.27.8" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/source-map": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-29.6.3.tgz", - "integrity": "sha512-MHjT95QuipcPrpLM+8JMSzFx6eHp5Bm+4XeFDJlwsvVBjmKNiIAvasGK2fxz2WbGRlnvqehFbh07MMa7n3YJnw==", - "dev": true, - "peer": true, - "dependencies": { - "@jridgewell/trace-mapping": "^0.3.18", - "callsites": "^3.0.0", - "graceful-fs": "^4.2.9" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/test-result": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-29.7.0.tgz", - "integrity": "sha512-Fdx+tv6x1zlkJPcWXmMDAG2HBnaR9XPSd5aDWQVsfrZmLVT3lU1cwyxLgRmXR9yrq4NBoEm9BMsfgFzTQAbJYA==", - "dev": true, - "peer": true, - "dependencies": { - "@jest/console": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/istanbul-lib-coverage": "^2.0.0", - "collect-v8-coverage": "^1.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/test-sequencer": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-29.7.0.tgz", - "integrity": "sha512-GQwJ5WZVrKnOJuiYiAF52UNUJXgTZx1NHjFSEB0qEMmSZKAkdMoIzw/Cj6x6NF4AvV23AUqDpFzQkN/eYCYTxw==", - "dev": true, - "peer": true, - "dependencies": { - "@jest/test-result": "^29.7.0", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.7.0", - "slash": "^3.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/transform": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.7.0.tgz", - "integrity": "sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw==", - "dev": true, - "peer": true, - "dependencies": { - "@babel/core": "^7.11.6", - "@jest/types": "^29.6.3", - "@jridgewell/trace-mapping": "^0.3.18", - "babel-plugin-istanbul": "^6.1.1", - "chalk": "^4.0.0", - "convert-source-map": "^2.0.0", - "fast-json-stable-stringify": "^2.1.0", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.7.0", - "jest-regex-util": "^29.6.3", - "jest-util": "^29.7.0", - "micromatch": "^4.0.4", - "pirates": "^4.0.4", - "slash": "^3.0.0", - "write-file-atomic": "^4.0.2" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/types": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.3.tgz", - "integrity": "sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==", - "dev": true, - "peer": true, - "dependencies": { - "@jest/schemas": "^29.6.3", - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", - "@types/yargs": "^17.0.8", - "chalk": "^4.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jridgewell/gen-mapping": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", - "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", - "dev": true, - "peer": true, - "dependencies": { - "@jridgewell/set-array": "^1.0.1", - "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.9" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/resolve-uri": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", - "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", - "dev": true, - "peer": true, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/set-array": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", - "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", - "dev": true, - "peer": true, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.4.15", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", - "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", - "dev": true, - "peer": true - }, - "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.22", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.22.tgz", - "integrity": "sha512-Wf963MzWtA2sjrNt+g18IAln9lKnlRp+K2eH4jjIoF1wYeq3aMREpG09xhlhdzS0EjwU7qmUJYangWa+151vZw==", - "dev": true, - "peer": true, - "dependencies": { - "@jridgewell/resolve-uri": "^3.1.0", - "@jridgewell/sourcemap-codec": "^1.4.14" - } - }, - "node_modules/@jsdoc/salty": { - "version": "0.2.7", - "resolved": "https://registry.npmjs.org/@jsdoc/salty/-/salty-0.2.7.tgz", - "integrity": "sha512-mh8LbS9d4Jq84KLw8pzho7XC2q2/IJGiJss3xwRoLD1A+EE16SjN4PfaG4jRCzKegTFLlN0Zd8SdUPE6XdoPFg==", - "optional": true, - "dependencies": { - "lodash": "^4.17.21" - }, - "engines": { - "node": ">=v12.0.0" - } - }, - "node_modules/@nodelib/fs.scandir": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", - "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", - "dev": true, - "dependencies": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.stat": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", - "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", - "dev": true, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.walk": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", - "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", - "dev": true, - "dependencies": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@protobufjs/aspromise": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz", - "integrity": "sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ==" - }, - "node_modules/@protobufjs/base64": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@protobufjs/base64/-/base64-1.1.2.tgz", - "integrity": "sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==" - }, - "node_modules/@protobufjs/codegen": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@protobufjs/codegen/-/codegen-2.0.4.tgz", - "integrity": "sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==" - }, - "node_modules/@protobufjs/eventemitter": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz", - "integrity": "sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q==" - }, - "node_modules/@protobufjs/fetch": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@protobufjs/fetch/-/fetch-1.1.0.tgz", - "integrity": "sha512-lljVXpqXebpsijW71PZaCYeIcE5on1w5DlQy5WH6GLbFryLUrBD4932W/E2BSpfRJWseIL4v/KPgBFxDOIdKpQ==", - "dependencies": { - "@protobufjs/aspromise": "^1.1.1", - "@protobufjs/inquire": "^1.1.0" - } - }, - "node_modules/@protobufjs/float": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@protobufjs/float/-/float-1.0.2.tgz", - "integrity": "sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ==" - }, - "node_modules/@protobufjs/inquire": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@protobufjs/inquire/-/inquire-1.1.0.tgz", - "integrity": "sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q==" - }, - "node_modules/@protobufjs/path": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@protobufjs/path/-/path-1.1.2.tgz", - "integrity": "sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA==" - }, - "node_modules/@protobufjs/pool": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@protobufjs/pool/-/pool-1.1.0.tgz", - "integrity": "sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw==" - }, - "node_modules/@protobufjs/utf8": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.0.tgz", - "integrity": "sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==" - }, - "node_modules/@sinclair/typebox": { - "version": "0.27.8", - "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz", - "integrity": "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==", - "dev": true, - "peer": true - }, - "node_modules/@sinonjs/commons": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-3.0.1.tgz", - "integrity": "sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ==", - "dev": true, - "peer": true, - "dependencies": { - "type-detect": "4.0.8" - } - }, - "node_modules/@sinonjs/fake-timers": { - "version": "10.3.0", - "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-10.3.0.tgz", - "integrity": "sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA==", - "dev": true, - "peer": true, - "dependencies": { - "@sinonjs/commons": "^3.0.0" - } - }, - "node_modules/@tootallnate/once": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.0.tgz", - "integrity": "sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==", - "optional": true, - "engines": { - "node": ">= 10" - } - }, - "node_modules/@types/babel__core": { - "version": "7.20.5", - "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", - "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==", - "dev": true, - "peer": true, - "dependencies": { - "@babel/parser": "^7.20.7", - "@babel/types": "^7.20.7", - "@types/babel__generator": "*", - "@types/babel__template": "*", - "@types/babel__traverse": "*" - } - }, - "node_modules/@types/babel__generator": { - "version": "7.6.8", - "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.8.tgz", - "integrity": "sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw==", - "dev": true, - "peer": true, - "dependencies": { - "@babel/types": "^7.0.0" - } - }, - "node_modules/@types/babel__template": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz", - "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==", - "dev": true, - "peer": true, - "dependencies": { - "@babel/parser": "^7.1.0", - "@babel/types": "^7.0.0" - } - }, - "node_modules/@types/babel__traverse": { - "version": "7.20.5", - "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.5.tgz", - "integrity": "sha512-WXCyOcRtH37HAUkpXhUduaxdm82b4GSlyTqajXviN4EfiuPgNYR109xMCKvpl6zPIpua0DGlMEDCq+g8EdoheQ==", - "dev": true, - "peer": true, - "dependencies": { - "@babel/types": "^7.20.7" - } - }, - "node_modules/@types/body-parser": { - "version": "1.19.5", - "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.5.tgz", - "integrity": "sha512-fB3Zu92ucau0iQ0JMCFQE7b/dv8Ot07NI3KaZIkIUNXq82k4eBAqUaneXfleGY9JWskeS9y+u0nXMyspcuQrCg==", - "dependencies": { - "@types/connect": "*", - "@types/node": "*" - } - }, - "node_modules/@types/connect": { - "version": "3.4.38", - "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.38.tgz", - "integrity": "sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/cors": { - "version": "2.8.17", - "resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.17.tgz", - "integrity": "sha512-8CGDvrBj1zgo2qE+oS3pOCyYNqCPryMWY2bGfwA0dcfopWGgxs+78df0Rs3rc9THP4JkOhLsAa+15VdpAqkcUA==", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/express": { - "version": "4.17.3", - "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.3.tgz", - "integrity": "sha512-I8cGRJj3pyOLs/HndoP+25vOqhqWkAZsWMEmq1qXy/b/M3ppufecUwaK2/TVDVxcV61/iSdhykUjQQ2DLSrTdg==", - "dependencies": { - "@types/body-parser": "*", - "@types/express-serve-static-core": "*", - "@types/serve-static": "*" - } - }, - "node_modules/@types/express-serve-static-core": { - "version": "4.17.43", - "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.43.tgz", - "integrity": "sha512-oaYtiBirUOPQGSWNGPWnzyAFJ0BP3cwvN4oWZQY+zUBwpVIGsKUkpBpSztp74drYcjavs7SKFZ4DX1V2QeN8rg==", - "dependencies": { - "@types/node": "*", - "@types/qs": "*", - "@types/range-parser": "*", - "@types/send": "*" - } - }, - "node_modules/@types/glob": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/@types/glob/-/glob-8.1.0.tgz", - "integrity": "sha512-IO+MJPVhoqz+28h1qLAcBEH2+xHMK6MTyHJc7MTnnYb6wsoLR29POVGJ7LycmVXIqyy/4/2ShP5sUwTXuOwb/w==", - "optional": true, - "dependencies": { - "@types/minimatch": "^5.1.2", - "@types/node": "*" - } - }, - "node_modules/@types/graceful-fs": { - "version": "4.1.9", - "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.9.tgz", - "integrity": "sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ==", - "dev": true, - "peer": true, - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/http-errors": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.4.tgz", - "integrity": "sha512-D0CFMMtydbJAegzOyHjtiKPLlvnm3iTZyZRSZoLq2mRhDdmLfIWOCYPfQJ4cu2erKghU++QvjcUjp/5h7hESpA==" - }, - "node_modules/@types/istanbul-lib-coverage": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz", - "integrity": "sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==", - "dev": true, - "peer": true - }, - "node_modules/@types/istanbul-lib-report": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.3.tgz", - "integrity": "sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==", - "dev": true, - "peer": true, - "dependencies": { - "@types/istanbul-lib-coverage": "*" - } - }, - "node_modules/@types/istanbul-reports": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.4.tgz", - "integrity": "sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==", - "dev": true, - "peer": true, - "dependencies": { - "@types/istanbul-lib-report": "*" - } - }, - "node_modules/@types/jsonwebtoken": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/@types/jsonwebtoken/-/jsonwebtoken-9.0.5.tgz", - "integrity": "sha512-VRLSGzik+Unrup6BsouBeHsf4d1hOEgYWTm/7Nmw1sXoN1+tRly/Gy/po3yeahnP4jfnQWWAhQAqcNfH7ngOkA==", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/linkify-it": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/@types/linkify-it/-/linkify-it-3.0.5.tgz", - "integrity": "sha512-yg6E+u0/+Zjva+buc3EIb+29XEg4wltq7cSmd4Uc2EE/1nUVmxyzpX6gUXD0V8jIrG0r7YeOGVIbYRkxeooCtw==", - "optional": true - }, - "node_modules/@types/lodash": { - "version": "4.14.202", - "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.202.tgz", - "integrity": "sha512-OvlIYQK9tNneDlS0VN54LLd5uiPCBOp7gS5Z0f1mjoJYBrtStzgmJBxONW3U6OZqdtNzZPmn9BS/7WI7BFFcFQ==", - "dev": true - }, - "node_modules/@types/long": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/@types/long/-/long-4.0.2.tgz", - "integrity": "sha512-MqTGEo5bj5t157U6fA/BiDynNkn0YknVdh48CMPkTSpFTVmvao5UQmm7uEF6xBEo7qIMAlY/JSleYaE6VOdpaA==", - "optional": true - }, - "node_modules/@types/markdown-it": { - "version": "12.2.3", - "resolved": "https://registry.npmjs.org/@types/markdown-it/-/markdown-it-12.2.3.tgz", - "integrity": "sha512-GKMHFfv3458yYy+v/N8gjufHO6MSZKCOXpZc5GXIWWy8uldwfmPn98vp81gZ5f9SVw8YYBctgfJ22a2d7AOMeQ==", - "optional": true, - "dependencies": { - "@types/linkify-it": "*", - "@types/mdurl": "*" - } - }, - "node_modules/@types/mdurl": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/@types/mdurl/-/mdurl-1.0.5.tgz", - "integrity": "sha512-6L6VymKTzYSrEf4Nev4Xa1LCHKrlTlYCBMTlQKFuddo1CvQcE52I0mwfOJayueUC7MJuXOeHTcIU683lzd0cUA==", - "optional": true - }, - "node_modules/@types/mime": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.5.tgz", - "integrity": "sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==" - }, - "node_modules/@types/minimatch": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-5.1.2.tgz", - "integrity": "sha512-K0VQKziLUWkVKiRVrx4a40iPaxTUefQmjtkQofBkYRcoaaL/8rhwDWww9qWbrgicNOgnpIsMxyNIUM4+n6dUIA==", - "optional": true - }, - "node_modules/@types/node": { - "version": "20.11.19", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.11.19.tgz", - "integrity": "sha512-7xMnVEcZFu0DikYjWOlRq7NTPETrm7teqUT2WkQjrTIkEgUyyGdWsj/Zg8bEJt5TNklzbPD1X3fqfsHw3SpapQ==", - "dependencies": { - "undici-types": "~5.26.4" - } - }, - "node_modules/@types/qs": { - "version": "6.9.11", - "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.11.tgz", - "integrity": "sha512-oGk0gmhnEJK4Yyk+oI7EfXsLayXatCWPHary1MtcmbAifkobT9cM9yutG/hZKIseOU0MqbIwQ/u2nn/Gb+ltuQ==" - }, - "node_modules/@types/range-parser": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.7.tgz", - "integrity": "sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==" - }, - "node_modules/@types/rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@types/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-F3OznnSLAUxFrCEu/L5PY8+ny8DtcFRjx7fZZ9bycvXRi3KPTRS9HOitGZwvPg0juRhXFWIeKX58cnX5YqLohQ==", - "optional": true, - "dependencies": { - "@types/glob": "*", - "@types/node": "*" - } - }, - "node_modules/@types/send": { - "version": "0.17.4", - "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.4.tgz", - "integrity": "sha512-x2EM6TJOybec7c52BX0ZspPodMsQUd5L6PRwOunVyVUhXiBSKf3AezDL8Dgvgt5o0UfKNfuA0eMLr2wLT4AiBA==", - "dependencies": { - "@types/mime": "^1", - "@types/node": "*" - } - }, - "node_modules/@types/serve-static": { - "version": "1.15.5", - "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.5.tgz", - "integrity": "sha512-PDRk21MnK70hja/YF8AHfC7yIsiQHn1rcXx7ijCFBX/k+XQJhQT/gw3xekXKJvx+5SXaMMS8oqQy09Mzvz2TuQ==", - "dependencies": { - "@types/http-errors": "*", - "@types/mime": "*", - "@types/node": "*" - } - }, - "node_modules/@types/stack-utils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.3.tgz", - "integrity": "sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==", - "dev": true, - "peer": true - }, - "node_modules/@types/yargs": { - "version": "17.0.32", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.32.tgz", - "integrity": "sha512-xQ67Yc/laOG5uMfX/093MRlGGCIBzZMarVa+gfNKJxWAIgykYpVGkBdbqEzGDDfCrVUj6Hiff4mTZ5BA6TmAog==", - "dev": true, - "peer": true, - "dependencies": { - "@types/yargs-parser": "*" - } - }, - "node_modules/@types/yargs-parser": { - "version": "21.0.3", - "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.3.tgz", - "integrity": "sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==", - "dev": true, - "peer": true - }, - "node_modules/@ungap/structured-clone": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz", - "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==", - "dev": true - }, - "node_modules/abort-controller": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", - "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==", - "optional": true, - "dependencies": { - "event-target-shim": "^5.0.0" - }, - "engines": { - "node": ">=6.5" - } - }, - "node_modules/accepts": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", - "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", - "dependencies": { - "mime-types": "~2.1.34", - "negotiator": "0.6.3" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/acorn": { - "version": "8.11.3", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.3.tgz", - "integrity": "sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==", - "devOptional": true, - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/acorn-jsx": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", - "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", - "devOptional": true, - "peerDependencies": { - "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" - } - }, - "node_modules/agent-base": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", - "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", - "optional": true, - "dependencies": { - "debug": "4" - }, - "engines": { - "node": ">= 6.0.0" - } - }, - "node_modules/agora-access-token": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/agora-access-token/-/agora-access-token-2.0.4.tgz", - "integrity": "sha512-RtOIvi4PqV1ok3rdnopMZeVwiUqZgG9Pp56kqxJc5cU/+ljRBzs1Al+IThD5ahm528dGsdY1TyP1bJdqmgBCbQ==", - "deprecated": "The package has been deprecated. Please use 'agora-token' instead, sorry for the inconvenience caused.", - "dependencies": { - "crc-32": "1.2.0", - "cuint": "0.2.2" - } - }, - "node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": true, - "dependencies": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/ansi-escapes": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", - "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", - "dev": true, - "peer": true, - "dependencies": { - "type-fest": "^0.21.3" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/ansi-escapes/node_modules/type-fest": { - "version": "0.21.3", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", - "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", - "dev": true, - "peer": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "engines": { - "node": ">=8" - } - }, - "node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/anymatch": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", - "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", - "dev": true, - "peer": true, - "dependencies": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "devOptional": true - }, - "node_modules/array-flatten": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", - "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==" - }, - "node_modules/arrify": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/arrify/-/arrify-2.0.1.tgz", - "integrity": "sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug==", - "optional": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/async-retry": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/async-retry/-/async-retry-1.3.3.tgz", - "integrity": "sha512-wfr/jstw9xNi/0teMHrRW7dsz3Lt5ARhYNZ2ewpadnhaIp5mbALhOAP+EAdsC7t4Z6wqsDVv9+W6gm1Dk9mEyw==", - "optional": true, - "dependencies": { - "retry": "0.13.1" - } - }, - "node_modules/babel-jest": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-29.7.0.tgz", - "integrity": "sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg==", - "dev": true, - "peer": true, - "dependencies": { - "@jest/transform": "^29.7.0", - "@types/babel__core": "^7.1.14", - "babel-plugin-istanbul": "^6.1.1", - "babel-preset-jest": "^29.6.3", - "chalk": "^4.0.0", - "graceful-fs": "^4.2.9", - "slash": "^3.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - }, - "peerDependencies": { - "@babel/core": "^7.8.0" - } - }, - "node_modules/babel-plugin-istanbul": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz", - "integrity": "sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==", - "dev": true, - "peer": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.0.0", - "@istanbuljs/load-nyc-config": "^1.0.0", - "@istanbuljs/schema": "^0.1.2", - "istanbul-lib-instrument": "^5.0.4", - "test-exclude": "^6.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/babel-plugin-istanbul/node_modules/istanbul-lib-instrument": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz", - "integrity": "sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==", - "dev": true, - "peer": true, - "dependencies": { - "@babel/core": "^7.12.3", - "@babel/parser": "^7.14.7", - "@istanbuljs/schema": "^0.1.2", - "istanbul-lib-coverage": "^3.2.0", - "semver": "^6.3.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/babel-plugin-jest-hoist": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-29.6.3.tgz", - "integrity": "sha512-ESAc/RJvGTFEzRwOTT4+lNDk/GNHMkKbNzsvT0qKRfDyyYTskxB5rnU2njIDYVxXCBHHEI1c0YwHob3WaYujOg==", - "dev": true, - "peer": true, - "dependencies": { - "@babel/template": "^7.3.3", - "@babel/types": "^7.3.3", - "@types/babel__core": "^7.1.14", - "@types/babel__traverse": "^7.0.6" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/babel-preset-current-node-syntax": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.0.1.tgz", - "integrity": "sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ==", - "dev": true, - "peer": true, - "dependencies": { - "@babel/plugin-syntax-async-generators": "^7.8.4", - "@babel/plugin-syntax-bigint": "^7.8.3", - "@babel/plugin-syntax-class-properties": "^7.8.3", - "@babel/plugin-syntax-import-meta": "^7.8.3", - "@babel/plugin-syntax-json-strings": "^7.8.3", - "@babel/plugin-syntax-logical-assignment-operators": "^7.8.3", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", - "@babel/plugin-syntax-numeric-separator": "^7.8.3", - "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", - "@babel/plugin-syntax-optional-chaining": "^7.8.3", - "@babel/plugin-syntax-top-level-await": "^7.8.3" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/babel-preset-jest": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-29.6.3.tgz", - "integrity": "sha512-0B3bhxR6snWXJZtR/RliHTDPRgn1sNHOR0yVtq/IiQFyuOVjFS+wuio/R4gSNkyYmKmJB4wGZv2NZanmKmTnNA==", - "dev": true, - "peer": true, - "dependencies": { - "babel-plugin-jest-hoist": "^29.6.3", - "babel-preset-current-node-syntax": "^1.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "devOptional": true - }, - "node_modules/base64-js": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", - "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "optional": true - }, - "node_modules/bignumber.js": { - "version": "9.1.2", - "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.1.2.tgz", - "integrity": "sha512-2/mKyZH9K85bzOEfhXDBFZTGd1CTs+5IHpeFQo9luiBG7hghdC851Pj2WAhb6E3R6b9tZj/XKhbg4fum+Kepug==", - "optional": true, - "engines": { - "node": "*" - } - }, - "node_modules/bluebird": { - "version": "3.7.2", - "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", - "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==", - "optional": true - }, - "node_modules/body-parser": { - "version": "1.20.1", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz", - "integrity": "sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==", - "dependencies": { - "bytes": "3.1.2", - "content-type": "~1.0.4", - "debug": "2.6.9", - "depd": "2.0.0", - "destroy": "1.2.0", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "on-finished": "2.4.1", - "qs": "6.11.0", - "raw-body": "2.5.1", - "type-is": "~1.6.18", - "unpipe": "1.0.0" - }, - "engines": { - "node": ">= 0.8", - "npm": "1.2.8000 || >= 1.4.16" - } - }, - "node_modules/body-parser/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/body-parser/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" - }, - "node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "devOptional": true, - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "dev": true, - "peer": true, - "dependencies": { - "fill-range": "^7.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/browserslist": { - "version": "4.23.0", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.23.0.tgz", - "integrity": "sha512-QW8HiM1shhT2GuzkvklfjcKDiWFXHOeFCIA/huJPwHsslwcydgk7X+z2zXpEijP98UCY7HbubZt5J2Zgvf0CaQ==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "peer": true, - "dependencies": { - "caniuse-lite": "^1.0.30001587", - "electron-to-chromium": "^1.4.668", - "node-releases": "^2.0.14", - "update-browserslist-db": "^1.0.13" - }, - "bin": { - "browserslist": "cli.js" - }, - "engines": { - "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" - } - }, - "node_modules/bser": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz", - "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==", - "dev": true, - "peer": true, - "dependencies": { - "node-int64": "^0.4.0" - } - }, - "node_modules/buffer-equal-constant-time": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz", - "integrity": "sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA==" - }, - "node_modules/buffer-from": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", - "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", - "dev": true, - "peer": true - }, - "node_modules/bytes": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", - "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/call-bind": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz", - "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==", - "dependencies": { - "es-define-property": "^1.0.0", - "es-errors": "^1.3.0", - "function-bind": "^1.1.2", - "get-intrinsic": "^1.2.4", - "set-function-length": "^1.2.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "dev": true, - "peer": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/caniuse-lite": { - "version": "1.0.30001588", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001588.tgz", - "integrity": "sha512-+hVY9jE44uKLkH0SrUTqxjxqNTOWHsbnQDIKjwkZ3lNTzUUVdBLBGXtj/q5Mp5u98r3droaZAewQuEDzjQdZlQ==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/caniuse-lite" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "peer": true - }, - "node_modules/catharsis": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/catharsis/-/catharsis-0.9.0.tgz", - "integrity": "sha512-prMTQVpcns/tzFgFVkVp6ak6RykZyWb3gu8ckUpd6YkTlacOd3DXGJjIpD4Q6zJirizvaiAjSSHlOsA+6sNh2A==", - "optional": true, - "dependencies": { - "lodash": "^4.17.15" - }, - "engines": { - "node": ">= 10" - } - }, - "node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "devOptional": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/char-regex": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz", - "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==", - "dev": true, - "peer": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/ci-info": { - "version": "3.9.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz", - "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/sibiraj-s" - } - ], - "peer": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/cjs-module-lexer": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.2.3.tgz", - "integrity": "sha512-0TNiGstbQmCFwt4akjjBg5pLRTSyj/PkWQ1ZoO2zntmg9yLqSRxwEa4iCfQLGjqhiqBfOJa7W/E8wfGrTDmlZQ==", - "dev": true, - "peer": true - }, - "node_modules/cliui": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", - "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", - "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.1", - "wrap-ansi": "^7.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/co": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", - "integrity": "sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==", - "dev": true, - "peer": true, - "engines": { - "iojs": ">= 1.0.0", - "node": ">= 0.12.0" - } - }, - "node_modules/collect-v8-coverage": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.2.tgz", - "integrity": "sha512-lHl4d5/ONEbLlJvaJNtsF/Lz+WvB07u2ycqTYbdrq7UypDXailES4valYb2eWiJFxZlVmpGekfqoxQhzyFdT4Q==", - "dev": true, - "peer": true - }, - "node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "node_modules/compressible": { - "version": "2.0.18", - "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", - "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==", - "optional": true, - "dependencies": { - "mime-db": ">= 1.43.0 < 2" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", - "devOptional": true - }, - "node_modules/content-disposition": { - "version": "0.5.4", - "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", - "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", - "dependencies": { - "safe-buffer": "5.2.1" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/content-type": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", - "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/convert-source-map": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", - "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", - "dev": true, - "peer": true - }, - "node_modules/cookie": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", - "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/cookie-signature": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", - "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==" - }, - "node_modules/cors": { - "version": "2.8.5", - "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", - "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", - "dependencies": { - "object-assign": "^4", - "vary": "^1" - }, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/crc-32": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/crc-32/-/crc-32-1.2.0.tgz", - "integrity": "sha512-1uBwHxF+Y/4yF5G48fwnKq6QsIXheor3ZLPT80yGBV1oEUwpPojlEhQbWKVw1VwcTQyMGHK1/XMmTjmlsmTTGA==", - "dependencies": { - "exit-on-epipe": "~1.0.1", - "printj": "~1.1.0" - }, - "bin": { - "crc32": "bin/crc32.njs" - }, - "engines": { - "node": ">=0.8" - } - }, - "node_modules/create-jest": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/create-jest/-/create-jest-29.7.0.tgz", - "integrity": "sha512-Adz2bdH0Vq3F53KEMJOoftQFutWCukm6J24wbPWRO4k1kMY7gS7ds/uoJkNuV8wDCtWWnuwGcJwpWcih+zEW1Q==", - "dev": true, - "peer": true, - "dependencies": { - "@jest/types": "^29.6.3", - "chalk": "^4.0.0", - "exit": "^0.1.2", - "graceful-fs": "^4.2.9", - "jest-config": "^29.7.0", - "jest-util": "^29.7.0", - "prompts": "^2.0.1" - }, - "bin": { - "create-jest": "bin/create-jest.js" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", - "dev": true, - "dependencies": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/cuint": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/cuint/-/cuint-0.2.2.tgz", - "integrity": "sha512-d4ZVpCW31eWwCMe1YT3ur7mUDnTXbgwyzaL320DrcRT45rfjYxkt5QWLrmOJ+/UEAI2+fQgKe/fCjR8l4TpRgw==" - }, - "node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/dedent": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/dedent/-/dedent-1.5.1.tgz", - "integrity": "sha512-+LxW+KLWxu3HW3M2w2ympwtqPrqYRzU8fqi6Fhd18fBALe15blJPI/I4+UHveMVG6lJqB4JNd4UG0S5cnVHwIg==", - "dev": true, - "peer": true, - "peerDependencies": { - "babel-plugin-macros": "^3.1.0" - }, - "peerDependenciesMeta": { - "babel-plugin-macros": { - "optional": true - } - } - }, - "node_modules/deep-is": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", - "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", - "devOptional": true - }, - "node_modules/deepmerge": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", - "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", - "dev": true, - "peer": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/define-data-property": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", - "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", - "dependencies": { - "es-define-property": "^1.0.0", - "es-errors": "^1.3.0", - "gopd": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/depd": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", - "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/destroy": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", - "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", - "engines": { - "node": ">= 0.8", - "npm": "1.2.8000 || >= 1.4.16" - } - }, - "node_modules/detect-newline": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz", - "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==", - "dev": true, - "peer": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/diff-sequences": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.6.3.tgz", - "integrity": "sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==", - "dev": true, - "peer": true, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/doctrine": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", - "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", - "dev": true, - "dependencies": { - "esutils": "^2.0.2" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/duplexify": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-4.1.2.tgz", - "integrity": "sha512-fz3OjcNCHmRP12MJoZMPglx8m4rrFP8rovnk4vT8Fs+aonZoCwGg10dSsQsfP/E62eZcPTMSMP6686fu9Qlqtw==", - "optional": true, - "dependencies": { - "end-of-stream": "^1.4.1", - "inherits": "^2.0.3", - "readable-stream": "^3.1.1", - "stream-shift": "^1.0.0" - } - }, - "node_modules/ecdsa-sig-formatter": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz", - "integrity": "sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==", - "dependencies": { - "safe-buffer": "^5.0.1" - } - }, - "node_modules/ee-first": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", - "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" - }, - "node_modules/electron-to-chromium": { - "version": "1.4.673", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.673.tgz", - "integrity": "sha512-zjqzx4N7xGdl5468G+vcgzDhaHkaYgVcf9MqgexcTqsl2UHSCmOj/Bi3HAprg4BZCpC7HyD8a6nZl6QAZf72gw==", - "dev": true, - "peer": true - }, - "node_modules/emittery": { - "version": "0.13.1", - "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.13.1.tgz", - "integrity": "sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==", - "dev": true, - "peer": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sindresorhus/emittery?sponsor=1" - } - }, - "node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" - }, - "node_modules/encodeurl": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", - "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/end-of-stream": { - "version": "1.4.4", - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", - "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", - "optional": true, - "dependencies": { - "once": "^1.4.0" - } - }, - "node_modules/ent": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/ent/-/ent-2.2.0.tgz", - "integrity": "sha512-GHrMyVZQWvTIdDtpiEXdHZnFQKzeO09apj8Cbl4pKWy4i0Oprcq17usfDt5aO63swf0JOeMWjWQE/LzgSRuWpA==", - "optional": true - }, - "node_modules/entities": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-2.1.0.tgz", - "integrity": "sha512-hCx1oky9PFrJ611mf0ifBLBRW8lUUVRlFolb5gWRfIELabBlbp9xZvrqZLZAs+NxFnbfQoeGd8wDkygjg7U85w==", - "optional": true, - "funding": { - "url": "https://github.com/fb55/entities?sponsor=1" - } - }, - "node_modules/error-ex": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", - "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", - "dev": true, - "peer": true, - "dependencies": { - "is-arrayish": "^0.2.1" - } - }, - "node_modules/es-define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz", - "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==", - "dependencies": { - "get-intrinsic": "^1.2.4" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-errors": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", - "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/escalade": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.2.tgz", - "integrity": "sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==", - "engines": { - "node": ">=6" - } - }, - "node_modules/escape-html": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", - "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==" - }, - "node_modules/escape-string-regexp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/escodegen": { - "version": "1.14.3", - "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.14.3.tgz", - "integrity": "sha512-qFcX0XJkdg+PB3xjZZG/wKSuT1PnQWx57+TVSjIMmILd2yC/6ByYElPwJnslDsuWuSAp4AwJGumarAAmJch5Kw==", - "optional": true, - "dependencies": { - "esprima": "^4.0.1", - "estraverse": "^4.2.0", - "esutils": "^2.0.2", - "optionator": "^0.8.1" - }, - "bin": { - "escodegen": "bin/escodegen.js", - "esgenerate": "bin/esgenerate.js" - }, - "engines": { - "node": ">=4.0" - }, - "optionalDependencies": { - "source-map": "~0.6.1" - } - }, - "node_modules/escodegen/node_modules/estraverse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", - "optional": true, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/escodegen/node_modules/levn": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", - "integrity": "sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA==", - "optional": true, - "dependencies": { - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/escodegen/node_modules/optionator": { - "version": "0.8.3", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", - "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", - "optional": true, - "dependencies": { - "deep-is": "~0.1.3", - "fast-levenshtein": "~2.0.6", - "levn": "~0.3.0", - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2", - "word-wrap": "~1.2.3" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/escodegen/node_modules/prelude-ls": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", - "integrity": "sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==", - "optional": true, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/escodegen/node_modules/type-check": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", - "integrity": "sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg==", - "optional": true, - "dependencies": { - "prelude-ls": "~1.1.2" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/eslint": { - "version": "8.56.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.56.0.tgz", - "integrity": "sha512-Go19xM6T9puCOWntie1/P997aXxFsOi37JIHRWI514Hc6ZnaHGKY9xFhrU65RT6CcBEzZoGG1e6Nq+DT04ZtZQ==", - "dev": true, - "dependencies": { - "@eslint-community/eslint-utils": "^4.2.0", - "@eslint-community/regexpp": "^4.6.1", - "@eslint/eslintrc": "^2.1.4", - "@eslint/js": "8.56.0", - "@humanwhocodes/config-array": "^0.11.13", - "@humanwhocodes/module-importer": "^1.0.1", - "@nodelib/fs.walk": "^1.2.8", - "@ungap/structured-clone": "^1.2.0", - "ajv": "^6.12.4", - "chalk": "^4.0.0", - "cross-spawn": "^7.0.2", - "debug": "^4.3.2", - "doctrine": "^3.0.0", - "escape-string-regexp": "^4.0.0", - "eslint-scope": "^7.2.2", - "eslint-visitor-keys": "^3.4.3", - "espree": "^9.6.1", - "esquery": "^1.4.2", - "esutils": "^2.0.2", - "fast-deep-equal": "^3.1.3", - "file-entry-cache": "^6.0.1", - "find-up": "^5.0.0", - "glob-parent": "^6.0.2", - "globals": "^13.19.0", - "graphemer": "^1.4.0", - "ignore": "^5.2.0", - "imurmurhash": "^0.1.4", - "is-glob": "^4.0.0", - "is-path-inside": "^3.0.3", - "js-yaml": "^4.1.0", - "json-stable-stringify-without-jsonify": "^1.0.1", - "levn": "^0.4.1", - "lodash.merge": "^4.6.2", - "minimatch": "^3.1.2", - "natural-compare": "^1.4.0", - "optionator": "^0.9.3", - "strip-ansi": "^6.0.1", - "text-table": "^0.2.0" - }, - "bin": { - "eslint": "bin/eslint.js" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/eslint-config-google": { - "version": "0.14.0", - "resolved": "https://registry.npmjs.org/eslint-config-google/-/eslint-config-google-0.14.0.tgz", - "integrity": "sha512-WsbX4WbjuMvTdeVL6+J3rK1RGhCTqjsFjX7UMSMgZiyxxaNLkoJENbrGExzERFeoTpGw3F3FypTiWAP9ZXzkEw==", - "dev": true, - "engines": { - "node": ">=0.10.0" - }, - "peerDependencies": { - "eslint": ">=5.16.0" - } - }, - "node_modules/eslint-scope": { - "version": "7.2.2", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", - "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", - "dev": true, - "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^5.2.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/eslint-visitor-keys": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", - "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", - "devOptional": true, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/espree": { - "version": "9.6.1", - "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", - "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", - "devOptional": true, - "dependencies": { - "acorn": "^8.9.0", - "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^3.4.1" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "devOptional": true, - "bin": { - "esparse": "bin/esparse.js", - "esvalidate": "bin/esvalidate.js" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/esquery": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz", - "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==", - "dev": true, - "dependencies": { - "estraverse": "^5.1.0" - }, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/esrecurse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", - "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", - "dev": true, - "dependencies": { - "estraverse": "^5.2.0" - }, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "devOptional": true, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/esutils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", - "devOptional": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/etag": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", - "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/event-target-shim": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz", - "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==", - "optional": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/execa": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", - "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", - "dev": true, - "peer": true, - "dependencies": { - "cross-spawn": "^7.0.3", - "get-stream": "^6.0.0", - "human-signals": "^2.1.0", - "is-stream": "^2.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^4.0.1", - "onetime": "^5.1.2", - "signal-exit": "^3.0.3", - "strip-final-newline": "^2.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sindresorhus/execa?sponsor=1" - } - }, - "node_modules/exit": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", - "integrity": "sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==", - "dev": true, - "peer": true, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/exit-on-epipe": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/exit-on-epipe/-/exit-on-epipe-1.0.1.tgz", - "integrity": "sha512-h2z5mrROTxce56S+pnvAV890uu7ls7f1kEvVGJbw1OlFH3/mlJ5bkXu0KRyW94v37zzHPiUd55iLn3DA7TjWpw==", - "engines": { - "node": ">=0.8" - } - }, - "node_modules/expect": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/expect/-/expect-29.7.0.tgz", - "integrity": "sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw==", - "dev": true, - "peer": true, - "dependencies": { - "@jest/expect-utils": "^29.7.0", - "jest-get-type": "^29.6.3", - "jest-matcher-utils": "^29.7.0", - "jest-message-util": "^29.7.0", - "jest-util": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/express": { - "version": "4.18.2", - "resolved": "https://registry.npmjs.org/express/-/express-4.18.2.tgz", - "integrity": "sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==", - "dependencies": { - "accepts": "~1.3.8", - "array-flatten": "1.1.1", - "body-parser": "1.20.1", - "content-disposition": "0.5.4", - "content-type": "~1.0.4", - "cookie": "0.5.0", - "cookie-signature": "1.0.6", - "debug": "2.6.9", - "depd": "2.0.0", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "finalhandler": "1.2.0", - "fresh": "0.5.2", - "http-errors": "2.0.0", - "merge-descriptors": "1.0.1", - "methods": "~1.1.2", - "on-finished": "2.4.1", - "parseurl": "~1.3.3", - "path-to-regexp": "0.1.7", - "proxy-addr": "~2.0.7", - "qs": "6.11.0", - "range-parser": "~1.2.1", - "safe-buffer": "5.2.1", - "send": "0.18.0", - "serve-static": "1.15.0", - "setprototypeof": "1.2.0", - "statuses": "2.0.1", - "type-is": "~1.6.18", - "utils-merge": "1.0.1", - "vary": "~1.1.2" - }, - "engines": { - "node": ">= 0.10.0" - } - }, - "node_modules/express/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/express/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" - }, - "node_modules/extend": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", - "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", - "optional": true - }, - "node_modules/fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", - "devOptional": true - }, - "node_modules/fast-json-stable-stringify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", - "dev": true - }, - "node_modules/fast-levenshtein": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", - "devOptional": true - }, - "node_modules/fast-text-encoding": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/fast-text-encoding/-/fast-text-encoding-1.0.6.tgz", - "integrity": "sha512-VhXlQgj9ioXCqGstD37E/HBeqEGV/qOD/kmbVG8h5xKBYvM1L3lR1Zn4555cQ8GkYbJa8aJSipLPndE1k6zK2w==", - "optional": true - }, - "node_modules/fast-xml-parser": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-4.3.4.tgz", - "integrity": "sha512-utnwm92SyozgA3hhH2I8qldf2lBqm6qHOICawRNRFu1qMe3+oqr+GcXjGqTmXTMGE5T4eC03kr/rlh5C1IRdZA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/NaturalIntelligence" - }, - { - "type": "paypal", - "url": "https://paypal.me/naturalintelligence" - } - ], - "optional": true, - "dependencies": { - "strnum": "^1.0.5" - }, - "bin": { - "fxparser": "src/cli/cli.js" - } - }, - "node_modules/fastq": { - "version": "1.17.1", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz", - "integrity": "sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==", - "dev": true, - "dependencies": { - "reusify": "^1.0.4" - } - }, - "node_modules/faye-websocket": { - "version": "0.11.4", - "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.4.tgz", - "integrity": "sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g==", - "dependencies": { - "websocket-driver": ">=0.5.1" - }, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/fb-watchman": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.2.tgz", - "integrity": "sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==", - "dev": true, - "peer": true, - "dependencies": { - "bser": "2.1.1" - } - }, - "node_modules/file-entry-cache": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", - "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", - "dev": true, - "dependencies": { - "flat-cache": "^3.0.4" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" - } - }, - "node_modules/fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "dev": true, - "peer": true, - "dependencies": { - "to-regex-range": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/finalhandler": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", - "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", - "dependencies": { - "debug": "2.6.9", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "on-finished": "2.4.1", - "parseurl": "~1.3.3", - "statuses": "2.0.1", - "unpipe": "~1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/finalhandler/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/finalhandler/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" - }, - "node_modules/find-up": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", - "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", - "dev": true, - "dependencies": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/firebase": { - "version": "10.6.0", - "resolved": "https://registry.npmjs.org/firebase/-/firebase-10.6.0.tgz", - "integrity": "sha512-bnYwHwZ6zB+dM6mGQPEXcFHtAT2WoVzG6H4SIR8HzURVGKJxBW+TqfP3qcJQjTZV3tDqDTo/XZkVmoU/SovV8A==", - "dependencies": { - "@firebase/analytics": "0.10.0", - "@firebase/analytics-compat": "0.2.6", - "@firebase/app": "0.9.23", - "@firebase/app-check": "0.8.0", - "@firebase/app-check-compat": "0.3.7", - "@firebase/app-compat": "0.2.23", - "@firebase/app-types": "0.9.0", - "@firebase/auth": "1.4.0", - "@firebase/auth-compat": "0.4.9", - "@firebase/database": "1.0.1", - "@firebase/database-compat": "1.0.1", - "@firebase/firestore": "4.3.2", - "@firebase/firestore-compat": "0.3.22", - "@firebase/functions": "0.10.0", - "@firebase/functions-compat": "0.3.5", - "@firebase/installations": "0.6.4", - "@firebase/installations-compat": "0.2.4", - "@firebase/messaging": "0.12.4", - "@firebase/messaging-compat": "0.2.4", - "@firebase/performance": "0.6.4", - "@firebase/performance-compat": "0.2.4", - "@firebase/remote-config": "0.4.4", - "@firebase/remote-config-compat": "0.2.4", - "@firebase/storage": "0.11.2", - "@firebase/storage-compat": "0.3.2", - "@firebase/util": "1.9.3" - } - }, - "node_modules/firebase-admin": { - "version": "11.11.1", - "resolved": "https://registry.npmjs.org/firebase-admin/-/firebase-admin-11.11.1.tgz", - "integrity": "sha512-UyEbq+3u6jWzCYbUntv/HuJiTixwh36G1R9j0v71mSvGAx/YZEWEW7uSGLYxBYE6ckVRQoKMr40PYUEzrm/4dg==", - "dependencies": { - "@fastify/busboy": "^1.2.1", - "@firebase/database-compat": "^0.3.4", - "@firebase/database-types": "^0.10.4", - "@types/node": ">=12.12.47", - "jsonwebtoken": "^9.0.0", - "jwks-rsa": "^3.0.1", - "node-forge": "^1.3.1", - "uuid": "^9.0.0" - }, - "engines": { - "node": ">=14" - }, - "optionalDependencies": { - "@google-cloud/firestore": "^6.8.0", - "@google-cloud/storage": "^6.9.5" - } - }, - "node_modules/firebase-functions": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/firebase-functions/-/firebase-functions-4.7.0.tgz", - "integrity": "sha512-YgWqA9otWlBUouY4I2yd0vq9SyQdQ6GJxfH7wGJclzS2pzBQHcU5HhE1Vz/xTrWcKJyw8uPN98WtSE9/APUJJg==", - "dependencies": { - "@types/cors": "^2.8.5", - "@types/express": "4.17.3", - "cors": "^2.8.5", - "express": "^4.17.1", - "node-fetch": "^2.6.7", - "protobufjs": "^7.2.2" - }, - "bin": { - "firebase-functions": "lib/bin/firebase-functions.js" - }, - "engines": { - "node": ">=14.10.0" - }, - "peerDependencies": { - "firebase-admin": "^10.0.0 || ^11.0.0 || ^12.0.0" - } - }, - "node_modules/firebase-functions-test": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/firebase-functions-test/-/firebase-functions-test-3.1.1.tgz", - "integrity": "sha512-IlDzcd+8rUd87hD1ZAPXsc3cX5JGdfpKmKlUJWdZJlErdyznwXssPQzbRPX8rh929ZhwmzGpubFBt7itkXAg+A==", - "dev": true, - "dependencies": { - "@types/lodash": "^4.14.104", - "lodash": "^4.17.5", - "ts-deepmerge": "^2.0.1" - }, - "engines": { - "node": ">=14.0.0" - }, - "peerDependencies": { - "firebase-admin": "^8.0.0 || ^9.0.0 || ^10.0.0 || ^11.0.0 || ^12.0.0", - "firebase-functions": ">=4.3.0", - "jest": ">=28.0.0" - } - }, - "node_modules/firebase/node_modules/@firebase/database": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@firebase/database/-/database-1.0.1.tgz", - "integrity": "sha512-VAhF7gYwunW4Lw/+RQZvW8dlsf2r0YYqV9W0Gi2Mz8+0TGg1mBJWoUtsHfOr8kPJXhcLsC4eP/z3x6L/Fvjk/A==", - "dependencies": { - "@firebase/auth-interop-types": "0.2.1", - "@firebase/component": "0.6.4", - "@firebase/logger": "0.4.0", - "@firebase/util": "1.9.3", - "faye-websocket": "0.11.4", - "tslib": "^2.1.0" - } - }, - "node_modules/firebase/node_modules/@firebase/database-compat": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@firebase/database-compat/-/database-compat-1.0.1.tgz", - "integrity": "sha512-ky82yLIboLxtAIWyW/52a6HLMVTzD2kpZlEilVDok73pNPLjkJYowj8iaIWK5nTy7+6Gxt7d00zfjL6zckGdXQ==", - "dependencies": { - "@firebase/component": "0.6.4", - "@firebase/database": "1.0.1", - "@firebase/database-types": "1.0.0", - "@firebase/logger": "0.4.0", - "@firebase/util": "1.9.3", - "tslib": "^2.1.0" - } - }, - "node_modules/firebase/node_modules/@firebase/database-types": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@firebase/database-types/-/database-types-1.0.0.tgz", - "integrity": "sha512-SjnXStoE0Q56HcFgNQ+9SsmJc0c8TqGARdI/T44KXy+Ets3r6x/ivhQozT66bMnCEjJRywYoxNurRTMlZF8VNg==", - "dependencies": { - "@firebase/app-types": "0.9.0", - "@firebase/util": "1.9.3" - } - }, - "node_modules/flat-cache": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz", - "integrity": "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==", - "dev": true, - "dependencies": { - "flatted": "^3.2.9", - "keyv": "^4.5.3", - "rimraf": "^3.0.2" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" - } - }, - "node_modules/flatted": { - "version": "3.2.9", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.9.tgz", - "integrity": "sha512-36yxDn5H7OFZQla0/jFJmbIKTdZAQHngCedGxiMmpNfEZM0sdEeT+WczLQrjK6D7o2aiyLYDnkw0R3JK0Qv1RQ==", - "dev": true - }, - "node_modules/forwarded": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", - "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/fresh": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", - "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", - "devOptional": true - }, - "node_modules/fsevents": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", - "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", - "dev": true, - "hasInstallScript": true, - "optional": true, - "os": [ - "darwin" - ], - "peer": true, - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } - }, - "node_modules/function-bind": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", - "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/functional-red-black-tree": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", - "integrity": "sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g==", - "optional": true - }, - "node_modules/gaxios": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/gaxios/-/gaxios-5.1.3.tgz", - "integrity": "sha512-95hVgBRgEIRQQQHIbnxBXeHbW4TqFk4ZDJW7wmVtvYar72FdhRIo1UGOLS2eRAKCPEdPBWu+M7+A33D9CdX9rA==", - "optional": true, - "dependencies": { - "extend": "^3.0.2", - "https-proxy-agent": "^5.0.0", - "is-stream": "^2.0.0", - "node-fetch": "^2.6.9" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/gcp-metadata": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/gcp-metadata/-/gcp-metadata-5.3.0.tgz", - "integrity": "sha512-FNTkdNEnBdlqF2oatizolQqNANMrcqJt6AAYt99B3y1aLLC8Hc5IOBb+ZnnzllodEEf6xMBp6wRcBbc16fa65w==", - "optional": true, - "dependencies": { - "gaxios": "^5.0.0", - "json-bigint": "^1.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/gensync": { - "version": "1.0.0-beta.2", - "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", - "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", - "dev": true, - "peer": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "engines": { - "node": "6.* || 8.* || >= 10.*" - } - }, - "node_modules/get-intrinsic": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz", - "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==", - "dependencies": { - "es-errors": "^1.3.0", - "function-bind": "^1.1.2", - "has-proto": "^1.0.1", - "has-symbols": "^1.0.3", - "hasown": "^2.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/get-package-type": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", - "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", - "dev": true, - "peer": true, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/get-stream": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", - "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", - "dev": true, - "peer": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "devOptional": true, - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/glob-parent": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", - "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", - "dev": true, - "dependencies": { - "is-glob": "^4.0.3" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/globals": { - "version": "13.24.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", - "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", - "dev": true, - "dependencies": { - "type-fest": "^0.20.2" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/google-auth-library": { - "version": "8.9.0", - "resolved": "https://registry.npmjs.org/google-auth-library/-/google-auth-library-8.9.0.tgz", - "integrity": "sha512-f7aQCJODJFmYWN6PeNKzgvy9LI2tYmXnzpNDHEjG5sDNPgGb2FXQyTBnXeSH+PAtpKESFD+LmHw3Ox3mN7e1Fg==", - "optional": true, - "dependencies": { - "arrify": "^2.0.0", - "base64-js": "^1.3.0", - "ecdsa-sig-formatter": "^1.0.11", - "fast-text-encoding": "^1.0.0", - "gaxios": "^5.0.0", - "gcp-metadata": "^5.3.0", - "gtoken": "^6.1.0", - "jws": "^4.0.0", - "lru-cache": "^6.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/google-gax": { - "version": "3.6.1", - "resolved": "https://registry.npmjs.org/google-gax/-/google-gax-3.6.1.tgz", - "integrity": "sha512-g/lcUjGcB6DSw2HxgEmCDOrI/CByOwqRvsuUvNalHUK2iPPPlmAIpbMbl62u0YufGMr8zgE3JL7th6dCb1Ry+w==", - "optional": true, - "dependencies": { - "@grpc/grpc-js": "~1.8.0", - "@grpc/proto-loader": "^0.7.0", - "@types/long": "^4.0.0", - "@types/rimraf": "^3.0.2", - "abort-controller": "^3.0.0", - "duplexify": "^4.0.0", - "fast-text-encoding": "^1.0.3", - "google-auth-library": "^8.0.2", - "is-stream-ended": "^0.1.4", - "node-fetch": "^2.6.1", - "object-hash": "^3.0.0", - "proto3-json-serializer": "^1.0.0", - "protobufjs": "7.2.4", - "protobufjs-cli": "1.1.1", - "retry-request": "^5.0.0" - }, - "bin": { - "compileProtos": "build/tools/compileProtos.js", - "minifyProtoJson": "build/tools/minify.js" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/google-gax/node_modules/protobufjs": { - "version": "7.2.4", - "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-7.2.4.tgz", - "integrity": "sha512-AT+RJgD2sH8phPmCf7OUZR8xGdcJRga4+1cOaXJ64hvcSkVhNcRHOwIxUatPH15+nj59WAGTDv3LSGZPEQbJaQ==", - "hasInstallScript": true, - "optional": true, - "dependencies": { - "@protobufjs/aspromise": "^1.1.2", - "@protobufjs/base64": "^1.1.2", - "@protobufjs/codegen": "^2.0.4", - "@protobufjs/eventemitter": "^1.1.0", - "@protobufjs/fetch": "^1.1.0", - "@protobufjs/float": "^1.0.2", - "@protobufjs/inquire": "^1.1.0", - "@protobufjs/path": "^1.1.2", - "@protobufjs/pool": "^1.1.0", - "@protobufjs/utf8": "^1.1.0", - "@types/node": ">=13.7.0", - "long": "^5.0.0" - }, - "engines": { - "node": ">=12.0.0" - } - }, - "node_modules/google-p12-pem": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/google-p12-pem/-/google-p12-pem-4.0.1.tgz", - "integrity": "sha512-WPkN4yGtz05WZ5EhtlxNDWPhC4JIic6G8ePitwUWy4l+XPVYec+a0j0Ts47PDtW59y3RwAhUd9/h9ZZ63px6RQ==", - "optional": true, - "dependencies": { - "node-forge": "^1.3.1" - }, - "bin": { - "gp12-pem": "build/src/bin/gp12-pem.js" - }, - "engines": { - "node": ">=12.0.0" - } - }, - "node_modules/gopd": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", - "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", - "dependencies": { - "get-intrinsic": "^1.1.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/graceful-fs": { - "version": "4.2.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", - "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", - "devOptional": true - }, - "node_modules/graphemer": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", - "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", - "dev": true - }, - "node_modules/gtoken": { - "version": "6.1.2", - "resolved": "https://registry.npmjs.org/gtoken/-/gtoken-6.1.2.tgz", - "integrity": "sha512-4ccGpzz7YAr7lxrT2neugmXQ3hP9ho2gcaityLVkiUecAiwiy60Ii8gRbZeOsXV19fYaRjgBSshs8kXw+NKCPQ==", - "optional": true, - "dependencies": { - "gaxios": "^5.0.1", - "google-p12-pem": "^4.0.0", - "jws": "^4.0.0" - }, - "engines": { - "node": ">=12.0.0" - } - }, - "node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "devOptional": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/has-property-descriptors": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", - "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", - "dependencies": { - "es-define-property": "^1.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-proto": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", - "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-symbols": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", - "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/hasown": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.1.tgz", - "integrity": "sha512-1/th4MHjnwncwXsIW6QMzlvYL9kG5e/CpVvLRZe4XPa8TOUNbCELqmvhDmnkNsAjwaG4+I8gJJL0JBvTTLO9qA==", - "dependencies": { - "function-bind": "^1.1.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/html-escaper": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", - "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", - "dev": true, - "peer": true - }, - "node_modules/http-errors": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", - "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", - "dependencies": { - "depd": "2.0.0", - "inherits": "2.0.4", - "setprototypeof": "1.2.0", - "statuses": "2.0.1", - "toidentifier": "1.0.1" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/http-parser-js": { - "version": "0.5.8", - "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.8.tgz", - "integrity": "sha512-SGeBX54F94Wgu5RH3X5jsDtf4eHyRogWX1XGT3b4HuW3tQPM4AaBzoUji/4AAJNXCEOWZ5O0DgZmJw1947gD5Q==" - }, - "node_modules/http-proxy-agent": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz", - "integrity": "sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==", - "optional": true, - "dependencies": { - "@tootallnate/once": "2", - "agent-base": "6", - "debug": "4" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/https-proxy-agent": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", - "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", - "optional": true, - "dependencies": { - "agent-base": "6", - "debug": "4" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/human-signals": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", - "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", - "dev": true, - "peer": true, - "engines": { - "node": ">=10.17.0" - } - }, - "node_modules/iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/idb": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/idb/-/idb-7.1.1.tgz", - "integrity": "sha512-gchesWBzyvGHRO9W8tzUWFDycow5gwjvFKfyV9FF32Y7F50yZMp7mP+T2mJIWFx49zicqyC4uefHM17o6xKIVQ==" - }, - "node_modules/ignore": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.1.tgz", - "integrity": "sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==", - "dev": true, - "engines": { - "node": ">= 4" - } - }, - "node_modules/import-fresh": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", - "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", - "dev": true, - "dependencies": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/import-local": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.1.0.tgz", - "integrity": "sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==", - "dev": true, - "peer": true, - "dependencies": { - "pkg-dir": "^4.2.0", - "resolve-cwd": "^3.0.0" - }, - "bin": { - "import-local-fixture": "fixtures/cli.js" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", - "dev": true, - "engines": { - "node": ">=0.8.19" - } - }, - "node_modules/inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", - "devOptional": true, - "dependencies": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "node_modules/inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" - }, - "node_modules/ipaddr.js": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", - "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/is-arrayish": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", - "dev": true, - "peer": true - }, - "node_modules/is-core-module": { - "version": "2.13.1", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.1.tgz", - "integrity": "sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==", - "dev": true, - "peer": true, - "dependencies": { - "hasown": "^2.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "engines": { - "node": ">=8" - } - }, - "node_modules/is-generator-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz", - "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==", - "dev": true, - "peer": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/is-glob": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "dev": true, - "dependencies": { - "is-extglob": "^2.1.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true, - "peer": true, - "engines": { - "node": ">=0.12.0" - } - }, - "node_modules/is-path-inside": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", - "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/is-stream": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", - "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", - "devOptional": true, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-stream-ended": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/is-stream-ended/-/is-stream-ended-0.1.4.tgz", - "integrity": "sha512-xj0XPvmr7bQFTvirqnFr50o0hQIh6ZItDqloxt5aJrR4NQsYeSsyFQERYGCAzfindAcnKjINnwEEgLx4IqVzQw==", - "optional": true - }, - "node_modules/isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "dev": true - }, - "node_modules/istanbul-lib-coverage": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz", - "integrity": "sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==", - "dev": true, - "peer": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/istanbul-lib-instrument": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-6.0.1.tgz", - "integrity": "sha512-EAMEJBsYuyyztxMxW3g7ugGPkrZsV57v0Hmv3mm1uQsmB+QnZuepg731CRaIgeUVSdmsTngOkSnauNF8p7FIhA==", - "dev": true, - "peer": true, - "dependencies": { - "@babel/core": "^7.12.3", - "@babel/parser": "^7.14.7", - "@istanbuljs/schema": "^0.1.2", - "istanbul-lib-coverage": "^3.2.0", - "semver": "^7.5.4" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/istanbul-lib-instrument/node_modules/semver": { - "version": "7.6.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", - "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", - "dev": true, - "peer": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/istanbul-lib-report": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz", - "integrity": "sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==", - "dev": true, - "peer": true, - "dependencies": { - "istanbul-lib-coverage": "^3.0.0", - "make-dir": "^4.0.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/istanbul-lib-source-maps": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz", - "integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==", - "dev": true, - "peer": true, - "dependencies": { - "debug": "^4.1.1", - "istanbul-lib-coverage": "^3.0.0", - "source-map": "^0.6.1" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/istanbul-reports": { - "version": "3.1.6", - "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.6.tgz", - "integrity": "sha512-TLgnMkKg3iTDsQ9PbPTdpfAK2DzjF9mqUG7RMgcQl8oFjad8ob4laGxv5XV5U9MAfx8D6tSJiUyuAwzLicaxlg==", - "dev": true, - "peer": true, - "dependencies": { - "html-escaper": "^2.0.0", - "istanbul-lib-report": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/jest": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest/-/jest-29.7.0.tgz", - "integrity": "sha512-NIy3oAFp9shda19hy4HK0HRTWKtPJmGdnvywu01nOqNC2vZg+Z+fvJDxpMQA88eb2I9EcafcdjYgsDthnYTvGw==", - "dev": true, - "peer": true, - "dependencies": { - "@jest/core": "^29.7.0", - "@jest/types": "^29.6.3", - "import-local": "^3.0.2", - "jest-cli": "^29.7.0" - }, - "bin": { - "jest": "bin/jest.js" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - }, - "peerDependencies": { - "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" - }, - "peerDependenciesMeta": { - "node-notifier": { - "optional": true - } - } - }, - "node_modules/jest-changed-files": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-29.7.0.tgz", - "integrity": "sha512-fEArFiwf1BpQ+4bXSprcDc3/x4HSzL4al2tozwVpDFpsxALjLYdyiIK4e5Vz66GQJIbXJ82+35PtysofptNX2w==", - "dev": true, - "peer": true, - "dependencies": { - "execa": "^5.0.0", - "jest-util": "^29.7.0", - "p-limit": "^3.1.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-circus": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-29.7.0.tgz", - "integrity": "sha512-3E1nCMgipcTkCocFwM90XXQab9bS+GMsjdpmPrlelaxwD93Ad8iVEjX/vvHPdLPnFf+L40u+5+iutRdA1N9myw==", - "dev": true, - "peer": true, - "dependencies": { - "@jest/environment": "^29.7.0", - "@jest/expect": "^29.7.0", - "@jest/test-result": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/node": "*", - "chalk": "^4.0.0", - "co": "^4.6.0", - "dedent": "^1.0.0", - "is-generator-fn": "^2.0.0", - "jest-each": "^29.7.0", - "jest-matcher-utils": "^29.7.0", - "jest-message-util": "^29.7.0", - "jest-runtime": "^29.7.0", - "jest-snapshot": "^29.7.0", - "jest-util": "^29.7.0", - "p-limit": "^3.1.0", - "pretty-format": "^29.7.0", - "pure-rand": "^6.0.0", - "slash": "^3.0.0", - "stack-utils": "^2.0.3" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-cli": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-29.7.0.tgz", - "integrity": "sha512-OVVobw2IubN/GSYsxETi+gOe7Ka59EFMR/twOU3Jb2GnKKeMGJB5SGUUrEz3SFVmJASUdZUzy83sLNNQ2gZslg==", - "dev": true, - "peer": true, - "dependencies": { - "@jest/core": "^29.7.0", - "@jest/test-result": "^29.7.0", - "@jest/types": "^29.6.3", - "chalk": "^4.0.0", - "create-jest": "^29.7.0", - "exit": "^0.1.2", - "import-local": "^3.0.2", - "jest-config": "^29.7.0", - "jest-util": "^29.7.0", - "jest-validate": "^29.7.0", - "yargs": "^17.3.1" - }, - "bin": { - "jest": "bin/jest.js" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - }, - "peerDependencies": { - "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" - }, - "peerDependenciesMeta": { - "node-notifier": { - "optional": true - } - } - }, - "node_modules/jest-config": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-29.7.0.tgz", - "integrity": "sha512-uXbpfeQ7R6TZBqI3/TxCU4q4ttk3u0PJeC+E0zbfSoSjq6bJ7buBPxzQPL0ifrkY4DNu4JUdk0ImlBUYi840eQ==", - "dev": true, - "peer": true, - "dependencies": { - "@babel/core": "^7.11.6", - "@jest/test-sequencer": "^29.7.0", - "@jest/types": "^29.6.3", - "babel-jest": "^29.7.0", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "deepmerge": "^4.2.2", - "glob": "^7.1.3", - "graceful-fs": "^4.2.9", - "jest-circus": "^29.7.0", - "jest-environment-node": "^29.7.0", - "jest-get-type": "^29.6.3", - "jest-regex-util": "^29.6.3", - "jest-resolve": "^29.7.0", - "jest-runner": "^29.7.0", - "jest-util": "^29.7.0", - "jest-validate": "^29.7.0", - "micromatch": "^4.0.4", - "parse-json": "^5.2.0", - "pretty-format": "^29.7.0", - "slash": "^3.0.0", - "strip-json-comments": "^3.1.1" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - }, - "peerDependencies": { - "@types/node": "*", - "ts-node": ">=9.0.0" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - }, - "ts-node": { - "optional": true - } - } - }, - "node_modules/jest-diff": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.7.0.tgz", - "integrity": "sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw==", - "dev": true, - "peer": true, - "dependencies": { - "chalk": "^4.0.0", - "diff-sequences": "^29.6.3", - "jest-get-type": "^29.6.3", - "pretty-format": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-docblock": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-29.7.0.tgz", - "integrity": "sha512-q617Auw3A612guyaFgsbFeYpNP5t2aoUNLwBUbc/0kD1R4t9ixDbyFTHd1nok4epoVFpr7PmeWHrhvuV3XaJ4g==", - "dev": true, - "peer": true, - "dependencies": { - "detect-newline": "^3.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-each": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-29.7.0.tgz", - "integrity": "sha512-gns+Er14+ZrEoC5fhOfYCY1LOHHr0TI+rQUHZS8Ttw2l7gl+80eHc/gFf2Ktkw0+SIACDTeWvpFcv3B04VembQ==", - "dev": true, - "peer": true, - "dependencies": { - "@jest/types": "^29.6.3", - "chalk": "^4.0.0", - "jest-get-type": "^29.6.3", - "jest-util": "^29.7.0", - "pretty-format": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-environment-node": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-29.7.0.tgz", - "integrity": "sha512-DOSwCRqXirTOyheM+4d5YZOrWcdu0LNZ87ewUoywbcb2XR4wKgqiG8vNeYwhjFMbEkfju7wx2GYH0P2gevGvFw==", - "dev": true, - "peer": true, - "dependencies": { - "@jest/environment": "^29.7.0", - "@jest/fake-timers": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/node": "*", - "jest-mock": "^29.7.0", - "jest-util": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-get-type": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.6.3.tgz", - "integrity": "sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==", - "dev": true, - "peer": true, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-haste-map": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.7.0.tgz", - "integrity": "sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA==", - "dev": true, - "peer": true, - "dependencies": { - "@jest/types": "^29.6.3", - "@types/graceful-fs": "^4.1.3", - "@types/node": "*", - "anymatch": "^3.0.3", - "fb-watchman": "^2.0.0", - "graceful-fs": "^4.2.9", - "jest-regex-util": "^29.6.3", - "jest-util": "^29.7.0", - "jest-worker": "^29.7.0", - "micromatch": "^4.0.4", - "walker": "^1.0.8" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - }, - "optionalDependencies": { - "fsevents": "^2.3.2" - } - }, - "node_modules/jest-leak-detector": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-29.7.0.tgz", - "integrity": "sha512-kYA8IJcSYtST2BY9I+SMC32nDpBT3J2NvWJx8+JCuCdl/CR1I4EKUJROiP8XtCcxqgTTBGJNdbB1A8XRKbTetw==", - "dev": true, - "peer": true, - "dependencies": { - "jest-get-type": "^29.6.3", - "pretty-format": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-matcher-utils": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.7.0.tgz", - "integrity": "sha512-sBkD+Xi9DtcChsI3L3u0+N0opgPYnCRPtGcQYrgXmR+hmt/fYfWAL0xRXYU8eWOdfuLgBe0YCW3AFtnRLagq/g==", - "dev": true, - "peer": true, - "dependencies": { - "chalk": "^4.0.0", - "jest-diff": "^29.7.0", - "jest-get-type": "^29.6.3", - "pretty-format": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-message-util": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.7.0.tgz", - "integrity": "sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w==", - "dev": true, - "peer": true, - "dependencies": { - "@babel/code-frame": "^7.12.13", - "@jest/types": "^29.6.3", - "@types/stack-utils": "^2.0.0", - "chalk": "^4.0.0", - "graceful-fs": "^4.2.9", - "micromatch": "^4.0.4", - "pretty-format": "^29.7.0", - "slash": "^3.0.0", - "stack-utils": "^2.0.3" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-mock": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.7.0.tgz", - "integrity": "sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw==", - "dev": true, - "peer": true, - "dependencies": { - "@jest/types": "^29.6.3", - "@types/node": "*", - "jest-util": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-pnp-resolver": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz", - "integrity": "sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==", - "dev": true, - "peer": true, - "engines": { - "node": ">=6" - }, - "peerDependencies": { - "jest-resolve": "*" - }, - "peerDependenciesMeta": { - "jest-resolve": { - "optional": true - } - } - }, - "node_modules/jest-regex-util": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-29.6.3.tgz", - "integrity": "sha512-KJJBsRCyyLNWCNBOvZyRDnAIfUiRJ8v+hOBQYGn8gDyF3UegwiP4gwRR3/SDa42g1YbVycTidUF3rKjyLFDWbg==", - "dev": true, - "peer": true, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-resolve": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-29.7.0.tgz", - "integrity": "sha512-IOVhZSrg+UvVAshDSDtHyFCCBUl/Q3AAJv8iZ6ZjnZ74xzvwuzLXid9IIIPgTnY62SJjfuupMKZsZQRsCvxEgA==", - "dev": true, - "peer": true, - "dependencies": { - "chalk": "^4.0.0", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.7.0", - "jest-pnp-resolver": "^1.2.2", - "jest-util": "^29.7.0", - "jest-validate": "^29.7.0", - "resolve": "^1.20.0", - "resolve.exports": "^2.0.0", - "slash": "^3.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-resolve-dependencies": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-29.7.0.tgz", - "integrity": "sha512-un0zD/6qxJ+S0et7WxeI3H5XSe9lTBBR7bOHCHXkKR6luG5mwDDlIzVQ0V5cZCuoTgEdcdwzTghYkTWfubi+nA==", - "dev": true, - "peer": true, - "dependencies": { - "jest-regex-util": "^29.6.3", - "jest-snapshot": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-runner": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-29.7.0.tgz", - "integrity": "sha512-fsc4N6cPCAahybGBfTRcq5wFR6fpLznMg47sY5aDpsoejOcVYFb07AHuSnR0liMcPTgBsA3ZJL6kFOjPdoNipQ==", - "dev": true, - "peer": true, - "dependencies": { - "@jest/console": "^29.7.0", - "@jest/environment": "^29.7.0", - "@jest/test-result": "^29.7.0", - "@jest/transform": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/node": "*", - "chalk": "^4.0.0", - "emittery": "^0.13.1", - "graceful-fs": "^4.2.9", - "jest-docblock": "^29.7.0", - "jest-environment-node": "^29.7.0", - "jest-haste-map": "^29.7.0", - "jest-leak-detector": "^29.7.0", - "jest-message-util": "^29.7.0", - "jest-resolve": "^29.7.0", - "jest-runtime": "^29.7.0", - "jest-util": "^29.7.0", - "jest-watcher": "^29.7.0", - "jest-worker": "^29.7.0", - "p-limit": "^3.1.0", - "source-map-support": "0.5.13" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-runtime": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-29.7.0.tgz", - "integrity": "sha512-gUnLjgwdGqW7B4LvOIkbKs9WGbn+QLqRQQ9juC6HndeDiezIwhDP+mhMwHWCEcfQ5RUXa6OPnFF8BJh5xegwwQ==", - "dev": true, - "peer": true, - "dependencies": { - "@jest/environment": "^29.7.0", - "@jest/fake-timers": "^29.7.0", - "@jest/globals": "^29.7.0", - "@jest/source-map": "^29.6.3", - "@jest/test-result": "^29.7.0", - "@jest/transform": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/node": "*", - "chalk": "^4.0.0", - "cjs-module-lexer": "^1.0.0", - "collect-v8-coverage": "^1.0.0", - "glob": "^7.1.3", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.7.0", - "jest-message-util": "^29.7.0", - "jest-mock": "^29.7.0", - "jest-regex-util": "^29.6.3", - "jest-resolve": "^29.7.0", - "jest-snapshot": "^29.7.0", - "jest-util": "^29.7.0", - "slash": "^3.0.0", - "strip-bom": "^4.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-snapshot": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-29.7.0.tgz", - "integrity": "sha512-Rm0BMWtxBcioHr1/OX5YCP8Uov4riHvKPknOGs804Zg9JGZgmIBkbtlxJC/7Z4msKYVbIJtfU+tKb8xlYNfdkw==", - "dev": true, - "peer": true, - "dependencies": { - "@babel/core": "^7.11.6", - "@babel/generator": "^7.7.2", - "@babel/plugin-syntax-jsx": "^7.7.2", - "@babel/plugin-syntax-typescript": "^7.7.2", - "@babel/types": "^7.3.3", - "@jest/expect-utils": "^29.7.0", - "@jest/transform": "^29.7.0", - "@jest/types": "^29.6.3", - "babel-preset-current-node-syntax": "^1.0.0", - "chalk": "^4.0.0", - "expect": "^29.7.0", - "graceful-fs": "^4.2.9", - "jest-diff": "^29.7.0", - "jest-get-type": "^29.6.3", - "jest-matcher-utils": "^29.7.0", - "jest-message-util": "^29.7.0", - "jest-util": "^29.7.0", - "natural-compare": "^1.4.0", - "pretty-format": "^29.7.0", - "semver": "^7.5.3" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-snapshot/node_modules/semver": { - "version": "7.6.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", - "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", - "dev": true, - "peer": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/jest-util": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.7.0.tgz", - "integrity": "sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==", - "dev": true, - "peer": true, - "dependencies": { - "@jest/types": "^29.6.3", - "@types/node": "*", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "graceful-fs": "^4.2.9", - "picomatch": "^2.2.3" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-validate": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-29.7.0.tgz", - "integrity": "sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw==", - "dev": true, - "peer": true, - "dependencies": { - "@jest/types": "^29.6.3", - "camelcase": "^6.2.0", - "chalk": "^4.0.0", - "jest-get-type": "^29.6.3", - "leven": "^3.1.0", - "pretty-format": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-validate/node_modules/camelcase": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", - "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", - "dev": true, - "peer": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/jest-watcher": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-29.7.0.tgz", - "integrity": "sha512-49Fg7WXkU3Vl2h6LbLtMQ/HyB6rXSIX7SqvBLQmssRBGN9I0PNvPmAmCWSOY6SOvrjhI/F7/bGAv9RtnsPA03g==", - "dev": true, - "peer": true, - "dependencies": { - "@jest/test-result": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/node": "*", - "ansi-escapes": "^4.2.1", - "chalk": "^4.0.0", - "emittery": "^0.13.1", - "jest-util": "^29.7.0", - "string-length": "^4.0.1" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-worker": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.7.0.tgz", - "integrity": "sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==", - "dev": true, - "peer": true, - "dependencies": { - "@types/node": "*", - "jest-util": "^29.7.0", - "merge-stream": "^2.0.0", - "supports-color": "^8.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-worker/node_modules/supports-color": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", - "dev": true, - "peer": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/supports-color?sponsor=1" - } - }, - "node_modules/jose": { - "version": "4.15.4", - "resolved": "https://registry.npmjs.org/jose/-/jose-4.15.4.tgz", - "integrity": "sha512-W+oqK4H+r5sITxfxpSU+MMdr/YSWGvgZMQDIsNoBDGGy4i7GBPTtvFKibQzW06n3U3TqHjhvBJsirShsEJ6eeQ==", - "funding": { - "url": "https://github.com/sponsors/panva" - } - }, - "node_modules/js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "dev": true, - "peer": true - }, - "node_modules/js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "dev": true, - "dependencies": { - "argparse": "^2.0.1" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/js2xmlparser": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/js2xmlparser/-/js2xmlparser-4.0.2.tgz", - "integrity": "sha512-6n4D8gLlLf1n5mNLQPRfViYzu9RATblzPEtm1SthMX1Pjao0r9YI9nw7ZIfRxQMERS87mcswrg+r/OYrPRX6jA==", - "optional": true, - "dependencies": { - "xmlcreate": "^2.0.4" - } - }, - "node_modules/jsdoc": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/jsdoc/-/jsdoc-4.0.2.tgz", - "integrity": "sha512-e8cIg2z62InH7azBBi3EsSEqrKx+nUtAS5bBcYTSpZFA+vhNPyhv8PTFZ0WsjOPDj04/dOLlm08EDcQJDqaGQg==", - "optional": true, - "dependencies": { - "@babel/parser": "^7.20.15", - "@jsdoc/salty": "^0.2.1", - "@types/markdown-it": "^12.2.3", - "bluebird": "^3.7.2", - "catharsis": "^0.9.0", - "escape-string-regexp": "^2.0.0", - "js2xmlparser": "^4.0.2", - "klaw": "^3.0.0", - "markdown-it": "^12.3.2", - "markdown-it-anchor": "^8.4.1", - "marked": "^4.0.10", - "mkdirp": "^1.0.4", - "requizzle": "^0.2.3", - "strip-json-comments": "^3.1.0", - "underscore": "~1.13.2" - }, - "bin": { - "jsdoc": "jsdoc.js" - }, - "engines": { - "node": ">=12.0.0" - } - }, - "node_modules/jsdoc/node_modules/escape-string-regexp": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", - "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", - "optional": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/jsesc": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", - "dev": true, - "peer": true, - "bin": { - "jsesc": "bin/jsesc" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/json-bigint": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-bigint/-/json-bigint-1.0.0.tgz", - "integrity": "sha512-SiPv/8VpZuWbvLSMtTDU8hEfrZWg/mH/nV/b4o0CYbSxu1UIQPLdwKOCIyLQX+VIPO5vrLX3i8qtqFyhdPSUSQ==", - "optional": true, - "dependencies": { - "bignumber.js": "^9.0.0" - } - }, - "node_modules/json-buffer": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", - "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", - "dev": true - }, - "node_modules/json-parse-even-better-errors": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", - "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", - "dev": true, - "peer": true - }, - "node_modules/json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true - }, - "node_modules/json-stable-stringify-without-jsonify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", - "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", - "dev": true - }, - "node_modules/json5": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", - "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", - "dev": true, - "peer": true, - "bin": { - "json5": "lib/cli.js" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/jsonwebtoken": { - "version": "9.0.2", - "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-9.0.2.tgz", - "integrity": "sha512-PRp66vJ865SSqOlgqS8hujT5U4AOgMfhrwYIuIhfKaoSCZcirrmASQr8CX7cUg+RMih+hgznrjp99o+W4pJLHQ==", - "dependencies": { - "jws": "^3.2.2", - "lodash.includes": "^4.3.0", - "lodash.isboolean": "^3.0.3", - "lodash.isinteger": "^4.0.4", - "lodash.isnumber": "^3.0.3", - "lodash.isplainobject": "^4.0.6", - "lodash.isstring": "^4.0.1", - "lodash.once": "^4.0.0", - "ms": "^2.1.1", - "semver": "^7.5.4" - }, - "engines": { - "node": ">=12", - "npm": ">=6" - } - }, - "node_modules/jsonwebtoken/node_modules/jwa": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/jwa/-/jwa-1.4.1.tgz", - "integrity": "sha512-qiLX/xhEEFKUAJ6FiBMbes3w9ATzyk5W7Hvzpa/SLYdxNtng+gcurvrI7TbACjIXlsJyr05/S1oUhZrc63evQA==", - "dependencies": { - "buffer-equal-constant-time": "1.0.1", - "ecdsa-sig-formatter": "1.0.11", - "safe-buffer": "^5.0.1" - } - }, - "node_modules/jsonwebtoken/node_modules/jws": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/jws/-/jws-3.2.2.tgz", - "integrity": "sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA==", - "dependencies": { - "jwa": "^1.4.1", - "safe-buffer": "^5.0.1" - } - }, - "node_modules/jsonwebtoken/node_modules/semver": { - "version": "7.6.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", - "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/jwa": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/jwa/-/jwa-2.0.0.tgz", - "integrity": "sha512-jrZ2Qx916EA+fq9cEAeCROWPTfCwi1IVHqT2tapuqLEVVDKFDENFw1oL+MwrTvH6msKxsd1YTDVw6uKEcsrLEA==", - "optional": true, - "dependencies": { - "buffer-equal-constant-time": "1.0.1", - "ecdsa-sig-formatter": "1.0.11", - "safe-buffer": "^5.0.1" - } - }, - "node_modules/jwks-rsa": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/jwks-rsa/-/jwks-rsa-3.1.0.tgz", - "integrity": "sha512-v7nqlfezb9YfHHzYII3ef2a2j1XnGeSE/bK3WfumaYCqONAIstJbrEGapz4kadScZzEt7zYCN7bucj8C0Mv/Rg==", - "dependencies": { - "@types/express": "^4.17.17", - "@types/jsonwebtoken": "^9.0.2", - "debug": "^4.3.4", - "jose": "^4.14.6", - "limiter": "^1.1.5", - "lru-memoizer": "^2.2.0" - }, - "engines": { - "node": ">=14" - } - }, - "node_modules/jwks-rsa/node_modules/@types/express": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.21.tgz", - "integrity": "sha512-ejlPM315qwLpaQlQDTjPdsUFSc6ZsP4AN6AlWnogPjQ7CVi7PYF3YVz+CY3jE2pwYf7E/7HlDAN0rV2GxTG0HQ==", - "dependencies": { - "@types/body-parser": "*", - "@types/express-serve-static-core": "^4.17.33", - "@types/qs": "*", - "@types/serve-static": "*" - } - }, - "node_modules/jws": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/jws/-/jws-4.0.0.tgz", - "integrity": "sha512-KDncfTmOZoOMTFG4mBlG0qUIOlc03fmzH+ru6RgYVZhPkyiy/92Owlt/8UEN+a4TXR1FQetfIpJE8ApdvdVxTg==", - "optional": true, - "dependencies": { - "jwa": "^2.0.0", - "safe-buffer": "^5.0.1" - } - }, - "node_modules/keyv": { - "version": "4.5.4", - "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", - "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", - "dev": true, - "dependencies": { - "json-buffer": "3.0.1" - } - }, - "node_modules/klaw": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/klaw/-/klaw-3.0.0.tgz", - "integrity": "sha512-0Fo5oir+O9jnXu5EefYbVK+mHMBeEVEy2cmctR1O1NECcCkPRreJKrS6Qt/j3KC2C148Dfo9i3pCmCMsdqGr0g==", - "optional": true, - "dependencies": { - "graceful-fs": "^4.1.9" - } - }, - "node_modules/kleur": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", - "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", - "dev": true, - "peer": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/leven": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", - "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", - "dev": true, - "peer": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/levn": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", - "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", - "dev": true, - "dependencies": { - "prelude-ls": "^1.2.1", - "type-check": "~0.4.0" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/limiter": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/limiter/-/limiter-1.1.5.tgz", - "integrity": "sha512-FWWMIEOxz3GwUI4Ts/IvgVy6LPvoMPgjMdQ185nN6psJyBJ4yOpzqm695/h5umdLJg2vW3GR5iG11MAkR2AzJA==" - }, - "node_modules/lines-and-columns": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", - "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", - "dev": true, - "peer": true - }, - "node_modules/linkify-it": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-3.0.3.tgz", - "integrity": "sha512-ynTsyrFSdE5oZ/O9GEf00kPngmOfVwazR5GKDq6EYfhlpFug3J2zybX56a2PRRpc9P+FuSoGNAwjlbDs9jJBPQ==", - "optional": true, - "dependencies": { - "uc.micro": "^1.0.1" - } - }, - "node_modules/locate-path": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", - "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", - "dev": true, - "dependencies": { - "p-locate": "^5.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", - "devOptional": true - }, - "node_modules/lodash.camelcase": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", - "integrity": "sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==" - }, - "node_modules/lodash.clonedeep": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz", - "integrity": "sha512-H5ZhCF25riFd9uB5UCkVKo61m3S/xZk1x4wA6yp/L3RFP6Z/eHH1ymQcGLo7J3GMPfm0V/7m1tryHuGVxpqEBQ==" - }, - "node_modules/lodash.includes": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/lodash.includes/-/lodash.includes-4.3.0.tgz", - "integrity": "sha512-W3Bx6mdkRTGtlJISOvVD/lbqjTlPPUDTMnlXZFnVwi9NKJ6tiAk6LVdlhZMm17VZisqhKcgzpO5Wz91PCt5b0w==" - }, - "node_modules/lodash.isboolean": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz", - "integrity": "sha512-Bz5mupy2SVbPHURB98VAcw+aHh4vRV5IPNhILUCsOzRmsTmSQ17jIuqopAentWoehktxGd9e/hbIXq980/1QJg==" - }, - "node_modules/lodash.isinteger": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/lodash.isinteger/-/lodash.isinteger-4.0.4.tgz", - "integrity": "sha512-DBwtEWN2caHQ9/imiNeEA5ys1JoRtRfY3d7V9wkqtbycnAmTvRRmbHKDV4a0EYc678/dia0jrte4tjYwVBaZUA==" - }, - "node_modules/lodash.isnumber": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/lodash.isnumber/-/lodash.isnumber-3.0.3.tgz", - "integrity": "sha512-QYqzpfwO3/CWf3XP+Z+tkQsfaLL/EnUlXWVkIk5FUPc4sBdTehEqZONuyRt2P67PXAk+NXmTBcc97zw9t1FQrw==" - }, - "node_modules/lodash.isplainobject": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", - "integrity": "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==" - }, - "node_modules/lodash.isstring": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz", - "integrity": "sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw==" - }, - "node_modules/lodash.merge": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", - "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", - "dev": true - }, - "node_modules/lodash.once": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz", - "integrity": "sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg==" - }, - "node_modules/long": { - "version": "5.2.3", - "resolved": "https://registry.npmjs.org/long/-/long-5.2.3.tgz", - "integrity": "sha512-lcHwpNoggQTObv5apGNCTdJrO69eHOZMi4BNC+rTLER8iHAqGrUVeLh/irVIM7zTw2bOXA8T6uNPeujwOLg/2Q==" - }, - "node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/lru-memoizer": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/lru-memoizer/-/lru-memoizer-2.2.0.tgz", - "integrity": "sha512-QfOZ6jNkxCcM/BkIPnFsqDhtrazLRsghi9mBwFAzol5GCvj4EkFT899Za3+QwikCg5sRX8JstioBDwOxEyzaNw==", - "dependencies": { - "lodash.clonedeep": "^4.5.0", - "lru-cache": "~4.0.0" - } - }, - "node_modules/lru-memoizer/node_modules/lru-cache": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.0.2.tgz", - "integrity": "sha512-uQw9OqphAGiZhkuPlpFGmdTU2tEuhxTourM/19qGJrxBPHAr/f8BT1a0i/lOclESnGatdJG/UCkP9kZB/Lh1iw==", - "dependencies": { - "pseudomap": "^1.0.1", - "yallist": "^2.0.0" - } - }, - "node_modules/lru-memoizer/node_modules/yallist": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", - "integrity": "sha512-ncTzHV7NvsQZkYe1DW7cbDLm0YpzHmZF5r/iyP3ZnQtMiJ+pjzisCiMNI+Sj+xQF5pXhSHxSB3uDbsBTzY/c2A==" - }, - "node_modules/make-dir": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz", - "integrity": "sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==", - "dev": true, - "peer": true, - "dependencies": { - "semver": "^7.5.3" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/make-dir/node_modules/semver": { - "version": "7.6.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", - "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", - "dev": true, - "peer": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/makeerror": { - "version": "1.0.12", - "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz", - "integrity": "sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==", - "dev": true, - "peer": true, - "dependencies": { - "tmpl": "1.0.5" - } - }, - "node_modules/markdown-it": { - "version": "12.3.2", - "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-12.3.2.tgz", - "integrity": "sha512-TchMembfxfNVpHkbtriWltGWc+m3xszaRD0CZup7GFFhzIgQqxIfn3eGj1yZpfuflzPvfkt611B2Q/Bsk1YnGg==", - "optional": true, - "dependencies": { - "argparse": "^2.0.1", - "entities": "~2.1.0", - "linkify-it": "^3.0.1", - "mdurl": "^1.0.1", - "uc.micro": "^1.0.5" - }, - "bin": { - "markdown-it": "bin/markdown-it.js" - } - }, - "node_modules/markdown-it-anchor": { - "version": "8.6.7", - "resolved": "https://registry.npmjs.org/markdown-it-anchor/-/markdown-it-anchor-8.6.7.tgz", - "integrity": "sha512-FlCHFwNnutLgVTflOYHPW2pPcl2AACqVzExlkGQNsi4CJgqOHN7YTgDd4LuhgN1BFO3TS0vLAruV1Td6dwWPJA==", - "optional": true, - "peerDependencies": { - "@types/markdown-it": "*", - "markdown-it": "*" - } - }, - "node_modules/marked": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/marked/-/marked-4.3.0.tgz", - "integrity": "sha512-PRsaiG84bK+AMvxziE/lCFss8juXjNaWzVbN5tXAm4XjeaS9NAHhop+PjQxz2A9h8Q4M/xGmzP8vqNwy6JeK0A==", - "optional": true, - "bin": { - "marked": "bin/marked.js" - }, - "engines": { - "node": ">= 12" - } - }, - "node_modules/mdurl": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-1.0.1.tgz", - "integrity": "sha512-/sKlQJCBYVY9Ers9hqzKou4H6V5UWc/M59TH2dvkt+84itfnq7uFOMLpOiOS4ujvHP4etln18fmIxA5R5fll0g==", - "optional": true - }, - "node_modules/media-typer": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", - "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/merge-descriptors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", - "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==" - }, - "node_modules/merge-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", - "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", - "dev": true, - "peer": true - }, - "node_modules/methods": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", - "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/micromatch": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", - "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", - "dev": true, - "peer": true, - "dependencies": { - "braces": "^3.0.2", - "picomatch": "^2.3.1" - }, - "engines": { - "node": ">=8.6" - } - }, - "node_modules/mime": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-3.0.0.tgz", - "integrity": "sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A==", - "optional": true, - "bin": { - "mime": "cli.js" - }, - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mime-types": { - "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", - "dependencies": { - "mime-db": "1.52.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", - "dev": true, - "peer": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "devOptional": true, - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/minimist": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", - "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", - "optional": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/mkdirp": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", - "optional": true, - "bin": { - "mkdirp": "bin/cmd.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" - }, - "node_modules/natural-compare": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", - "dev": true - }, - "node_modules/negotiator": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", - "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/node-fetch": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", - "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", - "dependencies": { - "whatwg-url": "^5.0.0" - }, - "engines": { - "node": "4.x || >=6.0.0" - }, - "peerDependencies": { - "encoding": "^0.1.0" - }, - "peerDependenciesMeta": { - "encoding": { - "optional": true - } - } - }, - "node_modules/node-forge": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.3.1.tgz", - "integrity": "sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==", - "engines": { - "node": ">= 6.13.0" - } - }, - "node_modules/node-int64": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", - "integrity": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==", - "dev": true, - "peer": true - }, - "node_modules/node-releases": { - "version": "2.0.14", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.14.tgz", - "integrity": "sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==", - "dev": true, - "peer": true - }, - "node_modules/normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "dev": true, - "peer": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/npm-run-path": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", - "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", - "dev": true, - "peer": true, - "dependencies": { - "path-key": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/object-hash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz", - "integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==", - "optional": true, - "engines": { - "node": ">= 6" - } - }, - "node_modules/object-inspect": { - "version": "1.13.1", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.1.tgz", - "integrity": "sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/on-finished": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", - "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", - "dependencies": { - "ee-first": "1.1.1" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", - "devOptional": true, - "dependencies": { - "wrappy": "1" - } - }, - "node_modules/onetime": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", - "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", - "dev": true, - "peer": true, - "dependencies": { - "mimic-fn": "^2.1.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/optionator": { - "version": "0.9.3", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.3.tgz", - "integrity": "sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==", - "dev": true, - "dependencies": { - "@aashutoshrathi/word-wrap": "^1.2.3", - "deep-is": "^0.1.3", - "fast-levenshtein": "^2.0.6", - "levn": "^0.4.1", - "prelude-ls": "^1.2.1", - "type-check": "^0.4.0" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/p-limit": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", - "devOptional": true, - "dependencies": { - "yocto-queue": "^0.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-locate": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", - "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", - "dev": true, - "dependencies": { - "p-limit": "^3.0.2" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "dev": true, - "peer": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/parent-module": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", - "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", - "dev": true, - "dependencies": { - "callsites": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/parse-json": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", - "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", - "dev": true, - "peer": true, - "dependencies": { - "@babel/code-frame": "^7.0.0", - "error-ex": "^1.3.1", - "json-parse-even-better-errors": "^2.3.0", - "lines-and-columns": "^1.1.6" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/parseurl": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", - "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", - "devOptional": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/path-parse": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", - "dev": true, - "peer": true - }, - "node_modules/path-to-regexp": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", - "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==" - }, - "node_modules/picocolors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", - "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", - "dev": true, - "peer": true - }, - "node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "dev": true, - "peer": true, - "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/pirates": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.6.tgz", - "integrity": "sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==", - "dev": true, - "peer": true, - "engines": { - "node": ">= 6" - } - }, - "node_modules/pkg-dir": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", - "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", - "dev": true, - "peer": true, - "dependencies": { - "find-up": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/pkg-dir/node_modules/find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dev": true, - "peer": true, - "dependencies": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/pkg-dir/node_modules/locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dev": true, - "peer": true, - "dependencies": { - "p-locate": "^4.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/pkg-dir/node_modules/p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, - "peer": true, - "dependencies": { - "p-try": "^2.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/pkg-dir/node_modules/p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dev": true, - "peer": true, - "dependencies": { - "p-limit": "^2.2.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/prelude-ls": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", - "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", - "dev": true, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/pretty-format": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", - "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", - "dev": true, - "peer": true, - "dependencies": { - "@jest/schemas": "^29.6.3", - "ansi-styles": "^5.0.0", - "react-is": "^18.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/pretty-format/node_modules/ansi-styles": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", - "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", - "dev": true, - "peer": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/printj": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/printj/-/printj-1.1.2.tgz", - "integrity": "sha512-zA2SmoLaxZyArQTOPj5LXecR+RagfPSU5Kw1qP+jkWeNlrq+eJZyY2oS68SU1Z/7/myXM4lo9716laOFAVStCQ==", - "bin": { - "printj": "bin/printj.njs" - }, - "engines": { - "node": ">=0.8" - } - }, - "node_modules/prompts": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", - "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==", - "dev": true, - "peer": true, - "dependencies": { - "kleur": "^3.0.3", - "sisteransi": "^1.0.5" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/proto3-json-serializer": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/proto3-json-serializer/-/proto3-json-serializer-1.1.1.tgz", - "integrity": "sha512-AwAuY4g9nxx0u52DnSMkqqgyLHaW/XaPLtaAo3y/ZCfeaQB/g4YDH4kb8Wc/mWzWvu0YjOznVnfn373MVZZrgw==", - "optional": true, - "dependencies": { - "protobufjs": "^7.0.0" - }, - "engines": { - "node": ">=12.0.0" - } - }, - "node_modules/protobufjs": { - "version": "7.2.6", - "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-7.2.6.tgz", - "integrity": "sha512-dgJaEDDL6x8ASUZ1YqWciTRrdOuYNzoOf27oHNfdyvKqHr5i0FV7FSLU+aIeFjyFgVxrpTOtQUi0BLLBymZaBw==", - "hasInstallScript": true, - "dependencies": { - "@protobufjs/aspromise": "^1.1.2", - "@protobufjs/base64": "^1.1.2", - "@protobufjs/codegen": "^2.0.4", - "@protobufjs/eventemitter": "^1.1.0", - "@protobufjs/fetch": "^1.1.0", - "@protobufjs/float": "^1.0.2", - "@protobufjs/inquire": "^1.1.0", - "@protobufjs/path": "^1.1.2", - "@protobufjs/pool": "^1.1.0", - "@protobufjs/utf8": "^1.1.0", - "@types/node": ">=13.7.0", - "long": "^5.0.0" - }, - "engines": { - "node": ">=12.0.0" - } - }, - "node_modules/protobufjs-cli": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/protobufjs-cli/-/protobufjs-cli-1.1.1.tgz", - "integrity": "sha512-VPWMgIcRNyQwWUv8OLPyGQ/0lQY/QTQAVN5fh+XzfDwsVw1FZ2L3DM/bcBf8WPiRz2tNpaov9lPZfNcmNo6LXA==", - "optional": true, - "dependencies": { - "chalk": "^4.0.0", - "escodegen": "^1.13.0", - "espree": "^9.0.0", - "estraverse": "^5.1.0", - "glob": "^8.0.0", - "jsdoc": "^4.0.0", - "minimist": "^1.2.0", - "semver": "^7.1.2", - "tmp": "^0.2.1", - "uglify-js": "^3.7.7" - }, - "bin": { - "pbjs": "bin/pbjs", - "pbts": "bin/pbts" - }, - "engines": { - "node": ">=12.0.0" - }, - "peerDependencies": { - "protobufjs": "^7.0.0" - } - }, - "node_modules/protobufjs-cli/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "optional": true, - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/protobufjs-cli/node_modules/glob": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz", - "integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==", - "optional": true, - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^5.0.1", - "once": "^1.3.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/protobufjs-cli/node_modules/minimatch": { - "version": "5.1.6", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", - "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", - "optional": true, - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/protobufjs-cli/node_modules/semver": { - "version": "7.6.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", - "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", - "optional": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/proxy-addr": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", - "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", - "dependencies": { - "forwarded": "0.2.0", - "ipaddr.js": "1.9.1" - }, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/pseudomap": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", - "integrity": "sha512-b/YwNhb8lk1Zz2+bXXpS/LK9OisiZZ1SNsSLxN1x2OXVEhW2Ckr/7mWE5vrC1ZTiJlD9g19jWszTmJsB+oEpFQ==" - }, - "node_modules/punycode": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", - "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/pure-rand": { - "version": "6.0.4", - "resolved": "https://registry.npmjs.org/pure-rand/-/pure-rand-6.0.4.tgz", - "integrity": "sha512-LA0Y9kxMYv47GIPJy6MI84fqTd2HmYZI83W/kM/SkKfDlajnZYfmXFTxkbY+xSBPkLJxltMa9hIkmdc29eguMA==", - "dev": true, - "funding": [ - { - "type": "individual", - "url": "https://github.com/sponsors/dubzzz" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/fast-check" - } - ], - "peer": true - }, - "node_modules/qs": { - "version": "6.11.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", - "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", - "dependencies": { - "side-channel": "^1.0.4" - }, - "engines": { - "node": ">=0.6" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/queue-microtask": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", - "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/range-parser": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", - "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/raw-body": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz", - "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==", - "dependencies": { - "bytes": "3.1.2", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "unpipe": "1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/react-is": { - "version": "18.2.0", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", - "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==", - "dev": true, - "peer": true - }, - "node_modules/readable-stream": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", - "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", - "optional": true, - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/requizzle": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/requizzle/-/requizzle-0.2.4.tgz", - "integrity": "sha512-JRrFk1D4OQ4SqovXOgdav+K8EAhSB/LJZqCz8tbX0KObcdeM15Ss59ozWMBWmmINMagCwmqn4ZNryUGpBsl6Jw==", - "optional": true, - "dependencies": { - "lodash": "^4.17.21" - } - }, - "node_modules/resolve": { - "version": "1.22.8", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", - "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", - "dev": true, - "peer": true, - "dependencies": { - "is-core-module": "^2.13.0", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - }, - "bin": { - "resolve": "bin/resolve" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/resolve-cwd": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", - "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", - "dev": true, - "peer": true, - "dependencies": { - "resolve-from": "^5.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/resolve-cwd/node_modules/resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", - "dev": true, - "peer": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/resolve-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/resolve.exports": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-2.0.2.tgz", - "integrity": "sha512-X2UW6Nw3n/aMgDVy+0rSqgHlv39WZAlZrXCdnbyEiKm17DSqHX4MmQMaST3FbeWR5FTuRcUwYAziZajji0Y7mg==", - "dev": true, - "peer": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/retry": { - "version": "0.13.1", - "resolved": "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz", - "integrity": "sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==", - "optional": true, - "engines": { - "node": ">= 4" - } - }, - "node_modules/retry-request": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/retry-request/-/retry-request-5.0.2.tgz", - "integrity": "sha512-wfI3pk7EE80lCIXprqh7ym48IHYdwmAAzESdbU8Q9l7pnRCk9LEhpbOTNKjz6FARLm/Bl5m+4F0ABxOkYUujSQ==", - "optional": true, - "dependencies": { - "debug": "^4.1.1", - "extend": "^3.0.2" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/reusify": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", - "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", - "dev": true, - "engines": { - "iojs": ">=1.0.0", - "node": ">=0.10.0" - } - }, - "node_modules/rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "devOptional": true, - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/run-parallel": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", - "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "dependencies": { - "queue-microtask": "^1.2.2" - } - }, - "node_modules/safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" - }, - "node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "peer": true, - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/send": { - "version": "0.18.0", - "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", - "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", - "dependencies": { - "debug": "2.6.9", - "depd": "2.0.0", - "destroy": "1.2.0", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "fresh": "0.5.2", - "http-errors": "2.0.0", - "mime": "1.6.0", - "ms": "2.1.3", - "on-finished": "2.4.1", - "range-parser": "~1.2.1", - "statuses": "2.0.1" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/send/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/send/node_modules/debug/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" - }, - "node_modules/send/node_modules/mime": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", - "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", - "bin": { - "mime": "cli.js" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/send/node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" - }, - "node_modules/serve-static": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", - "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", - "dependencies": { - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "parseurl": "~1.3.3", - "send": "0.18.0" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/set-function-length": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.1.tgz", - "integrity": "sha512-j4t6ccc+VsKwYHso+kElc5neZpjtq9EnRICFZtWyBsLojhmeF/ZBd/elqm22WJh/BziDe/SBiOeAt0m2mfLD0g==", - "dependencies": { - "define-data-property": "^1.1.2", - "es-errors": "^1.3.0", - "function-bind": "^1.1.2", - "get-intrinsic": "^1.2.3", - "gopd": "^1.0.1", - "has-property-descriptors": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/setprototypeof": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", - "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" - }, - "node_modules/shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "dev": true, - "dependencies": { - "shebang-regex": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/side-channel": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.5.tgz", - "integrity": "sha512-QcgiIWV4WV7qWExbN5llt6frQB/lBven9pqliLXfGPB+K9ZYXxDozp0wLkHS24kWCm+6YXH/f0HhnObZnZOBnQ==", - "dependencies": { - "call-bind": "^1.0.6", - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.4", - "object-inspect": "^1.13.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/signal-exit": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", - "dev": true, - "peer": true - }, - "node_modules/sisteransi": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", - "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", - "dev": true, - "peer": true - }, - "node_modules/slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "dev": true, - "peer": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "devOptional": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/source-map-support": { - "version": "0.5.13", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.13.tgz", - "integrity": "sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==", - "dev": true, - "peer": true, - "dependencies": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - } - }, - "node_modules/sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", - "dev": true, - "peer": true - }, - "node_modules/stack-utils": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.6.tgz", - "integrity": "sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==", - "dev": true, - "peer": true, - "dependencies": { - "escape-string-regexp": "^2.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/stack-utils/node_modules/escape-string-regexp": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", - "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", - "dev": true, - "peer": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/statuses": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", - "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/stream-events": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/stream-events/-/stream-events-1.0.5.tgz", - "integrity": "sha512-E1GUzBSgvct8Jsb3v2X15pjzN1tYebtbLaMg+eBOUOAxgbLoSbT2NS91ckc5lJD1KfLjId+jXJRgo0qnV5Nerg==", - "optional": true, - "dependencies": { - "stubs": "^3.0.0" - } - }, - "node_modules/stream-shift": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.3.tgz", - "integrity": "sha512-76ORR0DO1o1hlKwTbi/DM3EXWGf3ZJYO8cXX5RJwnul2DEg2oyoZyjLNoQM8WsvZiFKCRfC1O0J7iCvie3RZmQ==", - "optional": true - }, - "node_modules/string_decoder": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", - "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", - "optional": true, - "dependencies": { - "safe-buffer": "~5.2.0" - } - }, - "node_modules/string-length": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz", - "integrity": "sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==", - "dev": true, - "peer": true, - "dependencies": { - "char-regex": "^1.0.2", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-bom": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", - "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", - "dev": true, - "peer": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-final-newline": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", - "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", - "dev": true, - "peer": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/strip-json-comments": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", - "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", - "devOptional": true, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/strnum": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/strnum/-/strnum-1.0.5.tgz", - "integrity": "sha512-J8bbNyKKXl5qYcR36TIO8W3mVGVHrmmxsd5PAItGkmyzwJvybiw2IVq5nqd0i4LSNSkB/sx9VHllbfFdr9k1JA==", - "optional": true - }, - "node_modules/stubs": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/stubs/-/stubs-3.0.0.tgz", - "integrity": "sha512-PdHt7hHUJKxvTCgbKX9C1V/ftOcjJQgz8BZwNfV5c4B6dcGqlpelTbJ999jBGZ2jYiPAwcX5dP6oBwVlBlUbxw==", - "optional": true - }, - "node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "devOptional": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/supports-preserve-symlinks-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", - "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", - "dev": true, - "peer": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/teeny-request": { - "version": "8.0.3", - "resolved": "https://registry.npmjs.org/teeny-request/-/teeny-request-8.0.3.tgz", - "integrity": "sha512-jJZpA5He2y52yUhA7pyAGZlgQpcB+xLjcN0eUFxr9c8hP/H7uOXbBNVo/O0C/xVfJLJs680jvkFgVJEEvk9+ww==", - "optional": true, - "dependencies": { - "http-proxy-agent": "^5.0.0", - "https-proxy-agent": "^5.0.0", - "node-fetch": "^2.6.1", - "stream-events": "^1.0.5", - "uuid": "^9.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/test-exclude": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", - "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", - "dev": true, - "peer": true, - "dependencies": { - "@istanbuljs/schema": "^0.1.2", - "glob": "^7.1.4", - "minimatch": "^3.0.4" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/text-decoding": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/text-decoding/-/text-decoding-1.0.0.tgz", - "integrity": "sha512-/0TJD42KDnVwKmDK6jj3xP7E2MG7SHAOG4tyTgyUCRPdHwvkquYNLEQltmdMa3owq3TkddCVcTsoctJI8VQNKA==" - }, - "node_modules/text-table": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", - "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", - "dev": true - }, - "node_modules/tmp": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.1.tgz", - "integrity": "sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ==", - "optional": true, - "dependencies": { - "rimraf": "^3.0.0" - }, - "engines": { - "node": ">=8.17.0" - } - }, - "node_modules/tmpl": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz", - "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==", - "dev": true, - "peer": true - }, - "node_modules/to-fast-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", - "dev": true, - "peer": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, - "peer": true, - "dependencies": { - "is-number": "^7.0.0" - }, - "engines": { - "node": ">=8.0" - } - }, - "node_modules/toidentifier": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", - "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", - "engines": { - "node": ">=0.6" - } - }, - "node_modules/tr46": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", - "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" - }, - "node_modules/ts-deepmerge": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/ts-deepmerge/-/ts-deepmerge-2.0.7.tgz", - "integrity": "sha512-3phiGcxPSSR47RBubQxPoZ+pqXsEsozLo4G4AlSrsMKTFg9TA3l+3he5BqpUi9wiuDbaHWXH/amlzQ49uEdXtg==", - "dev": true - }, - "node_modules/tslib": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", - "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" - }, - "node_modules/type-check": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", - "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", - "dev": true, - "dependencies": { - "prelude-ls": "^1.2.1" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/type-detect": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", - "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", - "dev": true, - "peer": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/type-fest": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", - "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/type-is": { - "version": "1.6.18", - "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", - "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", - "dependencies": { - "media-typer": "0.3.0", - "mime-types": "~2.1.24" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/uc.micro": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-1.0.6.tgz", - "integrity": "sha512-8Y75pvTYkLJW2hWQHXxoqRgV7qb9B+9vFEtidML+7koHUFapnVJAZ6cKs+Qjz5Aw3aZWHMC6u0wJE3At+nSGwA==", - "optional": true - }, - "node_modules/uglify-js": { - "version": "3.17.4", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.17.4.tgz", - "integrity": "sha512-T9q82TJI9e/C1TAxYvfb16xO120tMVFZrGA3f9/P4424DNu6ypK103y0GPFVa17yotwSyZW5iYXgjYHkGrJW/g==", - "optional": true, - "bin": { - "uglifyjs": "bin/uglifyjs" - }, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/underscore": { - "version": "1.13.6", - "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.13.6.tgz", - "integrity": "sha512-+A5Sja4HP1M08MaXya7p5LvjuM7K6q/2EaC0+iovj/wOcMsTzMvDFbasi/oSapiwOlt252IqsKqPjCl7huKS0A==", - "optional": true - }, - "node_modules/undici-types": { - "version": "5.26.5", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", - "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==" - }, - "node_modules/unpipe": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", - "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/update-browserslist-db": { - "version": "1.0.13", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz", - "integrity": "sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "peer": true, - "dependencies": { - "escalade": "^3.1.1", - "picocolors": "^1.0.0" - }, - "bin": { - "update-browserslist-db": "cli.js" - }, - "peerDependencies": { - "browserslist": ">= 4.21.0" - } - }, - "node_modules/uri-js": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", - "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", - "dev": true, - "dependencies": { - "punycode": "^2.1.0" - } - }, - "node_modules/util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", - "optional": true - }, - "node_modules/utils-merge": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", - "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", - "engines": { - "node": ">= 0.4.0" - } - }, - "node_modules/uuid": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz", - "integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==", - "funding": [ - "https://github.com/sponsors/broofa", - "https://github.com/sponsors/ctavan" - ], - "bin": { - "uuid": "dist/bin/uuid" - } - }, - "node_modules/v8-to-istanbul": { - "version": "9.2.0", - "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.2.0.tgz", - "integrity": "sha512-/EH/sDgxU2eGxajKdwLCDmQ4FWq+kpi3uCmBGpw1xJtnAxEjlD8j8PEiGWpCIMIs3ciNAgH0d3TTJiUkYzyZjA==", - "dev": true, - "peer": true, - "dependencies": { - "@jridgewell/trace-mapping": "^0.3.12", - "@types/istanbul-lib-coverage": "^2.0.1", - "convert-source-map": "^2.0.0" - }, - "engines": { - "node": ">=10.12.0" - } - }, - "node_modules/vary": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", - "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/walker": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz", - "integrity": "sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==", - "dev": true, - "peer": true, - "dependencies": { - "makeerror": "1.0.12" - } - }, - "node_modules/webidl-conversions": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", - "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" - }, - "node_modules/websocket-driver": { - "version": "0.7.4", - "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.4.tgz", - "integrity": "sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==", - "dependencies": { - "http-parser-js": ">=0.5.1", - "safe-buffer": ">=5.1.0", - "websocket-extensions": ">=0.1.1" - }, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/websocket-extensions": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.4.tgz", - "integrity": "sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==", - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/whatwg-url": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", - "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", - "dependencies": { - "tr46": "~0.0.3", - "webidl-conversions": "^3.0.0" - } - }, - "node_modules/which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/node-which" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/word-wrap": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", - "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", - "optional": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", - "devOptional": true - }, - "node_modules/write-file-atomic": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-4.0.2.tgz", - "integrity": "sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==", - "dev": true, - "peer": true, - "dependencies": { - "imurmurhash": "^0.1.4", - "signal-exit": "^3.0.7" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/xmlcreate": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/xmlcreate/-/xmlcreate-2.0.4.tgz", - "integrity": "sha512-nquOebG4sngPmGPICTS5EnxqhKbCmz5Ox5hsszI2T6U5qdrJizBc+0ilYSEjTSzU0yZcmvppztXe/5Al5fUwdg==", - "optional": true - }, - "node_modules/y18n": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", - "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", - "engines": { - "node": ">=10" - } - }, - "node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" - }, - "node_modules/yargs": { - "version": "17.7.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", - "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", - "dependencies": { - "cliui": "^8.0.1", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.3", - "y18n": "^5.0.5", - "yargs-parser": "^21.1.1" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/yargs-parser": { - "version": "21.1.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", - "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", - "engines": { - "node": ">=12" - } - }, - "node_modules/yocto-queue": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", - "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", - "devOptional": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - } - } -} diff --git a/apps/rider-archive-cubit/functions/package.json b/apps/rider-archive-cubit/functions/package.json deleted file mode 100644 index 38eeb46..0000000 --- a/apps/rider-archive-cubit/functions/package.json +++ /dev/null @@ -1,29 +0,0 @@ -{ - "name": "functions", - "description": "Cloud Functions for Firebase", - "scripts": { - "lint": "eslint .", - "serve": "firebase emulators:start --only functions", - "shell": "firebase functions:shell", - "start": "npm run shell", - "deploy": "firebase deploy --only functions", - "logs": "firebase functions:log" - }, - "engines": { - "node": "18" - }, - "main": "index.js", - "dependencies": { - "agora-access-token": "^2.0.4", - "express": "^4.18.2", - "firebase": "^10.6.0", - "firebase-admin": "^11.8.0", - "firebase-functions": "^4.7.0" - }, - "devDependencies": { - "eslint": "^8.15.0", - "eslint-config-google": "^0.14.0", - "firebase-functions-test": "^3.1.0" - }, - "private": true -} diff --git a/apps/rider-archive-cubit/ios/.gitignore b/apps/rider-archive-cubit/ios/.gitignore deleted file mode 100644 index 7a7f987..0000000 --- a/apps/rider-archive-cubit/ios/.gitignore +++ /dev/null @@ -1,34 +0,0 @@ -**/dgph -*.mode1v3 -*.mode2v3 -*.moved-aside -*.pbxuser -*.perspectivev3 -**/*sync/ -.sconsign.dblite -.tags* -**/.vagrant/ -**/DerivedData/ -Icon? -**/Pods/ -**/.symlinks/ -profile -xcuserdata -**/.generated/ -Flutter/App.framework -Flutter/Flutter.framework -Flutter/Flutter.podspec -Flutter/Generated.xcconfig -Flutter/ephemeral/ -Flutter/app.flx -Flutter/app.zip -Flutter/flutter_assets/ -Flutter/flutter_export_environment.sh -ServiceDefinitions.json -Runner/GeneratedPluginRegistrant.* - -# Exceptions to above rules. -!default.mode1v3 -!default.mode2v3 -!default.pbxuser -!default.perspectivev3 diff --git a/apps/rider-archive-cubit/ios/Flutter/AppFrameworkInfo.plist b/apps/rider-archive-cubit/ios/Flutter/AppFrameworkInfo.plist deleted file mode 100644 index 391a902..0000000 --- a/apps/rider-archive-cubit/ios/Flutter/AppFrameworkInfo.plist +++ /dev/null @@ -1,24 +0,0 @@ - - - - - CFBundleDevelopmentRegion - en - CFBundleExecutable - App - CFBundleIdentifier - io.flutter.flutter.app - CFBundleInfoDictionaryVersion - 6.0 - CFBundleName - App - CFBundlePackageType - FMWK - CFBundleShortVersionString - 1.0 - CFBundleSignature - ???? - CFBundleVersion - 1.0 - - diff --git a/apps/rider-archive-cubit/ios/Flutter/Debug.xcconfig b/apps/rider-archive-cubit/ios/Flutter/Debug.xcconfig deleted file mode 100644 index ec97fc6..0000000 --- a/apps/rider-archive-cubit/ios/Flutter/Debug.xcconfig +++ /dev/null @@ -1,2 +0,0 @@ -#include? "Pods/Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig" -#include "Generated.xcconfig" diff --git a/apps/rider-archive-cubit/ios/Flutter/Release.xcconfig b/apps/rider-archive-cubit/ios/Flutter/Release.xcconfig deleted file mode 100644 index c4855bf..0000000 --- a/apps/rider-archive-cubit/ios/Flutter/Release.xcconfig +++ /dev/null @@ -1,2 +0,0 @@ -#include? "Pods/Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig" -#include "Generated.xcconfig" diff --git a/apps/rider-archive-cubit/ios/Podfile b/apps/rider-archive-cubit/ios/Podfile deleted file mode 100644 index e351348..0000000 --- a/apps/rider-archive-cubit/ios/Podfile +++ /dev/null @@ -1,56 +0,0 @@ -# Uncomment this line to define a global platform for your project -platform :ios, '16.1' -$iOSVersion = '16.1' # or newer version - -# CocoaPods analytics sends network stats synchronously affecting flutter build latency. -ENV['COCOAPODS_DISABLE_STATS'] = 'true' - -project 'Runner', { - 'Debug' => :debug, - 'Profile' => :release, - 'Release' => :release, -} -def flutter_root - generated_xcode_build_settings_path = File.expand_path(File.join('..', 'Flutter', 'Generated.xcconfig'), __FILE__) - unless File.exist?(generated_xcode_build_settings_path) - raise "#{generated_xcode_build_settings_path} must exist. If you're running pod install manually, make sure flutter pub get is executed first" - end - - File.foreach(generated_xcode_build_settings_path) do |line| - matches = line.match(/FLUTTER_ROOT\=(.*)/) - return matches[1].strip if matches - end - raise "FLUTTER_ROOT not found in #{generated_xcode_build_settings_path}. Try deleting Generated.xcconfig, then run flutter pub get" -end - -require File.expand_path(File.join('packages', 'flutter_tools', 'bin', 'podhelper'), flutter_root) - -flutter_ios_podfile_setup - -target 'Runner' do - use_frameworks! - use_modular_headers! - - flutter_install_all_ios_pods File.dirname(File.realpath(__FILE__)) - target 'RunnerTests' do - inherit! :search_paths - end -end - -post_install do |installer| - # add these lines: - installer.pods_project.build_configurations.each do |config| - config.build_settings["EXCLUDED_ARCHS[sdk=*]"] = "armv7" - config.build_settings['IPHONEOS_DEPLOYMENT_TARGET'] = $iOSVersion - end - installer.pods_project.targets.each do |target| - flutter_additional_ios_build_settings(target) - # add these lines: - target.build_configurations.each do |config| - if Gem::Version.new($iOSVersion) > Gem::Version.new(config.build_settings['IPHONEOS_DEPLOYMENT_TARGET']) - config.build_settings['IPHONEOS_DEPLOYMENT_TARGET'] = $iOSVersion - end - end - end -end - diff --git a/apps/rider-archive-cubit/ios/Podfile.lock b/apps/rider-archive-cubit/ios/Podfile.lock deleted file mode 100644 index eab5b69..0000000 --- a/apps/rider-archive-cubit/ios/Podfile.lock +++ /dev/null @@ -1,164 +0,0 @@ -PODS: - - device_info_plus (0.0.1): - - Flutter - - Firebase/CoreOnly (12.15.0): - - FirebaseCore (~> 12.15.0) - - Firebase/Messaging (12.15.0): - - Firebase/CoreOnly - - FirebaseMessaging (~> 12.15.0) - - firebase_core (4.12.1): - - Firebase/CoreOnly (= 12.15.0) - - Flutter - - firebase_messaging (16.4.3): - - Firebase/Messaging (= 12.15.0) - - firebase_core - - Flutter - - FirebaseCore (12.15.0): - - FirebaseCoreInternal (~> 12.15.0) - - GoogleUtilities/Environment (~> 8.1) - - GoogleUtilities/Logger (~> 8.1) - - FirebaseCoreInternal (12.15.0): - - "GoogleUtilities/NSData+zlib (~> 8.1)" - - FirebaseInstallations (12.15.0): - - FirebaseCore (~> 12.15.0) - - GoogleUtilities/Environment (~> 8.1) - - GoogleUtilities/UserDefaults (~> 8.1) - - PromisesObjC (~> 2.4) - - FirebaseMessaging (12.15.0): - - FirebaseCore (~> 12.15.0) - - FirebaseInstallations (~> 12.15.0) - - GoogleDataTransport (~> 10.1) - - GoogleUtilities/AppDelegateSwizzler (~> 8.1) - - GoogleUtilities/Environment (~> 8.1) - - GoogleUtilities/Reachability (~> 8.1) - - GoogleUtilities/UserDefaults (~> 8.1) - - nanopb (~> 3.30910.0) - - Flutter (1.0.0) - - flutter_native_splash (2.4.3): - - Flutter - - flutter_secure_storage (6.0.0): - - Flutter - - geolocator_apple (1.2.0): - - Flutter - - FlutterMacOS - - GoogleDataTransport (10.1.0): - - nanopb (~> 3.30910.0) - - PromisesObjC (~> 2.4) - - GoogleUtilities/AppDelegateSwizzler (8.1.2): - - GoogleUtilities/Environment - - GoogleUtilities/Logger - - GoogleUtilities/Network - - GoogleUtilities/Privacy - - GoogleUtilities/Environment (8.1.2): - - GoogleUtilities/Privacy - - GoogleUtilities/Logger (8.1.2): - - GoogleUtilities/Environment - - GoogleUtilities/Privacy - - GoogleUtilities/Network (8.1.2): - - GoogleUtilities/Logger - - "GoogleUtilities/NSData+zlib" - - GoogleUtilities/Privacy - - GoogleUtilities/Reachability - - "GoogleUtilities/NSData+zlib (8.1.2)": - - GoogleUtilities/Privacy - - GoogleUtilities/Privacy (8.1.2) - - GoogleUtilities/Reachability (8.1.2): - - GoogleUtilities/Logger - - GoogleUtilities/Privacy - - GoogleUtilities/UserDefaults (8.1.2): - - GoogleUtilities/Logger - - GoogleUtilities/Privacy - - MapLibre (6.19.1) - - maplibre_gl (0.25.0): - - Flutter - - MapLibre (= 6.19.1) - - nanopb (3.30910.0): - - nanopb/decode (= 3.30910.0) - - nanopb/encode (= 3.30910.0) - - nanopb/decode (3.30910.0) - - nanopb/encode (3.30910.0) - - package_info_plus (0.4.5): - - Flutter - - permission_handler_apple (9.4.8): - - Flutter - - PromisesObjC (2.4.1) - - shared_preferences_foundation (0.0.1): - - Flutter - - FlutterMacOS - -DEPENDENCIES: - - device_info_plus (from `.symlinks/plugins/device_info_plus/ios`) - - firebase_core (from `.symlinks/plugins/firebase_core/ios`) - - firebase_messaging (from `.symlinks/plugins/firebase_messaging/ios`) - - Flutter (from `Flutter`) - - flutter_native_splash (from `.symlinks/plugins/flutter_native_splash/ios`) - - flutter_secure_storage (from `.symlinks/plugins/flutter_secure_storage/ios`) - - geolocator_apple (from `.symlinks/plugins/geolocator_apple/darwin`) - - maplibre_gl (from `.symlinks/plugins/maplibre_gl/ios`) - - package_info_plus (from `.symlinks/plugins/package_info_plus/ios`) - - permission_handler_apple (from `.symlinks/plugins/permission_handler_apple/ios`) - - shared_preferences_foundation (from `.symlinks/plugins/shared_preferences_foundation/darwin`) - -SPEC REPOS: - trunk: - - Firebase - - FirebaseCore - - FirebaseCoreInternal - - FirebaseInstallations - - FirebaseMessaging - - GoogleDataTransport - - GoogleUtilities - - MapLibre - - nanopb - - PromisesObjC - -EXTERNAL SOURCES: - device_info_plus: - :path: ".symlinks/plugins/device_info_plus/ios" - firebase_core: - :path: ".symlinks/plugins/firebase_core/ios" - firebase_messaging: - :path: ".symlinks/plugins/firebase_messaging/ios" - Flutter: - :path: Flutter - flutter_native_splash: - :path: ".symlinks/plugins/flutter_native_splash/ios" - flutter_secure_storage: - :path: ".symlinks/plugins/flutter_secure_storage/ios" - geolocator_apple: - :path: ".symlinks/plugins/geolocator_apple/darwin" - maplibre_gl: - :path: ".symlinks/plugins/maplibre_gl/ios" - package_info_plus: - :path: ".symlinks/plugins/package_info_plus/ios" - permission_handler_apple: - :path: ".symlinks/plugins/permission_handler_apple/ios" - shared_preferences_foundation: - :path: ".symlinks/plugins/shared_preferences_foundation/darwin" - -SPEC CHECKSUMS: - device_info_plus: 21fcca2080fbcd348be798aa36c3e5ed849eefbe - Firebase: a8539b633d474fbeb654c7043f9c1649e274045b - firebase_core: 1c1e250a77e2df9e80bb8bf0875c8b427044a697 - firebase_messaging: 90cf2b62f5058120ab19f29ceff1503ba0f51ba7 - FirebaseCore: 2e86a4ea1684d4381707069e4a6d89ac808e901e - FirebaseCoreInternal: 6ab6a02c94446c026d2cf35cf5383842ebaa4992 - FirebaseInstallations: eb29ccbf64eaedf86fd5b2ccc7fabde567660b52 - FirebaseMessaging: 40017d7bc8457ee295b0f41d480a80fdabc9994e - Flutter: cabc95a1d2626b1b06e7179b784ebcf0c0cde467 - flutter_native_splash: c32d145d68aeda5502d5f543ee38c192065986cf - flutter_secure_storage: 1ed9476fba7e7a782b22888f956cce43e2c62f13 - geolocator_apple: ab36aa0e8b7d7a2d7639b3b4e48308394e8cef5e - GoogleDataTransport: aae35b7ea0c09004c3797d53c8c41f66f219d6a7 - GoogleUtilities: 766ace00c6b10d8148408f329d10c4f051931850 - MapLibre: 7f24faba45439f80ccb0f83393c29fa32cb81952 - maplibre_gl: a2114567cbd1065866614fbd34dfb75ab782aaa2 - nanopb: fad817b59e0457d11a5dfbde799381cd727c1275 - package_info_plus: af8e2ca6888548050f16fa2f1938db7b5a5df499 - permission_handler_apple: 92d754bbaa7361d436db2d6c3c1c2a0fdcec462e - PromisesObjC: 752c3227f599e3467650e47ea36f433eeb10c273 - shared_preferences_foundation: 7036424c3d8ec98dfe75ff1667cb0cd531ec82bb - -PODFILE CHECKSUM: cd8e27edd15d1a27818927147375b1d9d700364a - -COCOAPODS: 1.16.2 diff --git a/apps/rider-archive-cubit/ios/Runner.xcodeproj/project.pbxproj b/apps/rider-archive-cubit/ios/Runner.xcodeproj/project.pbxproj deleted file mode 100644 index d6f57ea..0000000 --- a/apps/rider-archive-cubit/ios/Runner.xcodeproj/project.pbxproj +++ /dev/null @@ -1,842 +0,0 @@ -// !$*UTF8*$! -{ - archiveVersion = 1; - classes = { - }; - objectVersion = 54; - objects = { - -/* Begin PBXBuildFile section */ - 0E2EB9A18A85A8C79C1A5B17 /* Pods_RunnerTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 27958A27956787B6764BC14F /* Pods_RunnerTests.framework */; }; - 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */ = {isa = PBXBuildFile; fileRef = 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */; }; - 331C808B294A63AB00263BE5 /* RunnerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 331C807B294A618700263BE5 /* RunnerTests.swift */; }; - 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */ = {isa = PBXBuildFile; fileRef = 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */; }; - 74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 74858FAE1ED2DC5600515810 /* AppDelegate.swift */; }; - 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FA1CF9000F007C117D /* Main.storyboard */; }; - 97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FD1CF9000F007C117D /* Assets.xcassets */; }; - 97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */; }; - C60CA7372BE9EF38002095B2 /* GoogleService-Info.plist in Resources */ = {isa = PBXBuildFile; fileRef = C60CA7362BE9EF38002095B2 /* GoogleService-Info.plist */; }; - C6229B682D610CB20014397D /* JailbreakDetection.swift in Sources */ = {isa = PBXBuildFile; fileRef = C6229B672D610C970014397D /* JailbreakDetection.swift */; }; - C624C4642BD56D34002834AF /* tone1.mp3 in Resources */ = {isa = PBXBuildFile; fileRef = C624C45C2BD56D34002834AF /* tone1.mp3 */; }; - C624C4652BD56D34002834AF /* start.wav in Resources */ = {isa = PBXBuildFile; fileRef = C624C45D2BD56D34002834AF /* start.wav */; }; - C624C4672BD56D34002834AF /* promo.wav in Resources */ = {isa = PBXBuildFile; fileRef = C624C45F2BD56D34002834AF /* promo.wav */; }; - C624C4682BD56D34002834AF /* cancel.wav in Resources */ = {isa = PBXBuildFile; fileRef = C624C4602BD56D34002834AF /* cancel.wav */; }; - C628BC412C316B1200E4D33B /* ding.wav in Resources */ = {isa = PBXBuildFile; fileRef = C628BC402C316B1100E4D33B /* ding.wav */; }; - C6372AD92D81BDE000C44265 /* SecurityChecks.m in Sources */ = {isa = PBXBuildFile; fileRef = C6372AD82D81BDE000C44265 /* SecurityChecks.m */; }; - C6372ADF2D81C68C00C44265 /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = C6372ADE2D81C68700C44265 /* Localizable.strings */; }; - C6372AE42D81F10E00C44265 /* KeychainHelper.swift in Sources */ = {isa = PBXBuildFile; fileRef = C6372AE32D81F10A00C44265 /* KeychainHelper.swift */; }; - C6372AE62D82EB9C00C44265 /* Config.plist in Resources */ = {isa = PBXBuildFile; fileRef = C6372AE52D82EB9C00C44265 /* Config.plist */; }; - C6B15AA12B5FB24600746405 /* order.wav in Resources */ = {isa = PBXBuildFile; fileRef = C6B15A9F2B5FB24600746405 /* order.wav */; }; - C6B15AA22B5FB24600746405 /* tone2.wav in Resources */ = {isa = PBXBuildFile; fileRef = C6B15AA02B5FB24600746405 /* tone2.wav */; }; - C6B450142D67556C001427AA /* Constants1.swift in Sources */ = {isa = PBXBuildFile; fileRef = C6B450132D67556B001427AA /* Constants1.swift */; }; - D529E7C8240CCC30BB7358A2 /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3B099132D71B1299FCDFD9C8 /* Pods_Runner.framework */; }; -/* End PBXBuildFile section */ - -/* Begin PBXContainerItemProxy section */ - 331C8085294A63A400263BE5 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 97C146E61CF9000F007C117D /* Project object */; - proxyType = 1; - remoteGlobalIDString = 97C146ED1CF9000F007C117D; - remoteInfo = Runner; - }; -/* End PBXContainerItemProxy section */ - -/* Begin PBXCopyFilesBuildPhase section */ - 9705A1C41CF9048500538489 /* Embed Frameworks */ = { - isa = PBXCopyFilesBuildPhase; - buildActionMask = 2147483647; - dstPath = ""; - dstSubfolderSpec = 10; - files = ( - ); - name = "Embed Frameworks"; - runOnlyForDeploymentPostprocessing = 0; - }; - C6E5BC612DCFF5F800471574 /* Embed Foundation Extensions */ = { - isa = PBXCopyFilesBuildPhase; - buildActionMask = 2147483647; - dstPath = ""; - dstSubfolderSpec = 13; - files = ( - ); - name = "Embed Foundation Extensions"; - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXCopyFilesBuildPhase section */ - -/* Begin PBXFileReference section */ - 08CDD9E654C52E05FEE40E98 /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = ""; }; - 1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GeneratedPluginRegistrant.h; sourceTree = ""; }; - 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GeneratedPluginRegistrant.m; sourceTree = ""; }; - 27958A27956787B6764BC14F /* Pods_RunnerTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_RunnerTests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - 331C807B294A618700263BE5 /* RunnerTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RunnerTests.swift; sourceTree = ""; }; - 331C8081294A63A400263BE5 /* RunnerTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = RunnerTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; - 3B099132D71B1299FCDFD9C8 /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = AppFrameworkInfo.plist; path = Flutter/AppFrameworkInfo.plist; sourceTree = ""; }; - 42939EAD96568C1F3F0E8006 /* Pods-RunnerTests.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.profile.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.profile.xcconfig"; sourceTree = ""; }; - 43385D55BAC53942A4B30B22 /* Pods-RunnerTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.debug.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.debug.xcconfig"; sourceTree = ""; }; - 45F2ED245254D48D155DD716 /* Pods-RunnerTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.release.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.release.xcconfig"; sourceTree = ""; }; - 74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Runner-Bridging-Header.h"; sourceTree = ""; }; - 74858FAE1ED2DC5600515810 /* AppDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; - 7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = Release.xcconfig; path = Flutter/Release.xcconfig; sourceTree = ""; }; - 9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Debug.xcconfig; path = Flutter/Debug.xcconfig; sourceTree = ""; }; - 9740EEB31CF90195004384FC /* Generated.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Generated.xcconfig; path = Flutter/Generated.xcconfig; sourceTree = ""; }; - 97C146EE1CF9000F007C117D /* Runner.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Runner.app; sourceTree = BUILT_PRODUCTS_DIR; }; - 97C146FB1CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; - 97C146FD1CF9000F007C117D /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; - 97C147001CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; - 97C147021CF9000F007C117D /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - C60CA7362BE9EF38002095B2 /* GoogleService-Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = "GoogleService-Info.plist"; path = "GoogleService-Info.plist"; sourceTree = ""; }; - C6229B672D610C970014397D /* JailbreakDetection.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = JailbreakDetection.swift; sourceTree = ""; }; - C624C45C2BD56D34002834AF /* tone1.mp3 */ = {isa = PBXFileReference; lastKnownFileType = audio.mp3; name = tone1.mp3; path = ../../android/app/src/main/res/raw/tone1.mp3; sourceTree = ""; }; - C624C45D2BD56D34002834AF /* start.wav */ = {isa = PBXFileReference; lastKnownFileType = audio.wav; name = start.wav; path = ../../android/app/src/main/res/raw/start.wav; sourceTree = ""; }; - C624C45F2BD56D34002834AF /* promo.wav */ = {isa = PBXFileReference; lastKnownFileType = audio.wav; name = promo.wav; path = ../../android/app/src/main/res/raw/promo.wav; sourceTree = ""; }; - C624C4602BD56D34002834AF /* cancel.wav */ = {isa = PBXFileReference; lastKnownFileType = audio.wav; name = cancel.wav; path = ../../android/app/src/main/res/raw/cancel.wav; sourceTree = ""; }; - C628BC402C316B1100E4D33B /* ding.wav */ = {isa = PBXFileReference; lastKnownFileType = audio.wav; name = ding.wav; path = ../../android/app/src/main/res/raw/ding.wav; sourceTree = ""; }; - C6372AD72D81BDA900C44265 /* SecurityChecks.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = SecurityChecks.h; sourceTree = ""; }; - C6372AD82D81BDE000C44265 /* SecurityChecks.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = SecurityChecks.m; sourceTree = ""; }; - C6372ADE2D81C68700C44265 /* Localizable.strings */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; path = Localizable.strings; sourceTree = ""; }; - C6372AE32D81F10A00C44265 /* KeychainHelper.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KeychainHelper.swift; sourceTree = ""; }; - C6372AE52D82EB9C00C44265 /* Config.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Config.plist; sourceTree = ""; }; - C69588332A8C1F6B00C3AC67 /* Runner.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = Runner.entitlements; sourceTree = ""; }; - C6B15A9F2B5FB24600746405 /* order.wav */ = {isa = PBXFileReference; lastKnownFileType = audio.wav; path = order.wav; sourceTree = ""; }; - C6B15AA02B5FB24600746405 /* tone2.wav */ = {isa = PBXFileReference; lastKnownFileType = audio.wav; path = tone2.wav; sourceTree = ""; }; - C6B450132D67556B001427AA /* Constants1.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Constants1.swift; sourceTree = ""; }; - C6E5BC4C2DCFF5F600471574 /* WidgetKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = WidgetKit.framework; path = System/Library/Frameworks/WidgetKit.framework; sourceTree = SDKROOT; }; - C6E5BC4E2DCFF5F600471574 /* SwiftUI.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = SwiftUI.framework; path = System/Library/Frameworks/SwiftUI.framework; sourceTree = SDKROOT; }; - CAF37DC30C17166B851DBC8C /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = ""; }; - F231BA28015FE2C634809733 /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = ""; }; -/* End PBXFileReference section */ - -/* Begin PBXFrameworksBuildPhase section */ - 7AD318F74F39A70FCC91E66D /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - 0E2EB9A18A85A8C79C1A5B17 /* Pods_RunnerTests.framework in Frameworks */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 97C146EB1CF9000F007C117D /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - D529E7C8240CCC30BB7358A2 /* Pods_Runner.framework in Frameworks */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXFrameworksBuildPhase section */ - -/* Begin PBXGroup section */ - 331C8082294A63A400263BE5 /* RunnerTests */ = { - isa = PBXGroup; - children = ( - 331C807B294A618700263BE5 /* RunnerTests.swift */, - ); - path = RunnerTests; - sourceTree = ""; - }; - 5684D45491D29A320AB8001A /* Pods */ = { - isa = PBXGroup; - children = ( - 08CDD9E654C52E05FEE40E98 /* Pods-Runner.debug.xcconfig */, - F231BA28015FE2C634809733 /* Pods-Runner.release.xcconfig */, - CAF37DC30C17166B851DBC8C /* Pods-Runner.profile.xcconfig */, - 43385D55BAC53942A4B30B22 /* Pods-RunnerTests.debug.xcconfig */, - 45F2ED245254D48D155DD716 /* Pods-RunnerTests.release.xcconfig */, - 42939EAD96568C1F3F0E8006 /* Pods-RunnerTests.profile.xcconfig */, - ); - path = Pods; - sourceTree = ""; - }; - 9740EEB11CF90186004384FC /* Flutter */ = { - isa = PBXGroup; - children = ( - 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */, - 9740EEB21CF90195004384FC /* Debug.xcconfig */, - 7AFA3C8E1D35360C0083082E /* Release.xcconfig */, - 9740EEB31CF90195004384FC /* Generated.xcconfig */, - ); - name = Flutter; - sourceTree = ""; - }; - 97C146E51CF9000F007C117D = { - isa = PBXGroup; - children = ( - 9740EEB11CF90186004384FC /* Flutter */, - 97C146F01CF9000F007C117D /* Runner */, - 97C146EF1CF9000F007C117D /* Products */, - 331C8082294A63A400263BE5 /* RunnerTests */, - 5684D45491D29A320AB8001A /* Pods */, - B3041BA408DBB12F66846F39 /* Frameworks */, - ); - sourceTree = ""; - }; - 97C146EF1CF9000F007C117D /* Products */ = { - isa = PBXGroup; - children = ( - 97C146EE1CF9000F007C117D /* Runner.app */, - 331C8081294A63A400263BE5 /* RunnerTests.xctest */, - ); - name = Products; - sourceTree = ""; - }; - 97C146F01CF9000F007C117D /* Runner */ = { - isa = PBXGroup; - children = ( - C6372AE32D81F10A00C44265 /* KeychainHelper.swift */, - C6372ADE2D81C68700C44265 /* Localizable.strings */, - C6229B672D610C970014397D /* JailbreakDetection.swift */, - C6372AD72D81BDA900C44265 /* SecurityChecks.h */, - C6372AD82D81BDE000C44265 /* SecurityChecks.m */, - C69588332A8C1F6B00C3AC67 /* Runner.entitlements */, - C6B15A9F2B5FB24600746405 /* order.wav */, - C6B15AA02B5FB24600746405 /* tone2.wav */, - C624C4602BD56D34002834AF /* cancel.wav */, - C628BC402C316B1100E4D33B /* ding.wav */, - C624C45F2BD56D34002834AF /* promo.wav */, - C624C45D2BD56D34002834AF /* start.wav */, - C624C45C2BD56D34002834AF /* tone1.mp3 */, - 97C146FA1CF9000F007C117D /* Main.storyboard */, - 97C146FD1CF9000F007C117D /* Assets.xcassets */, - 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */, - 97C147021CF9000F007C117D /* Info.plist */, - C60CA7362BE9EF38002095B2 /* GoogleService-Info.plist */, - 1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */, - 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */, - 74858FAE1ED2DC5600515810 /* AppDelegate.swift */, - C6B450132D67556B001427AA /* Constants1.swift */, - 74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */, - C6372AE52D82EB9C00C44265 /* Config.plist */, - ); - path = Runner; - sourceTree = ""; - }; - B3041BA408DBB12F66846F39 /* Frameworks */ = { - isa = PBXGroup; - children = ( - 3B099132D71B1299FCDFD9C8 /* Pods_Runner.framework */, - 27958A27956787B6764BC14F /* Pods_RunnerTests.framework */, - C6E5BC4C2DCFF5F600471574 /* WidgetKit.framework */, - C6E5BC4E2DCFF5F600471574 /* SwiftUI.framework */, - ); - name = Frameworks; - sourceTree = ""; - }; -/* End PBXGroup section */ - -/* Begin PBXNativeTarget section */ - 331C8080294A63A400263BE5 /* RunnerTests */ = { - isa = PBXNativeTarget; - buildConfigurationList = 331C8087294A63A400263BE5 /* Build configuration list for PBXNativeTarget "RunnerTests" */; - buildPhases = ( - E21B2D2CCD3CE8A2142D0F2C /* [CP] Check Pods Manifest.lock */, - 331C807D294A63A400263BE5 /* Sources */, - 331C807F294A63A400263BE5 /* Resources */, - 7AD318F74F39A70FCC91E66D /* Frameworks */, - ); - buildRules = ( - ); - dependencies = ( - 331C8086294A63A400263BE5 /* PBXTargetDependency */, - ); - name = RunnerTests; - productName = RunnerTests; - productReference = 331C8081294A63A400263BE5 /* RunnerTests.xctest */; - productType = "com.apple.product-type.bundle.unit-test"; - }; - 97C146ED1CF9000F007C117D /* Runner */ = { - isa = PBXNativeTarget; - buildConfigurationList = 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */; - buildPhases = ( - 3F036A01BF594E9B01799541 /* [CP] Check Pods Manifest.lock */, - 9740EEB61CF901F6004384FC /* Run Script */, - 97C146EA1CF9000F007C117D /* Sources */, - 97C146EB1CF9000F007C117D /* Frameworks */, - 97C146EC1CF9000F007C117D /* Resources */, - 9705A1C41CF9048500538489 /* Embed Frameworks */, - 3B06AD1E1E4923F5004D2608 /* Thin Binary */, - 854CC60BC5A3FC7474EC1FBF /* [CP] Embed Pods Frameworks */, - 7ADB08D4DE3D2A2E09575068 /* [CP] Copy Pods Resources */, - C6E5BC612DCFF5F800471574 /* Embed Foundation Extensions */, - ); - buildRules = ( - ); - dependencies = ( - ); - name = Runner; - productName = Runner; - productReference = 97C146EE1CF9000F007C117D /* Runner.app */; - productType = "com.apple.product-type.application"; - }; -/* End PBXNativeTarget section */ - -/* Begin PBXProject section */ - 97C146E61CF9000F007C117D /* Project object */ = { - isa = PBXProject; - attributes = { - BuildIndependentTargetsInParallel = YES; - LastSwiftUpdateCheck = 1620; - LastUpgradeCheck = 1510; - ORGANIZATIONNAME = ""; - TargetAttributes = { - 331C8080294A63A400263BE5 = { - CreatedOnToolsVersion = 14.0; - TestTargetID = 97C146ED1CF9000F007C117D; - }; - 97C146ED1CF9000F007C117D = { - CreatedOnToolsVersion = 7.3.1; - LastSwiftMigration = 1100; - }; - }; - }; - buildConfigurationList = 97C146E91CF9000F007C117D /* Build configuration list for PBXProject "Runner" */; - compatibilityVersion = "Xcode 9.3"; - developmentRegion = en; - hasScannedForEncodings = 0; - knownRegions = ( - en, - Base, - ); - mainGroup = 97C146E51CF9000F007C117D; - productRefGroup = 97C146EF1CF9000F007C117D /* Products */; - projectDirPath = ""; - projectRoot = ""; - targets = ( - 97C146ED1CF9000F007C117D /* Runner */, - 331C8080294A63A400263BE5 /* RunnerTests */, - ); - }; -/* End PBXProject section */ - -/* Begin PBXResourcesBuildPhase section */ - 331C807F294A63A400263BE5 /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 97C146EC1CF9000F007C117D /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - C6B15AA22B5FB24600746405 /* tone2.wav in Resources */, - C624C4652BD56D34002834AF /* start.wav in Resources */, - C624C4672BD56D34002834AF /* promo.wav in Resources */, - 97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */, - C624C4682BD56D34002834AF /* cancel.wav in Resources */, - C6B15AA12B5FB24600746405 /* order.wav in Resources */, - C6372AE62D82EB9C00C44265 /* Config.plist in Resources */, - 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */, - C628BC412C316B1200E4D33B /* ding.wav in Resources */, - 97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */, - C6372ADF2D81C68C00C44265 /* Localizable.strings in Resources */, - C624C4642BD56D34002834AF /* tone1.mp3 in Resources */, - 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */, - C60CA7372BE9EF38002095B2 /* GoogleService-Info.plist in Resources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXResourcesBuildPhase section */ - -/* Begin PBXShellScriptBuildPhase section */ - 3B06AD1E1E4923F5004D2608 /* Thin Binary */ = { - isa = PBXShellScriptBuildPhase; - alwaysOutOfDate = 1; - buildActionMask = 2147483647; - files = ( - ); - inputPaths = ( - "${TARGET_BUILD_DIR}/${INFOPLIST_PATH}", - ); - name = "Thin Binary"; - outputPaths = ( - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" embed_and_thin"; - }; - 3F036A01BF594E9B01799541 /* [CP] Check Pods Manifest.lock */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputFileListPaths = ( - ); - inputPaths = ( - "${PODS_PODFILE_DIR_PATH}/Podfile.lock", - "${PODS_ROOT}/Manifest.lock", - ); - name = "[CP] Check Pods Manifest.lock"; - outputFileListPaths = ( - ); - outputPaths = ( - "$(DERIVED_FILE_DIR)/Pods-Runner-checkManifestLockResult.txt", - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; - showEnvVarsInLog = 0; - }; - 7ADB08D4DE3D2A2E09575068 /* [CP] Copy Pods Resources */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputFileListPaths = ( - "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-resources-${CONFIGURATION}-input-files.xcfilelist", - ); - name = "[CP] Copy Pods Resources"; - outputFileListPaths = ( - "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-resources-${CONFIGURATION}-output-files.xcfilelist", - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-resources.sh\"\n"; - showEnvVarsInLog = 0; - }; - 854CC60BC5A3FC7474EC1FBF /* [CP] Embed Pods Frameworks */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputFileListPaths = ( - "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-input-files.xcfilelist", - ); - name = "[CP] Embed Pods Frameworks"; - outputFileListPaths = ( - "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-output-files.xcfilelist", - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n"; - showEnvVarsInLog = 0; - }; - 9740EEB61CF901F6004384FC /* Run Script */ = { - isa = PBXShellScriptBuildPhase; - alwaysOutOfDate = 1; - buildActionMask = 2147483647; - files = ( - ); - inputPaths = ( - ); - name = "Run Script"; - outputPaths = ( - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" build"; - }; - E21B2D2CCD3CE8A2142D0F2C /* [CP] Check Pods Manifest.lock */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputFileListPaths = ( - ); - inputPaths = ( - "${PODS_PODFILE_DIR_PATH}/Podfile.lock", - "${PODS_ROOT}/Manifest.lock", - ); - name = "[CP] Check Pods Manifest.lock"; - outputFileListPaths = ( - ); - outputPaths = ( - "$(DERIVED_FILE_DIR)/Pods-RunnerTests-checkManifestLockResult.txt", - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; - showEnvVarsInLog = 0; - }; -/* End PBXShellScriptBuildPhase section */ - -/* Begin PBXSourcesBuildPhase section */ - 331C807D294A63A400263BE5 /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 331C808B294A63AB00263BE5 /* RunnerTests.swift in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 97C146EA1CF9000F007C117D /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - C6229B682D610CB20014397D /* JailbreakDetection.swift in Sources */, - C6372AE42D81F10E00C44265 /* KeychainHelper.swift in Sources */, - C6372AD92D81BDE000C44265 /* SecurityChecks.m in Sources */, - C6B450142D67556C001427AA /* Constants1.swift in Sources */, - 74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */, - 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXSourcesBuildPhase section */ - -/* Begin PBXTargetDependency section */ - 331C8086294A63A400263BE5 /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - target = 97C146ED1CF9000F007C117D /* Runner */; - targetProxy = 331C8085294A63A400263BE5 /* PBXContainerItemProxy */; - }; -/* End PBXTargetDependency section */ - -/* Begin PBXVariantGroup section */ - 97C146FA1CF9000F007C117D /* Main.storyboard */ = { - isa = PBXVariantGroup; - children = ( - 97C146FB1CF9000F007C117D /* Base */, - ); - name = Main.storyboard; - sourceTree = ""; - }; - 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */ = { - isa = PBXVariantGroup; - children = ( - 97C147001CF9000F007C117D /* Base */, - ); - name = LaunchScreen.storyboard; - sourceTree = ""; - }; -/* End PBXVariantGroup section */ - -/* Begin XCBuildConfiguration section */ - 249021D3217E4FDB00AE95B9 /* Profile */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - 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_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; - 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; - }; - 249021D4217E4FDB00AE95B9 /* Profile */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; - buildSettings = { - ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; - CLANG_ENABLE_MODULES = YES; - CODE_SIGN_ENTITLEMENTS = Runner/Runner.entitlements; - COPY_PHASE_STRIP = YES; - CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; - DEPLOYMENT_POSTPROCESSING = YES; - DEVELOPMENT_TEAM = 63CVT8G5P8; - ENABLE_BITCODE = NO; - INFOPLIST_FILE = Runner/Info.plist; - INFOPLIST_KEY_CFBundleDisplayName = Sefer; - INFOPLIST_KEY_LSApplicationCategoryType = "public.app-category.travel"; - LD_RUNPATH_SEARCH_PATHS = ( - "$(inherited)", - "@executable_path/Frameworks", - ); - PRODUCT_BUNDLE_IDENTIFIER = com.mobileapp.store.ride; - PRODUCT_NAME = "$(TARGET_NAME)"; - SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; - SWIFT_VERSION = 5.0; - VERSIONING_SYSTEM = "apple-generic"; - }; - name = Profile; - }; - 331C8088294A63A400263BE5 /* Debug */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 43385D55BAC53942A4B30B22 /* Pods-RunnerTests.debug.xcconfig */; - 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.mobileapp.store.ride.RunnerTests; - 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; - }; - 331C8089294A63A400263BE5 /* Release */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 45F2ED245254D48D155DD716 /* Pods-RunnerTests.release.xcconfig */; - 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.mobileapp.store.ride.RunnerTests; - PRODUCT_NAME = "$(TARGET_NAME)"; - SWIFT_VERSION = 5.0; - TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Runner.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/Runner"; - }; - name = Release; - }; - 331C808A294A63A400263BE5 /* Profile */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 42939EAD96568C1F3F0E8006 /* Pods-RunnerTests.profile.xcconfig */; - 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.mobileapp.store.ride.RunnerTests; - PRODUCT_NAME = "$(TARGET_NAME)"; - SWIFT_VERSION = 5.0; - TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Runner.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/Runner"; - }; - name = Profile; - }; - 97C147031CF9000F007C117D /* Debug */ = { - 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_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; - 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; - }; - 97C147041CF9000F007C117D /* Release */ = { - 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_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; - 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; - }; - 97C147061CF9000F007C117D /* Debug */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 9740EEB21CF90195004384FC /* Debug.xcconfig */; - buildSettings = { - ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; - CLANG_ENABLE_MODULES = YES; - CODE_SIGN_ENTITLEMENTS = Runner/Runner.entitlements; - COPY_PHASE_STRIP = YES; - CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; - DEPLOYMENT_POSTPROCESSING = YES; - DEVELOPMENT_TEAM = 63CVT8G5P8; - ENABLE_BITCODE = NO; - INFOPLIST_FILE = Runner/Info.plist; - INFOPLIST_KEY_CFBundleDisplayName = Sefer; - INFOPLIST_KEY_LSApplicationCategoryType = "public.app-category.travel"; - LD_RUNPATH_SEARCH_PATHS = ( - "$(inherited)", - "@executable_path/Frameworks", - ); - PRODUCT_BUNDLE_IDENTIFIER = com.mobileapp.store.ride; - PRODUCT_NAME = "$(TARGET_NAME)"; - SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; - SWIFT_OPTIMIZATION_LEVEL = "-Onone"; - SWIFT_VERSION = 5.0; - VERSIONING_SYSTEM = "apple-generic"; - }; - name = Debug; - }; - 97C147071CF9000F007C117D /* Release */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; - buildSettings = { - ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; - CLANG_ENABLE_MODULES = YES; - CODE_SIGN_ENTITLEMENTS = Runner/Runner.entitlements; - COPY_PHASE_STRIP = YES; - CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; - DEPLOYMENT_POSTPROCESSING = YES; - DEVELOPMENT_TEAM = 63CVT8G5P8; - ENABLE_BITCODE = NO; - INFOPLIST_FILE = Runner/Info.plist; - INFOPLIST_KEY_CFBundleDisplayName = Sefer; - INFOPLIST_KEY_LSApplicationCategoryType = "public.app-category.travel"; - LD_RUNPATH_SEARCH_PATHS = ( - "$(inherited)", - "@executable_path/Frameworks", - ); - PRODUCT_BUNDLE_IDENTIFIER = com.mobileapp.store.ride; - PRODUCT_NAME = "$(TARGET_NAME)"; - SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; - SWIFT_VERSION = 5.0; - VERSIONING_SYSTEM = "apple-generic"; - }; - name = Release; - }; -/* End XCBuildConfiguration section */ - -/* Begin XCConfigurationList section */ - 331C8087294A63A400263BE5 /* Build configuration list for PBXNativeTarget "RunnerTests" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 331C8088294A63A400263BE5 /* Debug */, - 331C8089294A63A400263BE5 /* Release */, - 331C808A294A63A400263BE5 /* Profile */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - 97C146E91CF9000F007C117D /* Build configuration list for PBXProject "Runner" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 97C147031CF9000F007C117D /* Debug */, - 97C147041CF9000F007C117D /* Release */, - 249021D3217E4FDB00AE95B9 /* Profile */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 97C147061CF9000F007C117D /* Debug */, - 97C147071CF9000F007C117D /* Release */, - 249021D4217E4FDB00AE95B9 /* Profile */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; -/* End XCConfigurationList section */ - }; - rootObject = 97C146E61CF9000F007C117D /* Project object */; -} diff --git a/apps/rider-archive-cubit/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/apps/rider-archive-cubit/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata deleted file mode 100644 index 919434a..0000000 --- a/apps/rider-archive-cubit/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata +++ /dev/null @@ -1,7 +0,0 @@ - - - - - diff --git a/apps/rider-archive-cubit/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/apps/rider-archive-cubit/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist deleted file mode 100644 index 18d9810..0000000 --- a/apps/rider-archive-cubit/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist +++ /dev/null @@ -1,8 +0,0 @@ - - - - - IDEDidComputeMac32BitWarning - - - diff --git a/apps/rider-archive-cubit/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings b/apps/rider-archive-cubit/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings deleted file mode 100644 index f9b0d7c..0000000 --- a/apps/rider-archive-cubit/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings +++ /dev/null @@ -1,8 +0,0 @@ - - - - - PreviewsEnabled - - - diff --git a/apps/rider-archive-cubit/ios/Runner.xcodeproj/xcshareddata/xcschemes/MyWidgetHome1Extension.xcscheme b/apps/rider-archive-cubit/ios/Runner.xcodeproj/xcshareddata/xcschemes/MyWidgetHome1Extension.xcscheme deleted file mode 100644 index 56fcbd2..0000000 --- a/apps/rider-archive-cubit/ios/Runner.xcodeproj/xcshareddata/xcschemes/MyWidgetHome1Extension.xcscheme +++ /dev/null @@ -1,129 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/apps/rider-archive-cubit/ios/Runner.xcodeproj/xcshareddata/xcschemes/MyWidgetHomeExtension.xcscheme b/apps/rider-archive-cubit/ios/Runner.xcodeproj/xcshareddata/xcschemes/MyWidgetHomeExtension.xcscheme deleted file mode 100644 index 2c79358..0000000 --- a/apps/rider-archive-cubit/ios/Runner.xcodeproj/xcshareddata/xcschemes/MyWidgetHomeExtension.xcscheme +++ /dev/null @@ -1,114 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/apps/rider-archive-cubit/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/apps/rider-archive-cubit/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme deleted file mode 100644 index e3773d4..0000000 --- a/apps/rider-archive-cubit/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +++ /dev/null @@ -1,101 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/apps/rider-archive-cubit/ios/Runner.xcworkspace/contents.xcworkspacedata b/apps/rider-archive-cubit/ios/Runner.xcworkspace/contents.xcworkspacedata deleted file mode 100644 index 21a3cc1..0000000 --- a/apps/rider-archive-cubit/ios/Runner.xcworkspace/contents.xcworkspacedata +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - - diff --git a/apps/rider-archive-cubit/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/apps/rider-archive-cubit/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist deleted file mode 100644 index 18d9810..0000000 --- a/apps/rider-archive-cubit/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist +++ /dev/null @@ -1,8 +0,0 @@ - - - - - IDEDidComputeMac32BitWarning - - - diff --git a/apps/rider-archive-cubit/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings b/apps/rider-archive-cubit/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings deleted file mode 100644 index f9b0d7c..0000000 --- a/apps/rider-archive-cubit/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings +++ /dev/null @@ -1,8 +0,0 @@ - - - - - PreviewsEnabled - - - diff --git a/apps/rider-archive-cubit/ios/Runner/AppDelegate.swift b/apps/rider-archive-cubit/ios/Runner/AppDelegate.swift deleted file mode 100644 index 2fd6003..0000000 --- a/apps/rider-archive-cubit/ios/Runner/AppDelegate.swift +++ /dev/null @@ -1,139 +0,0 @@ - -import UIKit -import Flutter -import FirebaseCore -@main -@objc class AppDelegate: FlutterAppDelegate { - - override func application( - _ application: UIApplication, - didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]? - ) -> Bool { - - FirebaseApp.configure() - GeneratedPluginRegistrant.register(with: self) - - // Perform security checks *before* showing the main UI - if SecurityChecks.isDeviceCompromised() { // Call Objective-C method - showSecurityAlert() - return false // Prevent app from launching further - } - //setup method channel - setupMethodChannel() - - return super.application(application, didFinishLaunchingWithOptions: launchOptions) - } - - func setupMethodChannel(){ - guard let controller = window?.rootViewController as? FlutterViewController else { - return - } - - let channel = FlutterMethodChannel(name: "com.mobileapp.store.ride/security", - binaryMessenger: controller.binaryMessenger) - channel.setMethodCallHandler { call, result in - switch call.method { - case "isNativeRooted": - // We already check this in isDeviceCompromised, - // so we can just return the result directly. - result(SecurityChecks.isDeviceCompromised()) - default: - result(FlutterMethodNotImplemented) - } - - } - } - - func showSecurityAlert() { - guard let rootVC = UIApplication.shared.keyWindow?.rootViewController else { - // Handle the case where rootVC is nil (extremely unlikely, but good practice) - exit(0) -// return - } - - let alert = UIAlertController( - title: "Security Warning".localized, // Use localized strings! - message: "Compromised device detected. Exiting.".localized, - preferredStyle: .alert - ) - - // Add an "OK" button with an obfuscated action - alert.addAction(UIAlertAction(title: "OK".localized, style: .destructive) { _ in - // More robust exit (see explanation below) - self.obfuscatedExit() - }) - - // Use a presentationDetents to prevent dismissing - if #available(iOS 15.0, *) { - alert.popoverPresentationController?.sourceView = rootVC.view - alert.popoverPresentationController?.sourceRect = CGRect(x: rootVC.view.bounds.midX, y: rootVC.view.bounds.midY, width: 0, height: 0) - alert.popoverPresentationController?.permittedArrowDirections = [] - alert.presentationController?.delegate = self - if let presentationController = alert.presentationController as? UISheetPresentationController { - presentationController.detents = [.medium()] // Set a fixed height if desired - presentationController.preferredCornerRadius = 20; - presentationController.prefersEdgeAttachedInCompactHeight = true;// Set corner radius - presentationController.prefersGrabberVisible = false // Optional: show a grabber - } - - } else { - // Fallback on earlier versions - } - - rootVC.present(alert, animated: true, completion: nil) - } - - // Obfuscated Exit (Example - you'll need a more robust solution) - func obfuscatedExit() { - // This is a *very* basic example. A real obfuscation would be MUCH more complex. - let selector = NSSelectorFromString(String(format: "%@%@", "ex", "it:")) - if responds(to: selector) { - perform(selector, with: 0) // Call exit(0) indirectly - } - } - - // MARK: - Secure API Key Storage (Example) - func getAPIKey() -> String { - // DO NOT store API keys directly in your code! - // Load it from a more secure location, such as: - // 1. A configuration file that is *not* checked into source control. - // 2. Keychain Services (recommended for iOS). - // 3. A backend server (best option). - - // This is just a placeholder. Replace with your actual key loading. - // In a real app, you'd fetch this from a secure source. - guard let filePath = Bundle.main.path(forResource: "keys", ofType: "plist"), - let plist = NSDictionary(contentsOfFile: filePath), - let apiKey = plist["google_maps_api_key"] as? String else { - fatalError("Couldn't find keys or API Key") // Ensure a crash if not found - } - - return apiKey - } - func loadConfig() -> [String: Any]? { - guard let path = Bundle.main.path(forResource: "Config", ofType: "plist"), - let config = NSDictionary(contentsOfFile: path) as? [String: Any] else { - return nil // Or handle the error appropriately - } - return config - } - - -} -// Add for prevent dismissing -extension AppDelegate: UIAdaptivePresentationControllerDelegate { - func presentationControllerShouldDismiss(_ presentationController: UIPresentationController) -> Bool { - return false - } - - func presentationControllerDidAttemptToDismiss(_ presentationController: UIPresentationController) { - - } -} - -// Add String extension -extension String { - var localized: String { - return NSLocalizedString(self, tableName: nil, bundle: Bundle.main, value: "", comment: "") - } -} diff --git a/apps/rider-archive-cubit/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json b/apps/rider-archive-cubit/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json deleted file mode 100644 index be71788..0000000 --- a/apps/rider-archive-cubit/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json +++ /dev/null @@ -1,158 +0,0 @@ -{ - "images": [ - { - "size": "20x20", - "idiom": "iphone", - "filename": "Icon-App-20x20@2x.png", - "scale": "2x" - }, - { - "size": "20x20", - "idiom": "iphone", - "filename": "Icon-App-20x20@3x.png", - "scale": "3x" - }, - { - "size": "29x29", - "idiom": "iphone", - "filename": "Icon-App-29x29@1x.png", - "scale": "1x" - }, - { - "size": "29x29", - "idiom": "iphone", - "filename": "Icon-App-29x29@2x.png", - "scale": "2x" - }, - { - "size": "29x29", - "idiom": "iphone", - "filename": "Icon-App-29x29@3x.png", - "scale": "3x" - }, - { - "size": "40x40", - "idiom": "iphone", - "filename": "Icon-App-40x40@2x.png", - "scale": "2x" - }, - { - "size": "40x40", - "idiom": "iphone", - "filename": "Icon-App-40x40@3x.png", - "scale": "3x" - }, - { - "size": "57x57", - "idiom": "iphone", - "filename": "Icon-App-57x57@1x.png", - "scale": "1x" - }, - { - "size": "57x57", - "idiom": "iphone", - "filename": "Icon-App-57x57@2x.png", - "scale": "2x" - }, - { - "size": "60x60", - "idiom": "iphone", - "filename": "Icon-App-60x60@2x.png", - "scale": "2x" - }, - { - "size": "60x60", - "idiom": "iphone", - "filename": "Icon-App-60x60@3x.png", - "scale": "3x" - }, - { - "size": "20x20", - "idiom": "ipad", - "filename": "Icon-App-20x20@1x.png", - "scale": "1x" - }, - { - "size": "20x20", - "idiom": "ipad", - "filename": "Icon-App-20x20@2x.png", - "scale": "2x" - }, - { - "size": "29x29", - "idiom": "ipad", - "filename": "Icon-App-29x29@1x.png", - "scale": "1x" - }, - { - "size": "29x29", - "idiom": "ipad", - "filename": "Icon-App-29x29@2x.png", - "scale": "2x" - }, - { - "size": "40x40", - "idiom": "ipad", - "filename": "Icon-App-40x40@1x.png", - "scale": "1x" - }, - { - "size": "40x40", - "idiom": "ipad", - "filename": "Icon-App-40x40@2x.png", - "scale": "2x" - }, - { - "size": "50x50", - "idiom": "ipad", - "filename": "Icon-App-50x50@1x.png", - "scale": "1x" - }, - { - "size": "50x50", - "idiom": "ipad", - "filename": "Icon-App-50x50@2x.png", - "scale": "2x" - }, - { - "size": "72x72", - "idiom": "ipad", - "filename": "Icon-App-72x72@1x.png", - "scale": "1x" - }, - { - "size": "72x72", - "idiom": "ipad", - "filename": "Icon-App-72x72@2x.png", - "scale": "2x" - }, - { - "size": "76x76", - "idiom": "ipad", - "filename": "Icon-App-76x76@1x.png", - "scale": "1x" - }, - { - "size": "76x76", - "idiom": "ipad", - "filename": "Icon-App-76x76@2x.png", - "scale": "2x" - }, - { - "size": "83.5x83.5", - "idiom": "ipad", - "filename": "Icon-App-83.5x83.5@2x.png", - "scale": "2x" - }, - { - "size": "1024x1024", - "idiom": "ios-marketing", - "filename": "Icon-App-1024x1024@1x.png", - "scale": "1x" - } - ], - "info": { - "version": 1, - "author": "xcode" - } -} \ No newline at end of file diff --git a/apps/rider-archive-cubit/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png b/apps/rider-archive-cubit/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png deleted file mode 100644 index cb46088..0000000 Binary files a/apps/rider-archive-cubit/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png and /dev/null differ diff --git a/apps/rider-archive-cubit/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png b/apps/rider-archive-cubit/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png deleted file mode 100644 index 36f3434..0000000 Binary files a/apps/rider-archive-cubit/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png and /dev/null differ diff --git a/apps/rider-archive-cubit/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png b/apps/rider-archive-cubit/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png deleted file mode 100644 index d34f885..0000000 Binary files a/apps/rider-archive-cubit/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png and /dev/null differ diff --git a/apps/rider-archive-cubit/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png b/apps/rider-archive-cubit/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png deleted file mode 100644 index 3f24811..0000000 Binary files a/apps/rider-archive-cubit/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png and /dev/null differ diff --git a/apps/rider-archive-cubit/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png b/apps/rider-archive-cubit/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png deleted file mode 100644 index 844093e..0000000 Binary files a/apps/rider-archive-cubit/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png and /dev/null differ diff --git a/apps/rider-archive-cubit/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png b/apps/rider-archive-cubit/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png deleted file mode 100644 index 5620f77..0000000 Binary files a/apps/rider-archive-cubit/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png and /dev/null differ diff --git a/apps/rider-archive-cubit/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png b/apps/rider-archive-cubit/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png deleted file mode 100644 index 6654589..0000000 Binary files a/apps/rider-archive-cubit/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png and /dev/null differ diff --git a/apps/rider-archive-cubit/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png b/apps/rider-archive-cubit/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png deleted file mode 100644 index d34f885..0000000 Binary files a/apps/rider-archive-cubit/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png and /dev/null differ diff --git a/apps/rider-archive-cubit/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png b/apps/rider-archive-cubit/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png deleted file mode 100644 index 2cde9d8..0000000 Binary files a/apps/rider-archive-cubit/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png and /dev/null differ diff --git a/apps/rider-archive-cubit/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png b/apps/rider-archive-cubit/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png deleted file mode 100644 index 2f0d4d8..0000000 Binary files a/apps/rider-archive-cubit/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png and /dev/null differ diff --git a/apps/rider-archive-cubit/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-50x50@1x.png b/apps/rider-archive-cubit/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-50x50@1x.png deleted file mode 100644 index 83c8425..0000000 Binary files a/apps/rider-archive-cubit/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-50x50@1x.png and /dev/null differ diff --git a/apps/rider-archive-cubit/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-50x50@2x.png b/apps/rider-archive-cubit/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-50x50@2x.png deleted file mode 100644 index cfc89be..0000000 Binary files a/apps/rider-archive-cubit/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-50x50@2x.png and /dev/null differ diff --git a/apps/rider-archive-cubit/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-57x57@1x.png b/apps/rider-archive-cubit/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-57x57@1x.png deleted file mode 100644 index 0e71812..0000000 Binary files a/apps/rider-archive-cubit/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-57x57@1x.png and /dev/null differ diff --git a/apps/rider-archive-cubit/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-57x57@2x.png b/apps/rider-archive-cubit/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-57x57@2x.png deleted file mode 100644 index 7310a1f..0000000 Binary files a/apps/rider-archive-cubit/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-57x57@2x.png and /dev/null differ diff --git a/apps/rider-archive-cubit/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png b/apps/rider-archive-cubit/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png deleted file mode 100644 index 2f0d4d8..0000000 Binary files a/apps/rider-archive-cubit/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png and /dev/null differ diff --git a/apps/rider-archive-cubit/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png b/apps/rider-archive-cubit/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png deleted file mode 100644 index c18828b..0000000 Binary files a/apps/rider-archive-cubit/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png and /dev/null differ diff --git a/apps/rider-archive-cubit/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-72x72@1x.png b/apps/rider-archive-cubit/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-72x72@1x.png deleted file mode 100644 index 5f35220..0000000 Binary files a/apps/rider-archive-cubit/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-72x72@1x.png and /dev/null differ diff --git a/apps/rider-archive-cubit/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-72x72@2x.png b/apps/rider-archive-cubit/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-72x72@2x.png deleted file mode 100644 index 7514dfe..0000000 Binary files a/apps/rider-archive-cubit/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-72x72@2x.png and /dev/null differ diff --git a/apps/rider-archive-cubit/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png b/apps/rider-archive-cubit/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png deleted file mode 100644 index 8dbb617..0000000 Binary files a/apps/rider-archive-cubit/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png and /dev/null differ diff --git a/apps/rider-archive-cubit/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png b/apps/rider-archive-cubit/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png deleted file mode 100644 index 4f8bef7..0000000 Binary files a/apps/rider-archive-cubit/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png and /dev/null differ diff --git a/apps/rider-archive-cubit/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png b/apps/rider-archive-cubit/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png deleted file mode 100644 index 184dc96..0000000 Binary files a/apps/rider-archive-cubit/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png and /dev/null differ diff --git a/apps/rider-archive-cubit/ios/Runner/Assets.xcassets/Contents.json b/apps/rider-archive-cubit/ios/Runner/Assets.xcassets/Contents.json deleted file mode 100644 index 73c0059..0000000 --- a/apps/rider-archive-cubit/ios/Runner/Assets.xcassets/Contents.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "info" : { - "author" : "xcode", - "version" : 1 - } -} diff --git a/apps/rider-archive-cubit/ios/Runner/Assets.xcassets/LaunchBackground.imageset/Contents.json b/apps/rider-archive-cubit/ios/Runner/Assets.xcassets/LaunchBackground.imageset/Contents.json deleted file mode 100644 index 9f447e1..0000000 --- a/apps/rider-archive-cubit/ios/Runner/Assets.xcassets/LaunchBackground.imageset/Contents.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "images" : [ - { - "filename" : "background.png", - "idiom" : "universal", - "scale" : "1x" - }, - { - "idiom" : "universal", - "scale" : "2x" - }, - { - "idiom" : "universal", - "scale" : "3x" - } - ], - "info" : { - "author" : "xcode", - "version" : 1 - } -} diff --git a/apps/rider-archive-cubit/ios/Runner/Assets.xcassets/LaunchBackground.imageset/background.png b/apps/rider-archive-cubit/ios/Runner/Assets.xcassets/LaunchBackground.imageset/background.png deleted file mode 100644 index 8e21404..0000000 Binary files a/apps/rider-archive-cubit/ios/Runner/Assets.xcassets/LaunchBackground.imageset/background.png and /dev/null differ diff --git a/apps/rider-archive-cubit/ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json b/apps/rider-archive-cubit/ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json deleted file mode 100644 index 00cabce..0000000 --- a/apps/rider-archive-cubit/ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "images" : [ - { - "filename" : "LaunchImage.png", - "idiom" : "universal", - "scale" : "1x" - }, - { - "filename" : "LaunchImage@2x.png", - "idiom" : "universal", - "scale" : "2x" - }, - { - "filename" : "LaunchImage@3x.png", - "idiom" : "universal", - "scale" : "3x" - } - ], - "info" : { - "author" : "xcode", - "version" : 1 - } -} diff --git a/apps/rider-archive-cubit/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png b/apps/rider-archive-cubit/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png deleted file mode 100644 index 6694368..0000000 Binary files a/apps/rider-archive-cubit/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png and /dev/null differ diff --git a/apps/rider-archive-cubit/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png b/apps/rider-archive-cubit/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png deleted file mode 100644 index 769f7c4..0000000 Binary files a/apps/rider-archive-cubit/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png and /dev/null differ diff --git a/apps/rider-archive-cubit/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png b/apps/rider-archive-cubit/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png deleted file mode 100644 index 5fd14db..0000000 Binary files a/apps/rider-archive-cubit/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png and /dev/null differ diff --git a/apps/rider-archive-cubit/ios/Runner/Assets.xcassets/icon_share.imageset/Contents.json b/apps/rider-archive-cubit/ios/Runner/Assets.xcassets/icon_share.imageset/Contents.json deleted file mode 100644 index 028dbdf..0000000 --- a/apps/rider-archive-cubit/ios/Runner/Assets.xcassets/icon_share.imageset/Contents.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "images" : [ - { - "filename" : "icon_share.png", - "idiom" : "universal", - "scale" : "1x" - }, - { - "idiom" : "universal", - "scale" : "2x" - }, - { - "idiom" : "universal", - "scale" : "3x" - } - ], - "info" : { - "author" : "xcode", - "version" : 1 - } -} diff --git a/apps/rider-archive-cubit/ios/Runner/Assets.xcassets/icon_share.imageset/icon_share.png b/apps/rider-archive-cubit/ios/Runner/Assets.xcassets/icon_share.imageset/icon_share.png deleted file mode 100644 index ae92be6..0000000 Binary files a/apps/rider-archive-cubit/ios/Runner/Assets.xcassets/icon_share.imageset/icon_share.png and /dev/null differ diff --git a/apps/rider-archive-cubit/ios/Runner/Assets.xcassets/icon_support.imageset/Contents.json b/apps/rider-archive-cubit/ios/Runner/Assets.xcassets/icon_support.imageset/Contents.json deleted file mode 100644 index cc0fc26..0000000 --- a/apps/rider-archive-cubit/ios/Runner/Assets.xcassets/icon_support.imageset/Contents.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "images" : [ - { - "filename" : "icon_support.png", - "idiom" : "universal", - "scale" : "1x" - }, - { - "idiom" : "universal", - "scale" : "2x" - }, - { - "idiom" : "universal", - "scale" : "3x" - } - ], - "info" : { - "author" : "xcode", - "version" : 1 - } -} diff --git a/apps/rider-archive-cubit/ios/Runner/Assets.xcassets/icon_support.imageset/icon_support.png b/apps/rider-archive-cubit/ios/Runner/Assets.xcassets/icon_support.imageset/icon_support.png deleted file mode 100644 index 5a9fef9..0000000 Binary files a/apps/rider-archive-cubit/ios/Runner/Assets.xcassets/icon_support.imageset/icon_support.png and /dev/null differ diff --git a/apps/rider-archive-cubit/ios/Runner/Assets.xcassets/icon_user.imageset/Contents.json b/apps/rider-archive-cubit/ios/Runner/Assets.xcassets/icon_user.imageset/Contents.json deleted file mode 100644 index 32ae8f7..0000000 --- a/apps/rider-archive-cubit/ios/Runner/Assets.xcassets/icon_user.imageset/Contents.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "images" : [ - { - "filename" : "icon_user.png", - "idiom" : "universal", - "scale" : "1x" - }, - { - "idiom" : "universal", - "scale" : "2x" - }, - { - "idiom" : "universal", - "scale" : "3x" - } - ], - "info" : { - "author" : "xcode", - "version" : 1 - } -} diff --git a/apps/rider-archive-cubit/ios/Runner/Assets.xcassets/icon_user.imageset/icon_user.png b/apps/rider-archive-cubit/ios/Runner/Assets.xcassets/icon_user.imageset/icon_user.png deleted file mode 100644 index c8802f2..0000000 Binary files a/apps/rider-archive-cubit/ios/Runner/Assets.xcassets/icon_user.imageset/icon_user.png and /dev/null differ diff --git a/apps/rider-archive-cubit/ios/Runner/Assets.xcassets/icon_wallet.imageset/Contents.json b/apps/rider-archive-cubit/ios/Runner/Assets.xcassets/icon_wallet.imageset/Contents.json deleted file mode 100644 index 3800eed..0000000 --- a/apps/rider-archive-cubit/ios/Runner/Assets.xcassets/icon_wallet.imageset/Contents.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "images" : [ - { - "filename" : "icon_wallet.png", - "idiom" : "universal", - "scale" : "1x" - }, - { - "idiom" : "universal", - "scale" : "2x" - }, - { - "idiom" : "universal", - "scale" : "3x" - } - ], - "info" : { - "author" : "xcode", - "version" : 1 - } -} diff --git a/apps/rider-archive-cubit/ios/Runner/Assets.xcassets/icon_wallet.imageset/icon_wallet.png b/apps/rider-archive-cubit/ios/Runner/Assets.xcassets/icon_wallet.imageset/icon_wallet.png deleted file mode 100644 index 551f8a4..0000000 Binary files a/apps/rider-archive-cubit/ios/Runner/Assets.xcassets/icon_wallet.imageset/icon_wallet.png and /dev/null differ diff --git a/apps/rider-archive-cubit/ios/Runner/Base.lproj/LaunchScreen.storyboard b/apps/rider-archive-cubit/ios/Runner/Base.lproj/LaunchScreen.storyboard deleted file mode 100644 index 6f0f33c..0000000 --- a/apps/rider-archive-cubit/ios/Runner/Base.lproj/LaunchScreen.storyboard +++ /dev/null @@ -1,44 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/apps/rider-archive-cubit/ios/Runner/Base.lproj/Main.storyboard b/apps/rider-archive-cubit/ios/Runner/Base.lproj/Main.storyboard deleted file mode 100644 index f3c2851..0000000 --- a/apps/rider-archive-cubit/ios/Runner/Base.lproj/Main.storyboard +++ /dev/null @@ -1,26 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/apps/rider-archive-cubit/ios/Runner/Config.plist b/apps/rider-archive-cubit/ios/Runner/Config.plist deleted file mode 100644 index 508df79..0000000 --- a/apps/rider-archive-cubit/ios/Runner/Config.plist +++ /dev/null @@ -1,10 +0,0 @@ - - - - - APIKey - AIzaSyCf2mW2h0HD8ZYjwh4VOa2ladw6MJkCDTM - Environment - development - - diff --git a/apps/rider-archive-cubit/ios/Runner/Constants1.swift b/apps/rider-archive-cubit/ios/Runner/Constants1.swift deleted file mode 100644 index e240caa..0000000 --- a/apps/rider-archive-cubit/ios/Runner/Constants1.swift +++ /dev/null @@ -1,12 +0,0 @@ -// -// Constants1.swift -// Runner -// -// Created by Hamza Aleghwairyeen on 20/02/2025. -// - -import Foundation - -struct Constants { - static let googleMapsAPIKey = "AIzaSyD0a1b2c3d4e5f6g7h8i9j0k1l2m3n4o5p6q" -} diff --git a/apps/rider-archive-cubit/ios/Runner/Info.plist b/apps/rider-archive-cubit/ios/Runner/Info.plist deleted file mode 100644 index 31e941a..0000000 --- a/apps/rider-archive-cubit/ios/Runner/Info.plist +++ /dev/null @@ -1,103 +0,0 @@ - - - - - LSApplicationQueriesSchemes - - googlechromes - comgooglemaps - - NSContactsUsageDescription - This app requires contacts access to function properly. - LSMinimumSystemVersion - 12.0 - CFBundleURLTypes - - - CFBundleTypeRole - Editor - CFBundleURLSchemes - - com.googleusercontent.apps.594687661098-8e26699cris2k3nj5msj1osi59it9kpf - - - - CADisableMinimumFrameDurationOnPhone - - CFBundleDevelopmentRegion - $(DEVELOPMENT_LANGUAGE) - CFBundleDisplayName - Tripz - CFBundleExecutable - $(EXECUTABLE_NAME) - CFBundleGetInfoString - - CFBundleIdentifier - $(PRODUCT_BUNDLE_IDENTIFIER) - CFBundleInfoDictionaryVersion - 6.0 - CFBundleName - Tripz - CFBundlePackageType - APPL - CFBundleShortVersionString - 106 - CFBundleSignature - ???? - CFBundleVersion - 5.0.996 - NSHumanReadableCopyright - - FirebaseAppDelegateProxyEnabled - NO - GMSApiKey - YOUR_API_KEY - LSApplicationCategoryType - - LSRequiresIPhoneOS - - NSCameraUsageDescription - Sovo app requires access to your camera in order to scan QR codes and capture images for uploading and access to connect to a call. - NSFaceIDUsageDescription - Use Face ID to securely authenticate payment accounts. - NSLocationAlwaysAndWhenInUseUsageDescription - This app needs access to your location to provide you with the best ride experience. Your location data will be used to find the nearest available cars and connect you with the closest captain for efficient and convenient rides. - NSLocationAlwaysUsageDescription - This app needs access to location. - NSLocationWhenInUseUsageDescription - This app needs access to your location to provide you with the best ride experience. Your location data will be used to find the nearest available cars and connect you with the closest captain for efficient and convenient rides. - NSMicrophoneUsageDescription - This app requires access to your microphone to record audio, allowing you to add voice recordings to your photos and videos and access to connect to a call. - NSPhotoLibraryUsageDescription - Explanation of why your app needs access to the photo library. - UIApplicationSupportsIndirectInputEvents - - UIBackgroundModes - - fetch - location - remote-notification - - UILaunchStoryboardName - LaunchScreen - UIMainStoryboardFile - Main - UISupportedInterfaceOrientations - - UIInterfaceOrientationPortrait - UIInterfaceOrientationLandscapeLeft - UIInterfaceOrientationLandscapeRight - - UISupportedInterfaceOrientations~ipad - - UIInterfaceOrientationPortrait - UIInterfaceOrientationPortraitUpsideDown - UIInterfaceOrientationLandscapeLeft - UIInterfaceOrientationLandscapeRight - - UIViewControllerBasedStatusBarAppearance - - UIStatusBarHidden - - - diff --git a/apps/rider-archive-cubit/ios/Runner/JailbreakDetection.swift b/apps/rider-archive-cubit/ios/Runner/JailbreakDetection.swift deleted file mode 100644 index 504e30e..0000000 --- a/apps/rider-archive-cubit/ios/Runner/JailbreakDetection.swift +++ /dev/null @@ -1,25 +0,0 @@ -// -// JailbreakDetection.swift -// Runner -// -// Created by Hamza Aleghwairyeen on 15/02/2025. -// - -import Foundation - -class JailbreakDetection { - static func isJailbroken() -> Bool { - let paths = [ - "/Applications/Cydia.app", - "/Library/MobileSubstrate/MobileSubstrate.dylib", - "/usr/sbin/sshd", - "/etc/apt" - ] - for path in paths { - if FileManager.default.fileExists(atPath: path) { - return true - } - } - return false - } -} diff --git a/apps/rider-archive-cubit/ios/Runner/KeychainHelper.swift b/apps/rider-archive-cubit/ios/Runner/KeychainHelper.swift deleted file mode 100644 index 8e62bc2..0000000 --- a/apps/rider-archive-cubit/ios/Runner/KeychainHelper.swift +++ /dev/null @@ -1,59 +0,0 @@ -// -// KeychainHelper.swift -// Runner -// -// Created by Hamza Aleghwairyeen on 12/03/2025. -// - -import Foundation -import Security - -class KeychainHelper { - static let shared = KeychainHelper() - - private init() {} - - // حفظ البيانات في Keychain - func save(key: String, value: String) { - let data = value.data(using: .utf8)! - - let query: [String: Any] = [ - kSecClass as String: kSecClassGenericPassword, - kSecAttrAccount as String: key, - kSecValueData as String: data, - kSecAttrAccessible as String: kSecAttrAccessibleWhenUnlockedThisDeviceOnly - ] - - SecItemDelete(query as CFDictionary) // حذف أي قيمة قديمة بنفس المفتاح - SecItemAdd(query as CFDictionary, nil) // إضافة القيمة الجديدة - } - - // استرجاع البيانات من Keychain - func get(key: String) -> String? { - let query: [String: Any] = [ - kSecClass as String: kSecClassGenericPassword, - kSecAttrAccount as String: key, - kSecReturnData as String: kCFBooleanTrue!, - kSecMatchLimit as String: kSecMatchLimitOne - ] - - var dataTypeRef: AnyObject? - let status = SecItemCopyMatching(query as CFDictionary, &dataTypeRef) - - guard status == errSecSuccess, let data = dataTypeRef as? Data else { - return nil - } - - return String(data: data, encoding: .utf8) - } - - // حذف البيانات من Keychain - func delete(key: String) { - let query: [String: Any] = [ - kSecClass as String: kSecClassGenericPassword, - kSecAttrAccount as String: key - ] - - SecItemDelete(query as CFDictionary) - } -} diff --git a/apps/rider-archive-cubit/ios/Runner/Localizable.strings b/apps/rider-archive-cubit/ios/Runner/Localizable.strings deleted file mode 100644 index dd8ea57..0000000 --- a/apps/rider-archive-cubit/ios/Runner/Localizable.strings +++ /dev/null @@ -1,10 +0,0 @@ -// -// Localizable.strings -// Runner -// -// Created by Hamza Aleghwairyeen on 12/03/2025. -// - -"Security Warning" = "تحذير أمني"; -"Compromised device detected. Exiting." = "تم اكتشاف جهاز مُخترق. جارٍ الخروج."; -"OK" = "موافق"; diff --git a/apps/rider-archive-cubit/ios/Runner/Runner 2025-03-13 15-43-51/DistributionSummary.plist b/apps/rider-archive-cubit/ios/Runner/Runner 2025-03-13 15-43-51/DistributionSummary.plist deleted file mode 100644 index 5512065..0000000 --- a/apps/rider-archive-cubit/ios/Runner/Runner 2025-03-13 15-43-51/DistributionSummary.plist +++ /dev/null @@ -1,1660 +0,0 @@ - - - - - Tripz.ipa - - - architectures - - arm64 - - buildNumber - 5.0.98 - certificate - - SHA1 - 0DC7C14BF54BBD12B1B1125DDF97C7F90395C9EF - dateExpires - 16/07/2025 - type - Cloud Managed Apple Distribution - - embeddedBinaries - - - architectures - - arm64 - - buildNumber - 1.0 - certificate - - SHA1 - 0DC7C14BF54BBD12B1B1125DDF97C7F90395C9EF - dateExpires - 16/07/2025 - type - Cloud Managed Apple Distribution - - name - App.framework - team - - id - 63CVT8G5P8 - name - Hamza Ayed - - versionNumber - 1.0 - - - architectures - - arm64 - - buildNumber - 1 - certificate - - SHA1 - 0DC7C14BF54BBD12B1B1125DDF97C7F90395C9EF - dateExpires - 16/07/2025 - type - Cloud Managed Apple Distribution - - name - AppAuth.framework - team - - id - 63CVT8G5P8 - name - Hamza Ayed - - versionNumber - 1.7.6 - - - architectures - - arm64 - - buildNumber - 1 - certificate - - SHA1 - 0DC7C14BF54BBD12B1B1125DDF97C7F90395C9EF - dateExpires - 16/07/2025 - type - Cloud Managed Apple Distribution - - name - FBLPromises.framework - team - - id - 63CVT8G5P8 - name - Hamza Ayed - - versionNumber - 2.4.0 - - - architectures - - arm64 - - buildNumber - 1 - certificate - - SHA1 - 0DC7C14BF54BBD12B1B1125DDF97C7F90395C9EF - dateExpires - 16/07/2025 - type - Cloud Managed Apple Distribution - - name - FirebaseAppCheckInterop.framework - team - - id - 63CVT8G5P8 - name - Hamza Ayed - - versionNumber - 11.6.0 - - - architectures - - arm64 - - buildNumber - 1 - certificate - - SHA1 - 0DC7C14BF54BBD12B1B1125DDF97C7F90395C9EF - dateExpires - 16/07/2025 - type - Cloud Managed Apple Distribution - - name - FirebaseAuth.framework - team - - id - 63CVT8G5P8 - name - Hamza Ayed - - versionNumber - 11.4.0 - - - architectures - - arm64 - - buildNumber - 1 - certificate - - SHA1 - 0DC7C14BF54BBD12B1B1125DDF97C7F90395C9EF - dateExpires - 16/07/2025 - type - Cloud Managed Apple Distribution - - name - FirebaseAuthInterop.framework - team - - id - 63CVT8G5P8 - name - Hamza Ayed - - versionNumber - 11.6.0 - - - architectures - - arm64 - - buildNumber - 1 - certificate - - SHA1 - 0DC7C14BF54BBD12B1B1125DDF97C7F90395C9EF - dateExpires - 16/07/2025 - type - Cloud Managed Apple Distribution - - name - FirebaseCore.framework - team - - id - 63CVT8G5P8 - name - Hamza Ayed - - versionNumber - 11.4.0 - - - architectures - - arm64 - - buildNumber - 1 - certificate - - SHA1 - 0DC7C14BF54BBD12B1B1125DDF97C7F90395C9EF - dateExpires - 16/07/2025 - type - Cloud Managed Apple Distribution - - name - FirebaseCoreExtension.framework - team - - id - 63CVT8G5P8 - name - Hamza Ayed - - versionNumber - 11.4.1 - - - architectures - - arm64 - - buildNumber - 1 - certificate - - SHA1 - 0DC7C14BF54BBD12B1B1125DDF97C7F90395C9EF - dateExpires - 16/07/2025 - type - Cloud Managed Apple Distribution - - name - FirebaseCoreInternal.framework - team - - id - 63CVT8G5P8 - name - Hamza Ayed - - versionNumber - 11.6.0 - - - architectures - - arm64 - - buildNumber - 1 - certificate - - SHA1 - 0DC7C14BF54BBD12B1B1125DDF97C7F90395C9EF - dateExpires - 16/07/2025 - type - Cloud Managed Apple Distribution - - name - FirebaseInstallations.framework - team - - id - 63CVT8G5P8 - name - Hamza Ayed - - versionNumber - 11.4.0 - - - architectures - - arm64 - - buildNumber - 1 - certificate - - SHA1 - 0DC7C14BF54BBD12B1B1125DDF97C7F90395C9EF - dateExpires - 16/07/2025 - type - Cloud Managed Apple Distribution - - name - FirebaseMessaging.framework - team - - id - 63CVT8G5P8 - name - Hamza Ayed - - versionNumber - 11.4.0 - - - architectures - - arm64 - - buildNumber - 1.0 - certificate - - SHA1 - 0DC7C14BF54BBD12B1B1125DDF97C7F90395C9EF - dateExpires - 16/07/2025 - type - Cloud Managed Apple Distribution - - name - Flutter.framework - team - - id - 63CVT8G5P8 - name - Hamza Ayed - - versionNumber - 1.0 - - - architectures - - arm64 - - buildNumber - 1 - certificate - - SHA1 - 0DC7C14BF54BBD12B1B1125DDF97C7F90395C9EF - dateExpires - 16/07/2025 - type - Cloud Managed Apple Distribution - - name - GTMAppAuth.framework - team - - id - 63CVT8G5P8 - name - Hamza Ayed - - versionNumber - 4.1.1 - - - architectures - - arm64 - - buildNumber - 1 - certificate - - SHA1 - 0DC7C14BF54BBD12B1B1125DDF97C7F90395C9EF - dateExpires - 16/07/2025 - type - Cloud Managed Apple Distribution - - name - GTMSessionFetcher.framework - team - - id - 63CVT8G5P8 - name - Hamza Ayed - - versionNumber - 3.5.0 - - - architectures - - arm64 - - buildNumber - 1 - certificate - - SHA1 - 0DC7C14BF54BBD12B1B1125DDF97C7F90395C9EF - dateExpires - 16/07/2025 - type - Cloud Managed Apple Distribution - - name - GoogleDataTransport.framework - team - - id - 63CVT8G5P8 - name - Hamza Ayed - - versionNumber - 10.1.0 - - - architectures - - arm64 - - buildNumber - 1 - certificate - - SHA1 - 0DC7C14BF54BBD12B1B1125DDF97C7F90395C9EF - dateExpires - 16/07/2025 - type - Cloud Managed Apple Distribution - - name - GoogleSignIn.framework - team - - id - 63CVT8G5P8 - name - Hamza Ayed - - versionNumber - 7.1.0 - - - architectures - - arm64 - - buildNumber - 1 - certificate - - SHA1 - 0DC7C14BF54BBD12B1B1125DDF97C7F90395C9EF - dateExpires - 16/07/2025 - type - Cloud Managed Apple Distribution - - name - GoogleUtilities.framework - team - - id - 63CVT8G5P8 - name - Hamza Ayed - - versionNumber - 8.0.2 - - - architectures - - arm64 - - buildNumber - 1 - certificate - - SHA1 - 0DC7C14BF54BBD12B1B1125DDF97C7F90395C9EF - dateExpires - 16/07/2025 - type - Cloud Managed Apple Distribution - - name - IOSSecuritySuite.framework - team - - id - 63CVT8G5P8 - name - Hamza Ayed - - versionNumber - 1.9.11 - - - architectures - - arm64 - - buildNumber - 1 - certificate - - SHA1 - 0DC7C14BF54BBD12B1B1125DDF97C7F90395C9EF - dateExpires - 16/07/2025 - type - Cloud Managed Apple Distribution - - name - RecaptchaInterop.framework - team - - id - 63CVT8G5P8 - name - Hamza Ayed - - versionNumber - 100.0.0 - - - architectures - - arm64 - - buildNumber - 1 - certificate - - SHA1 - 0DC7C14BF54BBD12B1B1125DDF97C7F90395C9EF - dateExpires - 16/07/2025 - type - Cloud Managed Apple Distribution - - name - Stripe.framework - team - - id - 63CVT8G5P8 - name - Hamza Ayed - - versionNumber - 23.30.0 - - - architectures - - arm64 - - buildNumber - 1 - certificate - - SHA1 - 0DC7C14BF54BBD12B1B1125DDF97C7F90395C9EF - dateExpires - 16/07/2025 - type - Cloud Managed Apple Distribution - - name - StripeApplePay.framework - team - - id - 63CVT8G5P8 - name - Hamza Ayed - - versionNumber - 23.30.0 - - - architectures - - arm64 - - buildNumber - 1 - certificate - - SHA1 - 0DC7C14BF54BBD12B1B1125DDF97C7F90395C9EF - dateExpires - 16/07/2025 - type - Cloud Managed Apple Distribution - - name - StripeCore.framework - team - - id - 63CVT8G5P8 - name - Hamza Ayed - - versionNumber - 23.30.0 - - - architectures - - arm64 - - buildNumber - 1 - certificate - - SHA1 - 0DC7C14BF54BBD12B1B1125DDF97C7F90395C9EF - dateExpires - 16/07/2025 - type - Cloud Managed Apple Distribution - - name - StripeFinancialConnections.framework - team - - id - 63CVT8G5P8 - name - Hamza Ayed - - versionNumber - 23.30.0 - - - architectures - - arm64 - - buildNumber - 1 - certificate - - SHA1 - 0DC7C14BF54BBD12B1B1125DDF97C7F90395C9EF - dateExpires - 16/07/2025 - type - Cloud Managed Apple Distribution - - name - StripePaymentSheet.framework - team - - id - 63CVT8G5P8 - name - Hamza Ayed - - versionNumber - 23.30.0 - - - architectures - - arm64 - - buildNumber - 1 - certificate - - SHA1 - 0DC7C14BF54BBD12B1B1125DDF97C7F90395C9EF - dateExpires - 16/07/2025 - type - Cloud Managed Apple Distribution - - name - StripePayments.framework - team - - id - 63CVT8G5P8 - name - Hamza Ayed - - versionNumber - 23.30.0 - - - architectures - - arm64 - - buildNumber - 1 - certificate - - SHA1 - 0DC7C14BF54BBD12B1B1125DDF97C7F90395C9EF - dateExpires - 16/07/2025 - type - Cloud Managed Apple Distribution - - name - StripePaymentsUI.framework - team - - id - 63CVT8G5P8 - name - Hamza Ayed - - versionNumber - 23.30.0 - - - architectures - - arm64 - - buildNumber - 1 - certificate - - SHA1 - 0DC7C14BF54BBD12B1B1125DDF97C7F90395C9EF - dateExpires - 16/07/2025 - type - Cloud Managed Apple Distribution - - name - StripeUICore.framework - team - - id - 63CVT8G5P8 - name - Hamza Ayed - - versionNumber - 23.30.0 - - - architectures - - arm64 - - buildNumber - 1 - certificate - - SHA1 - 0DC7C14BF54BBD12B1B1125DDF97C7F90395C9EF - dateExpires - 16/07/2025 - type - Cloud Managed Apple Distribution - - name - TOCropViewController.framework - team - - id - 63CVT8G5P8 - name - Hamza Ayed - - versionNumber - 2.7.4 - - - architectures - - arm64 - - buildNumber - 1 - certificate - - SHA1 - 0DC7C14BF54BBD12B1B1125DDF97C7F90395C9EF - dateExpires - 16/07/2025 - type - Cloud Managed Apple Distribution - - name - audio_session.framework - team - - id - 63CVT8G5P8 - name - Hamza Ayed - - versionNumber - 0.0.1 - - - architectures - - arm64 - - buildNumber - 1 - certificate - - SHA1 - 0DC7C14BF54BBD12B1B1125DDF97C7F90395C9EF - dateExpires - 16/07/2025 - type - Cloud Managed Apple Distribution - - name - device_info_plus.framework - team - - id - 63CVT8G5P8 - name - Hamza Ayed - - versionNumber - 0.0.1 - - - architectures - - arm64 - - buildNumber - 1 - certificate - - SHA1 - 0DC7C14BF54BBD12B1B1125DDF97C7F90395C9EF - dateExpires - 16/07/2025 - type - Cloud Managed Apple Distribution - - name - flutter_app_group_directory.framework - team - - id - 63CVT8G5P8 - name - Hamza Ayed - - versionNumber - 0.0.1 - - - architectures - - arm64 - - buildNumber - 1 - certificate - - SHA1 - 0DC7C14BF54BBD12B1B1125DDF97C7F90395C9EF - dateExpires - 16/07/2025 - type - Cloud Managed Apple Distribution - - name - flutter_contacts.framework - team - - id - 63CVT8G5P8 - name - Hamza Ayed - - versionNumber - 0.0.1 - - - architectures - - arm64 - - buildNumber - 1 - certificate - - SHA1 - 0DC7C14BF54BBD12B1B1125DDF97C7F90395C9EF - dateExpires - 16/07/2025 - type - Cloud Managed Apple Distribution - - name - flutter_local_notifications.framework - team - - id - 63CVT8G5P8 - name - Hamza Ayed - - versionNumber - 0.0.1 - - - architectures - - arm64 - - buildNumber - 1 - certificate - - SHA1 - 0DC7C14BF54BBD12B1B1125DDF97C7F90395C9EF - dateExpires - 16/07/2025 - type - Cloud Managed Apple Distribution - - name - flutter_secure_storage.framework - team - - id - 63CVT8G5P8 - name - Hamza Ayed - - versionNumber - 6.0.0 - - - architectures - - arm64 - - buildNumber - 1 - certificate - - SHA1 - 0DC7C14BF54BBD12B1B1125DDF97C7F90395C9EF - dateExpires - 16/07/2025 - type - Cloud Managed Apple Distribution - - name - geolocator_apple.framework - team - - id - 63CVT8G5P8 - name - Hamza Ayed - - versionNumber - 1.2.0 - - - architectures - - arm64 - - buildNumber - 1 - certificate - - SHA1 - 0DC7C14BF54BBD12B1B1125DDF97C7F90395C9EF - dateExpires - 16/07/2025 - type - Cloud Managed Apple Distribution - - name - image_cropper.framework - team - - id - 63CVT8G5P8 - name - Hamza Ayed - - versionNumber - 0.0.4 - - - architectures - - arm64 - - buildNumber - 1 - certificate - - SHA1 - 0DC7C14BF54BBD12B1B1125DDF97C7F90395C9EF - dateExpires - 16/07/2025 - type - Cloud Managed Apple Distribution - - name - image_picker_ios.framework - team - - id - 63CVT8G5P8 - name - Hamza Ayed - - versionNumber - 0.0.1 - - - architectures - - arm64 - - buildNumber - 1 - certificate - - SHA1 - 0DC7C14BF54BBD12B1B1125DDF97C7F90395C9EF - dateExpires - 16/07/2025 - type - Cloud Managed Apple Distribution - - name - jailbreak_root_detection.framework - team - - id - 63CVT8G5P8 - name - Hamza Ayed - - versionNumber - 1.0.1 - - - architectures - - arm64 - - buildNumber - 1 - certificate - - SHA1 - 0DC7C14BF54BBD12B1B1125DDF97C7F90395C9EF - dateExpires - 16/07/2025 - type - Cloud Managed Apple Distribution - - name - just_audio.framework - team - - id - 63CVT8G5P8 - name - Hamza Ayed - - versionNumber - 0.0.1 - - - architectures - - arm64 - - buildNumber - 1 - certificate - - SHA1 - 0DC7C14BF54BBD12B1B1125DDF97C7F90395C9EF - dateExpires - 16/07/2025 - type - Cloud Managed Apple Distribution - - name - live_activities.framework - team - - id - 63CVT8G5P8 - name - Hamza Ayed - - versionNumber - 0.0.1 - - - architectures - - arm64 - - buildNumber - 1 - certificate - - SHA1 - 0DC7C14BF54BBD12B1B1125DDF97C7F90395C9EF - dateExpires - 16/07/2025 - type - Cloud Managed Apple Distribution - - name - local_auth_darwin.framework - team - - id - 63CVT8G5P8 - name - Hamza Ayed - - versionNumber - 0.0.1 - - - architectures - - arm64 - - buildNumber - 1 - certificate - - SHA1 - 0DC7C14BF54BBD12B1B1125DDF97C7F90395C9EF - dateExpires - 16/07/2025 - type - Cloud Managed Apple Distribution - - name - location.framework - team - - id - 63CVT8G5P8 - name - Hamza Ayed - - versionNumber - 0.0.1 - - - architectures - - arm64 - - buildNumber - 1 - certificate - - SHA1 - 0DC7C14BF54BBD12B1B1125DDF97C7F90395C9EF - dateExpires - 16/07/2025 - type - Cloud Managed Apple Distribution - - name - nanopb.framework - team - - id - 63CVT8G5P8 - name - Hamza Ayed - - versionNumber - 3.30910.0 - - - architectures - - arm64 - - buildNumber - 1 - certificate - - SHA1 - 0DC7C14BF54BBD12B1B1125DDF97C7F90395C9EF - dateExpires - 16/07/2025 - type - Cloud Managed Apple Distribution - - name - package_info_plus.framework - team - - id - 63CVT8G5P8 - name - Hamza Ayed - - versionNumber - 0.4.5 - - - architectures - - arm64 - - buildNumber - 1 - certificate - - SHA1 - 0DC7C14BF54BBD12B1B1125DDF97C7F90395C9EF - dateExpires - 16/07/2025 - type - Cloud Managed Apple Distribution - - name - path_provider_foundation.framework - team - - id - 63CVT8G5P8 - name - Hamza Ayed - - versionNumber - 0.0.1 - - - architectures - - arm64 - - buildNumber - 1 - certificate - - SHA1 - 0DC7C14BF54BBD12B1B1125DDF97C7F90395C9EF - dateExpires - 16/07/2025 - type - Cloud Managed Apple Distribution - - name - quick_actions_ios.framework - team - - id - 63CVT8G5P8 - name - Hamza Ayed - - versionNumber - 0.0.1 - - - architectures - - arm64 - - buildNumber - 1 - certificate - - SHA1 - 0DC7C14BF54BBD12B1B1125DDF97C7F90395C9EF - dateExpires - 16/07/2025 - type - Cloud Managed Apple Distribution - - name - record_darwin.framework - team - - id - 63CVT8G5P8 - name - Hamza Ayed - - versionNumber - 1.0.0 - - - architectures - - arm64 - - buildNumber - 1 - certificate - - SHA1 - 0DC7C14BF54BBD12B1B1125DDF97C7F90395C9EF - dateExpires - 16/07/2025 - type - Cloud Managed Apple Distribution - - name - share.framework - team - - id - 63CVT8G5P8 - name - Hamza Ayed - - versionNumber - 0.0.1 - - - architectures - - arm64 - - buildNumber - 1 - certificate - - SHA1 - 0DC7C14BF54BBD12B1B1125DDF97C7F90395C9EF - dateExpires - 16/07/2025 - type - Cloud Managed Apple Distribution - - name - sign_in_with_apple.framework - team - - id - 63CVT8G5P8 - name - Hamza Ayed - - versionNumber - 0.0.1 - - - architectures - - arm64 - - buildNumber - 1 - certificate - - SHA1 - 0DC7C14BF54BBD12B1B1125DDF97C7F90395C9EF - dateExpires - 16/07/2025 - type - Cloud Managed Apple Distribution - - name - sqflite_darwin.framework - team - - id - 63CVT8G5P8 - name - Hamza Ayed - - versionNumber - 0.0.4 - - - architectures - - arm64 - - buildNumber - 1 - certificate - - SHA1 - 0DC7C14BF54BBD12B1B1125DDF97C7F90395C9EF - dateExpires - 16/07/2025 - type - Cloud Managed Apple Distribution - - name - stripe_ios.framework - team - - id - 63CVT8G5P8 - name - Hamza Ayed - - versionNumber - 0.0.1 - - - architectures - - arm64 - - buildNumber - 1 - certificate - - SHA1 - 0DC7C14BF54BBD12B1B1125DDF97C7F90395C9EF - dateExpires - 16/07/2025 - type - Cloud Managed Apple Distribution - - name - uni_links.framework - team - - id - 63CVT8G5P8 - name - Hamza Ayed - - versionNumber - 0.0.1 - - - architectures - - arm64 - - buildNumber - 1 - certificate - - SHA1 - 0DC7C14BF54BBD12B1B1125DDF97C7F90395C9EF - dateExpires - 16/07/2025 - type - Cloud Managed Apple Distribution - - name - url_launcher_ios.framework - team - - id - 63CVT8G5P8 - name - Hamza Ayed - - versionNumber - 0.0.1 - - - architectures - - arm64 - - buildNumber - 1 - certificate - - SHA1 - 0DC7C14BF54BBD12B1B1125DDF97C7F90395C9EF - dateExpires - 16/07/2025 - type - Cloud Managed Apple Distribution - - name - vibration.framework - team - - id - 63CVT8G5P8 - name - Hamza Ayed - - versionNumber - 1.7.5 - - - architectures - - arm64 - - buildNumber - 1 - certificate - - SHA1 - 0DC7C14BF54BBD12B1B1125DDF97C7F90395C9EF - dateExpires - 16/07/2025 - type - Cloud Managed Apple Distribution - - name - video_player_avfoundation.framework - team - - id - 63CVT8G5P8 - name - Hamza Ayed - - versionNumber - 0.0.1 - - - architectures - - arm64 - - buildNumber - 1 - certificate - - SHA1 - 0DC7C14BF54BBD12B1B1125DDF97C7F90395C9EF - dateExpires - 16/07/2025 - type - Cloud Managed Apple Distribution - - name - wakelock_plus.framework - team - - id - 63CVT8G5P8 - name - Hamza Ayed - - versionNumber - 0.0.1 - - - architectures - - arm64 - - buildNumber - 1 - certificate - - SHA1 - 0DC7C14BF54BBD12B1B1125DDF97C7F90395C9EF - dateExpires - 16/07/2025 - type - Cloud Managed Apple Distribution - - name - webview_flutter_wkwebview.framework - team - - id - 63CVT8G5P8 - name - Hamza Ayed - - versionNumber - 0.0.1 - - - entitlements - - application-identifier - 63CVT8G5P8.com.mobileapp.store.ride - aps-environment - production - com.apple.developer.applesignin - - Default - - com.apple.developer.team-identifier - 63CVT8G5P8 - get-task-allow - - - name - Runner.app - profile - - UUID - aa6f6d7b-1caf-4321-958b-1047982a17e7 - dateExpires - 16/07/2025 - name - iOS Team Ad Hoc Provisioning Profile: com.mobileapp.store.ride - - team - - id - 63CVT8G5P8 - name - Hamza Ayed - - versionNumber - 98 - - - - diff --git a/apps/rider-archive-cubit/ios/Runner/Runner 2025-03-13 15-43-51/ExportOptions.plist b/apps/rider-archive-cubit/ios/Runner/Runner 2025-03-13 15-43-51/ExportOptions.plist deleted file mode 100644 index 2f64685..0000000 --- a/apps/rider-archive-cubit/ios/Runner/Runner 2025-03-13 15-43-51/ExportOptions.plist +++ /dev/null @@ -1,18 +0,0 @@ - - - - - destination - export - method - release-testing - signingStyle - automatic - stripSwiftSymbols - - teamID - 63CVT8G5P8 - thinning - <none> - - diff --git a/apps/rider-archive-cubit/ios/Runner/Runner-Bridging-Header.h b/apps/rider-archive-cubit/ios/Runner/Runner-Bridging-Header.h deleted file mode 100644 index 2dd4564..0000000 --- a/apps/rider-archive-cubit/ios/Runner/Runner-Bridging-Header.h +++ /dev/null @@ -1,2 +0,0 @@ -#import "GeneratedPluginRegistrant.h" -#import "SecurityChecks.h" diff --git a/apps/rider-archive-cubit/ios/Runner/Runner.entitlements b/apps/rider-archive-cubit/ios/Runner/Runner.entitlements deleted file mode 100644 index 80b5221..0000000 --- a/apps/rider-archive-cubit/ios/Runner/Runner.entitlements +++ /dev/null @@ -1,12 +0,0 @@ - - - - - aps-environment - development - com.apple.developer.applesignin - - Default - - - diff --git a/apps/rider-archive-cubit/ios/Runner/SecurityChecks.h b/apps/rider-archive-cubit/ios/Runner/SecurityChecks.h deleted file mode 100644 index b41f391..0000000 --- a/apps/rider-archive-cubit/ios/Runner/SecurityChecks.h +++ /dev/null @@ -1,24 +0,0 @@ -// -// SecurityChecks.h -// Runner -// -// Created by Hamza Aleghwairyeen on 12/03/2025. -// - -//#ifndef SecurityChecks_h -//#define SecurityChecks_h -// -// -//#endif /* SecurityChecks_h */ - - - -// SecurityChecks.h -#import -#import // Import UIKit - -@interface SecurityChecks : NSObject - -+ (BOOL)isDeviceCompromised; // Combined check - -@end diff --git a/apps/rider-archive-cubit/ios/Runner/SecurityChecks.m b/apps/rider-archive-cubit/ios/Runner/SecurityChecks.m deleted file mode 100644 index 752d891..0000000 --- a/apps/rider-archive-cubit/ios/Runner/SecurityChecks.m +++ /dev/null @@ -1,197 +0,0 @@ -// -// SecurityChecks.m -// Runner -// -// Created by Hamza Aleghwairyeen on 12/03/2025. -// - -#import - - - -#import "SecurityChecks.h" -#import -#include -#import -#include // For _dyld_image_count and _dyld_get_image_name -#include // for fork() -#include //for socket, connect -#include // for sockaddr_in -#include // for inet_pton - -@implementation SecurityChecks - -+ (BOOL)isDeviceJailbroken { - // (Same jailbreak checks as before - from previous responses) - // 1. Check for common jailbreak files - NSArray *jailbreakPaths = @[ - @"/Applications/Cydia.app", -// #if !TARGET_IPHONE_SIMULATOR -// @"/bin/bash", -// #endif - @"/Library/MobileSubstrate/MobileSubstrate.dylib", - @"/bin/bash", - @"/usr/sbin/sshd", - @"/etc/apt", - @"/private/var/lib/apt/", - @"/private/var/tmp/cydia.log", - ]; - - for (NSString *path in jailbreakPaths) { - if ([[NSFileManager defaultManager] fileExistsAtPath:path]) { - NSLog(@"Jailbreak file detected: %@", path); - return YES; - } - } - - // 2. Check if we can write outside the sandbox (a strong indicator) - NSError *error = nil; - NSString *testPath = @"/private/jailbreaktest.txt"; - [@"test" writeToFile:testPath atomically:YES encoding:NSUTF8StringEncoding error:&error]; - - if (!error) { - // If we can write, it's jailbroken. Remove the file immediately. - [[NSFileManager defaultManager] removeItemAtPath:testPath error:nil]; - NSLog(@"Sandbox write test indicates jailbreak."); - return YES; - } - //3: Check for existence of the symbolic link /Applications. - struct stat s; - if (lstat("/Applications", &s) == 0) { - if (S_ISLNK(s.st_mode)) { - NSLog(@"Symbolic link /Applications exists, jailbroken"); - return YES; - } - } - - //4:Check for dyld Libraries - uint32_t count = _dyld_image_count(); - for (uint32_t i = 0 ; i < count ; ++i) { - const char *dyld = _dyld_get_image_name(i); - if (strstr(dyld, "MobileSubstrate") != NULL || strstr(dyld, "libcycript") != NULL) { - NSLog(@"Suspicious dyld library found: %s", dyld); - return YES; - } - } - - //5 Check if fork() is available. Sandboxed apps should not be able to call fork(). - #if !TARGET_IPHONE_SIMULATOR // Don't run this on the simulator - int pid = fork(); - if (pid == 0) - { - //in child, exit immediately to avoid crashing. - exit(0); - } else if (pid > 0) - { - NSLog(@"Fork available. Likely jailbroken."); - return YES; // Fork succeeded; likely jailbroken - } - #endif - - return NO; // No jailbreak indicators found -} -+ (BOOL)isDebuggerAttached { - int mib[4]; - struct kinfo_proc info; - size_t size = sizeof(info); - - mib[0] = CTL_KERN; - mib[1] = KERN_PROC; - mib[2] = KERN_PROC_PID; - mib[3] = getpid(); - - sysctl(mib, 4, &info, &size, NULL, 0); - - return (info.kp_proc.p_flag & P_TRACED) != 0; -} - -// Check for Frida's default port -+ (BOOL)isFridaListeningOnDefaultPort { - int sock = socket(AF_INET, SOCK_STREAM, 0); - if (sock == -1) { - return NO; // Couldn't create socket - } - - struct sockaddr_in sa; - memset(&sa, 0, sizeof(sa)); - sa.sin_family = AF_INET; - sa.sin_port = htons(27042); // Default Frida port - inet_pton(AF_INET, "127.0.0.1", &sa.sin_addr); - - if (connect(sock, (struct sockaddr *)&sa, sizeof(sa)) != -1) { - NSLog(@"Frida default port (27042) is open."); - close(sock); - return YES; - } - - close(sock); - return NO; -} - - -+ (BOOL)isFridaDetected { - int name[] = { CTL_KERN, KERN_PROC, KERN_PROC_ALL, 0 }; - size_t length; - struct kinfo_proc *procs, *proc; - - sysctl(name, 3, NULL, &length, NULL, 0); - procs = malloc(length); - sysctl(name, 3, procs, &length, NULL, 0); - - for (proc = procs; (char *)proc < (char *)procs + length; proc++) { - if (strstr(proc->kp_proc.p_comm, "frida") != NULL) { - free(procs); - return YES; - } - } - - free(procs); - return NO; -} -// Check for loaded dylibs that indicate Frida -+(BOOL) checkForFridaDylib{ - uint32_t count = _dyld_image_count(); - for (uint32_t i = 0 ; i < count ; ++i) { - const char *dyld = _dyld_get_image_name(i); - if (strstr(dyld, "FridaGadget") != NULL) { // Look for FridaGadget - NSLog(@"FridaGadget dylib found: %s", dyld); - return YES; - } - } - return NO; -} - -// Check process name -+ (BOOL)checkProcessName { - NSString* processName = [[NSProcessInfo processInfo] processName]; - if ([processName containsString:@"Frida"]) { - return YES; - } - return NO; -} - -// A combined check for jailbreak and Frida -+ (BOOL)isDeviceCompromised { - if ([SecurityChecks isDeviceJailbroken]) { - return YES; - } - if ([SecurityChecks isFridaListeningOnDefaultPort]) { - return YES; - } - if ([SecurityChecks checkForFridaDylib]) { - return YES; - } - if([SecurityChecks checkProcessName]){ - return YES; - } -// if ([SecurityChecks isDebuggerAttached]) { -// return YES; -// } -// if ([SecurityChecks isFridaDetected]) { -// return YES; -// } - - return NO; -} - -@end diff --git a/apps/rider-archive-cubit/ios/Runner/order.wav b/apps/rider-archive-cubit/ios/Runner/order.wav deleted file mode 100644 index b2b0ba2..0000000 Binary files a/apps/rider-archive-cubit/ios/Runner/order.wav and /dev/null differ diff --git a/apps/rider-archive-cubit/ios/Runner/tone2.wav b/apps/rider-archive-cubit/ios/Runner/tone2.wav deleted file mode 100644 index 0582d47..0000000 Binary files a/apps/rider-archive-cubit/ios/Runner/tone2.wav and /dev/null differ diff --git a/apps/rider-archive-cubit/ios/RunnerTests/RunnerTests.swift b/apps/rider-archive-cubit/ios/RunnerTests/RunnerTests.swift deleted file mode 100644 index 86a7c3b..0000000 --- a/apps/rider-archive-cubit/ios/RunnerTests/RunnerTests.swift +++ /dev/null @@ -1,12 +0,0 @@ -import Flutter -import UIKit -import XCTest - -class RunnerTests: XCTestCase { - - func testExample() { - // If you add code to the Runner application, consider adding tests here. - // See https://developer.apple.com/documentation/xctest for more information about using XCTest. - } - -} diff --git a/apps/rider-archive-cubit/ios/firebase_app_id_file.json b/apps/rider-archive-cubit/ios/firebase_app_id_file.json deleted file mode 100644 index 5236662..0000000 --- a/apps/rider-archive-cubit/ios/firebase_app_id_file.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "file_generated_by": "FlutterFire CLI", - "purpose": "FirebaseAppID & ProjectID for this Firebase app in this directory", - "GOOGLE_APP_ID": "1:594687661098:ios:6f69eee1449be943595f53", - "FIREBASE_PROJECT_ID": "ride-b1bd8", - "GCM_SENDER_ID": "594687661098" -} \ No newline at end of file diff --git a/apps/rider-archive-cubit/l10n.yaml b/apps/rider-archive-cubit/l10n.yaml deleted file mode 100644 index a54b9c6..0000000 --- a/apps/rider-archive-cubit/l10n.yaml +++ /dev/null @@ -1,5 +0,0 @@ - -arb-dir: lib/core/l10n -template-arb-file: app_ar.arb -output-localization-file: app_localizations.dart -output-class: AppLocalizations diff --git a/apps/rider-archive-cubit/lib/app.dart b/apps/rider-archive-cubit/lib/app.dart deleted file mode 100644 index f82ff39..0000000 --- a/apps/rider-archive-cubit/lib/app.dart +++ /dev/null @@ -1,88 +0,0 @@ -import 'package:flutter/material.dart'; -import 'package:flutter_bloc/flutter_bloc.dart'; -import 'core/l10n/app_localizations.dart'; -import 'core/di.dart'; -import 'core/router.dart'; -import 'core/design/theme.dart'; -import 'features/auth/cubit/auth_cubit.dart'; -import 'features/auth/cubit/auth_state.dart'; -import 'features/auth/data/auth_repository.dart'; -import 'features/settings/cubit/settings_cubit.dart'; -import 'features/trip/bloc/trip_bloc.dart'; -import 'features/trip/bloc/trip_event.dart'; -import 'features/trip/data/trip_socket_service.dart'; -import 'features/trip/data/fcm_service.dart'; - -class TripzApp extends StatelessWidget { - const TripzApp({super.key}); - - @override - Widget build(BuildContext context) { - return MultiBlocProvider( - providers: [ - BlocProvider(create: (_) => SettingsCubit()), - BlocProvider( - create: (_) => AuthCubit(getIt())..checkAuth(), - ), - BlocProvider( - create: (_) => TripBloc( - tripRepo: getIt(), - socket: getIt(), - )..add(const TripCheckActive()), - ), - ], - child: _AppListener( - child: Builder( - builder: (context) { - final settings = context.watch(); - final auth = context.read(); - final router = buildRouter(auth); - - return MaterialApp.router( - title: 'Tripz', - debugShowCheckedModeBanner: false, - theme: buildTheme( - brightness: Brightness.light, - locale: settings.state.locale, - ), - darkTheme: buildTheme( - brightness: Brightness.dark, - locale: settings.state.locale, - ), - themeMode: settings.state.themeMode, - locale: settings.state.locale, - supportedLocales: AppLocalizations.supportedLocales, - localizationsDelegates: AppLocalizations.localizationsDelegates, - routerConfig: router, - ); - }, - ), - ), - ); - } -} - -/// يستمع لتغيير حالة المصادقة ويُهيّئ FCM بعد تسجيل الدخول. -class _AppListener extends StatefulWidget { - final Widget child; - const _AppListener({required this.child}); - - @override - State<_AppListener> createState() => _AppListenerState(); -} - -class _AppListenerState extends State<_AppListener> { - @override - void initState() { - super.initState(); - final auth = context.read(); - auth.stream.listen((state) { - if (state.status == AuthStatus.authenticated) { - getIt().init(); - } - }); - } - - @override - Widget build(BuildContext context) => widget.child; -} diff --git a/apps/rider-archive-cubit/lib/core/api/antlaq_api.dart b/apps/rider-archive-cubit/lib/core/api/antlaq_api.dart deleted file mode 100644 index a1e01af..0000000 --- a/apps/rider-archive-cubit/lib/core/api/antlaq_api.dart +++ /dev/null @@ -1,65 +0,0 @@ -import 'package:dio/dio.dart'; -import '../config.dart'; - -/// واجهة مباشرة مع انطلق (map-saas) — لا مرور عبر الباك إند. -/// -/// كل نداء يمر عبر هذه النافذة: البحث، التفكيك العكسي، المسار. -/// الباك إند يبقى مسؤولاً عن المصادقة والرحلات والمدفوعات فقط. -class AntlaqApi { - final String apiKey; - final Dio _dio; - - AntlaqApi({String? apiKey}) - : apiKey = apiKey ?? AppConfig.mapApiKey, - _dio = Dio(BaseOptions( - baseUrl: 'https://map-saas.intaleqapp.com', - connectTimeout: const Duration(seconds: 10), - receiveTimeout: const Duration(seconds: 15), - // المفتاح يمر كترويسة `x-api-key` — map-saas يرفض أي مفتاح في - // query (تحقّق صارم: `property api_key should not exist`). - // المفتاح مقيّد ببصمة التطبيق (bundle id) على map-saas نفسه. - headers: {'x-api-key': apiKey ?? AppConfig.mapApiKey}, - )); - - /// بحث أماكن — GET /api/geocoding/search. - Future> search(String query) async { - final r = await _dio.get('/api/geocoding/search', queryParameters: { - 'q': query, - }); - return (r.data['results'] ?? r.data) as List; - } - - /// تفكيك عنوان عكسي — GET /api/geocoding/reverse. - /// يرجّع map-saas **مصفوفة** مرتّبة بالأقرب؛ نأخذ العنصر الأول. - Future> reverse(double lat, double lng) async { - final r = await _dio.get('/api/geocoding/reverse', queryParameters: { - 'lat': lat, - 'lng': lng, - }); - final data = r.data; - if (data is List) { - if (data.isEmpty) return {'latitude': lat, 'longitude': lng}; - return Map.from(data.first as Map); - } - return Map.from(data as Map); - } - - /// حساب مسار بين نقطتين — GET /api/maps/route. - Future> route({ - required double fromLat, - required double fromLng, - required double toLat, - required double toLng, - }) async { - final r = await _dio.get('/api/maps/route', queryParameters: { - 'fromLat': fromLat, - 'fromLng': fromLng, - 'toLat': toLat, - 'toLng': toLng, - 'alternatives': true, - 'steps': true, - 'locale': 'ar', - }); - return r.data as Map; - } -} diff --git a/apps/rider-archive-cubit/lib/core/api/api_client.dart b/apps/rider-archive-cubit/lib/core/api/api_client.dart deleted file mode 100644 index 42ef9a6..0000000 --- a/apps/rider-archive-cubit/lib/core/api/api_client.dart +++ /dev/null @@ -1,111 +0,0 @@ -import 'dart:io'; -import 'package:dio/dio.dart'; -import 'package:device_info_plus/device_info_plus.dart'; -import '../config.dart'; -import '../storage/token_store.dart'; -import 'logging_interceptor.dart'; - -/// عميل HTTP لكل نداءات الـAPI (docs/23 §4). -/// -/// **نقطة الشبكة الوحيدة** في التطبيق: لا `http.get` ولا `Dio` آخر في أي -/// مكان. السبب أن كل ما يفرضه السيرفر (المستأجر · التوكن · بصمة الجهاز · -/// التوقيع) يُحقن هنا مرة واحدة؛ نداءٌ يلتفّ حول هذا الملف هو نداء بلا -/// مصادقة يفشل عند تفعيل الحراسات على السيرفر. -class ApiClient { - final Dio dio; - final TokenStore _store; - - /// بصمة الجهاز (docs/17 — D2). تُحسب مرة وتُخزَّن: قراءتها من النظام في كل - /// طلب استدعاءُ قناة أصيلة بلا داعٍ. - static String? _deviceId; - - ApiClient(this._store) - : dio = Dio(BaseOptions( - baseUrl: AppConfig.baseUrl, - connectTimeout: const Duration(seconds: 10), - receiveTimeout: const Duration(seconds: 15), - headers: {'Content-Type': 'application/json'}, - )) { - // Resolve device ID once in background — don't block requests - _resolveDeviceId(); - - dio.interceptors.add(AppLoggingInterceptor()); - dio.interceptors.add(InterceptorsWrapper( - onRequest: (options, handler) async { - options.headers['x-tenant-id'] = AppConfig.tenantSlug; - // راكب أم سائق — هويتان منفصلتان لنفس الرقم (قرار المالك 2026-07-20 — ب). - options.headers['x-app-role'] = AppConfig.appRole; - - // Device ID is cached after first call — non-blocking - final device = _deviceId; - if (device != null) options.headers['x-device-id'] = device; - - final token = await _store.access(); - if (token != null && token.isNotEmpty) { - options.headers['Authorization'] = 'Bearer $token'; - } - handler.next(options); - }, - onError: (e, handler) async { - // تجديد التوكن عند 401 — **مرة واحدة**. بلا علامة `_retried` يعيد - // الطلبُ الفاشل تجديداً يفشل فيعيد… حلقة لانهائية تستنزف البطارية - // وتغرق السيرفر عند انتهاء الجلسة فعلاً. - final isAuthError = e.response?.statusCode == 401; - final alreadyRetried = e.requestOptions.extra['_retried'] == true; - final isRefreshCall = e.requestOptions.path.contains('/auth/refresh'); - - if (!isAuthError || alreadyRetried || isRefreshCall) { - return handler.next(e); - } - - final refreshed = await _tryRefresh(); - if (!refreshed) { - await _store.clear(); // الجلسة انتهت فعلاً — لا نُبقي توكناً ميتاً - return handler.next(e); - } - - try { - e.requestOptions.extra['_retried'] = true; - final retry = await dio.fetch(e.requestOptions); - return handler.resolve(retry); - } on DioException catch (err) { - return handler.next(err); - } - }, - )); - } - - Future _tryRefresh() async { - final rt = await _store.refresh(); - if (rt == null || rt.isEmpty) return false; - try { - // Dio نظيف: المرور بالعميل نفسه يُدخل التوكن المنتهي في الترويسة. - final plain = Dio(BaseOptions(baseUrl: AppConfig.baseUrl)); - final r = await plain.post('/auth/refresh', data: {'refresh_token': rt}); - await _store.save( - r.data['access_token'] as String, - (r.data['refresh_token'] ?? rt) as String, - ); - return true; - } catch (_) { - return false; - } - } - - static Future _resolveDeviceId() async { - if (_deviceId != null) return _deviceId; - try { - final info = DeviceInfoPlugin(); - if (Platform.isAndroid) { - _deviceId = (await info.androidInfo).id; - } else if (Platform.isIOS) { - _deviceId = (await info.iosInfo).identifierForVendor; - } - } catch (_) { - // تعذّر قراءة الجهاز: نُرسل بلا الترويسة بدل إسقاط الطلب. السيرفر - // يرفض عند تفعيل الربط، وهذا أوضح من فشل صامت هنا. - _deviceId = null; - } - return _deviceId; - } -} diff --git a/apps/rider-archive-cubit/lib/core/api/api_exception.dart b/apps/rider-archive-cubit/lib/core/api/api_exception.dart deleted file mode 100644 index 2143ff3..0000000 --- a/apps/rider-archive-cubit/lib/core/api/api_exception.dart +++ /dev/null @@ -1,77 +0,0 @@ -/// استثناءات الشبكة الموحّدة — كل خطأ يتحول إلى صنف هنا. -/// docs/23 §4 -class ApiException implements Exception { - ApiException(this.message, {this.statusCode, this.type}); - - final String message; - final int? statusCode; - final ApiExceptionType? type; - - @override - String toString() => 'ApiException($statusCode): $message'; -} - -enum ApiExceptionType { - network, - timeout, - unauthorized, - forbidden, - notFound, - server, - unknown, -} - -/// تحليل DioException إلى ApiException -ApiException fromDioError(Object error) { - final dio = error; - final type = switch (dio.runtimeType.toString()) { - 'DioException' => _mapDioType(dio), - _ => ApiExceptionType.unknown, - }; - - final statusCode = _extractStatusCode(dio); - final message = _extractMessage(dio, statusCode); - - return ApiException(message, statusCode: statusCode, type: type); -} - -int? _extractStatusCode(Object error) { - try { - return (error as dynamic).response?.statusCode as int?; - } catch (_) { - return null; - } -} - -String _extractMessage(Object error, int? statusCode) { - try { - final data = (error as dynamic).response?.data; - if (data is Map) { - return (data['message'] ?? data['error'] ?? 'خطأ غير معروف').toString(); - } - } catch (_) {} - return switch (statusCode) { - 401 => 'انتهت الجلسة', - 403 => 'غير مصرح', - 404 => 'غير موجود', - 500 => 'خطأ في السيرفر', - _ => 'خطأ غير معروف', - }; -} - -ApiExceptionType _mapDioType(Object error) { - try { - final dioType = (error as dynamic).type; - return switch (dioType.toString()) { - 'DioExceptionType.connectionTimeout' => ApiExceptionType.timeout, - 'DioExceptionType.sendTimeout' => ApiExceptionType.timeout, - 'DioExceptionType.receiveTimeout' => ApiExceptionType.timeout, - 'DioExceptionType.connectionError' => ApiExceptionType.network, - 'DioExceptionType.badResponse' => ApiExceptionType.server, - 'DioExceptionType.cancel' => ApiExceptionType.unknown, - _ => ApiExceptionType.unknown, - }; - } catch (_) { - return ApiExceptionType.unknown; - } -} diff --git a/apps/rider-archive-cubit/lib/core/api/logging_interceptor.dart b/apps/rider-archive-cubit/lib/core/api/logging_interceptor.dart deleted file mode 100644 index fda5243..0000000 --- a/apps/rider-archive-cubit/lib/core/api/logging_interceptor.dart +++ /dev/null @@ -1,66 +0,0 @@ -import 'dart:convert'; -import 'package:dio/dio.dart'; -import 'package:flutter/foundation.dart'; - -/// مساطر طباعة كل طلب HTTP — يظهر فقط في وضع التطوير. -class AppLoggingInterceptor extends Interceptor { - @override - void onRequest(RequestOptions options, RequestInterceptorHandler handler) { - if (kDebugMode) { - final method = options.method; - final uri = options.uri; - final payload = options.data; - - debugPrint('┌─────── REQUEST ───────'); - debugPrint('│ $method $uri'); - if (payload != null) { - debugPrint('└────── Payload ───────'); - try { - final json = jsonDecode(payload.toString()); - debugPrint('${const JsonEncoder.withIndent(' ').convert(json)}'); - } catch (_) { - debugPrint('$payload'); - } - } - } - handler.next(options); - } - - @override - void onResponse(Response response, ResponseInterceptorHandler handler) { - if (kDebugMode) { - final status = response.statusCode; - final uri = response.requestOptions.uri; - final body = response.data; - - debugPrint('┌─────── RESPONSE [$status] ───────'); - debugPrint('│ $uri'); - if (body != null) { - try { - final json = jsonDecode(body.toString()); - debugPrint('${const JsonEncoder.withIndent(' ').convert(json)}'); - } catch (_) { - debugPrint('$body'); - } - } - } - handler.next(response); - } - - @override - void onError(DioException err, ErrorInterceptorHandler handler) { - if (kDebugMode) { - final status = err.response?.statusCode; - final uri = err.requestOptions.uri; - final message = err.message; - - debugPrint('┌─────── ERROR [$status] ───────'); - debugPrint('│ $uri'); - debugPrint('│ $message'); - if (err.response?.data != null) { - debugPrint('│ ${err.response?.data}'); - } - } - handler.next(err); - } -} diff --git a/apps/rider-archive-cubit/lib/core/app_info.dart b/apps/rider-archive-cubit/lib/core/app_info.dart deleted file mode 100644 index de49174..0000000 --- a/apps/rider-archive-cubit/lib/core/app_info.dart +++ /dev/null @@ -1,9 +0,0 @@ -/// مرجع معلومات التطبيق ورقم الإصدار الموحد. -abstract final class AppInfo { - static const String name = 'Tripz'; - static const String version = '1.0.0'; - static const int buildNumber = 1; - - /// الصيغة المنسقة لرقم الإصدار (مثل v1.0.0). - static String get formattedVersion => 'v$version'; -} diff --git a/apps/rider-archive-cubit/lib/core/build_config.dart b/apps/rider-archive-cubit/lib/core/build_config.dart deleted file mode 100644 index eae85b1..0000000 --- a/apps/rider-archive-cubit/lib/core/build_config.dart +++ /dev/null @@ -1,61 +0,0 @@ -/// مُولَّد من المانيفست عبر سكربت N3 — لا يُحرَّر يدوياً. -/// يحتوي على أعلام الميزات `const` + إعداد المستأجر الثابت. -/// docs/22 §1.5 -class BuildConfig { - static const String tenantSlug = 'siro'; - static const String baseUrl = 'https://tripz-api.intaleqapp.com/api'; - static const String appName = 'Tripz'; - static const String appRole = 'rider'; - - // ألوان المستأجر (البذرة) - static const int primaryColorValue = 0xFF0E7C66; - static const int secondaryColorValue = 0xFF0E7C66; - static const String defaultCountry = 'JO'; - - // أعلام الميزات — const: tree-shaking يحذف الكود المطفأ في release - // docs/22 §1.5, docs/23 §5 - static const bool rideClassesSet = true; - static const bool tariffEngineFull = true; - static const bool liveTrackingPro = true; - static const bool coupons = true; - static const bool walletPayment = true; - static const bool chat = true; - static const bool aiDocumentProcessing = false; - static const bool heatmap = false; - static const bool predictiveDemand = false; - static const bool geofence = false; - static const bool targetedPromo = false; - static const bool whatsappCampaigns = false; - static const bool marketingEngine = false; - static const bool dynamicPricing = false; - static const bool transit = false; - static const bool paymentGateways = false; - static const bool smsSettlement = false; - static const bool negotiator = false; - static const bool driverTiers = false; - static const bool driverAssurance = false; -} - -/// اختصار وصول للاستعمال في شروط Features.xxx -abstract final class Features { - static const bool rideClassesSet = BuildConfig.rideClassesSet; - static const bool tariffEngineFull = BuildConfig.tariffEngineFull; - static const bool liveTrackingPro = BuildConfig.liveTrackingPro; - static const bool coupons = BuildConfig.coupons; - static const bool walletPayment = BuildConfig.walletPayment; - static const bool chat = BuildConfig.chat; - static const bool aiDocumentProcessing = BuildConfig.aiDocumentProcessing; - static const bool heatmap = BuildConfig.heatmap; - static const bool predictiveDemand = BuildConfig.predictiveDemand; - static const bool geofence = BuildConfig.geofence; - static const bool targetedPromo = BuildConfig.targetedPromo; - static const bool whatsappCampaigns = BuildConfig.whatsappCampaigns; - static const bool marketingEngine = BuildConfig.marketingEngine; - static const bool dynamicPricing = BuildConfig.dynamicPricing; - static const bool transit = BuildConfig.transit; - static const bool paymentGateways = BuildConfig.paymentGateways; - static const bool smsSettlement = BuildConfig.smsSettlement; - static const bool negotiator = BuildConfig.negotiator; - static const bool driverTiers = BuildConfig.driverTiers; - static const bool driverAssurance = BuildConfig.driverAssurance; -} diff --git a/apps/rider-archive-cubit/lib/core/config.dart b/apps/rider-archive-cubit/lib/core/config.dart deleted file mode 100644 index 9c74442..0000000 --- a/apps/rider-archive-cubit/lib/core/config.dart +++ /dev/null @@ -1,33 +0,0 @@ -/// إعداد وقت التشغيل — يُمرَّر عبر --dart-define عند البناء. -/// -/// ما يخصّ **المستأجر** (اسمه، ألوانه، أعلام ميزاته) لا يوضع هنا: مكانه -/// `build_config.dart` المُولَّد من المانيفست (docs/22 §1.5). هذا الملف -/// للإعداد التقني المشترك بين كل المستأجرين. -class AppConfig { - /// الـAPI عبر TLS حصراً (docs/20). المنفذ الخام مغلق على مستوى الشبكة، - /// فأي عودة إلى http تعني تطبيقاً لا يتصل أصلاً. - static const String baseUrl = String.fromEnvironment( - 'BASE_URL', - defaultValue: 'https://tripz-api.intaleqapp.com/api', - ); - - /// slug المستأجر. الافتراض للتطوير؛ البناء المولَّد يمرّره صراحةً. - static const String tenantSlug = String.fromEnvironment( - 'TENANT', - defaultValue: 'siro', - ); - - static const String appName = 'Tripz'; - - /// دور هذا التطبيق — يميّز تطبيق الراكب عن السائق عند التسجيل. - static const String appRole = 'rider'; - - /// مفتاح الخريطة — يُضمَّن في التطبيق ويُقيَّد ببصمة التطبيق (bundle id - /// للأندرويد/iOS) على map-saas نفسه، فلا يعمل خارج هذا التطبيق (قرار المالك - /// 2026-07-20: خرائط مباشرة إلى map-saas بلا مرور عبر الباك إند). يمكن - /// تجاوزه ببيئة البناء `--dart-define=MAP_API_KEY=...` لكل مستأجر. - static const String mapApiKey = String.fromEnvironment( - 'MAP_API_KEY', - defaultValue: 'in_9478b32836d19cff73db3063', - ); -} diff --git a/apps/rider-archive-cubit/lib/core/design/theme.dart b/apps/rider-archive-cubit/lib/core/design/theme.dart deleted file mode 100644 index aeb76a1..0000000 --- a/apps/rider-archive-cubit/lib/core/design/theme.dart +++ /dev/null @@ -1,89 +0,0 @@ -import 'package:flutter/material.dart'; -import '../build_config.dart'; -import 'tripz_colors.dart'; -import 'typography.dart'; - -/// بناء الثيم — المدخلان الوحيدان: السطوع واللغة. -/// docs/26 §2, §4 -ThemeData buildTheme({required Brightness brightness, required Locale locale}) { - final bool isDark = brightness == Brightness.dark; - final seed = Color(BuildConfig.primaryColorValue); // أخضر تركوازي — بذرة المستأجر - - final colorScheme = ColorScheme.fromSeed( - seedColor: seed, - brightness: brightness, - ); - - final textTheme = buildTextTheme(locale); - - return ThemeData( - useMaterial3: true, - brightness: brightness, - colorScheme: colorScheme, - textTheme: textTheme, - extensions: [ - isDark ? TripzColors.dark : TripzColors.light, - ], - appBarTheme: AppBarTheme( - backgroundColor: colorScheme.surface, - foregroundColor: colorScheme.onSurface, - elevation: 0, - scrolledUnderElevation: 0, - centerTitle: false, - titleTextStyle: textTheme.titleLarge?.copyWith( - color: colorScheme.onSurface, - ), - ), - inputDecorationTheme: InputDecorationTheme( - filled: true, - fillColor: colorScheme.surfaceContainerHighest, - border: OutlineInputBorder( - borderRadius: BorderRadius.circular(8), - borderSide: BorderSide(color: colorScheme.outline), - ), - enabledBorder: OutlineInputBorder( - borderRadius: BorderRadius.circular(8), - borderSide: BorderSide(color: colorScheme.outline), - ), - focusedBorder: OutlineInputBorder( - borderRadius: BorderRadius.circular(8), - borderSide: BorderSide(color: colorScheme.primary, width: 2), - ), - errorBorder: OutlineInputBorder( - borderRadius: BorderRadius.circular(8), - borderSide: BorderSide(color: colorScheme.error), - ), - contentPadding: const EdgeInsets.symmetric(horizontal: 16, vertical: 14), - labelStyle: textTheme.bodyLarge, - hintStyle: textTheme.bodyLarge?.copyWith(color: colorScheme.onSurfaceVariant), - ), - filledButtonTheme: FilledButtonThemeData( - style: FilledButton.styleFrom( - minimumSize: const Size.fromHeight(52), - shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(12)), - textStyle: textTheme.labelLarge, - ), - ), - outlinedButtonTheme: OutlinedButtonThemeData( - style: OutlinedButton.styleFrom( - minimumSize: const Size.fromHeight(52), - shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(12)), - textStyle: textTheme.labelLarge, - ), - ), - cardTheme: CardThemeData( - elevation: 0, - shape: RoundedRectangleBorder( - borderRadius: BorderRadius.circular(12), - side: BorderSide(color: colorScheme.outlineVariant), - ), - margin: EdgeInsets.zero, - ), - bottomSheetTheme: const BottomSheetThemeData( - shape: RoundedRectangleBorder( - borderRadius: BorderRadius.vertical(top: Radius.circular(24)), - ), - showDragHandle: true, - ), - ); -} diff --git a/apps/rider-archive-cubit/lib/core/design/tokens.dart b/apps/rider-archive-cubit/lib/core/design/tokens.dart deleted file mode 100644 index 29cdfd5..0000000 --- a/apps/rider-archive-cubit/lib/core/design/tokens.dart +++ /dev/null @@ -1,59 +0,0 @@ -import 'package:flutter/material.dart'; - -/// الرموز الثابتة — كل قيمة هنا `const` ولا تُخترَع في الشاشات. -/// docs/26 §3 -abstract final class T { - // ── المسافات (مضاعفات 4) ── - static const double s4 = 4; - static const double s8 = 8; - static const double s12 = 12; - static const double s16 = 16; - static const double s24 = 24; - static const double s32 = 32; - static const double s48 = 48; - static const double s64 = 64; - - /// حشوة الصفحة الافتراضية - static const double pagePadding = s16; - - // ── الزوايا ── - static const double r8 = 8; // حقول / شارات - static const double r12 = 12; // أزرار / بطاقات - static const double r16 = 16; // محتوى مدمّق - static const double r24 = 24; // bottom sheets - static const double rCircle = 999; // avatars - - // ── الحركة (أزمنة) ── - static const Duration fast = Duration(milliseconds: 120); // لمسة - static const Duration medium = Duration(milliseconds: 240); // انتقال ضمن الشاشة - static const Duration slow = Duration(milliseconds: 400); // sheet / صفحة - - // ── المسافات الإضافية ── - static const double s20 = 20; - - // ── الظلال ── - static const BoxShadow shadowSm = BoxShadow( - color: Color(0x0F000000), - blurRadius: 4, - offset: Offset(0, 1), - ); - static const BoxShadow shadowLg = BoxShadow( - color: Color(0x1A000000), - blurRadius: 12, - offset: Offset(0, 4), - ); - - // ── الأيقونات ── - static const double iconSm = 20; - static const double iconMd = 24; - static const double iconLg = 32; - - // ── الارتفاعات ── - static const double buttonHeight = 52; - static const double inputHeight = 52; - static const double touchTarget = 48; - - // ── عناصر الخريطة ── - static const double markerSize = 40; - static const double polylineWidth = 6; -} diff --git a/apps/rider-archive-cubit/lib/core/design/tripz_colors.dart b/apps/rider-archive-cubit/lib/core/design/tripz_colors.dart deleted file mode 100644 index 4b8ab2a..0000000 --- a/apps/rider-archive-cubit/lib/core/design/tripz_colors.dart +++ /dev/null @@ -1,88 +0,0 @@ -import 'package:flutter/material.dart'; - -/// الأدوار الدلالية غير الموجودة في ColorScheme الأساسي. -/// الشاشة تستدعيها عبر `context.tripzColors` — لا تقرّر درجة اللون بنفسها. -/// docs/26 §2 -@immutable -class TripzColors extends ThemeExtension { - const TripzColors({ - required this.success, - required this.warning, - required this.danger, - required this.info, - required this.surfaceRaised, - required this.mapOverlayDark, - required this.mapOverlayLight, - }); - - final Color success; - final Color warning; - final Color danger; - final Color info; - final Color surfaceRaised; - final Color mapOverlayDark; - final Color mapOverlayLight; - - @override - TripzColors copyWith({ - Color? success, - Color? warning, - Color? danger, - Color? info, - Color? surfaceRaised, - Color? mapOverlayDark, - Color? mapOverlayLight, - }) { - return TripzColors( - success: success ?? this.success, - warning: warning ?? this.warning, - danger: danger ?? this.danger, - info: info ?? this.info, - surfaceRaised: surfaceRaised ?? this.surfaceRaised, - mapOverlayDark: mapOverlayDark ?? this.mapOverlayDark, - mapOverlayLight: mapOverlayLight ?? this.mapOverlayLight, - ); - } - - @override - TripzColors lerp(TripzColors? other, double t) { - if (other is! TripzColors) return this; - return TripzColors( - success: Color.lerp(success, other.success, t)!, - warning: Color.lerp(warning, other.warning, t)!, - danger: Color.lerp(danger, other.danger, t)!, - info: Color.lerp(info, other.info, t)!, - surfaceRaised: Color.lerp(surfaceRaised, other.surfaceRaised, t)!, - mapOverlayDark: Color.lerp(mapOverlayDark, other.mapOverlayDark, t)!, - mapOverlayLight: Color.lerp(mapOverlayLight, other.mapOverlayLight, t)!, - ); - } - - // ── الوضع النهاري ── - static const light = TripzColors( - success: Color(0xFF2E7D32), - warning: Color(0xFFF9A825), - danger: Color(0xFFD32F2F), - info: Color(0xFF1565C0), - surfaceRaised: Color(0xFFF5F5F5), - mapOverlayDark: Color(0xCC1A1A2E), - mapOverlayLight: Color(0xCCFFFFFF), - ); - - // ── الوضع الليلي ── - static const dark = TripzColors( - success: Color(0xFF66BB6A), - warning: Color(0xFFFFD54F), - danger: Color(0xFFEF5350), - info: Color(0xFF42A5F5), - surfaceRaised: Color(0xFF2C2C3A), - mapOverlayDark: Color(0xCC0D0D1A), - mapOverlayLight: Color(0xCC1A1A2E), - ); -} - -/// امتداد مريح للوصول السريع من السياق -extension TripzColorsExtension on BuildContext { - TripzColors get tripzColors => - Theme.of(this).extension() ?? TripzColors.light; -} diff --git a/apps/rider-archive-cubit/lib/core/design/typography.dart b/apps/rider-archive-cubit/lib/core/design/typography.dart deleted file mode 100644 index 5f0ebf6..0000000 --- a/apps/rider-archive-cubit/lib/core/design/typography.dart +++ /dev/null @@ -1,34 +0,0 @@ -import 'package:flutter/material.dart'; - -/// الخطوط المضمّنة محلياً — Inter + IBM Plex Sans Arabic. -/// لا حزمة google_fonts — الاتصال لا يُراهَن عليه. -/// docs/26 §1 -/// -/// الأوزان المضمّنة: Regular(400) · Medium(500) · SemiBold(600) · Bold(700) -/// لكل خط (٨ ملفات في `assets/fonts/`). -TextTheme buildTextTheme(Locale locale) { - final bool isArabic = locale.languageCode == 'ar'; - - // الخط الرئيسي: عربي ⇒ Plex Arabic، إنجليزي ⇒ Inter - final String primary = isArabic ? 'IBMPlexSansArabic' : 'Inter'; - // الاحتياطي: العكس - final String fallback = isArabic ? 'Inter' : 'IBMPlexSansArabic'; - - return TextTheme( - displayLarge: TextStyle(fontFamily: primary, fontFamilyFallback: [fallback], fontWeight: FontWeight.w700, fontSize: 57, height: 1.12), - displayMedium: TextStyle(fontFamily: primary, fontFamilyFallback: [fallback], fontWeight: FontWeight.w700, fontSize: 45, height: 1.16), - displaySmall: TextStyle(fontFamily: primary, fontFamilyFallback: [fallback], fontWeight: FontWeight.w700, fontSize: 36, height: 1.22), - headlineLarge: TextStyle(fontFamily: primary, fontFamilyFallback: [fallback], fontWeight: FontWeight.w700, fontSize: 32, height: 1.25), - headlineMedium: TextStyle(fontFamily: primary, fontFamilyFallback: [fallback], fontWeight: FontWeight.w600, fontSize: 28, height: 1.29), - headlineSmall: TextStyle(fontFamily: primary, fontFamilyFallback: [fallback], fontWeight: FontWeight.w600, fontSize: 24, height: 1.33), - titleLarge: TextStyle(fontFamily: primary, fontFamilyFallback: [fallback], fontWeight: FontWeight.w600, fontSize: 22, height: 1.27), - titleMedium: TextStyle(fontFamily: primary, fontFamilyFallback: [fallback], fontWeight: FontWeight.w500, fontSize: 16, height: 1.50, letterSpacing: 0.15), - titleSmall: TextStyle(fontFamily: primary, fontFamilyFallback: [fallback], fontWeight: FontWeight.w500, fontSize: 14, height: 1.43, letterSpacing: 0.1), - bodyLarge: TextStyle(fontFamily: primary, fontFamilyFallback: [fallback], fontWeight: FontWeight.w400, fontSize: 16, height: 1.50, letterSpacing: 0.5), - bodyMedium: TextStyle(fontFamily: primary, fontFamilyFallback: [fallback], fontWeight: FontWeight.w400, fontSize: 14, height: 1.43, letterSpacing: 0.25), - bodySmall: TextStyle(fontFamily: primary, fontFamilyFallback: [fallback], fontWeight: FontWeight.w400, fontSize: 12, height: 1.33, letterSpacing: 0.4), - labelLarge: TextStyle(fontFamily: primary, fontFamilyFallback: [fallback], fontWeight: FontWeight.w500, fontSize: 14, height: 1.43, letterSpacing: 0.1), - labelMedium: TextStyle(fontFamily: primary, fontFamilyFallback: [fallback], fontWeight: FontWeight.w500, fontSize: 12, height: 1.33, letterSpacing: 0.5), - labelSmall: TextStyle(fontFamily: primary, fontFamilyFallback: [fallback], fontWeight: FontWeight.w500, fontSize: 11, height: 1.45, letterSpacing: 0.5), - ); -} diff --git a/apps/rider-archive-cubit/lib/core/di.dart b/apps/rider-archive-cubit/lib/core/di.dart deleted file mode 100644 index 79d4536..0000000 --- a/apps/rider-archive-cubit/lib/core/di.dart +++ /dev/null @@ -1,52 +0,0 @@ -import 'package:get_it/get_it.dart'; -import 'api/api_client.dart'; -import 'api/antlaq_api.dart'; -import 'storage/token_store.dart'; -import 'storage/saved_places_store.dart'; -import '../features/auth/data/auth_repository.dart'; -import '../features/home/data/maps_repository.dart'; -import '../features/home/data/tariff_repository.dart'; -import '../features/home/data/ride_types_repository.dart'; -import '../features/trip/data/trip_repository.dart'; -import '../features/trip/data/trip_socket_service.dart'; -import '../features/trip/data/trip_event_merger.dart'; -import '../features/trip/data/fcm_service.dart'; - -final GetIt getIt = GetIt.instance; - -/// حقن التبعيات (بديل bindings في GetX). -Future setupDi() async { - getIt.registerLazySingleton(() => TokenStore()); - getIt.registerLazySingleton(() => ApiClient(getIt())); - getIt.registerLazySingleton( - () => AuthRepository(getIt(), getIt()), - ); - - // ميزات Phase 1: الخرائط + الأسعار - getIt.registerLazySingleton(() => AntlaqApi()); - getIt.registerLazySingleton( - () => MapsRepository(getIt(), getIt()), - ); - getIt.registerLazySingleton( - () => TariffRepository(getIt()), - ); - getIt.registerLazySingleton( - () => RideTypesRepository(getIt()), - ); - - // ميزات Phase 2: الرحلات + WebSocket - getIt.registerLazySingleton( - () => TripRepository(getIt()), - ); - getIt.registerLazySingleton( - () => TripEventMerger(), - ); - getIt.registerLazySingleton( - () => TripSocketService(getIt(), getIt()), - ); - getIt.registerLazySingleton( - () => FcmService(getIt()), - ); - - getIt.registerLazySingleton(() => SavedPlacesStore()); -} diff --git a/apps/rider-archive-cubit/lib/core/l10n/app_ar.arb b/apps/rider-archive-cubit/lib/core/l10n/app_ar.arb deleted file mode 100644 index 04905e3..0000000 --- a/apps/rider-archive-cubit/lib/core/l10n/app_ar.arb +++ /dev/null @@ -1,229 +0,0 @@ -{ - "@@locale": "ar", - "appName": "Tripz", - "appTagline": "اسحب، وصل، وصل", - "phoneTitle": "أدخل رقم هاتفك للمتابعة", - "phoneLabel": "رقم الهاتف", - "phoneHint": "07XXXXXXXX", - "sendCode": "إرسال الرمز", - "otpTitle": "أدخل رمز التحقق", - "otpSentTo": "أُرسل إلى {phone}", - "@otpSentTo": { - "placeholders": { - "phone": {"type": "String"} - } - }, - "otpLabel": "الرمز", - "confirm": "تأكيد", - "welcome": "مرحباً {name}", - "@welcome": { - "placeholders": { - "name": {"type": "String"} - } - }, - "welcomeBack": "مرحباً بعودتك", - "whereTo": "إلى أين؟", - "setLocationOnMap": "تحديد الموقع على الخريطة", - "myTrips": "رحلاتي", - "wallet": "المحفظة", - "coupons": "الكوبونات والدعوات", - "settings": "الإعدادات", - "support": "الدعم", - "logout": "تسجيل الخروج", - "language": "اللغة", - "arabic": "العربية", - "english": "English", - "theme": "المظهر", - "lightMode": "الوضع النهاري", - "darkMode": "الوضع الليلي", - "systemMode": "تلقائي", - "errorGeneric": "حدث خطأ ما", - "retry": "أعد المحاولة", - "emptyGeneric": "لا توجد عناصر بعد", - "loading": "جارٍ التحميل...", - "cancel": "إلغاء", - "save": "حفظ", - "close": "إغلاق", - "next": "التالي", - "back": "رجوع", - "search": "بحث", - "noResults": "لا توجد نتائج", - "connectionError": "تحقق من اتصالك بالإنترنت", - "authError": "تعذّر إرسال الرمز", - "invalidOtp": "رمز غير صحيح", - "phoneEmpty": "أدخل رقم الهاتف", - "selectDestination": "اختر وجهتك", - "pickupLocation": "نقطة الانطلاق", - "dropoffLocation": "الوجهة", - "chooseOnMap": "اختر من الخريطة", - "favorites": "المفضلة", - "homePlace": "البيت", - "workPlace": "العمل", - "searchPlaces": "ابحث عن مكان...", - "recent": "الأخيرة", - "addStop": "إضافة توقف", - "removeStop": "إزالة التوقف", - "rideClasses": "فئة الرحلة", - "cash": "نقدي", - "walletPayment": "المحفظة", - "couponCode": "كود الخصم", - "scheduleRide": "جدولة رحلة", - "requestRide": "اطلب رحلة", - "searchingDriver": "جارٍ البحث عن سائق...", - "cancelSearch": "إلغاء البحث", - "driverAccepted": "قبل سائقك الرحلة", - "driverArriving": "السائق في طريقه إليك", - "driverArrived": "وصل سائقك", - "rideInProgress": "الرحلة جارية", - "rideCompleted": "انتهت الرحلة", - "rateDriver": "قيّم سائقك", - "tripFare": "أجرة الرحلة", - "waitingFee": "رسوم الانتظار", - "discount": "الخصم", - "paymentMethod": "طريقة الدفع", - "total": "المجموع", - "submitRating": "إرسال التقييم", - "skipRating": "تخطي", - "freeWaitMinutes": "دقائق انتظار مجانية", - "minutes": "دقائق", - "callDriver": "اتصل بالسائق", - "chatWithDriver": "دردشة مع السائق", - "shareTrip": "مشاركة الرحلة", - "emergencySOS": "طارئ SOS", - "plateNumber": "رقم اللوحة", - "vehicleInfo": "معلومات المركبة", - "driverRating": "تقييم السائق", - "eta": "الوصول المتوقع", - "km": "كم", - "min": "د", - "searchTimeout": "لم نجد سائقاً متاحاً حالياً. حاول مرة أخرى", - "priceEstimate": "تقدير السعر", - "perKm": "/كم", - "capacity": "{seats} مقاعد", - "@capacity": { - "placeholders": { - "seats": {"type": "int"} - } - }, - "confirmPickup": "تأكيد نقطة الانطلاق", - "pickupSet": "تم تحديد نقطة الانطلاق", - "destinationSet": "تم تحديد الوجهة", - "routeSummary": "{distance} · {duration}", - "@routeSummary": { - "placeholders": { - "distance": {"type": "String"}, - "duration": {"type": "String"} - } - }, - "noPickupSet": "حدد نقطة انطلاقك", - "mapPinInstructions": "حرّك الخريطة لإظهار الدبوس", - "tripNoDrivers": "لم نجد سائقين بالقرب", - "tripCancelled": "تم إلغاء الرحلة", - "tripCancelledByDriver": "ألغى السائق الرحلة", - "cancelFee": "رسوم الإلغاء: {fee} {currency}", - "@cancelFee": { - "placeholders": { - "fee": {"type": "String"}, - "currency": {"type": "String"} - } - }, - "waitFreeMinutes": "{minutes} دقائق انتظار مجانية", - "@waitFreeMinutes": { - "placeholders": { - "minutes": {"type": "int"} - } - }, - "waitingCharge": "رسوم الانتظار: {amount} {currency}", - "@waitingCharge": { - "placeholders": { - "amount": {"type": "String"}, - "currency": {"type": "String"} - } - }, - "driverEnRoute": "السائق في طريقه إليك", - "arrivingIn": "الوصول خلال {eta}", - "@arrivingIn": { - "placeholders": { - "eta": {"type": "String"} - } - }, - "tripStarted": "بدأت الرحلة", - "tripEnd": "انتهت الرحلة", - "fareBreakdown": "تفاصيل الأجرة", - "baseFare": "الأجرة الأساسية", - "distanceFare": "المسافة", - "timeFare": "الوقت", - "surgeMultiplier": "الذروة", - "couponApplied": "تم تطبيق الكوبون", - "youPaid": "دفعت", - "payCash": "ادفع نقدي", - "rateYourTrip": "قيّم رحلتك", - "ratingComment": "أضف تعليقاً (اختياري)", - "thankYou": "شكراً على ملاحظاتك", - "tripDuration": "مدة الرحلة: {duration}", - "@tripDuration": { - "placeholders": { - "duration": {"type": "String"} - } - }, - "tripDistance": "مسافة الرحلة: {distance}", - "@tripDistance": { - "placeholders": { - "distance": {"type": "String"} - } - }, - "edit": "تعديل", - "resendIn": "إعادة إرسال خلال {seconds}ث", - "@resendIn": { - "placeholders": { - "seconds": {"type": "int"} - } - }, - "resendCode": "إعادة إرسال الرمز", - "nameTitle": "ما اسمك؟", - "nameSubtitle": "ساعدنا في تخصيص تجربتك", - "nameHint": "اسمك", - "firstNameHint": "الاسم الأول", - "lastNameHint": "اسم العائلة", - "nameButton": "متابعة", - "reconnect": "جارٍ إعادة الاتصال...", - "tripExpired": "انتهت صلاحية الرحلة", - "loginTitle": "مرحباً بك في Tripz", - "phoneLoginSubtitle": "أدخل رقم هاتفك لتسجيل الدخول", - "sendOtpButton": "إرسال رمز التحقق", - "nameEntryTitle": "ما اسمك؟", - "homeTitle": "الرئيسية", - "destinationTitle": "الوجهة", - "routeTitle": "المسار", - "whereToHint": "إلى أين تريد الذهاب؟", - "currentLocation": "الموقع الحالي", - "savedPlaces": "الأماكن المحفوظة", - "home": "المنزل", - "work": "العمل", - "pickFromMap": "اختيار من الخريطة", - "searchHint": "ابحث عن مكان...", - "noResultsFound": "لا توجد نتائج", - "connecting": "جارٍ الاتصال...", - "tripSummary": "ملخص الرحلة", - "totalDistance": "المسافة الإجمالية", - "estimatedTime": "الوقت المقدر", - "totalFare": "الأجرة الإجمالية", - "chooseRide": "اختر نوع الرحلة", - "promoCode": "كود الترويج", - "errorTitle": "حدث خطأ", - "errorSubtitle": "يرجى المحاولة مرة أخرى", - "emptyTitle": "لا توجد بيانات", - "emptySubtitle": "لم يتم العثور على محتوى حالياً", - "signIn": "تسجيل الدخول", - "confirmPhoneNumber": "تأكيد رقم الهاتف", - "driverRatingValue": "التقييم", - "missingDataError": "بيانات مفقودة", - "onboardingTitle1": "اطلب بلمسة واحدة", - "onboardingSubtitle1": "أدخل وجهتك واحصل على سائق في ثوانٍ", - "onboardingTitle2": "تتبع رحلتك مباشرة", - "onboardingSubtitle2": "شاهد سائقك وهو يقترب في الوقت الفعلي", - "onboardingTitle3": "ادفع كما يناسبك", - "onboardingSubtitle3": "اختر الدفع نقدًا أو بالبطاقة أو عبر المحفظة", - "getStarted": "ابدأ الآن", - "skip": "تخطي" -} \ No newline at end of file diff --git a/apps/rider-archive-cubit/lib/core/l10n/app_en.arb b/apps/rider-archive-cubit/lib/core/l10n/app_en.arb deleted file mode 100644 index 2ac84a2..0000000 --- a/apps/rider-archive-cubit/lib/core/l10n/app_en.arb +++ /dev/null @@ -1,229 +0,0 @@ -{ - "@@locale": "en", - "appName": "Tripz", - "appTagline": "Tap, ride, arrive", - "phoneTitle": "Enter your phone number to continue", - "phoneLabel": "Phone number", - "phoneHint": "07XXXXXXXX", - "sendCode": "Send code", - "otpTitle": "Enter verification code", - "otpSentTo": "Sent to {phone}", - "@otpSentTo": { - "placeholders": { - "phone": {"type": "String"} - } - }, - "otpLabel": "Code", - "confirm": "Confirm", - "welcome": "Welcome {name}", - "@welcome": { - "placeholders": { - "name": {"type": "String"} - } - }, - "welcomeBack": "Welcome back", - "whereTo": "Where to?", - "setLocationOnMap": "Set location on map", - "myTrips": "My trips", - "wallet": "Wallet", - "coupons": "Coupons & invites", - "settings": "Settings", - "support": "Support", - "logout": "Logout", - "language": "Language", - "arabic": "العربية", - "english": "English", - "theme": "Theme", - "lightMode": "Light", - "darkMode": "Dark", - "systemMode": "System", - "errorGeneric": "Something went wrong", - "retry": "Try again", - "emptyGeneric": "Nothing here yet", - "loading": "Loading...", - "cancel": "Cancel", - "save": "Save", - "close": "Close", - "next": "Next", - "back": "Back", - "search": "Search", - "noResults": "No results found", - "connectionError": "Check your internet connection", - "authError": "Failed to send code", - "invalidOtp": "Invalid code", - "phoneEmpty": "Enter your phone number", - "selectDestination": "Choose your destination", - "pickupLocation": "Pickup location", - "dropoffLocation": "Destination", - "chooseOnMap": "Choose on map", - "favorites": "Favorites", - "homePlace": "Home", - "workPlace": "Work", - "searchPlaces": "Search for a place...", - "recent": "Recent", - "addStop": "Add a stop", - "removeStop": "Remove stop", - "rideClasses": "Ride class", - "cash": "Cash", - "walletPayment": "Wallet", - "couponCode": "Coupon code", - "scheduleRide": "Schedule a ride", - "requestRide": "Request a ride", - "searchingDriver": "Looking for a driver...", - "cancelSearch": "Cancel search", - "driverAccepted": "Your driver accepted", - "driverArriving": "Driver is on the way", - "driverArrived": "Your driver has arrived", - "rideInProgress": "Ride in progress", - "rideCompleted": "Ride completed", - "rateDriver": "Rate your driver", - "tripFare": "Trip fare", - "waitingFee": "Waiting fee", - "discount": "Discount", - "paymentMethod": "Payment method", - "total": "Total", - "submitRating": "Submit rating", - "skipRating": "Skip", - "freeWaitMinutes": "Free wait minutes", - "minutes": "minutes", - "callDriver": "Call driver", - "chatWithDriver": "Chat with driver", - "shareTrip": "Share trip", - "emergencySOS": "Emergency SOS", - "plateNumber": "Plate number", - "vehicleInfo": "Vehicle info", - "driverRating": "Driver rating", - "eta": "Estimated arrival", - "km": "km", - "min": "min", - "searchTimeout": "No drivers available right now. Please try again", - "priceEstimate": "Price estimate", - "perKm": "/km", - "capacity": "{seats} seats", - "@capacity": { - "placeholders": { - "seats": {"type": "int"} - } - }, - "confirmPickup": "Confirm pickup", - "pickupSet": "Pickup set", - "destinationSet": "Destination set", - "routeSummary": "{distance} · {duration}", - "@routeSummary": { - "placeholders": { - "distance": {"type": "String"}, - "duration": {"type": "String"} - } - }, - "noPickupSet": "Set your pickup location", - "mapPinInstructions": "Move the map to place the pin", - "tripNoDrivers": "No drivers found nearby", - "tripCancelled": "Trip cancelled", - "tripCancelledByDriver": "Driver cancelled the trip", - "cancelFee": "Cancellation fee: {fee} {currency}", - "@cancelFee": { - "placeholders": { - "fee": {"type": "String"}, - "currency": {"type": "String"} - } - }, - "waitFreeMinutes": "{minutes} min free wait", - "@waitFreeMinutes": { - "placeholders": { - "minutes": {"type": "int"} - } - }, - "waitingCharge": "Waiting charge: {amount} {currency}", - "@waitingCharge": { - "placeholders": { - "amount": {"type": "String"}, - "currency": {"type": "String"} - } - }, - "driverEnRoute": "Driver is heading to you", - "arrivingIn": "Arriving in {eta}", - "@arrivingIn": { - "placeholders": { - "eta": {"type": "String"} - } - }, - "tripStarted": "Ride started", - "tripEnd": "Trip ended", - "fareBreakdown": "Fare breakdown", - "baseFare": "Base fare", - "distanceFare": "Distance", - "timeFare": "Time", - "surgeMultiplier": "Surge", - "couponApplied": "Coupon applied", - "youPaid": "You paid", - "payCash": "Pay cash", - "rateYourTrip": "Rate your trip", - "ratingComment": "Add a comment (optional)", - "thankYou": "Thank you for your feedback", - "tripDuration": "Trip duration: {duration}", - "@tripDuration": { - "placeholders": { - "duration": {"type": "String"} - } - }, - "tripDistance": "Trip distance: {distance}", - "@tripDistance": { - "placeholders": { - "distance": {"type": "String"} - } - }, - "edit": "Edit", - "resendIn": "Resend in {seconds}s", - "@resendIn": { - "placeholders": { - "seconds": {"type": "int"} - } - }, - "resendCode": "Resend code", - "nameTitle": "What's your name?", - "nameSubtitle": "Help us personalize your experience", - "nameHint": "Your name", - "firstNameHint": "First name", - "lastNameHint": "Last name", - "nameButton": "Continue", - "reconnect": "Reconnecting...", - "tripExpired": "Trip expired", - "loginTitle": "Welcome to Tripz", - "phoneLoginSubtitle": "Enter your phone number to log in", - "sendOtpButton": "Send OTP", - "nameEntryTitle": "What's your name?", - "homeTitle": "Home", - "destinationTitle": "Destination", - "routeTitle": "Route", - "whereToHint": "Where are you going?", - "currentLocation": "Current location", - "savedPlaces": "Saved places", - "home": "Home", - "work": "Work", - "pickFromMap": "Pick from map", - "searchHint": "Search for a place...", - "noResultsFound": "No results found", - "connecting": "Connecting...", - "tripSummary": "Trip summary", - "totalDistance": "Total distance", - "estimatedTime": "Estimated time", - "totalFare": "Total fare", - "chooseRide": "Choose a ride", - "promoCode": "Promo code", - "errorTitle": "Something went wrong", - "errorSubtitle": "Please try again", - "emptyTitle": "No data", - "emptySubtitle": "No content found yet", - "signIn": "Sign in", - "confirmPhoneNumber": "Confirm phone number", - "driverRatingValue": "Rating", - "missingDataError": "Missing data", - "onboardingTitle1": "Order with one tap", - "onboardingSubtitle1": "Enter your destination and get a driver in seconds", - "onboardingTitle2": "Track your trip live", - "onboardingSubtitle2": "Watch your driver approach in real-time", - "onboardingTitle3": "Pay your way", - "onboardingSubtitle3": "Choose to pay cash, card, or wallet", - "getStarted": "Get started", - "skip": "Skip" -} \ No newline at end of file diff --git a/apps/rider-archive-cubit/lib/core/l10n/app_localizations.dart b/apps/rider-archive-cubit/lib/core/l10n/app_localizations.dart deleted file mode 100644 index 3b7ff62..0000000 --- a/apps/rider-archive-cubit/lib/core/l10n/app_localizations.dart +++ /dev/null @@ -1,1141 +0,0 @@ -import 'dart:async'; - -import 'package:flutter/foundation.dart'; -import 'package:flutter/widgets.dart'; -import 'package:flutter_localizations/flutter_localizations.dart'; -import 'package:intl/intl.dart' as intl; - -import 'app_localizations_ar.dart'; -import 'app_localizations_en.dart'; - -// ignore_for_file: type=lint - -/// Callers can lookup localized strings with an instance of AppLocalizations -/// returned by `AppLocalizations.of(context)`. -/// -/// Applications need to include `AppLocalizations.delegate()` in their app's -/// `localizationDelegates` list, and the locales they support in the app's -/// `supportedLocales` list. For example: -/// -/// ```dart -/// import 'l10n/app_localizations.dart'; -/// -/// return MaterialApp( -/// localizationsDelegates: AppLocalizations.localizationsDelegates, -/// supportedLocales: AppLocalizations.supportedLocales, -/// home: MyApplicationHome(), -/// ); -/// ``` -/// -/// ## Update pubspec.yaml -/// -/// Please make sure to update your pubspec.yaml to include the following -/// packages: -/// -/// ```yaml -/// dependencies: -/// # Internationalization support. -/// flutter_localizations: -/// sdk: flutter -/// intl: any # Use the pinned version from flutter_localizations -/// -/// # Rest of dependencies -/// ``` -/// -/// ## iOS Applications -/// -/// iOS applications define key application metadata, including supported -/// locales, in an Info.plist file that is built into the application bundle. -/// To configure the locales supported by your app, you’ll need to edit this -/// file. -/// -/// First, open your project’s ios/Runner.xcworkspace Xcode workspace file. -/// Then, in the Project Navigator, open the Info.plist file under the Runner -/// project’s Runner folder. -/// -/// Next, select the Information Property List item, select Add Item from the -/// Editor menu, then select Localizations from the pop-up menu. -/// -/// Select and expand the newly-created Localizations item then, for each -/// locale your application supports, add a new item and select the locale -/// you wish to add from the pop-up menu in the Value field. This list should -/// be consistent with the languages listed in the AppLocalizations.supportedLocales -/// property. -abstract class AppLocalizations { - AppLocalizations(String locale) - : localeName = intl.Intl.canonicalizedLocale(locale.toString()); - - final String localeName; - - static AppLocalizations? of(BuildContext context) { - return Localizations.of(context, AppLocalizations); - } - - static const LocalizationsDelegate delegate = - _AppLocalizationsDelegate(); - - /// A list of this localizations delegate along with the default localizations - /// delegates. - /// - /// Returns a list of localizations delegates containing this delegate along with - /// GlobalMaterialLocalizations.delegate, GlobalCupertinoLocalizations.delegate, - /// and GlobalWidgetsLocalizations.delegate. - /// - /// Additional delegates can be added by appending to this list in - /// MaterialApp. This list does not have to be used at all if a custom list - /// of delegates is preferred or required. - static const List> localizationsDelegates = - >[ - delegate, - GlobalMaterialLocalizations.delegate, - GlobalCupertinoLocalizations.delegate, - GlobalWidgetsLocalizations.delegate, - ]; - - /// A list of this localizations delegate's supported locales. - static const List supportedLocales = [ - Locale('ar'), - Locale('en') - ]; - - /// No description provided for @appName. - /// - /// In ar, this message translates to: - /// **'Tripz'** - String get appName; - - /// No description provided for @appTagline. - /// - /// In ar, this message translates to: - /// **'اسحب، وصل، وصل'** - String get appTagline; - - /// No description provided for @phoneTitle. - /// - /// In ar, this message translates to: - /// **'أدخل رقم هاتفك للمتابعة'** - String get phoneTitle; - - /// No description provided for @phoneLabel. - /// - /// In ar, this message translates to: - /// **'رقم الهاتف'** - String get phoneLabel; - - /// No description provided for @phoneHint. - /// - /// In ar, this message translates to: - /// **'07XXXXXXXX'** - String get phoneHint; - - /// No description provided for @sendCode. - /// - /// In ar, this message translates to: - /// **'إرسال الرمز'** - String get sendCode; - - /// No description provided for @otpTitle. - /// - /// In ar, this message translates to: - /// **'أدخل رمز التحقق'** - String get otpTitle; - - /// No description provided for @otpSentTo. - /// - /// In ar, this message translates to: - /// **'أُرسل إلى {phone}'** - String otpSentTo(String phone); - - /// No description provided for @otpLabel. - /// - /// In ar, this message translates to: - /// **'الرمز'** - String get otpLabel; - - /// No description provided for @confirm. - /// - /// In ar, this message translates to: - /// **'تأكيد'** - String get confirm; - - /// No description provided for @welcome. - /// - /// In ar, this message translates to: - /// **'مرحباً {name}'** - String welcome(String name); - - /// No description provided for @welcomeBack. - /// - /// In ar, this message translates to: - /// **'مرحباً بعودتك'** - String get welcomeBack; - - /// No description provided for @whereTo. - /// - /// In ar, this message translates to: - /// **'إلى أين؟'** - String get whereTo; - - /// No description provided for @setLocationOnMap. - /// - /// In ar, this message translates to: - /// **'تحديد الموقع على الخريطة'** - String get setLocationOnMap; - - /// No description provided for @myTrips. - /// - /// In ar, this message translates to: - /// **'رحلاتي'** - String get myTrips; - - /// No description provided for @wallet. - /// - /// In ar, this message translates to: - /// **'المحفظة'** - String get wallet; - - /// No description provided for @coupons. - /// - /// In ar, this message translates to: - /// **'الكوبونات والدعوات'** - String get coupons; - - /// No description provided for @settings. - /// - /// In ar, this message translates to: - /// **'الإعدادات'** - String get settings; - - /// No description provided for @support. - /// - /// In ar, this message translates to: - /// **'الدعم'** - String get support; - - /// No description provided for @logout. - /// - /// In ar, this message translates to: - /// **'تسجيل الخروج'** - String get logout; - - /// No description provided for @language. - /// - /// In ar, this message translates to: - /// **'اللغة'** - String get language; - - /// No description provided for @arabic. - /// - /// In ar, this message translates to: - /// **'العربية'** - String get arabic; - - /// No description provided for @english. - /// - /// In ar, this message translates to: - /// **'English'** - String get english; - - /// No description provided for @theme. - /// - /// In ar, this message translates to: - /// **'المظهر'** - String get theme; - - /// No description provided for @lightMode. - /// - /// In ar, this message translates to: - /// **'الوضع النهاري'** - String get lightMode; - - /// No description provided for @darkMode. - /// - /// In ar, this message translates to: - /// **'الوضع الليلي'** - String get darkMode; - - /// No description provided for @systemMode. - /// - /// In ar, this message translates to: - /// **'تلقائي'** - String get systemMode; - - /// No description provided for @errorGeneric. - /// - /// In ar, this message translates to: - /// **'حدث خطأ ما'** - String get errorGeneric; - - /// No description provided for @retry. - /// - /// In ar, this message translates to: - /// **'أعد المحاولة'** - String get retry; - - /// No description provided for @emptyGeneric. - /// - /// In ar, this message translates to: - /// **'لا توجد عناصر بعد'** - String get emptyGeneric; - - /// No description provided for @loading. - /// - /// In ar, this message translates to: - /// **'جارٍ التحميل...'** - String get loading; - - /// No description provided for @cancel. - /// - /// In ar, this message translates to: - /// **'إلغاء'** - String get cancel; - - /// No description provided for @save. - /// - /// In ar, this message translates to: - /// **'حفظ'** - String get save; - - /// No description provided for @close. - /// - /// In ar, this message translates to: - /// **'إغلاق'** - String get close; - - /// No description provided for @next. - /// - /// In ar, this message translates to: - /// **'التالي'** - String get next; - - /// No description provided for @back. - /// - /// In ar, this message translates to: - /// **'رجوع'** - String get back; - - /// No description provided for @search. - /// - /// In ar, this message translates to: - /// **'بحث'** - String get search; - - /// No description provided for @noResults. - /// - /// In ar, this message translates to: - /// **'لا توجد نتائج'** - String get noResults; - - /// No description provided for @connectionError. - /// - /// In ar, this message translates to: - /// **'تحقق من اتصالك بالإنترنت'** - String get connectionError; - - /// No description provided for @authError. - /// - /// In ar, this message translates to: - /// **'تعذّر إرسال الرمز'** - String get authError; - - /// No description provided for @invalidOtp. - /// - /// In ar, this message translates to: - /// **'رمز غير صحيح'** - String get invalidOtp; - - /// No description provided for @phoneEmpty. - /// - /// In ar, this message translates to: - /// **'أدخل رقم الهاتف'** - String get phoneEmpty; - - /// No description provided for @selectDestination. - /// - /// In ar, this message translates to: - /// **'اختر وجهتك'** - String get selectDestination; - - /// No description provided for @pickupLocation. - /// - /// In ar, this message translates to: - /// **'نقطة الانطلاق'** - String get pickupLocation; - - /// No description provided for @dropoffLocation. - /// - /// In ar, this message translates to: - /// **'الوجهة'** - String get dropoffLocation; - - /// No description provided for @chooseOnMap. - /// - /// In ar, this message translates to: - /// **'اختر من الخريطة'** - String get chooseOnMap; - - /// No description provided for @favorites. - /// - /// In ar, this message translates to: - /// **'المفضلة'** - String get favorites; - - /// No description provided for @homePlace. - /// - /// In ar, this message translates to: - /// **'البيت'** - String get homePlace; - - /// No description provided for @workPlace. - /// - /// In ar, this message translates to: - /// **'العمل'** - String get workPlace; - - /// No description provided for @searchPlaces. - /// - /// In ar, this message translates to: - /// **'ابحث عن مكان...'** - String get searchPlaces; - - /// No description provided for @recent. - /// - /// In ar, this message translates to: - /// **'الأخيرة'** - String get recent; - - /// No description provided for @addStop. - /// - /// In ar, this message translates to: - /// **'إضافة توقف'** - String get addStop; - - /// No description provided for @removeStop. - /// - /// In ar, this message translates to: - /// **'إزالة التوقف'** - String get removeStop; - - /// No description provided for @rideClasses. - /// - /// In ar, this message translates to: - /// **'فئة الرحلة'** - String get rideClasses; - - /// No description provided for @cash. - /// - /// In ar, this message translates to: - /// **'نقدي'** - String get cash; - - /// No description provided for @walletPayment. - /// - /// In ar, this message translates to: - /// **'المحفظة'** - String get walletPayment; - - /// No description provided for @couponCode. - /// - /// In ar, this message translates to: - /// **'كود الخصم'** - String get couponCode; - - /// No description provided for @scheduleRide. - /// - /// In ar, this message translates to: - /// **'جدولة رحلة'** - String get scheduleRide; - - /// No description provided for @requestRide. - /// - /// In ar, this message translates to: - /// **'اطلب رحلة'** - String get requestRide; - - /// No description provided for @searchingDriver. - /// - /// In ar, this message translates to: - /// **'جارٍ البحث عن سائق...'** - String get searchingDriver; - - /// No description provided for @cancelSearch. - /// - /// In ar, this message translates to: - /// **'إلغاء البحث'** - String get cancelSearch; - - /// No description provided for @driverAccepted. - /// - /// In ar, this message translates to: - /// **'قبل سائقك الرحلة'** - String get driverAccepted; - - /// No description provided for @driverArriving. - /// - /// In ar, this message translates to: - /// **'السائق في طريقه إليك'** - String get driverArriving; - - /// No description provided for @driverArrived. - /// - /// In ar, this message translates to: - /// **'وصل سائقك'** - String get driverArrived; - - /// No description provided for @rideInProgress. - /// - /// In ar, this message translates to: - /// **'الرحلة جارية'** - String get rideInProgress; - - /// No description provided for @rideCompleted. - /// - /// In ar, this message translates to: - /// **'انتهت الرحلة'** - String get rideCompleted; - - /// No description provided for @rateDriver. - /// - /// In ar, this message translates to: - /// **'قيّم سائقك'** - String get rateDriver; - - /// No description provided for @tripFare. - /// - /// In ar, this message translates to: - /// **'أجرة الرحلة'** - String get tripFare; - - /// No description provided for @waitingFee. - /// - /// In ar, this message translates to: - /// **'رسوم الانتظار'** - String get waitingFee; - - /// No description provided for @discount. - /// - /// In ar, this message translates to: - /// **'الخصم'** - String get discount; - - /// No description provided for @paymentMethod. - /// - /// In ar, this message translates to: - /// **'طريقة الدفع'** - String get paymentMethod; - - /// No description provided for @total. - /// - /// In ar, this message translates to: - /// **'المجموع'** - String get total; - - /// No description provided for @submitRating. - /// - /// In ar, this message translates to: - /// **'إرسال التقييم'** - String get submitRating; - - /// No description provided for @skipRating. - /// - /// In ar, this message translates to: - /// **'تخطي'** - String get skipRating; - - /// No description provided for @freeWaitMinutes. - /// - /// In ar, this message translates to: - /// **'دقائق انتظار مجانية'** - String get freeWaitMinutes; - - /// No description provided for @minutes. - /// - /// In ar, this message translates to: - /// **'دقائق'** - String get minutes; - - /// No description provided for @callDriver. - /// - /// In ar, this message translates to: - /// **'اتصل بالسائق'** - String get callDriver; - - /// No description provided for @chatWithDriver. - /// - /// In ar, this message translates to: - /// **'دردشة مع السائق'** - String get chatWithDriver; - - /// No description provided for @shareTrip. - /// - /// In ar, this message translates to: - /// **'مشاركة الرحلة'** - String get shareTrip; - - /// No description provided for @emergencySOS. - /// - /// In ar, this message translates to: - /// **'طارئ SOS'** - String get emergencySOS; - - /// No description provided for @plateNumber. - /// - /// In ar, this message translates to: - /// **'رقم اللوحة'** - String get plateNumber; - - /// No description provided for @vehicleInfo. - /// - /// In ar, this message translates to: - /// **'معلومات المركبة'** - String get vehicleInfo; - - /// No description provided for @driverRating. - /// - /// In ar, this message translates to: - /// **'تقييم السائق'** - String get driverRating; - - /// No description provided for @eta. - /// - /// In ar, this message translates to: - /// **'الوصول المتوقع'** - String get eta; - - /// No description provided for @km. - /// - /// In ar, this message translates to: - /// **'كم'** - String get km; - - /// No description provided for @min. - /// - /// In ar, this message translates to: - /// **'د'** - String get min; - - /// No description provided for @searchTimeout. - /// - /// In ar, this message translates to: - /// **'لم نجد سائقاً متاحاً حالياً. حاول مرة أخرى'** - String get searchTimeout; - - /// No description provided for @priceEstimate. - /// - /// In ar, this message translates to: - /// **'تقدير السعر'** - String get priceEstimate; - - /// No description provided for @perKm. - /// - /// In ar, this message translates to: - /// **'/كم'** - String get perKm; - - /// No description provided for @capacity. - /// - /// In ar, this message translates to: - /// **'{seats} مقاعد'** - String capacity(int seats); - - /// No description provided for @confirmPickup. - /// - /// In ar, this message translates to: - /// **'تأكيد نقطة الانطلاق'** - String get confirmPickup; - - /// No description provided for @pickupSet. - /// - /// In ar, this message translates to: - /// **'تم تحديد نقطة الانطلاق'** - String get pickupSet; - - /// No description provided for @destinationSet. - /// - /// In ar, this message translates to: - /// **'تم تحديد الوجهة'** - String get destinationSet; - - /// No description provided for @routeSummary. - /// - /// In ar, this message translates to: - /// **'{distance} · {duration}'** - String routeSummary(String distance, String duration); - - /// No description provided for @noPickupSet. - /// - /// In ar, this message translates to: - /// **'حدد نقطة انطلاقك'** - String get noPickupSet; - - /// No description provided for @mapPinInstructions. - /// - /// In ar, this message translates to: - /// **'حرّك الخريطة لإظهار الدبوس'** - String get mapPinInstructions; - - /// No description provided for @tripNoDrivers. - /// - /// In ar, this message translates to: - /// **'لم نجد سائقين بالقرب'** - String get tripNoDrivers; - - /// No description provided for @tripCancelled. - /// - /// In ar, this message translates to: - /// **'تم إلغاء الرحلة'** - String get tripCancelled; - - /// No description provided for @tripCancelledByDriver. - /// - /// In ar, this message translates to: - /// **'ألغى السائق الرحلة'** - String get tripCancelledByDriver; - - /// No description provided for @cancelFee. - /// - /// In ar, this message translates to: - /// **'رسوم الإلغاء: {fee} {currency}'** - String cancelFee(String fee, String currency); - - /// No description provided for @waitFreeMinutes. - /// - /// In ar, this message translates to: - /// **'{minutes} دقائق انتظار مجانية'** - String waitFreeMinutes(int minutes); - - /// No description provided for @waitingCharge. - /// - /// In ar, this message translates to: - /// **'رسوم الانتظار: {amount} {currency}'** - String waitingCharge(String amount, String currency); - - /// No description provided for @driverEnRoute. - /// - /// In ar, this message translates to: - /// **'السائق في طريقه إليك'** - String get driverEnRoute; - - /// No description provided for @arrivingIn. - /// - /// In ar, this message translates to: - /// **'الوصول خلال {eta}'** - String arrivingIn(String eta); - - /// No description provided for @tripStarted. - /// - /// In ar, this message translates to: - /// **'بدأت الرحلة'** - String get tripStarted; - - /// No description provided for @tripEnd. - /// - /// In ar, this message translates to: - /// **'انتهت الرحلة'** - String get tripEnd; - - /// No description provided for @fareBreakdown. - /// - /// In ar, this message translates to: - /// **'تفاصيل الأجرة'** - String get fareBreakdown; - - /// No description provided for @baseFare. - /// - /// In ar, this message translates to: - /// **'الأجرة الأساسية'** - String get baseFare; - - /// No description provided for @distanceFare. - /// - /// In ar, this message translates to: - /// **'المسافة'** - String get distanceFare; - - /// No description provided for @timeFare. - /// - /// In ar, this message translates to: - /// **'الوقت'** - String get timeFare; - - /// No description provided for @surgeMultiplier. - /// - /// In ar, this message translates to: - /// **'الذروة'** - String get surgeMultiplier; - - /// No description provided for @couponApplied. - /// - /// In ar, this message translates to: - /// **'تم تطبيق الكوبون'** - String get couponApplied; - - /// No description provided for @youPaid. - /// - /// In ar, this message translates to: - /// **'دفعت'** - String get youPaid; - - /// No description provided for @payCash. - /// - /// In ar, this message translates to: - /// **'ادفع نقدي'** - String get payCash; - - /// No description provided for @rateYourTrip. - /// - /// In ar, this message translates to: - /// **'قيّم رحلتك'** - String get rateYourTrip; - - /// No description provided for @ratingComment. - /// - /// In ar, this message translates to: - /// **'أضف تعليقاً (اختياري)'** - String get ratingComment; - - /// No description provided for @thankYou. - /// - /// In ar, this message translates to: - /// **'شكراً على ملاحظاتك'** - String get thankYou; - - /// No description provided for @tripDuration. - /// - /// In ar, this message translates to: - /// **'مدة الرحلة: {duration}'** - String tripDuration(String duration); - - /// No description provided for @tripDistance. - /// - /// In ar, this message translates to: - /// **'مسافة الرحلة: {distance}'** - String tripDistance(String distance); - - /// No description provided for @edit. - /// - /// In ar, this message translates to: - /// **'تعديل'** - String get edit; - - /// No description provided for @resendIn. - /// - /// In ar, this message translates to: - /// **'إعادة إرسال خلال {seconds}ث'** - String resendIn(int seconds); - - /// No description provided for @resendCode. - /// - /// In ar, this message translates to: - /// **'إعادة إرسال الرمز'** - String get resendCode; - - /// No description provided for @nameTitle. - /// - /// In ar, this message translates to: - /// **'ما اسمك؟'** - String get nameTitle; - - /// No description provided for @nameSubtitle. - /// - /// In ar, this message translates to: - /// **'ساعدنا في تخصيص تجربتك'** - String get nameSubtitle; - - /// No description provided for @nameHint. - /// - /// In ar, this message translates to: - /// **'اسمك'** - String get nameHint; - - /// No description provided for @firstNameHint. - /// - /// In ar, this message translates to: - /// **'الاسم الأول'** - String get firstNameHint; - - /// No description provided for @lastNameHint. - /// - /// In ar, this message translates to: - /// **'اسم العائلة'** - String get lastNameHint; - - /// No description provided for @nameButton. - /// - /// In ar, this message translates to: - /// **'متابعة'** - String get nameButton; - - /// No description provided for @reconnect. - /// - /// In ar, this message translates to: - /// **'جارٍ إعادة الاتصال...'** - String get reconnect; - - /// No description provided for @tripExpired. - /// - /// In ar, this message translates to: - /// **'انتهت صلاحية الرحلة'** - String get tripExpired; - - /// No description provided for @loginTitle. - /// - /// In ar, this message translates to: - /// **'مرحباً بك في Tripz'** - String get loginTitle; - - /// No description provided for @phoneLoginSubtitle. - /// - /// In ar, this message translates to: - /// **'أدخل رقم هاتفك لتسجيل الدخول'** - String get phoneLoginSubtitle; - - /// No description provided for @sendOtpButton. - /// - /// In ar, this message translates to: - /// **'إرسال رمز التحقق'** - String get sendOtpButton; - - /// No description provided for @nameEntryTitle. - /// - /// In ar, this message translates to: - /// **'ما اسمك؟'** - String get nameEntryTitle; - - /// No description provided for @homeTitle. - /// - /// In ar, this message translates to: - /// **'الرئيسية'** - String get homeTitle; - - /// No description provided for @destinationTitle. - /// - /// In ar, this message translates to: - /// **'الوجهة'** - String get destinationTitle; - - /// No description provided for @routeTitle. - /// - /// In ar, this message translates to: - /// **'المسار'** - String get routeTitle; - - /// No description provided for @whereToHint. - /// - /// In ar, this message translates to: - /// **'إلى أين تريد الذهاب؟'** - String get whereToHint; - - /// No description provided for @currentLocation. - /// - /// In ar, this message translates to: - /// **'الموقع الحالي'** - String get currentLocation; - - /// No description provided for @savedPlaces. - /// - /// In ar, this message translates to: - /// **'الأماكن المحفوظة'** - String get savedPlaces; - - /// No description provided for @home. - /// - /// In ar, this message translates to: - /// **'المنزل'** - String get home; - - /// No description provided for @work. - /// - /// In ar, this message translates to: - /// **'العمل'** - String get work; - - /// No description provided for @pickFromMap. - /// - /// In ar, this message translates to: - /// **'اختيار من الخريطة'** - String get pickFromMap; - - /// No description provided for @searchHint. - /// - /// In ar, this message translates to: - /// **'ابحث عن مكان...'** - String get searchHint; - - /// No description provided for @noResultsFound. - /// - /// In ar, this message translates to: - /// **'لا توجد نتائج'** - String get noResultsFound; - - /// No description provided for @connecting. - /// - /// In ar, this message translates to: - /// **'جارٍ الاتصال...'** - String get connecting; - - /// No description provided for @tripSummary. - /// - /// In ar, this message translates to: - /// **'ملخص الرحلة'** - String get tripSummary; - - /// No description provided for @totalDistance. - /// - /// In ar, this message translates to: - /// **'المسافة الإجمالية'** - String get totalDistance; - - /// No description provided for @estimatedTime. - /// - /// In ar, this message translates to: - /// **'الوقت المقدر'** - String get estimatedTime; - - /// No description provided for @totalFare. - /// - /// In ar, this message translates to: - /// **'الأجرة الإجمالية'** - String get totalFare; - - /// No description provided for @chooseRide. - /// - /// In ar, this message translates to: - /// **'اختر نوع الرحلة'** - String get chooseRide; - - /// No description provided for @promoCode. - /// - /// In ar, this message translates to: - /// **'كود الترويج'** - String get promoCode; - - /// No description provided for @errorTitle. - /// - /// In ar, this message translates to: - /// **'حدث خطأ'** - String get errorTitle; - - /// No description provided for @errorSubtitle. - /// - /// In ar, this message translates to: - /// **'يرجى المحاولة مرة أخرى'** - String get errorSubtitle; - - /// No description provided for @emptyTitle. - /// - /// In ar, this message translates to: - /// **'لا توجد بيانات'** - String get emptyTitle; - - /// No description provided for @emptySubtitle. - /// - /// In ar, this message translates to: - /// **'لم يتم العثور على محتوى حالياً'** - String get emptySubtitle; - - /// No description provided for @signIn. - /// - /// In ar, this message translates to: - /// **'تسجيل الدخول'** - String get signIn; - - /// No description provided for @confirmPhoneNumber. - /// - /// In ar, this message translates to: - /// **'تأكيد رقم الهاتف'** - String get confirmPhoneNumber; - - /// No description provided for @driverRatingValue. - /// - /// In ar, this message translates to: - /// **'التقييم'** - String get driverRatingValue; - - /// No description provided for @missingDataError. - /// - /// In ar, this message translates to: - /// **'بيانات مفقودة'** - String get missingDataError; - - /// No description provided for @onboardingTitle1. - /// - /// In ar, this message translates to: - /// **'اطلب بلمسة واحدة'** - String get onboardingTitle1; - - /// No description provided for @onboardingSubtitle1. - /// - /// In ar, this message translates to: - /// **'أدخل وجهتك واحصل على سائق في ثوانٍ'** - String get onboardingSubtitle1; - - /// No description provided for @onboardingTitle2. - /// - /// In ar, this message translates to: - /// **'تتبع رحلتك مباشرة'** - String get onboardingTitle2; - - /// No description provided for @onboardingSubtitle2. - /// - /// In ar, this message translates to: - /// **'شاهد سائقك وهو يقترب في الوقت الفعلي'** - String get onboardingSubtitle2; - - /// No description provided for @onboardingTitle3. - /// - /// In ar, this message translates to: - /// **'ادفع كما يناسبك'** - String get onboardingTitle3; - - /// No description provided for @onboardingSubtitle3. - /// - /// In ar, this message translates to: - /// **'اختر الدفع نقدًا أو بالبطاقة أو عبر المحفظة'** - String get onboardingSubtitle3; - - /// No description provided for @getStarted. - /// - /// In ar, this message translates to: - /// **'ابدأ الآن'** - String get getStarted; - - /// No description provided for @skip. - /// - /// In ar, this message translates to: - /// **'تخطي'** - String get skip; -} - -class _AppLocalizationsDelegate - extends LocalizationsDelegate { - const _AppLocalizationsDelegate(); - - @override - Future load(Locale locale) { - return SynchronousFuture(lookupAppLocalizations(locale)); - } - - @override - bool isSupported(Locale locale) => - ['ar', 'en'].contains(locale.languageCode); - - @override - bool shouldReload(_AppLocalizationsDelegate old) => false; -} - -AppLocalizations lookupAppLocalizations(Locale locale) { - // Lookup logic when only language code is specified. - switch (locale.languageCode) { - case 'ar': - return AppLocalizationsAr(); - case 'en': - return AppLocalizationsEn(); - } - - throw FlutterError( - 'AppLocalizations.delegate failed to load unsupported locale "$locale". This is likely ' - 'an issue with the localizations generation tool. Please file an issue ' - 'on GitHub with a reproducible sample app and the gen-l10n configuration ' - 'that was used.'); -} diff --git a/apps/rider-archive-cubit/lib/core/l10n/app_localizations_ar.dart b/apps/rider-archive-cubit/lib/core/l10n/app_localizations_ar.dart deleted file mode 100644 index 15fa0fd..0000000 --- a/apps/rider-archive-cubit/lib/core/l10n/app_localizations_ar.dart +++ /dev/null @@ -1,537 +0,0 @@ -// ignore: unused_import -import 'package:intl/intl.dart' as intl; -import 'app_localizations.dart'; - -// ignore_for_file: type=lint - -/// The translations for Arabic (`ar`). -class AppLocalizationsAr extends AppLocalizations { - AppLocalizationsAr([String locale = 'ar']) : super(locale); - - @override - String get appName => 'Tripz'; - - @override - String get appTagline => 'اسحب، وصل، وصل'; - - @override - String get phoneTitle => 'أدخل رقم هاتفك للمتابعة'; - - @override - String get phoneLabel => 'رقم الهاتف'; - - @override - String get phoneHint => '07XXXXXXXX'; - - @override - String get sendCode => 'إرسال الرمز'; - - @override - String get otpTitle => 'أدخل رمز التحقق'; - - @override - String otpSentTo(String phone) { - return 'أُرسل إلى $phone'; - } - - @override - String get otpLabel => 'الرمز'; - - @override - String get confirm => 'تأكيد'; - - @override - String welcome(String name) { - return 'مرحباً $name'; - } - - @override - String get welcomeBack => 'مرحباً بعودتك'; - - @override - String get whereTo => 'إلى أين؟'; - - @override - String get setLocationOnMap => 'تحديد الموقع على الخريطة'; - - @override - String get myTrips => 'رحلاتي'; - - @override - String get wallet => 'المحفظة'; - - @override - String get coupons => 'الكوبونات والدعوات'; - - @override - String get settings => 'الإعدادات'; - - @override - String get support => 'الدعم'; - - @override - String get logout => 'تسجيل الخروج'; - - @override - String get language => 'اللغة'; - - @override - String get arabic => 'العربية'; - - @override - String get english => 'English'; - - @override - String get theme => 'المظهر'; - - @override - String get lightMode => 'الوضع النهاري'; - - @override - String get darkMode => 'الوضع الليلي'; - - @override - String get systemMode => 'تلقائي'; - - @override - String get errorGeneric => 'حدث خطأ ما'; - - @override - String get retry => 'أعد المحاولة'; - - @override - String get emptyGeneric => 'لا توجد عناصر بعد'; - - @override - String get loading => 'جارٍ التحميل...'; - - @override - String get cancel => 'إلغاء'; - - @override - String get save => 'حفظ'; - - @override - String get close => 'إغلاق'; - - @override - String get next => 'التالي'; - - @override - String get back => 'رجوع'; - - @override - String get search => 'بحث'; - - @override - String get noResults => 'لا توجد نتائج'; - - @override - String get connectionError => 'تحقق من اتصالك بالإنترنت'; - - @override - String get authError => 'تعذّر إرسال الرمز'; - - @override - String get invalidOtp => 'رمز غير صحيح'; - - @override - String get phoneEmpty => 'أدخل رقم الهاتف'; - - @override - String get selectDestination => 'اختر وجهتك'; - - @override - String get pickupLocation => 'نقطة الانطلاق'; - - @override - String get dropoffLocation => 'الوجهة'; - - @override - String get chooseOnMap => 'اختر من الخريطة'; - - @override - String get favorites => 'المفضلة'; - - @override - String get homePlace => 'البيت'; - - @override - String get workPlace => 'العمل'; - - @override - String get searchPlaces => 'ابحث عن مكان...'; - - @override - String get recent => 'الأخيرة'; - - @override - String get addStop => 'إضافة توقف'; - - @override - String get removeStop => 'إزالة التوقف'; - - @override - String get rideClasses => 'فئة الرحلة'; - - @override - String get cash => 'نقدي'; - - @override - String get walletPayment => 'المحفظة'; - - @override - String get couponCode => 'كود الخصم'; - - @override - String get scheduleRide => 'جدولة رحلة'; - - @override - String get requestRide => 'اطلب رحلة'; - - @override - String get searchingDriver => 'جارٍ البحث عن سائق...'; - - @override - String get cancelSearch => 'إلغاء البحث'; - - @override - String get driverAccepted => 'قبل سائقك الرحلة'; - - @override - String get driverArriving => 'السائق في طريقه إليك'; - - @override - String get driverArrived => 'وصل سائقك'; - - @override - String get rideInProgress => 'الرحلة جارية'; - - @override - String get rideCompleted => 'انتهت الرحلة'; - - @override - String get rateDriver => 'قيّم سائقك'; - - @override - String get tripFare => 'أجرة الرحلة'; - - @override - String get waitingFee => 'رسوم الانتظار'; - - @override - String get discount => 'الخصم'; - - @override - String get paymentMethod => 'طريقة الدفع'; - - @override - String get total => 'المجموع'; - - @override - String get submitRating => 'إرسال التقييم'; - - @override - String get skipRating => 'تخطي'; - - @override - String get freeWaitMinutes => 'دقائق انتظار مجانية'; - - @override - String get minutes => 'دقائق'; - - @override - String get callDriver => 'اتصل بالسائق'; - - @override - String get chatWithDriver => 'دردشة مع السائق'; - - @override - String get shareTrip => 'مشاركة الرحلة'; - - @override - String get emergencySOS => 'طارئ SOS'; - - @override - String get plateNumber => 'رقم اللوحة'; - - @override - String get vehicleInfo => 'معلومات المركبة'; - - @override - String get driverRating => 'تقييم السائق'; - - @override - String get eta => 'الوصول المتوقع'; - - @override - String get km => 'كم'; - - @override - String get min => 'د'; - - @override - String get searchTimeout => 'لم نجد سائقاً متاحاً حالياً. حاول مرة أخرى'; - - @override - String get priceEstimate => 'تقدير السعر'; - - @override - String get perKm => '/كم'; - - @override - String capacity(int seats) { - return '$seats مقاعد'; - } - - @override - String get confirmPickup => 'تأكيد نقطة الانطلاق'; - - @override - String get pickupSet => 'تم تحديد نقطة الانطلاق'; - - @override - String get destinationSet => 'تم تحديد الوجهة'; - - @override - String routeSummary(String distance, String duration) { - return '$distance · $duration'; - } - - @override - String get noPickupSet => 'حدد نقطة انطلاقك'; - - @override - String get mapPinInstructions => 'حرّك الخريطة لإظهار الدبوس'; - - @override - String get tripNoDrivers => 'لم نجد سائقين بالقرب'; - - @override - String get tripCancelled => 'تم إلغاء الرحلة'; - - @override - String get tripCancelledByDriver => 'ألغى السائق الرحلة'; - - @override - String cancelFee(String fee, String currency) { - return 'رسوم الإلغاء: $fee $currency'; - } - - @override - String waitFreeMinutes(int minutes) { - return '$minutes دقائق انتظار مجانية'; - } - - @override - String waitingCharge(String amount, String currency) { - return 'رسوم الانتظار: $amount $currency'; - } - - @override - String get driverEnRoute => 'السائق في طريقه إليك'; - - @override - String arrivingIn(String eta) { - return 'الوصول خلال $eta'; - } - - @override - String get tripStarted => 'بدأت الرحلة'; - - @override - String get tripEnd => 'انتهت الرحلة'; - - @override - String get fareBreakdown => 'تفاصيل الأجرة'; - - @override - String get baseFare => 'الأجرة الأساسية'; - - @override - String get distanceFare => 'المسافة'; - - @override - String get timeFare => 'الوقت'; - - @override - String get surgeMultiplier => 'الذروة'; - - @override - String get couponApplied => 'تم تطبيق الكوبون'; - - @override - String get youPaid => 'دفعت'; - - @override - String get payCash => 'ادفع نقدي'; - - @override - String get rateYourTrip => 'قيّم رحلتك'; - - @override - String get ratingComment => 'أضف تعليقاً (اختياري)'; - - @override - String get thankYou => 'شكراً على ملاحظاتك'; - - @override - String tripDuration(String duration) { - return 'مدة الرحلة: $duration'; - } - - @override - String tripDistance(String distance) { - return 'مسافة الرحلة: $distance'; - } - - @override - String get edit => 'تعديل'; - - @override - String resendIn(int seconds) { - return 'إعادة إرسال خلال $secondsث'; - } - - @override - String get resendCode => 'إعادة إرسال الرمز'; - - @override - String get nameTitle => 'ما اسمك؟'; - - @override - String get nameSubtitle => 'ساعدنا في تخصيص تجربتك'; - - @override - String get nameHint => 'اسمك'; - - @override - String get firstNameHint => 'الاسم الأول'; - - @override - String get lastNameHint => 'اسم العائلة'; - - @override - String get nameButton => 'متابعة'; - - @override - String get reconnect => 'جارٍ إعادة الاتصال...'; - - @override - String get tripExpired => 'انتهت صلاحية الرحلة'; - - @override - String get loginTitle => 'مرحباً بك في Tripz'; - - @override - String get phoneLoginSubtitle => 'أدخل رقم هاتفك لتسجيل الدخول'; - - @override - String get sendOtpButton => 'إرسال رمز التحقق'; - - @override - String get nameEntryTitle => 'ما اسمك؟'; - - @override - String get homeTitle => 'الرئيسية'; - - @override - String get destinationTitle => 'الوجهة'; - - @override - String get routeTitle => 'المسار'; - - @override - String get whereToHint => 'إلى أين تريد الذهاب؟'; - - @override - String get currentLocation => 'الموقع الحالي'; - - @override - String get savedPlaces => 'الأماكن المحفوظة'; - - @override - String get home => 'المنزل'; - - @override - String get work => 'العمل'; - - @override - String get pickFromMap => 'اختيار من الخريطة'; - - @override - String get searchHint => 'ابحث عن مكان...'; - - @override - String get noResultsFound => 'لا توجد نتائج'; - - @override - String get connecting => 'جارٍ الاتصال...'; - - @override - String get tripSummary => 'ملخص الرحلة'; - - @override - String get totalDistance => 'المسافة الإجمالية'; - - @override - String get estimatedTime => 'الوقت المقدر'; - - @override - String get totalFare => 'الأجرة الإجمالية'; - - @override - String get chooseRide => 'اختر نوع الرحلة'; - - @override - String get promoCode => 'كود الترويج'; - - @override - String get errorTitle => 'حدث خطأ'; - - @override - String get errorSubtitle => 'يرجى المحاولة مرة أخرى'; - - @override - String get emptyTitle => 'لا توجد بيانات'; - - @override - String get emptySubtitle => 'لم يتم العثور على محتوى حالياً'; - - @override - String get signIn => 'تسجيل الدخول'; - - @override - String get confirmPhoneNumber => 'تأكيد رقم الهاتف'; - - @override - String get driverRatingValue => 'التقييم'; - - @override - String get missingDataError => 'بيانات مفقودة'; - - @override - String get onboardingTitle1 => 'اطلب بلمسة واحدة'; - - @override - String get onboardingSubtitle1 => 'أدخل وجهتك واحصل على سائق في ثوانٍ'; - - @override - String get onboardingTitle2 => 'تتبع رحلتك مباشرة'; - - @override - String get onboardingSubtitle2 => 'شاهد سائقك وهو يقترب في الوقت الفعلي'; - - @override - String get onboardingTitle3 => 'ادفع كما يناسبك'; - - @override - String get onboardingSubtitle3 => - 'اختر الدفع نقدًا أو بالبطاقة أو عبر المحفظة'; - - @override - String get getStarted => 'ابدأ الآن'; - - @override - String get skip => 'تخطي'; -} diff --git a/apps/rider-archive-cubit/lib/core/l10n/app_localizations_en.dart b/apps/rider-archive-cubit/lib/core/l10n/app_localizations_en.dart deleted file mode 100644 index f4c7e44..0000000 --- a/apps/rider-archive-cubit/lib/core/l10n/app_localizations_en.dart +++ /dev/null @@ -1,538 +0,0 @@ -// ignore: unused_import -import 'package:intl/intl.dart' as intl; -import 'app_localizations.dart'; - -// ignore_for_file: type=lint - -/// The translations for English (`en`). -class AppLocalizationsEn extends AppLocalizations { - AppLocalizationsEn([String locale = 'en']) : super(locale); - - @override - String get appName => 'Tripz'; - - @override - String get appTagline => 'Tap, ride, arrive'; - - @override - String get phoneTitle => 'Enter your phone number to continue'; - - @override - String get phoneLabel => 'Phone number'; - - @override - String get phoneHint => '07XXXXXXXX'; - - @override - String get sendCode => 'Send code'; - - @override - String get otpTitle => 'Enter verification code'; - - @override - String otpSentTo(String phone) { - return 'Sent to $phone'; - } - - @override - String get otpLabel => 'Code'; - - @override - String get confirm => 'Confirm'; - - @override - String welcome(String name) { - return 'Welcome $name'; - } - - @override - String get welcomeBack => 'Welcome back'; - - @override - String get whereTo => 'Where to?'; - - @override - String get setLocationOnMap => 'Set location on map'; - - @override - String get myTrips => 'My trips'; - - @override - String get wallet => 'Wallet'; - - @override - String get coupons => 'Coupons & invites'; - - @override - String get settings => 'Settings'; - - @override - String get support => 'Support'; - - @override - String get logout => 'Logout'; - - @override - String get language => 'Language'; - - @override - String get arabic => 'العربية'; - - @override - String get english => 'English'; - - @override - String get theme => 'Theme'; - - @override - String get lightMode => 'Light'; - - @override - String get darkMode => 'Dark'; - - @override - String get systemMode => 'System'; - - @override - String get errorGeneric => 'Something went wrong'; - - @override - String get retry => 'Try again'; - - @override - String get emptyGeneric => 'Nothing here yet'; - - @override - String get loading => 'Loading...'; - - @override - String get cancel => 'Cancel'; - - @override - String get save => 'Save'; - - @override - String get close => 'Close'; - - @override - String get next => 'Next'; - - @override - String get back => 'Back'; - - @override - String get search => 'Search'; - - @override - String get noResults => 'No results found'; - - @override - String get connectionError => 'Check your internet connection'; - - @override - String get authError => 'Failed to send code'; - - @override - String get invalidOtp => 'Invalid code'; - - @override - String get phoneEmpty => 'Enter your phone number'; - - @override - String get selectDestination => 'Choose your destination'; - - @override - String get pickupLocation => 'Pickup location'; - - @override - String get dropoffLocation => 'Destination'; - - @override - String get chooseOnMap => 'Choose on map'; - - @override - String get favorites => 'Favorites'; - - @override - String get homePlace => 'Home'; - - @override - String get workPlace => 'Work'; - - @override - String get searchPlaces => 'Search for a place...'; - - @override - String get recent => 'Recent'; - - @override - String get addStop => 'Add a stop'; - - @override - String get removeStop => 'Remove stop'; - - @override - String get rideClasses => 'Ride class'; - - @override - String get cash => 'Cash'; - - @override - String get walletPayment => 'Wallet'; - - @override - String get couponCode => 'Coupon code'; - - @override - String get scheduleRide => 'Schedule a ride'; - - @override - String get requestRide => 'Request a ride'; - - @override - String get searchingDriver => 'Looking for a driver...'; - - @override - String get cancelSearch => 'Cancel search'; - - @override - String get driverAccepted => 'Your driver accepted'; - - @override - String get driverArriving => 'Driver is on the way'; - - @override - String get driverArrived => 'Your driver has arrived'; - - @override - String get rideInProgress => 'Ride in progress'; - - @override - String get rideCompleted => 'Ride completed'; - - @override - String get rateDriver => 'Rate your driver'; - - @override - String get tripFare => 'Trip fare'; - - @override - String get waitingFee => 'Waiting fee'; - - @override - String get discount => 'Discount'; - - @override - String get paymentMethod => 'Payment method'; - - @override - String get total => 'Total'; - - @override - String get submitRating => 'Submit rating'; - - @override - String get skipRating => 'Skip'; - - @override - String get freeWaitMinutes => 'Free wait minutes'; - - @override - String get minutes => 'minutes'; - - @override - String get callDriver => 'Call driver'; - - @override - String get chatWithDriver => 'Chat with driver'; - - @override - String get shareTrip => 'Share trip'; - - @override - String get emergencySOS => 'Emergency SOS'; - - @override - String get plateNumber => 'Plate number'; - - @override - String get vehicleInfo => 'Vehicle info'; - - @override - String get driverRating => 'Driver rating'; - - @override - String get eta => 'Estimated arrival'; - - @override - String get km => 'km'; - - @override - String get min => 'min'; - - @override - String get searchTimeout => - 'No drivers available right now. Please try again'; - - @override - String get priceEstimate => 'Price estimate'; - - @override - String get perKm => '/km'; - - @override - String capacity(int seats) { - return '$seats seats'; - } - - @override - String get confirmPickup => 'Confirm pickup'; - - @override - String get pickupSet => 'Pickup set'; - - @override - String get destinationSet => 'Destination set'; - - @override - String routeSummary(String distance, String duration) { - return '$distance · $duration'; - } - - @override - String get noPickupSet => 'Set your pickup location'; - - @override - String get mapPinInstructions => 'Move the map to place the pin'; - - @override - String get tripNoDrivers => 'No drivers found nearby'; - - @override - String get tripCancelled => 'Trip cancelled'; - - @override - String get tripCancelledByDriver => 'Driver cancelled the trip'; - - @override - String cancelFee(String fee, String currency) { - return 'Cancellation fee: $fee $currency'; - } - - @override - String waitFreeMinutes(int minutes) { - return '$minutes min free wait'; - } - - @override - String waitingCharge(String amount, String currency) { - return 'Waiting charge: $amount $currency'; - } - - @override - String get driverEnRoute => 'Driver is heading to you'; - - @override - String arrivingIn(String eta) { - return 'Arriving in $eta'; - } - - @override - String get tripStarted => 'Ride started'; - - @override - String get tripEnd => 'Trip ended'; - - @override - String get fareBreakdown => 'Fare breakdown'; - - @override - String get baseFare => 'Base fare'; - - @override - String get distanceFare => 'Distance'; - - @override - String get timeFare => 'Time'; - - @override - String get surgeMultiplier => 'Surge'; - - @override - String get couponApplied => 'Coupon applied'; - - @override - String get youPaid => 'You paid'; - - @override - String get payCash => 'Pay cash'; - - @override - String get rateYourTrip => 'Rate your trip'; - - @override - String get ratingComment => 'Add a comment (optional)'; - - @override - String get thankYou => 'Thank you for your feedback'; - - @override - String tripDuration(String duration) { - return 'Trip duration: $duration'; - } - - @override - String tripDistance(String distance) { - return 'Trip distance: $distance'; - } - - @override - String get edit => 'Edit'; - - @override - String resendIn(int seconds) { - return 'Resend in ${seconds}s'; - } - - @override - String get resendCode => 'Resend code'; - - @override - String get nameTitle => 'What\'s your name?'; - - @override - String get nameSubtitle => 'Help us personalize your experience'; - - @override - String get nameHint => 'Your name'; - - @override - String get firstNameHint => 'First name'; - - @override - String get lastNameHint => 'Last name'; - - @override - String get nameButton => 'Continue'; - - @override - String get reconnect => 'Reconnecting...'; - - @override - String get tripExpired => 'Trip expired'; - - @override - String get loginTitle => 'Welcome to Tripz'; - - @override - String get phoneLoginSubtitle => 'Enter your phone number to log in'; - - @override - String get sendOtpButton => 'Send OTP'; - - @override - String get nameEntryTitle => 'What\'s your name?'; - - @override - String get homeTitle => 'Home'; - - @override - String get destinationTitle => 'Destination'; - - @override - String get routeTitle => 'Route'; - - @override - String get whereToHint => 'Where are you going?'; - - @override - String get currentLocation => 'Current location'; - - @override - String get savedPlaces => 'Saved places'; - - @override - String get home => 'Home'; - - @override - String get work => 'Work'; - - @override - String get pickFromMap => 'Pick from map'; - - @override - String get searchHint => 'Search for a place...'; - - @override - String get noResultsFound => 'No results found'; - - @override - String get connecting => 'Connecting...'; - - @override - String get tripSummary => 'Trip summary'; - - @override - String get totalDistance => 'Total distance'; - - @override - String get estimatedTime => 'Estimated time'; - - @override - String get totalFare => 'Total fare'; - - @override - String get chooseRide => 'Choose a ride'; - - @override - String get promoCode => 'Promo code'; - - @override - String get errorTitle => 'Something went wrong'; - - @override - String get errorSubtitle => 'Please try again'; - - @override - String get emptyTitle => 'No data'; - - @override - String get emptySubtitle => 'No content found yet'; - - @override - String get signIn => 'Sign in'; - - @override - String get confirmPhoneNumber => 'Confirm phone number'; - - @override - String get driverRatingValue => 'Rating'; - - @override - String get missingDataError => 'Missing data'; - - @override - String get onboardingTitle1 => 'Order with one tap'; - - @override - String get onboardingSubtitle1 => - 'Enter your destination and get a driver in seconds'; - - @override - String get onboardingTitle2 => 'Track your trip live'; - - @override - String get onboardingSubtitle2 => 'Watch your driver approach in real-time'; - - @override - String get onboardingTitle3 => 'Pay your way'; - - @override - String get onboardingSubtitle3 => 'Choose to pay cash, card, or wallet'; - - @override - String get getStarted => 'Get started'; - - @override - String get skip => 'Skip'; -} diff --git a/apps/rider-archive-cubit/lib/core/router.dart b/apps/rider-archive-cubit/lib/core/router.dart deleted file mode 100644 index e7843d1..0000000 --- a/apps/rider-archive-cubit/lib/core/router.dart +++ /dev/null @@ -1,123 +0,0 @@ -import 'dart:async'; -import 'package:flutter/material.dart'; -import 'package:flutter_bloc/flutter_bloc.dart'; -import 'package:go_router/go_router.dart'; -import 'package:intaleq_maps/intaleq_maps.dart'; -import '../features/auth/cubit/auth_cubit.dart'; -import '../features/auth/cubit/auth_state.dart'; -import '../features/splash/view/splash_screen.dart'; -import '../features/onboarding/view/onboarding_screen.dart'; -import '../features/auth/view/phone_screen.dart'; -import '../features/auth/view/otp_screen.dart'; -import '../features/auth/view/name_screen.dart'; -import '../features/home/view/home_screen.dart'; -import '../features/home/view/destination_screen.dart'; -import '../features/home/view/route_preview_screen.dart'; -import '../features/trip/view/trip_tracking_screen.dart'; -import '../features/trip/view/trip_invoice_screen.dart'; -import '../features/trip/view/rating_screen.dart'; -import '../features/home/cubit/home_cubit.dart'; -import '../features/home/cubit/destination_cubit.dart'; -import '../features/home/cubit/quote_cubit.dart'; -import '../features/home/cubit/saved_places_cubit.dart'; -import '../features/home/data/models/place_model.dart'; -import '../features/home/data/maps_repository.dart'; -import '../features/home/data/tariff_repository.dart'; -import '../core/storage/saved_places_store.dart'; -import '../core/l10n/app_localizations.dart'; -import 'di.dart'; - -GoRouter buildRouter(AuthCubit auth) { - return GoRouter( - initialLocation: '/splash', - refreshListenable: _StreamRefresh(auth.stream), - redirect: (context, state) { - final status = auth.state.status; - final loc = state.matchedLocation; - final onSplash = loc == '/splash'; - final onOnboarding = loc == '/onboarding'; - final onAuthPages = loc == '/phone' || loc == '/otp' || loc == '/name'; - final onNamePage = loc == '/name'; - - if (status == AuthStatus.authenticated) { - final hasName = auth.state.user?.name != null && - auth.state.user!.name!.trim().isNotEmpty; - if (!hasName && !onNamePage) return '/name'; - if (hasName && onNamePage) return '/home'; - if (onAuthPages || onSplash || onOnboarding) return hasName ? '/home' : '/name'; - return null; - } - - if (onSplash || onOnboarding) return null; - - if (status == AuthStatus.codeSent && loc == '/phone') return '/otp'; - if (status != AuthStatus.authenticated && !onAuthPages) return '/phone'; - return null; - }, - routes: [ - GoRoute(path: '/splash', builder: (_, __) => const SplashScreen()), - GoRoute(path: '/onboarding', builder: (_, __) => const OnboardingScreen()), - GoRoute(path: '/phone', builder: (_, __) => const PhoneScreen()), - GoRoute(path: '/otp', builder: (_, __) => const OtpScreen()), - GoRoute(path: '/name', builder: (_, __) => const NameScreen()), - GoRoute( - path: '/home', - builder: (_, __) => MultiBlocProvider( - providers: [ - BlocProvider(create: (_) => HomeCubit(getIt())), - BlocProvider(create: (_) => SavedPlacesCubit(getIt())), - ], - child: const HomeScreen(), - ), - ), - GoRoute( - path: '/destination', - builder: (_, state) { - final extra = state.extra as Map?; - final currentLocation = extra?['currentLocation'] as LatLng?; - return BlocProvider( - create: (_) => DestinationCubit(getIt()), - child: DestinationScreen(currentLocation: currentLocation), - ); - }, - ), - GoRoute( - path: '/route-preview', - builder: (_, state) { - final extra = state.extra as Map?; - final pickup = extra?['pickup'] as PlaceModel?; - final destination = extra?['destination'] as PlaceModel?; - if (pickup == null || destination == null) { - return Builder( - builder: (ctx) => Scaffold( - body: Center( - child: Text(AppLocalizations.of(ctx)?.missingDataError ?? ''), - ), - ), - ); - } - return BlocProvider( - create: (_) => QuoteCubit(getIt()), - child: RoutePreviewScreen(pickup: pickup, destination: destination), - ); - }, - ), - GoRoute(path: '/trip-tracking', builder: (_, __) => const TripTrackingScreen()), - GoRoute(path: '/trip-invoice', builder: (_, __) => const TripInvoiceScreen()), - GoRoute(path: '/trip-rating', builder: (_, __) => const RatingScreen()), - ], - ); -} - -class _StreamRefresh extends ChangeNotifier { - late final StreamSubscription _sub; - _StreamRefresh(Stream stream) { - notifyListeners(); - _sub = stream.asBroadcastStream().listen((_) => notifyListeners()); - } - @override - void dispose() { - _sub.cancel(); - super.dispose(); - } -} diff --git a/apps/rider-archive-cubit/lib/core/storage/saved_places_store.dart b/apps/rider-archive-cubit/lib/core/storage/saved_places_store.dart deleted file mode 100644 index b16cacb..0000000 --- a/apps/rider-archive-cubit/lib/core/storage/saved_places_store.dart +++ /dev/null @@ -1,173 +0,0 @@ -import 'dart:convert'; - -import 'package:shared_preferences/shared_preferences.dart'; - -enum FavoriteType { home, work } - -class SavedPlace { - final String id; - final String name; - final String? address; - final double lat; - final double lng; - int useCount; - DateTime lastUsedAt; - FavoriteType? favoriteType; - - SavedPlace({ - required this.id, - required this.name, - this.address, - required this.lat, - required this.lng, - this.useCount = 0, - DateTime? lastUsedAt, - this.favoriteType, - }) : lastUsedAt = lastUsedAt ?? DateTime.now(); - - /// Rounding to 4 decimal places (~11m precision) for deduplication. - static double _roundCoord(double value) => - (value * 10000).roundToDouble() / 10000; - - String get dedupeKey => - '${_roundCoord(lat)},${_roundCoord(lng)}'; - - Map toJson() => { - 'id': id, - 'name': name, - 'address': address, - 'lat': lat, - 'lng': lng, - 'useCount': useCount, - 'lastUsedAt': lastUsedAt.toIso8601String(), - 'favoriteType': favoriteType?.name, - }; - - factory SavedPlace.fromJson(Map json) => SavedPlace( - id: json['id'] as String, - name: json['name'] as String, - address: json['address'] as String?, - lat: (json['lat'] as num).toDouble(), - lng: (json['lng'] as num).toDouble(), - useCount: json['useCount'] as int? ?? 0, - lastUsedAt: DateTime.parse(json['lastUsedAt'] as String), - favoriteType: json['favoriteType'] != null - ? FavoriteType.values.firstWhere( - (e) => e.name == json['favoriteType'], - ) - : null, - ); -} - -class SavedPlacesStore { - static const _key = 'saved_places'; - static const _maxItems = 50; - - Future> getAll() async { - final prefs = await SharedPreferences.getInstance(); - final raw = prefs.getString(_key); - if (raw == null) return []; - final list = (jsonDecode(raw) as List) - .map((e) => SavedPlace.fromJson(e as Map)) - .toList(); - return _sort(list); - } - - Future add(SavedPlace place) async { - final prefs = await SharedPreferences.getInstance(); - final list = await getAll(); - - final existingIndex = list.indexWhere( - (p) => p.dedupeKey == place.dedupeKey && p.favoriteType == null, - ); - - if (existingIndex != -1) { - list[existingIndex].useCount++; - list[existingIndex].lastUsedAt = DateTime.now(); - } else { - place.useCount = 1; - list.add(place); - } - - await _enforceCap(list); - await _save(prefs, list); - } - - Future remove(String placeId) async { - final prefs = await SharedPreferences.getInstance(); - final list = await getAll(); - list.removeWhere((p) => p.id == placeId); - await _save(prefs, list); - } - - Future setFavorite(String placeId, FavoriteType type) async { - final prefs = await SharedPreferences.getInstance(); - final list = await getAll(); - - // Clear any existing favorite of this type across all items. - for (final p in list) { - if (p.favoriteType == type) { - p.favoriteType = null; - } - } - - final idx = list.indexWhere((p) => p.id == placeId); - if (idx != -1) { - list[idx].favoriteType = type; - } - - await _save(prefs, list); - } - - Future clearFavorite(FavoriteType type) async { - final prefs = await SharedPreferences.getInstance(); - final list = await getAll(); - for (final p in list) { - if (p.favoriteType == type) { - p.favoriteType = null; - } - } - await _save(prefs, list); - } - - /// Removes the lowest-scoring non-favorite item when the list exceeds the cap. - /// Score = useCount (higher is better), ties broken by lastUsedAt (newer is better). - Future _enforceCap(List list) async { - if (list.length <= _maxItems) return; - - final nonFavorites = list.where((p) => p.favoriteType == null).toList() - ..sort((a, b) { - if (a.useCount != b.useCount) { - return a.useCount.compareTo(b.useCount); // ascending — lowest first - } - return a.lastUsedAt.compareTo(b.lastUsedAt); // oldest first - }); - - final toRemove = list.length - _maxItems; - final idsToRemove = - nonFavorites.take(toRemove).map((p) => p.id).toSet(); - list.removeWhere((p) => idsToRemove.contains(p.id)); - } - - List _sort(List list) { - final favoriteOrder = {FavoriteType.home: 0, FavoriteType.work: 1}; - list.sort((a, b) { - if (a.favoriteType != null && b.favoriteType == null) return -1; - if (a.favoriteType == null && b.favoriteType != null) return 1; - if (a.favoriteType != null && b.favoriteType != null) { - return favoriteOrder[a.favoriteType]! - .compareTo(favoriteOrder[b.favoriteType]!); - } - if (a.useCount != b.useCount) { - return b.useCount.compareTo(a.useCount); // descending - } - return b.lastUsedAt.compareTo(a.lastUsedAt); // newer first - }); - return list; - } - - Future _save(SharedPreferences prefs, List list) async { - final encoded = jsonEncode(list.map((p) => p.toJson()).toList()); - await prefs.setString(_key, encoded); - } -} diff --git a/apps/rider-archive-cubit/lib/core/storage/token_store.dart b/apps/rider-archive-cubit/lib/core/storage/token_store.dart deleted file mode 100644 index 9044c66..0000000 --- a/apps/rider-archive-cubit/lib/core/storage/token_store.dart +++ /dev/null @@ -1,25 +0,0 @@ -import 'package:flutter_secure_storage/flutter_secure_storage.dart'; - -/// تخزين آمن للتوكنات (access + refresh). -class TokenStore { - final FlutterSecureStorage _s = const FlutterSecureStorage(); - - Future save(String access, String refresh) async { - await _s.write(key: 'access_token', value: access); - await _s.write(key: 'refresh_token', value: refresh); - } - - Future saveUser(String userJson) async { - await _s.write(key: 'cached_user', value: userJson); - } - - Future readUser() => _s.read(key: 'cached_user'); - Future access() => _s.read(key: 'access_token'); - Future refresh() => _s.read(key: 'refresh_token'); - Future hasToken() async { - final token = await access(); - return token != null && token.isNotEmpty; - } - Future clear() => _s.deleteAll(); -} - diff --git a/apps/rider-archive-cubit/lib/core/ui/phone_intel/countries.dart b/apps/rider-archive-cubit/lib/core/ui/phone_intel/countries.dart deleted file mode 100644 index 528d4fa..0000000 --- a/apps/rider-archive-cubit/lib/core/ui/phone_intel/countries.dart +++ /dev/null @@ -1,7574 +0,0 @@ -// see: https://en.wikipedia.org/wiki/List_of_country_calling_codes -// for list of country/calling codes - -const List countries = [ - Country( - name: "Afghanistan", - nameTranslations: { - "sk": "Afganistan", - "se": "Afghanistan", - "pl": "Afganistan", - "no": "Afghanistan", - "ja": "アフガニスタン", - "it": "Afghanistan", - "zh": "阿富汗", - "nl": "Afghanistan", - "de": "Afghanistan", - "fr": "Afghanistan", - "es": "Afganistán", - "en": "Afghanistan", - "pt_BR": "Afeganistão", - "sr-Cyrl": "Авганистан", - "sr-Latn": "Avganistan", - "zh_TW": "阿富汗", - "tr": "Afganistan", - "ro": "Afganistan", - "ar": "أفغانستان", - "fa": "افغانستان", - "yue": "阿富汗" - }, - flag: "🇦🇫", - code: "AF", - dialCode: "93", - minLength: 9, - maxLength: 9, - ), - Country( - name: "Åland Islands", - nameTranslations: { - "sk": "Alandy", - "se": "Ålánda", - "pl": "Wyspy Alandzkie", - "no": "Åland", - "ja": "オーランド諸島", - "it": "Isole Åland", - "zh": "奥兰群岛", - "nl": "Åland", - "de": "Ålandinseln", - "fr": "Îles Åland", - "es": "Islas Åland", - "en": "Åland Islands", - "pt_BR": "Ilhas Aland", - "sr-Cyrl": "Аландска Острва", - "sr-Latn": "Alandska Ostrva", - "zh_TW": "奧蘭群島", - "tr": "Åland", - "ro": "Insulele Åland", - "ar": "جزر أولاند", - "fa": "جزیره اولاند", - "yue": "奧蘭群島" - }, - flag: "🇦🇽", - code: "AX", - dialCode: "358", - minLength: 15, - maxLength: 15, - ), - Country( - name: "Albania", - nameTranslations: { - "sk": "Albánsko", - "se": "Albánia", - "pl": "Albania", - "no": "Albania", - "ja": "アルバニア", - "it": "Albania", - "zh": "阿尔巴尼亚", - "nl": "Albanië", - "de": "Albanien", - "fr": "Albanie", - "es": "Albania", - "en": "Albania", - "pt_BR": "Albânia", - "sr-Cyrl": "Албанија", - "sr-Latn": "Albanija", - "zh_TW": "阿爾巴尼亞", - "tr": "Arnavutluk", - "ro": "Albania", - "ar": "ألبانيا", - "fa": "آلبانی", - "yue": "阿爾巴尼亞" - }, - flag: "🇦🇱", - code: "AL", - dialCode: "355", - minLength: 9, - maxLength: 9, - ), - Country( - name: "Algeria", - nameTranslations: { - "sk": "Alžírsko", - "se": "Algeria", - "pl": "Algieria", - "no": "Algerie", - "ja": "アルジェリア", - "it": "Algeria", - "zh": "阿尔及利亚", - "nl": "Algerije", - "de": "Algerien", - "fr": "Algérie", - "es": "Argelia", - "en": "Algeria", - "pt_BR": "Argélia", - "sr-Cyrl": "Аргентина", - "sr-Latn": "Argentina", - "zh_TW": "阿爾及利亞", - "tr": "Cezayir", - "ro": "Algeria", - "ar": "الجزائر", - "fa": "الجزیره", - "yue": "阿爾及利亞" - }, - flag: "🇩🇿", - code: "DZ", - dialCode: "213", - minLength: 9, - maxLength: 9, - ), - Country( - name: "American Samoa", - nameTranslations: { - "sk": "Americká Samoa", - "se": "Amerihká Samoa", - "pl": "Samoa Amerykańskie", - "no": "Amerikansk Samoa", - "ja": "米領サモア", - "it": "Samoa americane", - "zh": "美属萨摩亚", - "nl": "Amerikaans-Samoa", - "de": "Amerikanisch-Samoa", - "fr": "Samoa américaines", - "es": "Samoa Americana", - "en": "American Samoa", - "pt_BR": "Samoa Americana", - "sr-Cyrl": "Америчка Самоа", - "sr-Latn": "Američka Samoa", - "zh_TW": "美屬薩摩亞", - "tr": "Amerikan Samoası", - "ro": "Samoa Americană", - "ar": "ساموا الأمريكية", - "fa": "ساموا آمریکا", - "yue": "美屬薩摩亞" - }, - flag: "🇦🇸", - code: "AS", - dialCode: "1684", - minLength: 7, - maxLength: 7, - ), - Country( - name: "Andorra", - nameTranslations: { - "sk": "Andorra", - "se": "Andorra", - "pl": "Andora", - "no": "Andorra", - "ja": "アンドラ", - "it": "Andorra", - "zh": "安道尔", - "nl": "Andorra", - "de": "Andorra", - "fr": "Andorre", - "es": "Andorra", - "en": "Andorra", - "pt_BR": "Andorra", - "sr-Cyrl": "Андора", - "sr-Latn": "Andora", - "zh_TW": "安道爾", - "tr": "Andora", - "ro": "Andorra", - "ar": "أندورا", - "fa": "آندورا", - "yue": "安道爾" - }, - flag: "🇦🇩", - code: "AD", - dialCode: "376", - minLength: 6, - maxLength: 6, - ), - Country( - name: "Angola", - nameTranslations: { - "sk": "Angola", - "se": "Angola", - "pl": "Angola", - "no": "Angola", - "ja": "アンゴラ", - "it": "Angola", - "zh": "安哥拉", - "nl": "Angola", - "de": "Angola", - "fr": "Angola", - "es": "Angola", - "en": "Angola", - "pt_BR": "Angola", - "sr-Cyrl": "Ангола", - "sr-Latn": "Angola", - "zh_TW": "安哥拉", - "tr": "Angola", - "ro": "Angola", - "ar": "أنغولا", - "fa": "آنگولا", - "yue": "安哥拉" - }, - flag: "🇦🇴", - code: "AO", - dialCode: "244", - minLength: 9, - maxLength: 9, - ), - Country( - name: "Anguilla", - nameTranslations: { - "sk": "Anguilla", - "se": "Anguilla", - "pl": "Anguilla", - "no": "Anguilla", - "ja": "アンギラ", - "it": "Anguilla", - "zh": "安圭拉", - "nl": "Anguilla", - "de": "Anguilla", - "fr": "Anguilla", - "es": "Anguila", - "en": "Anguilla", - "pt_BR": "Anguilla", - "sr-Cyrl": "Ангвила", - "sr-Latn": "Angvila", - "zh_TW": "安圭拉", - "tr": "Anguilla", - "ro": "Anguilla", - "ar": "أنغويلا", - "fa": "آنگولیا", - "yue": "安圭拉" - }, - flag: "🇦🇮", - code: "AI", - dialCode: "1264", - minLength: 7, - maxLength: 7, - ), - Country( - name: "Antarctica", - nameTranslations: { - "sk": "Antarktída", - "se": "Antárktis", - "pl": "Antarktyda", - "no": "Antarktis", - "ja": "南極", - "it": "Antartide", - "zh": "南极洲", - "nl": "Antarctica", - "de": "Antarktis", - "fr": "Antarctique", - "es": "Antártida", - "en": "Antarctica", - "pt_BR": "Antártica", - "sr-Cyrl": "Антарктик", - "sr-Latn": "Antarktik", - "zh_TW": "南極", - "tr": "Antarktika", - "ro": "Antarctica", - "ar": "القارة القطبية الجنوبية", - "fa": "قطب جنوب", - "yue": "南极洲" - }, - flag: "🇦🇶", - code: "AQ", - dialCode: "672", - minLength: 6, - maxLength: 6, - ), - Country( - name: "Antigua and Barbuda", - nameTranslations: { - "sk": "Antigua a Barbuda", - "se": "Antigua ja Barbuda", - "pl": "Antigua i Barbuda", - "no": "Antigua og Barbuda", - "ja": "アンティグア・バーブーダ", - "it": "Antigua e Barbuda", - "zh": "安提瓜和巴布达", - "nl": "Antigua en Barbuda", - "de": "Antigua und Barbuda", - "fr": "Antigua-et-Barbuda", - "es": "Antigua y Barbuda", - "en": "Antigua & Barbuda", - "pt_BR": "Antigua e Barbuda", - "sr-Cyrl": "Антигва и Барбуда", - "sr-Latn": "Antigva i Barbuda", - "zh_TW": "安提瓜和巴布達", - "tr": "Antigua ve Barbuda", - "ro": "Antigua şi Barbuda", - "ar": "أنتيغوا وباربودا", - "fa": "آنتیگوآ و باربودا", - "yue": "安提瓜同巴布达" - }, - flag: "🇦🇬", - code: "AG", - dialCode: "1268", - minLength: 7, - maxLength: 7, - ), - Country( - name: "Argentina", - nameTranslations: { - "sk": "Argentína", - "se": "Argentina", - "pl": "Argentyna", - "no": "Argentina", - "ja": "アルゼンチン", - "it": "Argentina", - "zh": "阿根廷", - "nl": "Argentinië", - "de": "Argentinien", - "fr": "Argentine", - "es": "Argentina", - "en": "Argentina", - "pt_BR": "Argentina", - "sr-Cyrl": "Аргентина", - "sr-Latn": "Argentina", - "zh_TW": "阿根廷", - "tr": "Arjantin", - "ro": "Argentina", - "ar": "الأرجنتين", - "fa": "آرژانتین", - "yue": "阿根廷" - }, - flag: "🇦🇷", - code: "AR", - dialCode: "54", - minLength: 12, - maxLength: 12, - ), - Country( - name: "Armenia", - nameTranslations: { - "sk": "Arménsko", - "se": "Armenia", - "pl": "Armenia", - "no": "Armenia", - "ja": "アルメニア", - "it": "Armenia", - "zh": "亚美尼亚", - "nl": "Armenië", - "de": "Armenien", - "fr": "Arménie", - "es": "Armenia", - "en": "Armenia", - "pt_BR": "Armênia", - "sr-Cyrl": "Јерменија", - "sr-Latn": "Jermenija", - "zh_TW": "亞美尼亞", - "tr": "Ermenistan", - "ro": "Armenia", - "ar": "أرمينيا", - "fa": "ارمنستان", - "yue": "亞美尼亞" - }, - flag: "🇦🇲", - code: "AM", - dialCode: "374", - minLength: 8, - maxLength: 8, - ), - Country( - name: "Aruba", - nameTranslations: { - "sk": "Aruba", - "se": "Aruba", - "pl": "Aruba", - "no": "Aruba", - "ja": "アルバ", - "it": "Aruba", - "zh": "阿鲁巴", - "nl": "Aruba", - "de": "Aruba", - "fr": "Aruba", - "es": "Aruba", - "en": "Aruba", - "pt_BR": "Aruba", - "sr-Cyrl": "Аруба", - "sr-Latn": "Aruba", - "zh_TW": "阿魯巴", - "tr": "Aruba", - "ro": "Aruba", - "ar": "أروبا", - "fa": "آروبا", - "yue": "阿魯巴島" - }, - flag: "🇦🇼", - code: "AW", - dialCode: "297", - minLength: 7, - maxLength: 7, - ), - Country( - name: "Australia", - nameTranslations: { - "sk": "Austrália", - "se": "Austrália", - "pl": "Australia", - "no": "Australia", - "ja": "オーストラリア", - "it": "Australia", - "zh": "澳大利亚", - "nl": "Australië", - "de": "Australien", - "fr": "Australie", - "es": "Australia", - "en": "Australia", - "pt_BR": "Austrália", - "sr-Cyrl": "Аустралија", - "sr-Latn": "Australija", - "zh_TW": "澳州", - "tr": "Avustralya", - "ro": "Australia", - "ar": "أستراليا", - "fa": "استرالیا", - "yue": "澳洲" - }, - flag: "🇦🇺", - code: "AU", - dialCode: "61", - minLength: 9, - maxLength: 9, - ), - Country( - name: "Austria", - nameTranslations: { - "sk": "Rakúsko", - "se": "Nuortariika", - "pl": "Austria", - "no": "Østerrike", - "ja": "オーストリア", - "it": "Austria", - "zh": "奥地利", - "nl": "Oostenrijk", - "de": "Österreich", - "fr": "Autriche", - "es": "Austria", - "en": "Austria", - "pt_BR": "Áustria", - "sr-Cyrl": "Аустрија", - "sr-Latn": "Austrija", - "zh_TW": "奥地利", - "tr": "Avusturya", - "ro": "Austria", - "ar": "النمسا", - "fa": "اتریش", - "yue": "奧地利" - }, - flag: "🇦🇹", - code: "AT", - dialCode: "43", - minLength: 13, - maxLength: 13, - ), - Country( - name: "Azerbaijan", - nameTranslations: { - "sk": "Azerbajdžan", - "se": "Aserbaižan", - "pl": "Azerbejdżan", - "no": "Aserbajdsjan", - "ja": "アゼルバイジャン", - "it": "Azerbaigian", - "zh": "阿塞拜疆", - "nl": "Azerbeidzjan", - "de": "Aserbaidschan", - "fr": "Azerbaïdjan", - "es": "Azerbaiyán", - "en": "Azerbaijan", - "pt_BR": "Azerbaijão", - "sr-Cyrl": "Азербејџан", - "sr-Latn": "Azerbejdžan", - "zh_TW": "亞塞拜然", - "tr": "Azerbaycan", - "ro": "Azerbaidjan", - "ar": "أذربيجان", - "fa": "آذربایجان", - "yue": "阿塞拜疆" - }, - flag: "🇦🇿", - code: "AZ", - dialCode: "994", - minLength: 9, - maxLength: 9, - ), - Country( - name: "Bahamas", - nameTranslations: { - "sk": "Bahamy", - "se": "Bahamas", - "pl": "Bahamy", - "no": "Bahamas", - "ja": "バハマ", - "it": "Bahamas", - "zh": "巴哈马", - "nl": "Bahama's", - "de": "Bahamas", - "fr": "Bahamas", - "es": "Bahamas", - "en": "Bahamas", - "pt_BR": "Bahamas", - "sr-Cyrl": "Бахаме", - "sr-Latn": "Bahame", - "zh_TW": "巴哈馬", - "tr": "Bahama", - "ro": "Bahamas", - "ar": "باهاماس", - "fa": "باهاماس", - "yue": "巴哈馬" - }, - flag: "🇧🇸", - code: "BS", - dialCode: "1242", - minLength: 7, - maxLength: 7, - ), - Country( - name: "Bahrain", - nameTranslations: { - "sk": "Bahrajn", - "se": "Bahrain", - "pl": "Bahrajn", - "no": "Bahrain", - "ja": "バーレーン", - "it": "Bahrein", - "zh": "巴林", - "nl": "Bahrein", - "de": "Bahrain", - "fr": "Bahreïn", - "es": "Baréin", - "en": "Bahrain", - "pt_BR": "Bahrain", - "sr-Cyrl": "Бахреин", - "sr-Latn": "Bahrein", - "zh_TW": "巴林", - "tr": "Bahreyn", - "ro": "Bahrein", - "ar": "البحرين", - "fa": "بحرین", - "yue": "巴林" - }, - flag: "🇧🇭", - code: "BH", - dialCode: "973", - minLength: 8, - maxLength: 8, - ), - Country( - name: "Bangladesh", - nameTranslations: { - "sk": "Bangladéš", - "se": "Bangladesh", - "pl": "Bangladesz", - "no": "Bangladesh", - "ja": "バングラデシュ", - "it": "Bangladesh", - "zh": "孟加拉国", - "nl": "Bangladesh", - "de": "Bangladesch", - "fr": "Bangladesh", - "es": "Bangladés", - "en": "Bangladesh", - "pt_BR": "Bangladesh", - "sr-Cyrl": "Бангладеш", - "sr-Latn": "Bangladeš", - "zh_TW": "孟加拉", - "tr": "Bangladeş", - "ro": "Bangladesh", - "ar": "بنغلاديش", - "fa": "بنگلادش", - "yue": "孟加拉囯" - }, - flag: "🇧🇩", - code: "BD", - dialCode: "880", - minLength: 10, - maxLength: 10, - ), - Country( - name: "Barbados", - nameTranslations: { - "sk": "Barbados", - "se": "Barbados", - "pl": "Barbados", - "no": "Barbados", - "ja": "バルバドス", - "it": "Barbados", - "zh": "巴巴多斯", - "nl": "Barbados", - "de": "Barbados", - "fr": "Barbade", - "es": "Barbados", - "en": "Barbados", - "pt_BR": "Barbados", - "sr-Cyrl": "Барбадос", - "sr-Latn": "Barbados", - "zh_TW": "巴巴多斯", - "tr": "Barbados", - "ro": "Barbados", - "ar": "باربادوس", - "fa": "باربادوس", - "yue": "巴巴多斯" - }, - flag: "🇧🇧", - code: "BB", - dialCode: "1246", - minLength: 7, - maxLength: 7, - ), - Country( - name: "Belarus", - nameTranslations: { - "sk": "Bielorusko", - "se": "Vilges-Ruošša", - "pl": "Białoruś", - "no": "Hviterussland", - "ja": "ベラルーシ", - "it": "Bielorussia", - "zh": "白俄罗斯", - "nl": "Belarus", - "de": "Belarus", - "fr": "Biélorussie", - "es": "Bielorrusia", - "en": "Belarus", - "pt_BR": "Bielo-Rússia", - "sr-Cyrl": "Белорусија", - "sr-Latn": "Belorusija", - "zh_TW": "白俄羅斯", - "tr": "Belarus", - "ro": "Belarus", - "ar": "بيلاروس", - "fa": "بلاروس", - "yue": "白俄羅斯" - }, - flag: "🇧🇾", - code: "BY", - dialCode: "375", - minLength: 10, - maxLength: 10, - ), - Country( - name: "Belgium", - nameTranslations: { - "sk": "Belgicko", - "se": "Belgia", - "pl": "Belgia", - "no": "Belgia", - "ja": "ベルギー", - "it": "Belgio", - "zh": "比利时", - "nl": "België", - "de": "Belgien", - "fr": "Belgique", - "es": "Bélgica", - "en": "Belgium", - "pt_BR": "Bélgica", - "sr-Cyrl": "Белгија", - "sr-Latn": "Belgija", - "zh_TW": "比利時", - "tr": "Belçika", - "ro": "Belgia", - "ar": "بلجيكا", - "fa": "بلژیک", - "yue": "比利時" - }, - flag: "🇧🇪", - code: "BE", - dialCode: "32", - minLength: 9, - maxLength: 9, - ), - Country( - name: "Belize", - nameTranslations: { - "sk": "Belize", - "se": "Belize", - "pl": "Belize", - "no": "Belize", - "ja": "ベリーズ", - "it": "Belize", - "zh": "伯利兹", - "nl": "Belize", - "de": "Belize", - "fr": "Belize", - "es": "Belice", - "en": "Belize", - "pt_BR": "Belize", - "sr-Cyrl": "Белизе", - "sr-Latn": "Belize", - "zh_TW": "伯利茲", - "tr": "Belize", - "ro": "Belize", - "ar": "بليز", - "fa": "بليز", - "yue": "伯利茲" - }, - flag: "🇧🇿", - code: "BZ", - dialCode: "501", - minLength: 7, - maxLength: 7, - ), - Country( - name: "Benin", - nameTranslations: { - "sk": "Benin", - "se": "Benin", - "pl": "Benin", - "no": "Benin", - "ja": "ベナン", - "it": "Benin", - "zh": "贝宁", - "nl": "Benin", - "de": "Benin", - "fr": "Bénin", - "es": "Benín", - "en": "Benin", - "pt_BR": "Benin", - "sr-Cyrl": "Бенин", - "sr-Latn": "Benin", - "zh_TW": "貝南", - "tr": "Benin", - "ro": "Benin", - "ar": "بنين", - "fa": "بنين", - "yue": "貝寧" - }, - flag: "🇧🇯", - code: "BJ", - dialCode: "229", - minLength: 8, - maxLength: 8, - ), - Country( - name: "Bermuda", - nameTranslations: { - "sk": "Bermudy", - "se": "Bermuda", - "pl": "Bermudy", - "no": "Bermuda", - "ja": "バミューダ", - "it": "Bermuda", - "zh": "百慕大", - "nl": "Bermuda", - "de": "Bermuda", - "fr": "Bermudes", - "es": "Bermudas", - "en": "Bermuda", - "pt_BR": "Bermudas", - "sr-Cyrl": "Бермуда", - "sr-Latn": "Bermuda", - "zh_TW": "百慕達", - "tr": "Bermuda", - "ro": "Insulele Bermude", - "ar": "برمودا", - "fa": "برمودا", - "yue": "百慕大" - }, - flag: "🇧🇲", - code: "BM", - dialCode: "1441", - minLength: 7, - maxLength: 7, - ), - Country( - name: "Bhutan", - nameTranslations: { - "sk": "Bhután", - "se": "Bhutan", - "pl": "Bhutan", - "no": "Bhutan", - "ja": "ブータン", - "it": "Bhutan", - "zh": "不丹", - "nl": "Bhutan", - "de": "Bhutan", - "fr": "Bhoutan", - "es": "Bután", - "en": "Bhutan", - "pt_BR": "Butão", - "sr-Cyrl": "Бутан", - "sr-Latn": "Butan", - "zh_TW": "不丹", - "tr": "Bhutan", - "ro": "Bhutan", - "ar": "بوتان", - "fa": "بوتان", - "yue": "不丹" - }, - flag: "🇧🇹", - code: "BT", - dialCode: "975", - minLength: 8, - maxLength: 8, - ), - Country( - name: "Bolivia, Plurinational State of bolivia", - nameTranslations: { - "sk": "Bolívia", - "se": "Bolivia", - "pl": "Boliwia", - "no": "Bolivia", - "ja": "ボリビア", - "it": "Bolivia", - "zh": "玻利维亚", - "nl": "Bolivia", - "de": "Bolivien", - "fr": "Bolivie", - "es": "Bolivia", - "en": "Bolivia", - "pt_BR": "Bolívia", - "sr-Cyrl": "Боливија", - "sr-Latn": "Bolivija", - "zh_TW": "玻利維亞", - "tr": "Bolivya", - "ro": "Bolivia", - "ar": "بوليفيا", - "fa": "بولیوی", - "yue": "玻利維亞(多民族國家)" - }, - flag: "🇧🇴", - code: "BO", - dialCode: "591", - minLength: 8, - maxLength: 8, - ), - Country( - name: "Bosnia and Herzegovina", - nameTranslations: { - "sk": "Bosna a Hercegovina", - "se": "Bosnia-Hercegovina", - "pl": "Bośnia i Hercegowina", - "no": "Bosnia-Hercegovina", - "ja": "ボスニア・ヘルツェゴビナ", - "it": "Bosnia ed Erzegovina", - "zh": "波斯尼亚和黑塞哥维那", - "nl": "Bosnië en Herzegovina", - "de": "Bosnien und Herzegowina", - "fr": "Bosnie-Herzégovine", - "es": "Bosnia y Herzegovina", - "en": "Bosnia & Herzegovina", - "pt_BR": "Bósnia e Herzegovina", - "sr-Cyrl": "Босна и Херцеговина", - "sr-Latn": "Bosna i Hercegovina", - "zh_TW": "波士尼亞和黑塞哥維那", - "tr": "Bosna Hersek", - "ro": "Bosnia și Herțegovina", - "ar": "البوسنة والهرسك", - "fa": "بوسنی و هرزگوین", - "yue": "波斯尼亞黑塞哥維那" - }, - flag: "🇧🇦", - code: "BA", - dialCode: "387", - minLength: 9, - maxLength: 9, - ), - Country( - name: "Botswana", - nameTranslations: { - "sk": "Botswana", - "se": "Botswana", - "pl": "Botswana", - "no": "Botswana", - "ja": "ボツワナ", - "it": "Botswana", - "zh": "博茨瓦纳", - "nl": "Botswana", - "de": "Botsuana", - "fr": "Botswana", - "es": "Botsuana", - "en": "Botswana", - "pt_BR": "Botswana", - "sr-Cyrl": "Боцвана", - "sr-Latn": "Bocvana", - "zh_TW": "博茨瓦納", - "tr": "Botsvana", - "ro": "Botswana", - "ar": "بوتسوانا", - "fa": "بوتسوانا", - "yue": "博茨瓦納" - }, - flag: "🇧🇼", - code: "BW", - dialCode: "267", - minLength: 8, - maxLength: 8, - ), - Country( - name: "Bouvet Island", - nameTranslations: { - "sk": "Bouvetov ostrov", - "se": "Bouvet-sullot", - "pl": "Wyspa Bouveta", - "no": "Bouvetøya", - "ja": "ブーベ島", - "it": "Isola Bouvet", - "zh": "布韦岛", - "nl": "Bouveteiland", - "de": "Bouvetinsel", - "fr": "Île Bouvet", - "es": "Isla Bouvet", - "en": "Bouvet Island", - "pt_BR": "Ilha Bouvet", - "sr-Cyrl": "Острво Буве", - "sr-Latn": "Ostrvo Buve", - "zh_TW": "布維特島", - "tr": "Bouvet Adası", - "ro": "Insula Bouvet", - "ar": "جزيرة بوفيه", - "fa": "جزیره بووه", - "yue": "布维特岛" - }, - flag: "🇧🇻", - code: "BV", - dialCode: "47", - minLength: 15, - maxLength: 15, - ), - Country( - name: "Brazil", - nameTranslations: { - "sk": "Brazília", - "se": "Brasil", - "pl": "Brazylia", - "no": "Brasil", - "ja": "ブラジル", - "it": "Brasile", - "zh": "巴西", - "nl": "Brazilië", - "de": "Brasilien", - "fr": "Brésil", - "es": "Brasil", - "en": "Brazil", - "pt_BR": "Brasil", - "sr-Cyrl": "Бразил", - "sr-Latn": "Brazil", - "zh_TW": "巴西", - "tr": "Brezilya", - "ro": "Brazilia", - "ar": "البرازيل", - "fa": "برزیل", - "yue": "巴西" - }, - flag: "🇧🇷", - code: "BR", - dialCode: "55", - minLength: 11, - maxLength: 11, - ), - Country( - name: "British Indian Ocean Territory", - nameTranslations: { - "sk": "Britské indickooceánske územie", - "se": "British Indian Ocean Territory", - "pl": "Brytyjskie Terytorium Oceanu Indyjskiego", - "no": "Det britiske territoriet i Indiahavet", - "ja": "英領インド洋地域", - "it": "Territorio britannico dell'Oceano Indiano", - "zh": "英属印度洋领地", - "nl": "Brits Indische Oceaanterritorium", - "de": "Britisches Territorium im Indischen Ozean", - "fr": "Territoire britannique de l'océan Indien", - "es": "Territorio Británico del Océano Índico", - "en": "British Indian Ocean Territory", - "pt_BR": "Território Britânico do Oceano Índico", - "sr-Cyrl": "Британска територија Индијског океана", - "sr-Latn": "Britanska teritorija Indijskog okeana", - "zh_TW": "英屬印度洋領地", - "tr": "Britanya Hint Okyanusu Toprakları", - "ro": "Teritoriul Britanic din Oceanul Indian", - "ar": "إقليم المحيط الهندي البريطاني", - "fa": "سرزمین دریایی هند - بریتانیا", - "yue": "英屬印度洋領土" - }, - flag: "🇮🇴", - code: "IO", - dialCode: "246", - minLength: 7, - maxLength: 7, - ), - Country( - name: "Brunei Darussalam", - nameTranslations: { - "sk": "Brunej", - "se": "Brunei", - "pl": "Brunei", - "no": "Brunei", - "ja": "ブルネイ", - "it": "Brunei", - "zh": "文莱", - "nl": "Brunei", - "de": "Brunei Darussalam", - "fr": "Brunéi Darussalam", - "es": "Brunéi", - "en": "Brunei", - "pt_BR": "Brunei", - "sr-Cyrl": "Брунеј", - "sr-Latn": "Brunej", - "zh_TW": "汶萊", - "tr": "Bruney", - "ro": "Brunei", - "ar": "بروناي", - "fa": "برونئی", - "yue": "文萊達魯薩蘭國" - }, - flag: "🇧🇳", - code: "BN", - dialCode: "673", - minLength: 7, - maxLength: 7, - ), - Country( - name: "Bulgaria", - nameTranslations: { - "sk": "Bulharsko", - "se": "Bulgária", - "pl": "Bułgaria", - "no": "Bulgaria", - "ja": "ブルガリア", - "it": "Bulgaria", - "zh": "保加利亚", - "nl": "Bulgarije", - "de": "Bulgarien", - "fr": "Bulgarie", - "es": "Bulgaria", - "en": "Bulgaria", - "pt_BR": "Bulgária", - "sr-Cyrl": "Бугарска", - "sr-Latn": "Bugarska", - "zh_TW": "保加利亞", - "tr": "Bulgaristan", - "ro": "Bulgaria", - "ar": "بلغاريا", - "fa": "بلغارستان", - "yue": "保加利亞" - }, - flag: "🇧🇬", - code: "BG", - dialCode: "359", - minLength: 9, - maxLength: 9, - ), - Country( - name: "Burkina Faso", - nameTranslations: { - "sk": "Burkina Faso", - "se": "Burkina Faso", - "pl": "Burkina Faso", - "no": "Burkina Faso", - "ja": "ブルキナファソ", - "it": "Burkina Faso", - "zh": "布基纳法索", - "nl": "Burkina Faso", - "de": "Burkina Faso", - "fr": "Burkina Faso", - "es": "Burkina Faso", - "en": "Burkina Faso", - "pt_BR": "Burkina Faso", - "sr-Cyrl": "Буркина Фасо", - "sr-Latn": "Burkina Faso", - "zh_TW": "布吉納法索", - "tr": "Burkina Faso", - "ro": "Burkina Faso", - "ar": "بوركينا فاسو", - "fa": "بورکینافاسو", - "yue": "布基納法索" - }, - flag: "🇧🇫", - code: "BF", - dialCode: "226", - minLength: 8, - maxLength: 8, - ), - Country( - name: "Burundi", - nameTranslations: { - "sk": "Burundi", - "se": "Burundi", - "pl": "Burundi", - "no": "Burundi", - "ja": "ブルンジ", - "it": "Burundi", - "zh": "布隆迪", - "nl": "Burundi", - "de": "Burundi", - "fr": "Burundi", - "es": "Burundi", - "en": "Burundi", - "pt_BR": "Burundi", - "sr-Cyrl": "Бурунди", - "sr-Latn": "Burundi", - "zh_TW": "蒲隆地", - "tr": "Burundi", - "ro": "Burundi", - "ar": "بوروندي", - "fa": "بوروندی", - "yue": "蒲隆地" - }, - flag: "🇧🇮", - code: "BI", - dialCode: "257", - minLength: 8, - maxLength: 8, - ), - Country( - name: "Cambodia", - nameTranslations: { - "sk": "Kambodža", - "se": "Kambodža", - "pl": "Kambodża", - "no": "Kambodsja", - "ja": "カンボジア", - "it": "Cambogia", - "zh": "柬埔寨", - "nl": "Cambodja", - "de": "Kambodscha", - "fr": "Cambodge", - "es": "Camboya", - "en": "Cambodia", - "pt_BR": "Camboja", - "sr-Cyrl": "Камбоџа", - "sr-Latn": "Kambodža", - "zh_TW": "柬埔寨", - "tr": "Kamboçya", - "ro": "Cambogia", - "ar": "كمبوديا", - "fa": "کامبوج", - "yue": "柬埔寨" - }, - flag: "🇰🇭", - code: "KH", - dialCode: "855", - minLength: 9, - maxLength: 9, - ), - Country( - name: "Cameroon", - nameTranslations: { - "sk": "Kamerun", - "se": "Kamerun", - "pl": "Kamerun", - "no": "Kamerun", - "ja": "カメルーン", - "it": "Camerun", - "zh": "喀麦隆", - "nl": "Kameroen", - "de": "Kamerun", - "fr": "Cameroun", - "es": "Camerún", - "en": "Cameroon", - "pt_BR": "Camarões", - "sr-Cyrl": "Камерун", - "sr-Latn": "Kamerun", - "zh_TW": "喀麥隆", - "tr": "Kamerun", - "ro": "Camerun", - "ar": "الكاميرون", - "fa": "کامرون", - "yue": "喀 麥 隆" - }, - flag: "🇨🇲", - code: "CM", - dialCode: "237", - minLength: 9, - maxLength: 9, - ), - Country( - name: "Canada", - nameTranslations: { - "sk": "Kanada", - "se": "Kanáda", - "pl": "Kanada", - "no": "Canada", - "ja": "カナダ", - "it": "Canada", - "zh": "加拿大", - "nl": "Canada", - "de": "Kanada", - "fr": "Canada", - "es": "Canadá", - "en": "Canada", - "pt_BR": "Canadá", - "sr-Cyrl": "Канада", - "sr-Latn": "Kanada", - "zh_TW": "加拿大", - "tr": "Kanada", - "ro": "Canada", - "ar": "كندا", - "fa": "کانادا", - "yue": "加拿大" - }, - flag: "🇨🇦", - code: "CA", - dialCode: "1", - minLength: 10, - maxLength: 10, - ), - Country( - name: "Cayman Islands", - nameTranslations: { - "sk": "Kajmanie ostrovy", - "se": "Cayman-sullot", - "pl": "Kajmany", - "no": "Caymanøyene", - "ja": "ケイマン諸島", - "it": "Isole Cayman", - "zh": "开曼群岛", - "nl": "Kaaimaneilanden", - "de": "Kaimaninseln", - "fr": "Îles Caïmans", - "es": "Islas Caimán", - "en": "Cayman Islands", - "pt_BR": "Ilhas Cayman", - "sr-Cyrl": "Кајманска Острва", - "sr-Latn": "Kajmanska Ostrva", - "zh_TW": "開曼群島", - "tr": "Cayman Adaları", - "ro": "Insulele Cayman", - "ar": "جزر كايمان", - "fa": "جزایر کیمن", - "yue": "開曼群島" - }, - flag: "🇰🇾", - code: "KY", - dialCode: "345", - minLength: 7, - maxLength: 7, - ), - Country( - name: "Central African Republic", - nameTranslations: { - "sk": "Stredoafrická republika", - "se": "Gaska-Afrihká dásseváldi", - "pl": "Republika Środkowoafrykańska", - "no": "Den sentralafrikanske republikk", - "ja": "中央アフリカ共和国", - "it": "Repubblica Centrafricana", - "zh": "中非共和国", - "nl": "Centraal-Afrikaanse Republiek", - "de": "Zentralafrikanische Republik", - "fr": "République centrafricaine", - "es": "República Centroafricana", - "en": "Central African Republic", - "pt_BR": "República Centro-Africana", - "sr-Cyrl": "Централноафричка Република", - "sr-Latn": "Centralnoafrička Republika", - "zh_TW": "中非共和國", - "tr": "Orta Afrika Cumhuriyeti", - "ro": "Republica Centrafricană", - "ar": "جمهورية أفريقيا الوسطى", - "fa": "جمهوری افریقای مرکزی", - "yue": "中非共和國" - }, - flag: "🇨🇫", - code: "CF", - dialCode: "236", - minLength: 8, - maxLength: 8, - ), - Country( - name: "Chad", - nameTranslations: { - "sk": "Čad", - "se": "Tčad", - "pl": "Czad", - "no": "Tsjad", - "ja": "チャド", - "it": "Ciad", - "zh": "乍得", - "nl": "Tsjaad", - "de": "Tschad", - "fr": "Tchad", - "es": "Chad", - "en": "Chad", - "pt_BR": "Chade", - "sr-Cyrl": "Чад", - "sr-Latn": "Čad", - "zh_TW": "查德", - "tr": "Çad", - "ro": "Ciad", - "ar": "تشاد", - "fa": "چاد", - "yue": "乍得" - }, - flag: "🇹🇩", - code: "TD", - dialCode: "235", - minLength: 7, - maxLength: 7, - ), - Country( - name: "Chile", - nameTranslations: { - "sk": "Čile", - "se": "Čiile", - "pl": "Chile", - "no": "Chile", - "ja": "チリ", - "it": "Cile", - "zh": "智利", - "nl": "Chili", - "de": "Chile", - "fr": "Chili", - "es": "Chile", - "en": "Chile", - "pt_BR": "Chile", - "sr-Cyrl": "Чиле", - "sr-Latn": "Čile", - "zh_TW": "智利", - "tr": "Şili", - "ro": "Chile", - "ar": "تشيلي", - "fa": "شیلی", - "yue": "智利" - }, - flag: "🇨🇱", - code: "CL", - dialCode: "56", - minLength: 9, - maxLength: 9, - ), - Country( - name: "China", - nameTranslations: { - "sk": "Čína", - "se": "Kiinná", - "pl": "Chiny", - "no": "Kina", - "ja": "中国", - "it": "Cina", - "zh": "中国", - "nl": "China", - "de": "China", - "fr": "Chine", - "es": "China", - "en": "China", - "pt_BR": "China", - "sr-Cyrl": "Кина", - "sr-Latn": "Kina", - "zh_TW": "中國", - "tr": "Çin", - "ro": "China", - "ar": "الصين", - "fa": "چین", - "yue": "中國" - }, - flag: "🇨🇳", - code: "CN", - dialCode: "86", - minLength: 11, - maxLength: 12, - ), - Country( - name: "Christmas Island", - nameTranslations: { - "sk": "Vianočný ostrov", - "se": "Juovllat-sullot", - "pl": "Wyspa Bożego Narodzenia", - "no": "Christmasøya", - "ja": "クリスマス島", - "it": "Isola Christmas", - "zh": "圣诞岛", - "nl": "Christmaseiland", - "de": "Weihnachtsinsel", - "fr": "Île Christmas", - "es": "Isla de Navidad", - "en": "Christmas Island", - "pt_BR": "Ilha do Natal", - "sr-Cyrl": "Ускршња Острва", - "sr-Latn": "Uskršnja Ostrva", - "zh_TW": "聖誕島", - "tr": "Christmas Adası", - "ro": "Insula Crăciunului", - "ar": "جزيرة عيد الميلاد", - "fa": "جزیره کریسمس", - "yue": "聖誕島" - }, - flag: "🇨🇽", - code: "CX", - dialCode: "61", - minLength: 15, - maxLength: 15, - ), - Country( - name: "Cocos (Keeling) Islands", - nameTranslations: { - "sk": "Kokosové ostrovy", - "se": "Cocos-sullot", - "pl": "Wyspy Kokosowe", - "no": "Kokosøyene", - "ja": "ココス(キーリング)諸島", - "it": "Isole Cocos (Keeling)", - "zh": "科科斯(基林)群岛", - "nl": "Cocoseilanden", - "de": "Kokosinseln", - "fr": "Îles Cocos", - "es": "Islas Cocos", - "en": "Cocos (Keeling) Islands", - "pt_BR": "Ilhas Cocos (Keeling)", - "sr-Cyrl": "Кокосова Острва", - "sr-Latn": "Kokosova Ostrva", - "zh_TW": "科科斯(基林)群島", - "tr": "Cocos (Keyling) Adaları", - "ro": "Insulele Cocos", - "ar": "جزر كوكوس", - "fa": "جزایر کوکوس", - "yue": "可可島(基林)群島" - }, - flag: "🇨🇨", - code: "CC", - dialCode: "61", - minLength: 15, - maxLength: 15, - ), - Country( - name: "Colombia", - nameTranslations: { - "sk": "Kolumbia", - "se": "Kolombia", - "pl": "Kolumbia", - "no": "Colombia", - "ja": "コロンビア", - "it": "Colombia", - "zh": "哥伦比亚", - "nl": "Colombia", - "de": "Kolumbien", - "fr": "Colombie", - "es": "Colombia", - "en": "Colombia", - "pt_BR": "Colômbia", - "sr-Cyrl": "Колумбија", - "sr-Latn": "Kolumbija", - "zh_TW": "哥倫比亞", - "tr": "Kolombiya", - "ro": "Columbia", - "ar": "كولومبيا", - "fa": "کلمبیا", - "yue": "哥倫比亞" - }, - flag: "🇨🇴", - code: "CO", - dialCode: "57", - minLength: 10, - maxLength: 10, - ), - Country( - name: "Comoros", - nameTranslations: { - "sk": "Komory", - "se": "Komoros", - "pl": "Komory", - "no": "Komorene", - "ja": "コモロ", - "it": "Comore", - "zh": "科摩罗", - "nl": "Comoren", - "de": "Komoren", - "fr": "Comores", - "es": "Comoras", - "en": "Comoros", - "pt_BR": "Comores", - "sr-Cyrl": "Комори", - "sr-Latn": "Komori", - "zh_TW": "科摩羅", - "tr": "Komor Adaları", - "ro": "Comore", - "ar": "جزر القمر", - "fa": "جزیره کومور", - "yue": "科摩羅" - }, - flag: "🇰🇲", - code: "KM", - dialCode: "269", - minLength: 7, - maxLength: 7, - ), - Country( - name: "Congo", - nameTranslations: { - "sk": "Konžská republika", - "se": "Kongo-Brazzaville", - "pl": "Kongo", - "no": "Kongo-Brazzaville", - "ja": "コンゴ共和国(ブラザビル)", - "it": "Congo-Brazzaville", - "zh": "刚果(布)", - "nl": "Congo-Brazzaville", - "de": "Kongo-Brazzaville", - "fr": "Congo-Brazzaville", - "es": "Congo", - "en": "Congo - Brazzaville", - "pt_BR": "República do Congo", - "sr-Cyrl": "Република Конго", - "sr-Latn": "Republika Kongo", - "zh_TW": "剛果共和國(布拉柴維爾)", - "tr": "Kongo Cumhuriyeti", - "ro": "Republica Congo", - "ar": "جمهورية الكونغو", - "fa": "جمهوری کنگو", - "yue": "剛果(共和國)" - }, - flag: "🇨🇬", - code: "CG", - dialCode: "242", - minLength: 7, - maxLength: 7, - ), - Country( - name: "Congo, The Democratic Republic of the Congo", - nameTranslations: { - "sk": "Konžská demokratická republika", - "se": "Kongo-Kinshasa", - "pl": "Demokratyczna Republika Konga", - "no": "Kongo-Kinshasa", - "ja": "コンゴ民主共和国(キンシャサ)", - "it": "Congo - Kinshasa", - "zh": "刚果(金)", - "nl": "Congo-Kinshasa", - "de": "Kongo-Kinshasa", - "fr": "Congo-Kinshasa", - "es": "República Democrática del Congo", - "en": "Congo - Kinshasa", - "pt_BR": "República Democrática do Congo", - "sr-Cyrl": "Демократска Република Конго", - "sr-Latn": "Demokratska Republika Kongo", - "zh_TW": "剛果民主共和國(金沙薩)", - "tr": "Kongo Demokratik Cumhuriyeti", - "ro": "Republica Democrată Congo", - "ar": "جمهورية الكونغو الديمقراطية", - "fa": "جمهوری دموکراتیک کنگو", - "yue": "剛果(金)" - }, - flag: "🇨🇩", - code: "CD", - dialCode: "243", - minLength: 9, - maxLength: 9, - ), - Country( - name: "Cook Islands", - nameTranslations: { - "sk": "Cookove ostrovy", - "se": "Cook-sullot", - "pl": "Wyspy Cooka", - "no": "Cookøyene", - "ja": "クック諸島", - "it": "Isole Cook", - "zh": "库克群岛", - "nl": "Cookeilanden", - "de": "Cookinseln", - "fr": "Îles Cook", - "es": "Islas Cook", - "en": "Cook Islands", - "pt_BR": "Ilhas Cook", - "sr-Cyrl": "Кукова Острва", - "sr-Latn": "Kukova Ostrva", - "zh_TW": "庫克群島", - "tr": "Cook Adaları", - "ro": "Insulele Cook", - "ar": "جزر كوك", - "fa": "جزایر کوک", - "yue": "庫克群島" - }, - flag: "🇨🇰", - code: "CK", - dialCode: "682", - minLength: 5, - maxLength: 5, - ), - Country( - name: "Costa Rica", - nameTranslations: { - "sk": "Kostarika", - "se": "Costa Rica", - "pl": "Kostaryka", - "no": "Costa Rica", - "ja": "コスタリカ", - "it": "Costa Rica", - "zh": "哥斯达黎加", - "nl": "Costa Rica", - "de": "Costa Rica", - "fr": "Costa Rica", - "es": "Costa Rica", - "en": "Costa Rica", - "pt_BR": "Costa Rica", - "sr-Cyrl": "Коста Рика", - "sr-Latn": "Kosta Rika", - "zh_TW": "哥斯大黎加", - "tr": "Kosta Rika", - "ro": "Costa Rica", - "ar": "كوستاريكا", - "fa": "کاستاریکا", - "yue": "哥斯達黎加" - }, - flag: "🇨🇷", - code: "CR", - dialCode: "506", - minLength: 8, - maxLength: 8, - ), - Country( - name: "Côte d'Ivoire", - nameTranslations: { - "sk": "Pobrežie Slonoviny", - "se": "Elfenbenariddu", - "pl": "Côte d'Ivoire", - "no": "Elfenbenskysten", - "ja": "コートジボワール", - "it": "Costa d'Avorio", - "zh": "科特迪瓦", - "nl": "Ivoorkust", - "de": "Côte d'Ivoire", - "fr": "Côte d'Ivoire", - "es": "Côte d'Ivoire", - "en": "Côte d'Ivoire", - "pt_BR": "Côte d'Ivoire", - "sr-Cyrl": "Обала Слоноваче", - "sr-Latn": "Obala Slonovače", - "zh_TW": "象牙海岸", - "tr": "Fildişi Kıyısı", - "ro": "Coasta de fildeș", - "ar": "ساحل العاج", - "fa": "ساحل عاج", - "yue": "科特迪瓦" - }, - flag: "🇨🇮", - code: "CI", - dialCode: "225", - minLength: 10, - maxLength: 10, - ), - Country( - name: "Croatia", - nameTranslations: { - "sk": "Chorvátsko", - "se": "Kroátia", - "pl": "Chorwacja", - "no": "Kroatia", - "ja": "クロアチア", - "it": "Croazia", - "zh": "克罗地亚", - "nl": "Kroatië", - "de": "Kroatien", - "fr": "Croatie", - "es": "Croacia", - "en": "Croatia", - "pt_BR": "Croácia", - "sr-Cyrl": "Хрватска", - "sr-Latn": "Hrvatska", - "zh_TW": "克羅埃西亞", - "tr": "Hırvatistan", - "ro": "Croația", - "ar": "كرواتيا", - "fa": "کرواسی", - "yue": "克羅地亞" - }, - flag: "🇭🇷", - code: "HR", - dialCode: "385", - minLength: 12, - maxLength: 12, - ), - Country( - name: "Cuba", - nameTranslations: { - "sk": "Kuba", - "se": "Kuba", - "pl": "Kuba", - "no": "Cuba", - "ja": "キューバ", - "it": "Cuba", - "zh": "古巴", - "nl": "Cuba", - "de": "Kuba", - "fr": "Cuba", - "es": "Cuba", - "en": "Cuba", - "pt_BR": "Cuba", - "sr-Cyrl": "Куба", - "sr-Latn": "Kuba", - "zh_TW": "古巴", - "tr": "Küba", - "ro": "Cuba", - "ar": "كوبا", - "fa": "كوبا", - "yue": "古巴" - }, - flag: "🇨🇺", - code: "CU", - dialCode: "53", - minLength: 8, - maxLength: 8, - ), - Country( - name: "Cyprus", - nameTranslations: { - "sk": "Cyprus", - "se": "Kypros", - "pl": "Cypr", - "no": "Kypros", - "ja": "キプロス", - "it": "Cipro", - "zh": "塞浦路斯", - "nl": "Cyprus", - "de": "Zypern", - "fr": "Chypre", - "es": "Chipre", - "en": "Cyprus", - "pt_BR": "Chipre", - "sr-Cyrl": "Кипар", - "sr-Latn": "Kipar", - "zh_TW": "塞普勒斯", - "tr": "Kıbrıs", - "ro": "Cipru", - "ar": "قبرص", - "fa": "قبرس", - "yue": "塞浦路斯" - }, - flag: "🇨🇾", - code: "CY", - dialCode: "357", - minLength: 8, - maxLength: 8, - ), - Country( - name: "Czech Republic", - nameTranslations: { - "sk": "Česko", - "se": "Čeahkka", - "pl": "Czechy", - "no": "Tsjekkia", - "ja": "チェコ", - "it": "Cechia", - "zh": "捷克", - "nl": "Tsjechië", - "de": "Tschechien", - "fr": "Tchéquie", - "es": "Chequia", - "en": "Czechia", - "pt_BR": "Czechia", - "sr-Cyrl": "Чешка", - "sr-Latn": "Češka", - "zh_TW": "捷克", - "tr": "Çek Cumhuriyeti", - "ro": "Cehia", - "ar": "جمهورية التشيك", - "fa": "جمهوری چک", - "yue": "捷克共和國" - }, - flag: "🇨🇿", - code: "CZ", - dialCode: "420", - minLength: 9, - maxLength: 9, - ), - Country( - name: "Denmark", - nameTranslations: { - "sk": "Dánsko", - "se": "Dánmárku", - "pl": "Dania", - "no": "Danmark", - "ja": "デンマーク", - "it": "Danimarca", - "zh": "丹麦", - "nl": "Denemarken", - "de": "Dänemark", - "fr": "Danemark", - "es": "Dinamarca", - "en": "Denmark", - "pt_BR": "Dinamarca", - "sr-Cyrl": "Данска", - "sr-Latn": "Danska", - "zh_TW": "丹麥", - "tr": "Danimarka", - "ro": "Danemarca", - "ar": "الدنمارك", - "fa": "دانمارک", - "yue": "丹麥" - }, - flag: "🇩🇰", - code: "DK", - dialCode: "45", - minLength: 8, - maxLength: 8, - ), - Country( - name: "Djibouti", - nameTranslations: { - "sk": "Džibutsko", - "se": "Djibouti", - "pl": "Dżibuti", - "no": "Djibouti", - "ja": "ジブチ", - "it": "Gibuti", - "zh": "吉布提", - "nl": "Djibouti", - "de": "Dschibuti", - "fr": "Djibouti", - "es": "Yibuti", - "en": "Djibouti", - "pt_BR": "Djibouti", - "sr-Cyrl": "Џибути", - "sr-Latn": "Džibuti", - "zh_TW": "吉布地", - "tr": "Cibuti", - "ro": "Djibouti", - "ar": "جيبوتي", - "fa": "جیبوتی", - "yue": "吉布提" - }, - flag: "🇩🇯", - code: "DJ", - dialCode: "253", - minLength: 6, - maxLength: 6, - ), - Country( - name: "Dominica", - nameTranslations: { - "sk": "Dominika", - "se": "Dominica", - "pl": "Dominika", - "no": "Dominica", - "ja": "ドミニカ国", - "it": "Dominica", - "zh": "多米尼克", - "nl": "Dominica", - "de": "Dominica", - "fr": "Dominique", - "es": "Dominica", - "en": "Dominica", - "pt_BR": "Dominica", - "sr-Cyrl": "Доминика", - "sr-Latn": "Dominika", - "zh_TW": "多明尼加", - "tr": "Dominika", - "ro": "Dominica", - "ar": "دومينيكا", - "fa": "دومينيكا", - "yue": "多米尼加" - }, - flag: "🇩🇲", - code: "DM", - dialCode: "1767", - minLength: 7, - maxLength: 7, - ), - Country( - name: "Dominican Republic", - nameTranslations: { - "sk": "Dominikánska republika", - "se": "Dominikána dásseváldi", - "pl": "Dominikana", - "no": "Den dominikanske republikk", - "ja": "ドミニカ共和国", - "it": "Repubblica Dominicana", - "zh": "多米尼加共和国", - "nl": "Dominicaanse Republiek", - "de": "Dominikanische Republik", - "fr": "République dominicaine", - "es": "República Dominicana", - "en": "Dominican Republic", - "pt_BR": "República Dominicana", - "sr-Cyrl": "Доминиканска Република", - "sr-Latn": "Dominikanska Republika", - "zh_TW": "多明尼加共和國", - "tr": "Dominik Cumhuriyeti", - "ro": "Republica Dominicană", - "ar": "جمهورية الدومينيكان", - "fa": "جمهوری دومنیکن", - "yue": "多明尼加共和國" - }, - flag: "🇩🇴", - code: "DO", - dialCode: "1", - minLength: 10, - maxLength: 10, - ), - Country( - name: "Ecuador", - nameTranslations: { - "sk": "Ekvádor", - "se": "Ecuador", - "pl": "Ekwador", - "no": "Ecuador", - "ja": "エクアドル", - "it": "Ecuador", - "zh": "厄瓜多尔", - "nl": "Ecuador", - "de": "Ecuador", - "fr": "Équateur", - "es": "Ecuador", - "en": "Ecuador", - "pt_BR": "Equador", - "sr-Cyrl": "Еквадор", - "sr-Latn": "Ekvador", - "zh_TW": "厄瓜多", - "tr": "Ekvador", - "ro": "Ecuador", - "ar": "الإكوادور", - "fa": "اكوادور", - "yue": "厄瓜多爾" - }, - flag: "🇪🇨", - code: "EC", - dialCode: "593", - minLength: 8, - maxLength: 9, - ), - Country( - name: "Egypt", - nameTranslations: { - "sk": "Egypt", - "se": "Egypt", - "pl": "Egipt", - "no": "Egypt", - "ja": "エジプト", - "it": "Egitto", - "zh": "埃及", - "nl": "Egypt", - "de": "Ägypt", - "fr": "Égypte", - "es": "Egipt", - "en": "Egypt", - "pt_BR": "Egito", - "sr-Cyrl": "Египат", - "sr-Latn": "Egipat", - "zh_TW": "埃及", - "tr": "Mısır", - "ro": "Egipt", - "ar": "مصر", - "fa": "مصر", - "yue": "埃及" - }, - flag: "🇪🇬", - code: "EG", - dialCode: "2", - minLength: 11, - maxLength: 11, - ), - Country( - name: "El Salvador", - nameTranslations: { - "sk": "Salvádor", - "se": "El Salvador", - "pl": "Salwador", - "no": "El Salvador", - "ja": "エルサルバドル", - "it": "El Salvador", - "zh": "萨尔瓦多", - "nl": "El Salvador", - "de": "El Salvador", - "fr": "Salvador", - "es": "El Salvador", - "en": "El Salvador", - "pt_BR": "El Salvador", - "sr-Cyrl": "Салвадор", - "sr-Latn": "Salvador", - "zh_TW": "薩爾瓦多", - "tr": "El Salvador", - "ro": "Salvador", - "ar": "السلفادور", - "fa": "ال سالوادور", - "yue": "薩爾瓦多" - }, - flag: "🇸🇻", - code: "SV", - dialCode: "503", - minLength: 11, - maxLength: 11, - ), - Country( - name: "Equatorial Guinea", - nameTranslations: { - "sk": "Rovníková Guinea", - "se": "Ekvatoriála Guinea", - "pl": "Gwinea Równikowa", - "no": "Ekvatorial-Guinea", - "ja": "赤道ギニア", - "it": "Guinea Equatoriale", - "zh": "赤道几内亚", - "nl": "Equatoriaal-Guinea", - "de": "Äquatorialguinea", - "fr": "Guinée équatoriale", - "es": "Guinea Ecuatorial", - "en": "Equatorial Guinea", - "pt_BR": "Guiné Equatorial", - "sr-Cyrl": "Екваторијална Гвинеја", - "sr-Latn": "Ekvatorijalna Gvineja", - "zh_TW": "赤道幾內亞", - "tr": "Ekvator Ginesi", - "ro": "Guineea Ecuatorială", - "ar": "غينيا الاستوائية", - "fa": "گینه استوایی", - "yue": "赤道幾內亞" - }, - flag: "🇬🇶", - code: "GQ", - dialCode: "240", - minLength: 6, - maxLength: 6, - ), - Country( - name: "Eritrea", - nameTranslations: { - "sk": "Eritrea", - "se": "Eritrea", - "pl": "Erytrea", - "no": "Eritrea", - "ja": "エリトリア", - "it": "Eritrea", - "zh": "厄立特里亚", - "nl": "Eritrea", - "de": "Eritrea", - "fr": "Érythrée", - "es": "Eritrea", - "en": "Eritrea", - "pt_BR": "Eritreia", - "sr-Cyrl": "Еритреја", - "sr-Latn": "Eritreja", - "zh_TW": "厄立特裡亞", - "tr": "Eritre", - "ro": "Eritreea", - "ar": "إريتريا", - "fa": "اریتره", - "yue": "厄立特里亞" - }, - flag: "🇪🇷", - code: "ER", - dialCode: "291", - minLength: 7, - maxLength: 7, - ), - Country( - name: "Estonia", - nameTranslations: { - "sk": "Estónsko", - "se": "Estlánda", - "pl": "Estonia", - "no": "Estland", - "ja": "エストニア", - "it": "Estonia", - "zh": "爱沙尼亚", - "nl": "Estland", - "de": "Estland", - "fr": "Estonie", - "es": "Estonia", - "en": "Estonia", - "pt_BR": "Estônia", - "sr-Cyrl": "Естонија", - "sr-Latn": "Estonija", - "zh_TW": "愛沙尼亞", - "tr": "Estonya", - "ro": "Estonia", - "ar": "إستونيا", - "fa": "استونی", - "yue": "愛沙尼亞" - }, - flag: "🇪🇪", - code: "EE", - dialCode: "372", - minLength: 10, - maxLength: 10, - ), - Country( - name: "Ethiopia", - nameTranslations: { - "sk": "Etiópia", - "se": "Etiopia", - "pl": "Etiopia", - "no": "Etiopia", - "ja": "エチオピア", - "it": "Etiopia", - "zh": "埃塞俄比亚", - "nl": "Ethiopië", - "de": "Äthiopien", - "fr": "Éthiopie", - "es": "Etiopía", - "en": "Ethiopia", - "pt_BR": "Etiópia", - "sr-Cyrl": "Етиопија", - "sr-Latn": "Etiopija", - "zh_TW": "伊索比亞", - "tr": "Etiyopya", - "ro": "Etiopia", - "ar": "إثيوبيا", - "fa": "اتیوپی", - "yue": "埃塞俄比亞" - }, - flag: "🇪🇹", - code: "ET", - dialCode: "251", - minLength: 9, - maxLength: 9, - ), - Country( - name: "Falkland Islands (Malvinas)", - nameTranslations: { - "sk": "Falklandy", - "se": "Falklandsullot", - "pl": "Falklandy", - "no": "Falklandsøyene", - "ja": "フォークランド諸島", - "it": "Isole Falkland", - "zh": "福克兰群岛", - "nl": "Falklandeilanden", - "de": "Falklandinseln", - "fr": "Îles Malouines", - "es": "Islas Malvinas", - "en": "Falkland Islands", - "pt_BR": "Ilhas Falkland", - "sr-Cyrl": "Фокландска Острва", - "sr-Latn": "Foklandska Ostrva", - "zh_TW": "福克蘭群島", - "tr": "Falkland Adaları", - "ro": "Insulele Falklands", - "ar": "جزر فوكلاند", - "fa": "جزایر فالکلند", - "yue": "福克蘭群島(馬爾維納斯群島)" - }, - flag: "🇫🇰", - code: "FK", - dialCode: "500", - minLength: 5, - maxLength: 5, - ), - Country( - name: "Faroe Islands", - nameTranslations: { - "sk": "Faerské ostrovy", - "se": "Fearsullot", - "pl": "Wyspy Owcze", - "no": "Færøyene", - "ja": "フェロー諸島", - "it": "Isole Fær Øer", - "zh": "法罗群岛", - "nl": "Faeröer", - "de": "Färöer", - "fr": "Îles Féroé", - "es": "Islas Feroe", - "en": "Faroe Islands", - "pt_BR": "ilhas Faroe", - "sr-Cyrl": "Фарска Острва", - "sr-Latn": "Farska Ostrva", - "zh_TW": "法羅群島", - "tr": "Faroe Adaları", - "ro": "Insulele Feroe", - "ar": "جزر فارو", - "fa": "جزایر فارو", - "yue": "法羅群島" - }, - flag: "🇫🇴", - code: "FO", - dialCode: "298", - minLength: 6, - maxLength: 6, - ), - Country( - name: "Fiji", - nameTranslations: { - "sk": "Fidži", - "se": "Fijisullot", - "pl": "Fidżi", - "no": "Fiji", - "ja": "フィジー", - "it": "Figi", - "zh": "斐济", - "nl": "Fiji", - "de": "Fidschi", - "fr": "Fidji", - "es": "Fiyi", - "en": "Fiji", - "pt_BR": "Fiji", - "sr-Cyrl": "Фиџи", - "sr-Latn": "Fidži", - "zh_TW": "斐濟", - "tr": "Fiji", - "ro": "Fiji", - "ar": "فيجي", - "fa": "فيجي", - "yue": "斐濟" - }, - flag: "🇫🇯", - code: "FJ", - dialCode: "679", - minLength: 7, - maxLength: 7, - ), - Country( - name: "Finland", - nameTranslations: { - "sk": "Fínsko", - "se": "Suopma", - "pl": "Finlandia", - "no": "Finland", - "ja": "フィンランド", - "it": "Finlandia", - "zh": "芬兰", - "nl": "Finland", - "de": "Finnland", - "fr": "Finlande", - "es": "Finlandia", - "en": "Finland", - "pt_BR": "Finlândia", - "sr-Cyrl": "Финска", - "sr-Latn": "Finska", - "zh_TW": "芬蘭", - "tr": "Finlandiya", - "ro": "Finlanda", - "ar": "فنلندا", - "fa": "فنلاند", - "yue": "芬蘭" - }, - flag: "🇫🇮", - code: "FI", - dialCode: "358", - minLength: 12, - maxLength: 12, - ), - Country( - name: "France", - nameTranslations: { - "sk": "Francúzsko", - "se": "Frankriika", - "pl": "Francja", - "no": "Frankrike", - "ja": "フランス", - "it": "Francia", - "zh": "法国", - "nl": "Frankrijk", - "de": "Frankreich", - "fr": "France", - "es": "Francia", - "en": "France", - "pt_BR": "França", - "sr-Cyrl": "Француска", - "sr-Latn": "Francuska", - "zh_TW": "法國", - "tr": "Fransa", - "ro": "Franța", - "ar": "فرنسا", - "fa": "فرانسه", - "yue": "法國" - }, - flag: "🇫🇷", - code: "FR", - dialCode: "33", - minLength: 9, - maxLength: 9, - ), - Country( - name: "French Guiana", - nameTranslations: { - "sk": "Francúzska Guyana", - "se": "Frankriikka Guayana", - "pl": "Gujana Francuska", - "no": "Fransk Guyana", - "ja": "仏領ギアナ", - "it": "Guyana francese", - "zh": "法属圭亚那", - "nl": "Frans-Guyana", - "de": "Französisch-Guayana", - "fr": "Guyane française", - "es": "Guayana Francesa", - "en": "French Guiana", - "pt_BR": "Guiana Francesa", - "sr-Cyrl": "Француска Гвајана", - "sr-Latn": "Francuska Gvajana", - "zh_TW": "法屬蓋亞那", - "tr": "Fransız Guyanası", - "ro": "Guiana Franceză", - "ar": "غويانا الفرنسية", - "fa": "گویان فرانسه", - "yue": "法屬圭亞那" - }, - flag: "🇬🇫", - code: "GF", - dialCode: "594", - minLength: 15, - maxLength: 15, - ), - Country( - name: "French Polynesia", - nameTranslations: { - "sk": "Francúzska Polynézia", - "se": "Frankriikka Polynesia", - "pl": "Polinezja Francuska", - "no": "Fransk Polynesia", - "ja": "仏領ポリネシア", - "it": "Polinesia francese", - "zh": "法属波利尼西亚", - "nl": "Frans-Polynesië", - "de": "Französisch-Polynesien", - "fr": "Polynésie française", - "es": "Polinesia Francesa", - "en": "French Polynesia", - "pt_BR": "Polinésia Francesa", - "sr-Cyrl": "Француска Полинезија", - "sr-Latn": "Francuska Polinezija", - "zh_TW": "法屬玻里尼西亞", - "tr": "Fransız Polinezyası", - "ro": "Polinezia Franceză", - "ar": "بولينزيا الفرنسية", - "fa": "پلی‌نزی فرانسه", - "yue": "法屬波利尼西亞" - }, - flag: "🇵🇫", - code: "PF", - dialCode: "689", - minLength: 6, - maxLength: 6, - ), - Country( - name: "French Southern Territories", - nameTranslations: { - "sk": "Francúzske južné a antarktické územia", - "se": "French Southern Territories", - "pl": "Francuskie Terytoria Południowe i Antarktyczne", - "no": "De franske sørterritorier", - "ja": "仏領極南諸島", - "it": "Terre australi francesi", - "zh": "法属南部领地", - "nl": "Franse Gebieden in de zuidelijke Indische Oceaan", - "de": "Französische Süd- und Antarktisgebiete", - "fr": "Terres australes françaises", - "es": "Territorios Australes Franceses", - "en": "French Southern Territories", - "pt_BR": "Territórios Franceses do Sul", - "sr-Cyrl": "Француске јужне и антарктичке земље", - "sr-Latn": "Francuske južne i antarktičke zemlje", - "zh_TW": "法屬南部屬地", - "tr": "Fransız Güney ve Antarktika Toprakları", - "ro": "Teritoriile australe și antarctice franceze", - "ar": "أراض فرنسية جنوبية وأنتارتيكية", - "fa": "سرزمین‌های جنوبی فرانسه", - "yue": "法國南部領土" - }, - flag: "🇹🇫", - code: "TF", - dialCode: "262", - minLength: 15, - maxLength: 15, - ), - Country( - name: "Gabon", - nameTranslations: { - "sk": "Gabon", - "se": "Gabon", - "pl": "Gabon", - "no": "Gabon", - "ja": "ガボン", - "it": "Gabon", - "zh": "加蓬", - "nl": "Gabon", - "de": "Gabun", - "fr": "Gabon", - "es": "Gabón", - "en": "Gabon", - "pt_BR": "Gabão", - "sr-Cyrl": "Габон", - "sr-Latn": "Gabon", - "zh_TW": "加彭", - "tr": "Gabon", - "ro": "Gabon", - "ar": "الغابون", - "fa": "گابن", - "yue": "加蓬" - }, - flag: "🇬🇦", - code: "GA", - dialCode: "241", - minLength: 9, - maxLength: 9, - ), - Country( - name: "Gambia", - nameTranslations: { - "sk": "Gambia", - "se": "Gámbia", - "pl": "Gambia", - "no": "Gambia", - "ja": "ガンビア", - "it": "Gambia", - "zh": "冈比亚", - "nl": "Gambia", - "de": "Gambia", - "fr": "Gambie", - "es": "Gambia", - "en": "Gambia", - "pt_BR": "Gâmbia", - "sr-Cyrl": "Гамбија", - "sr-Latn": "Gambija", - "zh_TW": "岡比亞", - "tr": "Gambiya", - "ro": "Gambia", - "ar": "غامبيا", - "fa": "گامبیا", - "yue": "岡比亞" - }, - flag: "🇬🇲", - code: "GM", - dialCode: "220", - minLength: 7, - maxLength: 7, - ), - Country( - name: "Georgia", - nameTranslations: { - "sk": "Gruzínsko", - "se": "Georgia", - "pl": "Gruzja", - "no": "Georgia", - "ja": "ジョージア", - "it": "Georgia", - "zh": "格鲁吉亚", - "nl": "Georgië", - "de": "Georgien", - "fr": "Géorgie", - "es": "Georgia", - "en": "Georgia", - "pt_BR": "Georgia", - "sr-Cyrl": "Грузија", - "sr-Latn": "Gruzija", - "zh_TW": "喬治亞", - "tr": "Gürcistan", - "ro": "Georgia", - "ar": "جورجيا", - "fa": "گرجستان", - "yue": "格魯吉亞" - }, - flag: "🇬🇪", - code: "GE", - dialCode: "995", - minLength: 8, - maxLength: 9, - ), - Country( - name: "Germany", - nameTranslations: { - "sk": "Nemecko", - "se": "Duiska", - "pl": "Niemcy", - "no": "Tyskland", - "ja": "ドイツ", - "it": "Germania", - "zh": "德国", - "nl": "Duitsland", - "de": "Deutschland", - "fr": "Allemagne", - "es": "Alemania", - "en": "Germany", - "pt_BR": "Alemanha", - "sr-Cyrl": "Немачка", - "sr-Latn": "Nemačka", - "zh_TW": "德國", - "tr": "Almanya", - "ro": "Germania", - "ar": "ألمانيا", - "fa": "آلمان", - "yue": "德國" - }, - flag: "🇩🇪", - code: "DE", - dialCode: "49", - minLength: 9, - maxLength: 13, - ), - Country( - name: "Ghana", - nameTranslations: { - "sk": "Ghana", - "se": "Ghana", - "pl": "Ghana", - "no": "Ghana", - "ja": "ガーナ", - "it": "Ghana", - "zh": "加纳", - "nl": "Ghana", - "de": "Ghana", - "fr": "Ghana", - "es": "Ghana", - "en": "Ghana", - "pt_BR": "Gana", - "sr-Cyrl": "Гана", - "sr-Latn": "Gana", - "zh_TW": "迦納", - "tr": "Gana", - "ro": "Ghana", - "ar": "غانا", - "fa": "غنا", - "yue": "加納" - }, - flag: "🇬🇭", - code: "GH", - dialCode: "233", - minLength: 9, - maxLength: 9, - ), - Country( - name: "Gibraltar", - nameTranslations: { - "sk": "Gibraltár", - "se": "Gibraltar", - "pl": "Gibraltar", - "no": "Gibraltar", - "ja": "ジブラルタル", - "it": "Gibilterra", - "zh": "直布罗陀", - "nl": "Gibraltar", - "de": "Gibraltar", - "fr": "Gibraltar", - "es": "Gibraltar", - "en": "Gibraltar", - "pt_BR": "Gibraltar", - "sr-Cyrl": "Гибралтар", - "sr-Latn": "Gibraltar", - "zh_TW": "直布羅陀", - "tr": "Cebelitarık", - "ro": "Gibraltar", - "ar": "جبل طارق", - "fa": "جبل الطارق", - "yue": "直布羅陀" - }, - flag: "🇬🇮", - code: "GI", - dialCode: "350", - minLength: 8, - maxLength: 8, - ), - Country( - name: "Greece", - nameTranslations: { - "sk": "Grécko", - "se": "Greika", - "pl": "Grecja", - "no": "Hellas", - "ja": "ギリシャ", - "it": "Grecia", - "zh": "希腊", - "nl": "Griekenland", - "de": "Griechenland", - "fr": "Grèce", - "es": "Grecia", - "en": "Greece", - "pt_BR": "Grécia", - "sr-Cyrl": "Грчка", - "sr-Latn": "Grčka", - "zh_TW": "希臘", - "tr": "Yunanistan", - "ro": "Grecia", - "ar": "اليونان", - "fa": "یونان", - "yue": "希臘" - }, - flag: "🇬🇷", - code: "GR", - dialCode: "30", - minLength: 10, - maxLength: 10, - ), - Country( - name: "Greenland", - nameTranslations: { - "sk": "Grónsko", - "se": "Kalaallit Nunaat", - "pl": "Grenlandia", - "no": "Grønland", - "ja": "グリーンランド", - "it": "Groenlandia", - "zh": "格陵兰", - "nl": "Groenland", - "de": "Grönland", - "fr": "Groenland", - "es": "Groenlandia", - "en": "Greenland", - "pt_BR": "Groenlândia", - "sr-Cyrl": "Гренланд", - "sr-Latn": "Grenland", - "zh_TW": "格陵蘭", - "tr": "Grönland", - "ro": "Groenlanda", - "ar": "جرينلاند", - "fa": "گرینلند", - "yue": "格陵蘭" - }, - flag: "🇬🇱", - code: "GL", - dialCode: "299", - minLength: 6, - maxLength: 6, - ), - Country( - name: "Grenada", - nameTranslations: { - "sk": "Grenada", - "se": "Grenada", - "pl": "Grenada", - "no": "Grenada", - "ja": "グレナダ", - "it": "Grenada", - "zh": "格林纳达", - "nl": "Grenada", - "de": "Grenada", - "fr": "Grenade", - "es": "Granada", - "en": "Grenada", - "pt_BR": "Grenada", - "sr-Cyrl": "Гренада", - "sr-Latn": "Grenada", - "zh_TW": "格林納達", - "tr": "Grenada", - "ro": "Grenada", - "ar": "غرينادا", - "fa": "گرنادا", - "yue": "格林納達" - }, - flag: "🇬🇩", - code: "GD", - dialCode: "1473", - minLength: 7, - maxLength: 7, - ), - Country( - name: "Guadeloupe", - nameTranslations: { - "sk": "Guadeloupe", - "se": "Guadeloupe", - "pl": "Gwadelupa", - "no": "Guadeloupe", - "ja": "グアドループ", - "it": "Guadalupa", - "zh": "瓜德罗普", - "nl": "Guadeloupe", - "de": "Guadeloupe", - "fr": "Guadeloupe", - "es": "Guadalupe", - "en": "Guadeloupe", - "pt_BR": "Guadalupe", - "sr-Cyrl": "Гваделуп", - "sr-Latn": "Gvadelup", - "zh_TW": "瓜地洛普", - "tr": "Guadeloupe", - "ro": "Guadelupa", - "ar": "غوادلوب", - "fa": "گوادلوپ", - "yue": "瓜德罗普" - }, - flag: "🇬🇵", - code: "GP", - dialCode: "590", - minLength: 15, - maxLength: 15, - ), - Country( - name: "Guam", - nameTranslations: { - "sk": "Guam", - "se": "Guam", - "pl": "Guam", - "no": "Guam", - "ja": "グアム", - "it": "Guam", - "zh": "关岛", - "nl": "Guam", - "de": "Guam", - "fr": "Guam", - "es": "Guam", - "en": "Guam", - "pt_BR": "Guam", - "sr-Cyrl": "Гвам", - "sr-Latn": "Gvam", - "zh_TW": "關島", - "tr": "Guam", - "ro": "Guam", - "ar": "غوام", - "fa": "گوام", - "yue": "關島" - }, - flag: "🇬🇺", - code: "GU", - dialCode: "1671", - minLength: 7, - maxLength: 7, - ), - Country( - name: "Guatemala", - nameTranslations: { - "sk": "Guatemala", - "se": "Guatemala", - "pl": "Gwatemala", - "no": "Guatemala", - "ja": "グアテマラ", - "it": "Guatemala", - "zh": "危地马拉", - "nl": "Guatemala", - "de": "Guatemala", - "fr": "Guatemala", - "es": "Guatemala", - "en": "Guatemala", - "pt_BR": "Guatemala", - "sr-Cyrl": "Гватемала", - "sr-Latn": "Gvatemala", - "zh_TW": "瓜地馬拉", - "tr": "Guatemala", - "ro": "Guatemala", - "ar": "غواتيمالا", - "fa": "گواتمالا", - "yue": "危地馬拉" - }, - flag: "🇬🇹", - code: "GT", - dialCode: "502", - minLength: 8, - maxLength: 8, - ), - Country( - name: "Guernsey", - nameTranslations: { - "sk": "Guernsey", - "se": "Guernsey", - "pl": "Guernsey", - "no": "Guernsey", - "ja": "ガーンジー", - "it": "Guernsey", - "zh": "根西岛", - "nl": "Guernsey", - "de": "Guernsey", - "fr": "Guernesey", - "es": "Guernsey", - "en": "Guernsey", - "pt_BR": "Guernsey", - "sr-Cyrl": "Гернзи", - "sr-Latn": "Gernzi", - "zh_TW": "根息島", - "tr": "Guernsey", - "ro": "Guernsey", - "ar": "غيرنزي", - "fa": "گرنزی", - "yue": "格恩西島" - }, - flag: "🇬🇬", - code: "GG", - dialCode: "44", - minLength: 6, - maxLength: 6, - ), - Country( - name: "Guinea", - nameTranslations: { - "sk": "Guinea", - "se": "Guinea", - "pl": "Gwinea", - "no": "Guinea", - "ja": "ギニア", - "it": "Guinea", - "zh": "几内亚", - "nl": "Guinee", - "de": "Guinea", - "fr": "Guinée", - "es": "Guinea", - "en": "Guinea", - "pt_BR": "Guiné", - "sr-Cyrl": "Гвинеја", - "sr-Latn": "Gvineja", - "zh_TW": "幾內亞", - "tr": "Gine", - "ro": "Guinea", - "ar": "غينيا", - "fa": "گینه", - "yue": "幾內亞" - }, - flag: "🇬🇳", - code: "GN", - dialCode: "224", - minLength: 8, - maxLength: 9, - ), - Country( - name: "Guinea-Bissau", - nameTranslations: { - "sk": "Guinea-Bissau", - "se": "Guinea-Bissau", - "pl": "Gwinea Bissau", - "no": "Guinea-Bissau", - "ja": "ギニアビサウ", - "it": "Guinea-Bissau", - "zh": "几内亚比绍", - "nl": "Guinee-Bissau", - "de": "Guinea-Bissau", - "fr": "Guinée-Bissau", - "es": "Guinea-Bisáu", - "en": "Guinea-Bissau", - "pt_BR": "Guiné-bissau", - "sr-Cyrl": "Гвинеја Бисао", - "sr-Latn": "Gvineja Bisao", - "zh_TW": "幾內亞比索", - "tr": "Gine-Bissau", - "ro": "Guineea-Bissau", - "ar": "غينيا بيساو", - "fa": "گینه بیسائو", - "yue": "幾內亞比紹" - }, - flag: "🇬🇼", - code: "GW", - dialCode: "245", - minLength: 7, - maxLength: 7, - ), - Country( - name: "Guyana", - nameTranslations: { - "sk": "Guyana", - "se": "Guyana", - "pl": "Gujana", - "no": "Guyana", - "ja": "ガイアナ", - "it": "Guyana", - "zh": "圭亚那", - "nl": "Guyana", - "de": "Guyana", - "fr": "Guyana", - "es": "Guyana", - "en": "Guyana", - "pt_BR": "Guiana", - "sr-Cyrl": "Гвајана", - "sr-Latn": "Gvajana", - "zh_TW": "蓋亞那", - "tr": "Guyana", - "ro": "Guyana", - "ar": "غيانا", - "fa": "گویان", - "yue": "圭亞那" - }, - flag: "🇬🇾", - code: "GY", - dialCode: "592", - minLength: 7, - maxLength: 7, - ), - Country( - name: "Haiti", - nameTranslations: { - "sk": "Haiti", - "se": "Haiti", - "pl": "Haiti", - "no": "Haiti", - "ja": "ハイチ", - "it": "Haiti", - "zh": "海地", - "nl": "Haïti", - "de": "Haiti", - "fr": "Haïti", - "es": "Haití", - "en": "Haiti", - "pt_BR": "Haiti", - "sr-Cyrl": "Хаити", - "sr-Latn": "Haiti", - "zh_TW": "海地", - "tr": "Haiti", - "ro": "Haiti", - "ar": "هايتي", - "fa": "هائیتی", - "yue": "海地" - }, - flag: "🇭🇹", - code: "HT", - dialCode: "509", - minLength: 8, - maxLength: 8, - ), - Country( - name: "Heard Island and Mcdonald Islands", - nameTranslations: { - "sk": "Heardov ostrov a Macdonaldove ostrovy", - "se": "Heard- ja McDonald-sullot", - "pl": "Wyspy Heard i McDonalda", - "no": "Heard- og McDonaldøyene", - "ja": "ハード島・マクドナルド諸島", - "it": "Isole Heard e McDonald", - "zh": "赫德岛和麦克唐纳群岛", - "nl": "Heard en McDonaldeilanden", - "de": "Heard und McDonaldinseln", - "fr": "Îles Heard et McDonald", - "es": "Islas Heard y McDonald", - "en": "Heard & McDonald Islands", - "pt_BR": "Ilhas Heard e McDonald", - "sr-Cyrl": "Острва Херд и Макдоналд", - "sr-Latn": "Ostrva Herd i Makdonald", - "zh_TW": "赫德暨麥當勞群島", - "tr": "Heard Adası ve McDonald Adaları", - "ro": "Insula Heard și Insulele McDonald", - "ar": "جزيرة هيرد وجزر ماكدونالد", - "fa": "جزیره هرد و جزایر مک‌دونالد", - "yue": "赫德岛同麦克唐纳群岛" - }, - flag: "🇭🇲", - code: "HM", - dialCode: "672", - minLength: 15, - maxLength: 15, - ), - Country( - name: "Holy See (Vatican City State)", - nameTranslations: { - "sk": "Vatikán", - "se": "Vatikána", - "pl": "Watykan", - "no": "Vatikanstaten", - "ja": "バチカン市国", - "it": "Città del Vaticano", - "zh": "梵蒂冈", - "nl": "Vaticaanstad", - "de": "Vatikanstadt", - "fr": "État de la Cité du Vatican", - "es": "Ciudad del Vaticano", - "en": "Vatican City", - "pt_BR": "Cidade do Vaticano", - "sr-Cyrl": "Ватикан", - "sr-Latn": "Vatikan", - "zh_TW": "梵蒂岡", - "tr": "Vatikan", - "ro": "Vatican", - "ar": "الفاتيكان", - "fa": "واتیکان", - "yue": "梵蒂岡城國" - }, - flag: "🇻🇦", - code: "VA", - dialCode: "379", - minLength: 10, - maxLength: 10, - ), - Country( - name: "Honduras", - nameTranslations: { - "sk": "Honduras", - "se": "Honduras", - "pl": "Honduras", - "no": "Honduras", - "ja": "ホンジュラス", - "it": "Honduras", - "zh": "洪都拉斯", - "nl": "Honduras", - "de": "Honduras", - "fr": "Honduras", - "es": "Honduras", - "en": "Honduras", - "pt_BR": "Honduras", - "sr-Cyrl": "Хондурас", - "sr-Latn": "Honduras", - "zh_TW": "宏都拉斯", - "tr": "Honduras", - "ro": "Honduras", - "ar": "هندوراس", - "fa": "هندوراس", - "yue": "洪都拉斯" - }, - flag: "🇭🇳", - code: "HN", - dialCode: "504", - minLength: 8, - maxLength: 8, - ), - Country( - name: "Hong Kong", - nameTranslations: { - "sk": "Hongkong – OAO Číny", - "se": "Hongkong", - "pl": "SRA Hongkong (Chiny)", - "no": "Hongkong S.A.R. Kina", - "ja": "中華人民共和国香港特別行政区", - "it": "RAS di Hong Kong", - "zh": "中国香港特别行政区", - "nl": "Hongkong SAR van China", - "de": "Sonderverwaltungsregion Hongkong", - "fr": "R.A.S. chinoise de Hong Kong", - "es": "RAE de Hong Kong (China)", - "en": "Hong Kong SAR China", - "pt_BR": "RAE de Hong Kong China", - "sr-Cyrl": "Хонг Конг", - "sr-Latn": "Hong Kong", - "zh_TW": "香港", - "tr": "Hong Kong", - "ro": "Hong Kong", - "ar": "هونغ كونغ", - "fa": "هنگ کنگ", - "yue": "香港" - }, - flag: "🇭🇰", - code: "HK", - dialCode: "852", - minLength: 8, - maxLength: 8, - ), - Country( - name: "Hungary", - nameTranslations: { - "sk": "Maďarsko", - "se": "Ungár", - "pl": "Węgry", - "no": "Ungarn", - "ja": "ハンガリー", - "it": "Ungheria", - "zh": "匈牙利", - "nl": "Hongarije", - "de": "Ungarn", - "fr": "Hongrie", - "es": "Hungría", - "en": "Hungary", - "pt_BR": "Hungria", - "sr-Cyrl": "Мађарска", - "sr-Latn": "Mađarska", - "zh_TW": "匈牙利", - "tr": "Macaristan", - "ro": "Ungaria", - "ar": "المجر", - "fa": "مجارستان", - "yue": "匈牙利" - }, - flag: "🇭🇺", - code: "HU", - dialCode: "36", - minLength: 9, - maxLength: 9, - ), - Country( - name: "Iceland", - nameTranslations: { - "sk": "Island", - "se": "Islánda", - "pl": "Islandia", - "no": "Island", - "ja": "アイスランド", - "it": "Islanda", - "zh": "冰岛", - "nl": "IJsland", - "de": "Island", - "fr": "Islande", - "es": "Islandia", - "en": "Iceland", - "pt_BR": "Islândia", - "sr-Cyrl": "Исланд", - "sr-Latn": "Island", - "zh_TW": "冰島", - "tr": "İzlanda", - "ro": "Islanda", - "ar": "آيسلندا", - "fa": "ایسلند", - "yue": "冰島" - }, - flag: "🇮🇸", - code: "IS", - dialCode: "354", - minLength: 7, - maxLength: 9, - ), - Country( - name: "India", - nameTranslations: { - "sk": "India", - "se": "India", - "pl": "Indie", - "no": "India", - "ja": "インド", - "it": "India", - "zh": "印度", - "nl": "India", - "de": "Indien", - "fr": "Inde", - "es": "India", - "en": "India", - "pt_BR": "Índia", - "sr-Cyrl": "Индија", - "sr-Latn": "Indija", - "zh_TW": "印度", - "tr": "Hindistan", - "ro": "India", - "ar": "الهند", - "fa": "هند", - "yue": "印度" - }, - flag: "🇮🇳", - code: "IN", - dialCode: "91", - minLength: 10, - maxLength: 10, - ), - Country( - name: "Indonesia", - nameTranslations: { - "sk": "Indonézia", - "se": "Indonesia", - "pl": "Indonezja", - "no": "Indonesia", - "ja": "インドネシア", - "it": "Indonesia", - "zh": "印度尼西亚", - "nl": "Indonesië", - "de": "Indonesien", - "fr": "Indonésie", - "es": "Indonesia", - "en": "Indonesia", - "pt_BR": "Indonésia", - "sr-Cyrl": "Индонезија", - "sr-Latn": "Indonezija", - "zh_TW": "印尼", - "tr": "Endonezya", - "ro": "Indonezia", - "ar": "إندونيسيا", - "fa": "اندونزی", - "yue": "印尼" - }, - flag: "🇮🇩", - code: "ID", - dialCode: "62", - minLength: 10, - maxLength: 13, - ), - Country( - name: "Iran, Islamic Republic of Persian Gulf", - nameTranslations: { - "sk": "Irán", - "se": "Iran", - "pl": "Iran", - "no": "Iran", - "ja": "イラン", - "it": "Iran", - "zh": "伊朗", - "nl": "Iran", - "de": "Iran", - "fr": "Iran", - "es": "Irán", - "en": "Iran", - "pt_BR": "Irã", - "sr-Cyrl": "Иран", - "sr-Latn": "Iran", - "zh_TW": "伊朗", - "tr": "İran", - "ro": "Iran", - "ar": "إيران", - "fa": "ایران", - "yue": "伊朗" - }, - flag: "🇮🇷", - code: "IR", - dialCode: "98", - minLength: 10, - maxLength: 10, - ), - Country( - name: "Iraq", - nameTranslations: { - "sk": "Irak", - "se": "Irak", - "pl": "Irak", - "no": "Irak", - "ja": "イラク", - "it": "Iraq", - "zh": "伊拉克", - "nl": "Irak", - "de": "Irak", - "fr": "Irak", - "es": "Irak", - "en": "Iraq", - "pt_BR": "Iraque", - "sr-Cyrl": "Ирак", - "sr-Latn": "Irak", - "zh_TW": "伊拉克", - "tr": "Irak", - "ro": "Irak", - "ar": "العراق", - "fa": "عراق", - "yue": "伊拉克" - }, - flag: "🇮🇶", - code: "IQ", - dialCode: "964", - minLength: 10, - maxLength: 10, - ), - Country( - name: "Ireland", - nameTranslations: { - "sk": "Írsko", - "se": "Irlánda", - "pl": "Irlandia", - "no": "Irland", - "ja": "アイルランド", - "it": "Irlanda", - "zh": "爱尔兰", - "nl": "Ierland", - "de": "Irland", - "fr": "Irlande", - "es": "Irlanda", - "en": "Ireland", - "pt_BR": "Irlanda", - "sr-Cyrl": "Ирска", - "sr-Latn": "Irska", - "zh_TW": "愛爾蘭", - "tr": "İrlanda", - "ro": "Irlanda", - "ar": "أيرلندا", - "fa": "ایرلند", - "yue": "愛爾蘭" - }, - flag: "🇮🇪", - code: "IE", - dialCode: "353", - minLength: 7, - maxLength: 9, - ), - Country( - name: "Isle of Man", - nameTranslations: { - "sk": "Ostrov Man", - "se": "Mann-sullot", - "pl": "Wyspa Man", - "no": "Man", - "ja": "マン島", - "it": "Isola di Man", - "zh": "马恩岛", - "nl": "Isle of Man", - "de": "Isle of Man", - "fr": "Île de Man", - "es": "Isla de Man", - "en": "Isle of Man", - "pt_BR": "Ilha de Man", - "sr-Cyrl": "Острво Мен", - "sr-Latn": "Ostrvo Men", - "zh_TW": "曼島", - "tr": "Man Adası", - "ro": "Insula Man", - "ar": "جزيرة مان", - "fa": "جزیره مان", - "yue": "马伊岛" - }, - flag: "🇮🇲", - code: "IM", - dialCode: "44", - minLength: 6, - maxLength: 6, - ), - Country( - name: "Israel", - nameTranslations: { - "sk": "Izrael", - "se": "Israel", - "pl": "Izrael", - "no": "Israel", - "ja": "イスラエル", - "it": "Israele", - "zh": "以色列", - "nl": "Israël", - "de": "Israel", - "fr": "Israël", - "es": "Israel", - "en": "Israel", - "pt_BR": "Israel", - "sr-Cyrl": "Израел", - "sr-Latn": "Izrael", - "zh_TW": "以色列", - "tr": "İsrail", - "ro": "Israel", - "ar": "إسرائيل", - "fa": "إسرائيل", - "yue": "以色列" - }, - flag: "🇮🇱", - code: "IL", - dialCode: "972", - minLength: 9, - maxLength: 9, - ), - Country( - name: "Campione d'Italia", - nameTranslations: { - "sk": "Taliansko", - "se": "Itália", - "pl": "Włochy", - "no": "Italia", - "ja": "イタリア", - "it": "Italia", - "zh": "意大利", - "nl": "Italië", - "de": "Italien", - "fr": "Italie", - "es": "Italia", - "en": "Italy", - "pt_BR": "Itália", - "sr-Cyrl": "Италија", - "sr-Latn": "Italija", - "zh_TW": "義大利", - "tr": "İtalya", - "ro": "Italia", - "ar": "إيطاليا", - "fa": "ایتالیا", - "yue": "意大利" - }, - flag: "🇮🇹", - code: "IT", - dialCode: "39", - minLength: 9, - maxLength: 10, - ), - Country( - name: "Jamaica", - nameTranslations: { - "sk": "Jamajka", - "se": "Jamaica", - "pl": "Jamajka", - "no": "Jamaica", - "ja": "ジャマイカ", - "it": "Giamaica", - "zh": "牙买加", - "nl": "Jamaica", - "de": "Jamaika", - "fr": "Jamaïque", - "es": "Jamaica", - "en": "Jamaica", - "pt_BR": "Jamaica", - "sr-Cyrl": "Јамајка", - "sr-Latn": "Jamajka", - "zh_TW": "牙買加", - "tr": "Jamaika", - "ro": "Jamaica", - "ar": "جامايكا", - "fa": "جامائیکا", - "yue": "牙買加" - }, - flag: "🇯🇲", - code: "JM", - dialCode: "1876", - minLength: 7, - maxLength: 7, - ), - Country( - name: "Japan", - nameTranslations: { - "sk": "Japonsko", - "se": "Japána", - "pl": "Japonia", - "no": "Japan", - "ja": "日本", - "it": "Giappone", - "zh": "日本", - "nl": "Japan", - "de": "Japan", - "fr": "Japon", - "es": "Japón", - "en": "Japan", - "pt_BR": "Japão", - "sr-Cyrl": "Јапан", - "sr-Latn": "Japan", - "zh_TW": "日本", - "tr": "Japonya", - "ro": "Japonia", - "ar": "اليابان", - "fa": "ژاپن", - "yue": "日本" - }, - flag: "🇯🇵", - code: "JP", - dialCode: "81", - minLength: 10, - maxLength: 10, - ), - Country( - name: "Jersey", - nameTranslations: { - "sk": "Jersey", - "se": "Jersey", - "pl": "Jersey", - "no": "Jersey", - "ja": "ジャージー", - "it": "Jersey", - "zh": "泽西岛", - "nl": "Jersey", - "de": "Jersey", - "fr": "Jersey", - "es": "Jersey", - "en": "Jersey", - "pt_BR": "Jersey", - "sr-Cyrl": "Џерзи", - "sr-Latn": "Džerzi", - "zh_TW": "澤西", - "tr": "Jersey", - "ro": "Jersey", - "ar": "جيرزي", - "fa": "جرزی", - "yue": "澤西" - }, - flag: "🇯🇪", - code: "JE", - dialCode: "44", - minLength: 6, - maxLength: 6, - ), - Country( - name: "Jordan", - nameTranslations: { - "sk": "Jordánsko", - "se": "Jordánia", - "pl": "Jordania", - "no": "Jordan", - "ja": "ヨルダン", - "it": "Giordania", - "zh": "约旦", - "nl": "Jordanië", - "de": "Jordanien", - "fr": "Jordanie", - "es": "Jordania", - "en": "Jordan", - "pt_BR": "Jordânia", - "sr-Cyrl": "Јордан", - "sr-Latn": "Jordan", - "zh_TW": "約旦", - "tr": "Mavera-i Ürdün", - "ro": "Iordania", - "ar": "الأردن", - "fa": "اردن", - "yue": "約旦" - }, - flag: "🇯🇴", - code: "JO", - dialCode: "962", - minLength: 9, - maxLength: 9, - ), - Country( - name: "Kazakhstan", - nameTranslations: { - "sk": "Kazachstan", - "se": "Kasakstan", - "pl": "Kazachstan", - "no": "Kasakhstan", - "ja": "カザフスタン", - "it": "Kazakistan", - "zh": "哈萨克斯坦", - "nl": "Kazachstan", - "de": "Kasachstan", - "fr": "Kazakhstan", - "es": "Kazajistán", - "en": "Kazakhstan", - "pt_BR": "Cazaquistão", - "sr-Cyrl": "Казахстан", - "sr-Latn": "Kazahstan", - "zh_TW": "哈薩克", - "tr": "Kazakistan", - "ro": "Kazahstan", - "ar": "كازاخستان", - "fa": "قزاقستان", - "yue": "哈薩克斯坦" - }, - flag: "🇰🇿", - code: "KZ", - dialCode: "7", - minLength: 10, - maxLength: 10, - ), - Country( - name: "Kenya", - nameTranslations: { - "sk": "Keňa", - "se": "Kenia", - "pl": "Kenia", - "no": "Kenya", - "ja": "ケニア", - "it": "Kenya", - "zh": "肯尼亚", - "nl": "Kenia", - "de": "Kenia", - "fr": "Kenya", - "es": "Kenia", - "en": "Kenya", - "pt_BR": "Quênia", - "sr-Cyrl": "Кенија", - "sr-Latn": "Kenija", - "zh_TW": "肯亞", - "tr": "Kenya", - "ro": "Kenya", - "ar": "كينيا", - "fa": "كنيا", - "yue": "肯雅" - }, - flag: "🇰🇪", - code: "KE", - dialCode: "254", - minLength: 10, - maxLength: 10, - ), - Country( - name: "Kiribati", - nameTranslations: { - "sk": "Kiribati", - "se": "Kiribati", - "pl": "Kiribati", - "no": "Kiribati", - "ja": "キリバス", - "it": "Kiribati", - "zh": "基里巴斯", - "nl": "Kiribati", - "de": "Kiribati", - "fr": "Kiribati", - "es": "Kiribati", - "en": "Kiribati", - "pt_BR": "Kiribati", - "sr-Cyrl": "Кирибати", - "sr-Latn": "Kiribati", - "zh_TW": "吉里巴斯", - "tr": "Kiribati", - "ro": "Kiribati", - "ar": "كيريباتي", - "fa": "کیریباتی", - "yue": "基里巴斯" - }, - flag: "🇰🇮", - code: "KI", - dialCode: "686", - minLength: 5, - maxLength: 5, - ), - Country( - name: "Korea, Democratic People's Republic of Korea", - nameTranslations: { - "sk": "Severná Kórea", - "se": "Davvi-Korea", - "pl": "Korea Północna", - "no": "Nord-Korea", - "ja": "北朝鮮", - "it": "Corea del Nord", - "zh": "朝鲜", - "nl": "Noord-Korea", - "de": "Nordkorea", - "fr": "Corée du Nord", - "es": "Corea del Norte", - "en": "North Korea", - "pt_BR": "Coreia do Norte", - "sr-Cyrl": "Северна Кореја", - "sr-Latn": "Severna Koreja", - "zh_TW": "北韓", - "tr": "Kuzey Kore", - "ro": "Coreea de Nord", - "ar": "كوريا الشمالية", - "fa": "کره شمالی", - "yue": "朝鮮(朝鮮民主主義人民共咊囯)" - }, - flag: "🇰🇵", - code: "KP", - dialCode: "850", - minLength: 10, - maxLength: 10, - ), - Country( - name: "Korea, Republic of South Korea", - nameTranslations: { - "sk": "Južná Kórea", - "se": "Mátta-Korea", - "pl": "Korea Południowa", - "no": "Sør-Korea", - "ja": "韓国", - "it": "Corea del Sud", - "zh": "韩国", - "nl": "Zuid-Korea", - "de": "Südkorea", - "fr": "Corée du Sud", - "es": "Corea del Sur", - "en": "South Korea", - "pt_BR": "Coreia do Sul", - "sr-Cyrl": "Јужна Кореја", - "sr-Latn": "Južna Koreja", - "zh_TW": "南韓", - "tr": "Güney Kore", - "ro": "Coreea de Sud", - "ar": "كوريا الجنوبية", - "fa": "کره جنوبی", - "yue": "韓國(大韓民國)" - }, - flag: "🇰🇷", - code: "KR", - dialCode: "82", - minLength: 11, - maxLength: 11, - ), - Country( - name: "Kuwait", - nameTranslations: { - "sk": "Kuvajt", - "se": "Kuwait", - "pl": "Kuwejt", - "no": "Kuwait", - "ja": "クウェート", - "it": "Kuwait", - "zh": "科威特", - "nl": "Koeweit", - "de": "Kuwait", - "fr": "Koweït", - "es": "Kuwait", - "en": "Kuwait", - "pt_BR": "Kuwait", - "sr-Cyrl": "Кувајт", - "sr-Latn": "Kuvajt", - "zh_TW": "科威特", - "tr": "Kuveyt", - "ro": "Kuweit", - "ar": "الكويت", - "fa": "کویت", - "yue": "科威特" - }, - flag: "🇰🇼", - code: "KW", - dialCode: "965", - minLength: 8, - maxLength: 8, - ), - Country( - name: "Kyrgyzstan", - nameTranslations: { - "sk": "Kirgizsko", - "se": "Kirgisistan", - "pl": "Kirgistan", - "no": "Kirgisistan", - "ja": "キルギス", - "it": "Kirghizistan", - "zh": "吉尔吉斯斯坦", - "nl": "Kirgizië", - "de": "Kirgisistan", - "fr": "Kirghizistan", - "es": "Kirguistán", - "en": "Kyrgyzstan", - "pt_BR": "Quirguistão", - "sr-Cyrl": "Киргистан", - "sr-Latn": "Kirgistan", - "zh_TW": "吉爾吉斯", - "tr": "Kırgızistan", - "ro": "Kîrgîzstan", - "ar": "قيرغيزستان", - "fa": "قرقیزستان", - "yue": "吉爾吉斯斯坦" - }, - flag: "🇰🇬", - code: "KG", - dialCode: "996", - minLength: 9, - maxLength: 9, - ), - Country( - name: "Laos", - nameTranslations: { - "sk": "Laos", - "se": "Laos", - "pl": "Laos", - "no": "Laos", - "ja": "ラオス", - "it": "Laos", - "zh": "老挝", - "nl": "Laos", - "de": "Laos", - "fr": "Laos", - "es": "Laos", - "en": "Laos", - "pt_BR": "Laos", - "sr-Cyrl": "Лаос", - "sr-Latn": "Laos", - "zh_TW": "寮國", - "tr": "Laos", - "ro": "Laos", - "ar": "لاوس", - "fa": "لائوس", - "yue": "老撾人民民主共和國" - }, - flag: "🇱🇦", - code: "LA", - dialCode: "856", - minLength: 10, - maxLength: 10, - ), - Country( - name: "Latvia", - nameTranslations: { - "sk": "Lotyšsko", - "se": "Látvia", - "pl": "Łotwa", - "no": "Latvia", - "ja": "ラトビア", - "it": "Lettonia", - "zh": "拉脱维亚", - "nl": "Letland", - "de": "Lettland", - "fr": "Lettonie", - "es": "Letonia", - "en": "Latvia", - "pt_BR": "Letônia", - "sr-Cyrl": "Летонија", - "sr-Latn": "Letonija", - "zh_TW": "拉托維亞", - "tr": "Letonya", - "ro": "Letonia", - "ar": "لاتفيا", - "fa": "لتونی", - "yue": "拉脫維亞" - }, - flag: "🇱🇻", - code: "LV", - dialCode: "371", - minLength: 8, - maxLength: 8, - ), - Country( - name: "Lebanon", - nameTranslations: { - "sk": "Libanon", - "se": "Libanon", - "pl": "Liban", - "no": "Libanon", - "ja": "レバノン", - "it": "Libano", - "zh": "黎巴嫩", - "nl": "Libanon", - "de": "Libanon", - "fr": "Liban", - "es": "Líbano", - "en": "Lebanon", - "pt_BR": "Líbano", - "sr-Cyrl": "Либан", - "sr-Latn": "Liban", - "zh_TW": "黎巴嫩", - "tr": "Lübnan", - "ro": "Liban", - "ar": "لبنان", - "fa": "لبنان", - "yue": "黎巴嫩" - }, - flag: "🇱🇧", - code: "LB", - dialCode: "961", - minLength: 8, - maxLength: 8, - ), - Country( - name: "Lesotho", - nameTranslations: { - "sk": "Lesotho", - "se": "Lesotho", - "pl": "Lesotho", - "no": "Lesotho", - "ja": "レソト", - "it": "Lesotho", - "zh": "莱索托", - "nl": "Lesotho", - "de": "Lesotho", - "fr": "Lesotho", - "es": "Lesoto", - "en": "Lesotho", - "pt_BR": "Lesoto", - "sr-Cyrl": "Лесото", - "sr-Latn": "Lesoto", - "zh_TW": "賴索托", - "tr": "Lesotho", - "ro": "Lesotho", - "ar": "ليسوتو", - "fa": "لسوتو", - "yue": "萊索托" - }, - flag: "🇱🇸", - code: "LS", - dialCode: "266", - minLength: 8, - maxLength: 8, - ), - Country( - name: "Liberia", - nameTranslations: { - "sk": "Libéria", - "se": "Liberia", - "pl": "Liberia", - "no": "Liberia", - "ja": "リベリア", - "it": "Liberia", - "zh": "利比里亚", - "nl": "Liberia", - "de": "Liberia", - "fr": "Libéria", - "es": "Liberia", - "en": "Liberia", - "pt_BR": "Libéria", - "sr-Cyrl": "Либерија", - "sr-Latn": "Liberija", - "zh_TW": "賴比瑞亞", - "tr": "Liberya", - "ro": "Liberia", - "ar": "ليبيريا", - "fa": "لیبریا", - "yue": "利比里亞" - }, - flag: "🇱🇷", - code: "LR", - dialCode: "231", - minLength: 8, - maxLength: 8, - ), - Country( - name: "Libyan Arab Jamahiriya", - nameTranslations: { - "sk": "Líbya", - "se": "Libya", - "pl": "Libia", - "no": "Libya", - "ja": "リビア", - "it": "Libia", - "zh": "利比亚", - "nl": "Libië", - "de": "Libyen", - "fr": "Libye", - "es": "Libia", - "en": "Libya", - "pt_BR": "Líbia", - "sr-Cyrl": "Либија", - "sr-Latn": "Libija", - "zh_TW": "利比亞", - "tr": "Libya", - "ro": "Libia", - "ar": "ليبيا", - "fa": "لیبی", - "yue": "利比亞" - }, - flag: "🇱🇾", - code: "LY", - dialCode: "218", - minLength: 9, - maxLength: 9, - ), - Country( - name: "Liechtenstein", - nameTranslations: { - "sk": "Lichtenštajnsko", - "se": "Liechtenstein", - "pl": "Liechtenstein", - "no": "Liechtenstein", - "ja": "リヒテンシュタイン", - "it": "Liechtenstein", - "zh": "列支敦士登", - "nl": "Liechtenstein", - "de": "Liechtenstein", - "fr": "Liechtenstein", - "es": "Liechtenstein", - "en": "Liechtenstein", - "pt_BR": "Liechtenstein", - "sr-Cyrl": "Лихтенштајн", - "sr-Latn": "Lihtenštajn", - "zh_TW": "列支敦斯登", - "tr": "Lihtenştayn", - "ro": "Liechtenstein", - "ar": "ليختنشتاين", - "fa": "لیختن‌اشتاین", - "yue": "列支敦士登" - }, - flag: "🇱🇮", - code: "LI", - dialCode: "423", - minLength: 9, - maxLength: 9, - ), - Country( - name: "Lithuania", - nameTranslations: { - "sk": "Litva", - "se": "Lietuva", - "pl": "Litwa", - "no": "Litauen", - "ja": "リトアニア", - "it": "Lituania", - "zh": "立陶宛", - "nl": "Litouwen", - "de": "Litauen", - "fr": "Lituanie", - "es": "Lituania", - "en": "Lithuania", - "pt_BR": "Lituânia", - "sr-Cyrl": "Литванија", - "sr-Latn": "Litvanija", - "zh_TW": "立陶宛", - "tr": "Litvanya", - "ro": "Lituania", - "ar": "ليتوانيا", - "fa": "لیتوانی", - "yue": "立陶宛" - }, - flag: "🇱🇹", - code: "LT", - dialCode: "370", - minLength: 8, - maxLength: 8, - ), - Country( - name: "Luxembourg", - nameTranslations: { - "sk": "Luxembursko", - "se": "Luxembourg", - "pl": "Luksemburg", - "no": "Luxemburg", - "ja": "ルクセンブルク", - "it": "Lussemburgo", - "zh": "卢森堡", - "nl": "Luxemburg", - "de": "Luxemburg", - "fr": "Luxembourg", - "es": "Luxemburgo", - "en": "Luxembourg", - "pt_BR": "Luxemburgo", - "sr-Cyrl": "Луксенбург", - "sr-Latn": "Luksenburg", - "zh_TW": "盧森堡", - "tr": "Lüksemburg", - "ro": "Luxemburg", - "ar": "لوكسمبورغ", - "fa": "لوکزامبورگ", - "yue": "盧森堡" - }, - flag: "🇱🇺", - code: "LU", - dialCode: "352", - minLength: 11, - maxLength: 11, - ), - Country( - name: "Macao", - nameTranslations: { - "sk": "Macao – OAO Číny", - "se": "Makáo", - "pl": "SRA Makau (Chiny)", - "no": "Macao S.A.R. Kina", - "ja": "中華人民共和国マカオ特別行政区", - "it": "RAS di Macao", - "zh": "中国澳门特别行政区", - "nl": "Macau SAR van China", - "de": "Sonderverwaltungsregion Macau", - "fr": "R.A.S. chinoise de Macao", - "es": "RAE de Macao (China)", - "en": "Macao SAR China", - "pt_BR": "RAE de Macau China", - "sr-Cyrl": "Макао", - "sr-Latn": "Makao", - "zh_TW": "澳門", - "tr": "Makao", - "ro": "Macao", - "ar": "ماكاو", - "fa": "ماكائو", - "yue": "澳門" - }, - flag: "🇲🇴", - code: "MO", - dialCode: "853", - minLength: 8, - maxLength: 8, - ), - Country( - name: "Macedonia", - nameTranslations: { - "sk": "Severné Macedónsko", - "se": "North Macedonia", - "pl": "Macedonia Północna", - "no": "Nord-Makedonia", - "ja": "北マケドニア", - "it": "Macedonia del Nord", - "zh": "北马其顿", - "nl": "Noord-Macedonië", - "de": "Nordmazedonien", - "fr": "Macédoine du Nord", - "es": "Macedonia del Norte", - "en": "North Macedonia", - "pt_BR": "Macedônia do Norte", - "sr-Cyrl": "Северна Македонија", - "sr-Latn": "Severna Makedonija", - "zh_TW": "北馬其頓", - "tr": "Kuzey Makedonya", - "ro": "Macedonia de Nord", - "ar": "مقدونيا", - "fa": "مقدونیه", - "yue": "馬其頓(前南斯拉夫共和國)" - }, - flag: "🇲🇰", - code: "MK", - dialCode: "389", - minLength: 8, - maxLength: 8, - ), - Country( - name: "Madagascar", - nameTranslations: { - "sk": "Madagaskar", - "se": "Madagaskar", - "pl": "Madagaskar", - "no": "Madagaskar", - "ja": "マダガスカル", - "it": "Madagascar", - "zh": "马达加斯加", - "nl": "Madagaskar", - "de": "Madagaskar", - "fr": "Madagascar", - "es": "Madagascar", - "en": "Madagascar", - "pt_BR": "Madagáscar", - "sr-Cyrl": "Мадагаскар", - "sr-Latn": "Madagaskar", - "zh_TW": "馬達加斯加", - "tr": "Madagaskar", - "ro": "Madagascar", - "ar": "مدغشقر", - "fa": "ماداگاسکار", - "yue": "馬達加斯加" - }, - flag: "🇲🇬", - code: "MG", - dialCode: "261", - minLength: 10, - maxLength: 10, - ), - Country( - name: "Malawi", - nameTranslations: { - "sk": "Malawi", - "se": "Malawi", - "pl": "Malawi", - "no": "Malawi", - "ja": "マラウイ", - "it": "Malawi", - "zh": "马拉维", - "nl": "Malawi", - "de": "Malawi", - "fr": "Malawi", - "es": "Malaui", - "en": "Malawi", - "pt_BR": "Malawi", - "sr-Cyrl": "Малави", - "sr-Latn": "Malavi", - "zh_TW": "馬拉威", - "tr": "Malavi", - "ro": "Malawi", - "ar": "مالاوي", - "fa": "مالاوی", - "yue": "馬拉維" - }, - flag: "🇲🇼", - code: "MW", - dialCode: "265", - minLength: 7, - maxLength: 9, - ), - Country( - name: "Malaysia", - nameTranslations: { - "sk": "Malajzia", - "se": "Malesia", - "pl": "Malezja", - "no": "Malaysia", - "ja": "マレーシア", - "it": "Malaysia", - "zh": "马来西亚", - "nl": "Maleisië", - "de": "Malaysia", - "fr": "Malaisie", - "es": "Malasia", - "en": "Malaysia", - "pt_BR": "Malásia", - "sr-Cyrl": "Малезија", - "sr-Latn": "Malezija", - "zh_TW": "馬來西亞", - "tr": "Malezya", - "ro": "Malaezia", - "ar": "ماليزيا", - "fa": "مالزی", - "yue": "馬來西亞" - }, - flag: "🇲🇾", - code: "MY", - dialCode: "60", - minLength: 9, - maxLength: 10, - ), - Country( - name: "Maldives", - nameTranslations: { - "sk": "Maldivy", - "se": "Malediivvat", - "pl": "Malediwy", - "no": "Maldivene", - "ja": "モルディブ", - "it": "Maldive", - "zh": "马尔代夫", - "nl": "Maldiven", - "de": "Malediven", - "fr": "Maldives", - "es": "Maldivas", - "en": "Maldives", - "pt_BR": "Maldivas", - "sr-Cyrl": "Малдиви", - "sr-Latn": "Maldivi", - "zh_TW": "馬爾地夫", - "tr": "Maldivler", - "ro": "Maldive", - "ar": "جزر المالديف", - "fa": "مالدیو", - "yue": "馬爾代夫" - }, - flag: "🇲🇻", - code: "MV", - dialCode: "960", - minLength: 7, - maxLength: 7, - ), - Country( - name: "Mali", - nameTranslations: { - "sk": "Mali", - "se": "Mali", - "pl": "Mali", - "no": "Mali", - "ja": "マリ", - "it": "Mali", - "zh": "马里", - "nl": "Mali", - "de": "Mali", - "fr": "Mali", - "es": "Mali", - "en": "Mali", - "pt_BR": "Mali", - "sr-Cyrl": "Мали", - "sr-Latn": "Mali", - "zh_TW": "馬里", - "tr": "Mali", - "ro": "Mali", - "ar": "مالي", - "fa": "مالی", - "yue": "馬里" - }, - flag: "🇲🇱", - code: "ML", - dialCode: "223", - minLength: 8, - maxLength: 8, - ), - Country( - name: "Malta", - nameTranslations: { - "sk": "Malta", - "se": "Málta", - "pl": "Malta", - "no": "Malta", - "ja": "マルタ", - "it": "Malta", - "zh": "马耳他", - "nl": "Malta", - "de": "Malta", - "fr": "Malte", - "es": "Malta", - "en": "Malta", - "pt_BR": "Malta", - "sr-Cyrl": "Малта", - "sr-Latn": "Malta", - "zh_TW": "馬爾他", - "tr": "Malta", - "ro": "Malta", - "ar": "مالطا", - "fa": "مالت", - "yue": "馬耳他" - }, - flag: "🇲🇹", - code: "MT", - dialCode: "356", - minLength: 8, - maxLength: 8, - ), - Country( - name: "Marshall Islands", - nameTranslations: { - "sk": "Marshallove ostrovy", - "se": "Marshallsullot", - "pl": "Wyspy Marshalla", - "no": "Marshalløyene", - "ja": "マーシャル諸島", - "it": "Isole Marshall", - "zh": "马绍尔群岛", - "nl": "Marshalleilanden", - "de": "Marshallinseln", - "fr": "Îles Marshall", - "es": "Islas Marshall", - "en": "Marshall Islands", - "pt_BR": "Ilhas Marshall", - "sr-Cyrl": "Маршалска Острва", - "sr-Latn": "Maršalska Ostrva", - "zh_TW": "馬紹爾群島", - "tr": "Marshall Adaları", - "ro": "Insulele Marshall", - "ar": "جزر مارشال", - "fa": "جزایر مارشال", - "yue": "馬紹爾群島" - }, - flag: "🇲🇭", - code: "MH", - dialCode: "692", - minLength: 7, - maxLength: 7, - ), - Country( - name: "Martinique", - nameTranslations: { - "sk": "Martinik", - "se": "Martinique", - "pl": "Martynika", - "no": "Martinique", - "ja": "マルティニーク", - "it": "Martinica", - "zh": "马提尼克", - "nl": "Martinique", - "de": "Martinique", - "fr": "Martinique", - "es": "Martinica", - "en": "Martinique", - "pt_BR": "Martinica", - "sr-Cyrl": "Мартиник", - "sr-Latn": "Martinik", - "zh_TW": "馬丁尼克", - "tr": "Martinique", - "ro": "Martinica", - "ar": "مارتينيك", - "fa": "مارتینیک", - "yue": "马提尼克" - }, - flag: "🇲🇶", - code: "MQ", - dialCode: "596", - minLength: 15, - maxLength: 15, - ), - Country( - name: "Mauritania", - nameTranslations: { - "sk": "Mauritánia", - "se": "Mauretánia", - "pl": "Mauretania", - "no": "Mauritania", - "ja": "モーリタニア", - "it": "Mauritania", - "zh": "毛里塔尼亚", - "nl": "Mauritanië", - "de": "Mauretanien", - "fr": "Mauritanie", - "es": "Mauritania", - "en": "Mauritania", - "pt_BR": "Mauritânia", - "sr-Cyrl": "Мауританија", - "sr-Latn": "Mauritanija", - "zh_TW": "茅利塔尼亞", - "tr": "Moritanya", - "ro": "Mauritania", - "ar": "موريتانيا", - "fa": "موریتانی", - "yue": "毛里塔尼亞" - }, - flag: "🇲🇷", - code: "MR", - dialCode: "222", - minLength: 8, - maxLength: 8, - ), - Country( - name: "Mauritius", - nameTranslations: { - "sk": "Maurícius", - "se": "Mauritius", - "pl": "Mauritius", - "no": "Mauritius", - "ja": "モーリシャス", - "it": "Mauritius", - "zh": "毛里求斯", - "nl": "Mauritius", - "de": "Mauritius", - "fr": "Maurice", - "es": "Mauricio", - "en": "Mauritius", - "pt_BR": "Maurício", - "sr-Cyrl": "Маурицијус", - "sr-Latn": "Mauricijus", - "zh_TW": "模里西斯", - "tr": "Mauritius", - "ro": "Mauritius", - "ar": "موريشيوس", - "fa": "موریس", - "yue": "毛里求斯" - }, - flag: "🇲🇺", - code: "MU", - dialCode: "230", - minLength: 7, - maxLength: 8, - ), - Country( - name: "Mayotte", - nameTranslations: { - "sk": "Mayotte", - "se": "Mayotte", - "pl": "Majotta", - "no": "Mayotte", - "ja": "マヨット", - "it": "Mayotte", - "zh": "马约特", - "nl": "Mayotte", - "de": "Mayotte", - "fr": "Mayotte", - "es": "Mayotte", - "en": "Mayotte", - "pt_BR": "Mayotte", - "sr-Cyrl": "Мајота", - "sr-Latn": "Majota", - "zh_TW": "馬約特", - "tr": "Mayotte", - "ro": "Mayotte", - "ar": "مايوت", - "fa": "مایوت", - "yue": "馬約特" - }, - flag: "🇾🇹", - code: "YT", - dialCode: "262", - minLength: 9, - maxLength: 9, - ), - Country( - name: "Mexico", - nameTranslations: { - "sk": "Mexiko", - "se": "Meksiko", - "pl": "Meksyk", - "no": "Mexico", - "ja": "メキシコ", - "it": "Messico", - "zh": "墨西哥", - "nl": "Mexico", - "de": "Mexiko", - "fr": "Mexique", - "es": "México", - "en": "Mexico", - "pt_BR": "México", - "sr-Cyrl": "Мексико", - "sr-Latn": "Meksiko", - "zh_TW": "墨西哥", - "tr": "Meksika", - "ro": "Mexic", - "ar": "المكسيك", - "fa": "مکزیک", - "yue": "墨西哥" - }, - flag: "🇲🇽", - code: "MX", - dialCode: "52", - minLength: 10, - maxLength: 10, - ), - Country( - name: "Micronesia, Federated States of Micronesia", - nameTranslations: { - "sk": "Mikronézia", - "se": "Mikronesia", - "pl": "Mikronezja", - "no": "Mikronesiaføderasjonen", - "ja": "ミクロネシア連邦", - "it": "Micronesia", - "zh": "密克罗尼西亚", - "nl": "Micronesia", - "de": "Mikronesien", - "fr": "États fédérés de Micronésie", - "es": "Micronesia", - "en": "Micronesia", - "pt_BR": "Micronésia", - "sr-Cyrl": "Микронезија", - "sr-Latn": "Mikronezija", - "zh_TW": "密克羅尼西亞", - "tr": "Mikronezya", - "ro": "Micronezia", - "ar": "ولايات ميكرونيسيا المتحدة", - "fa": "ایالات فدرال میکرونزی", - "yue": "密克罗尼西亚(聯邦)" - }, - flag: "🇫🇲", - code: "FM", - dialCode: "691", - minLength: 7, - maxLength: 7, - ), - Country( - name: "Moldova", - nameTranslations: { - "sk": "Moldavsko", - "se": "Moldávia", - "pl": "Mołdawia", - "no": "Moldova", - "ja": "モルドバ", - "it": "Moldavia", - "zh": "摩尔多瓦", - "nl": "Moldavië", - "de": "Republik Moldau", - "fr": "Moldavie", - "es": "Moldavia", - "en": "Moldova", - "pt_BR": "Moldova", - "sr-Cyrl": "Молдавија", - "sr-Latn": "Moldavija", - "zh_TW": "摩爾多瓦", - "tr": "Moldova", - "ro": "Moldova", - "ar": "مولدوفا", - "fa": "مولداوی", - "yue": "摩爾多瓦(共和國)" - }, - flag: "🇲🇩", - code: "MD", - dialCode: "373", - minLength: 8, - maxLength: 8, - ), - Country( - name: "Monaco", - nameTranslations: { - "sk": "Monako", - "se": "Monaco", - "pl": "Monako", - "no": "Monaco", - "ja": "モナコ", - "it": "Monaco", - "zh": "摩纳哥", - "nl": "Monaco", - "de": "Monaco", - "fr": "Monaco", - "es": "Mónaco", - "en": "Monaco", - "pt_BR": "Mônaco", - "sr-Cyrl": "Монако", - "sr-Latn": "Monako", - "zh_TW": "摩納哥", - "tr": "Monako", - "ro": "Monaco", - "ar": "موناكو", - "fa": "موناكو", - "yue": "摩納哥" - }, - flag: "🇲🇨", - code: "MC", - dialCode: "377", - minLength: 9, - maxLength: 9, - ), - Country( - name: "Mongolia", - nameTranslations: { - "sk": "Mongolsko", - "se": "Mongolia", - "pl": "Mongolia", - "no": "Mongolia", - "ja": "モンゴル", - "it": "Mongolia", - "zh": "蒙古", - "nl": "Mongolië", - "de": "Mongolei", - "fr": "Mongolie", - "es": "Mongolia", - "en": "Mongolia", - "pt_BR": "Mongólia", - "sr-Cyrl": "Монголија", - "sr-Latn": "Mongolija", - "zh_TW": "蒙古", - "tr": "Moğolistan", - "ro": "Mongolia", - "ar": "منغوليا", - "fa": "مغولستان", - "yue": "蒙古" - }, - flag: "🇲🇳", - code: "MN", - dialCode: "976", - minLength: 8, - maxLength: 8, - ), - Country( - name: "Montenegro", - nameTranslations: { - "sk": "Čierna Hora", - "se": "Montenegro", - "pl": "Czarnogóra", - "no": "Montenegro", - "ja": "モンテネグロ", - "it": "Montenegro", - "zh": "黑山", - "nl": "Montenegro", - "de": "Montenegro", - "fr": "Monténégro", - "es": "Montenegro", - "en": "Montenegro", - "pt_BR": "Montenegro", - "sr-Cyrl": "Црна Гора", - "sr-Latn": "Crna Gora", - "zh_TW": "蒙特內哥羅", - "tr": "Karadağ", - "ro": "Muntenegru", - "ar": "الجبل الأسود", - "fa": "مونته‌نگرو", - "yue": "黑山" - }, - flag: "🇲🇪", - code: "ME", - dialCode: "382", - minLength: 12, - maxLength: 12, - ), - Country( - name: "Montserrat", - nameTranslations: { - "sk": "Montserrat", - "se": "Montserrat", - "pl": "Montserrat", - "no": "Montserrat", - "ja": "モントセラト", - "it": "Montserrat", - "zh": "蒙特塞拉特", - "nl": "Montserrat", - "de": "Montserrat", - "fr": "Montserrat", - "es": "Montserrat", - "en": "Montserrat", - "pt_BR": "Montserrat", - "sr-Cyrl": "Монтсерат", - "sr-Latn": "Montserat", - "zh_TW": "蒙哲臘", - "tr": "Montserrat", - "ro": "Montserrat", - "ar": "مونتسرات", - "fa": "مونتسرات", - "yue": "蒙特塞拉特" - }, - flag: "🇲🇸", - code: "MS", - dialCode: "1664", - minLength: 7, - maxLength: 7, - ), - Country( - name: "Morocco", - nameTranslations: { - "sk": "Maroko", - "se": "Marokko", - "pl": "Maroko", - "no": "Marokko", - "ja": "モロッコ", - "it": "Marocco", - "zh": "摩洛哥", - "nl": "Marokko", - "de": "Marokko", - "fr": "Maroc", - "es": "Marruecos", - "en": "Morocco", - "pt_BR": "Marrocos", - "sr-Cyrl": "Мароко", - "sr-Latn": "Maroko", - "zh_TW": "摩洛哥", - "tr": "Fas", - "ro": "Maroc", - "ar": "المغرب", - "fa": "مراکش", - "yue": "摩洛哥" - }, - flag: "🇲🇦", - code: "MA", - dialCode: "212", - minLength: 9, - maxLength: 9, - ), - Country( - name: "Mozambique", - nameTranslations: { - "sk": "Mozambik", - "se": "Mosambik", - "pl": "Mozambik", - "no": "Mosambik", - "ja": "モザンビーク", - "it": "Mozambico", - "zh": "莫桑比克", - "nl": "Mozambique", - "de": "Mosambik", - "fr": "Mozambique", - "es": "Mozambique", - "en": "Mozambique", - "pt_BR": "Moçambique", - "sr-Cyrl": "Мозамбик", - "sr-Latn": "Mozambik", - "zh_TW": "莫三比克", - "tr": "Mozambik", - "ro": "Mozambic", - "ar": "موزمبيق", - "fa": "موزامبیک", - "yue": "莫桑比克" - }, - flag: "🇲🇿", - code: "MZ", - dialCode: "258", - minLength: 9, - maxLength: 9, - ), - Country( - name: "Myanmar", - nameTranslations: { - "sk": "Mjanmarsko", - "se": "Burma", - "pl": "Mjanma (Birma)", - "no": "Myanmar (Burma)", - "ja": "ミャンマー (ビルマ)", - "it": "Myanmar (Birmania)", - "zh": "缅甸", - "nl": "Myanmar (Birma)", - "de": "Myanmar", - "fr": "Myanmar (Birmanie)", - "es": "Myanmar (Birmania)", - "en": "Myanmar (Burma)", - "pt_BR": "Mianmar (Birmânia)", - "sr-Cyrl": "Мјанмар (Бурма)", - "sr-Latn": "Mjanmar (Burma)", - "zh_TW": "緬甸", - "tr": "Myanmar", - "ro": "Myanmar", - "ar": "ميانمار", - "fa": "میانمار", - "yue": "緬甸" - }, - flag: "🇲🇲", - code: "MM", - dialCode: "95", - minLength: 9, - maxLength: 9, - ), - Country( - name: "Namibia", - nameTranslations: { - "sk": "Namíbia", - "se": "Namibia", - "pl": "Namibia", - "no": "Namibia", - "ja": "ナミビア", - "it": "Namibia", - "zh": "纳米比亚", - "nl": "Namibië", - "de": "Namibia", - "fr": "Namibie", - "es": "Namibia", - "en": "Namibia", - "pt_BR": "Namibia", - "sr-Cyrl": "Намибија", - "sr-Latn": "Namibija", - "zh_TW": "納米比亞", - "tr": "Namibya", - "ro": "Namibia", - "ar": "ناميبيا", - "fa": "نامیبیا", - "yue": "納米比亞" - }, - flag: "🇳🇦", - code: "NA", - dialCode: "264", - minLength: 10, - maxLength: 10, - ), - Country( - name: "Nauru", - nameTranslations: { - "sk": "Nauru", - "se": "Nauru", - "pl": "Nauru", - "no": "Nauru", - "ja": "ナウル", - "it": "Nauru", - "zh": "瑙鲁", - "nl": "Nauru", - "de": "Nauru", - "fr": "Nauru", - "es": "Nauru", - "en": "Nauru", - "pt_BR": "Nauru", - "sr-Cyrl": "Науру", - "sr-Latn": "Nauru", - "zh_TW": "諾魯", - "tr": "Nauru", - "ro": "Nauru", - "ar": "ناورو", - "fa": "نائورو", - "yue": "瑙魯" - }, - flag: "🇳🇷", - code: "NR", - dialCode: "674", - minLength: 7, - maxLength: 7, - ), - Country( - name: "Nepal", - nameTranslations: { - "sk": "Nepál", - "se": "Nepal", - "pl": "Nepal", - "no": "Nepal", - "ja": "ネパール", - "it": "Nepal", - "zh": "尼泊尔", - "nl": "Nepal", - "de": "Nepal", - "fr": "Népal", - "es": "Nepal", - "en": "Nepal", - "pt_BR": "Nepal", - "sr-Cyrl": "Непал", - "sr-Latn": "Nepal", - "zh_TW": "尼泊爾", - "tr": "Nepal", - "ro": "Nepal", - "ar": "نيبال", - "fa": "نپال", - "yue": "尼泊爾" - }, - flag: "🇳🇵", - code: "NP", - dialCode: "977", - minLength: 10, - maxLength: 10, - ), - Country( - name: "Netherlands", - nameTranslations: { - "sk": "Holandsko", - "se": "Vuolleeatnamat", - "pl": "Holandia", - "no": "Nederland", - "ja": "オランダ", - "it": "Paesi Bassi", - "zh": "荷兰", - "nl": "Nederland", - "de": "Niederlande", - "fr": "Pays-Bas", - "es": "Países Bajos", - "en": "Netherlands", - "pt_BR": "Países Baixos", - "sr-Cyrl": "Холандија", - "sr-Latn": "Holandija", - "zh_TW": "荷蘭", - "tr": "Hollanda", - "ro": "Olanda", - "ar": "هولندا", - "fa": "هلند", - "yue": "荷蘭" - }, - flag: "🇳🇱", - code: "NL", - dialCode: "31", - minLength: 9, - maxLength: 9, - ), - Country( - name: "New Caledonia", - nameTranslations: { - "sk": "Nová Kaledónia", - "se": "Ođđa-Kaledonia", - "pl": "Nowa Kaledonia", - "no": "Ny-Caledonia", - "ja": "ニューカレドニア", - "it": "Nuova Caledonia", - "zh": "新喀里多尼亚", - "nl": "Nieuw-Caledonië", - "de": "Neukaledonien", - "fr": "Nouvelle-Calédonie", - "es": "Nueva Caledonia", - "en": "New Caledonia", - "pt_BR": "Nova Caledônia", - "sr-Cyrl": "Нова Каледонија", - "sr-Latn": "Nova Kaledonija", - "zh_TW": "新喀里多尼亞", - "tr": "Yeni Kaledonya", - "ro": "Noua Caledonie", - "ar": "كاليدونيا الجديدة", - "fa": "کالدونیای جدید", - "yue": "新喀里多尼亚" - }, - flag: "🇳🇨", - code: "NC", - dialCode: "687", - minLength: 6, - maxLength: 6, - ), - Country( - name: "New Zealand", - nameTranslations: { - "sk": "Nový Zéland", - "se": "Ođđa-Selánda", - "pl": "Nowa Zelandia", - "no": "New Zealand", - "ja": "ニュージーランド", - "it": "Nuova Zelanda", - "zh": "新西兰", - "nl": "Nieuw-Zeeland", - "de": "Neuseeland", - "fr": "Nouvelle-Zélande", - "es": "Nueva Zelanda", - "en": "New Zealand", - "pt_BR": "Nova Zelândia", - "sr-Cyrl": "Нови Зеланд", - "sr-Latn": "Novi Zeland", - "zh_TW": "紐西蘭", - "tr": "Yeni Zelanda", - "ro": "Noua Zeelandă", - "ar": "نيوزيلندا", - "fa": "نیوزلند", - "yue": "紐西蘭" - }, - flag: "🇳🇿", - code: "NZ", - dialCode: "64", - minLength: 10, - maxLength: 10, - ), - Country( - name: "Nicaragua", - nameTranslations: { - "sk": "Nikaragua", - "se": "Nicaragua", - "pl": "Nikaragua", - "no": "Nicaragua", - "ja": "ニカラグア", - "it": "Nicaragua", - "zh": "尼加拉瓜", - "nl": "Nicaragua", - "de": "Nicaragua", - "fr": "Nicaragua", - "es": "Nicaragua", - "en": "Nicaragua", - "pt_BR": "Nicarágua", - "sr-Cyrl": "Никарагва", - "sr-Latn": "Nikaragva", - "zh_TW": "尼加拉瓜", - "tr": "Nikaragua", - "ro": "Nicaragua", - "ar": "نيكاراغوا", - "fa": "نیکاراگوئه", - "yue": "尼加拉瓜" - }, - flag: "🇳🇮", - code: "NI", - dialCode: "505", - minLength: 8, - maxLength: 8, - ), - Country( - name: "Niger", - nameTranslations: { - "sk": "Niger", - "se": "Niger", - "pl": "Niger", - "no": "Niger", - "ja": "ニジェール", - "it": "Niger", - "zh": "尼日尔", - "nl": "Niger", - "de": "Niger", - "fr": "Niger", - "es": "Níger", - "en": "Niger", - "pt_BR": "Níger", - "sr-Cyrl": "Нигер", - "sr-Latn": "Niger", - "zh_TW": "尼日爾", - "tr": "Nijer", - "ro": "Niger", - "ar": "النيجر", - "fa": "نیجر", - "yue": "尼日爾" - }, - flag: "🇳🇪", - code: "NE", - dialCode: "227", - minLength: 8, - maxLength: 8, - ), - Country( - name: "Nigeria", - nameTranslations: { - "sk": "Nigéria", - "se": "Nigeria", - "pl": "Nigeria", - "no": "Nigeria", - "ja": "ナイジェリア", - "it": "Nigeria", - "zh": "尼日利亚", - "nl": "Nigeria", - "de": "Nigeria", - "fr": "Nigéria", - "es": "Nigeria", - "en": "Nigeria", - "pt_BR": "Nigéria", - "sr-Cyrl": "Нигерија", - "sr-Latn": "Nigerija", - "zh_TW": "奈及利亞", - "tr": "Nijerya", - "ro": "Nigeria", - "ar": "نيجيريا", - "fa": "نیجریه", - "yue": "尼日利亞" - }, - flag: "🇳🇬", - code: "NG", - dialCode: "234", - minLength: 10, - maxLength: 11, - ), - Country( - name: "Niue", - nameTranslations: { - "sk": "Niue", - "se": "Niue", - "pl": "Niue", - "no": "Niue", - "ja": "ニウエ", - "it": "Niue", - "zh": "纽埃", - "nl": "Niue", - "de": "Niue", - "fr": "Niue", - "es": "Niue", - "en": "Niue", - "pt_BR": "Niue", - "sr-Cyrl": "Нијуе", - "sr-Latn": "Nijue", - "zh_TW": "紐埃", - "tr": "Niue", - "ro": "Niue", - "ar": "نييوي", - "fa": "نیووی", - "yue": "紐埃" - }, - flag: "🇳🇺", - code: "NU", - dialCode: "683", - minLength: 4, - maxLength: 4, - ), - Country( - name: "Norfolk Island", - nameTranslations: { - "sk": "Norfolk", - "se": "Norfolksullot", - "pl": "Norfolk", - "no": "Norfolkøya", - "ja": "ノーフォーク島", - "it": "Isola Norfolk", - "zh": "诺福克岛", - "nl": "Norfolk", - "de": "Norfolkinsel", - "fr": "Île Norfolk", - "es": "Isla Norfolk", - "en": "Norfolk Island", - "pt_BR": "Ilha Norfolk", - "sr-Cyrl": "Острво Норфок", - "sr-Latn": "Ostrvo Norfok", - "zh_TW": "諾福克島", - "tr": "Norfolk Adası", - "ro": "Insulele Norfolk", - "ar": "جزيرة نورفولك", - "fa": "جزیره نورفک", - "yue": "诺福克岛" - }, - flag: "🇳🇫", - code: "NF", - dialCode: "672", - minLength: 15, - maxLength: 15, - ), - Country( - name: "Northern Mariana Islands", - nameTranslations: { - "sk": "Severné Mariány", - "se": "Davvi-Mariánat", - "pl": "Mariany Północne", - "no": "Nord-Marianene", - "ja": "北マリアナ諸島", - "it": "Isole Marianne settentrionali", - "zh": "北马里亚纳群岛", - "nl": "Noordelijke Marianen", - "de": "Nördliche Marianen", - "fr": "Îles Mariannes du Nord", - "es": "Islas Marianas del Norte", - "en": "Northern Mariana Islands", - "pt_BR": "Ilhas Marianas do Norte", - "sr-Cyrl": "Северна Маријанска Острва", - "sr-Latn": "Severna Marijanska Ostrva", - "zh_TW": "北馬利安納群島", - "tr": "Kuzey Mariana Adaları", - "ro": "Insulelor Mariane de Nord", - "ar": "جزر ماريانا الشمالية", - "fa": "جزایر ماریانای شمالی", - "yue": "北馬里亞納群島" - }, - flag: "🇲🇵", - code: "MP", - dialCode: "1670", - minLength: 7, - maxLength: 7, - ), - Country( - name: "Norway", - nameTranslations: { - "sk": "Nórsko", - "se": "Norga", - "pl": "Norwegia", - "no": "Norge", - "ja": "ノルウェー", - "it": "Norvegia", - "zh": "挪威", - "nl": "Noorwegen", - "de": "Norwegen", - "fr": "Norvège", - "es": "Noruega", - "en": "Norway", - "pt_BR": "Noruega", - "sr-Cyrl": "Норвешка", - "sr-Latn": "Norveška", - "zh_TW": "挪威", - "tr": "Norveç", - "ro": "Norvegia", - "ar": "النرويج", - "fa": "نروژ", - "yue": "挪威" - }, - flag: "🇳🇴", - code: "NO", - dialCode: "47", - minLength: 8, - maxLength: 8, - ), - Country( - name: "Oman", - nameTranslations: { - "sk": "Omán", - "se": "Oman", - "pl": "Oman", - "no": "Oman", - "ja": "オマーン", - "it": "Oman", - "zh": "阿曼", - "nl": "Oman", - "de": "Oman", - "fr": "Oman", - "es": "Omán", - "en": "Oman", - "pt_BR": "Omã", - "sr-Cyrl": "Оман", - "sr-Latn": "Oman", - "zh_TW": "阿曼", - "tr": "Umman", - "ro": "Oman", - "ar": "عمان", - "fa": "عمان", - "yue": "阿曼" - }, - flag: "🇴🇲", - code: "OM", - dialCode: "968", - minLength: 8, - maxLength: 8, - ), - Country( - name: "Pakistan", - nameTranslations: { - "sk": "Pakistan", - "se": "Pakistan", - "pl": "Pakistan", - "no": "Pakistan", - "ja": "パキスタン", - "it": "Pakistan", - "zh": "巴基斯坦", - "nl": "Pakistan", - "de": "Pakistan", - "fr": "Pakistan", - "es": "Pakistán", - "en": "Pakistan", - "pt_BR": "Paquistão", - "sr-Cyrl": "Пакистан", - "sr-Latn": "Pakistan", - "zh_TW": "巴基斯坦", - "tr": "Pakistan", - "ro": "Pakistan", - "ar": "باكستان", - "fa": "پاکستان", - "yue": "巴基斯坦" - }, - flag: "🇵🇰", - code: "PK", - dialCode: "92", - minLength: 10, - maxLength: 10, - ), - Country( - name: "Palau", - nameTranslations: { - "sk": "Palau", - "se": "Palau", - "pl": "Palau", - "no": "Palau", - "ja": "パラオ", - "it": "Palau", - "zh": "帕劳", - "nl": "Palau", - "de": "Palau", - "fr": "Palaos", - "es": "Palaos", - "en": "Palau", - "pt_BR": "Palau", - "sr-Cyrl": "Палау", - "sr-Latn": "Palau", - "zh_TW": "帛琉", - "tr": "Palau", - "ro": "Palau", - "ar": "بالاو", - "fa": "پالائو", - "yue": "帕劳" - }, - flag: "🇵🇼", - code: "PW", - dialCode: "680", - minLength: 7, - maxLength: 7, - ), - Country( - name: "Palestinian Territory, Occupied", - nameTranslations: { - "sk": "Palestínske územia", - "se": "Palestina", - "pl": "Terytoria Palestyńskie", - "no": "Det palestinske området", - "ja": "パレスチナ自治区", - "it": "Territori palestinesi", - "zh": "巴勒斯坦领土", - "nl": "Palestijnse gebieden", - "de": "Palästinensische Autonomiegebiete", - "fr": "Territoires palestiniens", - "es": "Territorios Palestinos", - "en": "Palestinian Territories", - "pt_BR": "Territórios Palestinos", - "sr-Cyrl": "Палестина", - "sr-Latn": "Palestina", - "zh_TW": "巴勒斯坦", - "tr": "Filistin", - "ro": "Palestina", - "ar": "فلسطين", - "fa": "فلسطین", - "yue": "巴勒斯坦,国" - }, - flag: "🇵🇸", - code: "PS", - dialCode: "970", - minLength: 9, - maxLength: 9, - ), - Country( - name: "Panama", - nameTranslations: { - "sk": "Panama", - "se": "Panama", - "pl": "Panama", - "no": "Panama", - "ja": "パナマ", - "it": "Panamá", - "zh": "巴拿马", - "nl": "Panama", - "de": "Panama", - "fr": "Panama", - "es": "Panamá", - "en": "Panama", - "pt_BR": "Panamá", - "sr-Cyrl": "Панама", - "sr-Latn": "Panama", - "zh_TW": "巴拿馬", - "tr": "Panama", - "ro": "Panama", - "ar": "بنما", - "fa": "پاناما", - "yue": "巴拿馬" - }, - flag: "🇵🇦", - code: "PA", - dialCode: "507", - minLength: 8, - maxLength: 8, - ), - Country( - name: "Papua New Guinea", - nameTranslations: { - "sk": "Papua-Nová Guinea", - "se": "Papua-Ođđa-Guinea", - "pl": "Papua-Nowa Gwinea", - "no": "Papua Ny-Guinea", - "ja": "パプアニューギニア", - "it": "Papua Nuova Guinea", - "zh": "巴布亚新几内亚", - "nl": "Papoea-Nieuw-Guinea", - "de": "Papua-Neuguinea", - "fr": "Papouasie-Nouvelle-Guinée", - "es": "Papúa Nueva Guinea", - "en": "Papua New Guinea", - "pt_BR": "Papua Nova Guiné", - "sr-Cyrl": "Папуа Нова Гвинеја", - "sr-Latn": "Papua Nova Gvineja", - "zh_TW": "巴布亞新幾內亞", - "tr": "Papua Yeni Gine", - "ro": "Papua Noua Guinee", - "ar": "بابوا غينيا الجديدة", - "fa": "پاپوآ گینه نو", - "yue": "巴布亚新几内亚" - }, - flag: "🇵🇬", - code: "PG", - dialCode: "675", - minLength: 11, - maxLength: 11, - ), - Country( - name: "Paraguay", - nameTranslations: { - "sk": "Paraguaj", - "se": "Paraguay", - "pl": "Paragwaj", - "no": "Paraguay", - "ja": "パラグアイ", - "it": "Paraguay", - "zh": "巴拉圭", - "nl": "Paraguay", - "de": "Paraguay", - "fr": "Paraguay", - "es": "Paraguay", - "en": "Paraguay", - "pt_BR": "Paraguai", - "sr-Cyrl": "Парагвај", - "sr-Latn": "Paragvaj", - "zh_TW": "巴拉圭", - "tr": "Paraguay", - "ro": "Paraguay", - "ar": "باراغواي", - "fa": "پاراگوئه", - "yue": "巴拉圭" - }, - flag: "🇵🇾", - code: "PY", - dialCode: "595", - minLength: 10, - maxLength: 10, - ), - Country( - name: "Peru", - nameTranslations: { - "sk": "Peru", - "se": "Peru", - "pl": "Peru", - "no": "Peru", - "ja": "ペルー", - "it": "Perù", - "zh": "秘鲁", - "nl": "Peru", - "de": "Peru", - "fr": "Pérou", - "es": "Perú", - "en": "Peru", - "pt_BR": "Peru", - "sr-Cyrl": "Перу", - "sr-Latn": "Peru", - "zh_TW": "秘鲁", - "tr": "Peru", - "ro": "Peru", - "ar": "بيرو", - "fa": "پرو", - "yue": "秘魯" - }, - flag: "🇵🇪", - code: "PE", - dialCode: "51", - minLength: 9, - maxLength: 9, - ), - Country( - name: "Philippines", - nameTranslations: { - "sk": "Filipíny", - "se": "Filippiinnat", - "pl": "Filipiny", - "no": "Filippinene", - "ja": "フィリピン", - "it": "Filippine", - "zh": "菲律宾", - "nl": "Filipijnen", - "de": "Philippinen", - "fr": "Philippines", - "es": "Filipinas", - "en": "Philippines", - "pt_BR": "Filipinas", - "sr-Cyrl": "Филипини", - "sr-Latn": "Filipini", - "zh_TW": "菲律賓", - "tr": "Filipinler", - "ro": "Filipine", - "ar": "الفلبين", - "fa": "فیلیپین", - "yue": "菲律賓" - }, - flag: "🇵🇭", - code: "PH", - dialCode: "63", - minLength: 10, - maxLength: 10, - ), - Country( - name: "Pitcairn", - nameTranslations: { - "sk": "Pitcairnove ostrovy", - "se": "Pitcairn", - "pl": "Pitcairn", - "no": "Pitcairnøyene", - "ja": "ピトケアン諸島", - "it": "Isole Pitcairn", - "zh": "皮特凯恩群岛", - "nl": "Pitcairneilanden", - "de": "Pitcairninseln", - "fr": "Îles Pitcairn", - "es": "Islas Pitcairn", - "en": "Pitcairn Islands", - "pt_BR": "Ilhas Pitcairn", - "sr-Cyrl": "Острва Питкерн", - "sr-Latn": "Ostrva Pitkern", - "zh_TW": "皮特肯群島", - "tr": "Pitcairn Adaları", - "ro": "Insulele Pitcairn", - "ar": "جزر بيتكيرن", - "fa": "جزایر پیت‌کرن", - "yue": "皮特凱恩" - }, - flag: "🇵🇳", - code: "PN", - dialCode: "64", - minLength: 10, - maxLength: 10, - ), - Country( - name: "Poland", - nameTranslations: { - "sk": "Poľsko", - "se": "Polen", - "pl": "Polska", - "no": "Polen", - "ja": "ポーランド", - "it": "Polonia", - "zh": "波兰", - "nl": "Polen", - "de": "Polen", - "fr": "Pologne", - "es": "Polonia", - "en": "Poland", - "pt_BR": "Polônia", - "sr-Cyrl": "Пољска", - "sr-Latn": "Poljska", - "zh_TW": "波蘭", - "tr": "Polonya", - "ro": "Polonia", - "ar": "بولندا", - "fa": "لهستان", - "yue": "波蘭" - }, - flag: "🇵🇱", - code: "PL", - dialCode: "48", - minLength: 9, - maxLength: 9, - ), - Country( - name: "Portugal", - nameTranslations: { - "sk": "Portugalsko", - "se": "Portugála", - "pl": "Portugalia", - "no": "Portugal", - "ja": "ポルトガル", - "it": "Portogallo", - "zh": "葡萄牙", - "nl": "Portugal", - "de": "Portugal", - "fr": "Portugal", - "es": "Portugal", - "en": "Portugal", - "pt_BR": "Portugal", - "sr-Cyrl": "Португалија", - "sr-Latn": "Portugalija", - "zh_TW": "葡萄牙", - "tr": "Portekiz", - "ro": "Portugalia", - "ar": "البرتغال", - "fa": "پرتغال", - "yue": "葡萄牙" - }, - flag: "🇵🇹", - code: "PT", - dialCode: "351", - minLength: 9, - maxLength: 9, - ), - Country( - name: "Puerto Rico", - nameTranslations: { - "sk": "Portoriko", - "se": "Puerto Rico", - "pl": "Portoryko", - "no": "Puerto Rico", - "ja": "プエルトリコ", - "it": "Portorico", - "zh": "波多黎各", - "nl": "Puerto Rico", - "de": "Puerto Rico", - "fr": "Porto Rico", - "es": "Puerto Rico", - "en": "Puerto Rico", - "pt_BR": "Porto Rico", - "sr-Cyrl": "Порто Рико", - "sr-Latn": "Porto Riko", - "zh_TW": "波多黎各", - "tr": "Porto Riko", - "ro": "Puerto Rico", - "ar": "بورتوريكو", - "fa": "پورتوریکو", - "yue": "波多黎各" - }, - flag: "🇵🇷", - code: "PR", - dialCode: "1939", - minLength: 15, - maxLength: 15, - ), - Country( - name: "Qatar", - nameTranslations: { - "sk": "Katar", - "se": "Qatar", - "pl": "Katar", - "no": "Qatar", - "ja": "カタール", - "it": "Qatar", - "zh": "卡塔尔", - "nl": "Qatar", - "de": "Katar", - "fr": "Qatar", - "es": "Catar", - "en": "Qatar", - "pt_BR": "Catar", - "sr-Cyrl": "Катар", - "sr-Latn": "Katar", - "zh_TW": "卡達", - "tr": "Katar", - "ro": "Qatar", - "ar": "قطر", - "fa": "قطر", - "yue": "卡塔爾" - }, - flag: "🇶🇦", - code: "QA", - dialCode: "974", - minLength: 8, - maxLength: 8, - ), - Country( - name: "Romania", - nameTranslations: { - "sk": "Rumunsko", - "se": "Románia", - "pl": "Rumunia", - "no": "Romania", - "ja": "ルーマニア", - "it": "Romania", - "zh": "罗马尼亚", - "nl": "Roemenië", - "de": "Rumänien", - "fr": "Roumanie", - "es": "Rumanía", - "en": "Romania", - "pt_BR": "Romênia", - "sr-Cyrl": "Румунија", - "sr-Latn": "Rumunija", - "zh_TW": "羅馬尼亞", - "tr": "Romanya", - "ro": "România", - "ar": "رومانيا", - "fa": "رومانی", - "yue": "羅馬尼亞" - }, - flag: "🇷🇴", - code: "RO", - dialCode: "40", - minLength: 9, - maxLength: 9, - ), - Country( - name: "Russia", - nameTranslations: { - "sk": "Rusko", - "se": "Ruošša", - "pl": "Rosja", - "no": "Russland", - "ja": "ロシア", - "it": "Russia", - "zh": "俄罗斯", - "nl": "Rusland", - "de": "Russland", - "fr": "Russie", - "es": "Rusia", - "en": "Russia", - "pt_BR": "Rússia", - "sr-Cyrl": "Русија", - "sr-Latn": "Rusija", - "zh_TW": "俄羅斯", - "tr": "Rusya", - "ro": "Rusia", - "ar": "روسيا", - "fa": "روسیه", - "yue": "俄儸斯聯邦" - }, - flag: "🇷🇺", - code: "RU", - dialCode: "7", - minLength: 10, - maxLength: 10, - ), - Country( - name: "Rwanda", - nameTranslations: { - "sk": "Rwanda", - "se": "Rwanda", - "pl": "Rwanda", - "no": "Rwanda", - "ja": "ルワンダ", - "it": "Ruanda", - "zh": "卢旺达", - "nl": "Rwanda", - "de": "Ruanda", - "fr": "Rwanda", - "es": "Ruanda", - "en": "Rwanda", - "pt_BR": "Ruanda", - "sr-Cyrl": "Руанда", - "sr-Latn": "Ruanda", - "zh_TW": "盧安達", - "tr": "Ruanda", - "ro": "Rwanda", - "ar": "رواندا", - "fa": "رواندا", - "yue": "盧旺達" - }, - flag: "🇷🇼", - code: "RW", - dialCode: "250", - minLength: 9, - maxLength: 9, - ), - Country( - name: "Reunion", - nameTranslations: { - "sk": "Réunion", - "se": "Réunion", - "pl": "Reunion", - "no": "Réunion", - "ja": "レユニオン", - "it": "Riunione", - "zh": "留尼汪", - "nl": "Réunion", - "de": "Réunion", - "fr": "La Réunion", - "es": "Reunión", - "en": "Réunion", - "pt_BR": "Reunião", - "sr-Cyrl": "Реинион", - "sr-Latn": "Reinion", - "zh_TW": "留尼旺", - "tr": "La Réunion", - "ro": "La Réunion", - "ar": "لا ريونيون", - "fa": "رئونیون", - "yue": "留尼汪" - }, - flag: "🇷🇪", - code: "RE", - dialCode: "262", - minLength: 9, - maxLength: 9, - ), - Country( - name: "Saint Barthelemy", - nameTranslations: { - "sk": "Svätý Bartolomej", - "se": "Saint Barthélemy", - "pl": "Saint-Barthélemy", - "no": "Saint-Barthélemy", - "ja": "サン・バルテルミー", - "it": "Saint-Barthélemy", - "zh": "圣巴泰勒米", - "nl": "Saint-Barthélemy", - "de": "St. Barthélemy", - "fr": "Saint-Barthélemy", - "es": "San Bartolomé", - "en": "St. Barthélemy", - "pt_BR": "São Bartolomeu", - "sr-Cyrl": "Сент Бартелеми", - "sr-Latn": "Sent Bartelemi", - "zh_TW": "聖巴瑟米", - "tr": "Saint Barthélemy", - "ro": "Saint Barthélemy", - "ar": "سان بارتيلمي", - "fa": "سن بارتلمی", - "yue": "聖巴泰勒米" - }, - flag: "🇧🇱", - code: "BL", - dialCode: "590", - minLength: 9, - maxLength: 9, - ), - Country( - name: "Saint Helena, Ascension and Tristan Da Cunha", - nameTranslations: { - "sk": "Svätá Helena", - "se": "Saint Helena", - "pl": "Wyspa Świętej Heleny", - "no": "St. Helena", - "ja": "セントヘレナ", - "it": "Sant'Elena", - "zh": "圣赫勒拿", - "nl": "Sint-Helena", - "de": "St. Helena", - "fr": "Sainte-Hélène", - "es": "Santa Elena", - "en": "St. Helena", - "pt_BR": "Santa Helena", - "sr-Cyrl": "Света Јелена, Асенсион и Тристан да Куња", - "sr-Latn": "Sveta Jelena, Asension i Tristan de Kunja", - "zh_TW": "聖凱倫拿島", - "tr": "Saint Helena", - "ro": "Sfânta Elena", - "ar": "سانت هيلانة وأسينشين وتريستان دا كونا", - "fa": "سنت هلن", - "yue": "圣赫勒拿、阿森松同特里斯坦·达库尼亚" - }, - flag: "🇸🇭", - code: "SH", - dialCode: "290", - minLength: 4, - maxLength: 4, - ), - Country( - name: "Saint Kitts and Nevis", - nameTranslations: { - "sk": "Svätý Krištof a Nevis", - "se": "Saint Kitts ja Nevis", - "pl": "Saint Kitts i Nevis", - "no": "Saint Kitts og Nevis", - "ja": "セントクリストファー・ネーヴィス", - "it": "Saint Kitts e Nevis", - "zh": "圣基茨和尼维斯", - "nl": "Saint Kitts en Nevis", - "de": "St. Kitts und Nevis", - "fr": "Saint-Christophe-et-Niévès", - "es": "San Cristóbal y Nieves", - "en": "St. Kitts & Nevis", - "pt_BR": "São Cristóvão e Nevis", - "sr-Cyrl": "Сент Китс и Невис", - "sr-Latn": "Sent Kits i Nevis", - "zh_TW": "聖克里斯多福及尼維斯", - "tr": "Saint Kitts ve Nevis", - "ro": "Sfântul Kitts și Nevis", - "ar": "سانت كيتس ونيفيس", - "fa": "سنت کیتس و نویس", - "yue": "圣基茨同尼维斯" - }, - flag: "🇰🇳", - code: "KN", - dialCode: "1869", - minLength: 7, - maxLength: 7, - ), - Country( - name: "Saint Lucia", - nameTranslations: { - "sk": "Svätá Lucia", - "se": "Saint Lucia", - "pl": "Saint Lucia", - "no": "St. Lucia", - "ja": "セントルシア", - "it": "Saint Lucia", - "zh": "圣卢西亚", - "nl": "Saint Lucia", - "de": "St. Lucia", - "fr": "Sainte-Lucie", - "es": "Santa Lucía", - "en": "St. Lucia", - "pt_BR": "Santa Lúcia", - "sr-Cyrl": "Света Луција", - "sr-Latn": "Sveta Lucija", - "zh_TW": "聖露西亞", - "tr": "Saint Lucia", - "ro": "Sfânta Elena", - "ar": "سانت لوسيا", - "fa": "سنت لوسیا", - "yue": "聖盧西亞" - }, - flag: "🇱🇨", - code: "LC", - dialCode: "1758", - minLength: 7, - maxLength: 7, - ), - Country( - name: "Saint Martin", - nameTranslations: { - "sk": "Svätý Martin (fr.)", - "se": "Frankriikka Saint Martin", - "pl": "Saint-Martin", - "no": "Saint-Martin", - "ja": "サン・マルタン", - "it": "Saint Martin", - "zh": "法属圣马丁", - "nl": "Saint-Martin", - "de": "St. Martin", - "fr": "Saint-Martin", - "es": "San Martín", - "en": "St. Martin", - "pt_BR": "São Martinho", - "sr-Cyrl": "Свети Мартин", - "sr-Latn": "Sveti Martin", - "zh_TW": "聖馬丁", - "tr": "Saint Martin", - "ro": "Sfântul Martin", - "ar": "تجمع سان مارتين", - "fa": "سن مارتن", - "yue": "聖馬丁(法國部分)" - }, - flag: "🇲🇫", - code: "MF", - dialCode: "590", - minLength: 9, - maxLength: 9, - ), - Country( - name: "Saint Pierre and Miquelon", - nameTranslations: { - "sk": "Saint Pierre a Miquelon", - "se": "Saint Pierre ja Miquelon", - "pl": "Saint-Pierre i Miquelon", - "no": "Saint-Pierre-et-Miquelon", - "ja": "サンピエール島・ミクロン島", - "it": "Saint-Pierre e Miquelon", - "zh": "圣皮埃尔和密克隆群岛", - "nl": "Saint-Pierre en Miquelon", - "de": "St. Pierre und Miquelon", - "fr": "Saint-Pierre-et-Miquelon", - "es": "San Pedro y Miquelón", - "en": "St. Pierre & Miquelon", - "pt_BR": "São Pedro e Miquelon", - "sr-Cyrl": "Сен Пјер и Микелон", - "sr-Latn": "Sen Pjer i Mikelon", - "zh_TW": "聖皮埃與密克隆群島", - "tr": "Saint Pierre ve Miquelon", - "ro": "Saint Pierre și Miquelon", - "ar": "سان بيير وميكلون", - "fa": "سن-پیر و میکلون", - "yue": "聖皮埃尔同米克隆" - }, - flag: "🇵🇲", - code: "PM", - dialCode: "508", - minLength: 6, - maxLength: 6, - ), - Country( - name: "Saint Vincent and the Grenadines", - nameTranslations: { - "sk": "Svätý Vincent a Grenadíny", - "se": "Saint Vincent ja Grenadine", - "pl": "Saint Vincent i Grenadyny", - "no": "St. Vincent og Grenadinene", - "ja": "セントビンセント及びグレナディーン諸島", - "it": "Saint Vincent e Grenadine", - "zh": "圣文森特和格林纳丁斯", - "nl": "Saint Vincent en de Grenadines", - "de": "St. Vincent und die Grenadinen", - "fr": "Saint-Vincent-et-les-Grenadines", - "es": "San Vicente y las Granadinas", - "en": "St. Vincent & Grenadines", - "pt_BR": "São Vicente e Granadinas", - "sr-Cyrl": "Свети Винсент и Гренадини", - "sr-Latn": "Sveti Vinsent i Grenadini", - "zh_TW": "聖文森及格瑞那丁", - "tr": "Saint Vincent ve Grenadinler", - "ro": "Sfântul Vincențiu și Grenadinele", - "ar": "سانت فينسنت والغرينادين", - "fa": "سنت وینسنت و گرنادین‌ها", - "yue": "聖文森特同格林纳丁斯" - }, - flag: "🇻🇨", - code: "VC", - dialCode: "1784", - minLength: 7, - maxLength: 7, - ), - Country( - name: "Samoa", - nameTranslations: { - "sk": "Samoa", - "se": "Samoa", - "pl": "Samoa", - "no": "Samoa", - "ja": "サモア", - "it": "Samoa", - "zh": "萨摩亚", - "nl": "Samoa", - "de": "Samoa", - "fr": "Samoa", - "es": "Samoa", - "en": "Samoa", - "pt_BR": "Samoa", - "sr-Cyrl": "Самоа", - "sr-Latn": "Samoa", - "zh_TW": "薩摩亞", - "tr": "Samoa", - "ro": "Samoa", - "ar": "ساموا", - "fa": "ساموآ", - "yue": "薩摩亞" - }, - flag: "🇼🇸", - code: "WS", - dialCode: "685", - minLength: 7, - maxLength: 7, - ), - Country( - name: "San Marino", - nameTranslations: { - "sk": "San Maríno", - "se": "San Marino", - "pl": "San Marino", - "no": "San Marino", - "ja": "サンマリノ", - "it": "San Marino", - "zh": "圣马力诺", - "nl": "San Marino", - "de": "San Marino", - "fr": "Saint-Marin", - "es": "San Marino", - "en": "San Marino", - "pt_BR": "San Marino", - "sr-Cyrl": "Сан Марино", - "sr-Latn": "San Marino", - "zh_TW": "聖馬利諾", - "tr": "San Marino", - "ro": "San Marino", - "ar": "سان مارينو", - "fa": "سان مارینو", - "yue": "聖馬力諾" - }, - flag: "🇸🇲", - code: "SM", - dialCode: "378", - minLength: 10, - maxLength: 10, - ), - Country( - name: "Sao Tome and Principe", - nameTranslations: { - "sk": "Svätý Tomáš a Princov ostrov", - "se": "São Tomé ja Príncipe", - "pl": "Wyspy Świętego Tomasza i Książęca", - "no": "São Tomé og Príncipe", - "ja": "サントメ・プリンシペ", - "it": "São Tomé e Príncipe", - "zh": "圣多美和普林西比", - "nl": "Sao Tomé en Principe", - "de": "São Tomé und Príncipe", - "fr": "Sao Tomé-et-Principe", - "es": "Santo Tomé y Príncipe", - "en": "São Tomé & Príncipe", - "pt_BR": "São Tomé e Príncipe", - "sr-Cyrl": "Сао Томе и Принсипе", - "sr-Latn": "Sao Tome i Prinsipe", - "zh_TW": "聖多美普林西比", - "tr": "São Tomé ve Príncipe", - "ro": "Sao Tome şi Principe", - "ar": "ساو تومي وبرينسيب", - "fa": "سائوتومه و پرنسیپ", - "yue": "聖多美和普林西比" - }, - flag: "🇸🇹", - code: "ST", - dialCode: "239", - minLength: 7, - maxLength: 7, - ), - Country( - name: "Saudi Arabia", - nameTranslations: { - "sk": "Saudská Arábia", - "se": "Saudi-Arábia", - "pl": "Arabia Saudyjska", - "no": "Saudi-Arabia", - "ja": "サウジアラビア", - "it": "Arabia Saudita", - "zh": "沙特阿拉伯", - "nl": "Saoedi-Arabië", - "de": "Saudi-Arabien", - "fr": "Arabie saoudite", - "es": "Arabia Saudí", - "en": "Saudi Arabia", - "pt_BR": "Arábia Saudita", - "sr-Cyrl": "Саудијска Арабија", - "sr-Latn": "Saudijska Arabija", - "zh_TW": "沙烏地阿拉", - "tr": "Suudi Arabistan", - "ro": "Arabia Saudită", - "ar": "السعودية", - "fa": "عربستان سعودی", - "yue": "沙地阿拉伯" - }, - flag: "🇸🇦", - code: "SA", - dialCode: "966", - minLength: 9, - maxLength: 9, - ), - Country( - name: "Senegal", - nameTranslations: { - "sk": "Senegal", - "se": "Senegal", - "pl": "Senegal", - "no": "Senegal", - "ja": "セネガル", - "it": "Senegal", - "zh": "塞内加尔", - "nl": "Senegal", - "de": "Senegal", - "fr": "Sénégal", - "es": "Senegal", - "en": "Senegal", - "pt_BR": "Senegal", - "sr-Cyrl": "Сенегал", - "sr-Latn": "Senegal", - "zh_TW": "塞內加爾", - "tr": "Senegal", - "ro": "Senegal", - "ar": "السنغال", - "fa": "سنگال", - "yue": "塞內加爾" - }, - flag: "🇸🇳", - code: "SN", - dialCode: "221", - minLength: 9, - maxLength: 9, - ), - Country( - name: "Serbia", - nameTranslations: { - "sk": "Srbsko", - "se": "Serbia", - "pl": "Serbia", - "no": "Serbia", - "ja": "セルビア", - "it": "Serbia", - "zh": "塞尔维亚", - "nl": "Servië", - "de": "Serbien", - "fr": "Serbie", - "es": "Serbia", - "en": "Serbia", - "pt_BR": "Sérvia", - "sr-Cyrl": "Србија", - "sr-Latn": "Srbija", - "zh_TW": "塞爾維亞", - "tr": "Sırbistan", - "ro": "Serbia", - "ar": "صربيا", - "fa": "صربستان", - "yue": "塞爾維亞" - }, - flag: "🇷🇸", - code: "RS", - dialCode: "381", - minLength: 12, - maxLength: 12, - ), - Country( - name: "Seychelles", - nameTranslations: { - "sk": "Seychely", - "se": "Seychellsullot", - "pl": "Seszele", - "no": "Seychellene", - "ja": "セーシェル", - "it": "Seychelles", - "zh": "塞舌尔", - "nl": "Seychellen", - "de": "Seychellen", - "fr": "Seychelles", - "es": "Seychelles", - "en": "Seychelles", - "pt_BR": "Seychelles", - "sr-Cyrl": "Сејшели", - "sr-Latn": "Sejšeli", - "zh_TW": "塞席爾", - "tr": "Seyşeller", - "ro": "Seychelles", - "ar": "سيشل", - "fa": "سیشل", - "yue": "塞舌爾" - }, - flag: "🇸🇨", - code: "SC", - dialCode: "248", - minLength: 6, - maxLength: 6, - ), - Country( - name: "Sierra Leone", - nameTranslations: { - "sk": "Sierra Leone", - "se": "Sierra Leone", - "pl": "Sierra Leone", - "no": "Sierra Leone", - "ja": "シエラレオネ", - "it": "Sierra Leone", - "zh": "塞拉利昂", - "nl": "Sierra Leone", - "de": "Sierra Leone", - "fr": "Sierra Leone", - "es": "Sierra Leona", - "en": "Sierra Leone", - "pt_BR": "Serra Leoa", - "sr-Cyrl": "Сијера Леоне", - "sr-Latn": "Sijera Leone", - "zh_TW": "獅子山", - "tr": "Sierra Leone", - "ro": "Sierra Leone", - "ar": "سيراليون", - "fa": "سیرالئون", - "yue": "塞拉利昂" - }, - flag: "🇸🇱", - code: "SL", - dialCode: "232", - minLength: 8, - maxLength: 8, - ), - Country( - name: "Singapore", - nameTranslations: { - "sk": "Singapur", - "se": "Singapore", - "pl": "Singapur", - "no": "Singapore", - "ja": "シンガポール", - "it": "Singapore", - "zh": "新加坡", - "nl": "Singapore", - "de": "Singapur", - "fr": "Singapour", - "es": "Singapur", - "en": "Singapore", - "pt_BR": "Cingapura", - "sr-Cyrl": "Сингапур", - "sr-Latn": "Singapur", - "zh_TW": "新加坡", - "tr": "Singapur", - "ro": "Singapore", - "ar": "سنغافورة", - "fa": "سنگاپور", - "yue": "星架坡" - }, - flag: "🇸🇬", - code: "SG", - dialCode: "65", - minLength: 8, - maxLength: 8, - ), - Country( - name: "Slovakia", - nameTranslations: { - "sk": "Slovensko", - "se": "Slovákia", - "pl": "Słowacja", - "no": "Slovakia", - "ja": "スロバキア", - "it": "Slovacchia", - "zh": "斯洛伐克", - "nl": "Slowakije", - "de": "Slowakei", - "fr": "Slovaquie", - "es": "Eslovaquia", - "en": "Slovakia", - "pt_BR": "Eslováquia", - "sr-Cyrl": "Словачка", - "sr-Latn": "Slovačka", - "zh_TW": "斯洛伐克", - "tr": "Slovakya", - "ro": "Slovacia", - "ar": "سلوفاكيا", - "fa": "اسلواکی", - "yue": "斯洛伐克" - }, - flag: "🇸🇰", - code: "SK", - dialCode: "421", - minLength: 9, - maxLength: 9, - ), - Country( - name: "Slovenia", - nameTranslations: { - "sk": "Slovinsko", - "se": "Slovenia", - "pl": "Słowenia", - "no": "Slovenia", - "ja": "スロベニア", - "it": "Slovenia", - "zh": "斯洛文尼亚", - "nl": "Slovenië", - "de": "Slowenien", - "fr": "Slovénie", - "es": "Eslovenia", - "en": "Slovenia", - "pt_BR": "Eslovênia", - "sr-Cyrl": "Словеније", - "sr-Latn": "Slovenija", - "zh_TW": "斯洛維尼亞", - "tr": "Slovenya", - "ro": "Slovenia", - "ar": "سلوفينيا", - "fa": "اسلوونی", - "yue": "斯洛文尼亞" - }, - flag: "🇸🇮", - code: "SI", - dialCode: "386", - minLength: 8, - maxLength: 8, - ), - Country( - name: "Solomon Islands", - nameTranslations: { - "sk": "Šalamúnove ostrovy", - "se": "Salomon-sullot", - "pl": "Wyspy Salomona", - "no": "Salomonøyene", - "ja": "ソロモン諸島", - "it": "Isole Salomone", - "zh": "所罗门群岛", - "nl": "Salomonseilanden", - "de": "Salomonen", - "fr": "Îles Salomon", - "es": "Islas Salomón", - "en": "Solomon Islands", - "pt_BR": "Ilhas Salomão", - "sr-Cyrl": "Соломонска Острва", - "sr-Latn": "Solomonska Ostrva", - "zh_TW": "所羅門群島", - "tr": "Solomon Adaları", - "ro": "Insulele Solomon", - "ar": "جزر سليمان", - "fa": "جزایر سلیمان", - "yue": "所羅門群島" - }, - flag: "🇸🇧", - code: "SB", - dialCode: "677", - minLength: 5, - maxLength: 5, - ), - Country( - name: "Somalia", - nameTranslations: { - "sk": "Somálsko", - "se": "Somália", - "pl": "Somalia", - "no": "Somalia", - "ja": "ソマリア", - "it": "Somalia", - "zh": "索马里", - "nl": "Somalië", - "de": "Somalia", - "fr": "Somalie", - "es": "Somalia", - "en": "Somalia", - "pt_BR": "Somália", - "sr-Cyrl": "Сомалија", - "sr-Latn": "Somalija", - "zh_TW": "索馬利亞", - "tr": "Somali", - "ro": "Somalia", - "ar": "الصومال", - "fa": "سومالی", - "yue": "索馬里" - }, - flag: "🇸🇴", - code: "SO", - dialCode: "252", - minLength: 8, - maxLength: 8, - ), - Country( - name: "South Africa", - nameTranslations: { - "sk": "Južná Afrika", - "se": "Mátta-Afrihká", - "pl": "Republika Południowej Afryki", - "no": "Sør-Afrika", - "ja": "南アフリカ", - "it": "Sudafrica", - "zh": "南非", - "nl": "Zuid-Afrika", - "de": "Südafrika", - "fr": "Afrique du Sud", - "es": "Sudáfrica", - "en": "South Africa", - "pt_BR": "África do Sul", - "sr-Cyrl": "Јужноафричка Република", - "sr-Latn": "Južnoafrička Republika", - "zh_TW": "南非", - "tr": "Güney Afrika", - "ro": "Africa de Sud", - "ar": "جنوب أفريقيا", - "fa": "آفریقای جنوبی", - "yue": "南非" - }, - flag: "🇿🇦", - code: "ZA", - dialCode: "27", - minLength: 9, - maxLength: 9, - ), - Country( - name: "South Sudan", - nameTranslations: { - "sk": "Južný Sudán", - "se": "Máttasudan", - "pl": "Sudan Południowy", - "no": "Sør-Sudan", - "ja": "南スーダン", - "it": "Sud Sudan", - "zh": "南苏丹", - "nl": "Zuid-Soedan", - "de": "Südsudan", - "fr": "Soudan du Sud", - "es": "Sudán del Sur", - "en": "South Sudan", - "pt_BR": "Sudão do Sul", - "sr-Cyrl": "Јужни Судан", - "sr-Latn": "Južni Sudan", - "zh_TW": "南蘇丹", - "tr": "Güney Sudan", - "ro": "Sudanul de Sud", - "ar": "جنوب السودان", - "fa": "سودان جنوبی", - "yue": "南蘇丹" - }, - flag: "🇸🇸", - code: "SS", - dialCode: "211", - minLength: 9, - maxLength: 9, - ), - Country( - name: "South Georgia and the South Sandwich Islands", - nameTranslations: { - "sk": "Južná Georgia a Južné Sandwichove ostrovy", - "se": "Lulli Georgia ja Lulli Sandwich-sullot", - "pl": "Georgia Południowa i Sandwich Południowy", - "no": "Sør-Georgia og Sør-Sandwichøyene", - "ja": "サウスジョージア・サウスサンドウィッチ諸島", - "it": "Georgia del Sud e Sandwich australi", - "zh": "南乔治亚和南桑威奇群岛", - "nl": "Zuid-Georgia en Zuidelijke Sandwicheilanden", - "de": "Südgeorgien und die Südlichen Sandwichinseln", - "fr": "Géorgie du Sud et îles Sandwich du Sud", - "es": "Islas Georgia del Sur y Sandwich del Sur", - "en": "South Georgia & South Sandwich Islands", - "pt_BR": "Geórgia do Sul e Ilhas Sandwich do Sul", - "sr-Cyrl": "Јужна Џорџија и Јужна Сендвичка Острва", - "sr-Latn": "Južna Džordžija i Južna Sendvička Ostrva", - "zh_TW": "南喬治亞與南三明治群島 ", - "tr": "Güney Georgia ve Güney Sandwich Adaları", - "ro": "Georgia de Sud și Insulele Sandwich de Sud", - "ar": "جورجيا الجنوبية وجزر ساندويتش الجنوبية", - "fa": "جزایر جورجیای جنوبی و ساندویچ جنوبی", - "yue": "南喬治亞州同南桑威奇群島" - }, - flag: "🇬🇸", - code: "GS", - dialCode: "500", - minLength: 15, - maxLength: 15, - ), - Country( - name: "Spain", - nameTranslations: { - "sk": "Španielsko", - "se": "Spánia", - "pl": "Hiszpania", - "no": "Spania", - "ja": "スペイン", - "it": "Spagna", - "zh": "西班牙", - "nl": "Spanje", - "de": "Spanien", - "fr": "Espagne", - "es": "España", - "en": "Spain", - "pt_BR": "Espanha", - "sr-Cyrl": "Шпанија", - "sr-Latn": "Španija", - "zh_TW": "西班牙", - "tr": "İspanya", - "ro": "Spania", - "ar": "إسبانيا", - "fa": "اسپانیا", - "yue": "西班牙" - }, - flag: "🇪🇸", - code: "ES", - dialCode: "34", - minLength: 9, - maxLength: 9, - ), - Country( - name: "Sri Lanka", - nameTranslations: { - "sk": "Srí Lanka", - "se": "Sri Lanka", - "pl": "Sri Lanka", - "no": "Sri Lanka", - "ja": "スリランカ", - "it": "Sri Lanka", - "zh": "斯里兰卡", - "nl": "Sri Lanka", - "de": "Sri Lanka", - "fr": "Sri Lanka", - "es": "Sri Lanka", - "en": "Sri Lanka", - "pt_BR": "Sri Lanka", - "sr-Cyrl": "Шри Ланка", - "sr-Latn": "Šri Lanka", - "zh_TW": "斯里蘭卡", - "tr": "Sri Lanka", - "ro": "Sri Lanka", - "ar": "سريلانكا", - "fa": "سریلانکا", - "yue": "斯里蘭卡" - }, - flag: "🇱🇰", - code: "LK", - dialCode: "94", - minLength: 9, - maxLength: 9, - ), - Country( - name: "Sudan", - nameTranslations: { - "sk": "Sudán", - "se": "Davvisudan", - "pl": "Sudan", - "no": "Sudan", - "ja": "スーダン", - "it": "Sudan", - "zh": "苏丹", - "nl": "Soedan", - "de": "Sudan", - "fr": "Soudan", - "es": "Sudán", - "en": "Sudan", - "pt_BR": "Sudão", - "sr-Cyrl": "Судан", - "sr-Latn": "Sudan", - "zh_TW": "蘇丹", - "tr": "Sudan", - "ro": "Sudan", - "ar": "السودان", - "fa": "سودان", - "yue": "蘇丹" - }, - flag: "🇸🇩", - code: "SD", - dialCode: "249", - minLength: 9, - maxLength: 9, - ), - Country( - name: "Suriname", - nameTranslations: { - "sk": "Surinam", - "se": "Surinam", - "pl": "Surinam", - "no": "Surinam", - "ja": "スリナム", - "it": "Suriname", - "zh": "苏里南", - "nl": "Suriname", - "de": "Suriname", - "fr": "Suriname", - "es": "Surinam", - "en": "Suriname", - "pt_BR": "Suriname", - "sr-Cyrl": "Суринам", - "sr-Latn": "Surinam", - "zh_TW": "蘇利南", - "tr": "Surinam", - "ro": "Surinam", - "ar": "سورينام", - "fa": "سورینام", - "yue": "蘇里南" - }, - flag: "🇸🇷", - code: "SR", - dialCode: "597", - minLength: 7, - maxLength: 7, - ), - Country( - name: "Svalbard and Jan Mayen", - nameTranslations: { - "sk": "Svalbard a Jan Mayen", - "se": "Svalbárda ja Jan Mayen", - "pl": "Svalbard i Jan Mayen", - "no": "Svalbard og Jan Mayen", - "ja": "スバールバル諸島・ヤンマイエン島", - "it": "Svalbard e Jan Mayen", - "zh": "斯瓦尔巴和扬马延", - "nl": "Spitsbergen en Jan Mayen", - "de": "Spitzbergen und Jan Mayen", - "fr": "Svalbard et Jan Mayen", - "es": "Svalbard y Jan Mayen", - "en": "Svalbard & Jan Mayen", - "pt_BR": "Svalbard e Jan Mayen", - "sr-Cyrl": "Свалбард", - "sr-Latn": "Svalbard", - "zh_TW": "斯瓦巴及尖棉", - "tr": "Svalbard ve Jan Mayen", - "ro": "Svalbard și Jan Mayen", - "ar": "سفالبارد ويان ماين", - "fa": "سوالبارد و یان ماین", - "yue": "斯瓦尔巴德同扬·马延" - }, - flag: "🇸🇯", - code: "SJ", - dialCode: "47", - minLength: 8, - maxLength: 8, - ), - Country( - name: "Eswatini", - nameTranslations: { - "sk": "Eswatini", - "se": "Svazieana", - "pl": "Eswatini", - "no": "Eswatini", - "ja": "エスワティニ", - "it": "Swaziland", - "zh": "斯威士兰", - "nl": "eSwatini", - "de": "Eswatini", - "fr": "Eswatini", - "es": "Esuatini", - "en": "Eswatini", - "pt_BR": "Eswatini", - "sr-Cyrl": "Свазиланд", - "sr-Latn": "Svaziland", - "zh_TW": "史瓦帝尼", - "tr": "Esvatini", - "ro": "Eswatini", - "ar": "إسواتيني", - "fa": "اسواتینی", - "yue": "斯威士蘭" - }, - flag: "🇸🇿", - code: "SZ", - dialCode: "268", - minLength: 8, - maxLength: 8, - ), - Country( - name: "Sweden", - nameTranslations: { - "sk": "Švédsko", - "se": "Ruoŧŧa", - "pl": "Szwecja", - "no": "Sverige", - "ja": "スウェーデン", - "it": "Svezia", - "zh": "瑞典", - "nl": "Zweden", - "de": "Schweden", - "fr": "Suède", - "es": "Suecia", - "en": "Sweden", - "pt_BR": "Suécia", - "sr-Cyrl": "Шведска", - "sr-Latn": "Švedska", - "zh_TW": "瑞典", - "tr": "İsveç", - "ro": "Suedia", - "ar": "السويد", - "fa": "سوئد", - "yue": "瑞典" - }, - flag: "🇸🇪", - code: "SE", - dialCode: "46", - minLength: 7, - maxLength: 13, - ), - Country( - name: "Switzerland", - nameTranslations: { - "sk": "Švajčiarsko", - "se": "Šveica", - "pl": "Szwajcaria", - "no": "Sveits", - "ja": "スイス", - "it": "Svizzera", - "zh": "瑞士", - "nl": "Zwitserland", - "de": "Schweiz", - "fr": "Suisse", - "es": "Suiza", - "en": "Switzerland", - "pt_BR": "Suíça", - "sr-Cyrl": "Швајцарска", - "sr-Latn": "Švajcarska", - "zh_TW": "瑞士", - "tr": "İsviçre", - "ro": "Elveţia", - "ar": "سويسرا", - "fa": "سوئیس", - "yue": "瑞士" - }, - flag: "🇨🇭", - code: "CH", - dialCode: "41", - minLength: 9, - maxLength: 12, - ), - Country( - name: "Syrian Arab Republic", - nameTranslations: { - "sk": "Sýria", - "se": "Syria", - "pl": "Syria", - "no": "Syria", - "ja": "シリア", - "it": "Siria", - "zh": "叙利亚", - "nl": "Syrië", - "de": "Syrien", - "fr": "Syrie", - "es": "Siria", - "en": "Syria", - "pt_BR": "Síria", - "sr-Cyrl": "Сирија", - "sr-Latn": "Sirija", - "zh_TW": "敘利亞", - "tr": "Suriye", - "ro": "Siria", - "ar": "سوريا", - "fa": "سوریه", - "yue": "阿拉伯敘利亞共和國" - }, - flag: "🇸🇾", - code: "SY", - dialCode: "963", - minLength: 9, - maxLength: 10, - ), - Country( - name: "Taiwan", - nameTranslations: { - "sk": "Taiwan", - "se": "Taiwan", - "pl": "Tajwan", - "no": "Taiwan", - "ja": "台湾", - "it": "Taiwan", - "zh": "台湾", - "nl": "Taiwan", - "de": "Taiwan", - "fr": "Taïwan", - "es": "Taiwán", - "en": "Taiwan", - "pt_BR": "Taiwan", - "sr-Cyrl": "Тајван", - "sr-Latn": "Tajvan", - "zh_TW": "台灣", - "tr": "Tayvan", - "ro": "Taiwan", - "ar": "تايوان", - "fa": "تایوان", - "yue": "台灣" - }, - flag: "🇹🇼", - code: "TW", - dialCode: "886", - minLength: 9, - maxLength: 9, - ), - Country( - name: "Tajikistan", - nameTranslations: { - "sk": "Tadžikistan", - "se": "Tažikistan", - "pl": "Tadżykistan", - "no": "Tadsjikistan", - "ja": "タジキスタン", - "it": "Tagikistan", - "zh": "塔吉克斯坦", - "nl": "Tadzjikistan", - "de": "Tadschikistan", - "fr": "Tadjikistan", - "es": "Tayikistán", - "en": "Tajikistan", - "pt_BR": "Tajiquistão", - "sr-Cyrl": "Таџикистан", - "sr-Latn": "Tadžikistan", - "zh_TW": "塔吉克", - "tr": "Tacikistan", - "ro": "Tadiquistão", - "ar": "طاجيكستان", - "fa": "تاجیکستان", - "yue": "塔吉克斯坦" - }, - flag: "🇹🇯", - code: "TJ", - dialCode: "992", - minLength: 9, - maxLength: 9, - ), - Country( - name: "Tanzania, United Republic of Tanzania", - nameTranslations: { - "sk": "Tanzánia", - "se": "Tanzánia", - "pl": "Tanzania", - "no": "Tanzania", - "ja": "タンザニア", - "it": "Tanzania", - "zh": "坦桑尼亚", - "nl": "Tanzania", - "de": "Tansania", - "fr": "Tanzanie", - "es": "Tanzania", - "en": "Tanzania", - "pt_BR": "Tanzânia", - "sr-Cyrl": "Танзанија", - "sr-Latn": "Tanzanija", - "zh_TW": "坦尚尼亞", - "tr": "Tanzanya", - "ro": "Tanzania", - "ar": "تنزانيا", - "fa": "تانزانیا", - "yue": "坦桑尼亞,聯合共和國" - }, - flag: "🇹🇿", - code: "TZ", - dialCode: "255", - minLength: 9, - maxLength: 9, - ), - Country( - name: "Thailand", - nameTranslations: { - "sk": "Thajsko", - "se": "Thaieana", - "pl": "Tajlandia", - "no": "Thailand", - "ja": "タイ", - "it": "Thailandia", - "zh": "泰国", - "nl": "Thailand", - "de": "Thailand", - "fr": "Thaïlande", - "es": "Tailandia", - "en": "Thailand", - "pt_BR": "Tailândia", - "sr-Cyrl": "Тајланд", - "sr-Latn": "Tajland", - "zh_TW": "泰國", - "tr": "Tayland", - "ro": "Tailanda", - "ar": "تايلاند", - "fa": "تایلند", - "yue": "泰國" - }, - flag: "🇹🇭", - code: "TH", - dialCode: "66", - minLength: 9, - maxLength: 9, - ), - Country( - name: "Timor-Leste", - nameTranslations: { - "sk": "Východný Timor", - "se": "Nuorta-Timor", - "pl": "Timor Wschodni", - "no": "Øst-Timor", - "ja": "東ティモール", - "it": "Timor Est", - "zh": "东帝汶", - "nl": "Oost-Timor", - "de": "Timor-Leste", - "fr": "Timor oriental", - "es": "Timor-Leste", - "en": "Timor-Leste", - "pt_BR": "Timor-Leste", - "sr-Cyrl": "Источни Тимор", - "sr-Latn": "Istočni Timor", - "zh_TW": "東帝汶", - "tr": "Doğu Timor", - "ro": "Timorul de Est", - "ar": "تيمور الشرقية", - "fa": "تیمور شرقی", - "yue": "東帝汶" - }, - flag: "🇹🇱", - code: "TL", - dialCode: "670", - minLength: 7, - maxLength: 7, - ), - Country( - name: "Togo", - nameTranslations: { - "sk": "Togo", - "se": "Togo", - "pl": "Togo", - "no": "Togo", - "ja": "トーゴ", - "it": "Togo", - "zh": "多哥", - "nl": "Togo", - "de": "Togo", - "fr": "Togo", - "es": "Togo", - "en": "Togo", - "pt_BR": "Ir", - "sr-Cyrl": "Того", - "sr-Latn": "Togo", - "zh_TW": "多哥", - "tr": "Togo", - "ro": "Togo", - "ar": "توغو", - "fa": "توگو", - "yue": "多哥" - }, - flag: "🇹🇬", - code: "TG", - dialCode: "228", - minLength: 8, - maxLength: 8, - ), - Country( - name: "Tokelau", - nameTranslations: { - "sk": "Tokelau", - "se": "Tokelau", - "pl": "Tokelau", - "no": "Tokelau", - "ja": "トケラウ", - "it": "Tokelau", - "zh": "托克劳", - "nl": "Tokelau", - "de": "Tokelau", - "fr": "Tokelau", - "es": "Tokelau", - "en": "Tokelau", - "pt_BR": "Tokelau", - "sr-Cyrl": "Токелау", - "sr-Latn": "Tokelau", - "zh_TW": "托克勞", - "tr": "Tokelau", - "ro": "Tokelau", - "ar": "توكيلاو", - "fa": "توکلائو", - "yue": "托克劳" - }, - flag: "🇹🇰", - code: "TK", - dialCode: "690", - minLength: 4, - maxLength: 4, - ), - Country( - name: "Tonga", - nameTranslations: { - "sk": "Tonga", - "se": "Tonga", - "pl": "Tonga", - "no": "Tonga", - "ja": "トンガ", - "it": "Tonga", - "zh": "汤加", - "nl": "Tonga", - "de": "Tonga", - "fr": "Tonga", - "es": "Tonga", - "en": "Tonga", - "pt_BR": "Tonga", - "sr-Cyrl": "Тонга", - "sr-Latn": "Tonga", - "zh_TW": "東加", - "tr": "Tonga", - "ro": "Tonga", - "ar": "تونغا", - "fa": "تونگا", - "yue": "湯加" - }, - flag: "🇹🇴", - code: "TO", - dialCode: "676", - minLength: 7, - maxLength: 7, - ), - Country( - name: "Trinidad and Tobago", - nameTranslations: { - "sk": "Trinidad a Tobago", - "se": "Trinidad ja Tobago", - "pl": "Trynidad i Tobago", - "no": "Trinidad og Tobago", - "ja": "トリニダード・トバゴ", - "it": "Trinidad e Tobago", - "zh": "特立尼达和多巴哥", - "nl": "Trinidad en Tobago", - "de": "Trinidad und Tobago", - "fr": "Trinité-et-Tobago", - "es": "Trinidad y Tobago", - "en": "Trinidad & Tobago", - "pt_BR": "Trinidad e Tobago", - "sr-Cyrl": "Тринидад и Тобаго", - "sr-Latn": "Trinidad i Tobago", - "zh_TW": "千里達及托巴哥", - "tr": "Trinidad ve Tobago", - "ro": "Trinidad şi Tobago", - "ar": "ترينيداد وتوباغو", - "fa": "ترینیداد و توباگو", - "yue": "特立尼達和多巴哥" - }, - flag: "🇹🇹", - code: "TT", - dialCode: "1868", - minLength: 7, - maxLength: 7, - ), - Country( - name: "Tunisia", - nameTranslations: { - "sk": "Tunisko", - "se": "Tunisia", - "pl": "Tunezja", - "no": "Tunisia", - "ja": "チュニジア", - "it": "Tunisia", - "zh": "突尼斯", - "nl": "Tunesië", - "de": "Tunesien", - "fr": "Tunisie", - "es": "Túnez", - "en": "Tunisia", - "pt_BR": "Tunísia", - "sr-Cyrl": "Тунис", - "sr-Latn": "Tunis", - "zh_TW": "突尼西亞", - "tr": "Tunus", - "ro": "Tunisia", - "ar": "تونس", - "fa": "تونس", - "yue": "突尼斯" - }, - flag: "🇹🇳", - code: "TN", - dialCode: "216", - minLength: 8, - maxLength: 8, - ), - Country( - name: "Turkey", - nameTranslations: { - "sk": "Turecko", - "se": "Durka", - "pl": "Turcja", - "no": "Tyrkia", - "ja": "トルコ", - "it": "Turchia", - "zh": "土耳其", - "nl": "Turkije", - "de": "Türkei", - "fr": "Turquie", - "es": "Turquía", - "en": "Turkey", - "pt_BR": "Peru", - "sr-Cyrl": "Турска", - "sr-Latn": "Turska", - "zh_TW": "土耳其", - "tr": "Türkiye", - "ro": "Turcia", - "ar": "تركيا", - "fa": "ترکیه", - "yue": "土耳其" - }, - flag: "🇹🇷", - code: "TR", - dialCode: "90", - minLength: 10, - maxLength: 10, - ), - Country( - name: "Turkmenistan", - nameTranslations: { - "sk": "Turkménsko", - "se": "Turkmenistan", - "pl": "Turkmenistan", - "no": "Turkmenistan", - "ja": "トルクメニスタン", - "it": "Turkmenistan", - "zh": "土库曼斯坦", - "nl": "Turkmenistan", - "de": "Turkmenistan", - "fr": "Turkménistan", - "es": "Turkmenistán", - "en": "Turkmenistan", - "pt_BR": "Turcomenistão", - "sr-Cyrl": "Туркменистан", - "sr-Latn": "Turkmenistan", - "zh_TW": "土庫曼", - "tr": "Türkmenistan", - "ro": "Turkmenistan", - "ar": "تركمانستان", - "fa": "ترکمنستان", - "yue": "土庫曼斯坦" - }, - flag: "🇹🇲", - code: "TM", - dialCode: "993", - minLength: 8, - maxLength: 8, - ), - Country( - name: "Turks and Caicos Islands", - nameTranslations: { - "sk": "Turks a Caicos", - "se": "Turks ja Caicos-sullot", - "pl": "Turks i Caicos", - "no": "Turks- og Caicosøyene", - "ja": "タークス・カイコス諸島", - "it": "Isole Turks e Caicos", - "zh": "特克斯和凯科斯群岛", - "nl": "Turks- en Caicoseilanden", - "de": "Turks- und Caicosinseln", - "fr": "Îles Turques-et-Caïques", - "es": "Islas Turcas y Caicos", - "en": "Turks & Caicos Islands", - "pt_BR": "Ilhas Turks e Caicos", - "sr-Cyrl": "Туркс и Кајкос", - "sr-Latn": "Turks i Kajkos", - "zh_TW": "土克斯及開科斯群島", - "tr": "Turks ve Caicos Adaları", - "ro": "Insulele Turks și Caicos", - "ar": "جزر توركس وكايكوس", - "fa": "جزایر تورکس و کایکوس", - "yue": "特克斯同凯科斯群岛" - }, - flag: "🇹🇨", - code: "TC", - dialCode: "1649", - minLength: 7, - maxLength: 7, - ), - Country( - name: "Tuvalu", - nameTranslations: { - "sk": "Tuvalu", - "se": "Tuvalu", - "pl": "Tuvalu", - "no": "Tuvalu", - "ja": "ツバル", - "it": "Tuvalu", - "zh": "图瓦卢", - "nl": "Tuvalu", - "de": "Tuvalu", - "fr": "Tuvalu", - "es": "Tuvalu", - "en": "Tuvalu", - "pt_BR": "Tuvalu", - "sr-Cyrl": "Тувалу", - "sr-Latn": "Tuvalu", - "zh_TW": "圖瓦盧", - "tr": "Tuvalu", - "ro": "Tuvalu", - "ar": "توفالو", - "fa": "تووالو", - "yue": "圖瓦盧" - }, - flag: "🇹🇻", - code: "TV", - dialCode: "688", - minLength: 6, - maxLength: 6, - ), - Country( - name: "Uganda", - nameTranslations: { - "sk": "Uganda", - "se": "Uganda", - "pl": "Uganda", - "no": "Uganda", - "ja": "ウガンダ", - "it": "Uganda", - "zh": "乌干达", - "nl": "Oeganda", - "de": "Uganda", - "fr": "Ouganda", - "es": "Uganda", - "en": "Uganda", - "pt_BR": "Uganda", - "sr-Cyrl": "Уганда", - "sr-Latn": "Uganda", - "zh_TW": "烏干達", - "tr": "Uganda", - "ro": "Uganda", - "ar": "أوغندا", - "fa": "اوگاندا", - "yue": "烏干達" - }, - flag: "🇺🇬", - code: "UG", - dialCode: "256", - minLength: 9, - maxLength: 9, - ), - Country( - name: "Ukraine", - nameTranslations: { - "sk": "Ukrajina", - "se": "Ukraina", - "pl": "Ukraina", - "no": "Ukraina", - "ja": "ウクライナ", - "it": "Ucraina", - "zh": "乌克兰", - "nl": "Oekraïne", - "de": "Ukraine", - "fr": "Ukraine", - "es": "Ucrania", - "en": "Ukraine", - "pt_BR": "Ucrânia", - "sr-Cyrl": "Украјина", - "sr-Latn": "Ukrajina", - "zh_TW": "烏克蘭", - "tr": "Ukrayna", - "ro": "Ucraína", - "ar": "أوكرانيا", - "fa": "اوکراین", - "yue": "烏克蘭" - }, - flag: "🇺🇦", - code: "UA", - dialCode: "380", - minLength: 9, - maxLength: 9, - ), - Country( - name: "United Arab Emirates", - nameTranslations: { - "sk": "Spojené arabské emiráty", - "se": "Ovttastuvvan Arábaemiráhtat", - "pl": "Zjednoczone Emiraty Arabskie", - "no": "De forente arabiske emirater", - "ja": "アラブ首長国連邦", - "it": "Emirati Arabi Uniti", - "zh": "阿拉伯联合酋长国", - "nl": "Verenigde Arabische Emiraten", - "de": "Vereinigte Arabische Emirate", - "fr": "Émirats arabes unis", - "es": "Emiratos Árabes Unidos", - "en": "United Arab Emirates", - "pt_BR": "Emirados Árabes Unidos", - "sr-Cyrl": "Уједињени Арапски Емирати", - "sr-Latn": "Ujedinjeni Arapski Emirati", - "zh_TW": "阿拉伯聯合大公國", - "tr": "Birleşik Arap Emirlikleri", - "ro": "Emiratele Arabe Unite", - "ar": "الإمارات العربية المتحدة", - "fa": "امارات متحده عربی", - "yue": "阿拉伯聯合酋長國" - }, - flag: "🇦🇪", - code: "AE", - dialCode: "971", - minLength: 9, - maxLength: 9, - ), - Country( - name: "United Kingdom", - nameTranslations: { - "sk": "Spojené kráľovstvo", - "se": "Stuorra-Británnia", - "pl": "Wielka Brytania", - "no": "Storbritannia", - "ja": "イギリス", - "it": "Regno Unito", - "zh": "英国", - "nl": "Verenigd Koninkrijk", - "de": "Vereinigtes Königreich", - "fr": "Royaume-Uni", - "es": "Reino Unido", - "en": "United Kingdom", - "pt_BR": "Reino Unido", - "sr-Cyrl": "Уједињено Краљевство", - "sr-Latn": "Ujedinjeno Kraljevstvo", - "zh_TW": "英國", - "tr": "Büyük Britanya ve Kuzey İrlanda Birleşik Krallığ", - "ro": "Regatul Unit al Marii Britanii și Irlandei de Nord", - "ar": "المملكة المتحدة", - "fa": "بریتانیا", - "yue": "大不列顛及北愛爾蘭聯合王國" - }, - flag: "🇬🇧", - code: "GB", - dialCode: "44", - minLength: 10, - maxLength: 10, - ), - Country( - name: "United States", - nameTranslations: { - "sk": "Spojené štáty", - "se": "Amerihká ovttastuvvan stáhtat", - "pl": "Stany Zjednoczone", - "no": "USA", - "ja": "アメリカ合衆国", - "it": "Stati Uniti", - "zh": "美国", - "nl": "Verenigde Staten", - "de": "Vereinigte Staaten", - "fr": "États-Unis", - "es": "Estados Unidos", - "en": "United States", - "pt_BR": "Estados Unidos", - "sr-Cyrl": "Сједињене Америчке Државе", - "sr-Latn": "Sjedinjene Američke Države", - "zh_TW": "美國", - "tr": "Amerika Birleşik Devletleri", - "ro": "Statele Unite ale Americii", - "ar": "الولايات المتحدة", - "fa": "ایالات متحده آمریکا", - "yue": "美利堅郃眾囯" - }, - flag: "🇺🇸", - code: "US", - dialCode: "1", - minLength: 10, - maxLength: 10, - ), - Country( - name: "Uruguay", - nameTranslations: { - "sk": "Uruguaj", - "se": "Uruguay", - "pl": "Urugwaj", - "no": "Uruguay", - "ja": "ウルグアイ", - "it": "Uruguay", - "zh": "乌拉圭", - "nl": "Uruguay", - "de": "Uruguay", - "fr": "Uruguay", - "es": "Uruguay", - "en": "Uruguay", - "pt_BR": "Uruguai", - "sr-Cyrl": "Уругвај", - "sr-Latn": "Urugvaj", - "zh_TW": "烏拉圭", - "tr": "Uruguay", - "ro": "Uruguay", - "ar": "الأوروغواي", - "fa": "اروگوئه", - "yue": "烏拉圭" - }, - flag: "🇺🇾", - code: "UY", - dialCode: "598", - minLength: 9, - maxLength: 9, - ), - Country( - name: "Uzbekistan", - nameTranslations: { - "sk": "Uzbekistan", - "se": "Usbekistan", - "pl": "Uzbekistan", - "no": "Usbekistan", - "ja": "ウズベキスタン", - "it": "Uzbekistan", - "zh": "乌兹别克斯坦", - "nl": "Oezbekistan", - "de": "Usbekistan", - "fr": "Ouzbékistan", - "es": "Uzbekistán", - "en": "Uzbekistan", - "pt_BR": "Uzbequistão", - "sr-Cyrl": "Узбекистан", - "sr-Latn": "Uzbekistan", - "zh_TW": "烏玆別克", - "tr": "Özbekistan", - "ro": "Uzbekistan", - "ar": "أوزبكستان", - "fa": "ازبکستان", - "yue": "月即別" - }, - flag: "🇺🇿", - code: "UZ", - dialCode: "998", - minLength: 9, - maxLength: 9, - ), - Country( - name: "Vanuatu", - nameTranslations: { - "sk": "Vanuatu", - "se": "Vanuatu", - "pl": "Vanuatu", - "no": "Vanuatu", - "ja": "バヌアツ", - "it": "Vanuatu", - "zh": "瓦努阿图", - "nl": "Vanuatu", - "de": "Vanuatu", - "fr": "Vanuatu", - "es": "Vanuatu", - "en": "Vanuatu", - "pt_BR": "Vanuatu", - "sr-Cyrl": "Вануату", - "sr-Latn": "Vanuatu", - "zh_TW": "瓦努阿圖", - "tr": "Vanuatu", - "ro": "Vanuatu", - "ar": "فانواتو", - "fa": "وانواتو", - "yue": "瓦努阿圖" - }, - flag: "🇻🇺", - code: "VU", - dialCode: "678", - minLength: 7, - maxLength: 7, - ), - Country( - name: "Venezuela, Bolivarian Republic of Venezuela", - nameTranslations: { - "sk": "Venezuela", - "se": "Venezuela", - "pl": "Wenezuela", - "no": "Venezuela", - "ja": "ベネズエラ", - "it": "Venezuela", - "zh": "委内瑞拉", - "nl": "Venezuela", - "de": "Venezuela", - "fr": "Venezuela", - "es": "Venezuela", - "en": "Venezuela", - "pt_BR": "Venezuela", - "sr-Cyrl": "Венецуела", - "sr-Latn": "Venecuela", - "zh_TW": "委內瑞拉", - "tr": "Venezuela", - "ro": "Venezuela", - "ar": "فنزويلا", - "fa": "ونزوئلا", - "yue": "委內瑞拉(玻利瓦爾共和國)" - }, - flag: "🇻🇪", - code: "VE", - dialCode: "58", - minLength: 10, - maxLength: 10, - ), - Country( - name: "Vietnam", - nameTranslations: { - "sk": "Vietnam", - "se": "Vietnam", - "pl": "Wietnam", - "no": "Vietnam", - "ja": "ベトナム", - "it": "Vietnam", - "zh": "越南", - "nl": "Vietnam", - "de": "Vietnam", - "fr": "Vietnam", - "es": "Vietnam", - "en": "Vietnam", - "pt_BR": "Vietnã", - "sr-Cyrl": "Вијетнам", - "sr-Latn": "Vijetnam", - "zh_TW": "越南", - "tr": "Vietnam", - "ro": "Vietnam", - "ar": "فيتنام", - "fa": "ویتنام", - "yue": "越南" - }, - flag: "🇻🇳", - code: "VN", - dialCode: "84", - minLength: 11, - maxLength: 11, - ), - Country( - name: "Virgin Islands, British", - nameTranslations: { - "sk": "Britské Panenské ostrovy", - "se": "Brittania Virgin-sullot", - "pl": "Brytyjskie Wyspy Dziewicze", - "no": "De britiske jomfruøyene", - "ja": "英領ヴァージン諸島", - "it": "Isole Vergini Britanniche", - "zh": "英属维尔京群岛", - "nl": "Britse Maagdeneilanden", - "de": "Britische Jungferninseln", - "fr": "Îles Vierges britanniques", - "es": "Islas Vírgenes Británicas", - "en": "British Virgin Islands", - "pt_BR": "Ilhas Virgens Britânicas", - "sr-Cyrl": "Британска Девичанска Острва", - "sr-Latn": "Britanska Devičanska Ostrva", - "zh_TW": "英屬維京群島", - "tr": "Britanya Virjin Adaları", - "ro": "Insulele Virgine Britanice", - "ar": "جزر العذراء البريطانية", - "fa": "جزایر ویرجین بریتانیا", - "yue": "維爾京群島(英國)" - }, - flag: "🇻🇬", - code: "VG", - dialCode: "1284", - minLength: 7, - maxLength: 7, - ), - Country( - name: "Virgin Islands, U.S.", - nameTranslations: { - "sk": "Americké Panenské ostrovy", - "se": "AOS Virgin-sullot", - "pl": "Wyspy Dziewicze Stanów Zjednoczonych", - "no": "De amerikanske jomfruøyene", - "ja": "米領ヴァージン諸島", - "it": "Isole Vergini Americane", - "zh": "美属维尔京群岛", - "nl": "Amerikaanse Maagdeneilanden", - "de": "Amerikanische Jungferninseln", - "fr": "Îles Vierges des États-Unis", - "es": "Islas Vírgenes de EE. UU.", - "en": "U.S. Virgin Islands", - "pt_BR": "Ilhas Virgens Americanas", - "sr-Cyrl": "Амепичка Девичанска Острва", - "sr-Latn": "Američka Devičanska Ostrva", - "zh_TW": "美屬維京群島", - "tr": "Amerika Birleşik Devletleri Virjin Adaları", - "ro": "Insulele Virgine Americane", - "ar": "جزر العذراء الأمريكية", - "fa": "جزایر ویرجین ایالات متحده آمریکا", - "yue": "維爾京群島(美國)" - }, - flag: "🇻🇮", - code: "VI", - dialCode: "1340", - minLength: 7, - maxLength: 7, - ), - Country( - name: "Wallis and Futuna", - nameTranslations: { - "sk": "Wallis a Futuna", - "se": "Wallis ja Futuna", - "pl": "Wallis i Futuna", - "no": "Wallis og Futuna", - "ja": "ウォリス・フツナ", - "it": "Wallis e Futuna", - "zh": "瓦利斯和富图纳", - "nl": "Wallis en Futuna", - "de": "Wallis und Futuna", - "fr": "Wallis-et-Futuna", - "es": "Wallis y Futuna", - "en": "Wallis & Futuna", - "pt_BR": "Wallis e Futuna", - "sr-Cyrl": "Валис и Футуна", - "sr-Latn": "Valis i Futuna", - "zh_TW": "瓦利斯和富圖那", - "tr": "Wallis ve Futuna", - "ro": "Wallis și Futuna", - "ar": "والس وفوتونا", - "fa": "والیس و فوتونا", - "yue": "瓦利斯同富图纳" - }, - flag: "🇼🇫", - code: "WF", - dialCode: "681", - minLength: 6, - maxLength: 6, - ), - Country( - name: "Yemen", - nameTranslations: { - "sk": "Jemen", - "se": "Jemen", - "pl": "Jemen", - "no": "Jemen", - "ja": "イエメン", - "it": "Yemen", - "zh": "也门", - "nl": "Jemen", - "de": "Jemen", - "fr": "Yémen", - "es": "Yemen", - "en": "Yemen", - "pt_BR": "Iémen", - "sr-Cyrl": "Јемен", - "sr-Latn": "Jemen", - "zh_TW": "葉門", - "tr": "Yemen", - "ro": "Yemen", - "ar": "اليمن", - "fa": "یمن", - "yue": "也門" - }, - flag: "🇾🇪", - code: "YE", - dialCode: "967", - minLength: 9, - maxLength: 9, - ), - Country( - name: "Zambia", - nameTranslations: { - "sk": "Zambia", - "se": "Zambia", - "pl": "Zambia", - "no": "Zambia", - "ja": "ザンビア", - "it": "Zambia", - "zh": "赞比亚", - "nl": "Zambia", - "de": "Sambia", - "fr": "Zambie", - "es": "Zambia", - "en": "Zambia", - "pt_BR": "Zâmbia", - "sr-Cyrl": "Замбија", - "sr-Latn": "Zambija", - "zh_TW": "贊比亞", - "tr": "Zambiya", - "ro": "Zambia", - "ar": "زامبيا", - "fa": "زامبیا", - "yue": "贊比亞" - }, - flag: "🇿🇲", - code: "ZM", - dialCode: "260", - minLength: 9, - maxLength: 9, - ), - Country( - name: "Zimbabwe", - nameTranslations: { - "sk": "Zimbabwe", - "se": "Zimbabwe", - "pl": "Zimbabwe", - "no": "Zimbabwe", - "ja": "ジンバブエ", - "it": "Zimbabwe", - "zh": "津巴布韦", - "nl": "Zimbabwe", - "de": "Simbabwe", - "fr": "Zimbabwe", - "es": "Zimbabue", - "en": "Zimbabwe", - "pt_BR": "Zimbábue", - "sr-Cyrl": "Зимбабве", - "sr-Latn": "Zimbabve", - "zh_TW": "辛巴威", - "tr": "Zimbabve", - "ro": "Zimbabwe", - "ar": "زيمبابوي", - "fa": "زیمبابوه", - "yue": "津巴布韋" - }, - flag: "🇿🇼", - code: "ZW", - dialCode: "263", - minLength: 9, - maxLength: 9) -]; - -class Country { - final String name; - final Map nameTranslations; - final String flag; - final String code; - final String dialCode; - final String regionCode; - final int minLength; - final int maxLength; - - const Country({ - required this.name, - required this.flag, - required this.code, - required this.dialCode, - required this.nameTranslations, - required this.minLength, - required this.maxLength, - this.regionCode = "", - }); - - String get fullCountryCode { - return dialCode + regionCode; - } - - String get displayCC { - if (regionCode != "") { - return "$dialCode $regionCode"; - } - return dialCode; - } - - String localizedName(String languageCode) { - return nameTranslations[languageCode] ?? name; - } -} diff --git a/apps/rider-archive-cubit/lib/core/ui/phone_intel/country_picker_dialog.dart b/apps/rider-archive-cubit/lib/core/ui/phone_intel/country_picker_dialog.dart deleted file mode 100644 index ac186c6..0000000 --- a/apps/rider-archive-cubit/lib/core/ui/phone_intel/country_picker_dialog.dart +++ /dev/null @@ -1,168 +0,0 @@ -import 'helpers.dart'; -import 'package:flutter/foundation.dart' show kIsWeb; -import 'package:flutter/material.dart'; - -import 'countries.dart'; - -class PickerDialogStyle { - final Color? backgroundColor; - - final TextStyle? countryCodeStyle; - - final TextStyle? countryNameStyle; - - final Widget? listTileDivider; - - final EdgeInsets? listTilePadding; - - final EdgeInsets? padding; - - final Color? searchFieldCursorColor; - - final InputDecoration? searchFieldInputDecoration; - - final EdgeInsets? searchFieldPadding; - - final double? width; - - PickerDialogStyle({ - this.backgroundColor, - this.countryCodeStyle, - this.countryNameStyle, - this.listTileDivider, - this.listTilePadding, - this.padding, - this.searchFieldCursorColor, - this.searchFieldInputDecoration, - this.searchFieldPadding, - this.width, - }); -} - -class CountryPickerDialog extends StatefulWidget { - final List countryList; - final Country selectedCountry; - final ValueChanged onCountryChanged; - final String searchText; - final List filteredCountries; - final PickerDialogStyle? style; - final String languageCode; - - const CountryPickerDialog({ - Key? key, - required this.searchText, - required this.languageCode, - required this.countryList, - required this.onCountryChanged, - required this.selectedCountry, - required this.filteredCountries, - this.style, - }) : super(key: key); - - @override - State createState() => _CountryPickerDialogState(); -} - -class _CountryPickerDialogState extends State { - late List _filteredCountries; - late Country _selectedCountry; - - @override - void initState() { - _selectedCountry = widget.selectedCountry; - _filteredCountries = widget.filteredCountries.toList() - ..sort( - (a, b) => a - .localizedName(widget.languageCode) - .compareTo(b.localizedName(widget.languageCode)), - ); - - super.initState(); - } - - @override - Widget build(BuildContext context) { - final mediaWidth = MediaQuery.of(context).size.width; - final width = widget.style?.width ?? mediaWidth; - const defaultHorizontalPadding = 40.0; - const defaultVerticalPadding = 24.0; - return Dialog( - insetPadding: EdgeInsets.symmetric( - vertical: defaultVerticalPadding, - horizontal: mediaWidth > (width + defaultHorizontalPadding * 2) - ? (mediaWidth - width) / 2 - : defaultHorizontalPadding), - backgroundColor: widget.style?.backgroundColor, - child: Container( - padding: widget.style?.padding ?? const EdgeInsets.all(10), - child: Column( - children: [ - Padding( - padding: - widget.style?.searchFieldPadding ?? const EdgeInsets.all(0), - child: TextField( - cursorColor: widget.style?.searchFieldCursorColor, - decoration: widget.style?.searchFieldInputDecoration ?? - InputDecoration( - suffixIcon: const Icon(Icons.search), - labelText: widget.searchText, - ), - onChanged: (value) { - _filteredCountries = widget.countryList.stringSearch(value) - ..sort( - (a, b) => a - .localizedName(widget.languageCode) - .compareTo(b.localizedName(widget.languageCode)), - ); - if (mounted) setState(() {}); - }, - ), - ), - const SizedBox(height: 20), - Expanded( - child: ListView.builder( - shrinkWrap: true, - itemCount: _filteredCountries.length, - itemBuilder: (ctx, index) => Column( - children: [ - ListTile( - leading: kIsWeb - ? Image.asset( - 'assets/flags/${_filteredCountries[index].code.toLowerCase()}.png', - package: 'intl_phone_field', - width: 32, - ) - : Text( - _filteredCountries[index].flag, - style: const TextStyle(fontSize: 18), - ), - contentPadding: widget.style?.listTilePadding, - title: Text( - _filteredCountries[index] - .localizedName(widget.languageCode), - style: widget.style?.countryNameStyle ?? - const TextStyle(fontWeight: FontWeight.w700), - ), - trailing: Text( - '+${_filteredCountries[index].dialCode}', - style: widget.style?.countryCodeStyle ?? - const TextStyle(fontWeight: FontWeight.w700), - ), - onTap: () { - _selectedCountry = _filteredCountries[index]; - widget.onCountryChanged(_selectedCountry); - Navigator.of(context).pop(); - }, - ), - widget.style?.listTileDivider ?? - const Divider(thickness: 1), - ], - ), - ), - ), - ], - ), - ), - ); - } -} diff --git a/apps/rider-archive-cubit/lib/core/ui/phone_intel/helpers.dart b/apps/rider-archive-cubit/lib/core/ui/phone_intel/helpers.dart deleted file mode 100644 index c2b3957..0000000 --- a/apps/rider-archive-cubit/lib/core/ui/phone_intel/helpers.dart +++ /dev/null @@ -1,31 +0,0 @@ -import 'countries.dart'; - -bool isNumeric(String s) => - s.isNotEmpty && int.tryParse(s.replaceAll("+", "")) != null; - -String removeDiacritics(String str) { - var withDia = - 'ÀÁÂÃÄÅàáâãäåÒÓÔÕÕÖØòóôõöøÈÉÊËèéêëðÇçÐÌÍÎÏìíîïÙÚÛÜùúûüÑñŠšŸÿýŽž'; - var withoutDia = - 'AAAAAAaaaaaaOOOOOOOooooooEEEEeeeeeCcDIIIIiiiiUUUUuuuuNnSsYyyZz'; - - for (int i = 0; i < withDia.length; i++) { - str = str.replaceAll(withDia[i], withoutDia[i]); - } - - return str; -} - -extension CountryExtensions on List { - List stringSearch(String search) { - search = removeDiacritics(search.toLowerCase()); - return where( - (country) => isNumeric(search) || search.startsWith("+") - ? country.dialCode.contains(search) - : removeDiacritics(country.name.replaceAll("+", "").toLowerCase()) - .contains(search) || - country.nameTranslations.values.any((element) => - removeDiacritics(element.toLowerCase()).contains(search)), - ).toList(); - } -} diff --git a/apps/rider-archive-cubit/lib/core/ui/phone_intel/intl_phone_field.dart b/apps/rider-archive-cubit/lib/core/ui/phone_intel/intl_phone_field.dart deleted file mode 100644 index 5e16d5d..0000000 --- a/apps/rider-archive-cubit/lib/core/ui/phone_intel/intl_phone_field.dart +++ /dev/null @@ -1,521 +0,0 @@ -library intl_phone_field; - -import 'dart:async'; -import 'package:flutter/foundation.dart' show kIsWeb; -import 'package:flutter/material.dart'; -import 'package:flutter/services.dart'; - -import './countries.dart'; -import './phone_number.dart'; -import 'country_picker_dialog.dart'; -import 'helpers.dart'; - -class IntlPhoneField extends StatefulWidget { - /// The TextFormField key. - final GlobalKey? formFieldKey; - - /// Whether to hide the text being edited (e.g., for passwords). - final bool obscureText; - - /// How the text should be aligned horizontally. - final TextAlign textAlign; - - /// How the text should be aligned vertically. - final TextAlignVertical? textAlignVertical; - final VoidCallback? onTap; - - /// {@macro flutter.widgets.editableText.readOnly} - final bool readOnly; - final FormFieldSetter? onSaved; - - /// {@macro flutter.widgets.editableText.onChanged} - /// - /// See also: - /// - /// * [inputFormatters], which are called before [onChanged] - /// runs and can validate and change ("format") the input value. - /// * [onEditingComplete], [onSubmitted], [onSelectionChanged]: - /// which are more specialized input change notifications. - final ValueChanged? onChanged; - - final ValueChanged? onCountryChanged; - - /// An optional method that validates an input. Returns an error string to display if the input is invalid, or null otherwise. - /// - /// A [PhoneNumber] is passed to the validator as argument. - /// The validator can handle asynchronous validation when declared as a [Future]. - /// Or run synchronously when declared as a [Function]. - /// - /// By default, the validator checks whether the input number length is between selected country's phone numbers min and max length. - /// If `disableLengthCheck` is not set to `true`, your validator returned value will be overwritten by the default validator. - /// But, if `disableLengthCheck` is set to `true`, your validator will have to check phone number length itself. - final FutureOr Function(PhoneNumber?)? validator; - - /// {@macro flutter.widgets.editableText.keyboardType} - final TextInputType keyboardType; - - /// Controls the text being edited. - /// - /// If null, this widget will create its own [TextEditingController]. - final TextEditingController? controller; - - /// Defines the keyboard focus for this widget. - /// - /// The [focusNode] is a long-lived object that's typically managed by a - /// [StatefulWidget] parent. See [FocusNode] for more information. - /// - /// To give the keyboard focus to this widget, provide a [focusNode] and then - /// use the current [FocusScope] to request the focus: - /// - /// ```dart - /// FocusScope.of(context).requestFocus(myFocusNode); - /// ``` - /// - /// This happens automatically when the widget is tapped. - /// - /// To be notified when the widget gains or loses the focus, add a listener - /// to the [focusNode]: - /// - /// ```dart - /// focusNode.addListener(() { Log.print(myFocusNode.hasFocus); }); - /// ``` - /// - /// If null, this widget will create its own [FocusNode]. - /// - /// ## Keyboard - /// - /// Requesting the focus will typically cause the keyboard to be shown - /// if it's not showing already. - /// - /// On Android, the user can hide the keyboard - without changing the focus - - /// with the system back button. They can restore the keyboard's visibility - /// by tapping on a text field. The user might hide the keyboard and - /// switch to a physical keyboard, or they might just need to get it - /// out of the way for a moment, to expose something it's - /// obscuring. In this case requesting the focus again will not - /// cause the focus to change, and will not make the keyboard visible. - /// - /// This widget builds an [EditableText] and will ensure that the keyboard is - /// showing when it is tapped by calling [EditableTextState.requestKeyboard()]. - final FocusNode? focusNode; - - /// {@macro flutter.widgets.editableText.onSubmitted} - /// - /// See also: - /// - /// * [EditableText.onSubmitted] for an example of how to handle moving to - /// the next/previous field when using [TextInputAction.next] and - /// [TextInputAction.previous] for [textInputAction]. - final void Function(String)? onSubmitted; - - /// If false the widget is "disabled": it ignores taps, the [TextFormField]'s - /// [decoration] is rendered in grey, - /// [decoration]'s [InputDecoration.counterText] is set to `""`, - /// and the drop down icon is hidden no matter [showDropdownIcon] value. - /// - /// If non-null this property overrides the [decoration]'s - /// [Decoration.enabled] property. - final bool enabled; - - /// The appearance of the keyboard. - /// - /// This setting is only honored on iOS devices. - /// - /// If unset, defaults to the brightness of [ThemeData.brightness]. - final Brightness? keyboardAppearance; - - /// Initial Value for the field. - /// This property can be used to pre-fill the field. - final String? initialValue; - - final String languageCode; - - /// 2 letter ISO Code or country dial code. - /// - /// ```dart - /// initialCountryCode: 'IN', // India - /// initialCountryCode: '+225', // Côte d'Ivoire - /// ``` - final String? initialCountryCode; - - /// List of Country to display see countries.dart for format - final List? countries; - - /// The decoration to show around the text field. - /// - /// By default, draws a horizontal line under the text field but can be - /// configured to show an icon, label, hint text, and error text. - /// - /// Specify null to remove the decoration entirely (including the - /// extra padding introduced by the decoration to save space for the labels). - final InputDecoration decoration; - - /// The style to use for the text being edited. - /// - /// This text style is also used as the base style for the [decoration]. - /// - /// If null, defaults to the `subtitle1` text style from the current [Theme]. - final TextStyle? style; - - /// Disable view Min/Max Length check - final bool disableLengthCheck; - - /// Won't work if [enabled] is set to `false`. - final bool showDropdownIcon; - - final BoxDecoration dropdownDecoration; - - /// The style use for the country dial code. - final TextStyle? dropdownTextStyle; - - /// {@macro flutter.widgets.editableText.inputFormatters} - final List? inputFormatters; - - /// The text that describes the search input field. - /// - /// When the input field is empty and unfocused, the label is displayed on top of the input field (i.e., at the same location on the screen where text may be entered in the input field). - /// When the input field receives focus (or if the field is non-empty), the label moves above (i.e., vertically adjacent to) the input field. - final String searchText; - - /// Position of an icon [leading, trailing] - final IconPosition dropdownIconPosition; - - /// Icon of the drop down button. - /// - /// Default is [Icon(Icons.arrow_drop_down)] - final Icon dropdownIcon; - - /// Whether this text field should focus itself if nothing else is already focused. - final bool autofocus; - - /// Autovalidate mode for text form field. - /// - /// If [AutovalidateMode.onUserInteraction], this FormField will only auto-validate after its content changes. - /// If [AutovalidateMode.always], it will auto-validate even without user interaction. - /// If [AutovalidateMode.disabled], auto-validation will be disabled. - /// - /// Defaults to [AutovalidateMode.onUserInteraction]. - final AutovalidateMode? autovalidateMode; - - /// Whether to show or hide country flag. - /// - /// Default value is `true`. - final bool showCountryFlag; - - /// Message to be displayed on autoValidate error - /// - /// Default value is `Invalid Mobile Number`. - final String? invalidNumberMessage; - - /// The color of the cursor. - final Color? cursorColor; - - /// How tall the cursor will be. - final double? cursorHeight; - - /// How rounded the corners of the cursor should be. - final Radius? cursorRadius; - - /// How thick the cursor will be. - final double cursorWidth; - - /// Whether to show cursor. - final bool? showCursor; - - /// The padding of the Flags Button. - /// - /// The amount of insets that are applied to the Flags Button. - /// - /// If unset, defaults to [EdgeInsets.zero]. - final EdgeInsetsGeometry flagsButtonPadding; - - /// The type of action button to use for the keyboard. - final TextInputAction? textInputAction; - - /// Optional set of styles to allow for customizing the country search - /// & pick dialog - final PickerDialogStyle? pickerDialogStyle; - - /// The margin of the country selector button. - /// - /// The amount of space to surround the country selector button. - /// - /// If unset, defaults to [EdgeInsets.zero]. - final EdgeInsets flagsButtonMargin; - - /// Enable the autofill hint for phone number. - final bool disableAutoFillHints; - - /// If null, default magnification configuration will be used. - final TextMagnifierConfiguration? magnifierConfiguration; - - const IntlPhoneField({ - Key? key, - this.formFieldKey, - this.initialCountryCode, - this.languageCode = 'en', - this.disableAutoFillHints = false, - this.obscureText = false, - this.textAlign = TextAlign.left, - this.textAlignVertical, - this.onTap, - this.readOnly = false, - this.initialValue, - this.keyboardType = TextInputType.phone, - this.controller, - this.focusNode, - this.decoration = const InputDecoration(), - this.style, - this.dropdownTextStyle, - this.onSubmitted, - this.validator, - this.onChanged, - this.countries, - this.onCountryChanged, - this.onSaved, - this.showDropdownIcon = true, - this.dropdownDecoration = const BoxDecoration(), - this.inputFormatters, - this.enabled = true, - this.keyboardAppearance, - @Deprecated('Use searchFieldInputDecoration of PickerDialogStyle instead') - this.searchText = 'Search country', - this.dropdownIconPosition = IconPosition.leading, - this.dropdownIcon = const Icon(Icons.arrow_drop_down), - this.autofocus = false, - this.textInputAction, - this.autovalidateMode = AutovalidateMode.onUserInteraction, - this.showCountryFlag = true, - this.cursorColor, - this.disableLengthCheck = false, - this.flagsButtonPadding = EdgeInsets.zero, - this.invalidNumberMessage = 'Invalid Mobile Number', - this.cursorHeight, - this.cursorRadius = Radius.zero, - this.cursorWidth = 2.0, - this.showCursor = true, - this.pickerDialogStyle, - this.flagsButtonMargin = EdgeInsets.zero, - this.magnifierConfiguration, - }) : super(key: key); - - @override - State createState() => _IntlPhoneFieldState(); -} - -class _IntlPhoneFieldState extends State { - late List _countryList; - late Country _selectedCountry; - late List filteredCountries; - late String number; - - String? validatorMessage; - - @override - void initState() { - super.initState(); - _countryList = widget.countries ?? countries; - filteredCountries = _countryList; - number = widget.initialValue ?? ''; - if (widget.initialCountryCode == null && number.startsWith('+')) { - number = number.substring(1); - // parse initial value - _selectedCountry = countries.firstWhere( - (country) => number.startsWith(country.fullCountryCode), - orElse: () => _countryList.first); - - // remove country code from the initial number value - number = number.replaceFirst( - RegExp("^${_selectedCountry.fullCountryCode}"), ""); - } else { - _selectedCountry = _countryList.firstWhere( - (item) => item.code == (widget.initialCountryCode ?? 'US'), - orElse: () => _countryList.first); - - // remove country code from the initial number value - if (number.startsWith('+')) { - number = number.replaceFirst( - RegExp("^\\+${_selectedCountry.fullCountryCode}"), ""); - } else { - number = number.replaceFirst( - RegExp("^${_selectedCountry.fullCountryCode}"), ""); - } - } - - if (widget.autovalidateMode == AutovalidateMode.always) { - final initialPhoneNumber = PhoneNumber( - countryISOCode: _selectedCountry.code, - countryCode: '+${_selectedCountry.dialCode}', - number: widget.initialValue ?? '', - ); - - final value = widget.validator?.call(initialPhoneNumber); - - if (value is String) { - validatorMessage = value; - } else { - (value as Future).then((msg) { - validatorMessage = msg; - }); - } - } - } - - Future _changeCountry() async { - filteredCountries = _countryList; - await showDialog( - context: context, - useRootNavigator: false, - builder: (context) => StatefulBuilder( - builder: (ctx, setState) => CountryPickerDialog( - languageCode: widget.languageCode.toLowerCase(), - style: widget.pickerDialogStyle, - filteredCountries: filteredCountries, - searchText: widget.searchText, - countryList: _countryList, - selectedCountry: _selectedCountry, - onCountryChanged: (Country country) { - _selectedCountry = country; - widget.onCountryChanged?.call(country); - setState(() {}); - }, - ), - ), - ); - if (mounted) setState(() {}); - } - - @override - Widget build(BuildContext context) { - return TextFormField( - key: widget.formFieldKey, - initialValue: (widget.controller == null) ? number : null, - autofillHints: widget.disableAutoFillHints - ? null - : [AutofillHints.telephoneNumberNational], - readOnly: widget.readOnly, - obscureText: widget.obscureText, - textAlign: widget.textAlign, - textAlignVertical: widget.textAlignVertical, - cursorColor: widget.cursorColor, - onTap: widget.onTap, - controller: widget.controller, - focusNode: widget.focusNode, - cursorHeight: widget.cursorHeight, - cursorRadius: widget.cursorRadius, - cursorWidth: widget.cursorWidth, - showCursor: widget.showCursor, - onFieldSubmitted: widget.onSubmitted, - magnifierConfiguration: widget.magnifierConfiguration, - decoration: widget.decoration.copyWith( - prefixIcon: _buildFlagsButton(), - counterText: !widget.enabled ? '' : null, - ), - style: widget.style, - onSaved: (value) { - widget.onSaved?.call( - PhoneNumber( - countryISOCode: _selectedCountry.code, - countryCode: - '+${_selectedCountry.dialCode}${_selectedCountry.regionCode}', - number: value!, - ), - ); - }, - onChanged: (value) async { - final phoneNumber = PhoneNumber( - countryISOCode: _selectedCountry.code, - countryCode: '+${_selectedCountry.fullCountryCode}', - number: value, - ); - - if (widget.autovalidateMode != AutovalidateMode.disabled) { - validatorMessage = await widget.validator?.call(phoneNumber); - } - - widget.onChanged?.call(phoneNumber); - }, - validator: (value) { - if (value == null || !isNumeric(value)) return validatorMessage; - if (!widget.disableLengthCheck) { - return value.length >= _selectedCountry.minLength && - value.length <= _selectedCountry.maxLength - ? null - : widget.invalidNumberMessage; - } - - return validatorMessage; - }, - maxLength: widget.disableLengthCheck ? null : _selectedCountry.maxLength, - keyboardType: widget.keyboardType, - inputFormatters: widget.inputFormatters, - enabled: widget.enabled, - keyboardAppearance: widget.keyboardAppearance, - autofocus: widget.autofocus, - textInputAction: widget.textInputAction, - autovalidateMode: widget.autovalidateMode, - ); - } - - Container _buildFlagsButton() { - return Container( - margin: widget.flagsButtonMargin, - child: DecoratedBox( - decoration: widget.dropdownDecoration, - child: InkWell( - borderRadius: widget.dropdownDecoration.borderRadius as BorderRadius?, - onTap: widget.enabled ? _changeCountry : null, - child: Padding( - padding: widget.flagsButtonPadding, - child: Row( - mainAxisSize: MainAxisSize.min, - mainAxisAlignment: MainAxisAlignment.center, - children: [ - const SizedBox( - width: 4, - ), - if (widget.enabled && - widget.showDropdownIcon && - widget.dropdownIconPosition == IconPosition.leading) ...[ - widget.dropdownIcon, - const SizedBox(width: 4), - ], - if (widget.showCountryFlag) ...[ - kIsWeb - ? Image.asset( - 'assets/flags/${_selectedCountry.code.toLowerCase()}.png', - package: 'intl_phone_field', - width: 32, - ) - : Text( - _selectedCountry.flag, - style: const TextStyle(fontSize: 18), - ), - const SizedBox(width: 8), - ], - FittedBox( - child: Text( - '+${_selectedCountry.dialCode}', - style: widget.dropdownTextStyle, - ), - ), - if (widget.enabled && - widget.showDropdownIcon && - widget.dropdownIconPosition == IconPosition.trailing) ...[ - const SizedBox(width: 4), - widget.dropdownIcon, - ], - const SizedBox(width: 8), - ], - ), - ), - ), - ), - ); - } -} - -enum IconPosition { - leading, - trailing, -} \ No newline at end of file diff --git a/apps/rider-archive-cubit/lib/core/ui/phone_intel/phone_number.dart b/apps/rider-archive-cubit/lib/core/ui/phone_intel/phone_number.dart deleted file mode 100644 index 912cb07..0000000 --- a/apps/rider-archive-cubit/lib/core/ui/phone_intel/phone_number.dart +++ /dev/null @@ -1,79 +0,0 @@ -import 'countries.dart'; - -class NumberTooLongException implements Exception {} - -class NumberTooShortException implements Exception {} - -class InvalidCharactersException implements Exception {} - -class PhoneNumber { - String countryISOCode; - String countryCode; - String number; - - PhoneNumber({ - required this.countryISOCode, - required this.countryCode, - required this.number, - }); - - factory PhoneNumber.fromCompleteNumber({required String completeNumber}) { - if (completeNumber == "") { - return PhoneNumber(countryISOCode: "", countryCode: "", number: ""); - } - - try { - Country country = getCountry(completeNumber); - String number; - if (completeNumber.startsWith('+')) { - number = completeNumber.substring(1 + country.dialCode.length + country.regionCode.length); - } else { - number = completeNumber.substring(country.dialCode.length + country.regionCode.length); - } - return PhoneNumber( - countryISOCode: country.code, countryCode: country.dialCode + country.regionCode, number: number); - } on InvalidCharactersException { - rethrow; - // ignore: unused_catch_clause - } on Exception catch (e) { - return PhoneNumber(countryISOCode: "", countryCode: "", number: ""); - } - } - - bool isValidNumber() { - Country country = getCountry(completeNumber); - if (number.length < country.minLength) { - throw NumberTooShortException(); - } - - if (number.length > country.maxLength) { - throw NumberTooLongException(); - } - return true; - } - - String get completeNumber { - return countryCode + number; - } - - static Country getCountry(String phoneNumber) { - if (phoneNumber == "") { - throw NumberTooShortException(); - } - - final validPhoneNumber = RegExp(r'^[+0-9]*[0-9]*$'); - - if (!validPhoneNumber.hasMatch(phoneNumber)) { - throw InvalidCharactersException(); - } - - if (phoneNumber.startsWith('+')) { - return countries - .firstWhere((country) => phoneNumber.substring(1).startsWith(country.dialCode + country.regionCode)); - } - return countries.firstWhere((country) => phoneNumber.startsWith(country.dialCode + country.regionCode)); - } - - @override - String toString() => 'PhoneNumber(countryISOCode: $countryISOCode, countryCode: $countryCode, number: $number)'; -} diff --git a/apps/rider-archive-cubit/lib/core/ui/skeleton.dart b/apps/rider-archive-cubit/lib/core/ui/skeleton.dart deleted file mode 100644 index ffb5487..0000000 --- a/apps/rider-archive-cubit/lib/core/ui/skeleton.dart +++ /dev/null @@ -1,104 +0,0 @@ -import 'package:flutter/material.dart'; -import '../design/tokens.dart'; - -/// هيكل التحميل — تأثير نبض على عناصر مستوحاة من الشاشة الفعلية. -/// docs/26 §7 -class Skeleton extends StatelessWidget { - const Skeleton({super.key}); - - @override - Widget build(BuildContext context) { - final cs = Theme.of(context).colorScheme; - final baseColor = cs.surfaceContainerHighest; - final highlightColor = cs.surfaceContainerHigh; - - return Padding( - padding: const EdgeInsets.all(T.pagePadding), - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - _PulseBox(width: double.infinity, height: 200, base: baseColor, highlight: highlightColor), - const SizedBox(height: T.s16), - _PulseBox(width: 200, height: 20, base: baseColor, highlight: highlightColor), - const SizedBox(height: T.s12), - _PulseBox(width: 140, height: 16, base: baseColor, highlight: highlightColor), - const SizedBox(height: T.s24), - Row( - children: [ - _PulseBox(width: 48, height: 48, base: baseColor, highlight: highlightColor, radius: T.rCircle), - const SizedBox(width: T.s12), - Expanded( - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - _PulseBox(width: double.infinity, height: 16, base: baseColor, highlight: highlightColor), - const SizedBox(height: T.s8), - _PulseBox(width: 120, height: 14, base: baseColor, highlight: highlightColor), - ], - ), - ), - ], - ), - ], - ), - ); - } -} - -class _PulseBox extends StatefulWidget { - const _PulseBox({ - required this.width, - required this.height, - required this.base, - required this.highlight, - this.radius = 8, - }); - - final double width; - final double height; - final Color base; - final Color highlight; - final double radius; - - @override - State<_PulseBox> createState() => _PulseBoxState(); -} - -class _PulseBoxState extends State<_PulseBox> - with SingleTickerProviderStateMixin { - late final AnimationController _ctrl; - late final Animation _anim; - - @override - void initState() { - super.initState(); - _ctrl = AnimationController(vsync: this, duration: const Duration(milliseconds: 1200)) - ..repeat(); - _anim = Tween(begin: 0, end: 1).animate( - CurvedAnimation(parent: _ctrl, curve: Curves.easeInOut), - ); - } - - @override - void dispose() { - _ctrl.dispose(); - super.dispose(); - } - - @override - Widget build(BuildContext context) { - return AnimatedBuilder( - animation: _anim, - builder: (_, __) { - return Container( - width: widget.width, - height: widget.height, - decoration: BoxDecoration( - color: Color.lerp(widget.base, widget.highlight, _anim.value), - borderRadius: BorderRadius.circular(widget.radius), - ), - ); - }, - ); - } -} diff --git a/apps/rider-archive-cubit/lib/core/ui/status_banner.dart b/apps/rider-archive-cubit/lib/core/ui/status_banner.dart deleted file mode 100644 index 855d846..0000000 --- a/apps/rider-archive-cubit/lib/core/ui/status_banner.dart +++ /dev/null @@ -1,51 +0,0 @@ -import 'package:flutter/material.dart'; -import '../design/tokens.dart'; - -/// شريط حالة الرحلة الحي. -/// docs/26 §7 -class StatusBanner extends StatelessWidget { - const StatusBanner({ - super.key, - required this.label, - this.color, - this.icon, - }); - - final String label; - final Color? color; - final IconData? icon; - - @override - Widget build(BuildContext context) { - final cs = Theme.of(context).colorScheme; - final effectiveColor = color ?? cs.primary; - - return Container( - width: double.infinity, - padding: const EdgeInsets.symmetric( - horizontal: T.s16, - vertical: T.s12, - ), - decoration: BoxDecoration( - color: effectiveColor.withValues(alpha: 0.1), - borderRadius: BorderRadius.circular(T.r8), - ), - child: Row( - children: [ - if (icon != null) ...[ - Icon(icon, color: effectiveColor, size: T.iconSm), - const SizedBox(width: T.s8), - ], - Expanded( - child: Text( - label, - style: Theme.of(context).textTheme.labelLarge?.copyWith( - color: effectiveColor, - ), - ), - ), - ], - ), - ); - } -} diff --git a/apps/rider-archive-cubit/lib/core/ui/tripz_button.dart b/apps/rider-archive-cubit/lib/core/ui/tripz_button.dart deleted file mode 100644 index 2585f7e..0000000 --- a/apps/rider-archive-cubit/lib/core/ui/tripz_button.dart +++ /dev/null @@ -1,83 +0,0 @@ -import 'package:flutter/material.dart'; -import '../design/tokens.dart'; - -/// زر موحّد: primary (معبّأ) · secondary (محدّد) · text — مع حالة تحميل داخلية. -/// docs/26 §7 -enum TripzButtonStyle { primary, secondary, text } - -class TripzButton extends StatelessWidget { - const TripzButton({ - super.key, - required this.label, - this.onPressed, - this.style = TripzButtonStyle.primary, - this.loading = false, - this.icon, - this.fullWidth = true, - }); - - final String label; - final VoidCallback? onPressed; - final TripzButtonStyle style; - final bool loading; - final IconData? icon; - final bool fullWidth; - - @override - Widget build(BuildContext context) { - final theme = Theme.of(context); - final cs = theme.colorScheme; - final labelStyle = theme.textTheme.labelLarge; - - final effectiveOnPressed = loading ? null : onPressed; - - switch (style) { - case TripzButtonStyle.primary: - return SizedBox( - width: fullWidth ? double.infinity : null, - height: T.buttonHeight, - child: FilledButton( - onPressed: effectiveOnPressed, - child: _buildChild(cs.primary, labelStyle), - ), - ); - case TripzButtonStyle.secondary: - return SizedBox( - width: fullWidth ? double.infinity : null, - height: T.buttonHeight, - child: OutlinedButton( - onPressed: effectiveOnPressed, - child: _buildChild(cs.primary, labelStyle), - ), - ); - case TripzButtonStyle.text: - return TextButton( - onPressed: effectiveOnPressed, - child: _buildChild(cs.primary, labelStyle), - ); - } - } - - Widget _buildChild(Color color, TextStyle? style) { - if (loading) { - return const SizedBox( - height: 22, - width: 22, - child: CircularProgressIndicator(strokeWidth: 2), - ); - } - - if (icon != null) { - return Row( - mainAxisSize: MainAxisSize.min, - children: [ - Icon(icon, size: 20), - const SizedBox(width: T.s8), - Text(label, style: style), - ], - ); - } - - return Text(label, style: style); - } -} diff --git a/apps/rider-archive-cubit/lib/core/ui/tripz_card.dart b/apps/rider-archive-cubit/lib/core/ui/tripz_card.dart deleted file mode 100644 index c0f669f..0000000 --- a/apps/rider-archive-cubit/lib/core/ui/tripz_card.dart +++ /dev/null @@ -1,48 +0,0 @@ -import 'package:flutter/material.dart'; -import '../design/tokens.dart'; - -/// بطاقة موحّدة: رحلة / سائق / محفظة — زوايا 12، حشوة 16. -/// docs/26 §7 -class TripzCard extends StatelessWidget { - const TripzCard({ - super.key, - required this.child, - this.padding, - this.onTap, - this.color, - this.borderColor, - }); - - final Widget child; - final EdgeInsetsGeometry? padding; - final VoidCallback? onTap; - final Color? color; - final Color? borderColor; - - @override - Widget build(BuildContext context) { - final card = Card( - color: color, - shape: RoundedRectangleBorder( - borderRadius: BorderRadius.circular(T.r12), - side: borderColor != null - ? BorderSide(color: borderColor!) - : BorderSide.none, - ), - child: Padding( - padding: padding ?? const EdgeInsets.all(T.pagePadding), - child: child, - ), - ); - - if (onTap != null) { - return InkWell( - onTap: onTap, - borderRadius: BorderRadius.circular(T.r12), - child: card, - ); - } - - return card; - } -} diff --git a/apps/rider-archive-cubit/lib/core/ui/tripz_scaffold.dart b/apps/rider-archive-cubit/lib/core/ui/tripz_scaffold.dart deleted file mode 100644 index a603cb8..0000000 --- a/apps/rider-archive-cubit/lib/core/ui/tripz_scaffold.dart +++ /dev/null @@ -1,390 +0,0 @@ -import 'package:flutter/material.dart'; -import '../design/tokens.dart'; -import '../l10n/app_localizations.dart'; - -/// السكافولد الموحّد — كل شاشة في التطبيق تُبنى داخله. -/// يحوّل `status` من Cubit/Bloc إلى: skeleton / error / empty / محتوى. -/// docs/26 §6 -class TripzScaffold extends StatelessWidget { - const TripzScaffold({ - super.key, - this.title, - this.status, - this.onRetry, - this.empty, - this.bottomAction, - this.actions, - this.showBackButton = false, - this.onBack, - this.safeAreaTop = true, - this.safeAreaBottom = true, - this.padding = true, - this.backgroundColor, - required this.child, - }); - - final String? title; - final Enum? status; - final VoidCallback? onRetry; - final Widget? empty; - final Widget? bottomAction; - final List? actions; - final bool showBackButton; - final VoidCallback? onBack; - final bool safeAreaTop; - final bool safeAreaBottom; - final bool padding; - final Color? backgroundColor; - final Widget child; - - @override - Widget build(BuildContext context) { - final theme = Theme.of(context); - final cs = theme.colorScheme; - - return Scaffold( - backgroundColor: backgroundColor ?? cs.surface, - appBar: title != null - ? AppBar( - title: Text(title!), - leading: showBackButton - ? IconButton( - icon: const Icon(Icons.arrow_back_ios_new_rounded, size: 20), - onPressed: onBack ?? () => Navigator.maybePop(context), - ) - : null, - actions: actions, - ) - : null, - body: SafeArea( - top: safeAreaTop, - bottom: safeAreaBottom, - child: _buildBody(context), - ), - bottomNavigationBar: bottomAction != null - ? Padding( - padding: EdgeInsets.fromLTRB( - T.pagePadding, - 0, - T.pagePadding, - MediaQuery.of(context).viewInsets.bottom > 0 - ? MediaQuery.of(context).viewInsets.bottom + 8 - : T.pagePadding, - ), - child: bottomAction, - ) - : null, - ); - } - - Widget _buildBody(BuildContext context) { - if (status != null) { - if (_isError) return ErrorView(onRetry: onRetry); - if (_isLoading) return const Skeleton(); - if (_isEmpty) return empty ?? const EmptyView(); - } - - return padding - ? Padding( - padding: const EdgeInsets.all(T.pagePadding), - child: child, - ) - : child; - } - - bool get _isLoading => - status != null && status!.name == 'loading'; - - bool get _isError => - status != null && status!.name == 'error'; - - bool get _isEmpty => - status != null && status!.name == 'empty'; -} - -class ErrorView extends StatelessWidget { - final VoidCallback? onRetry; - const ErrorView({super.key, this.onRetry}); - - @override - Widget build(BuildContext context) { - final theme = Theme.of(context); - final cs = theme.colorScheme; - final l10n = AppLocalizations.of(context); - return Center( - child: Padding( - padding: const EdgeInsets.all(T.pagePadding), - child: Column( - mainAxisSize: MainAxisSize.min, - children: [ - Container( - width: T.s64, - height: T.s64, - decoration: BoxDecoration( - color: cs.error.withValues(alpha: 0.1), - shape: BoxShape.circle, - ), - child: Icon( - Icons.error_outline_rounded, - size: T.s48, - color: cs.error, - ), - ), - const SizedBox(height: T.s24), - Text( - l10n?.errorTitle ?? 'حدث خطأ', - style: theme.textTheme.titleLarge?.copyWith( - fontWeight: FontWeight.w600, - ), - textAlign: TextAlign.center, - ), - const SizedBox(height: T.s8), - Text( - l10n?.errorSubtitle ?? 'يرجى المحاولة مرة أخرى', - style: theme.textTheme.bodyMedium?.copyWith( - color: cs.onSurfaceVariant, - ), - textAlign: TextAlign.center, - ), - if (onRetry != null) ...[ - const SizedBox(height: T.s24), - FilledButton.icon( - onPressed: onRetry, - icon: const Icon(Icons.refresh_rounded, size: T.iconSm), - label: Text(l10n?.retry ?? 'أعد المحاولة'), - ), - ], - ], - ), - ), - ); - } -} - -class Skeleton extends StatefulWidget { - const Skeleton({super.key}); - - @override - State createState() => _SkeletonState(); -} - -class _SkeletonState extends State with SingleTickerProviderStateMixin { - late final AnimationController _controller; - - @override - void initState() { - super.initState(); - _controller = AnimationController( - vsync: this, - duration: const Duration(milliseconds: 1200), - )..repeat(); - } - - @override - void dispose() { - _controller.dispose(); - super.dispose(); - } - - @override - Widget build(BuildContext context) { - final cs = Theme.of(context).colorScheme; - final baseColor = cs.surfaceContainerHighest; - final highlightColor = cs.surfaceContainerLow; - - return AnimatedBuilder( - animation: _controller, - builder: (context, child) { - return CustomPaint( - painter: _ShimmerPainter( - baseColor: baseColor, - highlightColor: highlightColor, - progress: _controller.value, - ), - child: child, - ); - }, - child: _buildSkeletonLayout(context), - ); - } - - Widget _buildSkeletonLayout(BuildContext context) { - final cs = Theme.of(context).colorScheme; - final baseColor = cs.surfaceContainerHighest; - - return Padding( - padding: const EdgeInsets.all(T.pagePadding), - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - // Header row skeleton - _ShimmerBox( - width: 160, - height: 24, - color: baseColor, - radius: T.r8, - ), - const SizedBox(height: T.s16), - // Subtitle row skeleton - _ShimmerBox( - width: 100, - height: 14, - color: baseColor, - radius: T.r8, - ), - const SizedBox(height: T.s24), - // Card-like skeleton block 1 - _ShimmerBox( - width: double.infinity, - height: 120, - color: baseColor, - radius: T.r12, - ), - const SizedBox(height: T.s16), - // Card-like skeleton block 2 - _ShimmerBox( - width: double.infinity, - height: 80, - color: baseColor, - radius: T.r12, - ), - const SizedBox(height: T.s16), - // Row of two small boxes - Row( - children: [ - Expanded( - child: _ShimmerBox( - height: 48, - color: baseColor, - radius: T.r12, - ), - ), - const SizedBox(width: T.s12), - Expanded( - child: _ShimmerBox( - height: 48, - color: baseColor, - radius: T.r12, - ), - ), - ], - ), - ], - ), - ); - } -} - -class _ShimmerBox extends StatelessWidget { - const _ShimmerBox({ - required this.height, - required this.color, - this.width = double.infinity, - this.radius = 0, - }); - - final double width; - final double height; - final Color color; - final double radius; - - @override - Widget build(BuildContext context) { - return Container( - width: width, - height: height, - decoration: BoxDecoration( - color: color, - borderRadius: BorderRadius.circular(radius), - ), - ); - } -} - -class _ShimmerPainter extends CustomPainter { - _ShimmerPainter({ - required this.baseColor, - required this.highlightColor, - required this.progress, - }); - - final Color baseColor; - final Color highlightColor; - final double progress; - - @override - void paint(Canvas canvas, Size size) { - final paint = Paint(); - final dx = size.width * 1.5 * progress; - final gradient = LinearGradient( - begin: const Alignment(-0.3, 0), - end: const Alignment(0.3, 0), - colors: [ - baseColor, - highlightColor, - baseColor, - ], - stops: const [0.0, 0.5, 1.0], - ); - final rect = Rect.fromCenter( - center: Offset(dx, size.height / 2), - width: size.width * 0.6, - height: size.height, - ); - paint.shader = gradient.createShader(rect); - canvas.drawRect(rect, paint); - } - - @override - bool shouldRepaint(_ShimmerPainter old) => old.progress != progress; -} - -class EmptyView extends StatelessWidget { - const EmptyView({super.key}); - - @override - Widget build(BuildContext context) { - final theme = Theme.of(context); - final cs = theme.colorScheme; - final l10n = AppLocalizations.of(context); - return Center( - child: Padding( - padding: const EdgeInsets.all(T.pagePadding), - child: Column( - mainAxisSize: MainAxisSize.min, - children: [ - Container( - width: T.s64, - height: T.s64, - decoration: BoxDecoration( - color: cs.primaryContainer, - shape: BoxShape.circle, - ), - child: Icon( - Icons.inbox_outlined, - size: T.iconLg, - color: cs.onPrimaryContainer, - ), - ), - const SizedBox(height: T.s24), - Text( - l10n?.emptyTitle ?? 'لا توجد بيانات', - style: theme.textTheme.titleMedium?.copyWith( - fontWeight: FontWeight.w600, - ), - textAlign: TextAlign.center, - ), - const SizedBox(height: T.s8), - Text( - l10n?.emptySubtitle ?? 'لم يتم العثور على محتوى حالياً', - style: theme.textTheme.bodyMedium?.copyWith( - color: cs.onSurfaceVariant, - ), - textAlign: TextAlign.center, - ), - ], - ), - ), - ); - } -} diff --git a/apps/rider-archive-cubit/lib/core/ui/tripz_sheet.dart b/apps/rider-archive-cubit/lib/core/ui/tripz_sheet.dart deleted file mode 100644 index 4c895eb..0000000 --- a/apps/rider-archive-cubit/lib/core/ui/tripz_sheet.dart +++ /dev/null @@ -1,74 +0,0 @@ -import 'package:flutter/material.dart'; -import '../design/tokens.dart'; - -/// كل bottom sheet في التطبيق يمرّ من هنا: مقبض علوي، زوايا 24. -/// docs/26 §7 -class TripzSheet extends StatelessWidget { - const TripzSheet({ - super.key, - this.title, - this.child, - this.bottomAction, - this.isScrollControlled = true, - }); - - final String? title; - final Widget? child; - final Widget? bottomAction; - final bool isScrollControlled; - - /// مساعد للاستدعاء بأمر واحد - static Future show( - BuildContext context, { - String? title, - Widget? child, - Widget? bottomAction, - bool isScrollControlled = true, - }) { - return showModalBottomSheet( - context: context, - isScrollControlled: isScrollControlled, - useSafeArea: true, - builder: (_) => TripzSheet( - title: title, - bottomAction: bottomAction, - child: child, - ), - ); - } - - @override - Widget build(BuildContext context) { - final theme = Theme.of(context); - final bottomPadding = MediaQuery.of(context).viewInsets.bottom; - - return Padding( - padding: EdgeInsets.fromLTRB(0, 0, 0, bottomPadding), - child: SafeArea( - child: Padding( - padding: const EdgeInsets.symmetric(horizontal: T.pagePadding), - child: Column( - mainAxisSize: MainAxisSize.min, - crossAxisAlignment: CrossAxisAlignment.stretch, - children: [ - if (title != null) ...[ - Text( - title!, - style: theme.textTheme.titleMedium, - textAlign: TextAlign.center, - ), - const SizedBox(height: T.s16), - ], - if (child != null) child!, - if (bottomAction != null) ...[ - const SizedBox(height: T.s16), - bottomAction!, - const SizedBox(height: T.s8), - ], - ], - ), - ), - ), - ); - } -} diff --git a/apps/rider-archive-cubit/lib/core/ui/tripz_text_field.dart b/apps/rider-archive-cubit/lib/core/ui/tripz_text_field.dart deleted file mode 100644 index 38a5527..0000000 --- a/apps/rider-archive-cubit/lib/core/ui/tripz_text_field.dart +++ /dev/null @@ -1,92 +0,0 @@ -import 'package:flutter/material.dart'; -import '../design/tokens.dart'; - -/// حقل إدخال موحّد: هاتف · OTP · بحث — رسالة الخطأ تحته بالعربية. -/// docs/26 §7 -class TripzTextField extends StatelessWidget { - const TripzTextField({ - super.key, - this.controller, - this.label, - this.hint, - this.prefix, - this.suffix, - this.keyboardType, - this.obscureText = false, - this.errorText, - this.enabled = true, - this.onChanged, - this.onSubmitted, - this.autofocus = false, - this.textAlign, - this.maxLength, - this.contentPadding, - this.focusNode, - this.textInputAction, - }); - - final TextEditingController? controller; - final String? label; - final String? hint; - final Widget? prefix; - final Widget? suffix; - final TextInputType? keyboardType; - final bool obscureText; - final String? errorText; - final bool enabled; - final ValueChanged? onChanged; - final ValueChanged? onSubmitted; - final bool autofocus; - final TextAlign? textAlign; - final int? maxLength; - final EdgeInsetsGeometry? contentPadding; - final FocusNode? focusNode; - final TextInputAction? textInputAction; - - @override - Widget build(BuildContext context) { - final cs = Theme.of(context).colorScheme; - - return Column( - mainAxisSize: MainAxisSize.min, - crossAxisAlignment: CrossAxisAlignment.stretch, - children: [ - SizedBox( - height: T.inputHeight, - child: TextField( - controller: controller, - focusNode: focusNode, - keyboardType: keyboardType, - textInputAction: textInputAction, - obscureText: obscureText, - enabled: enabled, - onChanged: onChanged, - onSubmitted: onSubmitted, - autofocus: autofocus, - textAlign: textAlign ?? TextAlign.start, - maxLength: maxLength, - style: Theme.of(context).textTheme.bodyLarge, - decoration: InputDecoration( - labelText: label, - hintText: hint, - prefixIcon: prefix, - suffixIcon: suffix, - counterText: '', - contentPadding: contentPadding ?? - const EdgeInsets.symmetric(horizontal: 16, vertical: 14), - ), - ), - ), - if (errorText != null) ...[ - const SizedBox(height: 4), - Text( - errorText!, - style: Theme.of(context).textTheme.bodySmall?.copyWith( - color: cs.error, - ), - ), - ], - ], - ); - } -} diff --git a/apps/rider-archive-cubit/lib/core/utils/phone_normalizer.dart b/apps/rider-archive-cubit/lib/core/utils/phone_normalizer.dart deleted file mode 100644 index 5503741..0000000 --- a/apps/rider-archive-cubit/lib/core/utils/phone_normalizer.dart +++ /dev/null @@ -1,51 +0,0 @@ -class DialPlan { - final String callingCode; - final int nationalLength; - - const DialPlan({required this.callingCode, required this.nationalLength}); -} - -/// أداة تطبيع رقم الهاتف لصيغة دولية موحدة (مطابقة للباك إند PhoneService). -class PhoneNormalizer { - static const Map dialPlans = { - 'JO': DialPlan(callingCode: '962', nationalLength: 9), - 'SY': DialPlan(callingCode: '963', nationalLength: 9), - 'EG': DialPlan(callingCode: '20', nationalLength: 10), - 'SA': DialPlan(callingCode: '966', nationalLength: 9), - 'AE': DialPlan(callingCode: '971', nationalLength: 9), - 'IQ': DialPlan(callingCode: '964', nationalLength: 10), - }; - - /// يرجع الرقم في صيغة موحّدة (مثل 962791234567 أو +962791234567 حسب الحاجة). - static String normalize(String rawNumber, {String isoCode = 'JO', bool withPlus = true}) { - final countryKey = isoCode.toUpperCase(); - final plan = dialPlans[countryKey] ?? const DialPlan(callingCode: '962', nationalLength: 9); - - // إزالة كل الرموز باستثناء الأرقام - var digits = rawNumber.replaceAll(RegExp(r'\D'), ''); - if (digits.isEmpty) return rawNumber; - - // إزالة البادئة الدولية "00" إن وجدت - if (digits.startsWith('00')) { - digits = digits.substring(2); - } - - String resultDigits = digits; - - // 1) الرقم مكتوب بالفعل بمفتاح الدولة كلياً - if (digits.startsWith(plan.callingCode) && - digits.length == plan.callingCode.length + plan.nationalLength) { - resultDigits = digits; - } - // 2) رقم محلي يبدأ بصفر (مثل 0791234567) - else if (digits.startsWith('0') && digits.length == plan.nationalLength + 1) { - resultDigits = plan.callingCode + digits.substring(1); - } - // 3) رقم محلي محذوف منه الصفر البادئ (مثل 791234567) - else if (digits.length == plan.nationalLength) { - resultDigits = plan.callingCode + digits; - } - - return withPlus ? '+$resultDigits' : resultDigits; - } -} diff --git a/apps/rider-archive-cubit/lib/features/auth/cubit/auth_cubit.dart b/apps/rider-archive-cubit/lib/features/auth/cubit/auth_cubit.dart deleted file mode 100644 index 5580051..0000000 --- a/apps/rider-archive-cubit/lib/features/auth/cubit/auth_cubit.dart +++ /dev/null @@ -1,77 +0,0 @@ -import 'package:flutter_bloc/flutter_bloc.dart'; -import '../data/auth_repository.dart'; -import 'auth_state.dart'; - -class AuthCubit extends Cubit { - final AuthRepository _repo; - - AuthCubit(this._repo) : super(const AuthState()); - - Future checkAuth() async { - final hasToken = await _repo.hasSavedToken(); - if (hasToken) { - final cachedUser = await _repo.getCachedUser(); - if (cachedUser != null) { - emit(state.copyWith( - status: AuthStatus.authenticated, - user: cachedUser, - )); - } - } - final user = await _repo.me(); - if (user != null) { - emit(state.copyWith( - status: AuthStatus.authenticated, - user: user, - )); - } else { - final hasTokenAfterMe = await _repo.hasSavedToken(); - if (!hasTokenAfterMe) { - emit(state.copyWith( - status: AuthStatus.unauthenticated, - user: null, - )); - } - } - } - - - Future sendOtp(String phone) async { - if (phone.trim().isEmpty) { - emit(state.copyWith(status: AuthStatus.error, error: 'أدخل رقم الهاتف')); - return; - } - try { - emit(state.copyWith(status: AuthStatus.authenticating, phone: phone.trim())); - await _repo.sendOtp(phone.trim()); - emit(state.copyWith(status: AuthStatus.codeSent, phone: phone.trim())); - } catch (_) { - emit(state.copyWith(status: AuthStatus.error, error: 'تعذّر إرسال الرمز')); - } - } - - Future verify(String code) async { - try { - emit(state.copyWith(status: AuthStatus.authenticating)); - final user = await _repo.verify(state.phone, code.trim()); - emit(state.copyWith(status: AuthStatus.authenticated, user: user)); - } catch (_) { - emit(state.copyWith(status: AuthStatus.error, error: 'رمز غير صحيح')); - } - } - - Future logout() async { - await _repo.logout(); - emit(const AuthState(status: AuthStatus.unauthenticated)); - } - - Future updateName(String name) async { - try { - emit(state.copyWith(status: AuthStatus.authenticating)); - final user = await _repo.updateName(name); - emit(state.copyWith(status: AuthStatus.authenticated, user: user)); - } catch (_) { - emit(state.copyWith(status: AuthStatus.error, error: 'تعذّر حفظ الاسم')); - } - } -} diff --git a/apps/rider-archive-cubit/lib/features/auth/cubit/auth_state.dart b/apps/rider-archive-cubit/lib/features/auth/cubit/auth_state.dart deleted file mode 100644 index c02f18b..0000000 --- a/apps/rider-archive-cubit/lib/features/auth/cubit/auth_state.dart +++ /dev/null @@ -1,42 +0,0 @@ -import 'package:equatable/equatable.dart'; -import '../data/auth_repository.dart'; - -enum AuthStatus { - unknown, - unauthenticated, - codeSent, - authenticating, - authenticated, - error, -} - -class AuthState extends Equatable { - final AuthStatus status; - final String phone; - final AppUser? user; - final String? error; - - const AuthState({ - this.status = AuthStatus.unknown, - this.phone = '', - this.user, - this.error, - }); - - AuthState copyWith({ - AuthStatus? status, - String? phone, - AppUser? user, - String? error, - }) { - return AuthState( - status: status ?? this.status, - phone: phone ?? this.phone, - user: user ?? this.user, - error: error, - ); - } - - @override - List get props => [status, phone, user, error]; -} diff --git a/apps/rider-archive-cubit/lib/features/auth/data/auth_repository.dart b/apps/rider-archive-cubit/lib/features/auth/data/auth_repository.dart deleted file mode 100644 index 5ec11de..0000000 --- a/apps/rider-archive-cubit/lib/features/auth/data/auth_repository.dart +++ /dev/null @@ -1,86 +0,0 @@ -import 'dart:convert'; -import 'package:dio/dio.dart'; -import '../../../core/api/api_client.dart'; -import '../../../core/storage/token_store.dart'; - -class AppUser { - final String id; - final String phone; - final String? name; - final String role; - - AppUser({required this.id, required this.phone, this.name, required this.role}); - - factory AppUser.fromJson(Map j) => AppUser( - id: j['id'] as String, - phone: (j['phone'] ?? '') as String, - name: j['name'] as String?, - role: (j['role'] ?? 'rider') as String, - ); - - Map toJson() => { - 'id': id, - 'phone': phone, - 'name': name, - 'role': role, - }; -} - -class AuthRepository { - final ApiClient _api; - final TokenStore _store; - - AuthRepository(this._api, this._store); - - Future sendOtp(String phone) async { - await _api.dio.post('/auth/send-otp', data: {'phone': phone}); - } - - Future verify(String phone, String code) async { - final r = await _api.dio.post( - '/auth/verify-otp', - data: {'phone': phone, 'code': code}, - ); - await _store.save( - r.data['access_token'] as String, - r.data['refresh_token'] as String, - ); - final user = AppUser.fromJson(Map.from(r.data['user'] as Map)); - await _store.saveUser(jsonEncode(user.toJson())); - return user; - } - - Future getCachedUser() async { - final raw = await _store.readUser(); - if (raw == null || raw.isEmpty) return null; - try { - final map = jsonDecode(raw) as Map; - return AppUser.fromJson(map); - } catch (_) { - return null; - } - } - - Future hasSavedToken() => _store.hasToken(); - - Future me() async { - try { - final r = await _api.dio.get('/users/me'); - final user = AppUser.fromJson(Map.from(r.data as Map)); - await _store.saveUser(jsonEncode(user.toJson())); - return user; - } on DioException { - return getCachedUser(); - } - } - - Future logout() => _store.clear(); - - Future updateName(String name) async { - final r = await _api.dio.patch('/users/me', data: {'name': name}); - final user = AppUser.fromJson(Map.from(r.data as Map)); - await _store.saveUser(jsonEncode(user.toJson())); - return user; - } -} - diff --git a/apps/rider-archive-cubit/lib/features/auth/view/name_screen.dart b/apps/rider-archive-cubit/lib/features/auth/view/name_screen.dart deleted file mode 100644 index ec082ca..0000000 --- a/apps/rider-archive-cubit/lib/features/auth/view/name_screen.dart +++ /dev/null @@ -1,180 +0,0 @@ -import 'package:flutter/material.dart'; -import 'package:flutter_bloc/flutter_bloc.dart'; -import '../../../core/l10n/app_localizations.dart'; -import '../../../core/design/tokens.dart'; -import '../cubit/auth_cubit.dart'; -import '../cubit/auth_state.dart'; -import '../../../core/ui/tripz_scaffold.dart'; -import '../../../core/ui/tripz_button.dart'; -import '../../../core/ui/tripz_text_field.dart'; - -/// شاشة إدخال الاسم (أول دخول فقط) — تطابق stitch/name_entry.html: -/// شعار صغير بالمنتصف أعلى الشاشة + عنوان وسطر فرعي + بطاقة بيضاء -/// مرفوعة فيها حقل الاسم بأيقونة، وزر متابعة أسفل الشاشة. -/// -/// ملاحظة: تصميم Stitch يعرض 3 حقول (الاسم الأول/الأخير/البريد)، لكن -/// AuthCubit.updateName ينادي PATCH /users/me بحقل name واحد فقط -/// (docs/29 §3.5 ينص صراحة على «حقل واحد»). الشاشة هنا تستعمل حقلاً -/// واحداً للاسم الكامل بنفس لغة Stitch البصرية (بطاقة مرفوعة + أيقونة -/// + label عائم) دون تغيير عقد الـCubit. -class NameScreen extends StatefulWidget { - const NameScreen({super.key}); - @override - State createState() => _NameScreenState(); -} - -class _NameScreenState extends State { - final _firstNameController = TextEditingController(); - final _lastNameController = TextEditingController(); - bool _valid = false; - - @override - void initState() { - super.initState(); - _firstNameController.addListener(_validate); - _lastNameController.addListener(_validate); - } - - void _validate() { - final isValid = _firstNameController.text.trim().isNotEmpty && - _lastNameController.text.trim().isNotEmpty; - if (_valid != isValid) { - setState(() => _valid = isValid); - } - } - - @override - void dispose() { - _firstNameController.dispose(); - _lastNameController.dispose(); - super.dispose(); - } - - void _submit() { - if (!_valid) return; - final fullName = - '${_firstNameController.text.trim()} ${_lastNameController.text.trim()}'; - context.read().updateName(fullName); - } - - @override - Widget build(BuildContext context) { - final l10n = AppLocalizations.of(context)!; - final theme = Theme.of(context); - final cs = theme.colorScheme; - - return BlocConsumer( - listener: (context, state) { - if (state.status == AuthStatus.error && state.error != null) { - ScaffoldMessenger.of(context).showSnackBar( - SnackBar(content: Text(state.error!)), - ); - } - }, - builder: (context, state) { - final isLoading = state.status == AuthStatus.authenticating; - return TripzScaffold( - backgroundColor: cs.surfaceContainerLow, - padding: false, - bottomAction: TripzButton( - onPressed: (_valid && !isLoading) ? _submit : null, - label: l10n.nameButton, - loading: isLoading, - ), - child: Column( - children: [ - // ── رأس الشاشة: زر عودة (يبدأ الجلسة من جديد) + شعار مصغّر ── - SizedBox( - height: T.s48, - child: Row( - children: [ - IconButton( - icon: const BackButtonIcon(), - color: cs.onSurface, - tooltip: l10n.back, - onPressed: () => context.read().logout(), - ), - Expanded( - child: Center( - child: Image.asset( - 'assets/images/name_hero.png', - height: T.iconLg, - fit: BoxFit.contain, - errorBuilder: (_, __, ___) => Icon( - Icons.directions_car_filled_rounded, - size: T.iconLg, - color: cs.primary, - ), - ), - ), - ), - const SizedBox(width: T.s48), - ], - ), - ), - const SizedBox(height: T.s24), - - Expanded( - child: SingleChildScrollView( - padding: const EdgeInsets.symmetric(horizontal: T.pagePadding), - child: Column( - children: [ - // العنوان والسطر الفرعي - Text( - l10n.nameTitle, - style: theme.textTheme.headlineSmall?.copyWith( - fontWeight: FontWeight.w600, - color: cs.onSurface, - ), - textAlign: TextAlign.center, - ), - const SizedBox(height: T.s8), - Text( - l10n.nameSubtitle, - style: theme.textTheme.bodyLarge?.copyWith( - color: cs.onSurfaceVariant, - ), - textAlign: TextAlign.center, - ), - const SizedBox(height: T.s24), - - // بطاقة بيضاء مرفوعة تحوي حقول الاسم الأول واسم العائلة - Container( - width: double.infinity, - padding: const EdgeInsets.all(T.s24), - decoration: BoxDecoration( - color: cs.surfaceContainerLowest, - borderRadius: BorderRadius.circular(T.r16), - boxShadow: const [T.shadowSm], - ), - child: Column( - children: [ - TripzTextField( - controller: _firstNameController, - label: l10n.firstNameHint, - autofocus: true, - prefix: Icon(Icons.person_outline_rounded, color: cs.outline), - textInputAction: TextInputAction.next, - ), - const SizedBox(height: T.s16), - TripzTextField( - controller: _lastNameController, - label: l10n.lastNameHint, - prefix: Icon(Icons.badge_outlined, color: cs.outline), - onSubmitted: (_) => _submit(), - ), - ], - ), - ), - ], - ), - ), - ), - ], - ), - ); - }, - ); - } - -} diff --git a/apps/rider-archive-cubit/lib/features/auth/view/otp_screen.dart b/apps/rider-archive-cubit/lib/features/auth/view/otp_screen.dart deleted file mode 100644 index e210e7d..0000000 --- a/apps/rider-archive-cubit/lib/features/auth/view/otp_screen.dart +++ /dev/null @@ -1,308 +0,0 @@ -import 'dart:async'; -import 'package:flutter/material.dart'; -import 'package:flutter/services.dart'; -import 'package:flutter_bloc/flutter_bloc.dart'; -import '../../../core/l10n/app_localizations.dart'; -import 'package:go_router/go_router.dart'; -import '../cubit/auth_cubit.dart'; -import '../cubit/auth_state.dart'; -import '../../../core/design/tokens.dart'; -import '../../../core/ui/tripz_scaffold.dart'; -import '../../../core/ui/tripz_button.dart'; - -/// شاشة تحقق OTP — تطابق stitch/otp_verification.html: -/// شريط علوي بلون primary + 4 خانات منفصلة (ترتيب LTR ثابت) + عدّاد -/// إعادة إرسال + تأكيد تلقائي عند اكتمال الخانات. -class OtpScreen extends StatefulWidget { - const OtpScreen({super.key}); - @override - State createState() => _OtpScreenState(); -} - -class _OtpScreenState extends State { - static const _otpLength = 4; - final List _controllers = - List.generate(_otpLength, (_) => TextEditingController()); - final List _focusNodes = - List.generate(_otpLength, (_) => FocusNode()); - int _resendSeconds = 60; - Timer? _resendTimer; - - @override - void initState() { - super.initState(); - _startResendTimer(); - WidgetsBinding.instance.addPostFrameCallback((_) { - _focusNodes[0].requestFocus(); - }); - } - - @override - void dispose() { - _resendTimer?.cancel(); - for (final c in _controllers) { - c.dispose(); - } - for (final f in _focusNodes) { - f.dispose(); - } - super.dispose(); - } - - void _startResendTimer() { - _resendSeconds = 60; - _resendTimer?.cancel(); - _resendTimer = Timer.periodic(const Duration(seconds: 1), (timer) { - if (_resendSeconds <= 0) { - timer.cancel(); - } else { - setState(() => _resendSeconds--); - } - }); - } - - String get _otpCode => _controllers.map((c) => c.text).join(); - - bool get _isComplete => _otpCode.length == _otpLength; - - void _onDigitChanged(int index, String value) { - if (value.length > 1) { - // لصق تلقائي: يوزّع الأرقام الملصوقة على الخانات بالترتيب - final digits = value.replaceAll(RegExp(r'[^0-9]'), ''); - for (int i = 0; i < _otpLength && i < digits.length; i++) { - _controllers[i].text = digits[i]; - } - final nextIdx = digits.length.clamp(0, _otpLength - 1); - _focusNodes[nextIdx].requestFocus(); - } else if (value.isNotEmpty) { - if (index < _otpLength - 1) { - _focusNodes[index + 1].requestFocus(); - } else { - _focusNodes[index].unfocus(); - } - } - - setState(() {}); - - if (_isComplete) { - _submit(); - } - } - - void _onKeyPress(int index, KeyEvent event) { - if (event is KeyDownEvent && - event.logicalKey == LogicalKeyboardKey.backspace && - _controllers[index].text.isEmpty && - index > 0) { - _controllers[index - 1].clear(); - _focusNodes[index - 1].requestFocus(); - setState(() {}); - } - } - - void _submit() { - if (!_isComplete) return; - context.read().verify(_otpCode); - } - - void _resend() { - final phone = context.read().state.phone; - context.read().sendOtp(phone); - _startResendTimer(); - } - - @override - Widget build(BuildContext context) { - final l10n = AppLocalizations.of(context)!; - final theme = Theme.of(context); - final cs = theme.colorScheme; - final phone = context.watch().state.phone; - - return BlocConsumer( - listener: (context, state) { - if (state.status == AuthStatus.error && state.error != null) { - ScaffoldMessenger.of(context).showSnackBar( - SnackBar(content: Text(state.error!)), - ); - } - }, - builder: (context, state) { - final isLoading = state.status == AuthStatus.authenticating; - - return TripzScaffold( - padding: false, - safeAreaTop: false, - bottomAction: TripzButton( - onPressed: (_isComplete && !isLoading) ? _submit : null, - label: l10n.confirm, - loading: isLoading, - ), - child: Column( - crossAxisAlignment: CrossAxisAlignment.stretch, - children: [ - // ── شريط علوي بلون primary (يطابق TopAppBar في stitch) ── - SafeArea( - bottom: false, - child: SizedBox( - height: kToolbarHeight, - child: ColoredBox( - color: cs.primary, - child: Padding( - padding: const EdgeInsets.symmetric(horizontal: T.s8), - child: Row( - children: [ - IconButton( - icon: const BackButtonIcon(), - color: cs.onPrimary, - onPressed: () => context.go('/phone'), - ), - const SizedBox(width: T.s8), - Text( - l10n.confirmPhoneNumber, - style: theme.textTheme.titleLarge?.copyWith( - color: cs.onPrimary, - fontWeight: FontWeight.w700, - ), - ), - ], - ), - ), - ), - ), - ), - - Expanded( - child: Padding( - padding: const EdgeInsets.symmetric(horizontal: T.pagePadding), - child: Column( - crossAxisAlignment: CrossAxisAlignment.stretch, - children: [ - const SizedBox(height: T.s24), - - // نص الشرح + تعديل الرقم - Row( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Expanded( - child: Text( - l10n.otpSentTo(phone), - style: theme.textTheme.bodyLarge?.copyWith( - color: cs.onSurfaceVariant, - height: 1.5, - ), - ), - ), - TextButton( - onPressed: () => context.go('/phone'), - style: TextButton.styleFrom( - padding: const EdgeInsets.symmetric(horizontal: T.s8), - minimumSize: Size.zero, - tapTargetSize: MaterialTapTargetSize.shrinkWrap, - ), - child: Text( - l10n.edit, - style: theme.textTheme.labelLarge?.copyWith( - color: cs.primary, - fontWeight: FontWeight.w600, - ), - ), - ), - ], - ), - const SizedBox(height: T.s32), - - // ── خانات الرمز — ترتيب LTR ثابت (يطابق dir="ltr" في stitch) ── - Directionality( - textDirection: TextDirection.ltr, - child: Row( - mainAxisAlignment: MainAxisAlignment.center, - children: List.generate(_otpLength, (i) { - final hasFocus = _focusNodes[i].hasFocus; - final hasValue = _controllers[i].text.isNotEmpty; - return Padding( - padding: EdgeInsetsDirectional.only( - end: i < _otpLength - 1 ? T.s16 : 0, - ), - child: Container( - width: 60, - height: 64, - decoration: BoxDecoration( - borderRadius: BorderRadius.circular(T.r12), - boxShadow: (hasFocus || hasValue) ? const [T.shadowSm] : null, - ), - child: KeyboardListener( - focusNode: FocusNode(), - onKeyEvent: (event) => _onKeyPress(i, event), - child: TextField( - controller: _controllers[i], - focusNode: _focusNodes[i], - textAlign: TextAlign.center, - keyboardType: TextInputType.number, - maxLength: 1, - style: theme.textTheme.headlineSmall?.copyWith( - fontWeight: FontWeight.bold, - color: cs.onSurface, - fontFeatures: const [FontFeature.tabularFigures()], - ), - inputFormatters: [ - FilteringTextInputFormatter.digitsOnly, - ], - decoration: InputDecoration( - counterText: '', - filled: true, - fillColor: cs.surfaceContainerLowest, - contentPadding: const EdgeInsets.symmetric(vertical: 14), - border: OutlineInputBorder( - borderRadius: BorderRadius.circular(T.r12), - borderSide: BorderSide(color: cs.outlineVariant), - ), - enabledBorder: OutlineInputBorder( - borderRadius: BorderRadius.circular(T.r12), - borderSide: BorderSide( - color: hasValue ? cs.primary : cs.outlineVariant, - width: hasValue ? 1.5 : 1, - ), - ), - focusedBorder: OutlineInputBorder( - borderRadius: BorderRadius.circular(T.r12), - borderSide: BorderSide(color: cs.primary, width: 2), - ), - ), - onChanged: (v) => _onDigitChanged(i, v), - ), - ), - ), - ); - }), - ), - ), - const SizedBox(height: T.s24), - - // عدّاد إعادة الإرسال - Center( - child: _resendSeconds > 0 - ? Text( - l10n.resendIn(_resendSeconds), - style: theme.textTheme.bodyMedium?.copyWith( - color: cs.onSurfaceVariant, - fontFeatures: const [FontFeature.tabularFigures()], - ), - ) - : TripzButton( - onPressed: _resend, - style: TripzButtonStyle.text, - label: l10n.resendCode, - fullWidth: false, - ), - ), - ], - ), - ), - ), - ], - ), - ); - }, - ); - } -} diff --git a/apps/rider-archive-cubit/lib/features/auth/view/phone_screen.dart b/apps/rider-archive-cubit/lib/features/auth/view/phone_screen.dart deleted file mode 100644 index 4932002..0000000 --- a/apps/rider-archive-cubit/lib/features/auth/view/phone_screen.dart +++ /dev/null @@ -1,176 +0,0 @@ -import 'package:flutter/material.dart'; -import 'package:flutter_bloc/flutter_bloc.dart'; -import '../../../core/l10n/app_localizations.dart'; -import '../../../core/build_config.dart'; -import '../cubit/auth_cubit.dart'; -import '../cubit/auth_state.dart'; -import '../../../core/design/tokens.dart'; -import '../../../core/utils/phone_normalizer.dart'; -import '../../../core/ui/phone_intel/intl_phone_field.dart'; -import '../../../core/ui/phone_intel/phone_number.dart'; -import '../../../core/ui/tripz_scaffold.dart'; -import '../../../core/ui/tripz_button.dart'; - -/// شاشة إدخال الهاتف — تطابق stitch/phone_login.html: -/// خلفية فاتحة + شعار بالمنتصف بالأعلى + sheet أبيض سفلي بحواف مدورة -/// فيه حقل الهاتف (علم + كود دولة + رقم) وزر إرسال الكود. -class PhoneScreen extends StatefulWidget { - const PhoneScreen({super.key}); - @override - State createState() => _PhoneScreenState(); -} - -class _PhoneScreenState extends State { - PhoneNumber? _phoneNumber; - bool _valid = false; - - void _sendOtp(BuildContext context) { - if (_phoneNumber == null) return; - final normalized = PhoneNormalizer.normalize( - _phoneNumber!.number, - isoCode: _phoneNumber!.countryISOCode, - ); - context.read().sendOtp(normalized); - } - - @override - Widget build(BuildContext context) { - final l10n = AppLocalizations.of(context)!; - final theme = Theme.of(context); - final cs = theme.colorScheme; - - return BlocConsumer( - listener: (context, state) { - if (state.status == AuthStatus.error && state.error != null) { - ScaffoldMessenger.of(context).showSnackBar( - SnackBar(content: Text(state.error!)), - ); - } - }, - builder: (context, state) { - final isLoading = state.status == AuthStatus.authenticating; - - return TripzScaffold( - backgroundColor: cs.surfaceContainerLow, - padding: false, - safeAreaBottom: false, - bottomAction: TripzButton( - onPressed: (_valid && !isLoading) ? () => _sendOtp(context) : null, - label: l10n.sendCode, - loading: isLoading, - ), - child: Column( - children: [ - // ── منطقة الشعار (النصف العلوي) ── - Expanded( - child: Center( - child: Padding( - padding: const EdgeInsets.symmetric(horizontal: T.s32), - child: Image.asset( - 'assets/images/login_hero.png', - width: 200, - fit: BoxFit.contain, - errorBuilder: (_, __, ___) => Icon( - Icons.directions_car_filled_rounded, - size: 96, - color: cs.primary, - ), - ), - ), - ), - ), - - // ── بطاقة الإدخال السفلية (منطقة الإبهام) ── - Container( - width: double.infinity, - decoration: BoxDecoration( - color: cs.surfaceContainerLowest, - borderRadius: const BorderRadius.vertical(top: Radius.circular(T.r24)), - boxShadow: const [T.shadowLg], - ), - padding: const EdgeInsets.fromLTRB(T.pagePadding, T.s16, T.pagePadding, T.s32), - child: SafeArea( - top: false, - child: Column( - mainAxisSize: MainAxisSize.min, - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - // مقبض السحب الزخرفي - Center( - child: Container( - width: 40, - height: 4, - decoration: BoxDecoration( - color: cs.outlineVariant, - borderRadius: BorderRadius.circular(T.rCircle), - ), - ), - ), - const SizedBox(height: T.s24), - - // العنوان - Text( - l10n.loginTitle, - style: theme.textTheme.headlineSmall?.copyWith( - fontWeight: FontWeight.w600, - color: cs.onSurface, - ), - ), - const SizedBox(height: T.s8), - Text( - l10n.phoneLoginSubtitle, - style: theme.textTheme.bodyMedium?.copyWith( - color: cs.onSurfaceVariant, - ), - ), - const SizedBox(height: T.s24), - - // حقل الهاتف — علم + كود الدولة (افتراضي BuildConfig.defaultCountry) + الرقم - IntlPhoneField( - initialCountryCode: BuildConfig.defaultCountry, - languageCode: Localizations.localeOf(context).languageCode, - textAlign: TextAlign.left, - style: theme.textTheme.bodyLarge, - dropdownTextStyle: theme.textTheme.bodyLarge, - flagsButtonPadding: const EdgeInsets.symmetric(horizontal: T.s12), - dropdownDecoration: BoxDecoration( - border: BorderDirectional( - end: BorderSide(color: cs.outlineVariant), - ), - ), - decoration: InputDecoration( - hintText: l10n.phoneHint, - filled: true, - fillColor: cs.surfaceContainerLowest, - border: OutlineInputBorder( - borderRadius: BorderRadius.circular(T.r8), - borderSide: BorderSide(color: cs.outlineVariant), - ), - enabledBorder: OutlineInputBorder( - borderRadius: BorderRadius.circular(T.r8), - borderSide: BorderSide(color: cs.outlineVariant), - ), - focusedBorder: OutlineInputBorder( - borderRadius: BorderRadius.circular(T.r8), - borderSide: BorderSide(color: cs.primary, width: 1.5), - ), - contentPadding: const EdgeInsets.symmetric(horizontal: T.s16, vertical: T.s16), - ), - onChanged: (phone) { - _phoneNumber = phone; - final num = phone.number; - _valid = num.isNotEmpty && num.length >= 7; - setState(() {}); - }, - ), - ], - ), - ), - ), - ], - ), - ); - }, - ); - } -} diff --git a/apps/rider-archive-cubit/lib/features/home/cubit/destination_cubit.dart b/apps/rider-archive-cubit/lib/features/home/cubit/destination_cubit.dart deleted file mode 100644 index e746c85..0000000 --- a/apps/rider-archive-cubit/lib/features/home/cubit/destination_cubit.dart +++ /dev/null @@ -1,108 +0,0 @@ -import 'dart:async'; -import 'package:equatable/equatable.dart'; -import 'package:flutter_bloc/flutter_bloc.dart'; -import 'package:flutter/foundation.dart'; -import '../data/maps_repository.dart'; -import '../data/models/place_model.dart'; - -/// حالة شاشة البحث عن الوجهة. -class DestinationState extends Equatable { - final String query; - final List results; - final bool searching; - final String? error; - - const DestinationState({ - this.query = '', - this.results = const [], - this.searching = false, - this.error, - }); - - DestinationState copyWith({ - String? query, - List? results, - bool? searching, - String? error, - bool clearError = false, - }) { - return DestinationState( - query: query ?? this.query, - results: results ?? this.results, - searching: searching ?? this.searching, - error: clearError ? null : (error ?? this.error), - ); - } - - @override - List get props => [query, results, searching, error]; -} - -/// البحث عن وجهة مع debounce. -class DestinationCubit extends Cubit { - final MapsRepository _mapsRepo; - Timer? _debounce; - - DestinationCubit(this._mapsRepo) : super(const DestinationState()); - - void onQueryChanged(String query) { - _debounce?.cancel(); - emit(state.copyWith(query: query, clearError: true)); - - if (query.trim().length < 2) { - emit(state.copyWith(results: [], searching: false)); - return; - } - - emit(state.copyWith(searching: true)); - - _debounce = Timer(const Duration(milliseconds: 500), () { - _search(query); - }); - } - - Future _search(String query) async { - try { - final results = await _mapsRepo.search(query); - emit(state.copyWith(results: results, searching: false)); - } catch (e) { - emit(state.copyWith( - searching: false, error: e.toString(), clearError: false)); - } - } - - Future searchDirectly(String query) async { - _debounce?.cancel(); - if (query.trim().length < 2) return; - emit(state.copyWith(searching: true, clearError: true)); - try { - final results = await _mapsRepo.search(query); - emit(state.copyWith(results: results, searching: false)); - } catch (e, st) { - debugPrint('Map Search Error: $e\n$st'); - emit(state.copyWith( - searching: false, error: e.toString(), clearError: false)); - } - } - - Future searchVoiceDirectly(String query, - {double? lat, double? lng}) async { - _debounce?.cancel(); - if (query.trim().isEmpty) return; - emit(state.copyWith(searching: true, clearError: true)); - try { - final results = await _mapsRepo.voiceSearch(query, lat: lat, lng: lng); - emit(state.copyWith(results: results, searching: false)); - } catch (e, st) { - debugPrint('Map Voice Search Error: $e\n$st'); - emit(state.copyWith( - searching: false, error: e.toString(), clearError: false)); - } - } - - @override - Future close() { - _debounce?.cancel(); - return super.close(); - } -} diff --git a/apps/rider-archive-cubit/lib/features/home/cubit/home_cubit.dart b/apps/rider-archive-cubit/lib/features/home/cubit/home_cubit.dart deleted file mode 100644 index b9693c5..0000000 --- a/apps/rider-archive-cubit/lib/features/home/cubit/home_cubit.dart +++ /dev/null @@ -1,135 +0,0 @@ -import 'dart:async'; -import 'package:equatable/equatable.dart'; -import 'package:flutter_bloc/flutter_bloc.dart'; -import 'package:geolocator/geolocator.dart'; -import 'package:intaleq_maps/intaleq_maps.dart'; -import '../data/maps_repository.dart'; -import '../data/models/place_model.dart'; - -/// حالة شاشة الخريطة الرئيسية. -class HomeState extends Equatable { - final bool loading; - final LatLng? currentLocation; - final LatLng? cameraTarget; - final PlaceModel? pickup; - final PlaceModel? destination; - final String? error; - - const HomeState({ - this.loading = true, - this.currentLocation, - this.cameraTarget, - this.pickup, - this.destination, - this.error, - }); - - HomeState copyWith({ - bool? loading, - LatLng? currentLocation, - LatLng? cameraTarget, - PlaceModel? pickup, - PlaceModel? destination, - String? error, - bool clearPickup = false, - bool clearDestination = false, - bool clearError = false, - }) { - return HomeState( - loading: loading ?? this.loading, - currentLocation: currentLocation ?? this.currentLocation, - cameraTarget: cameraTarget ?? this.cameraTarget, - pickup: clearPickup ? null : (pickup ?? this.pickup), - destination: clearDestination ? null : (destination ?? this.destination), - error: clearError ? null : (error ?? this.error), - ); - } - - @override - List get props => [loading, currentLocation, cameraTarget, pickup, destination, error]; -} - -/// إدارة موقع المستخدم الحالي + الخريطة. -class HomeCubit extends Cubit { - final MapsRepository _mapsRepo; - - HomeCubit(this._mapsRepo) : super(const HomeState()) { - initLocation(); - } - - Future initLocation() async { - try { - emit(state.copyWith(loading: true, clearError: true)); - - LocationPermission permission = await Geolocator.checkPermission(); - if (permission == LocationPermission.denied) { - permission = await Geolocator.requestPermission(); - if (permission == LocationPermission.denied || - permission == LocationPermission.deniedForever) { - emit(state.copyWith( - loading: false, - error: 'Location permission denied', - )); - return; - } - } - - final pos = await Geolocator.getCurrentPosition( - locationSettings: const LocationSettings( - accuracy: LocationAccuracy.high, - timeLimit: Duration(seconds: 10), - ), - ); - final loc = LatLng(pos.latitude, pos.longitude); - - // نوسّط الكاميرا على الموقع فوراً — لا ننتظر العنوان العكسي. - emit(state.copyWith( - loading: false, - currentLocation: loc, - cameraTarget: loc, - )); - - // العنوان العكسي تحسين إضافي: فشله يجب ألّا يمنع توسيط الخريطة. - try { - final place = await _mapsRepo.reverseGeocode(pos.latitude, pos.longitude); - emit(state.copyWith(pickup: place)); - } catch (_) { - emit(state.copyWith( - pickup: PlaceModel(name: '', lat: loc.latitude, lng: loc.longitude), - )); - } - } catch (e) { - emit(state.copyWith( - loading: false, - error: e.toString(), - )); - } - } - - void updateCameraTarget(LatLng target) { - emit(state.copyWith(cameraTarget: target)); - } - - void setPickup(PlaceModel place) { - emit(state.copyWith(pickup: place)); - } - - void setPickupFromLatLng(LatLng loc, {String? address}) { - emit(state.copyWith( - pickup: PlaceModel( - name: address ?? '', - address: address, - lat: loc.latitude, - lng: loc.longitude, - ), - )); - } - - void setDestination(PlaceModel place) { - emit(state.copyWith(destination: place)); - } - - void clearTripData() { - emit(state.copyWith(clearPickup: true, clearDestination: true, clearError: true)); - } -} diff --git a/apps/rider-archive-cubit/lib/features/home/cubit/quote_cubit.dart b/apps/rider-archive-cubit/lib/features/home/cubit/quote_cubit.dart deleted file mode 100644 index 75a14bd..0000000 --- a/apps/rider-archive-cubit/lib/features/home/cubit/quote_cubit.dart +++ /dev/null @@ -1,108 +0,0 @@ -import 'package:equatable/equatable.dart'; -import 'package:flutter_bloc/flutter_bloc.dart'; -import '../data/tariff_repository.dart'; -import '../data/models/quote_model.dart'; - -/// حالة شاشة اختيار فئة الرحلة + السعر. -class QuoteState extends Equatable { - final bool loading; - final QuoteModel? quote; - final String? selectedClass; - final String paymentMethod; - final String? couponCode; - final String? error; - - const QuoteState({ - this.loading = false, - this.quote, - this.selectedClass, - this.paymentMethod = 'cash', - this.couponCode, - this.error, - }); - - QuoteState copyWith({ - bool? loading, - QuoteModel? quote, - String? selectedClass, - String? paymentMethod, - String? couponCode, - String? error, - bool clearError = false, - bool clearCoupon = false, - }) { - return QuoteState( - loading: loading ?? this.loading, - quote: quote ?? this.quote, - selectedClass: selectedClass ?? this.selectedClass, - paymentMethod: paymentMethod ?? this.paymentMethod, - couponCode: clearCoupon ? null : (couponCode ?? this.couponCode), - error: clearError ? null : (error ?? this.error), - ); - } - - QuoteClassModel? get selectedQuoteClass { - if (quote == null || selectedClass == null) return null; - try { - return quote!.classes.firstWhere((c) => c.vehicleClass == selectedClass); - } catch (_) { - return null; - } - } - - @override - List get props => [loading, quote, selectedClass, paymentMethod, couponCode, error]; -} - -/// جلب الأسعار واختيار الفئة. -class QuoteCubit extends Cubit { - final TariffRepository _tariffRepo; - - QuoteCubit(this._tariffRepo) : super(const QuoteState()); - - Future fetchQuote({ - required double pickupLat, - required double pickupLng, - String? pickupAddress, - required double dropoffLat, - required double dropoffLng, - String? dropoffAddress, - List>? stops, - String? vehicleClass, - String? scheduledAt, - }) async { - emit(state.copyWith(loading: true, clearError: true)); - try { - final quote = await _tariffRepo.getQuote( - pickupLat: pickupLat, - pickupLng: pickupLng, - pickupAddress: pickupAddress, - dropoffLat: dropoffLat, - dropoffLng: dropoffLng, - dropoffAddress: dropoffAddress, - vehicleClass: vehicleClass, - scheduledAt: scheduledAt, - ); - final firstClass = quote.classes.isNotEmpty ? quote.classes.first.vehicleClass : null; - emit(state.copyWith( - loading: false, - quote: quote, - selectedClass: firstClass, - )); - } catch (e) { - emit(state.copyWith(loading: false, error: e.toString())); - } - } - - void selectClass(String vehicleClass) { - emit(state.copyWith(selectedClass: vehicleClass)); - } - - void setPaymentMethod(String method) { - emit(state.copyWith(paymentMethod: method)); - } - - void setCouponCode(String? code) { - emit(state.copyWith(couponCode: code)); - } -} diff --git a/apps/rider-archive-cubit/lib/features/home/cubit/saved_places_cubit.dart b/apps/rider-archive-cubit/lib/features/home/cubit/saved_places_cubit.dart deleted file mode 100644 index bab7294..0000000 --- a/apps/rider-archive-cubit/lib/features/home/cubit/saved_places_cubit.dart +++ /dev/null @@ -1,79 +0,0 @@ -import 'package:flutter_bloc/flutter_bloc.dart'; - -import '../../../core/storage/saved_places_store.dart'; - -class SavedPlacesState { - final List places; - final bool loading; - final String? error; - - const SavedPlacesState({ - this.places = const [], - this.loading = false, - this.error, - }); - - SavedPlacesState copyWith({ - List? places, - bool? loading, - String? error, - }) { - return SavedPlacesState( - places: places ?? this.places, - loading: loading ?? this.loading, - error: error, - ); - } -} - -class SavedPlacesCubit extends Cubit { - final SavedPlacesStore _store; - - SavedPlacesCubit(this._store) : super(const SavedPlacesState()); - - Future load() async { - emit(state.copyWith(loading: true, error: null)); - try { - final places = await _store.getAll(); - emit(SavedPlacesState(places: places)); - } catch (e) { - emit(state.copyWith(loading: false, error: e.toString())); - } - } - - Future addPlace(SavedPlace place) async { - try { - await _store.add(place); - await load(); - } catch (e) { - emit(state.copyWith(error: e.toString())); - } - } - - Future removePlace(String id) async { - try { - await _store.remove(id); - await load(); - } catch (e) { - emit(state.copyWith(error: e.toString())); - } - } - - Future setFavorite(String id, FavoriteType type) async { - try { - await _store.setFavorite(id, type); - await load(); - } catch (e) { - emit(state.copyWith(error: e.toString())); - } - } - - Future clearFavorite(FavoriteType type) async { - try { - await _store.clearFavorite(type); - await load(); - } catch (e) { - emit(state.copyWith(error: e.toString())); - } - } -} diff --git a/apps/rider-archive-cubit/lib/features/home/data/maps_repository.dart b/apps/rider-archive-cubit/lib/features/home/data/maps_repository.dart deleted file mode 100644 index a962244..0000000 --- a/apps/rider-archive-cubit/lib/features/home/data/maps_repository.dart +++ /dev/null @@ -1,85 +0,0 @@ -import '../../../core/api/antlaq_api.dart'; -import '../../../core/api/api_client.dart'; -import 'models/place_model.dart'; -import 'models/route_model.dart'; - -/// نقطة وصول وحيدة لبيانات الخرائط والبحث الصوتي الذكي عبر الباك إند. -class MapsRepository { - final AntlaqApi _api; - final ApiClient? _apiClient; - - MapsRepository(this._api, [this._apiClient]); - - /// بحث صوتي ذكي يمر عبر الباك إند (Gemini AI). - Future> voiceSearch(String text, {double? lat, double? lng}) async { - if (text.trim().isEmpty) return []; - try { - if (_apiClient != null) { - final res = await _apiClient.dio.post('/maps/voice-search', data: { - 'text': text, - if (lat != null) 'lat': lat, - if (lng != null) 'lng': lng, - }); - final list = res.data as List?; - if (list != null) { - return list - .map((e) => PlaceModel.fromJson(e as Map)) - .toList(); - } - } - } catch (_) {} - return search(text); - } - - /// بحث أماكن — يمر عبر GET /api/geocoding/search. - Future> search(String query) async { - if (query.trim().length < 2) return []; - final items = await _api.search(query); - return items - .map((e) => PlaceModel.fromJson(e as Map)) - .toList(); - } - - /// تفكيك عنوان عكسي (إحداثيات → نص). - Future reverseGeocode(double lat, double lng) async { - final j = await _api.reverse(lat, lng); - final name = (j['name_ar'] ?? j['name'] ?? j['formattedAddress'] ?? '') as String; - final addr = (j['address'] ?? j['full_address'] ?? j['formattedAddress'] ?? '') as String; - return PlaceModel.fromJson({ - 'name': name, - 'full_address': addr.isNotEmpty ? addr : name, - 'latitude': lat, - 'longitude': lng, - }); - } - - /// حساب المسار بين نقطتين عبر الباك إند (GET /maps/route). - Future getRoute({ - required double fromLat, - required double fromLng, - required double toLat, - required double toLng, - }) async { - try { - if (_apiClient != null) { - final res = await _apiClient.dio.get('/maps/route', queryParameters: { - 'fromLat': fromLat, - 'fromLng': fromLng, - 'toLat': toLat, - 'toLng': toLng, - }); - if (res.data != null && res.data is Map) { - return RouteModel.fromJson(res.data as Map); - } - } - } catch (_) {} - - final j = await _api.route( - fromLat: fromLat, - fromLng: fromLng, - toLat: toLat, - toLng: toLng, - ); - return RouteModel.fromJson(j); - } -} diff --git a/apps/rider-archive-cubit/lib/features/home/data/models/gate_model.dart b/apps/rider-archive-cubit/lib/features/home/data/models/gate_model.dart deleted file mode 100644 index 766a2b8..0000000 --- a/apps/rider-archive-cubit/lib/features/home/data/models/gate_model.dart +++ /dev/null @@ -1,32 +0,0 @@ -import 'package:equatable/equatable.dart'; -import 'package:intaleq_maps/intaleq_maps.dart'; - -/// باب/مدخل مكان — من استجابة انطلق. -class Gate extends Equatable { - final String nameAr; - final String nameEn; - final double lat; - final double lng; - final bool isMainGate; - - const Gate({ - required this.nameAr, - required this.nameEn, - required this.lat, - required this.lng, - this.isMainGate = false, - }); - - factory Gate.fromJson(Map j) => Gate( - nameAr: (j['name_ar'] ?? '') as String, - nameEn: (j['name_en'] ?? '') as String, - lat: (j['latitude'] as num).toDouble(), - lng: (j['longitude'] as num).toDouble(), - isMainGate: j['is_main_gate'] as bool? ?? false, - ); - - LatLng get latLng => LatLng(lat, lng); - - @override - List get props => [nameAr, nameEn, lat, lng, isMainGate]; -} diff --git a/apps/rider-archive-cubit/lib/features/home/data/models/place_model.dart b/apps/rider-archive-cubit/lib/features/home/data/models/place_model.dart deleted file mode 100644 index 6fa0da3..0000000 --- a/apps/rider-archive-cubit/lib/features/home/data/models/place_model.dart +++ /dev/null @@ -1,71 +0,0 @@ -import 'package:equatable/equatable.dart'; -import 'gate_model.dart'; - -/// نموذج مكان من نتائج بحث انطلق (geocode / search). -class PlaceModel extends Equatable { - final String? placeId; - final String name; - final String? address; - final double lat; - final double lng; - final String? category; - final double? totalScore; - final String? source; - final List gates; - - const PlaceModel({ - this.placeId, - required this.name, - this.address, - required this.lat, - required this.lng, - this.category, - this.totalScore, - this.source, - this.gates = const [], - }); - - /// استجابة انطلق الحقيقية — الحقول الم标准. - factory PlaceModel.fromJson(Map j) { - final lat = (j['latitude'] ?? j['location']?['lat'] ?? 0) as num; - final lng = (j['longitude'] ?? j['location']?['lng'] ?? 0) as num; - return PlaceModel( - placeId: j['id'] as String?, - name: (j['name'] ?? '') as String, - address: (j['full_address'] ?? j['address']) as String?, - lat: lat.toDouble(), - lng: lng.toDouble(), - category: j['category'] as String?, - totalScore: (j['totalScore'] as num?)?.toDouble(), - source: j['source'] as String?, - gates: (j['gates'] as List?) - ?.map((g) => Gate.fromJson(g as Map)) - .toList() ?? - const [], - ); - } - - Map toJson() => { - if (placeId != null) 'id': placeId, - 'name': name, - if (address != null) 'full_address': address, - 'latitude': lat, - 'longitude': lng, - if (category != null) 'category': category, - if (totalScore != null) 'totalScore': totalScore, - if (source != null) 'source': source, - }; - - /// هل لهذا المكان أبواب متعددة? - bool get hasMultipleGates => gates.length > 1; - - /// الباب الرئيسي إن وُجد. - Gate? get mainGate => gates.cast().firstWhere( - (g) => g!.isMainGate, - orElse: () => null, - ); - - @override - List get props => - [placeId, name, address, lat, lng, category, totalScore, source, gates]; -} diff --git a/apps/rider-archive-cubit/lib/features/home/data/models/quote_model.dart b/apps/rider-archive-cubit/lib/features/home/data/models/quote_model.dart deleted file mode 100644 index ea7fc32..0000000 --- a/apps/rider-archive-cubit/lib/features/home/data/models/quote_model.dart +++ /dev/null @@ -1,85 +0,0 @@ -import 'package:equatable/equatable.dart'; - -/// فئة رحلة واحدة من الاستجابة (tariff/quote). -class QuoteClassModel extends Equatable { - final String vehicleClass; - final String name; - final int price; - final String currency; - final int capacity; - final String? description; - final String? imageUrl; - final int estimatedTime; // ثوانٍ تقريبية - - const QuoteClassModel({ - required this.vehicleClass, - required this.name, - required this.price, - required this.currency, - required this.capacity, - this.description, - this.imageUrl, - required this.estimatedTime, - }); - - factory QuoteClassModel.fromJson(Map j) => QuoteClassModel( - vehicleClass: j['vehicleClass'] as String, - name: (j['name'] ?? j['vehicleClass']) as String, - price: j['price'] as int, - currency: (j['currency'] ?? 'JOD') as String, - capacity: j['capacity'] as int? ?? 4, - description: j['description'] as String?, - imageUrl: j['imageUrl'] as String?, - estimatedTime: j['estimatedTime'] as int? ?? 0, - ); - - String get estimatedTimeText { - final min = estimatedTime ~/ 60; - return '$min min'; - } - - @override - List get props => [vehicleClass, name, price, currency, capacity]; -} - -/// استجابة tariff/quote الكاملة. -class QuoteModel extends Equatable { - final String? pickupAddress; - final String? dropoffAddress; - final int distanceMeters; - final int durationSeconds; - final String? distanceText; - final String? durationText; - final String currency; - final List classes; - - const QuoteModel({ - this.pickupAddress, - this.dropoffAddress, - required this.distanceMeters, - required this.durationSeconds, - this.distanceText, - this.durationText, - required this.currency, - required this.classes, - }); - - factory QuoteModel.fromJson(Map j) { - final data = j['data'] ?? j; - return QuoteModel( - pickupAddress: data['pickupAddress'] as String?, - dropoffAddress: data['dropoffAddress'] as String?, - distanceMeters: (data['distanceMeters'] as num?)?.toInt() ?? 0, - durationSeconds: (data['durationSeconds'] as num?)?.toInt() ?? 0, - distanceText: data['distanceText'] as String?, - durationText: data['durationText'] as String?, - currency: (data['currency'] ?? 'JOD') as String, - classes: (data['classes'] as List? ?? []) - .map((c) => QuoteClassModel.fromJson(c as Map)) - .toList(), - ); - } - - @override - List get props => [distanceMeters, durationSeconds, currency, classes]; -} diff --git a/apps/rider-archive-cubit/lib/features/home/data/models/ride_type_model.dart b/apps/rider-archive-cubit/lib/features/home/data/models/ride_type_model.dart deleted file mode 100644 index 3392050..0000000 --- a/apps/rider-archive-cubit/lib/features/home/data/models/ride_type_model.dart +++ /dev/null @@ -1,35 +0,0 @@ -import 'package:equatable/equatable.dart'; - -/// فئة رحلة من ride-types endpoint (تُستخدم كقائمة المرجع). -class RideTypeModel extends Equatable { - final String id; - final String name; - final String? vehicleClass; - final int capacity; - final String? description; - final String? imageUrl; - final bool active; - - const RideTypeModel({ - required this.id, - required this.name, - this.vehicleClass, - required this.capacity, - this.description, - this.imageUrl, - required this.active, - }); - - factory RideTypeModel.fromJson(Map j) => RideTypeModel( - id: j['id'] as String, - name: (j['name'] ?? '') as String, - vehicleClass: j['vehicleClass'] as String?, - capacity: j['capacity'] as int? ?? 4, - description: j['description'] as String?, - imageUrl: j['imageUrl'] as String?, - active: j['active'] as bool? ?? true, - ); - - @override - List get props => [id, name, vehicleClass, capacity, active]; -} diff --git a/apps/rider-archive-cubit/lib/features/home/data/models/route_model.dart b/apps/rider-archive-cubit/lib/features/home/data/models/route_model.dart deleted file mode 100644 index 17e3f23..0000000 --- a/apps/rider-archive-cubit/lib/features/home/data/models/route_model.dart +++ /dev/null @@ -1,103 +0,0 @@ -import 'package:equatable/equatable.dart'; -import 'package:intaleq_maps/intaleq_maps.dart'; - -/// استجابة مسار من انطلق — مع polyline مشفر وإطار خريطة. -class RouteModel extends Equatable { - final int distanceMeters; - final int durationSeconds; - final String? polyline; - final String? routeName; - final String? startName; - final String? endName; - final List? tags; - final List? bbox; - final double? trafficFactor; - - const RouteModel({ - required this.distanceMeters, - required this.durationSeconds, - this.polyline, - this.routeName, - this.startName, - this.endName, - this.tags, - this.bbox, - this.trafficFactor, - }); - - /// استجابة مسار انطلق الحقيقية (تُمرر عبر الباك إند كما هي). - factory RouteModel.fromJson(Map j) { - final dist = (j['distance'] ?? 0) as num; - final dur = (j['duration'] ?? 0) as num; - return RouteModel( - distanceMeters: dist.toInt(), - durationSeconds: dur.toInt(), - polyline: j['points'] as String?, - routeName: j['routeName'] as String?, - startName: j['startName'] as String?, - endName: j['endName'] as String?, - tags: (j['tags'] as List?)?.cast(), - bbox: (j['bbox'] as List?)?.map((e) => (e as num).toDouble()).toList(), - trafficFactor: (j['trafficFactor'] as num?)?.toDouble(), - ); - } - - String get distanceText { - if (distanceMeters < 1000) return '$distanceMeters m'; - return '${(distanceMeters / 1000).toStringAsFixed(1)} km'; - } - - String get durationText { - final min = durationSeconds ~/ 60; - if (min < 60) return '$min min'; - final h = min ~/ 60; - final rem = min % 60; - return '$h h ${rem > 0 ? '$rem min' : ''}'; - } - - /// تحويل bbox إلى LatLngBounds لضبط الكاميرا مع حماية للمواقع القريبة على iOS. - LatLngBounds? getLatLngBounds() { - if (bbox == null || bbox!.length < 4) return null; - var minLat = bbox![1]; - var minLng = bbox![0]; - var maxLat = bbox![3]; - var maxLng = bbox![2]; - - // إذا كانت المسافة بين النقاط قريبة جداً (أقل من 0.002 درجة)، نضمن توسعاً أمنياً أدنى لمنع عطل وقفل كاميرا MapLibre على iOS - if ((maxLat - minLat).abs() < 0.002) { - minLat -= 0.001; - maxLat += 0.001; - } - if ((maxLng - minLng).abs() < 0.002) { - minLng -= 0.001; - maxLng += 0.001; - } - - return LatLngBounds( - southwest: LatLng(minLat, minLng), - northeast: LatLng(maxLat, maxLng), - ); - } - - /// فك الـ polyline عبر PolylineUtils من الباكيج. - List decodePolyline() { - if (polyline == null || polyline!.isEmpty) return []; - return PolylineUtils.decode(polyline!); - } - - /// هل المسار مباشر (لا أضلاع)? - bool get isStraightLine => tags?.contains('straight-line') ?? false; - - @override - List get props => [ - distanceMeters, - durationSeconds, - polyline, - routeName, - startName, - endName, - tags, - bbox, - trafficFactor, - ]; -} diff --git a/apps/rider-archive-cubit/lib/features/home/data/models/stop_model.dart b/apps/rider-archive-cubit/lib/features/home/data/models/stop_model.dart deleted file mode 100644 index f3db48f..0000000 --- a/apps/rider-archive-cubit/lib/features/home/data/models/stop_model.dart +++ /dev/null @@ -1,33 +0,0 @@ -import 'package:equatable/equatable.dart'; - -/// نقطة توقف أثناء الرحلة. -class StopModel extends Equatable { - final double lat; - final double lng; - final String? label; - final String? address; - - const StopModel({ - required this.lat, - required this.lng, - this.label, - this.address, - }); - - factory StopModel.fromJson(Map j) => StopModel( - lat: (j['lat'] as num).toDouble(), - lng: (j['lng'] as num).toDouble(), - label: j['label'] as String?, - address: j['address'] as String?, - ); - - Map toJson() => { - 'lat': lat, - 'lng': lng, - if (label != null) 'label': label, - if (address != null) 'address': address, - }; - - @override - List get props => [lat, lng, label, address]; -} diff --git a/apps/rider-archive-cubit/lib/features/home/data/ride_types_repository.dart b/apps/rider-archive-cubit/lib/features/home/data/ride_types_repository.dart deleted file mode 100644 index 330c5ce..0000000 --- a/apps/rider-archive-cubit/lib/features/home/data/ride_types_repository.dart +++ /dev/null @@ -1,17 +0,0 @@ -import '../../../core/api/api_client.dart'; -import 'models/ride_type_model.dart'; - -/// جلب فئات الرحلة المتاحة من المستأجر. -class RideTypesRepository { - final ApiClient _api; - RideTypesRepository(this._api); - - /// GET /ride-types — تُستخدم كمرجع للفئات النشطة. - Future> getRideTypes() async { - final r = await _api.dio.get('/ride-types'); - final items = (r.data['items'] ?? r.data ?? []) as List; - return items - .map((e) => RideTypeModel.fromJson(e as Map)) - .toList(); - } -} diff --git a/apps/rider-archive-cubit/lib/features/home/data/tariff_repository.dart b/apps/rider-archive-cubit/lib/features/home/data/tariff_repository.dart deleted file mode 100644 index 4cc44ac..0000000 --- a/apps/rider-archive-cubit/lib/features/home/data/tariff_repository.dart +++ /dev/null @@ -1,45 +0,0 @@ -import '../../../core/api/api_client.dart'; -import 'models/quote_model.dart'; -import 'models/stop_model.dart'; - -/// استخراج الأسعار لكل فئة رحلة. -class TariffRepository { - final ApiClient _api; - TariffRepository(this._api); - - /// جلب عرض أسعار للمسار المحدد — POST /tariff/quote. - /// - /// الاستجابة تحتوي `classes[]` بسعر لكل فئة مع breakdown. - Future getQuote({ - required double pickupLat, - required double pickupLng, - required String? pickupAddress, - required double dropoffLat, - required double dropoffLng, - required String? dropoffAddress, - List? stops, - String? vehicleClass, - String? scheduledAt, - }) async { - final data = { - 'pickup': { - 'lat': pickupLat, - 'lng': pickupLng, - if (pickupAddress != null) 'address': pickupAddress, - }, - 'dropoff': { - 'lat': dropoffLat, - 'lng': dropoffLng, - if (dropoffAddress != null) 'address': dropoffAddress, - }, - }; - if (stops != null && stops.isNotEmpty) { - data['stops'] = stops.nonNulls.map((s) => s.toJson()).toList(); - } - if (vehicleClass != null) data['vehicleClass'] = vehicleClass; - if (scheduledAt != null) data['scheduledAt'] = scheduledAt; - - final r = await _api.dio.post('/tariff/quote', data: data); - return QuoteModel.fromJson(r.data as Map); - } -} diff --git a/apps/rider-archive-cubit/lib/features/home/view/destination_screen.dart b/apps/rider-archive-cubit/lib/features/home/view/destination_screen.dart deleted file mode 100644 index aae1e68..0000000 --- a/apps/rider-archive-cubit/lib/features/home/view/destination_screen.dart +++ /dev/null @@ -1,1040 +0,0 @@ -import 'package:flutter/material.dart'; -import 'package:flutter_bloc/flutter_bloc.dart'; -import 'package:go_router/go_router.dart'; -import 'package:intaleq_maps/intaleq_maps.dart'; -import '../../../core/l10n/app_localizations.dart'; -import '../../../core/design/tokens.dart'; -import '../../../core/design/tripz_colors.dart'; -import '../../../core/di.dart'; -import '../cubit/destination_cubit.dart'; -import '../data/maps_repository.dart'; -import '../data/models/place_model.dart'; - -const int _maxStops = 2; - -class DestinationScreen extends StatefulWidget { - final LatLng? currentLocation; - - const DestinationScreen({super.key, this.currentLocation}); - - @override - State createState() => _DestinationScreenState(); -} - -class _DestinationScreenState extends State { - final _destController = TextEditingController(); - final _destFocusNode = FocusNode(); - final _stopControllers = []; - final _stopFocusNodes = []; - int _editingStopIndex = -1; - String? _pickupAddressName; - bool _forSelf = true; - - @override - void initState() { - super.initState(); - _destFocusNode.requestFocus(); - _loadReverseGeocodePickup(); - } - - Future _loadReverseGeocodePickup() async { - final loc = widget.currentLocation; - if (loc != null) { - try { - final repo = getIt(); - final place = await repo.reverseGeocode(loc.latitude, loc.longitude); - if (mounted && place.name.isNotEmpty) { - setState(() { - _pickupAddressName = place.name; - }); - } - } catch (_) {} - } - } - - void _swapLocations() { - setState(() { - final oldDest = _destController.text; - if (_stopControllers.isNotEmpty) { - _destController.text = _stopControllers.first.text; - _stopControllers.first.text = oldDest; - } else if (_pickupAddressName != null && _pickupAddressName!.isNotEmpty) { - _destController.text = _pickupAddressName!; - _pickupAddressName = oldDest.isNotEmpty ? oldDest : _pickupAddressName; - } - }); - } - - void _showAiVoiceSearchDialog(BuildContext context) { - final voiceController = TextEditingController(); - final l10n = AppLocalizations.of(context)!; - final cs = Theme.of(context).colorScheme; - - showModalBottomSheet( - context: context, - isScrollControlled: true, - backgroundColor: Colors.transparent, - builder: (modalCtx) { - return Container( - padding: EdgeInsets.only( - bottom: MediaQuery.of(modalCtx).viewInsets.bottom + T.s24, - top: T.s24, - left: T.pagePadding, - right: T.pagePadding, - ), - decoration: BoxDecoration( - color: cs.surface, - borderRadius: - const BorderRadius.vertical(top: Radius.circular(T.r24)), - ), - child: Column( - mainAxisSize: MainAxisSize.min, - children: [ - Container( - width: 64, - height: 64, - decoration: BoxDecoration( - color: cs.primaryContainer, - shape: BoxShape.circle, - ), - child: Icon(Icons.mic_rounded, - color: cs.onPrimaryContainer, size: 36), - ), - const SizedBox(height: T.s16), - Text( - 'البحث الصوتي الذكي (AI Voice)', - style: Theme.of(modalCtx).textTheme.titleMedium?.copyWith( - fontWeight: FontWeight.bold, - ), - ), - const SizedBox(height: T.s8), - Text( - 'قل وجهتك بصوتك أو اكتب وصف المكان (مثل: مجمع الأبحاث، الشميساني)', - textAlign: TextAlign.center, - style: Theme.of(modalCtx).textTheme.bodyMedium?.copyWith( - color: cs.onSurfaceVariant, - ), - ), - const SizedBox(height: T.s16), - TextField( - controller: voiceController, - autofocus: true, - decoration: InputDecoration( - hintText: 'تحدث أو اكتب المكان...', - prefixIcon: const Icon(Icons.graphic_eq_rounded), - border: OutlineInputBorder( - borderRadius: BorderRadius.circular(T.r12), - ), - ), - onSubmitted: (text) { - Navigator.pop(modalCtx); - if (text.trim().isNotEmpty) { - _destController.text = text; - final loc = widget.currentLocation; - context.read().searchVoiceDirectly( - text, - lat: loc?.latitude, - lng: loc?.longitude, - ); - } - }, - ), - const SizedBox(height: T.s16), - Row( - mainAxisAlignment: MainAxisAlignment.end, - children: [ - TextButton( - onPressed: () => Navigator.pop(modalCtx), - child: Text(l10n.cancel), - ), - const SizedBox(width: T.s8), - ElevatedButton.icon( - onPressed: () { - final text = voiceController.text; - Navigator.pop(modalCtx); - if (text.trim().isNotEmpty) { - _destController.text = text; - final loc = widget.currentLocation; - context.read().searchVoiceDirectly( - text, - lat: loc?.latitude, - lng: loc?.longitude, - ); - } - }, - icon: const Icon(Icons.search_rounded), - label: const Text('بحث بالذكاء الاصطناعي'), - ), - ], - ), - ], - ), - ); - }, - ); - } - - @override - void dispose() { - _destController.dispose(); - _destFocusNode.dispose(); - for (final c in _stopControllers) { - c.dispose(); - } - for (final f in _stopFocusNodes) { - f.dispose(); - } - super.dispose(); - } - - void _addStop() { - if (_stopControllers.length >= _maxStops) return; - setState(() { - _stopControllers.add(TextEditingController()); - _stopFocusNodes.add(FocusNode()); - _editingStopIndex = _stopControllers.length - 1; - }); - _stopFocusNodes.last.requestFocus(); - } - - void _removeStop(int index) { - setState(() { - _stopControllers[index].dispose(); - _stopFocusNodes[index].dispose(); - _stopControllers.removeAt(index); - _stopFocusNodes.removeAt(index); - if (_editingStopIndex == index) { - _editingStopIndex = -1; - } else if (_editingStopIndex > index) { - _editingStopIndex--; - } - }); - } - - void _selectPlace(dynamic result) { - context.pop(result); - } - - @override - Widget build(BuildContext context) { - final l10n = AppLocalizations.of(context)!; - final theme = Theme.of(context); - final cs = theme.colorScheme; - final tripz = context.tripzColors; - - return Scaffold( - backgroundColor: Colors.transparent, - extendBodyBehindAppBar: true, - appBar: AppBar( - backgroundColor: Colors.transparent, - elevation: 0, - leading: IconButton( - onPressed: () => context.pop(), - icon: const Icon(Icons.arrow_forward), - color: cs.onSurface, - style: IconButton.styleFrom( - backgroundColor: cs.surface, - shadowColor: Colors.black12, - elevation: 2, - ), - ), - title: Text( - l10n.selectDestination, - style: theme.textTheme.titleMedium, - ), - centerTitle: true, - ), - body: Stack( - children: [ - // Map background - Positioned.fill( - child: Container( - color: cs.surfaceContainerHighest, - child: Opacity( - opacity: 0.5, - child: Image.asset( - 'assets/images/destination_selection_img.png', - fit: BoxFit.cover, - errorBuilder: (_, __, ___) => const SizedBox.shrink(), - ), - ), - ), - ), - - // Map overlay gradient - Positioned.fill( - child: Container( - decoration: const BoxDecoration( - gradient: LinearGradient( - begin: Alignment.topCenter, - end: Alignment.bottomCenter, - colors: [Colors.black12, Colors.black38], - ), - ), - ), - ), - - // Draggable sheet - Positioned.fill( - child: DraggableScrollableSheet( - initialChildSize: 0.55, - minChildSize: 0.15, - maxChildSize: 0.88, - snap: true, - snapSizes: const [0.15, 0.55, 0.88], - builder: (context, scrollController) { - return Container( - decoration: BoxDecoration( - color: cs.surface, - borderRadius: const BorderRadius.vertical( - top: Radius.circular(T.r24)), - boxShadow: const [T.shadowLg], - ), - child: Column( - children: [ - // Drag handle - Center( - child: Padding( - padding: const EdgeInsets.symmetric(vertical: T.s12), - child: Container( - width: 48, - height: 4, - decoration: BoxDecoration( - color: cs.outlineVariant, - borderRadius: BorderRadius.circular(2), - ), - ), - ), - ), - - Expanded( - child: ListView( - controller: scrollController, - padding: EdgeInsets.zero, - children: [ - _buildFieldsSection( - context, l10n, theme, cs, tripz), - const SizedBox(height: T.s16), - _buildSavedPlaces(context, theme, cs), - const SizedBox(height: T.s8), - _buildAutocompleteResults(context, l10n, theme, cs), - _buildPickFromMap(context, l10n, cs), - const SizedBox(height: T.s32), - ], - ), - ), - ], - ), - ); - }, - ), - ), - ], - ), - ); - } - - Widget _buildFieldsSection( - BuildContext context, - AppLocalizations l10n, - ThemeData theme, - ColorScheme cs, - TripzColors tripz, - ) { - return Padding( - padding: const EdgeInsets.symmetric(horizontal: T.pagePadding), - child: Column( - children: [ - // Rider selection chip — "For me / For someone else" - Row( - children: [ - FilterChip( - selected: _forSelf, - label: const Text('طلب لنفسي'), - avatar: const Icon(Icons.person_rounded, size: 16), - onSelected: (val) => setState(() => _forSelf = true), - ), - const SizedBox(width: T.s8), - FilterChip( - selected: !_forSelf, - label: const Text('طلب لشخص آخر'), - avatar: const Icon(Icons.people_rounded, size: 16), - onSelected: (val) => setState(() => _forSelf = false), - ), - const Spacer(), - IconButton( - onPressed: _swapLocations, - icon: const Icon(Icons.swap_vert_rounded), - tooltip: 'تبديل الأماكن', - color: cs.primary, - ), - ], - ), - const SizedBox(height: T.s8), - - // Origin — green dot, reverse geocoded - _OriginRow( - l10n: l10n, - theme: theme, - cs: cs, - tripz: tripz, - addressName: _pickupAddressName, - ), - - // Stops - for (var i = 0; i < _stopControllers.length; i++) - _StopRow( - index: i, - controller: _stopControllers[i], - focusNode: _stopFocusNodes[i], - isEditing: _editingStopIndex == i, - l10n: l10n, - theme: theme, - cs: cs, - tripz: tripz, - onStopTapped: () { - setState(() => _editingStopIndex = i); - context.read().onQueryChanged(''); - _stopFocusNodes[i].requestFocus(); - }, - onStopChanged: (v) => - context.read().onQueryChanged(v), - onStopRemoved: () => _removeStop(i), - ), - - // Dotted connector between last stop / origin and destination - _DottedConnector(color: cs.outlineVariant), - - // Destination — red square, active with AI Voice Search button - _DestinationRow( - controller: _destController, - focusNode: _destFocusNode, - isEditing: _editingStopIndex == -1, - l10n: l10n, - theme: theme, - cs: cs, - tripz: tripz, - onFieldTapped: () { - setState(() => _editingStopIndex = -1); - context.read().onQueryChanged(''); - _destFocusNode.requestFocus(); - }, - onChanged: (v) => - context.read().onQueryChanged(v), - onVoiceSearchPressed: () => _showAiVoiceSearchDialog(context), - ), - - const SizedBox(height: T.s8), - - // Add stop button - if (_stopControllers.length < _maxStops) - Align( - alignment: Alignment.centerRight, - child: TextButton.icon( - onPressed: _addStop, - icon: const Icon(Icons.add, size: 18), - label: Text(l10n.addStop), - style: TextButton.styleFrom( - foregroundColor: cs.primary, - padding: const EdgeInsets.symmetric(vertical: T.s8), - minimumSize: Size.zero, - tapTargetSize: MaterialTapTargetSize.shrinkWrap, - ), - ), - ), - - const SizedBox(height: T.s12), - Divider(color: cs.outlineVariant.withValues(alpha: 0.3)), - const SizedBox(height: T.s12), - ], - ), - ); - } - - Widget _buildSavedPlaces( - BuildContext context, - ThemeData theme, - ColorScheme cs, - ) { - final l10n = AppLocalizations.of(context)!; - return SizedBox( - height: 52, - child: ListView( - scrollDirection: Axis.horizontal, - padding: const EdgeInsets.symmetric(horizontal: T.pagePadding), - children: [ - _SavedPlaceChip( - icon: Icons.home_rounded, - label: l10n.homePlace, - onTap: () {}, - ), - const SizedBox(width: T.s12), - _SavedPlaceChip( - icon: Icons.work_rounded, - label: l10n.workPlace, - onTap: () {}, - ), - const SizedBox(width: T.s12), - _SavedPlaceChip( - icon: Icons.star_rounded, - label: l10n.favorites, - onTap: () {}, - ), - ], - ), - ); - } - - Widget _buildAutocompleteResults( - BuildContext context, - AppLocalizations l10n, - ThemeData theme, - ColorScheme cs, - ) { - return BlocBuilder( - builder: (context, state) { - if (state.searching) { - return const Padding( - padding: EdgeInsets.symmetric(vertical: T.s24), - child: Center(child: CircularProgressIndicator()), - ); - } - if (state.results.isEmpty && state.query.length >= 2) { - return Padding( - padding: const EdgeInsets.symmetric(vertical: T.s24), - child: Center( - child: Text(l10n.noResults, style: theme.textTheme.bodyLarge), - ), - ); - } - return Column( - children: [ - for (var i = 0; i < state.results.length; i++) - _SearchResultTile( - place: state.results[i], - onTap: () => _selectPlace(state.results[i]), - ), - ], - ); - }, - ); - } - - Widget _buildPickFromMap( - BuildContext context, - AppLocalizations l10n, - ColorScheme cs, - ) { - return Padding( - padding: const EdgeInsets.symmetric( - horizontal: T.pagePadding, - vertical: T.s8, - ), - child: _PickFromMapTile( - onTap: () => _selectPlace({'pickFromMap': true}), - ), - ); - } -} - -// ── Origin row ── -class _OriginRow extends StatelessWidget { - final AppLocalizations l10n; - final ThemeData theme; - final ColorScheme cs; - final TripzColors tripz; - final String? addressName; - - const _OriginRow({ - required this.l10n, - required this.theme, - required this.cs, - required this.tripz, - this.addressName, - }); - - @override - Widget build(BuildContext context) { - return Padding( - padding: const EdgeInsets.only(bottom: T.s4), - child: Row( - children: [ - SizedBox( - width: 48, - child: Center( - child: Container( - width: 12, - height: 12, - decoration: BoxDecoration( - color: tripz.success, - shape: BoxShape.circle, - border: Border.all( - color: tripz.success.withValues(alpha: 0.25), - width: 4, - ), - ), - ), - ), - ), - Expanded( - child: Container( - padding: const EdgeInsets.symmetric( - horizontal: T.s12, - vertical: T.s12, - ), - decoration: BoxDecoration( - color: cs.surfaceContainerLow, - borderRadius: BorderRadius.circular(T.r12), - border: Border.all( - color: cs.outlineVariant.withValues(alpha: 0.3), - ), - ), - child: Text( - (addressName != null && addressName!.isNotEmpty) - ? addressName! - : l10n.pickupLocation, - style: theme.textTheme.bodyLarge?.copyWith( - color: (addressName != null && addressName!.isNotEmpty) - ? cs.onSurface - : cs.onSurfaceVariant, - fontWeight: (addressName != null && addressName!.isNotEmpty) - ? FontWeight.w600 - : FontWeight.normal, - ), - maxLines: 1, - overflow: TextOverflow.ellipsis, - ), - ), - ), - ], - ), - ); - } -} - -// ── Stop row ── -class _StopRow extends StatelessWidget { - final int index; - final TextEditingController controller; - final FocusNode focusNode; - final bool isEditing; - final AppLocalizations l10n; - final ThemeData theme; - final ColorScheme cs; - final TripzColors tripz; - final VoidCallback onStopTapped; - final ValueChanged onStopChanged; - final VoidCallback onStopRemoved; - - const _StopRow({ - required this.index, - required this.controller, - required this.focusNode, - required this.isEditing, - required this.l10n, - required this.theme, - required this.cs, - required this.tripz, - required this.onStopTapped, - required this.onStopChanged, - required this.onStopRemoved, - }); - - @override - Widget build(BuildContext context) { - return Padding( - padding: const EdgeInsets.only(bottom: T.s4), - child: Row( - children: [ - SizedBox( - width: 48, - child: Center( - child: Container( - width: 16, - height: 16, - decoration: BoxDecoration( - color: cs.surface, - shape: BoxShape.circle, - border: Border.all(color: cs.onSurfaceVariant, width: 2), - ), - child: Center( - child: Text( - '${index + 1}', - style: theme.textTheme.labelSmall?.copyWith( - color: cs.onSurfaceVariant, - fontSize: 10, - height: 1, - ), - ), - ), - ), - ), - ), - Expanded( - child: GestureDetector( - onTap: onStopTapped, - child: Container( - decoration: BoxDecoration( - color: isEditing ? cs.surface : cs.surfaceContainerLow, - borderRadius: BorderRadius.circular(T.r12), - border: Border.all( - color: isEditing - ? cs.primary - : cs.outlineVariant.withValues(alpha: 0.3), - width: isEditing ? 2 : 1, - ), - boxShadow: isEditing ? const [T.shadowSm] : null, - ), - child: Row( - children: [ - Expanded( - child: TextField( - controller: controller, - focusNode: focusNode, - readOnly: !isEditing, - decoration: InputDecoration( - hintText: '${l10n.addStop} ${index + 1}', - border: InputBorder.none, - contentPadding: const EdgeInsets.symmetric( - horizontal: T.s12, - vertical: T.s12, - ), - hintStyle: theme.textTheme.bodyLarge?.copyWith( - color: cs.onSurfaceVariant.withValues(alpha: 0.7), - ), - ), - style: theme.textTheme.bodyLarge?.copyWith( - color: cs.onSurface, - ), - onChanged: onStopChanged, - ), - ), - if (isEditing && controller.text.isNotEmpty) - IconButton( - onPressed: onStopRemoved, - icon: const Icon(Icons.close, size: 18), - color: cs.onSurfaceVariant, - splashRadius: 18, - ), - ], - ), - ), - ), - ), - ], - ), - ); - } -} - -// ── Dotted connector line ── -class _DottedConnector extends StatelessWidget { - final Color color; - const _DottedConnector({required this.color}); - - @override - Widget build(BuildContext context) { - return SizedBox( - width: 48, - child: CustomPaint( - size: const Size(48, 20), - painter: _DottedLinePainter(color: color), - ), - ); - } -} - -class _DottedLinePainter extends CustomPainter { - final Color color; - _DottedLinePainter({required this.color}); - - @override - void paint(Canvas canvas, Size size) { - final paint = Paint() - ..color = color - ..strokeWidth = 1.5 - ..style = PaintingStyle.stroke; - - const dashHeight = 3.0; - const gapHeight = 3.0; - double y = 4; - while (y < size.height) { - canvas.drawLine( - Offset(size.width / 2, y), - Offset(size.width / 2, y + dashHeight), - paint, - ); - y += dashHeight + gapHeight; - } - } - - @override - bool shouldRepaint(covariant _DottedLinePainter old) => old.color != color; -} - -// ── Destination row ── -class _DestinationRow extends StatelessWidget { - final TextEditingController controller; - final FocusNode focusNode; - final bool isEditing; - final AppLocalizations l10n; - final ThemeData theme; - final ColorScheme cs; - final TripzColors tripz; - final VoidCallback onFieldTapped; - final ValueChanged onChanged; - final VoidCallback? onVoiceSearchPressed; - - const _DestinationRow({ - required this.controller, - required this.focusNode, - required this.isEditing, - required this.l10n, - required this.theme, - required this.cs, - required this.tripz, - required this.onFieldTapped, - required this.onChanged, - this.onVoiceSearchPressed, - }); - - @override - Widget build(BuildContext context) { - return Padding( - padding: const EdgeInsets.only(bottom: T.s4), - child: Row( - children: [ - SizedBox( - width: 48, - child: Center( - child: Container( - width: 16, - height: 16, - decoration: BoxDecoration( - color: cs.error, - borderRadius: BorderRadius.circular(3), - ), - child: Icon(Icons.stop_rounded, size: 12, color: cs.onError), - ), - ), - ), - Expanded( - child: GestureDetector( - onTap: onFieldTapped, - child: Container( - decoration: BoxDecoration( - color: cs.surface, - borderRadius: BorderRadius.circular(T.r12), - border: Border.all( - color: isEditing ? cs.primary : cs.outlineVariant, - width: isEditing ? 2 : 1, - ), - boxShadow: isEditing ? const [T.shadowSm] : null, - ), - child: Row( - children: [ - Expanded( - child: TextField( - controller: controller, - focusNode: focusNode, - readOnly: !isEditing, - decoration: InputDecoration( - hintText: l10n.whereTo, - border: InputBorder.none, - contentPadding: const EdgeInsets.symmetric( - horizontal: T.s16, - vertical: T.s12, - ), - hintStyle: theme.textTheme.bodyLarge?.copyWith( - color: cs.onSurfaceVariant.withValues(alpha: 0.7), - ), - ), - style: theme.textTheme.bodyLarge?.copyWith( - color: cs.onSurface, - ), - onChanged: onChanged, - ), - ), - if (onVoiceSearchPressed != null) - IconButton( - onPressed: onVoiceSearchPressed, - icon: Icon(Icons.mic_rounded, color: cs.primary), - tooltip: 'البحث الصوتي الذكي (AI Voice)', - ), - ], - ), - ), - ), - ), - ], - ), - ); - } -} - -// ── Saved place chip ── -class _SavedPlaceChip extends StatelessWidget { - final IconData icon; - final String label; - final VoidCallback onTap; - - const _SavedPlaceChip({ - required this.icon, - required this.label, - required this.onTap, - }); - - @override - Widget build(BuildContext context) { - final cs = Theme.of(context).colorScheme; - final theme = Theme.of(context); - - return InkWell( - onTap: onTap, - borderRadius: BorderRadius.circular(T.r12), - child: Container( - padding: const EdgeInsets.symmetric(horizontal: T.s12, vertical: T.s8), - decoration: BoxDecoration( - color: cs.surfaceContainerLow, - borderRadius: BorderRadius.circular(T.r12), - border: Border.all(color: cs.outlineVariant.withValues(alpha: 0.3)), - ), - child: Row( - mainAxisSize: MainAxisSize.min, - children: [ - Container( - width: 32, - height: 32, - decoration: BoxDecoration( - color: cs.surface, - shape: BoxShape.circle, - boxShadow: const [T.shadowSm], - ), - child: Icon(icon, color: cs.primary, size: 20), - ), - const SizedBox(width: T.s8), - Text( - label, - style: theme.textTheme.titleSmall?.copyWith( - color: cs.onSurface, - fontSize: 16, - ), - ), - ], - ), - ), - ); - } -} - -// ── Autocomplete search result tile ── -class _SearchResultTile extends StatelessWidget { - final PlaceModel place; - final VoidCallback onTap; - - const _SearchResultTile({required this.place, required this.onTap}); - - @override - Widget build(BuildContext context) { - final cs = Theme.of(context).colorScheme; - final theme = Theme.of(context); - - return InkWell( - onTap: onTap, - borderRadius: BorderRadius.circular(T.r8), - child: Padding( - padding: const EdgeInsets.symmetric( - vertical: T.s12, - horizontal: T.pagePadding, - ), - child: Row( - children: [ - Container( - width: 40, - height: 40, - decoration: BoxDecoration( - color: cs.surfaceContainerHighest, - shape: BoxShape.circle, - ), - child: Icon( - Icons.location_on_outlined, - color: cs.onSurfaceVariant, - size: 20, - ), - ), - const SizedBox(width: T.s12), - Expanded( - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Text( - place.name, - style: theme.textTheme.bodyMedium?.copyWith( - fontWeight: FontWeight.w500, - ), - maxLines: 1, - overflow: TextOverflow.ellipsis, - ), - if (place.address != null && place.address!.isNotEmpty) ...[ - const SizedBox(height: T.s4), - Text( - place.address!, - style: theme.textTheme.bodySmall?.copyWith( - color: cs.onSurfaceVariant, - ), - maxLines: 1, - overflow: TextOverflow.ellipsis, - ), - ], - ], - ), - ), - Icon(Icons.chevron_right_rounded, color: cs.onSurfaceVariant), - ], - ), - ), - ); - } -} - -// ── Pick from map tile ── -class _PickFromMapTile extends StatelessWidget { - final VoidCallback onTap; - - const _PickFromMapTile({required this.onTap}); - - @override - Widget build(BuildContext context) { - final l10n = AppLocalizations.of(context)!; - final cs = Theme.of(context).colorScheme; - final theme = Theme.of(context); - - return InkWell( - onTap: onTap, - borderRadius: BorderRadius.circular(T.r12), - child: Container( - padding: const EdgeInsets.symmetric( - horizontal: T.s12, - vertical: T.s12, - ), - decoration: BoxDecoration( - color: cs.surfaceContainerHigh, - borderRadius: BorderRadius.circular(T.r12), - ), - child: Row( - children: [ - Icon(Icons.map_rounded, color: cs.primary, size: T.iconMd), - const SizedBox(width: T.s12), - Text( - l10n.setLocationOnMap, - style: theme.textTheme.bodyLarge?.copyWith( - color: cs.onSurface, - fontWeight: FontWeight.w500, - ), - ), - ], - ), - ), - ); - } -} diff --git a/apps/rider-archive-cubit/lib/features/home/view/home_screen.dart b/apps/rider-archive-cubit/lib/features/home/view/home_screen.dart deleted file mode 100644 index fa9685d..0000000 --- a/apps/rider-archive-cubit/lib/features/home/view/home_screen.dart +++ /dev/null @@ -1,528 +0,0 @@ -import 'package:flutter/material.dart'; -import 'package:flutter_bloc/flutter_bloc.dart'; -import 'package:go_router/go_router.dart'; -import 'package:intaleq_maps/intaleq_maps.dart'; -import '../../../core/l10n/app_localizations.dart'; -import '../../../core/design/tokens.dart'; -import '../../auth/cubit/auth_cubit.dart'; -import '../../auth/cubit/auth_state.dart'; -import '../../trip/bloc/trip_bloc.dart'; -import '../../trip/bloc/trip_state.dart'; -import '../../trip/bloc/trip_event.dart'; -import '../cubit/home_cubit.dart'; -import '../cubit/saved_places_cubit.dart'; -import '../data/models/place_model.dart'; -import '../data/maps_repository.dart'; -import '../../../core/storage/saved_places_store.dart'; -import '../../../core/di.dart'; - -/// زر عائم دائري صغير — للقائمة وإعادة التوسيط فوق الخريطة. -class _MapCircleButton extends StatelessWidget { - const _MapCircleButton({required this.icon, required this.onPressed}); - - final IconData icon; - final VoidCallback onPressed; - - @override - Widget build(BuildContext context) { - final cs = Theme.of(context).colorScheme; - return Container( - decoration: BoxDecoration( - color: cs.surface, - shape: BoxShape.circle, - boxShadow: const [T.shadowSm], - ), - child: IconButton( - icon: Icon(icon, color: cs.onSurface), - onPressed: onPressed, - ), - ); - } -} - -class HomeScreen extends StatefulWidget { - const HomeScreen({super.key}); - - @override - State createState() => _HomeScreenState(); -} - -class _HomeScreenState extends State { - IntaleqMapController? _mapController; - bool _isSelectingOnMap = false; - - @override - void initState() { - super.initState(); - WidgetsBinding.instance.addPostFrameCallback((_) { - context.read().add(const TripCheckActive()); - context.read().load(); - }); - } - - String _timeBasedGreeting(String? name, AppLocalizations l10n) { - final hour = DateTime.now().hour; - final isMorning = hour >= 5 && hour < 12; - final isAr = Localizations.localeOf(context).languageCode == 'ar'; - final prefix = isMorning - ? (isAr ? 'صباح الخير' : 'Good morning') - : (isAr ? 'مساء الخير' : 'Good evening'); - - final firstName = (name != null && name.trim().isNotEmpty) - ? name.trim().split(' ').first - : ''; - return firstName.isNotEmpty ? '$prefix، $firstName' : prefix; - } - - String _whereToPrompt(String? name, AppLocalizations l10n) { - final firstName = (name != null && name.trim().isNotEmpty) - ? name.trim().split(' ').first - : ''; - if (firstName.isNotEmpty) { - final isAr = Localizations.localeOf(context).languageCode == 'ar'; - return isAr ? 'إلى أين يا $firstName؟' : 'Where to, $firstName?'; - } - return l10n.whereTo; - } - - @override - Widget build(BuildContext context) { - final l10n = AppLocalizations.of(context)!; - final cs = Theme.of(context).colorScheme; - final isDark = Theme.of(context).brightness == Brightness.dark; - - return BlocListener( - listenWhen: (prev, cur) => prev.trip?.status != cur.trip?.status, - listener: (context, state) { - if (state.trip != null && !state.isCompleted) { - context.push('/trip-tracking'); - } - }, - child: Scaffold( - backgroundColor: cs.surface, - // الخريطة تملأ الشاشة حتى الحافة العلوية (docs/29 §3.6) — كل العناصر - // العائمة فوقها تعيش داخل SafeArea الخاصة بها لا الشاشة كلها. - extendBodyBehindAppBar: true, - body: Stack( - children: [ - // ── الخريطة (75% من الشاشة) ── - Positioned( - top: 0, - left: 0, - right: 0, - height: MediaQuery.of(context).size.height * 0.75, - child: BlocConsumer( - listenWhen: (prev, cur) => - prev.currentLocation == null && cur.currentLocation != null, - buildWhen: (prev, cur) => - prev.currentLocation != cur.currentLocation || - prev.pickup != cur.pickup || - prev.destination != cur.destination, - listener: (context, state) { - if (state.currentLocation != null && _mapController != null) { - _mapController!.animateCamera( - CameraUpdate.newLatLngZoom(state.currentLocation!, 16), - ); - } - }, - builder: (context, state) { - final center = - state.currentLocation ?? const LatLng(31.9539, 35.9106); - return IntaleqMap( - apiKey: '', - initialCameraPosition: - CameraPosition(target: center, zoom: 15), - mapType: - isDark ? IntaleqMapType.normal : IntaleqMapType.light, - myLocationEnabled: true, - myLocationButtonEnabled: false, - zoomControlsEnabled: false, - compassEnabled: false, - onMapCreated: (controller) { - _mapController = controller; - if (state.currentLocation != null) { - Future.delayed(const Duration(milliseconds: 300), () { - controller.animateCamera( - CameraUpdate.newLatLngZoom( - state.currentLocation!, 16), - ); - }); - } - }, - markers: _buildMarkers(state), - onCameraMove: (position) { - context - .read() - .updateCameraTarget(position.target); - }, - ); - }, - ), - ), - - // زر القائمة أعلى-بداية - PositionedDirectional( - top: MediaQuery.of(context).padding.top + T.s8, - start: T.pagePadding, - child: _MapCircleButton( - icon: Icons.menu_rounded, - onPressed: () => _showLogoutDialog(context, l10n), - ), - ), - - // زر إعادة التوسيط عائم أعلى البطاقة السفلية - PositionedDirectional( - end: T.pagePadding, - bottom: (_isSelectingOnMap ? 100 : MediaQuery.of(context).size.height * 0.28) + T.s16, - child: BlocBuilder( - builder: (context, state) { - return _MapCircleButton( - icon: Icons.my_location_rounded, - onPressed: state.currentLocation == null - ? () {} - : () => _mapController?.animateCamera( - CameraUpdate.newLatLngZoom( - state.currentLocation!, 16), - ), - ); - }, - ), - ), - - if (_isSelectingOnMap) - // علامة المركز (دبوس) لاختيار الموقع - Positioned( - top: (MediaQuery.of(context).size.height * 0.75) / 2 - 20, - left: MediaQuery.of(context).size.width / 2 - 20, - child: const Icon(Icons.location_on, size: 40, color: Colors.black), - ), - - // ── البطاقة السفلية: «إلى أين؟» والأماكن المحفوظة ── - if (!_isSelectingOnMap) - Positioned( - left: 0, - right: 0, - bottom: 0, - height: MediaQuery.of(context).size.height * 0.30, - child: Container( - width: double.infinity, - padding: const EdgeInsets.fromLTRB( - T.pagePadding, T.s24, T.pagePadding, T.s16), - decoration: BoxDecoration( - color: cs.surface, - borderRadius: const BorderRadius.vertical( - top: Radius.circular(T.r24), - ), - boxShadow: [ - BoxShadow( - color: Colors.black.withValues(alpha: 0.1), - blurRadius: 20, - offset: const Offset(0, -5), - ) - ], - ), - child: Column( - mainAxisSize: MainAxisSize.min, - crossAxisAlignment: CrossAxisAlignment.stretch, - children: [ - // التحية الزمنية مع اسم الراكب بتصميم أنيق - BlocBuilder( - builder: (context, authState) { - final greeting = _timeBasedGreeting(authState.user?.name, l10n); - return Text( - greeting, - style: Theme.of(context) - .textTheme - .titleLarge - ?.copyWith( - fontWeight: FontWeight.w800, - color: cs.onSurface, - letterSpacing: -0.5, - ), - ); - }, - ), - - const SizedBox(height: T.s24), - - // حقل «إلى أين؟» - BlocBuilder( - builder: (context, authState) { - final searchPrompt = _whereToPrompt(authState.user?.name, l10n); - return Material( - color: cs.surfaceContainerLowest, - elevation: 2, - shadowColor: cs.shadow.withValues(alpha: 0.05), - borderRadius: BorderRadius.circular(T.r16), - child: InkWell( - borderRadius: BorderRadius.circular(T.r16), - onTap: () => _openDestinationSearch(context), - child: Container( - height: 60, - padding: const EdgeInsets.symmetric(horizontal: T.s16), - decoration: BoxDecoration( - borderRadius: BorderRadius.circular(T.r16), - border: Border.all( - color: cs.outlineVariant.withValues(alpha: 0.5), - width: 1, - ), - ), - child: Row( - children: [ - Container( - width: 40, - height: 40, - decoration: BoxDecoration( - color: cs.primaryContainer.withValues(alpha: 0.5), - shape: BoxShape.circle, - ), - child: Icon( - Icons.search_rounded, - color: cs.primary, - size: 22, - ), - ), - const SizedBox(width: T.s16), - Expanded( - child: Text( - searchPrompt, - style: Theme.of(context) - .textTheme - .titleMedium - ?.copyWith( - color: cs.onSurface, - fontWeight: FontWeight.w700, - fontSize: 18, - ), - ), - ), - ], - ), - ), - ), - ); - }, - ), - - const Spacer(), - Divider(color: cs.outlineVariant.withValues(alpha: 0.3), height: 1), - const SizedBox(height: T.s12), - - // الأماكن المحفوظة (سطر أفقي أنيق) - BlocBuilder( - builder: (context, savedState) { - final items = savedState.places.take(3).toList(); - return Row( - mainAxisAlignment: MainAxisAlignment.spaceEvenly, - children: [ - _buildQuickAction(context, Icons.home_rounded, l10n.homePlace, items.isNotEmpty ? items.first : null), - Container(width: 1, height: 32, color: cs.outlineVariant.withValues(alpha: 0.3)), - _buildQuickAction(context, Icons.work_rounded, l10n.workPlace, items.length > 1 ? items[1] : null), - Container(width: 1, height: 32, color: cs.outlineVariant.withValues(alpha: 0.3)), - _buildQuickAction(context, Icons.star_rounded, l10n.favorites, items.length > 2 ? items[2] : null), - ], - ); - }, - ), - const SizedBox(height: T.s8), - ], - ), - ), - ) - else - // زر تأكيد الوجهة في وضع اختيار الخريطة - Positioned( - left: 0, - right: 0, - bottom: 0, - child: Container( - padding: const EdgeInsets.fromLTRB( - T.pagePadding, T.s16, T.pagePadding, T.s32), - decoration: BoxDecoration( - color: cs.surface, - borderRadius: const BorderRadius.vertical( - top: Radius.circular(T.r24), - ), - boxShadow: const [T.shadowLg], - ), - child: FilledButton( - onPressed: _confirmMapDestination, - style: FilledButton.styleFrom( - padding: const EdgeInsets.symmetric(vertical: 16), - shape: RoundedRectangleBorder( - borderRadius: BorderRadius.circular(T.r12), - ), - ), - child: Text('تأكيد الوجهة', style: Theme.of(context).textTheme.titleMedium?.copyWith(color: cs.onPrimary)), - ), - ), - ), - ], - ), - ), - ); - } - - void _onPlaceTap(BuildContext context, SavedPlace place) { - context.read().setDestination(PlaceModel( - name: place.name, - address: place.address, - lat: place.lat, - lng: place.lng, - )); - final state = context.read().state; - if (state.pickup != null) { - _openRoutePreview(context, state); - } - } - - Set _buildMarkers(HomeState state) { - final markers = {}; - if (state.pickup != null) { - markers.add(Marker( - markerId: const MarkerId('pickup'), - position: LatLng(state.pickup!.lat, state.pickup!.lng), - icon: InlqBitmap.defaultMarkerWithHue(210), - anchor: const Offset(0.5, 1.0), - zIndex: 2, - )); - } - if (state.destination != null) { - markers.add(Marker( - markerId: const MarkerId('destination'), - position: LatLng(state.destination!.lat, state.destination!.lng), - icon: InlqBitmap.defaultMarkerWithHue(0), - anchor: const Offset(0.5, 1.0), - zIndex: 1, - )); - } - return markers; - } - - void _openDestinationSearch(BuildContext context) { - final homeCubit = context.read(); - final pickup = homeCubit.state.pickup; - final currentLocation = homeCubit.state.currentLocation; - - context.push('/destination', extra: { - 'currentLocation': currentLocation, - }).then((result) { - if (!mounted) return; - if (result is Map && result['pickFromMap'] == true) { - setState(() { - _isSelectingOnMap = true; - }); - return; - } - - final place = result as PlaceModel?; - if (place != null && pickup != null) { - homeCubit.setDestination(place); - // ignore: use_build_context_synchronously - context.push('/route-preview', extra: { - 'pickup': pickup, - 'destination': place, - }); - } - }); - } - - Future _confirmMapDestination() async { - final homeCubit = context.read(); - final target = homeCubit.state.cameraTarget; - if (target == null) return; - - // We reverse geocode the target to get the address name - final repo = getIt(); - try { - final place = await repo.reverseGeocode(target.latitude, target.longitude); - setState(() { - _isSelectingOnMap = false; - }); - homeCubit.setDestination(place); - if (homeCubit.state.pickup != null) { - _openRoutePreview(context, homeCubit.state); - } - } catch (_) { - // In case of error, still set it with empty name - setState(() { - _isSelectingOnMap = false; - }); - homeCubit.setDestination(PlaceModel( - name: 'موقع محدد على الخريطة', - lat: target.latitude, - lng: target.longitude, - )); - if (homeCubit.state.pickup != null) { - _openRoutePreview(context, homeCubit.state); - } - } - } - - void _openRoutePreview(BuildContext context, HomeState state) { - if (state.pickup == null || state.destination == null) return; - context.push('/route-preview', extra: { - 'pickup': state.pickup, - 'destination': state.destination, - }); - } - - void _showLogoutDialog(BuildContext context, AppLocalizations l10n) { - final cs = Theme.of(context).colorScheme; - showDialog( - context: context, - builder: (ctx) => AlertDialog( - title: Text(l10n.logout), - content: Text(l10n.logout), - actions: [ - TextButton( - onPressed: () => Navigator.pop(ctx), - child: Text(l10n.cancel), - ), - FilledButton( - onPressed: () async { - Navigator.pop(ctx); - await context.read().logout(); - if (context.mounted) context.go('/phone'); - }, - style: FilledButton.styleFrom(backgroundColor: cs.error), - child: Text(l10n.logout), - ), - ], - ), - ); - } - - Widget _buildQuickAction( - BuildContext context, IconData icon, String label, SavedPlace? place) { - final cs = Theme.of(context).colorScheme; - return InkWell( - onTap: place != null ? () => _onPlaceTap(context, place) : null, - borderRadius: BorderRadius.circular(T.r12), - child: Padding( - padding: const EdgeInsets.symmetric(horizontal: T.s12, vertical: T.s8), - child: Column( - mainAxisSize: MainAxisSize.min, - children: [ - Icon(icon, - color: place != null - ? cs.primary - : cs.onSurfaceVariant.withValues(alpha: 0.5), - size: 28), - const SizedBox(height: T.s4), - Text( - label, - style: Theme.of(context).textTheme.labelMedium?.copyWith( - color: place != null - ? cs.onSurface - : cs.onSurfaceVariant.withValues(alpha: 0.5), - fontWeight: - place != null ? FontWeight.w600 : FontWeight.normal, - ), - ), - ], - ), - ), - ); - } -} diff --git a/apps/rider-archive-cubit/lib/features/home/view/route_preview_screen.dart b/apps/rider-archive-cubit/lib/features/home/view/route_preview_screen.dart deleted file mode 100644 index caac1b0..0000000 --- a/apps/rider-archive-cubit/lib/features/home/view/route_preview_screen.dart +++ /dev/null @@ -1,540 +0,0 @@ -import 'package:flutter/material.dart'; -import 'package:flutter/foundation.dart'; -import 'package:flutter_bloc/flutter_bloc.dart'; -import 'package:go_router/go_router.dart'; -import 'package:intaleq_maps/intaleq_maps.dart'; -import '../../../core/l10n/app_localizations.dart'; -import '../../../core/design/tokens.dart'; -import '../../../core/ui/tripz_button.dart'; -import '../../trip/bloc/trip_bloc.dart'; -import '../../trip/bloc/trip_state.dart'; -import '../../trip/bloc/trip_event.dart'; -import '../cubit/quote_cubit.dart'; -import '../data/models/place_model.dart'; -import '../data/models/route_model.dart'; -import '../data/maps_repository.dart'; -import '../../../core/di.dart'; -import 'widgets/ride_class_card.dart'; - -List _decodePolyline(String encoded) { - return PolylineUtils.decode(encoded); -} - -class RoutePreviewScreen extends StatefulWidget { - final PlaceModel pickup; - final PlaceModel destination; - - const RoutePreviewScreen({ - super.key, - required this.pickup, - required this.destination, - }); - - @override - State createState() => _RoutePreviewScreenState(); -} - -class _RoutePreviewScreenState extends State { - IntaleqMapController? _mapController; - RouteModel? _route; - List _polylinePoints = []; - bool _routeLoading = true; - String? _routeError; - final _promoController = TextEditingController(); - - @override - void initState() { - super.initState(); - _fetchRoute(); - WidgetsBinding.instance.addPostFrameCallback((_) { - context.read().fetchQuote( - pickupLat: widget.pickup.lat, - pickupLng: widget.pickup.lng, - pickupAddress: widget.pickup.name, - dropoffLat: widget.destination.lat, - dropoffLng: widget.destination.lng, - dropoffAddress: widget.destination.name, - ); - }); - } - - @override - void dispose() { - _promoController.dispose(); - super.dispose(); - } - - Future _fetchRoute() async { - setState(() { - _routeLoading = true; - _routeError = null; - }); - try { - final repo = getIt(); - final route = await repo.getRoute( - fromLat: widget.pickup.lat, - fromLng: widget.pickup.lng, - toLat: widget.destination.lat, - toLng: widget.destination.lng, - ); - final points = await compute(_decodePolyline, route.polyline ?? ''); - if (!mounted) return; - setState(() { - _route = route; - _polylinePoints = points; - _routeLoading = false; - }); - _fitCamera(); - } catch (e) { - if (!mounted) return; - setState(() { - _routeError = e.toString(); - _routeLoading = false; - }); - } - } - - void _fitCamera() { - if (_mapController == null) return; - final bounds = _route?.getLatLngBounds(); - if (bounds != null) { - _mapController!.moveCamera(CameraUpdate.newLatLngBounds(bounds)); - } else { - _mapController!.moveCamera(CameraUpdate.newLatLngZoom( - LatLng(widget.pickup.lat, widget.pickup.lng), - 15, - )); - } - } - - @override - Widget build(BuildContext context) { - final l10n = AppLocalizations.of(context)!; - final cs = Theme.of(context).colorScheme; - final pickupLoc = LatLng(widget.pickup.lat, widget.pickup.lng); - final destLoc = LatLng(widget.destination.lat, widget.destination.lng); - - return BlocListener( - listenWhen: (prev, cur) => - prev.requestStatus != cur.requestStatus && - cur.requestStatus == TripRequestStatus.searching, - listener: (context, state) { - context.pushReplacement('/trip-tracking'); - }, - child: Scaffold( - body: Stack( - children: [ - // الخريطة بكامل الشاشة - if (_routeLoading) - const Center(child: CircularProgressIndicator()) - else if (_routeError != null) - Center( - child: Column( - mainAxisSize: MainAxisSize.min, - children: [ - Text(l10n.errorGeneric), - const SizedBox(height: T.s12), - TripzButton( - label: l10n.retry, - onPressed: _fetchRoute, - ), - ], - ), - ) - else - IntaleqMap( - apiKey: '', - initialCameraPosition: CameraPosition( - target: LatLng( - (pickupLoc.latitude + destLoc.latitude) / 2, - (pickupLoc.longitude + destLoc.longitude) / 2, - ), - zoom: 14, - ), - mapType: Theme.of(context).brightness == Brightness.dark - ? IntaleqMapType.normal - : IntaleqMapType.light, - myLocationEnabled: false, - zoomControlsEnabled: false, - compassEnabled: false, - onMapCreated: (c) { - _mapController = c; - _fitCamera(); - }, - markers: { - Marker( - markerId: const MarkerId('pickup'), - position: pickupLoc, - icon: InlqBitmap.defaultMarkerWithHue(210), - anchor: const Offset(0.5, 1.0), - ), - Marker( - markerId: const MarkerId('destination'), - position: destLoc, - icon: InlqBitmap.defaultMarkerWithHue(0), - anchor: const Offset(0.5, 1.0), - ), - }, - polylines: { - // حماية محرك C++ من الانهيار إذا كانت النقاط أقل من 2 - if (_polylinePoints.length >= 2) - Polyline( - polylineId: const PolylineId('route'), - points: _polylinePoints, - color: cs.primary, - width: T.polylineWidth, - ), - }, - ), - - // زر الرجوع العائم (Top Left) - Positioned( - top: MediaQuery.of(context).padding.top + T.s8, - left: T.s12, - child: FloatingActionButton.small( - heroTag: 'back', - backgroundColor: cs.surface.withValues(alpha: 0.9), - elevation: 4, - onPressed: () => context.pop(), - child: Icon(Icons.arrow_back_rounded, color: cs.onSurface), - ), - ), - - // ملخص المسار العائم (Top Right) - Positioned( - top: MediaQuery.of(context).padding.top + T.s12, - right: T.s12, - child: BlocBuilder( - builder: (context, state) { - if (state.quote == null) return const SizedBox.shrink(); - return Container( - padding: const EdgeInsets.symmetric( - horizontal: T.s16, vertical: T.s12), - decoration: BoxDecoration( - color: cs.surface.withValues(alpha: 0.95), - borderRadius: BorderRadius.circular(T.r24), - boxShadow: const [T.shadowSm], - ), - child: Text( - l10n.routeSummary( - state.quote!.distanceText ?? '', - state.quote!.durationText ?? '', - ), - style: Theme.of(context).textTheme.labelLarge?.copyWith( - fontWeight: FontWeight.w700, - color: cs.onSurface, - ), - ), - ); - }, - ), - ), - - // Bottom Sheet: فئات الرحلات - Align( - alignment: Alignment.bottomCenter, - child: Container( - constraints: BoxConstraints( - maxHeight: MediaQuery.of(context).size.height * 0.55, - ), - decoration: BoxDecoration( - color: cs.surface, - borderRadius: const BorderRadius.vertical( - top: Radius.circular(24), - ), - boxShadow: [ - BoxShadow( - color: Colors.black.withValues(alpha: 0.1), - blurRadius: 20, - offset: const Offset(0, -5), - ) - ], - ), - child: Column( - mainAxisSize: MainAxisSize.min, - children: [ - // شريط السحب (Grab handle) - const SizedBox(height: T.s12), - Container( - width: 40, - height: 5, - decoration: BoxDecoration( - color: cs.outlineVariant.withValues(alpha: 0.5), - borderRadius: BorderRadius.circular(10), - ), - ), - const SizedBox(height: T.s12), - - Expanded( - child: BlocBuilder( - builder: (context, state) { - if (state.loading) { - return const Center( - child: CircularProgressIndicator()); - } - if (state.error != null) { - return Center( - child: Column( - mainAxisSize: MainAxisSize.min, - children: [ - Text(l10n.errorGeneric, - style: Theme.of(context) - .textTheme - .bodyLarge - ?.copyWith(color: cs.error)), - const SizedBox(height: T.s12), - TripzButton( - label: l10n.retry, - onPressed: () => context - .read() - .fetchQuote( - pickupLat: widget.pickup.lat, - pickupLng: widget.pickup.lng, - pickupAddress: widget.pickup.name, - dropoffLat: widget.destination.lat, - dropoffLng: widget.destination.lng, - dropoffAddress: - widget.destination.name, - ), - ), - ], - ), - ); - } - - final classes = state.quote?.classes ?? []; - if (classes.isEmpty) { - return Center(child: Text(l10n.noResults)); - } - - return Column( - crossAxisAlignment: CrossAxisAlignment.stretch, - children: [ - Padding( - padding: const EdgeInsets.symmetric( - horizontal: T.pagePadding), - child: Text( - l10n.rideClasses, - style: Theme.of(context) - .textTheme - .titleLarge - ?.copyWith( - fontWeight: FontWeight.w800, - letterSpacing: -0.5, - ), - ), - ), - const SizedBox(height: T.s12), - Expanded( - child: ListView.separated( - padding: const EdgeInsets.symmetric( - horizontal: T.pagePadding), - itemCount: classes.length, - separatorBuilder: (_, __) => - const SizedBox(height: T.s12), - itemBuilder: (context, index) { - final cls = classes[index]; - return RideClassCard( - quoteClass: cls, - selected: state.selectedClass == - cls.vehicleClass, - onTap: () => context - .read() - .selectClass(cls.vehicleClass), - ); - }, - ), - ), - // شريط الدفع وكود الخصم - Container( - padding: const EdgeInsets.fromLTRB( - T.pagePadding, T.s12, T.pagePadding, T.s8), - decoration: BoxDecoration( - color: cs.surface, - border: Border( - top: BorderSide( - color: cs.outlineVariant - .withValues(alpha: 0.3), - ), - ), - ), - child: Column( - children: [ - _PaymentRow( - method: state.paymentMethod, - onChanged: (m) => context - .read() - .setPaymentMethod(m), - ), - const SizedBox(height: T.s12), - _PromoRow( - controller: _promoController, - onApply: (code) => context - .read() - .setCouponCode(code), - ), - ], - ), - ), - // زر طلب الرحلة - SafeArea( - top: false, - child: Padding( - padding: const EdgeInsets.fromLTRB( - T.pagePadding, 0, T.pagePadding, T.s12), - child: BlocBuilder( - builder: (context, tripState) { - final isLoading = - tripState.requestStatus == - TripRequestStatus.loading; - return TripzButton( - label: isLoading - ? l10n.loading - : l10n.requestRide, - onPressed: - (state.selectedClass != null && - !isLoading) - ? () => - _requestTrip(context, state) - : null, - ); - }, - ), - ), - ), - ], - ); - }, - ), - ), - ], - ), - ), - ), - ], - ), - ), - ); - } - - void _requestTrip(BuildContext context, QuoteState state) { - if (state.selectedClass == null) return; - context.read().add(TripRequested( - pickupLat: widget.pickup.lat, - pickupLng: widget.pickup.lng, - pickupAddress: widget.pickup.name, - dropoffLat: widget.destination.lat, - dropoffLng: widget.destination.lng, - dropoffAddress: widget.destination.name, - vehicleClass: state.selectedClass!, - paymentMethod: state.paymentMethod, - couponCode: state.couponCode, - )); - } -} - -class _PaymentRow extends StatelessWidget { - final String method; - final ValueChanged onChanged; - - const _PaymentRow({required this.method, required this.onChanged}); - - @override - Widget build(BuildContext context) { - final l10n = AppLocalizations.of(context)!; - final cs = Theme.of(context).colorScheme; - - return Container( - padding: const EdgeInsets.symmetric( - horizontal: T.pagePadding, vertical: T.s12), - decoration: BoxDecoration( - color: cs.surfaceContainerHighest, - borderRadius: BorderRadius.circular(T.r12), - ), - child: Row( - children: [ - Icon( - method == 'wallet' - ? Icons.account_balance_wallet_outlined - : Icons.money_rounded, - color: cs.onSurfaceVariant, - ), - const SizedBox(width: T.s12), - Text(l10n.paymentMethod, - style: Theme.of(context).textTheme.bodyMedium), - const Spacer(), - DropdownButton( - value: method, - underline: const SizedBox.shrink(), - isDense: true, - items: [ - DropdownMenuItem(value: 'cash', child: Text(l10n.cash)), - DropdownMenuItem( - value: 'wallet', child: Text(l10n.walletPayment)), - ], - onChanged: (v) { - if (v != null) onChanged(v); - }, - ), - ], - ), - ); - } -} - -class _PromoRow extends StatefulWidget { - final TextEditingController controller; - final ValueChanged onApply; - - const _PromoRow({required this.controller, required this.onApply}); - - @override - State<_PromoRow> createState() => _PromoRowState(); -} - -class _PromoRowState extends State<_PromoRow> { - @override - Widget build(BuildContext context) { - final l10n = AppLocalizations.of(context)!; - final cs = Theme.of(context).colorScheme; - - return Container( - padding: - const EdgeInsets.symmetric(horizontal: T.pagePadding, vertical: T.s8), - decoration: BoxDecoration( - color: cs.surfaceContainerHighest, - borderRadius: BorderRadius.circular(T.r12), - ), - child: Row( - children: [ - Icon( - Icons.local_offer_outlined, - color: cs.onSurfaceVariant, - ), - const SizedBox(width: T.s12), - Expanded( - child: TextField( - controller: widget.controller, - decoration: InputDecoration( - hintText: l10n.couponCode, - border: InputBorder.none, - isDense: true, - contentPadding: EdgeInsets.zero, - ), - style: Theme.of(context).textTheme.bodyMedium, - ), - ), - TripzButton( - label: l10n.confirm, - style: TripzButtonStyle.text, - fullWidth: false, - onPressed: () { - final code = widget.controller.text.trim(); - widget.onApply(code.isEmpty ? null : code); - }, - ), - ], - ), - ); - } -} diff --git a/apps/rider-archive-cubit/lib/features/home/view/widgets/place_tile.dart b/apps/rider-archive-cubit/lib/features/home/view/widgets/place_tile.dart deleted file mode 100644 index 3e61fe9..0000000 --- a/apps/rider-archive-cubit/lib/features/home/view/widgets/place_tile.dart +++ /dev/null @@ -1,74 +0,0 @@ -import 'package:flutter/material.dart'; -import '../../../../core/design/tokens.dart'; -import '../../data/models/place_model.dart'; - -/// عنصر نتائج البحث عن مكان. -class PlaceTile extends StatelessWidget { - final PlaceModel place; - final VoidCallback? onTap; - final IconData? icon; - - const PlaceTile({ - super.key, - required this.place, - this.onTap, - this.icon, - }); - - @override - Widget build(BuildContext context) { - final cs = Theme.of(context).colorScheme; - final displayIcon = icon ?? Icons.location_on_outlined; - - return InkWell( - onTap: onTap, - child: Padding( - padding: const EdgeInsets.symmetric( - horizontal: T.pagePadding, - vertical: T.s12, - ), - child: Row( - children: [ - Container( - width: 40, - height: 40, - decoration: BoxDecoration( - color: cs.surfaceContainerHighest, - shape: BoxShape.circle, - ), - child: Icon(displayIcon, size: 20, color: cs.onSurfaceVariant), - ), - const SizedBox(width: T.s12), - Expanded( - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Text( - place.name, - style: Theme.of(context).textTheme.bodyMedium?.copyWith( - fontWeight: FontWeight.w500, - ), - maxLines: 1, - overflow: TextOverflow.ellipsis, - ), - if (place.address != null && place.address!.isNotEmpty) ...[ - const SizedBox(height: 2), - Text( - place.address!, - style: Theme.of(context).textTheme.bodySmall?.copyWith( - color: cs.onSurfaceVariant, - ), - maxLines: 1, - overflow: TextOverflow.ellipsis, - ), - ], - ], - ), - ), - Icon(Icons.chevron_right_rounded, color: cs.onSurfaceVariant), - ], - ), - ), - ); - } -} diff --git a/apps/rider-archive-cubit/lib/features/home/view/widgets/ride_class_card.dart b/apps/rider-archive-cubit/lib/features/home/view/widgets/ride_class_card.dart deleted file mode 100644 index 8ff062c..0000000 --- a/apps/rider-archive-cubit/lib/features/home/view/widgets/ride_class_card.dart +++ /dev/null @@ -1,116 +0,0 @@ -import 'package:flutter/material.dart'; -import '../../../../core/l10n/app_localizations.dart'; -import '../../../../core/design/tokens.dart'; -import '../../data/models/quote_model.dart'; - -/// بطاقة فئة رحلة واحدة في قائمة الاختيار. -class RideClassCard extends StatelessWidget { - final QuoteClassModel quoteClass; - final bool selected; - final VoidCallback? onTap; - - const RideClassCard({ - super.key, - required this.quoteClass, - this.selected = false, - this.onTap, - }); - - @override - Widget build(BuildContext context) { - final cs = Theme.of(context).colorScheme; - final l10n = AppLocalizations.of(context)!; - - return InkWell( - onTap: onTap, - borderRadius: BorderRadius.circular(T.r16), - child: Container( - padding: const EdgeInsets.symmetric(horizontal: T.s16, vertical: T.s12), - decoration: BoxDecoration( - color: selected ? cs.primaryContainer.withValues(alpha: 0.2) : Colors.transparent, - borderRadius: BorderRadius.circular(T.r16), - border: Border.all( - color: selected ? cs.primary : cs.outlineVariant.withValues(alpha: 0.3), - width: selected ? 2 : 1, - ), - ), - child: Row( - children: [ - // أيقونة المركبة - Container( - width: 56, - height: 56, - decoration: BoxDecoration( - color: selected ? cs.primary.withValues(alpha: 0.1) : cs.surfaceContainerHighest, - shape: BoxShape.circle, - ), - child: Center( - child: Icon( - Icons.directions_car_filled_rounded, - color: selected ? cs.primary : cs.onSurfaceVariant, - size: 32, - ), - ), - ), - const SizedBox(width: T.s16), - - // اسم الفئة + السعة - Expanded( - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - mainAxisAlignment: MainAxisAlignment.center, - children: [ - Text( - quoteClass.name, - style: Theme.of(context).textTheme.titleMedium?.copyWith( - fontWeight: FontWeight.w700, - color: cs.onSurface, - ), - ), - const SizedBox(height: 2), - Row( - children: [ - Icon(Icons.person_outline_rounded, - size: 14, color: cs.onSurfaceVariant), - const SizedBox(width: 4), - Text( - l10n.capacity(quoteClass.capacity), - style: Theme.of(context).textTheme.bodySmall?.copyWith( - color: cs.onSurfaceVariant, - fontWeight: FontWeight.w500, - ), - ), - ], - ), - ], - ), - ), - - // الوقت التقديري + السعر - Column( - crossAxisAlignment: CrossAxisAlignment.end, - mainAxisAlignment: MainAxisAlignment.center, - children: [ - Text( - '${quoteClass.price} ${quoteClass.currency}', - style: Theme.of(context).textTheme.titleMedium?.copyWith( - fontWeight: FontWeight.w800, - color: selected ? cs.primary : cs.onSurface, - ), - ), - const SizedBox(height: 2), - Text( - quoteClass.estimatedTimeText, - style: Theme.of(context).textTheme.labelSmall?.copyWith( - color: cs.onSurfaceVariant, - fontWeight: FontWeight.w600, - ), - ), - ], - ), - ], - ), - ), - ); - } -} diff --git a/apps/rider-archive-cubit/lib/features/home/view/widgets/searching_overlay.dart b/apps/rider-archive-cubit/lib/features/home/view/widgets/searching_overlay.dart deleted file mode 100644 index f7608a7..0000000 --- a/apps/rider-archive-cubit/lib/features/home/view/widgets/searching_overlay.dart +++ /dev/null @@ -1,126 +0,0 @@ -import 'package:flutter/material.dart'; -import '../../../../core/l10n/app_localizations.dart'; -import '../../../../core/design/tokens.dart'; - -/// طبقة البحث عن سائق — نبض + مؤقت + زر إلغاء. -class SearchingOverlay extends StatefulWidget { - final int elapsed; - final VoidCallback? onCancel; - - const SearchingOverlay({ - super.key, - required this.elapsed, - this.onCancel, - }); - - @override - State createState() => _SearchingOverlayState(); -} - -class _SearchingOverlayState extends State - with SingleTickerProviderStateMixin { - late AnimationController _pulseController; - late Animation _pulseAnimation; - - @override - void initState() { - super.initState(); - _pulseController = AnimationController( - vsync: this, - duration: const Duration(seconds: 2), - )..repeat(reverse: true); - _pulseAnimation = Tween(begin: 0.8, end: 1.2).animate( - CurvedAnimation(parent: _pulseController, curve: Curves.easeInOut), - ); - } - - @override - void dispose() { - _pulseController.dispose(); - super.dispose(); - } - - @override - Widget build(BuildContext context) { - final l10n = AppLocalizations.of(context)!; - final cs = Theme.of(context).colorScheme; - final minutes = widget.elapsed ~/ 60; - final seconds = widget.elapsed % 60; - final timeStr = '${minutes.toString().padLeft(2, '0')}:${seconds.toString().padLeft(2, '0')}'; - - return Material( - color: Colors.black54, - child: Center( - child: Container( - margin: const EdgeInsets.all(T.pagePadding * 2), - padding: const EdgeInsets.all(T.pagePadding * 1.5), - decoration: BoxDecoration( - color: cs.surface, - borderRadius: BorderRadius.circular(T.r16), - boxShadow: [T.shadowLg], - ), - child: Column( - mainAxisSize: MainAxisSize.min, - children: [ - // نبض البحث - ScaleTransition( - scale: _pulseAnimation, - child: Container( - width: 80, - height: 80, - decoration: BoxDecoration( - color: cs.primaryContainer, - shape: BoxShape.circle, - ), - child: Icon( - Icons.directions_car_filled_rounded, - size: 40, - color: cs.onPrimaryContainer, - ), - ), - ), - - const SizedBox(height: T.s16), - - // نص البحث - Text( - l10n.searchingDriver, - style: Theme.of(context).textTheme.titleMedium?.copyWith( - fontWeight: FontWeight.w600, - ), - textAlign: TextAlign.center, - ), - - const SizedBox(height: T.s8), - - // المؤقت - Text( - timeStr, - style: Theme.of(context).textTheme.headlineMedium?.copyWith( - color: cs.primary, - fontWeight: FontWeight.w700, - fontFeatures: const [FontFeature.tabularFigures()], - ), - ), - - const SizedBox(height: T.s20), - - // زر الإلغاء - SizedBox( - width: double.infinity, - child: OutlinedButton( - onPressed: widget.onCancel, - style: OutlinedButton.styleFrom( - foregroundColor: cs.error, - side: BorderSide(color: cs.error), - ), - child: Text(l10n.cancelSearch), - ), - ), - ], - ), - ), - ), - ); - } -} diff --git a/apps/rider-archive-cubit/lib/features/onboarding/view/onboarding_screen.dart b/apps/rider-archive-cubit/lib/features/onboarding/view/onboarding_screen.dart deleted file mode 100644 index d19584d..0000000 --- a/apps/rider-archive-cubit/lib/features/onboarding/view/onboarding_screen.dart +++ /dev/null @@ -1,231 +0,0 @@ -import 'package:flutter/material.dart'; -import 'package:go_router/go_router.dart'; -import 'package:shared_preferences/shared_preferences.dart'; -import '../../../core/design/tokens.dart'; -import '../../../core/l10n/app_localizations.dart'; -import '../../../core/ui/tripz_scaffold.dart'; -import '../../../core/ui/tripz_button.dart'; - -class OnboardingScreen extends StatefulWidget { - const OnboardingScreen({super.key}); - - @override - State createState() => _OnboardingScreenState(); -} - -class _OnboardingScreenState extends State - with SingleTickerProviderStateMixin { - final PageController _pageController = PageController(); - int _currentIndex = 0; - - late final AnimationController _pulseController; - late final Animation _pulseAnimation; - - static const _onboardingKey = 'onboarding_seen'; - - @override - void initState() { - super.initState(); - _pulseController = AnimationController( - vsync: this, - duration: const Duration(milliseconds: 1400), - )..repeat(reverse: true); - _pulseAnimation = Tween(begin: 1.0, end: 1.08).animate( - CurvedAnimation(parent: _pulseController, curve: Curves.easeInOut), - ); - } - - @override - void dispose() { - _pulseController.dispose(); - _pageController.dispose(); - super.dispose(); - } - - Future _markSeen() async { - final prefs = await SharedPreferences.getInstance(); - await prefs.setBool(_onboardingKey, true); - } - - void _nextPage(int pageCount) { - if (_currentIndex < pageCount - 1) { - _pageController.nextPage( - duration: T.slow, - curve: Curves.easeInOut, - ); - } else { - _markSeen(); - context.go('/phone'); - } - } - - void _skip() { - _markSeen(); - context.go('/phone'); - } - - @override - Widget build(BuildContext context) { - final theme = Theme.of(context); - final cs = theme.colorScheme; - final l10n = AppLocalizations.of(context)!; - - final pages = [ - _OnboardingPageData( - title: l10n.onboardingTitle1, - subtitle: l10n.onboardingSubtitle1, - image: 'assets/images/onboarding_1.png', - fallbackIcon: Icons.touch_app_rounded, - ), - _OnboardingPageData( - title: l10n.onboardingTitle2, - subtitle: l10n.onboardingSubtitle2, - image: 'assets/images/onboarding_2.png', - fallbackIcon: Icons.location_on_rounded, - ), - _OnboardingPageData( - title: l10n.onboardingTitle3, - subtitle: l10n.onboardingSubtitle3, - image: 'assets/images/onboarding_3.png', - fallbackIcon: Icons.payment_rounded, - ), - ]; - - return TripzScaffold( - backgroundColor: cs.surface, - padding: false, - bottomAction: Column( - mainAxisSize: MainAxisSize.min, - children: [ - // ── Page Indicators ── - Row( - mainAxisAlignment: MainAxisAlignment.center, - children: List.generate(pages.length, (index) { - final isActive = index == _currentIndex; - return AnimatedContainer( - duration: T.medium, - margin: const EdgeInsets.symmetric(horizontal: T.s4), - height: T.s8, - width: isActive ? T.s24 : T.s8, - decoration: BoxDecoration( - color: isActive - ? cs.primary - : cs.surfaceContainerHighest, - borderRadius: BorderRadius.circular(T.rCircle), - ), - ); - }), - ), - const SizedBox(height: T.s24), - - // ── Primary Button ── - TripzButton( - onPressed: () => _nextPage(pages.length), - label: _currentIndex == pages.length - 1 ? l10n.getStarted : l10n.next, - ), - ], - ), - child: Column( - children: [ - // ── Skip Button ── - Align( - alignment: AlignmentDirectional.centerEnd, - child: Padding( - padding: const EdgeInsets.symmetric( - horizontal: T.pagePadding, - vertical: T.s8, - ), - child: TripzButton( - onPressed: _skip, - style: TripzButtonStyle.text, - label: l10n.skip, - fullWidth: false, - ), - ), - ), - - // ── PageView ── - Expanded( - child: PageView.builder( - controller: _pageController, - itemCount: pages.length, - onPageChanged: (index) { - setState(() => _currentIndex = index); - }, - itemBuilder: (context, index) { - final data = pages[index]; - return Padding( - padding: const EdgeInsets.symmetric(horizontal: T.s24), - child: Column( - mainAxisAlignment: MainAxisAlignment.center, - children: [ - // ── الرسم التوضيحي (أصل مسجّل) مع نبض خفيف ── - AnimatedScale( - scale: _pulseAnimation.value, - duration: const Duration(milliseconds: 100), - child: SizedBox( - width: 240, - height: 240, - child: Image.asset( - data.image, - fit: BoxFit.contain, - errorBuilder: (_, __, ___) => Container( - decoration: BoxDecoration( - color: cs.primaryContainer, - shape: BoxShape.circle, - ), - child: Icon( - data.fallbackIcon, - size: 88, - color: cs.onPrimaryContainer, - ), - ), - ), - ), - ), - const SizedBox(height: T.s48), - - // ── Title ── - Text( - data.title, - style: theme.textTheme.headlineMedium?.copyWith( - color: cs.onSurface, - fontWeight: FontWeight.bold, - ), - textAlign: TextAlign.center, - ), - const SizedBox(height: T.s12), - - // ── Subtitle ── - Text( - data.subtitle, - style: theme.textTheme.bodyLarge?.copyWith( - color: cs.onSurfaceVariant, - ), - textAlign: TextAlign.center, - ), - ], - ), - ); - }, - ), - ), - ], - ), - ); - } -} - -class _OnboardingPageData { - final String title; - final String subtitle; - final String image; - final IconData fallbackIcon; - - const _OnboardingPageData({ - required this.title, - required this.subtitle, - required this.image, - required this.fallbackIcon, - }); -} diff --git a/apps/rider-archive-cubit/lib/features/settings/cubit/settings_cubit.dart b/apps/rider-archive-cubit/lib/features/settings/cubit/settings_cubit.dart deleted file mode 100644 index 8df81e4..0000000 --- a/apps/rider-archive-cubit/lib/features/settings/cubit/settings_cubit.dart +++ /dev/null @@ -1,38 +0,0 @@ -import 'package:flutter/material.dart'; -import 'package:flutter_bloc/flutter_bloc.dart'; -import 'package:shared_preferences/shared_preferences.dart'; -import 'settings_state.dart'; - -/// الإعدادات العامة: الثيم + اللغة. -/// يُحفظ محلياً عبر SharedPreferences (ليس سراً — docs/26 §4). -class SettingsCubit extends Cubit { - static const _kThemeKey = 'settings_theme_mode'; - static const _kLocaleKey = 'settings_locale'; - - SettingsCubit() : super(const SettingsState()) { - _load(); - } - - Future _load() async { - final prefs = await SharedPreferences.getInstance(); - final themeIndex = prefs.getInt(_kThemeKey) ?? 0; - final localeCode = prefs.getString(_kLocaleKey) ?? 'ar'; - - emit(state.copyWith( - themeMode: ThemeMode.values[themeIndex], - locale: Locale(localeCode), - )); - } - - Future setThemeMode(ThemeMode mode) async { - emit(state.copyWith(themeMode: mode)); - final prefs = await SharedPreferences.getInstance(); - await prefs.setInt(_kThemeKey, mode.index); - } - - Future setLocale(Locale locale) async { - emit(state.copyWith(locale: locale)); - final prefs = await SharedPreferences.getInstance(); - await prefs.setString(_kLocaleKey, locale.languageCode); - } -} diff --git a/apps/rider-archive-cubit/lib/features/settings/cubit/settings_state.dart b/apps/rider-archive-cubit/lib/features/settings/cubit/settings_state.dart deleted file mode 100644 index 27ee227..0000000 --- a/apps/rider-archive-cubit/lib/features/settings/cubit/settings_state.dart +++ /dev/null @@ -1,31 +0,0 @@ -import 'package:equatable/equatable.dart'; -import 'package:flutter/material.dart'; - -enum SettingsStatus { loaded, error } - -class SettingsState extends Equatable { - final SettingsStatus status; - final ThemeMode themeMode; - final Locale locale; - - const SettingsState({ - this.status = SettingsStatus.loaded, - this.themeMode = ThemeMode.system, - this.locale = const Locale('ar'), - }); - - SettingsState copyWith({ - SettingsStatus? status, - ThemeMode? themeMode, - Locale? locale, - }) { - return SettingsState( - status: status ?? this.status, - themeMode: themeMode ?? this.themeMode, - locale: locale ?? this.locale, - ); - } - - @override - List get props => [status, themeMode, locale]; -} diff --git a/apps/rider-archive-cubit/lib/features/splash/view/splash_screen.dart b/apps/rider-archive-cubit/lib/features/splash/view/splash_screen.dart deleted file mode 100644 index 11a082b..0000000 --- a/apps/rider-archive-cubit/lib/features/splash/view/splash_screen.dart +++ /dev/null @@ -1,247 +0,0 @@ -import 'package:flutter/material.dart'; -import 'package:go_router/go_router.dart'; -import 'package:flutter_bloc/flutter_bloc.dart'; -import 'package:shared_preferences/shared_preferences.dart'; -import '../../../core/app_info.dart'; -import '../../../core/design/tokens.dart'; -import '../../../core/di.dart'; -import '../../../core/api/api_client.dart'; -import '../../auth/cubit/auth_cubit.dart'; -import '../../auth/cubit/auth_state.dart'; -import '../../../core/ui/tripz_scaffold.dart'; -import 'package:flutter_native_splash/flutter_native_splash.dart'; - -class SplashScreen extends StatefulWidget { - const SplashScreen({super.key}); - - @override - State createState() => _SplashScreenState(); -} - -class _SplashScreenState extends State - with SingleTickerProviderStateMixin { - static const _kOnboardingSeen = 'onboarding_seen'; - - late final AnimationController _revealController; - late final Animation _fade; - late final Animation _scale; - - @override - void initState() { - super.initState(); - // حركة دخول واحدة هادئة: fade + scale ضمن أزمنة tokens (docs/29 §3.1) - _revealController = AnimationController(vsync: this, duration: T.slow); - final curved = CurvedAnimation( - parent: _revealController, - curve: Curves.easeOutCubic, - ); - _fade = curved; - _scale = Tween(begin: 0.85, end: 1.0).animate(curved); - _revealController.forward(); - WidgetsBinding.instance.addPostFrameCallback((_) => _route()); - } - - @override - void dispose() { - _revealController.dispose(); - super.dispose(); - } - - Future _route() async { - FlutterNativeSplash.remove(); - // Minimum 800ms for the native splash to fade out gracefully - await Future.delayed(const Duration(milliseconds: 800)); - - if (!mounted) return; - - final authStatus = context.read().state.status; - - if (authStatus != AuthStatus.authenticated) { - final prefs = await SharedPreferences.getInstance(); - if (!mounted) return; - final seen = prefs.getBool(_kOnboardingSeen) ?? false; - if (!seen) { - await prefs.setBool(_kOnboardingSeen, true); - if (!mounted) return; - context.go('/onboarding'); - } else { - context.go('/phone'); - } - return; - } - - final api = getIt(); - - Future?> pendingRating() async { - try { - final r = await api.dio - .get('/trips/rating/pending') - .timeout(const Duration(seconds: 3)); - final data = r.data; - if (data is Map && data['pending'] != null) { - return data; - } - return null; - } catch (_) { - return null; - } - } - - Future hasActiveTrip() async { - try { - final r = await api.dio - .get('/trips/mine') - .timeout(const Duration(seconds: 3)); - final data = r.data; - if (data == null) return false; - final items = (data['items'] ?? data) as List; - if (items.isEmpty) return false; - final status = items.first['status'] as String? ?? ''; - return [ - 'searching', - 'assigned', - 'driver_arriving', - 'driver_arrived', - 'in_progress', - ].contains(status); - } catch (_) { - return false; - } - } - - final results = await Future.wait([pendingRating(), hasActiveTrip()]); - final rating = results[0] as Map?; - final activeTrip = results[1] as bool; - - if (!mounted) return; - - if (rating != null) { - context.go('/trip-rating', extra: rating); - return; - } - - if (activeTrip) { - context.go('/trip-tracking'); - return; - } - - context.go('/home'); - } - - @override - Widget build(BuildContext context) { - final cs = Theme.of(context).colorScheme; - - // Just show the logo briefly — native splash handles the branded experience - return TripzScaffold( - backgroundColor: cs.surface, - padding: false, - safeAreaTop: false, - safeAreaBottom: false, - child: Stack( - alignment: Alignment.center, - children: [ - Center( - child: AnimatedBuilder( - animation: _revealController, - builder: (context, child) => Opacity( - opacity: _fade.value, - child: Transform.scale(scale: _scale.value, child: child), - ), - child: Padding( - padding: const EdgeInsets.symmetric(horizontal: T.s48), - child: Image.asset( - 'assets/images/logo.png', - width: 240, - - fit: BoxFit.contain, - errorBuilder: (_, __, ___) => Icon( - Icons.directions_car_filled_rounded, - size: 120, - color: cs.primary, - ), - ), - ), - ), - ), - // مؤشر تحميل خفيف ورقم الإصدار أسفل الشاشة — يظهر بعد اكتمال حركة الشعار - Positioned( - bottom: T.s32, - child: FadeTransition( - opacity: _revealController, - child: Column( - mainAxisSize: MainAxisSize.min, - children: [ - Row( - mainAxisSize: MainAxisSize.min, - children: List.generate(3, (i) { - return Padding( - padding: const EdgeInsets.symmetric(horizontal: T.s4), - child: _PulsingDot(color: cs.primary, delay: i * 150), - ); - }), - ), - const SizedBox(height: T.s16), - Text( - AppInfo.formattedVersion, - style: Theme.of(context).textTheme.labelSmall?.copyWith( - color: cs.onSurfaceVariant.withValues(alpha: 0.5), - letterSpacing: 1.2, - ), - ), - ], - ), - ), - ), - ], - ), - ); - } -} - -/// نقطة نابضة صغيرة — مؤشر تحميل زخرفي بلا شبكة، `CustomPaint`-free ويكفي هنا Container بسيط. -class _PulsingDot extends StatefulWidget { - const _PulsingDot({required this.color, required this.delay}); - - final Color color; - final int delay; - - @override - State<_PulsingDot> createState() => _PulsingDotState(); -} - -class _PulsingDotState extends State<_PulsingDot> - with SingleTickerProviderStateMixin { - late final AnimationController _controller; - - @override - void initState() { - super.initState(); - _controller = AnimationController(vsync: this, duration: T.slow * 3) - ..repeat(reverse: true); - Future.delayed(Duration(milliseconds: widget.delay), () { - if (mounted) _controller.forward(); - }); - } - - @override - void dispose() { - _controller.dispose(); - super.dispose(); - } - - @override - Widget build(BuildContext context) { - return AnimatedBuilder( - animation: _controller, - builder: (context, _) => Opacity( - opacity: 0.2 + (_controller.value * 0.6), - child: Container( - width: T.s8, - height: T.s8, - decoration: BoxDecoration(color: widget.color, shape: BoxShape.circle), - ), - ), - ); - } -} diff --git a/apps/rider-archive-cubit/lib/features/trip/bloc/trip_bloc.dart b/apps/rider-archive-cubit/lib/features/trip/bloc/trip_bloc.dart deleted file mode 100644 index 001749f..0000000 --- a/apps/rider-archive-cubit/lib/features/trip/bloc/trip_bloc.dart +++ /dev/null @@ -1,268 +0,0 @@ -import 'dart:async'; -import 'package:flutter_bloc/flutter_bloc.dart'; -import '../data/models/trip_model.dart'; -import '../data/trip_repository.dart'; -import '../data/trip_socket_service.dart'; -import '../data/trip_event_merger.dart'; -import 'trip_event.dart'; -import 'trip_state.dart'; - -/// TripBloc — Bloc الوحيد للراكب (docs/03 §14). -/// -/// يتعامل مع Lifecycle كامل: إنشاء → تتبّع → إتمام → تقييم. -/// المصادر الثلاث: أحداث المستخدم، WebSocket، FCM — تمر عبر TripEventMerger. -class TripBloc extends Bloc { - final TripRepository _tripRepo; - final TripSocketService _socket; - final TripEventMerger _merger; - Timer? _reconciliationTimer; - - TripBloc({ - required TripRepository tripRepo, - required TripSocketService socket, - TripEventMerger? merger, - }) : _tripRepo = tripRepo, - _socket = socket, - _merger = merger ?? TripEventMerger(), - super(const TripState()) { - on(_onCheckActive); - on(_onRequested); - on(_onUpdateReceived); - on(_onDriverLocation); - on(_onCancel); - on(_onRetry); - on(_onRate); - on(_onClear); - - // استمع لتحديثات TripEventMerger. - _merger.updateStream.listen((update) { - add(TripUpdateReceived( - tripId: update.tripId, - status: update.status, - driverId: update.driverId, - extra: update.extra, - )); - }); - - _merger.locationStream.listen((loc) { - add(TripDriverLocation( - tripId: loc.tripId, - lat: loc.lat, - lng: loc.lng, - heading: loc.heading, - speed: loc.speed, - )); - }); - - // اتصل بالـWebSocket. - _socket.connect(); - } - - /// فحص رحلة نشطة عند بدء التشغيل أو العودة من الخلفية. - Future _onCheckActive(TripCheckActive event, Emitter emit) async { - try { - final trip = await _tripRepo.getActiveTrip(); - if (trip != null) { - emit(state.copyWith( - requestStatus: _statusFromTrip(trip.status), - trip: trip, - )); - _joinTripRoom(trip.id); - _startReconciliation(trip.id); - } - } catch (_) { - // خطأ صامت — سنحاول مرة أخرى عند إعادة الاتصال. - } - } - - /// طلب رحلة جديدة. - Future _onRequested(TripRequested event, Emitter emit) async { - emit(state.copyWith(requestStatus: TripRequestStatus.loading, clearError: true)); - try { - final trip = await _tripRepo.createTrip( - pickupLat: event.pickupLat, - pickupLng: event.pickupLng, - pickupAddress: event.pickupAddress, - dropoffLat: event.dropoffLat, - dropoffLng: event.dropoffLng, - dropoffAddress: event.dropoffAddress, - vehicleClass: event.vehicleClass, - paymentMethod: event.paymentMethod, - couponCode: event.couponCode, - ); - emit(state.copyWith( - requestStatus: TripRequestStatus.searching, - trip: trip, - )); - _joinTripRoom(trip.id); - _startReconciliation(trip.id); - } catch (e) { - emit(state.copyWith( - requestStatus: TripRequestStatus.error, - error: e.toString(), - )); - } - } - - /// تحديث حالة الرحلة — من WebSocket أو FCM عبر TripEventMerger. - void _onUpdateReceived(TripUpdateReceived event, Emitter emit) { - final currentTrip = state.trip; - if (currentTrip == null || currentTrip.id != event.tripId) return; - - // التصفية الصامتة: تجاهل الأحداث القديمة. - final currentOrder = statusOrder(currentTrip.status); - final newOrder = statusOrder(event.status); - if (newOrder >= 0 && newOrder <= currentOrder) return; - - // تحديث النموذج محلياً. - final updatedTrip = TripModel( - id: currentTrip.id, - status: event.status, - clientId: currentTrip.clientId, - pickupLat: currentTrip.pickupLat, - pickupLng: currentTrip.pickupLng, - pickupAddress: currentTrip.pickupAddress, - dropoffLat: currentTrip.dropoffLat, - dropoffLng: currentTrip.dropoffLng, - dropoffAddress: currentTrip.dropoffAddress, - vehicleClass: currentTrip.vehicleClass, - fare: (event.extra['fare'] as num?) ?? currentTrip.fare, - currency: event.extra['currency'] as String? ?? currentTrip.currency, - paymentMethod: currentTrip.paymentMethod, - driverId: event.driverId ?? currentTrip.driverId, - createdAt: currentTrip.createdAt, - updatedAt: DateTime.now(), - ); - - final newStatus = _statusFromTrip(event.status); - - // استخراج معلومات السائق من extra. - final vehicle = event.extra['vehicle'] as Map?; - - emit(state.copyWith( - requestStatus: newStatus, - trip: updatedTrip, - driverName: event.extra['driverName'] as String?, - vehicleMake: vehicle?['make'] as String?, - vehicleModel: vehicle?['model'] as String?, - vehiclePlate: vehicle?['plate'] as String?, - vehicleColor: vehicle?['color'] as String?, - )); - - // حالة نهائية: أوقف مؤقت الم reconciliation. - if (isTerminalStatus(event.status)) { - _stopReconciliation(); - _socket.leaveTrip(event.tripId); - } - } - - /// موقع السائق الحي. - void _onDriverLocation(TripDriverLocation event, Emitter emit) { - if (state.trip?.id != event.tripId) return; - emit(state.copyWith( - driverLat: event.lat, - driverLng: event.lng, - driverHeading: event.heading, - )); - } - - /// إلغاء الرحلة. - Future _onCancel(TripCancelRequested event, Emitter emit) async { - if (state.trip == null) return; - try { - final trip = await _tripRepo.cancelTrip(state.trip!.id); - _stopReconciliation(); - _socket.leaveTrip(state.trip!.id); - emit(state.copyWith( - requestStatus: TripRequestStatus.completed, - trip: trip, - )); - } catch (e) { - emit(state.copyWith(error: e.toString())); - } - } - - /// إعادة المحاولة بعد خطأ. - void _onRetry(TripRetry event, Emitter emit) { - emit(state.copyWith(requestStatus: TripRequestStatus.idle, clearError: true)); - } - - /// تقييم الرحلة. - Future _onRate(TripRate event, Emitter emit) async { - if (state.trip == null) return; - try { - await _tripRepo.rateTrip(state.trip!.id, stars: event.stars, comment: event.comment); - emit(state.copyWith(rated: true)); - } catch (e) { - emit(state.copyWith(error: e.toString())); - } - } - - /// مسح الرحلة من الذاكرة. - void _onClear(TripClear event, Emitter emit) { - _stopReconciliation(); - emit(const TripState()); - } - - // --- مساعدات --- - - void _joinTripRoom(String tripId) { - _socket.joinTrip(tripId); - } - - void _startReconciliation(String tripId) { - _stopReconciliation(); - _reconciliationTimer = Timer.periodic(const Duration(seconds: 25), (_) async { - try { - final trip = await _tripRepo.getTrip(tripId); - if (trip != null) { - add(TripUpdateReceived( - tripId: trip.id, - status: trip.status, - driverId: trip.driverId, - extra: { - if (trip.fare != null) 'fare': trip.fare, - if (trip.currency != null) 'currency': trip.currency, - }, - )); - } - } catch (_) { - // خطأ صامت — سيحاول مرة أخرى. - } - }); - } - - void _stopReconciliation() { - _reconciliationTimer?.cancel(); - _reconciliationTimer = null; - } - - TripRequestStatus _statusFromTrip(String status) { - switch (status) { - case 'searching': - return TripRequestStatus.searching; - case 'assigned': - case 'driver_arriving': - case 'driver_arrived': - case 'in_progress': - return TripRequestStatus.active; - case 'completed': - case 'paid': - return TripRequestStatus.completed; - case 'cancelled': - case 'no_drivers': - case 'expired': - return TripRequestStatus.completed; - default: - return TripRequestStatus.searching; - } - } - - @override - Future close() { - _stopReconciliation(); - _merger.dispose(); - _socket.disconnect(); - return super.close(); - } -} diff --git a/apps/rider-archive-cubit/lib/features/trip/bloc/trip_event.dart b/apps/rider-archive-cubit/lib/features/trip/bloc/trip_event.dart deleted file mode 100644 index 2e9c7ce..0000000 --- a/apps/rider-archive-cubit/lib/features/trip/bloc/trip_event.dart +++ /dev/null @@ -1,109 +0,0 @@ -import 'package:equatable/equatable.dart'; - -/// أحداث TripBloc — المصادر الثلاث: المستخدم، WebSocket، FCM. -/// -/// كل حدث يحمل `timestamp` لتمييز التسلسل عند الحاجة. -sealed class TripEvent extends Equatable { - const TripEvent(); - - @override - List get props => []; -} - -/// فحص رحلة نشطة عند بدء التشغيل أو العودة للخلفية. -class TripCheckActive extends TripEvent { - const TripCheckActive(); -} - -/// طلب رحلة جديدة (من شاشة تأكيد الاختيار). -class TripRequested extends TripEvent { - final double pickupLat; - final double pickupLng; - final String? pickupAddress; - final double dropoffLat; - final double dropoffLng; - final String? dropoffAddress; - final String vehicleClass; - final String paymentMethod; - final String? couponCode; - - const TripRequested({ - required this.pickupLat, - required this.pickupLng, - this.pickupAddress, - required this.dropoffLat, - required this.dropoffLng, - this.dropoffAddress, - required this.vehicleClass, - this.paymentMethod = 'cash', - this.couponCode, - }); - - @override - List get props => [pickupLat, pickupLng, dropoffLat, dropoffLng, vehicleClass]; -} - -/// تحديث حالة الرحلة — ي הגיע عبر WebSocket أو FCM. -/// الترتيب: searching < assigned < driver_arriving < driver_arrived < in_progress < completed < paid -class TripUpdateReceived extends TripEvent { - final String tripId; - final String status; - final String? driverId; - final Map extra; - - const TripUpdateReceived({ - required this.tripId, - required this.status, - this.driverId, - this.extra = const {}, - }); - - @override - List get props => [tripId, status, driverId]; -} - -/// موقع السائق الحي — من WebSocket. -class TripDriverLocation extends TripEvent { - final String tripId; - final double lat; - final double lng; - final double heading; - final double speed; - - const TripDriverLocation({ - required this.tripId, - required this.lat, - required this.lng, - this.heading = 0, - this.speed = 0, - }); - - @override - List get props => [tripId, lat, lng]; -} - -/// إلغاء الرحلة من الراكب. -class TripCancelRequested extends TripEvent { - const TripCancelRequested(); -} - -/// إعادة المحاولة بعد خطأ. -class TripRetry extends TripEvent { - const TripRetry(); -} - -/// تقييم الرحلة المكتملة. -class TripRate extends TripEvent { - final int stars; - final String? comment; - - const TripRate({required this.stars, this.comment}); - - @override - List get props => [stars, comment]; -} - -/// مسح الرحلة من الذاكرة (بعد التقييم أو العودة للرئيسية). -class TripClear extends TripEvent { - const TripClear(); -} diff --git a/apps/rider-archive-cubit/lib/features/trip/bloc/trip_state.dart b/apps/rider-archive-cubit/lib/features/trip/bloc/trip_state.dart deleted file mode 100644 index 25cbf78..0000000 --- a/apps/rider-archive-cubit/lib/features/trip/bloc/trip_state.dart +++ /dev/null @@ -1,111 +0,0 @@ -import 'package:equatable/equatable.dart'; -import '../data/models/trip_model.dart'; - -/// هل هذه الحالة نهائية (لا انتقالات منها)? -bool isTerminalStatus(String status) { - return status == 'cancelled' || status == 'no_drivers' || status == 'expired' || status == 'paid'; -} - -/// حالة TripBloc الموحدة. -class TripState extends Equatable { - final TripRequestStatus requestStatus; - final TripModel? trip; - final String? driverName; - final String? vehicleMake; - final String? vehicleModel; - final String? vehiclePlate; - final String? vehicleColor; - final double? driverLat; - final double? driverLng; - final double? driverHeading; - final String? error; - final bool rated; - - const TripState({ - this.requestStatus = TripRequestStatus.idle, - this.trip, - this.driverName, - this.vehicleMake, - this.vehicleModel, - this.vehiclePlate, - this.vehicleColor, - this.driverLat, - this.driverLng, - this.driverHeading, - this.error, - this.rated = false, - }); - - TripState copyWith({ - TripRequestStatus? requestStatus, - TripModel? trip, - String? driverName, - String? vehicleMake, - String? vehicleModel, - String? vehiclePlate, - String? vehicleColor, - double? driverLat, - double? driverLng, - double? driverHeading, - String? error, - bool? rated, - bool clearError = false, - bool clearDriver = false, - }) { - return TripState( - requestStatus: requestStatus ?? this.requestStatus, - trip: trip ?? this.trip, - driverName: clearDriver ? null : (driverName ?? this.driverName), - vehicleMake: clearDriver ? null : (vehicleMake ?? this.vehicleMake), - vehicleModel: clearDriver ? null : (vehicleModel ?? this.vehicleModel), - vehiclePlate: clearDriver ? null : (vehiclePlate ?? this.vehiclePlate), - vehicleColor: clearDriver ? null : (vehicleColor ?? this.vehicleColor), - driverLat: driverLat ?? this.driverLat, - driverLng: driverLng ?? this.driverLng, - driverHeading: driverHeading ?? this.driverHeading, - error: clearError ? null : (error ?? this.error), - rated: rated ?? this.rated, - ); - } - - /// هل هناك رحلة نشطة (ليست idle ولا terminal)? - bool get hasActiveTrip => - trip != null && - requestStatus != TripRequestStatus.idle && - !isTerminalStatus(trip!.status); - - /// هل يمكن إلغاء الرحلة حالياً? - bool get canCancel { - if (trip == null) return false; - return ['searching', 'assigned', 'driver_arriving', 'driver_arrived'] - .contains(trip!.status); - } - - /// هل يمكن للمستخدم ركوب الرحلة (اكتملت)? - bool get isCompleted => trip?.status == 'completed' || trip?.status == 'paid'; - - @override - List get props => [ - requestStatus, - trip, - driverName, - vehicleMake, - vehicleModel, - vehiclePlate, - vehicleColor, - driverLat, - driverLng, - driverHeading, - error, - rated, - ]; -} - -enum TripRequestStatus { - idle, - loading, - searching, - active, // assigned → in_progress - completed, - error, -} diff --git a/apps/rider-archive-cubit/lib/features/trip/data/fcm_service.dart b/apps/rider-archive-cubit/lib/features/trip/data/fcm_service.dart deleted file mode 100644 index d190c42..0000000 --- a/apps/rider-archive-cubit/lib/features/trip/data/fcm_service.dart +++ /dev/null @@ -1,79 +0,0 @@ -import 'dart:async'; -import 'dart:io' show Platform; -import 'package:firebase_messaging/firebase_messaging.dart'; -import '../../../core/api/api_client.dart'; -import '../../../core/di.dart'; -import 'trip_event_merger.dart'; - -/// القناة الثانية للزمن الحقيقي — FCM data-message (docs/23 §15). -/// -/// تستقبل رسائل data-only من السيرفر حول تحديثات الرحلة وتُمرّرها -/// إلى TripEventMerger بنفس شكل WebSocket — أيّهما يسبق يفوز، -/// والـ merger يتكفّل بالتصفية الصامتة. -class FcmService { - final TripEventMerger _merger; - StreamSubscription? _onMessageSub; - StreamSubscription? _onOpenSub; - - FcmService(this._merger); - - /// تهيئة FCM بعد تسجيل الدخول — تُستدعى من نقطة واحدة. - Future init() async { - final messaging = FirebaseMessaging.instance; - - await messaging.requestPermission( - alert: false, - badge: false, - sound: false, - provisional: false, - ); - - final token = await messaging.getToken(); - if (token != null) { - _registerToken(token); - } - messaging.onTokenRefresh.listen(_registerToken); - - _onMessageSub = FirebaseMessaging.onMessage.listen(_handleMessage); - _onOpenSub = FirebaseMessaging.onMessageOpenedApp.listen(_handleMessage); - } - - void dispose() { - _onMessageSub?.cancel(); - _onOpenSub?.cancel(); - } - - void _handleMessage(RemoteMessage message) { - final data = message.data; - final type = data['type'] as String?; - final tripId = data['tripId'] as String?; - - if (type == null || tripId == null || tripId.isEmpty) return; - - final status = type.startsWith('trip_') ? type.substring(5) : null; - if (status == null) return; - - final extra = Map.from(data) - ..remove('type') - ..remove('tripId') - ..remove('title') - ..remove('body'); - - _merger.addUpdate(TripUpdate( - tripId: tripId, - status: status, - driverId: data['driverId'] as String?, - extra: extra, - )); - } - - static Future _registerToken(String token) async { - try { - final api = getIt(); - await api.dio.post('/notifications/token', data: { - 'token': token, - 'platform': Platform.isIOS ? 'ios' : 'android', - }); - } catch (_) {} - } -} diff --git a/apps/rider-archive-cubit/lib/features/trip/data/models/stop_model.dart b/apps/rider-archive-cubit/lib/features/trip/data/models/stop_model.dart deleted file mode 100644 index f3db48f..0000000 --- a/apps/rider-archive-cubit/lib/features/trip/data/models/stop_model.dart +++ /dev/null @@ -1,33 +0,0 @@ -import 'package:equatable/equatable.dart'; - -/// نقطة توقف أثناء الرحلة. -class StopModel extends Equatable { - final double lat; - final double lng; - final String? label; - final String? address; - - const StopModel({ - required this.lat, - required this.lng, - this.label, - this.address, - }); - - factory StopModel.fromJson(Map j) => StopModel( - lat: (j['lat'] as num).toDouble(), - lng: (j['lng'] as num).toDouble(), - label: j['label'] as String?, - address: j['address'] as String?, - ); - - Map toJson() => { - 'lat': lat, - 'lng': lng, - if (label != null) 'label': label, - if (address != null) 'address': address, - }; - - @override - List get props => [lat, lng, label, address]; -} diff --git a/apps/rider-archive-cubit/lib/features/trip/data/models/trip_model.dart b/apps/rider-archive-cubit/lib/features/trip/data/models/trip_model.dart deleted file mode 100644 index cbff65e..0000000 --- a/apps/rider-archive-cubit/lib/features/trip/data/models/trip_model.dart +++ /dev/null @@ -1,121 +0,0 @@ -import 'package:equatable/equatable.dart'; - -/// حالة الرحلة — تُرتيب حسب docs/03 §7. -enum TripStatus { - requested, - accepted, - arriving, - arrived, - inProgress, - completed, - cancelled, -} - -/// نموذج الرحلة المُنشأة من trips endpoint. -class TripModel extends Equatable { - final String id; - final String status; - final String clientId; - final double pickupLat; - final double pickupLng; - final String? pickupAddress; - final double dropoffLat; - final double dropoffLng; - final String? dropoffAddress; - final String vehicleClass; - final num? fare; - final String? currency; - final String? paymentMethod; - final String? couponCode; - final String? driverId; - final String? driverName; - final String? driverPhone; - final double? driverLat; - final double? driverLng; - final String? vehicleMake; - final String? vehicleModel; - final String? vehicleColor; - final String? plateNumber; - final DateTime? createdAt; - final DateTime? updatedAt; - - const TripModel({ - required this.id, - required this.status, - required this.clientId, - required this.pickupLat, - required this.pickupLng, - this.pickupAddress, - required this.dropoffLat, - required this.dropoffLng, - this.dropoffAddress, - required this.vehicleClass, - this.fare, - this.currency, - this.paymentMethod, - this.couponCode, - this.driverId, - this.driverName, - this.driverPhone, - this.driverLat, - this.driverLng, - this.vehicleMake, - this.vehicleModel, - this.vehicleColor, - this.plateNumber, - this.createdAt, - this.updatedAt, - }); - - factory TripModel.fromJson(Map j) => TripModel( - id: j['id'] as String, - status: j['status'] as String, - clientId: (j['clientId'] ?? '') as String, - pickupLat: (j['pickup']?['lat'] ?? j['pickupLat'] ?? 0).toDouble(), - pickupLng: (j['pickup']?['lng'] ?? j['pickupLng'] ?? 0).toDouble(), - pickupAddress: (j['pickup']?['address'] ?? j['pickupAddress']) as String?, - dropoffLat: (j['dropoff']?['lat'] ?? j['dropoffLat'] ?? 0).toDouble(), - dropoffLng: (j['dropoff']?['lng'] ?? j['dropoffLng'] ?? 0).toDouble(), - dropoffAddress: (j['dropoff']?['address'] ?? j['dropoffAddress']) as String?, - vehicleClass: (j['vehicleClass'] ?? '') as String, - fare: (j['fare'] as num?), - currency: j['currency'] as String?, - paymentMethod: j['paymentMethod'] as String?, - couponCode: j['couponCode'] as String?, - driverId: j['driverId'] as String?, - driverName: j['driverName'] as String?, - driverPhone: j['driverPhone'] as String?, - driverLat: (j['driverLat'] as num?)?.toDouble(), - driverLng: (j['driverLng'] as num?)?.toDouble(), - vehicleMake: j['vehicleMake'] as String?, - vehicleModel: j['vehicleModel'] as String?, - vehicleColor: j['vehicleColor'] as String?, - plateNumber: j['plateNumber'] as String?, - createdAt: j['createdAt'] != null ? DateTime.tryParse(j['createdAt'] as String) : null, - updatedAt: j['updatedAt'] != null ? DateTime.tryParse(j['updatedAt'] as String) : null, - ); - - TripStatus get parsedStatus { - switch (status) { - case 'requested': - return TripStatus.requested; - case 'accepted': - return TripStatus.accepted; - case 'arriving': - return TripStatus.arriving; - case 'arrived': - return TripStatus.arrived; - case 'in_progress': - return TripStatus.inProgress; - case 'completed': - return TripStatus.completed; - case 'cancelled': - return TripStatus.cancelled; - default: - return TripStatus.requested; - } - } - - @override - List get props => [id, status, clientId, vehicleClass]; -} diff --git a/apps/rider-archive-cubit/lib/features/trip/data/trip_event_merger.dart b/apps/rider-archive-cubit/lib/features/trip/data/trip_event_merger.dart deleted file mode 100644 index 6ff0960..0000000 --- a/apps/rider-archive-cubit/lib/features/trip/data/trip_event_merger.dart +++ /dev/null @@ -1,96 +0,0 @@ -import 'dart:async'; - -/// تحديث حالة من أي مصدر (WebSocket أو FCM). -class TripUpdate { - final String tripId; - final String status; - final String? driverId; - final Map extra; - - const TripUpdate({ - required this.tripId, - required this.status, - this.driverId, - this.extra = const {}, - }); -} - -/// موقع سائق من WebSocket. -class DriverLocationUpdate { - final String tripId; - final double lat; - final double lng; - final double heading; - final double speed; - - const DriverLocationUpdate({ - required this.tripId, - required this.lat, - required this.lng, - this.heading = 0, - this.speed = 0, - }); -} - -/// ترتيب الحالات — يُستخدم للتصفية الصامتة (docs/23 §15). -int statusOrder(String s) { - switch (s) { - case 'searching': - return 0; - case 'assigned': - return 1; - case 'driver_arriving': - return 2; - case 'driver_arrived': - return 3; - case 'in_progress': - return 4; - case 'completed': - return 5; - case 'paid': - return 6; - default: - return -1; - } -} - -/// محول أحداث موحّد — يستقبل من WebSocket وFCM ويُخرج أولاً-فوزان. -/// -/// التصفية الصامتة: أي حدث بحالة ≤ الحالة المعروضة يُهمل. -/// لا حاجة لمعرّفات رسالة — ترتيب الحالات يكفي (docs/23 §15). -class TripEventMerger { - final _updateController = StreamController.broadcast(); - final _locationController = StreamController.broadcast(); - - /// الحالة المعروضة حالياً لكل رحلة — للتصفية الصامتة. - final Map _currentOrder = {}; - - Stream get updateStream => _updateController.stream; - Stream get locationStream => _locationController.stream; - - /// استقبال تحديث حالة من أي مصدر. - void addUpdate(TripUpdate update) { - final newOrder = statusOrder(update.status); - final currentOrder = _currentOrder[update.tripId] ?? -1; - - // التصفية الصامتة: تجاهل الأحداث القديمة أو المتطابقة. - if (newOrder >= 0 && newOrder <= currentOrder) return; - - // تحديث الحالة المعروضة. - if (newOrder >= 0) { - _currentOrder[update.tripId] = newOrder; - } - - _updateController.add(update); - } - - /// استقبال موقع سائق (لا يحتاج تصفية — كل ping مفيد). - void addLocation(DriverLocationUpdate location) { - _locationController.add(location); - } - - void dispose() { - _updateController.close(); - _locationController.close(); - } -} diff --git a/apps/rider-archive-cubit/lib/features/trip/data/trip_repository.dart b/apps/rider-archive-cubit/lib/features/trip/data/trip_repository.dart deleted file mode 100644 index ab66dba..0000000 --- a/apps/rider-archive-cubit/lib/features/trip/data/trip_repository.dart +++ /dev/null @@ -1,112 +0,0 @@ -import 'package:uuid/uuid.dart'; -import '../../../core/api/api_client.dart'; -import 'models/trip_model.dart'; -import 'models/stop_model.dart'; - -const _uuid = Uuid(); - -/// مستودع الرحلات — يُستخدم من TripBloc. -class TripRepository { - final ApiClient _api; - TripRepository(this._api); - - /// GET /trips/mine — استرجاع رحلة نشطة. - Future getActiveTrip() async { - try { - final r = await _api.dio.get('/trips/mine'); - final data = r.data; - if (data == null) return null; - final items = (data['items'] ?? data) as List; - if (items.isEmpty) return null; - final trip = TripModel.fromJson(items.first as Map); - final active = ['searching', 'assigned', 'driver_arriving', 'driver_arrived', 'in_progress']; - if (!active.contains(trip.status)) return null; - - // تصفية: إذا مرت أكثر من 60 دقيقة على إنشاء الرحلة، لا تُعتبر نشطة - if (trip.createdAt != null) { - final age = DateTime.now().difference(trip.createdAt!); - if (age.inMinutes >= 60) return null; - } - return trip; - } catch (_) { - return null; - } - } - - /// GET /trips/:id — جلب رحلة محددة. - Future getTrip(String tripId) async { - try { - final r = await _api.dio.get('/trips/$tripId'); - return TripModel.fromJson(r.data as Map); - } catch (_) { - return null; - } - } - - /// POST /trips — إنشاء رحلة جديدة. - Future createTrip({ - required double pickupLat, - required double pickupLng, - String? pickupAddress, - required double dropoffLat, - required double dropoffLng, - String? dropoffAddress, - List? stops, - required String vehicleClass, - String paymentMethod = 'cash', - String? couponCode, - String? scheduledAt, - }) async { - final data = { - 'clientId': _uuid.v4(), - 'pickup': { - 'lat': pickupLat, - 'lng': pickupLng, - if (pickupAddress != null) 'address': pickupAddress, - }, - 'dropoff': { - 'lat': dropoffLat, - 'lng': dropoffLng, - if (dropoffAddress != null) 'address': dropoffAddress, - }, - 'vehicleClass': vehicleClass, - 'paymentMethod': paymentMethod, - }; - if (stops != null && stops.isNotEmpty) { - data['stops'] = stops.map((s) => s.toJson()).toList(); - } - if (couponCode != null && couponCode.isNotEmpty) { - data['couponCode'] = couponCode; - } - if (scheduledAt != null) data['scheduledAt'] = scheduledAt; - - final r = await _api.dio.post('/trips', data: data); - return TripModel.fromJson(r.data as Map); - } - - /// POST /trips/:id/cancel — إلغاء الرحلة. - Future cancelTrip(String tripId) async { - final r = await _api.dio.post('/trips/$tripId/cancel'); - return TripModel.fromJson(r.data as Map); - } - - /// POST /trips/:id/rate — تقييم الرحلة. - Future rateTrip(String tripId, {required int stars, String? comment}) async { - await _api.dio.post('/trips/$tripId/rate', data: { - 'stars': stars, - if (comment != null && comment.isNotEmpty) 'comment': comment, - }); - } - - /// GET /trips/rating/pending — هل هناك تقييم معلّق? - Future?> getPendingRating() async { - try { - final r = await _api.dio.get('/trips/rating/pending'); - final data = r.data as Map; - if (data['pending'] != null) return data; - return null; - } catch (_) { - return null; - } - } -} diff --git a/apps/rider-archive-cubit/lib/features/trip/data/trip_socket_service.dart b/apps/rider-archive-cubit/lib/features/trip/data/trip_socket_service.dart deleted file mode 100644 index e85048c..0000000 --- a/apps/rider-archive-cubit/lib/features/trip/data/trip_socket_service.dart +++ /dev/null @@ -1,105 +0,0 @@ -import 'dart:async'; -import 'package:socket_io_client/socket_io_client.dart' as io; -import '../../../core/config.dart'; -import '../../../core/storage/token_store.dart'; -import 'trip_event_merger.dart'; - -/// خدمة WebSocket — تتبع رحلة عبر Socket.IO. -/// -/// الاتصال مُصادق عبر JWT (نفس توكن API). -/// الأحداث الواردة تُمرّ عبر TripEventMerger. -class TripSocketService { - final TokenStore _tokenStore; - final TripEventMerger _merger; - - io.Socket? _socket; - bool _connected = false; - String? _currentTripId; - - TripSocketService(this._tokenStore, this._merger); - - /// الاتصال بالخادم. - Future connect() async { - if (_connected) return; - - final token = await _tokenStore.access(); - if (token == null || token.isEmpty) return; - - _socket = io.io( - AppConfig.baseUrl.replaceAll('/api', ''), - io.OptionBuilder() - .setTransports(['websocket']) - .enableAutoConnect() - .enableReconnection() - .setReconnectionDelay(2000) - .setReconnectionAttempts(10) - .setAuth({'token': token}) - .build(), - ); - - _socket!.onConnect((_) { - _connected = true; - }); - - _socket!.onDisconnect((_) { - _connected = false; - }); - - _socket!.onReconnect((_) { - // عند إعادة الاتصال: أعد الانضمام لغرفة الرحلة. - if (_currentTripId != null) { - joinTrip(_currentTripId!); - } - }); - - // استقبال تحديثات الحالة. - _socket!.on('trip:update', (data) { - if (data is! Map) return; - final map = Map.from(data); - _merger.addUpdate(TripUpdate( - tripId: map['tripId'] as String? ?? '', - status: map['status'] as String? ?? '', - driverId: map['driverId'] as String?, - extra: map..remove('tripId')..remove('status')..remove('driverId'), - )); - }); - - // استقبال موقع السائق الحي. - _socket!.on('driver:location', (data) { - if (data is! Map) return; - final map = Map.from(data); - _merger.addLocation(DriverLocationUpdate( - tripId: map['tripId'] as String? ?? '', - lat: (map['lat'] as num?)?.toDouble() ?? 0, - lng: (map['lng'] as num?)?.toDouble() ?? 0, - heading: (map['heading'] as num?)?.toDouble() ?? 0, - speed: (map['speed'] as num?)?.toDouble() ?? 0, - )); - }); - - _socket!.connect(); - } - - /// الانضمام لغرفة الرحلة. - void joinTrip(String tripId) { - _currentTripId = tripId; - _socket?.emit('trip:join', {'tripId': tripId}); - } - - /// مغادرة غرفة الرحلة. - void leaveTrip(String tripId) { - _currentTripId = null; - // Socket.IO لا يدعم مغادرة الغرفة بشكل صريح، - // لكن عند رحلة جديدة سننضم للغرفة الجديدة. - } - - /// قطع الاتصال. - void disconnect() { - _socket?.disconnect(); - _socket?.dispose(); - _socket = null; - _connected = false; - } - - bool get isConnected => _connected; -} diff --git a/apps/rider-archive-cubit/lib/features/trip/view/rating_screen.dart b/apps/rider-archive-cubit/lib/features/trip/view/rating_screen.dart deleted file mode 100644 index 9ceaecc..0000000 --- a/apps/rider-archive-cubit/lib/features/trip/view/rating_screen.dart +++ /dev/null @@ -1,118 +0,0 @@ -import 'package:flutter/material.dart'; -import 'package:flutter_bloc/flutter_bloc.dart'; -import '../../../core/l10n/app_localizations.dart'; -import 'package:go_router/go_router.dart'; -import '../../../core/design/tokens.dart'; -import '../../../core/ui/tripz_button.dart'; -import '../../../core/ui/tripz_scaffold.dart'; -import '../bloc/trip_bloc.dart'; -import '../bloc/trip_state.dart'; -import '../bloc/trip_event.dart'; - -/// شاشة تقييم الرحلة. -class RatingScreen extends StatefulWidget { - const RatingScreen({super.key}); - - @override - State createState() => _RatingScreenState(); -} - -class _RatingScreenState extends State { - int _stars = 0; - final _commentController = TextEditingController(); - - @override - void dispose() { - _commentController.dispose(); - super.dispose(); - } - - @override - Widget build(BuildContext context) { - final l10n = AppLocalizations.of(context)!; - final cs = Theme.of(context).colorScheme; - - return BlocListener( - listenWhen: (prev, cur) => prev.rated != cur.rated, - listener: (context, state) { - if (state.rated) { - ScaffoldMessenger.of(context).showSnackBar( - SnackBar(content: Text(l10n.thankYou)), - ); - context.read().add(const TripClear()); - context.go('/home'); - } - }, - child: TripzScaffold( - title: l10n.rateYourTrip, - showBackButton: true, - onBack: () { - context.read().add(const TripClear()); - context.go('/home'); - }, - child: Column( - children: [ - const Spacer(flex: 2), - - // نجوم التقييم - Text( - l10n.rateDriver, - style: Theme.of(context).textTheme.headlineSmall?.copyWith( - fontWeight: FontWeight.w700, - ), - ), - const SizedBox(height: T.s24), - Row( - mainAxisAlignment: MainAxisAlignment.center, - children: List.generate(5, (i) { - final index = i + 1; - return GestureDetector( - onTap: () => setState(() => _stars = index), - child: Padding( - padding: const EdgeInsets.symmetric(horizontal: 6), - child: Icon( - index <= _stars ? Icons.star_rounded : Icons.star_outline_rounded, - size: 48, - color: index <= _stars ? Colors.amber : cs.onSurfaceVariant, - ), - ), - ); - }), - ), - - const SizedBox(height: T.s24), - - // حقل التعليق - TextField( - controller: _commentController, - maxLines: 3, - decoration: InputDecoration( - hintText: l10n.ratingComment, - border: const OutlineInputBorder(), - ), - ), - - const Spacer(flex: 3), - - // زر الإرسال - SizedBox( - width: double.infinity, - child: TripzButton( - label: l10n.submitRating, - onPressed: _stars > 0 - ? () { - context.read().add(TripRate( - stars: _stars, - comment: _commentController.text, - )); - } - : null, - ), - ), - const SizedBox(height: T.s8), - ], - ), - ), - ); - } -} diff --git a/apps/rider-archive-cubit/lib/features/trip/view/trip_invoice_screen.dart b/apps/rider-archive-cubit/lib/features/trip/view/trip_invoice_screen.dart deleted file mode 100644 index 894feaf..0000000 --- a/apps/rider-archive-cubit/lib/features/trip/view/trip_invoice_screen.dart +++ /dev/null @@ -1,133 +0,0 @@ -import 'package:flutter/material.dart'; -import 'package:flutter_bloc/flutter_bloc.dart'; -import '../../../core/l10n/app_localizations.dart'; -import 'package:go_router/go_router.dart'; -import '../../../core/design/tokens.dart'; -import '../../../core/ui/tripz_button.dart'; -import '../../../core/ui/tripz_scaffold.dart'; -import '../bloc/trip_bloc.dart'; -import '../bloc/trip_state.dart'; -import '../bloc/trip_event.dart'; - -/// شاشة فاتورة الرحلة بعد الانتهاء. -class TripInvoiceScreen extends StatelessWidget { - const TripInvoiceScreen({super.key}); - - @override - Widget build(BuildContext context) { - final l10n = AppLocalizations.of(context)!; - - return BlocBuilder( - builder: (context, state) { - final trip = state.trip; - if (trip == null) { - return TripzScaffold( - title: l10n.rideCompleted, - showBackButton: true, - onBack: () => context.go('/home'), - child: const Center(child: CircularProgressIndicator()), - ); - } - - final fare = trip.fare ?? 0; - final currency = trip.currency ?? 'JOD'; - - return TripzScaffold( - title: l10n.rideCompleted, - showBackButton: false, - child: Column( - children: [ - // أيقونة النجاح - Container( - width: 80, - height: 80, - decoration: BoxDecoration( - color: Colors.green.withValues(alpha: 0.1), - shape: BoxShape.circle, - ), - child: const Icon(Icons.check_circle_rounded, size: 48, color: Colors.green), - ), - const SizedBox(height: T.s16), - Text( - l10n.rideCompleted, - style: Theme.of(context).textTheme.headlineSmall?.copyWith( - fontWeight: FontWeight.w700, - ), - ), - const SizedBox(height: T.s24), - - // تفاصيل الأجرة - Card( - child: Padding( - padding: const EdgeInsets.all(T.pagePadding), - child: Column( - crossAxisAlignment: CrossAxisAlignment.stretch, - children: [ - Text(l10n.fareBreakdown, - style: Theme.of(context).textTheme.titleMedium?.copyWith( - fontWeight: FontWeight.w600, - )), - const SizedBox(height: T.s12), - _FareRow(label: l10n.tripFare, value: '$fare $currency'), - if (trip.paymentMethod == 'wallet') - _FareRow(label: l10n.walletPayment, value: l10n.youPaid), - if (trip.paymentMethod == 'cash') - _FareRow(label: l10n.cash, value: l10n.payCash), - const Divider(height: T.s16), - _FareRow( - label: l10n.total, - value: '$fare $currency', - bold: true, - ), - ], - ), - ), - ), - - const Spacer(), - - // أزرار الإجراءات - TripzButton( - label: l10n.rateYourTrip, - onPressed: () => context.push('/trip-rating'), - ), - const SizedBox(height: T.s8), - TextButton( - onPressed: () { - context.read().add(const TripClear()); - context.go('/home'); - }, - child: Text(l10n.skipRating), - ), - ], - ), - ); - }, - ); - } -} - -class _FareRow extends StatelessWidget { - final String label; - final String value; - final bool bold; - - const _FareRow({required this.label, required this.value, this.bold = false}); - - @override - Widget build(BuildContext context) { - final style = bold - ? Theme.of(context).textTheme.titleMedium?.copyWith(fontWeight: FontWeight.w700) - : Theme.of(context).textTheme.bodyMedium; - return Padding( - padding: const EdgeInsets.symmetric(vertical: 4), - child: Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - Text(label, style: style), - Text(value, style: style), - ], - ), - ); - } -} diff --git a/apps/rider-archive-cubit/lib/features/trip/view/trip_tracking_screen.dart b/apps/rider-archive-cubit/lib/features/trip/view/trip_tracking_screen.dart deleted file mode 100644 index 6834203..0000000 --- a/apps/rider-archive-cubit/lib/features/trip/view/trip_tracking_screen.dart +++ /dev/null @@ -1,274 +0,0 @@ -import 'dart:async'; -import 'package:flutter/material.dart'; -import 'package:flutter_bloc/flutter_bloc.dart'; -import '../../../core/l10n/app_localizations.dart'; -import 'package:go_router/go_router.dart'; -import 'package:intaleq_maps/intaleq_maps.dart'; -import '../../../core/design/tokens.dart'; -import '../../../core/ui/tripz_scaffold.dart'; -import '../bloc/trip_bloc.dart'; -import '../bloc/trip_state.dart'; -import '../bloc/trip_event.dart'; -import 'widgets/driver_card.dart'; -import 'widgets/trip_status_banner.dart'; - -/// شاشة تتبع الرحلة — من searching إلى completed. -class TripTrackingScreen extends StatefulWidget { - const TripTrackingScreen({super.key}); - - @override - State createState() => _TripTrackingScreenState(); -} - -class _TripTrackingScreenState extends State { - Timer? _cameraFollowTimer; - - @override - void initState() { - super.initState(); - // مراقبة حالة التطبيق للتحقق من الرحلة النشطة عند العودة. - WidgetsBinding.instance.addObserver(_AppLifecycleObserver(context)); - } - - @override - void dispose() { - _cameraFollowTimer?.cancel(); - super.dispose(); - } - - @override - Widget build(BuildContext context) { - final l10n = AppLocalizations.of(context)!; - - return BlocConsumer( - listenWhen: (prev, cur) => prev.trip?.status != cur.trip?.status, - listener: (context, state) { - if (state.isCompleted) { - // الرحلة اكتملت — انتقل لشاشة الفاتورة. - context.pushReplacement('/trip-invoice'); - } - }, - builder: (context, state) { - final trip = state.trip; - if (trip == null) { - return TripzScaffold( - showBackButton: true, - onBack: () { - context.read().add(const TripClear()); - context.go('/home'); - }, - child: Center( - child: Column( - mainAxisSize: MainAxisSize.min, - children: [ - const CircularProgressIndicator(), - const SizedBox(height: T.s16), - Text(l10n.loading), - ], - ), - ), - ); - } - - final pickup = LatLng(trip.pickupLat, trip.pickupLng); - final dropoff = LatLng(trip.dropoffLat, trip.dropoffLng); - final driverPos = state.driverLat != null && state.driverLng != null - ? LatLng(state.driverLat!, state.driverLng!) - : null; - - return Scaffold( - body: Stack( - children: [ - // الخريطة - IntaleqMap( - apiKey: '', - initialCameraPosition: CameraPosition( - target: driverPos ?? pickup, - zoom: 15, - ), - mapType: Theme.of(context).brightness == Brightness.dark - ? IntaleqMapType.normal - : IntaleqMapType.light, - myLocationEnabled: true, - myLocationButtonEnabled: false, - zoomControlsEnabled: false, - compassEnabled: false, - onMapCreated: (_) {}, - markers: _buildMarkers(pickup, dropoff, driverPos), - ), - - // شريط الحالة العلوي - Positioned( - top: MediaQuery.of(context).padding.top + T.s8, - left: T.pagePadding, - right: T.pagePadding, - child: TripStatusBanner(status: trip.status), - ), - - // بطاقة السائق (إذا تم تعيينه) - if (state.requestStatus == TripRequestStatus.active) - Positioned( - left: T.pagePadding, - right: T.pagePadding, - bottom: T.pagePadding, - child: DriverCard( - driverName: state.driverName ?? '', - vehicleMake: state.vehicleMake ?? '', - vehicleModel: state.vehicleModel ?? '', - vehiclePlate: state.vehiclePlate ?? '', - vehicleColor: state.vehicleColor ?? '', - status: trip.status, - onCall: () { - // TODO: WebRTC calling — Phase 3 - }, - onChat: () { - // TODO: Chat — Phase 3 - }, - onCancel: state.canCancel - ? () => context - .read() - .add(const TripCancelRequested()) - : null, - ), - ), - - // شاشة البحث (قبل تعيين السائق) - if (state.requestStatus == TripRequestStatus.searching) - _SearchingBody(elapsed: 0), - ], - ), - ); - }, - ); - } - - Set _buildMarkers(LatLng pickup, LatLng dropoff, LatLng? driverPos) { - final markers = { - Marker( - markerId: const MarkerId('pickup'), - position: pickup, - icon: InlqBitmap.defaultMarkerWithHue(210), - anchor: const Offset(0.5, 1.0), - ), - Marker( - markerId: const MarkerId('dropoff'), - position: dropoff, - icon: InlqBitmap.defaultMarkerWithHue(0), - anchor: const Offset(0.5, 1.0), - ), - }; - if (driverPos != null) { - markers.add(Marker( - markerId: const MarkerId('driver'), - position: driverPos, - icon: InlqBitmap.defaultMarkerWithHue(140), - anchor: const Offset(0.5, 0.5), - zIndex: 3, - )); - } - return markers; - } -} - -/// شاشة البحث عن سائق مع مؤقت. -class _SearchingBody extends StatefulWidget { - final int elapsed; - const _SearchingBody({required this.elapsed}); - - @override - State<_SearchingBody> createState() => _SearchingBodyState(); -} - -class _SearchingBodyState extends State<_SearchingBody> - with SingleTickerProviderStateMixin { - late AnimationController _pulse; - late Animation _scale; - - @override - void initState() { - super.initState(); - _pulse = - AnimationController(vsync: this, duration: const Duration(seconds: 2)) - ..repeat(reverse: true); - _scale = Tween(begin: 0.8, end: 1.2).animate( - CurvedAnimation(parent: _pulse, curve: Curves.easeInOut), - ); - } - - @override - void dispose() { - _pulse.dispose(); - super.dispose(); - } - - @override - Widget build(BuildContext context) { - final l10n = AppLocalizations.of(context)!; - final cs = Theme.of(context).colorScheme; - - return Material( - color: Colors.black54, - child: Center( - child: Container( - margin: const EdgeInsets.all(T.pagePadding * 2), - padding: const EdgeInsets.all(T.pagePadding * 1.5), - decoration: BoxDecoration( - color: cs.surface, - borderRadius: BorderRadius.circular(T.r16), - boxShadow: [T.shadowLg], - ), - child: Column( - mainAxisSize: MainAxisSize.min, - children: [ - ScaleTransition( - scale: _scale, - child: Container( - width: 80, - height: 80, - decoration: BoxDecoration( - color: cs.primaryContainer, - shape: BoxShape.circle, - ), - child: Icon(Icons.directions_car_filled_rounded, - size: 40, color: cs.onPrimaryContainer), - ), - ), - const SizedBox(height: T.s16), - Text(l10n.searchingDriver, - style: Theme.of(context) - .textTheme - .titleMedium - ?.copyWith(fontWeight: FontWeight.w600), - textAlign: TextAlign.center), - const SizedBox(height: T.s20), - SizedBox( - width: double.infinity, - child: OutlinedButton( - onPressed: () => - context.read().add(const TripCancelRequested()), - style: OutlinedButton.styleFrom( - foregroundColor: cs.error, - side: BorderSide(color: cs.error)), - child: Text(l10n.cancelSearch), - ), - ), - ], - ), - ), - ), - ); - } -} - -/// مراقب دورة حياة التطبيق — يتحقق من الرحلة عند العودة. -class _AppLifecycleObserver extends WidgetsBindingObserver { - final BuildContext context; - _AppLifecycleObserver(this.context); - - @override - void didChangeAppLifecycleState(AppLifecycleState state) { - if (state == AppLifecycleState.resumed) { - context.read().add(const TripCheckActive()); - } - } -} diff --git a/apps/rider-archive-cubit/lib/features/trip/view/widgets/driver_card.dart b/apps/rider-archive-cubit/lib/features/trip/view/widgets/driver_card.dart deleted file mode 100644 index f877e87..0000000 --- a/apps/rider-archive-cubit/lib/features/trip/view/widgets/driver_card.dart +++ /dev/null @@ -1,150 +0,0 @@ -import 'package:flutter/material.dart'; -import '../../../../core/l10n/app_localizations.dart'; -import '../../../../core/design/tokens.dart'; - -/// بطاقة السائق في شاشة التتبع. -class DriverCard extends StatelessWidget { - final String driverName; - final String vehicleMake; - final String vehicleModel; - final String vehiclePlate; - final String vehicleColor; - final String status; - final VoidCallback? onCall; - final VoidCallback? onChat; - final VoidCallback? onCancel; - - const DriverCard({ - super.key, - required this.driverName, - required this.vehicleMake, - required this.vehicleModel, - required this.vehiclePlate, - required this.vehicleColor, - required this.status, - this.onCall, - this.onChat, - this.onCancel, - }); - - @override - Widget build(BuildContext context) { - final l10n = AppLocalizations.of(context)!; - final cs = Theme.of(context).colorScheme; - - return Card( - elevation: 4, - child: Padding( - padding: const EdgeInsets.all(T.pagePadding), - child: Column( - mainAxisSize: MainAxisSize.min, - children: [ - // صف الصورة + المعلومات - Row( - children: [ - // صورة السائق ( Placeholder ) - CircleAvatar( - radius: 28, - backgroundColor: cs.primaryContainer, - child: Icon(Icons.person, color: cs.onPrimaryContainer), - ), - const SizedBox(width: T.s12), - // اسم السائق + التقييم - Expanded( - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Text( - driverName.isNotEmpty ? driverName : l10n.loading, - style: Theme.of(context).textTheme.titleMedium?.copyWith( - fontWeight: FontWeight.w600, - ), - ), - const SizedBox(height: 2), - Row( - children: [ - Icon(Icons.star_rounded, size: 16, color: Colors.amber), - const SizedBox(width: 4), - Text(l10n.driverRatingValue, style: Theme.of(context).textTheme.bodySmall), - ], - ), - ], - ), - ), - ], - ), - - const SizedBox(height: T.s12), - const Divider(height: 1), - const SizedBox(height: T.s12), - - // معلومات المركبة - Row( - children: [ - Icon(Icons.directions_car_filled_rounded, size: 20, color: cs.onSurfaceVariant), - const SizedBox(width: T.s8), - Expanded( - child: Text( - '$vehicleColor $vehicleMake $vehicleModel', - style: Theme.of(context).textTheme.bodyMedium, - maxLines: 1, - overflow: TextOverflow.ellipsis, - ), - ), - // رقم اللوحة — بارز بوضوح - Container( - padding: const EdgeInsets.symmetric(horizontal: T.s8, vertical: T.s4), - decoration: BoxDecoration( - color: cs.surfaceContainerHighest, - borderRadius: BorderRadius.circular(T.r8), - ), - child: Text( - vehiclePlate, - style: Theme.of(context).textTheme.labelLarge?.copyWith( - fontWeight: FontWeight.w700, - fontFeatures: const [FontFeature.tabularFigures()], - ), - ), - ), - ], - ), - - const SizedBox(height: T.s12), - - // أزرار الإجراءات - Row( - children: [ - Expanded( - child: OutlinedButton.icon( - onPressed: onCall, - icon: const Icon(Icons.call_rounded, size: 18), - label: Text(l10n.callDriver), - ), - ), - const SizedBox(width: T.s8), - Expanded( - child: OutlinedButton.icon( - onPressed: onChat, - icon: const Icon(Icons.chat_rounded, size: 18), - label: Text(l10n.chatWithDriver), - ), - ), - ], - ), - - if (onCancel != null) ...[ - const SizedBox(height: T.s8), - SizedBox( - width: double.infinity, - child: TextButton( - onPressed: onCancel, - child: Text(l10n.cancel, style: TextStyle(color: cs.error)), - ), - ), - ], - ], - ), - ), - ); - } -} diff --git a/apps/rider-archive-cubit/lib/features/trip/view/widgets/trip_status_banner.dart b/apps/rider-archive-cubit/lib/features/trip/view/widgets/trip_status_banner.dart deleted file mode 100644 index e1e4d87..0000000 --- a/apps/rider-archive-cubit/lib/features/trip/view/widgets/trip_status_banner.dart +++ /dev/null @@ -1,51 +0,0 @@ -import 'package:flutter/material.dart'; -import '../../../../core/l10n/app_localizations.dart'; -import '../../../../core/design/tokens.dart'; - -/// شريط الحالة العلوي في شاشة التتبع. -class TripStatusBanner extends StatelessWidget { - final String status; - - const TripStatusBanner({super.key, required this.status}); - - @override - Widget build(BuildContext context) { - final l10n = AppLocalizations.of(context)!; - final cs = Theme.of(context).colorScheme; - - final (text, icon, color) = switch (status) { - 'searching' => (l10n.searchingDriver, Icons.search_rounded, cs.primary), - 'assigned' || 'driver_arriving' => (l10n.driverArriving, Icons.directions_car_rounded, cs.tertiary), - 'driver_arrived' => (l10n.driverArrived, Icons.location_on_rounded, Colors.green), - 'in_progress' => (l10n.rideInProgress, Icons.play_arrow_rounded, cs.primary), - 'completed' => (l10n.rideCompleted, Icons.check_circle_rounded, Colors.green), - 'cancelled' => (l10n.tripCancelled, Icons.cancel_rounded, cs.error), - 'no_drivers' => (l10n.tripNoDrivers, Icons.error_outline_rounded, cs.error), - _ => (l10n.loading, Icons.hourglass_empty_rounded, cs.onSurfaceVariant), - }; - - return Container( - padding: const EdgeInsets.symmetric(horizontal: T.pagePadding, vertical: T.s12), - decoration: BoxDecoration( - color: color.withValues(alpha: 0.15), - borderRadius: BorderRadius.circular(T.r12), - border: Border.all(color: color.withValues(alpha: 0.3)), - ), - child: Row( - children: [ - Icon(icon, color: color, size: 20), - const SizedBox(width: T.s8), - Expanded( - child: Text( - text, - style: Theme.of(context).textTheme.titleSmall?.copyWith( - color: color, - fontWeight: FontWeight.w600, - ), - ), - ), - ], - ), - ); - } -} diff --git a/apps/rider-archive-cubit/lib/firebase_options.dart b/apps/rider-archive-cubit/lib/firebase_options.dart deleted file mode 100644 index 1f2b2eb..0000000 --- a/apps/rider-archive-cubit/lib/firebase_options.dart +++ /dev/null @@ -1,85 +0,0 @@ -// File generated by FlutterFire CLI. -// ignore_for_file: type=lint -import 'package:firebase_core/firebase_core.dart' show FirebaseOptions; -import 'package:flutter/foundation.dart' - show defaultTargetPlatform, kIsWeb, TargetPlatform; - -/// Default [FirebaseOptions] for use with your Firebase apps. -/// -/// Example: -/// ```dart -/// import 'firebase_options.dart'; -/// // ... -/// await Firebase.initializeApp( -/// options: DefaultFirebaseOptions.currentPlatform, -/// ); -/// ``` -class DefaultFirebaseOptions { - static FirebaseOptions get currentPlatform { - if (kIsWeb) { - return web; - } - switch (defaultTargetPlatform) { - case TargetPlatform.android: - return android; - case TargetPlatform.iOS: - return ios; - case TargetPlatform.macOS: - return macos; - case TargetPlatform.windows: - return windows; - case TargetPlatform.linux: - throw UnsupportedError( - 'DefaultFirebaseOptions have not been configured for linux - ' - 'you can reconfigure this by running the FlutterFire CLI again.', - ); - default: - throw UnsupportedError( - 'DefaultFirebaseOptions are not supported for this platform.', - ); - } - } - - static const FirebaseOptions android = FirebaseOptions( - apiKey: 'AIzaSyCPew9iGolLyI8f-uZUD7QhG4IE0hl20LU', - appId: '1:139325012385:android:552cbaeca54851979fb3e0', - messagingSenderId: '139325012385', - projectId: 'tripz-7883a', - storageBucket: 'tripz-7883a.firebasestorage.app', - ); - static const FirebaseOptions ios = FirebaseOptions( - apiKey: 'AIzaSyB6chzJf14YXUM9wWXIGNLlHfmNg5Jrw6E', - appId: '1:139325012385:ios:964034e702133d609fb3e0', - messagingSenderId: '139325012385', - projectId: 'tripz-7883a', - storageBucket: 'tripz-7883a.firebasestorage.app', - iosBundleId: 'com.mobileapp.store.ride', - ); - static const FirebaseOptions web = FirebaseOptions( - apiKey: 'AIzaSyAUIVdZt8pNaplroGUJMe1QP2-OXZj4Yz8', - appId: '1:139325012385:web:0820c0966e1dca869fb3e0', - messagingSenderId: '139325012385', - projectId: 'tripz-7883a', - authDomain: 'tripz-7883a.firebaseapp.com', - storageBucket: 'tripz-7883a.firebasestorage.app', - measurementId: 'G-53TJZG613C', - ); - - static const FirebaseOptions macos = FirebaseOptions( - apiKey: 'AIzaSyB6chzJf14YXUM9wWXIGNLlHfmNg5Jrw6E', - appId: '1:139325012385:ios:964034e702133d609fb3e0', - messagingSenderId: '139325012385', - projectId: 'tripz-7883a', - storageBucket: 'tripz-7883a.firebasestorage.app', - iosBundleId: 'com.mobileapp.store.ride', - ); - static const FirebaseOptions windows = FirebaseOptions( - apiKey: 'AIzaSyAVtyV7YVMeLbwA1UlNPxV9FhCzT0kjeAE', - appId: '1:594687661098:web:d9f43a2091395d87595f53', - messagingSenderId: '594687661098', - projectId: 'ride-b1bd8', - authDomain: 'ride-b1bd8.firebaseapp.com', - storageBucket: 'ride-b1bd8.appspot.com', - measurementId: 'G-C3DWQ8Z062', - ); -} diff --git a/apps/rider-archive-cubit/lib/main.dart b/apps/rider-archive-cubit/lib/main.dart deleted file mode 100644 index baf803d..0000000 --- a/apps/rider-archive-cubit/lib/main.dart +++ /dev/null @@ -1,18 +0,0 @@ -import 'package:flutter/material.dart'; -import 'package:firebase_core/firebase_core.dart'; -import 'package:flutter_native_splash/flutter_native_splash.dart'; -import 'firebase_options.dart'; -import 'core/di.dart'; -import 'app.dart'; - -Future main() async { - WidgetsBinding widgetsBinding = WidgetsFlutterBinding.ensureInitialized(); - FlutterNativeSplash.preserve(widgetsBinding: widgetsBinding); - try { - await Firebase.initializeApp(options: DefaultFirebaseOptions.currentPlatform); - } catch (_) { - // لا نُسقط الإقلاع لو تعذّر Firebase - } - await setupDi(); - runApp(const TripzApp()); -} diff --git a/apps/rider-archive-cubit/linux/.gitignore b/apps/rider-archive-cubit/linux/.gitignore deleted file mode 100644 index d3896c9..0000000 --- a/apps/rider-archive-cubit/linux/.gitignore +++ /dev/null @@ -1 +0,0 @@ -flutter/ephemeral diff --git a/apps/rider-archive-cubit/linux/CMakeLists.txt b/apps/rider-archive-cubit/linux/CMakeLists.txt deleted file mode 100644 index 91eca71..0000000 --- a/apps/rider-archive-cubit/linux/CMakeLists.txt +++ /dev/null @@ -1,139 +0,0 @@ -# Project-level configuration. -cmake_minimum_required(VERSION 3.10) -project(runner LANGUAGES CXX) - -# The name of the executable created for the application. Change this to change -# the on-disk name of your application. -set(BINARY_NAME "ride") -# The unique GTK application identifier for this application. See: -# https://wiki.gnome.org/HowDoI/ChooseApplicationID -set(APPLICATION_ID "com.mobileapp.store.ride") - -# Explicitly opt in to modern CMake behaviors to avoid warnings with recent -# versions of CMake. -cmake_policy(SET CMP0063 NEW) - -# Load bundled libraries from the lib/ directory relative to the binary. -set(CMAKE_INSTALL_RPATH "$ORIGIN/lib") - -# Root filesystem for cross-building. -if(FLUTTER_TARGET_PLATFORM_SYSROOT) - set(CMAKE_SYSROOT ${FLUTTER_TARGET_PLATFORM_SYSROOT}) - set(CMAKE_FIND_ROOT_PATH ${CMAKE_SYSROOT}) - set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER) - set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY) - set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY) - set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY) -endif() - -# Define build configuration options. -if(NOT CMAKE_BUILD_TYPE AND NOT CMAKE_CONFIGURATION_TYPES) - set(CMAKE_BUILD_TYPE "Debug" CACHE - STRING "Flutter build mode" FORCE) - set_property(CACHE CMAKE_BUILD_TYPE PROPERTY STRINGS - "Debug" "Profile" "Release") -endif() - -# Compilation settings that should be applied to most targets. -# -# Be cautious about adding new options here, as plugins use this function by -# default. In most cases, you should add new options to specific targets instead -# of modifying this function. -function(APPLY_STANDARD_SETTINGS TARGET) - target_compile_features(${TARGET} PUBLIC cxx_std_14) - target_compile_options(${TARGET} PRIVATE -Wall -Werror) - target_compile_options(${TARGET} PRIVATE "$<$>:-O3>") - target_compile_definitions(${TARGET} PRIVATE "$<$>:NDEBUG>") -endfunction() - -# Flutter library and tool build rules. -set(FLUTTER_MANAGED_DIR "${CMAKE_CURRENT_SOURCE_DIR}/flutter") -add_subdirectory(${FLUTTER_MANAGED_DIR}) - -# System-level dependencies. -find_package(PkgConfig REQUIRED) -pkg_check_modules(GTK REQUIRED IMPORTED_TARGET gtk+-3.0) - -add_definitions(-DAPPLICATION_ID="${APPLICATION_ID}") - -# Define the application target. To change its name, change BINARY_NAME above, -# not the value here, or `flutter run` will no longer work. -# -# Any new source files that you add to the application should be added here. -add_executable(${BINARY_NAME} - "main.cc" - "my_application.cc" - "${FLUTTER_MANAGED_DIR}/generated_plugin_registrant.cc" -) - -# Apply the standard set of build settings. This can be removed for applications -# that need different build settings. -apply_standard_settings(${BINARY_NAME}) - -# Add dependency libraries. Add any application-specific dependencies here. -target_link_libraries(${BINARY_NAME} PRIVATE flutter) -target_link_libraries(${BINARY_NAME} PRIVATE PkgConfig::GTK) - -# Run the Flutter tool portions of the build. This must not be removed. -add_dependencies(${BINARY_NAME} flutter_assemble) - -# Only the install-generated bundle's copy of the executable will launch -# correctly, since the resources must in the right relative locations. To avoid -# people trying to run the unbundled copy, put it in a subdirectory instead of -# the default top-level location. -set_target_properties(${BINARY_NAME} - PROPERTIES - RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/intermediates_do_not_run" -) - - -# Generated plugin build rules, which manage building the plugins and adding -# them to the application. -include(flutter/generated_plugins.cmake) - - -# === Installation === -# By default, "installing" just makes a relocatable bundle in the build -# directory. -set(BUILD_BUNDLE_DIR "${PROJECT_BINARY_DIR}/bundle") -if(CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT) - set(CMAKE_INSTALL_PREFIX "${BUILD_BUNDLE_DIR}" CACHE PATH "..." FORCE) -endif() - -# Start with a clean build bundle directory every time. -install(CODE " - file(REMOVE_RECURSE \"${BUILD_BUNDLE_DIR}/\") - " COMPONENT Runtime) - -set(INSTALL_BUNDLE_DATA_DIR "${CMAKE_INSTALL_PREFIX}/data") -set(INSTALL_BUNDLE_LIB_DIR "${CMAKE_INSTALL_PREFIX}/lib") - -install(TARGETS ${BINARY_NAME} RUNTIME DESTINATION "${CMAKE_INSTALL_PREFIX}" - COMPONENT Runtime) - -install(FILES "${FLUTTER_ICU_DATA_FILE}" DESTINATION "${INSTALL_BUNDLE_DATA_DIR}" - COMPONENT Runtime) - -install(FILES "${FLUTTER_LIBRARY}" DESTINATION "${INSTALL_BUNDLE_LIB_DIR}" - COMPONENT Runtime) - -foreach(bundled_library ${PLUGIN_BUNDLED_LIBRARIES}) - install(FILES "${bundled_library}" - DESTINATION "${INSTALL_BUNDLE_LIB_DIR}" - COMPONENT Runtime) -endforeach(bundled_library) - -# Fully re-copy the assets directory on each build to avoid having stale files -# from a previous install. -set(FLUTTER_ASSET_DIR_NAME "flutter_assets") -install(CODE " - file(REMOVE_RECURSE \"${INSTALL_BUNDLE_DATA_DIR}/${FLUTTER_ASSET_DIR_NAME}\") - " COMPONENT Runtime) -install(DIRECTORY "${PROJECT_BUILD_DIR}/${FLUTTER_ASSET_DIR_NAME}" - DESTINATION "${INSTALL_BUNDLE_DATA_DIR}" COMPONENT Runtime) - -# Install the AOT library on non-Debug builds only. -if(NOT CMAKE_BUILD_TYPE MATCHES "Debug") - install(FILES "${AOT_LIBRARY}" DESTINATION "${INSTALL_BUNDLE_LIB_DIR}" - COMPONENT Runtime) -endif() diff --git a/apps/rider-archive-cubit/linux/flutter/CMakeLists.txt b/apps/rider-archive-cubit/linux/flutter/CMakeLists.txt deleted file mode 100644 index d5bd016..0000000 --- a/apps/rider-archive-cubit/linux/flutter/CMakeLists.txt +++ /dev/null @@ -1,88 +0,0 @@ -# This file controls Flutter-level build steps. It should not be edited. -cmake_minimum_required(VERSION 3.10) - -set(EPHEMERAL_DIR "${CMAKE_CURRENT_SOURCE_DIR}/ephemeral") - -# Configuration provided via flutter tool. -include(${EPHEMERAL_DIR}/generated_config.cmake) - -# TODO: Move the rest of this into files in ephemeral. See -# https://github.com/flutter/flutter/issues/57146. - -# Serves the same purpose as list(TRANSFORM ... PREPEND ...), -# which isn't available in 3.10. -function(list_prepend LIST_NAME PREFIX) - set(NEW_LIST "") - foreach(element ${${LIST_NAME}}) - list(APPEND NEW_LIST "${PREFIX}${element}") - endforeach(element) - set(${LIST_NAME} "${NEW_LIST}" PARENT_SCOPE) -endfunction() - -# === Flutter Library === -# System-level dependencies. -find_package(PkgConfig REQUIRED) -pkg_check_modules(GTK REQUIRED IMPORTED_TARGET gtk+-3.0) -pkg_check_modules(GLIB REQUIRED IMPORTED_TARGET glib-2.0) -pkg_check_modules(GIO REQUIRED IMPORTED_TARGET gio-2.0) - -set(FLUTTER_LIBRARY "${EPHEMERAL_DIR}/libflutter_linux_gtk.so") - -# Published to parent scope for install step. -set(FLUTTER_LIBRARY ${FLUTTER_LIBRARY} PARENT_SCOPE) -set(FLUTTER_ICU_DATA_FILE "${EPHEMERAL_DIR}/icudtl.dat" PARENT_SCOPE) -set(PROJECT_BUILD_DIR "${PROJECT_DIR}/build/" PARENT_SCOPE) -set(AOT_LIBRARY "${PROJECT_DIR}/build/lib/libapp.so" PARENT_SCOPE) - -list(APPEND FLUTTER_LIBRARY_HEADERS - "fl_basic_message_channel.h" - "fl_binary_codec.h" - "fl_binary_messenger.h" - "fl_dart_project.h" - "fl_engine.h" - "fl_json_message_codec.h" - "fl_json_method_codec.h" - "fl_message_codec.h" - "fl_method_call.h" - "fl_method_channel.h" - "fl_method_codec.h" - "fl_method_response.h" - "fl_plugin_registrar.h" - "fl_plugin_registry.h" - "fl_standard_message_codec.h" - "fl_standard_method_codec.h" - "fl_string_codec.h" - "fl_value.h" - "fl_view.h" - "flutter_linux.h" -) -list_prepend(FLUTTER_LIBRARY_HEADERS "${EPHEMERAL_DIR}/flutter_linux/") -add_library(flutter INTERFACE) -target_include_directories(flutter INTERFACE - "${EPHEMERAL_DIR}" -) -target_link_libraries(flutter INTERFACE "${FLUTTER_LIBRARY}") -target_link_libraries(flutter INTERFACE - PkgConfig::GTK - PkgConfig::GLIB - PkgConfig::GIO -) -add_dependencies(flutter flutter_assemble) - -# === Flutter tool backend === -# _phony_ is a non-existent file to force this command to run every time, -# since currently there's no way to get a full input/output list from the -# flutter tool. -add_custom_command( - OUTPUT ${FLUTTER_LIBRARY} ${FLUTTER_LIBRARY_HEADERS} - ${CMAKE_CURRENT_BINARY_DIR}/_phony_ - COMMAND ${CMAKE_COMMAND} -E env - ${FLUTTER_TOOL_ENVIRONMENT} - "${FLUTTER_ROOT}/packages/flutter_tools/bin/tool_backend.sh" - ${FLUTTER_TARGET_PLATFORM} ${CMAKE_BUILD_TYPE} - VERBATIM -) -add_custom_target(flutter_assemble DEPENDS - "${FLUTTER_LIBRARY}" - ${FLUTTER_LIBRARY_HEADERS} -) diff --git a/apps/rider-archive-cubit/linux/flutter/generated_plugin_registrant.cc b/apps/rider-archive-cubit/linux/flutter/generated_plugin_registrant.cc deleted file mode 100644 index d0e7f79..0000000 --- a/apps/rider-archive-cubit/linux/flutter/generated_plugin_registrant.cc +++ /dev/null @@ -1,15 +0,0 @@ -// -// Generated file. Do not edit. -// - -// clang-format off - -#include "generated_plugin_registrant.h" - -#include - -void fl_register_plugins(FlPluginRegistry* registry) { - g_autoptr(FlPluginRegistrar) flutter_secure_storage_linux_registrar = - fl_plugin_registry_get_registrar_for_plugin(registry, "FlutterSecureStorageLinuxPlugin"); - flutter_secure_storage_linux_plugin_register_with_registrar(flutter_secure_storage_linux_registrar); -} diff --git a/apps/rider-archive-cubit/linux/flutter/generated_plugin_registrant.h b/apps/rider-archive-cubit/linux/flutter/generated_plugin_registrant.h deleted file mode 100644 index e0f0a47..0000000 --- a/apps/rider-archive-cubit/linux/flutter/generated_plugin_registrant.h +++ /dev/null @@ -1,15 +0,0 @@ -// -// Generated file. Do not edit. -// - -// clang-format off - -#ifndef GENERATED_PLUGIN_REGISTRANT_ -#define GENERATED_PLUGIN_REGISTRANT_ - -#include - -// Registers Flutter plugins. -void fl_register_plugins(FlPluginRegistry* registry); - -#endif // GENERATED_PLUGIN_REGISTRANT_ diff --git a/apps/rider-archive-cubit/linux/flutter/generated_plugins.cmake b/apps/rider-archive-cubit/linux/flutter/generated_plugins.cmake deleted file mode 100644 index ce58916..0000000 --- a/apps/rider-archive-cubit/linux/flutter/generated_plugins.cmake +++ /dev/null @@ -1,25 +0,0 @@ -# -# Generated file, do not edit. -# - -list(APPEND FLUTTER_PLUGIN_LIST - flutter_secure_storage_linux -) - -list(APPEND FLUTTER_FFI_PLUGIN_LIST - jni -) - -set(PLUGIN_BUNDLED_LIBRARIES) - -foreach(plugin ${FLUTTER_PLUGIN_LIST}) - add_subdirectory(flutter/ephemeral/.plugin_symlinks/${plugin}/linux plugins/${plugin}) - target_link_libraries(${BINARY_NAME} PRIVATE ${plugin}_plugin) - list(APPEND PLUGIN_BUNDLED_LIBRARIES $) - list(APPEND PLUGIN_BUNDLED_LIBRARIES ${${plugin}_bundled_libraries}) -endforeach(plugin) - -foreach(ffi_plugin ${FLUTTER_FFI_PLUGIN_LIST}) - add_subdirectory(flutter/ephemeral/.plugin_symlinks/${ffi_plugin}/linux plugins/${ffi_plugin}) - list(APPEND PLUGIN_BUNDLED_LIBRARIES ${${ffi_plugin}_bundled_libraries}) -endforeach(ffi_plugin) diff --git a/apps/rider-archive-cubit/linux/main.cc b/apps/rider-archive-cubit/linux/main.cc deleted file mode 100644 index e7c5c54..0000000 --- a/apps/rider-archive-cubit/linux/main.cc +++ /dev/null @@ -1,6 +0,0 @@ -#include "my_application.h" - -int main(int argc, char** argv) { - g_autoptr(MyApplication) app = my_application_new(); - return g_application_run(G_APPLICATION(app), argc, argv); -} diff --git a/apps/rider-archive-cubit/linux/my_application.cc b/apps/rider-archive-cubit/linux/my_application.cc deleted file mode 100644 index cb83e29..0000000 --- a/apps/rider-archive-cubit/linux/my_application.cc +++ /dev/null @@ -1,104 +0,0 @@ -#include "my_application.h" - -#include -#ifdef GDK_WINDOWING_X11 -#include -#endif - -#include "flutter/generated_plugin_registrant.h" - -struct _MyApplication { - GtkApplication parent_instance; - char** dart_entrypoint_arguments; -}; - -G_DEFINE_TYPE(MyApplication, my_application, GTK_TYPE_APPLICATION) - -// Implements GApplication::activate. -static void my_application_activate(GApplication* application) { - MyApplication* self = MY_APPLICATION(application); - GtkWindow* window = - GTK_WINDOW(gtk_application_window_new(GTK_APPLICATION(application))); - - // Use a header bar when running in GNOME as this is the common style used - // by applications and is the setup most users will be using (e.g. Ubuntu - // desktop). - // If running on X and not using GNOME then just use a traditional title bar - // in case the window manager does more exotic layout, e.g. tiling. - // If running on Wayland assume the header bar will work (may need changing - // if future cases occur). - gboolean use_header_bar = TRUE; -#ifdef GDK_WINDOWING_X11 - GdkScreen* screen = gtk_window_get_screen(window); - if (GDK_IS_X11_SCREEN(screen)) { - const gchar* wm_name = gdk_x11_screen_get_window_manager_name(screen); - if (g_strcmp0(wm_name, "GNOME Shell") != 0) { - use_header_bar = FALSE; - } - } -#endif - if (use_header_bar) { - GtkHeaderBar* header_bar = GTK_HEADER_BAR(gtk_header_bar_new()); - gtk_widget_show(GTK_WIDGET(header_bar)); - gtk_header_bar_set_title(header_bar, "ride"); - gtk_header_bar_set_show_close_button(header_bar, TRUE); - gtk_window_set_titlebar(window, GTK_WIDGET(header_bar)); - } else { - gtk_window_set_title(window, "ride"); - } - - gtk_window_set_default_size(window, 1280, 720); - gtk_widget_show(GTK_WIDGET(window)); - - g_autoptr(FlDartProject) project = fl_dart_project_new(); - fl_dart_project_set_dart_entrypoint_arguments(project, self->dart_entrypoint_arguments); - - FlView* view = fl_view_new(project); - gtk_widget_show(GTK_WIDGET(view)); - gtk_container_add(GTK_CONTAINER(window), GTK_WIDGET(view)); - - fl_register_plugins(FL_PLUGIN_REGISTRY(view)); - - gtk_widget_grab_focus(GTK_WIDGET(view)); -} - -// Implements GApplication::local_command_line. -static gboolean my_application_local_command_line(GApplication* application, gchar*** arguments, int* exit_status) { - MyApplication* self = MY_APPLICATION(application); - // Strip out the first argument as it is the binary name. - self->dart_entrypoint_arguments = g_strdupv(*arguments + 1); - - g_autoptr(GError) error = nullptr; - if (!g_application_register(application, nullptr, &error)) { - g_warning("Failed to register: %s", error->message); - *exit_status = 1; - return TRUE; - } - - g_application_activate(application); - *exit_status = 0; - - return TRUE; -} - -// Implements GObject::dispose. -static void my_application_dispose(GObject* object) { - MyApplication* self = MY_APPLICATION(object); - g_clear_pointer(&self->dart_entrypoint_arguments, g_strfreev); - G_OBJECT_CLASS(my_application_parent_class)->dispose(object); -} - -static void my_application_class_init(MyApplicationClass* klass) { - G_APPLICATION_CLASS(klass)->activate = my_application_activate; - G_APPLICATION_CLASS(klass)->local_command_line = my_application_local_command_line; - G_OBJECT_CLASS(klass)->dispose = my_application_dispose; -} - -static void my_application_init(MyApplication* self) {} - -MyApplication* my_application_new() { - return MY_APPLICATION(g_object_new(my_application_get_type(), - "application-id", APPLICATION_ID, - "flags", G_APPLICATION_NON_UNIQUE, - nullptr)); -} diff --git a/apps/rider-archive-cubit/linux/my_application.h b/apps/rider-archive-cubit/linux/my_application.h deleted file mode 100644 index 72271d5..0000000 --- a/apps/rider-archive-cubit/linux/my_application.h +++ /dev/null @@ -1,18 +0,0 @@ -#ifndef FLUTTER_MY_APPLICATION_H_ -#define FLUTTER_MY_APPLICATION_H_ - -#include - -G_DECLARE_FINAL_TYPE(MyApplication, my_application, MY, APPLICATION, - GtkApplication) - -/** - * my_application_new: - * - * Creates a new Flutter-based application. - * - * Returns: a new #MyApplication. - */ -MyApplication* my_application_new(); - -#endif // FLUTTER_MY_APPLICATION_H_ diff --git a/apps/rider-archive-cubit/macos/.gitignore b/apps/rider-archive-cubit/macos/.gitignore deleted file mode 100644 index 746adbb..0000000 --- a/apps/rider-archive-cubit/macos/.gitignore +++ /dev/null @@ -1,7 +0,0 @@ -# Flutter-related -**/Flutter/ephemeral/ -**/Pods/ - -# Xcode-related -**/dgph -**/xcuserdata/ diff --git a/apps/rider-archive-cubit/macos/Flutter/Flutter-Debug.xcconfig b/apps/rider-archive-cubit/macos/Flutter/Flutter-Debug.xcconfig deleted file mode 100644 index 4b81f9b..0000000 --- a/apps/rider-archive-cubit/macos/Flutter/Flutter-Debug.xcconfig +++ /dev/null @@ -1,2 +0,0 @@ -#include? "Pods/Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig" -#include "ephemeral/Flutter-Generated.xcconfig" diff --git a/apps/rider-archive-cubit/macos/Flutter/Flutter-Release.xcconfig b/apps/rider-archive-cubit/macos/Flutter/Flutter-Release.xcconfig deleted file mode 100644 index 5caa9d1..0000000 --- a/apps/rider-archive-cubit/macos/Flutter/Flutter-Release.xcconfig +++ /dev/null @@ -1,2 +0,0 @@ -#include? "Pods/Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig" -#include "ephemeral/Flutter-Generated.xcconfig" diff --git a/apps/rider-archive-cubit/macos/Flutter/GeneratedPluginRegistrant.swift b/apps/rider-archive-cubit/macos/Flutter/GeneratedPluginRegistrant.swift deleted file mode 100644 index 869d01e..0000000 --- a/apps/rider-archive-cubit/macos/Flutter/GeneratedPluginRegistrant.swift +++ /dev/null @@ -1,24 +0,0 @@ -// -// Generated file. Do not edit. -// - -import FlutterMacOS -import Foundation - -import device_info_plus -import firebase_core -import firebase_messaging -import flutter_secure_storage_macos -import geolocator_apple -import package_info_plus -import shared_preferences_foundation - -func RegisterGeneratedPlugins(registry: FlutterPluginRegistry) { - DeviceInfoPlusMacosPlugin.register(with: registry.registrar(forPlugin: "DeviceInfoPlusMacosPlugin")) - FLTFirebaseCorePlugin.register(with: registry.registrar(forPlugin: "FLTFirebaseCorePlugin")) - FLTFirebaseMessagingPlugin.register(with: registry.registrar(forPlugin: "FLTFirebaseMessagingPlugin")) - FlutterSecureStoragePlugin.register(with: registry.registrar(forPlugin: "FlutterSecureStoragePlugin")) - GeolocatorPlugin.register(with: registry.registrar(forPlugin: "GeolocatorPlugin")) - FPPPackageInfoPlusPlugin.register(with: registry.registrar(forPlugin: "FPPPackageInfoPlusPlugin")) - SharedPreferencesPlugin.register(with: registry.registrar(forPlugin: "SharedPreferencesPlugin")) -} diff --git a/apps/rider-archive-cubit/macos/Podfile b/apps/rider-archive-cubit/macos/Podfile deleted file mode 100644 index c795730..0000000 --- a/apps/rider-archive-cubit/macos/Podfile +++ /dev/null @@ -1,43 +0,0 @@ -platform :osx, '10.14' - -# CocoaPods analytics sends network stats synchronously affecting flutter build latency. -ENV['COCOAPODS_DISABLE_STATS'] = 'true' - -project 'Runner', { - 'Debug' => :debug, - 'Profile' => :release, - 'Release' => :release, -} - -def flutter_root - generated_xcode_build_settings_path = File.expand_path(File.join('..', 'Flutter', 'ephemeral', 'Flutter-Generated.xcconfig'), __FILE__) - unless File.exist?(generated_xcode_build_settings_path) - raise "#{generated_xcode_build_settings_path} must exist. If you're running pod install manually, make sure \"flutter pub get\" is executed first" - end - - File.foreach(generated_xcode_build_settings_path) do |line| - matches = line.match(/FLUTTER_ROOT\=(.*)/) - return matches[1].strip if matches - end - raise "FLUTTER_ROOT not found in #{generated_xcode_build_settings_path}. Try deleting Flutter-Generated.xcconfig, then run \"flutter pub get\"" -end - -require File.expand_path(File.join('packages', 'flutter_tools', 'bin', 'podhelper'), flutter_root) - -flutter_macos_podfile_setup - -target 'Runner' do - use_frameworks! - use_modular_headers! - - flutter_install_all_macos_pods File.dirname(File.realpath(__FILE__)) - target 'RunnerTests' do - inherit! :search_paths - end -end - -post_install do |installer| - installer.pods_project.targets.each do |target| - flutter_additional_macos_build_settings(target) - end -end diff --git a/apps/rider-archive-cubit/macos/Podfile.lock b/apps/rider-archive-cubit/macos/Podfile.lock deleted file mode 100644 index d259d49..0000000 --- a/apps/rider-archive-cubit/macos/Podfile.lock +++ /dev/null @@ -1,197 +0,0 @@ -PODS: - - audio_session (0.0.1): - - FlutterMacOS - - device_info_plus (0.0.1): - - FlutterMacOS - - file_selector_macos (0.0.1): - - FlutterMacOS - - Firebase/CoreOnly (10.18.0): - - FirebaseCore (= 10.18.0) - - Firebase/Messaging (10.18.0): - - Firebase/CoreOnly - - FirebaseMessaging (~> 10.18.0) - - firebase_core (2.23.0): - - Firebase/CoreOnly (~> 10.18.0) - - FlutterMacOS - - firebase_messaging (14.7.5): - - Firebase/CoreOnly (~> 10.18.0) - - Firebase/Messaging (~> 10.18.0) - - firebase_core - - FlutterMacOS - - FirebaseCore (10.18.0): - - FirebaseCoreInternal (~> 10.0) - - GoogleUtilities/Environment (~> 7.12) - - GoogleUtilities/Logger (~> 7.12) - - FirebaseCoreInternal (10.19.0): - - "GoogleUtilities/NSData+zlib (~> 7.8)" - - FirebaseInstallations (10.19.0): - - FirebaseCore (~> 10.0) - - GoogleUtilities/Environment (~> 7.8) - - GoogleUtilities/UserDefaults (~> 7.8) - - PromisesObjC (~> 2.1) - - FirebaseMessaging (10.18.0): - - FirebaseCore (~> 10.0) - - FirebaseInstallations (~> 10.0) - - GoogleDataTransport (~> 9.2) - - GoogleUtilities/AppDelegateSwizzler (~> 7.8) - - GoogleUtilities/Environment (~> 7.8) - - GoogleUtilities/Reachability (~> 7.8) - - GoogleUtilities/UserDefaults (~> 7.8) - - nanopb (< 2.30910.0, >= 2.30908.0) - - flutter_local_notifications (0.0.1): - - FlutterMacOS - - flutter_secure_storage_macos (6.1.1): - - FlutterMacOS - - FlutterMacOS (1.0.0) - - FMDB (2.7.5): - - FMDB/standard (= 2.7.5) - - FMDB/standard (2.7.5) - - geolocator_apple (1.2.0): - - FlutterMacOS - - GoogleDataTransport (9.3.0): - - GoogleUtilities/Environment (~> 7.7) - - nanopb (< 2.30910.0, >= 2.30908.0) - - PromisesObjC (< 3.0, >= 1.2) - - GoogleUtilities/AppDelegateSwizzler (7.12.0): - - GoogleUtilities/Environment - - GoogleUtilities/Logger - - GoogleUtilities/Network - - GoogleUtilities/Environment (7.12.0): - - PromisesObjC (< 3.0, >= 1.2) - - GoogleUtilities/Logger (7.12.0): - - GoogleUtilities/Environment - - GoogleUtilities/Network (7.12.0): - - GoogleUtilities/Logger - - "GoogleUtilities/NSData+zlib" - - GoogleUtilities/Reachability - - "GoogleUtilities/NSData+zlib (7.12.0)" - - GoogleUtilities/Reachability (7.12.0): - - GoogleUtilities/Logger - - GoogleUtilities/UserDefaults (7.12.0): - - GoogleUtilities/Logger - - just_audio (0.0.1): - - FlutterMacOS - - location (0.0.1): - - FlutterMacOS - - nanopb (2.30909.1): - - nanopb/decode (= 2.30909.1) - - nanopb/encode (= 2.30909.1) - - nanopb/decode (2.30909.1) - - nanopb/encode (2.30909.1) - - package_info_plus (0.0.1): - - FlutterMacOS - - path_provider_foundation (0.0.1): - - Flutter - - FlutterMacOS - - PromisesObjC (2.3.1) - - sqflite (0.0.2): - - FlutterMacOS - - FMDB (>= 2.7.5) - - url_launcher_macos (0.0.1): - - FlutterMacOS - - video_player_avfoundation (0.0.1): - - Flutter - - FlutterMacOS - - wakelock_plus (0.0.1): - - FlutterMacOS - -DEPENDENCIES: - - audio_session (from `Flutter/ephemeral/.symlinks/plugins/audio_session/macos`) - - device_info_plus (from `Flutter/ephemeral/.symlinks/plugins/device_info_plus/macos`) - - file_selector_macos (from `Flutter/ephemeral/.symlinks/plugins/file_selector_macos/macos`) - - firebase_core (from `Flutter/ephemeral/.symlinks/plugins/firebase_core/macos`) - - firebase_messaging (from `Flutter/ephemeral/.symlinks/plugins/firebase_messaging/macos`) - - flutter_local_notifications (from `Flutter/ephemeral/.symlinks/plugins/flutter_local_notifications/macos`) - - flutter_secure_storage_macos (from `Flutter/ephemeral/.symlinks/plugins/flutter_secure_storage_macos/macos`) - - FlutterMacOS (from `Flutter/ephemeral`) - - geolocator_apple (from `Flutter/ephemeral/.symlinks/plugins/geolocator_apple/macos`) - - just_audio (from `Flutter/ephemeral/.symlinks/plugins/just_audio/macos`) - - location (from `Flutter/ephemeral/.symlinks/plugins/location/macos`) - - package_info_plus (from `Flutter/ephemeral/.symlinks/plugins/package_info_plus/macos`) - - path_provider_foundation (from `Flutter/ephemeral/.symlinks/plugins/path_provider_foundation/darwin`) - - sqflite (from `Flutter/ephemeral/.symlinks/plugins/sqflite/macos`) - - url_launcher_macos (from `Flutter/ephemeral/.symlinks/plugins/url_launcher_macos/macos`) - - video_player_avfoundation (from `Flutter/ephemeral/.symlinks/plugins/video_player_avfoundation/darwin`) - - wakelock_plus (from `Flutter/ephemeral/.symlinks/plugins/wakelock_plus/macos`) - -SPEC REPOS: - trunk: - - Firebase - - FirebaseCore - - FirebaseCoreInternal - - FirebaseInstallations - - FirebaseMessaging - - FMDB - - GoogleDataTransport - - GoogleUtilities - - nanopb - - PromisesObjC - -EXTERNAL SOURCES: - audio_session: - :path: Flutter/ephemeral/.symlinks/plugins/audio_session/macos - device_info_plus: - :path: Flutter/ephemeral/.symlinks/plugins/device_info_plus/macos - file_selector_macos: - :path: Flutter/ephemeral/.symlinks/plugins/file_selector_macos/macos - firebase_core: - :path: Flutter/ephemeral/.symlinks/plugins/firebase_core/macos - firebase_messaging: - :path: Flutter/ephemeral/.symlinks/plugins/firebase_messaging/macos - flutter_local_notifications: - :path: Flutter/ephemeral/.symlinks/plugins/flutter_local_notifications/macos - flutter_secure_storage_macos: - :path: Flutter/ephemeral/.symlinks/plugins/flutter_secure_storage_macos/macos - FlutterMacOS: - :path: Flutter/ephemeral - geolocator_apple: - :path: Flutter/ephemeral/.symlinks/plugins/geolocator_apple/macos - just_audio: - :path: Flutter/ephemeral/.symlinks/plugins/just_audio/macos - location: - :path: Flutter/ephemeral/.symlinks/plugins/location/macos - package_info_plus: - :path: Flutter/ephemeral/.symlinks/plugins/package_info_plus/macos - path_provider_foundation: - :path: Flutter/ephemeral/.symlinks/plugins/path_provider_foundation/darwin - sqflite: - :path: Flutter/ephemeral/.symlinks/plugins/sqflite/macos - url_launcher_macos: - :path: Flutter/ephemeral/.symlinks/plugins/url_launcher_macos/macos - video_player_avfoundation: - :path: Flutter/ephemeral/.symlinks/plugins/video_player_avfoundation/darwin - wakelock_plus: - :path: Flutter/ephemeral/.symlinks/plugins/wakelock_plus/macos - -SPEC CHECKSUMS: - audio_session: dea1f41890dbf1718f04a56f1d6150fd50039b72 - device_info_plus: 5401765fde0b8d062a2f8eb65510fb17e77cf07f - file_selector_macos: 468fb6b81fac7c0e88d71317f3eec34c3b008ff9 - Firebase: 414ad272f8d02dfbf12662a9d43f4bba9bec2a06 - firebase_core: b57f52ccb63d2700bf22bc65ca0b08c66135ae6e - firebase_messaging: 9a572e87106da8843fa3b00c874e17cfacafaa71 - FirebaseCore: 2322423314d92f946219c8791674d2f3345b598f - FirebaseCoreInternal: b444828ea7cfd594fca83046b95db98a2be4f290 - FirebaseInstallations: 033d199474164db20c8350736842a94fe717b960 - FirebaseMessaging: 9bc34a98d2e0237e1b121915120d4d48ddcf301e - flutter_local_notifications: 3805ca215b2fb7f397d78b66db91f6a747af52e4 - flutter_secure_storage_macos: d56e2d218c1130b262bef8b4a7d64f88d7f9c9ea - FlutterMacOS: 8f6f14fa908a6fb3fba0cd85dbd81ec4b251fb24 - FMDB: 2ce00b547f966261cd18927a3ddb07cb6f3db82a - geolocator_apple: 72a78ae3f3e4ec0db62117bd93e34523f5011d58 - GoogleDataTransport: 57c22343ab29bc686febbf7cbb13bad167c2d8fe - GoogleUtilities: 0759d1a57ebb953965c2dfe0ba4c82e95ccc2e34 - just_audio: 9b67ca7b97c61cfc9784ea23cd8cc55eb226d489 - location: 7cdb0665bd6577d382b0a343acdadbcb7f964775 - nanopb: d4d75c12cd1316f4a64e3c6963f879ecd4b5e0d5 - package_info_plus: 02d7a575e80f194102bef286361c6c326e4c29ce - path_provider_foundation: 29f094ae23ebbca9d3d0cec13889cd9060c0e943 - PromisesObjC: c50d2056b5253dadbd6c2bea79b0674bd5a52fa4 - sqflite: a5789cceda41d54d23f31d6de539d65bb14100ea - url_launcher_macos: d2691c7dd33ed713bf3544850a623080ec693d95 - video_player_avfoundation: e9e6f9cae7d7a6d9b43519b0aab382bca60fcfd1 - wakelock_plus: 4783562c9a43d209c458cb9b30692134af456269 - -PODFILE CHECKSUM: 236401fc2c932af29a9fcf0e97baeeb2d750d367 - -COCOAPODS: 1.13.0 diff --git a/apps/rider-archive-cubit/macos/Runner.xcodeproj/project.pbxproj b/apps/rider-archive-cubit/macos/Runner.xcodeproj/project.pbxproj deleted file mode 100644 index 9f840d8..0000000 --- a/apps/rider-archive-cubit/macos/Runner.xcodeproj/project.pbxproj +++ /dev/null @@ -1,699 +0,0 @@ -// !$*UTF8*$! -{ - archiveVersion = 1; - classes = { - }; - objectVersion = 54; - objects = { - -/* Begin PBXAggregateTarget section */ - 33CC111A2044C6BA0003C045 /* Flutter Assemble */ = { - isa = PBXAggregateTarget; - buildConfigurationList = 33CC111B2044C6BA0003C045 /* Build configuration list for PBXAggregateTarget "Flutter Assemble" */; - buildPhases = ( - 33CC111E2044C6BF0003C045 /* ShellScript */, - ); - dependencies = ( - ); - name = "Flutter Assemble"; - productName = FLX; - }; -/* End PBXAggregateTarget section */ - -/* Begin PBXBuildFile section */ - 331C80D8294CF71000263BE5 /* RunnerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 331C80D7294CF71000263BE5 /* RunnerTests.swift */; }; - 335BBD1B22A9A15E00E9071D /* GeneratedPluginRegistrant.swift in Sources */ = {isa = PBXBuildFile; fileRef = 335BBD1A22A9A15E00E9071D /* GeneratedPluginRegistrant.swift */; }; - 33CC10F12044A3C60003C045 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 33CC10F02044A3C60003C045 /* AppDelegate.swift */; }; - 33CC10F32044A3C60003C045 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 33CC10F22044A3C60003C045 /* Assets.xcassets */; }; - 33CC10F62044A3C60003C045 /* MainMenu.xib in Resources */ = {isa = PBXBuildFile; fileRef = 33CC10F42044A3C60003C045 /* MainMenu.xib */; }; - 33CC11132044BFA00003C045 /* MainFlutterWindow.swift in Sources */ = {isa = PBXBuildFile; fileRef = 33CC11122044BFA00003C045 /* MainFlutterWindow.swift */; }; - 643B04D2AB43F88CA67B4296 /* GoogleService-Info.plist in Resources */ = {isa = PBXBuildFile; fileRef = DDF4384B47D24C01FF9439DD /* GoogleService-Info.plist */; }; -/* End PBXBuildFile section */ - -/* Begin PBXContainerItemProxy section */ - 331C80D9294CF71000263BE5 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 33CC10E52044A3C60003C045 /* Project object */; - proxyType = 1; - remoteGlobalIDString = 33CC10EC2044A3C60003C045; - remoteInfo = Runner; - }; - 33CC111F2044C79F0003C045 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 33CC10E52044A3C60003C045 /* Project object */; - proxyType = 1; - remoteGlobalIDString = 33CC111A2044C6BA0003C045; - remoteInfo = FLX; - }; -/* End PBXContainerItemProxy section */ - -/* Begin PBXCopyFilesBuildPhase section */ - 33CC110E2044A8840003C045 /* Bundle Framework */ = { - isa = PBXCopyFilesBuildPhase; - buildActionMask = 2147483647; - dstPath = ""; - dstSubfolderSpec = 10; - files = ( - ); - name = "Bundle Framework"; - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXCopyFilesBuildPhase section */ - -/* Begin PBXFileReference section */ - 331C80D5294CF71000263BE5 /* RunnerTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = RunnerTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; - 331C80D7294CF71000263BE5 /* RunnerTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RunnerTests.swift; sourceTree = ""; }; - 333000ED22D3DE5D00554162 /* Warnings.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Warnings.xcconfig; sourceTree = ""; }; - 335BBD1A22A9A15E00E9071D /* GeneratedPluginRegistrant.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = GeneratedPluginRegistrant.swift; sourceTree = ""; }; - 33CC10ED2044A3C60003C045 /* ride.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = ride.app; sourceTree = BUILT_PRODUCTS_DIR; }; - 33CC10F02044A3C60003C045 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; - 33CC10F22044A3C60003C045 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; name = Assets.xcassets; path = Runner/Assets.xcassets; sourceTree = ""; }; - 33CC10F52044A3C60003C045 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/MainMenu.xib; sourceTree = ""; }; - 33CC10F72044A3C60003C045 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; name = Info.plist; path = Runner/Info.plist; sourceTree = ""; }; - 33CC11122044BFA00003C045 /* MainFlutterWindow.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MainFlutterWindow.swift; sourceTree = ""; }; - 33CEB47222A05771004F2AC0 /* Flutter-Debug.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = "Flutter-Debug.xcconfig"; sourceTree = ""; }; - 33CEB47422A05771004F2AC0 /* Flutter-Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = "Flutter-Release.xcconfig"; sourceTree = ""; }; - 33CEB47722A0578A004F2AC0 /* Flutter-Generated.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = "Flutter-Generated.xcconfig"; path = "ephemeral/Flutter-Generated.xcconfig"; sourceTree = ""; }; - 33E51913231747F40026EE4D /* DebugProfile.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = DebugProfile.entitlements; sourceTree = ""; }; - 33E51914231749380026EE4D /* Release.entitlements */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.entitlements; path = Release.entitlements; sourceTree = ""; }; - 33E5194F232828860026EE4D /* AppInfo.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = AppInfo.xcconfig; sourceTree = ""; }; - 7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Release.xcconfig; sourceTree = ""; }; - 9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = Debug.xcconfig; sourceTree = ""; }; - DDF4384B47D24C01FF9439DD /* GoogleService-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; name = "GoogleService-Info.plist"; path = "Runner/GoogleService-Info.plist"; sourceTree = ""; }; -/* End PBXFileReference section */ - -/* Begin PBXFrameworksBuildPhase section */ - 331C80D2294CF70F00263BE5 /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 33CC10EA2044A3C60003C045 /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXFrameworksBuildPhase section */ - -/* Begin PBXGroup section */ - 331C80D6294CF71000263BE5 /* RunnerTests */ = { - isa = PBXGroup; - children = ( - 331C80D7294CF71000263BE5 /* RunnerTests.swift */, - ); - path = RunnerTests; - sourceTree = ""; - }; - 33BA886A226E78AF003329D5 /* Configs */ = { - isa = PBXGroup; - children = ( - 33E5194F232828860026EE4D /* AppInfo.xcconfig */, - 9740EEB21CF90195004384FC /* Debug.xcconfig */, - 7AFA3C8E1D35360C0083082E /* Release.xcconfig */, - 333000ED22D3DE5D00554162 /* Warnings.xcconfig */, - ); - path = Configs; - sourceTree = ""; - }; - 33CC10E42044A3C60003C045 = { - isa = PBXGroup; - children = ( - 33FAB671232836740065AC1E /* Runner */, - 33CEB47122A05771004F2AC0 /* Flutter */, - 331C80D6294CF71000263BE5 /* RunnerTests */, - 33CC10EE2044A3C60003C045 /* Products */, - D73912EC22F37F3D000D13A0 /* Frameworks */, - DDF4384B47D24C01FF9439DD /* GoogleService-Info.plist */, - ); - sourceTree = ""; - }; - 33CC10EE2044A3C60003C045 /* Products */ = { - isa = PBXGroup; - children = ( - 33CC10ED2044A3C60003C045 /* ride.app */, - 331C80D5294CF71000263BE5 /* RunnerTests.xctest */, - ); - name = Products; - sourceTree = ""; - }; - 33CC11242044D66E0003C045 /* Resources */ = { - isa = PBXGroup; - children = ( - 33CC10F22044A3C60003C045 /* Assets.xcassets */, - 33CC10F42044A3C60003C045 /* MainMenu.xib */, - 33CC10F72044A3C60003C045 /* Info.plist */, - ); - name = Resources; - path = ..; - sourceTree = ""; - }; - 33CEB47122A05771004F2AC0 /* Flutter */ = { - isa = PBXGroup; - children = ( - 335BBD1A22A9A15E00E9071D /* GeneratedPluginRegistrant.swift */, - 33CEB47222A05771004F2AC0 /* Flutter-Debug.xcconfig */, - 33CEB47422A05771004F2AC0 /* Flutter-Release.xcconfig */, - 33CEB47722A0578A004F2AC0 /* Flutter-Generated.xcconfig */, - ); - path = Flutter; - sourceTree = ""; - }; - 33FAB671232836740065AC1E /* Runner */ = { - isa = PBXGroup; - children = ( - 33CC10F02044A3C60003C045 /* AppDelegate.swift */, - 33CC11122044BFA00003C045 /* MainFlutterWindow.swift */, - 33E51913231747F40026EE4D /* DebugProfile.entitlements */, - 33E51914231749380026EE4D /* Release.entitlements */, - 33CC11242044D66E0003C045 /* Resources */, - 33BA886A226E78AF003329D5 /* Configs */, - ); - path = Runner; - sourceTree = ""; - }; - D73912EC22F37F3D000D13A0 /* Frameworks */ = { - isa = PBXGroup; - children = ( - ); - name = Frameworks; - sourceTree = ""; - }; -/* End PBXGroup section */ - -/* Begin PBXNativeTarget section */ - 331C80D4294CF70F00263BE5 /* RunnerTests */ = { - isa = PBXNativeTarget; - buildConfigurationList = 331C80DE294CF71000263BE5 /* Build configuration list for PBXNativeTarget "RunnerTests" */; - buildPhases = ( - 331C80D1294CF70F00263BE5 /* Sources */, - 331C80D2294CF70F00263BE5 /* Frameworks */, - 331C80D3294CF70F00263BE5 /* Resources */, - ); - buildRules = ( - ); - dependencies = ( - 331C80DA294CF71000263BE5 /* PBXTargetDependency */, - ); - name = RunnerTests; - productName = RunnerTests; - productReference = 331C80D5294CF71000263BE5 /* RunnerTests.xctest */; - productType = "com.apple.product-type.bundle.unit-test"; - }; - 33CC10EC2044A3C60003C045 /* Runner */ = { - isa = PBXNativeTarget; - buildConfigurationList = 33CC10FB2044A3C60003C045 /* Build configuration list for PBXNativeTarget "Runner" */; - buildPhases = ( - 33CC10E92044A3C60003C045 /* Sources */, - 33CC10EA2044A3C60003C045 /* Frameworks */, - 33CC10EB2044A3C60003C045 /* Resources */, - 33CC110E2044A8840003C045 /* Bundle Framework */, - 3399D490228B24CF009A79C7 /* ShellScript */, - ); - buildRules = ( - ); - dependencies = ( - 33CC11202044C79F0003C045 /* PBXTargetDependency */, - ); - name = Runner; - productName = Runner; - productReference = 33CC10ED2044A3C60003C045 /* ride.app */; - productType = "com.apple.product-type.application"; - }; -/* End PBXNativeTarget section */ - -/* Begin PBXProject section */ - 33CC10E52044A3C60003C045 /* Project object */ = { - isa = PBXProject; - attributes = { - LastSwiftUpdateCheck = 0920; - LastUpgradeCheck = 1510; - ORGANIZATIONNAME = ""; - TargetAttributes = { - 331C80D4294CF70F00263BE5 = { - CreatedOnToolsVersion = 14.0; - TestTargetID = 33CC10EC2044A3C60003C045; - }; - 33CC10EC2044A3C60003C045 = { - CreatedOnToolsVersion = 9.2; - LastSwiftMigration = 1100; - ProvisioningStyle = Automatic; - SystemCapabilities = { - com.apple.Sandbox = { - enabled = 1; - }; - }; - }; - 33CC111A2044C6BA0003C045 = { - CreatedOnToolsVersion = 9.2; - ProvisioningStyle = Manual; - }; - }; - }; - buildConfigurationList = 33CC10E82044A3C60003C045 /* Build configuration list for PBXProject "Runner" */; - compatibilityVersion = "Xcode 9.3"; - developmentRegion = en; - hasScannedForEncodings = 0; - knownRegions = ( - en, - Base, - ); - mainGroup = 33CC10E42044A3C60003C045; - productRefGroup = 33CC10EE2044A3C60003C045 /* Products */; - projectDirPath = ""; - projectRoot = ""; - targets = ( - 33CC10EC2044A3C60003C045 /* Runner */, - 331C80D4294CF70F00263BE5 /* RunnerTests */, - 33CC111A2044C6BA0003C045 /* Flutter Assemble */, - ); - }; -/* End PBXProject section */ - -/* Begin PBXResourcesBuildPhase section */ - 331C80D3294CF70F00263BE5 /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 33CC10EB2044A3C60003C045 /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 33CC10F32044A3C60003C045 /* Assets.xcassets in Resources */, - 33CC10F62044A3C60003C045 /* MainMenu.xib in Resources */, - 643B04D2AB43F88CA67B4296 /* GoogleService-Info.plist in Resources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXResourcesBuildPhase section */ - -/* Begin PBXShellScriptBuildPhase section */ - 3399D490228B24CF009A79C7 /* ShellScript */ = { - isa = PBXShellScriptBuildPhase; - alwaysOutOfDate = 1; - buildActionMask = 2147483647; - files = ( - ); - inputFileListPaths = ( - ); - inputPaths = ( - ); - outputFileListPaths = ( - ); - outputPaths = ( - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "echo \"$PRODUCT_NAME.app\" > \"$PROJECT_DIR\"/Flutter/ephemeral/.app_filename && \"$FLUTTER_ROOT\"/packages/flutter_tools/bin/macos_assemble.sh embed\n"; - }; - 33CC111E2044C6BF0003C045 /* ShellScript */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputFileListPaths = ( - Flutter/ephemeral/FlutterInputs.xcfilelist, - ); - inputPaths = ( - Flutter/ephemeral/tripwire, - ); - outputFileListPaths = ( - Flutter/ephemeral/FlutterOutputs.xcfilelist, - ); - outputPaths = ( - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "\"$FLUTTER_ROOT\"/packages/flutter_tools/bin/macos_assemble.sh && touch Flutter/ephemeral/tripwire"; - }; -/* End PBXShellScriptBuildPhase section */ - -/* Begin PBXSourcesBuildPhase section */ - 331C80D1294CF70F00263BE5 /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 331C80D8294CF71000263BE5 /* RunnerTests.swift in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 33CC10E92044A3C60003C045 /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 33CC11132044BFA00003C045 /* MainFlutterWindow.swift in Sources */, - 33CC10F12044A3C60003C045 /* AppDelegate.swift in Sources */, - 335BBD1B22A9A15E00E9071D /* GeneratedPluginRegistrant.swift in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXSourcesBuildPhase section */ - -/* Begin PBXTargetDependency section */ - 331C80DA294CF71000263BE5 /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - target = 33CC10EC2044A3C60003C045 /* Runner */; - targetProxy = 331C80D9294CF71000263BE5 /* PBXContainerItemProxy */; - }; - 33CC11202044C79F0003C045 /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - target = 33CC111A2044C6BA0003C045 /* Flutter Assemble */; - targetProxy = 33CC111F2044C79F0003C045 /* PBXContainerItemProxy */; - }; -/* End PBXTargetDependency section */ - -/* Begin PBXVariantGroup section */ - 33CC10F42044A3C60003C045 /* MainMenu.xib */ = { - isa = PBXVariantGroup; - children = ( - 33CC10F52044A3C60003C045 /* Base */, - ); - name = MainMenu.xib; - path = Runner; - sourceTree = ""; - }; -/* End PBXVariantGroup section */ - -/* Begin XCBuildConfiguration section */ - 331C80DB294CF71000263BE5 /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - BUNDLE_LOADER = "$(TEST_HOST)"; - CURRENT_PROJECT_VERSION = 1; - GENERATE_INFOPLIST_FILE = YES; - MARKETING_VERSION = 1.0; - PRODUCT_BUNDLE_IDENTIFIER = com.mobileapp.store.ride.RunnerTests; - PRODUCT_NAME = "$(TARGET_NAME)"; - SWIFT_VERSION = 5.0; - TEST_HOST = "$(BUILT_PRODUCTS_DIR)/ride.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/ride"; - }; - name = Debug; - }; - 331C80DC294CF71000263BE5 /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - BUNDLE_LOADER = "$(TEST_HOST)"; - CURRENT_PROJECT_VERSION = 1; - GENERATE_INFOPLIST_FILE = YES; - MARKETING_VERSION = 1.0; - PRODUCT_BUNDLE_IDENTIFIER = com.mobileapp.store.ride.RunnerTests; - PRODUCT_NAME = "$(TARGET_NAME)"; - SWIFT_VERSION = 5.0; - TEST_HOST = "$(BUILT_PRODUCTS_DIR)/ride.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/ride"; - }; - name = Release; - }; - 331C80DD294CF71000263BE5 /* Profile */ = { - isa = XCBuildConfiguration; - buildSettings = { - BUNDLE_LOADER = "$(TEST_HOST)"; - CURRENT_PROJECT_VERSION = 1; - GENERATE_INFOPLIST_FILE = YES; - MARKETING_VERSION = 1.0; - PRODUCT_BUNDLE_IDENTIFIER = com.mobileapp.store.ride.RunnerTests; - PRODUCT_NAME = "$(TARGET_NAME)"; - SWIFT_VERSION = 5.0; - TEST_HOST = "$(BUILT_PRODUCTS_DIR)/ride.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/ride"; - }; - name = Profile; - }; - 338D0CE9231458BD00FA5F75 /* Profile */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - CLANG_ANALYZER_NONNULL = YES; - CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; - CLANG_CXX_LIBRARY = "libc++"; - CLANG_ENABLE_MODULES = YES; - CLANG_ENABLE_OBJC_ARC = YES; - CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; - CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; - CLANG_WARN_DOCUMENTATION_COMMENTS = YES; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INFINITE_RECURSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; - CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; - CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; - CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; - CLANG_WARN_SUSPICIOUS_MOVE = YES; - CODE_SIGN_IDENTITY = "-"; - COPY_PHASE_STRIP = NO; - DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; - ENABLE_NS_ASSERTIONS = NO; - ENABLE_STRICT_OBJC_MSGSEND = YES; - GCC_C_LANGUAGE_STANDARD = gnu11; - GCC_NO_COMMON_BLOCKS = YES; - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; - GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; - GCC_WARN_UNUSED_FUNCTION = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - MACOSX_DEPLOYMENT_TARGET = 10.14; - MTL_ENABLE_DEBUG_INFO = NO; - SDKROOT = macosx; - SWIFT_COMPILATION_MODE = wholemodule; - SWIFT_OPTIMIZATION_LEVEL = "-O"; - }; - name = Profile; - }; - 338D0CEA231458BD00FA5F75 /* Profile */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 33E5194F232828860026EE4D /* AppInfo.xcconfig */; - buildSettings = { - ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; - CLANG_ENABLE_MODULES = YES; - CODE_SIGN_ENTITLEMENTS = Runner/DebugProfile.entitlements; - CODE_SIGN_STYLE = Automatic; - COMBINE_HIDPI_IMAGES = YES; - INFOPLIST_FILE = Runner/Info.plist; - LD_RUNPATH_SEARCH_PATHS = ( - "$(inherited)", - "@executable_path/../Frameworks", - ); - PROVISIONING_PROFILE_SPECIFIER = ""; - SWIFT_VERSION = 5.0; - }; - name = Profile; - }; - 338D0CEB231458BD00FA5F75 /* Profile */ = { - isa = XCBuildConfiguration; - buildSettings = { - CODE_SIGN_STYLE = Manual; - PRODUCT_NAME = "$(TARGET_NAME)"; - }; - name = Profile; - }; - 33CC10F92044A3C60003C045 /* Debug */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 9740EEB21CF90195004384FC /* Debug.xcconfig */; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - CLANG_ANALYZER_NONNULL = YES; - CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; - CLANG_CXX_LIBRARY = "libc++"; - CLANG_ENABLE_MODULES = YES; - CLANG_ENABLE_OBJC_ARC = YES; - CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; - CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; - CLANG_WARN_DOCUMENTATION_COMMENTS = YES; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INFINITE_RECURSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; - CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; - CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; - CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; - CLANG_WARN_SUSPICIOUS_MOVE = YES; - CODE_SIGN_IDENTITY = "-"; - COPY_PHASE_STRIP = NO; - DEBUG_INFORMATION_FORMAT = dwarf; - ENABLE_STRICT_OBJC_MSGSEND = YES; - ENABLE_TESTABILITY = YES; - GCC_C_LANGUAGE_STANDARD = gnu11; - GCC_DYNAMIC_NO_PIC = NO; - GCC_NO_COMMON_BLOCKS = YES; - GCC_OPTIMIZATION_LEVEL = 0; - GCC_PREPROCESSOR_DEFINITIONS = ( - "DEBUG=1", - "$(inherited)", - ); - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; - GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; - GCC_WARN_UNUSED_FUNCTION = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - MACOSX_DEPLOYMENT_TARGET = 10.14; - MTL_ENABLE_DEBUG_INFO = YES; - ONLY_ACTIVE_ARCH = YES; - SDKROOT = macosx; - SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; - SWIFT_OPTIMIZATION_LEVEL = "-Onone"; - }; - name = Debug; - }; - 33CC10FA2044A3C60003C045 /* Release */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - CLANG_ANALYZER_NONNULL = YES; - CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; - CLANG_CXX_LIBRARY = "libc++"; - CLANG_ENABLE_MODULES = YES; - CLANG_ENABLE_OBJC_ARC = YES; - CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; - CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; - CLANG_WARN_DOCUMENTATION_COMMENTS = YES; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INFINITE_RECURSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; - CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; - CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; - CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; - CLANG_WARN_SUSPICIOUS_MOVE = YES; - CODE_SIGN_IDENTITY = "-"; - COPY_PHASE_STRIP = NO; - DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; - ENABLE_NS_ASSERTIONS = NO; - ENABLE_STRICT_OBJC_MSGSEND = YES; - GCC_C_LANGUAGE_STANDARD = gnu11; - GCC_NO_COMMON_BLOCKS = YES; - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; - GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; - GCC_WARN_UNUSED_FUNCTION = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - MACOSX_DEPLOYMENT_TARGET = 10.14; - MTL_ENABLE_DEBUG_INFO = NO; - SDKROOT = macosx; - SWIFT_COMPILATION_MODE = wholemodule; - SWIFT_OPTIMIZATION_LEVEL = "-O"; - }; - name = Release; - }; - 33CC10FC2044A3C60003C045 /* Debug */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 33E5194F232828860026EE4D /* AppInfo.xcconfig */; - buildSettings = { - ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; - CLANG_ENABLE_MODULES = YES; - CODE_SIGN_ENTITLEMENTS = Runner/DebugProfile.entitlements; - CODE_SIGN_STYLE = Automatic; - COMBINE_HIDPI_IMAGES = YES; - INFOPLIST_FILE = Runner/Info.plist; - LD_RUNPATH_SEARCH_PATHS = ( - "$(inherited)", - "@executable_path/../Frameworks", - ); - PROVISIONING_PROFILE_SPECIFIER = ""; - SWIFT_OPTIMIZATION_LEVEL = "-Onone"; - SWIFT_VERSION = 5.0; - }; - name = Debug; - }; - 33CC10FD2044A3C60003C045 /* Release */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 33E5194F232828860026EE4D /* AppInfo.xcconfig */; - buildSettings = { - ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; - CLANG_ENABLE_MODULES = YES; - CODE_SIGN_ENTITLEMENTS = Runner/Release.entitlements; - CODE_SIGN_STYLE = Automatic; - COMBINE_HIDPI_IMAGES = YES; - INFOPLIST_FILE = Runner/Info.plist; - LD_RUNPATH_SEARCH_PATHS = ( - "$(inherited)", - "@executable_path/../Frameworks", - ); - PROVISIONING_PROFILE_SPECIFIER = ""; - SWIFT_VERSION = 5.0; - }; - name = Release; - }; - 33CC111C2044C6BA0003C045 /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - CODE_SIGN_STYLE = Manual; - PRODUCT_NAME = "$(TARGET_NAME)"; - }; - name = Debug; - }; - 33CC111D2044C6BA0003C045 /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - CODE_SIGN_STYLE = Automatic; - PRODUCT_NAME = "$(TARGET_NAME)"; - }; - name = Release; - }; -/* End XCBuildConfiguration section */ - -/* Begin XCConfigurationList section */ - 331C80DE294CF71000263BE5 /* Build configuration list for PBXNativeTarget "RunnerTests" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 331C80DB294CF71000263BE5 /* Debug */, - 331C80DC294CF71000263BE5 /* Release */, - 331C80DD294CF71000263BE5 /* Profile */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - 33CC10E82044A3C60003C045 /* Build configuration list for PBXProject "Runner" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 33CC10F92044A3C60003C045 /* Debug */, - 33CC10FA2044A3C60003C045 /* Release */, - 338D0CE9231458BD00FA5F75 /* Profile */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - 33CC10FB2044A3C60003C045 /* Build configuration list for PBXNativeTarget "Runner" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 33CC10FC2044A3C60003C045 /* Debug */, - 33CC10FD2044A3C60003C045 /* Release */, - 338D0CEA231458BD00FA5F75 /* Profile */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - 33CC111B2044C6BA0003C045 /* Build configuration list for PBXAggregateTarget "Flutter Assemble" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 33CC111C2044C6BA0003C045 /* Debug */, - 33CC111D2044C6BA0003C045 /* Release */, - 338D0CEB231458BD00FA5F75 /* Profile */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; -/* End XCConfigurationList section */ - }; - rootObject = 33CC10E52044A3C60003C045 /* Project object */; -} diff --git a/apps/rider-archive-cubit/macos/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/apps/rider-archive-cubit/macos/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist deleted file mode 100644 index 18d9810..0000000 --- a/apps/rider-archive-cubit/macos/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist +++ /dev/null @@ -1,8 +0,0 @@ - - - - - IDEDidComputeMac32BitWarning - - - diff --git a/apps/rider-archive-cubit/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/apps/rider-archive-cubit/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme deleted file mode 100644 index 6d42e35..0000000 --- a/apps/rider-archive-cubit/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +++ /dev/null @@ -1,98 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/apps/rider-archive-cubit/macos/Runner.xcworkspace/contents.xcworkspacedata b/apps/rider-archive-cubit/macos/Runner.xcworkspace/contents.xcworkspacedata deleted file mode 100644 index 1d526a1..0000000 --- a/apps/rider-archive-cubit/macos/Runner.xcworkspace/contents.xcworkspacedata +++ /dev/null @@ -1,7 +0,0 @@ - - - - - diff --git a/apps/rider-archive-cubit/macos/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/apps/rider-archive-cubit/macos/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist deleted file mode 100644 index 18d9810..0000000 --- a/apps/rider-archive-cubit/macos/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist +++ /dev/null @@ -1,8 +0,0 @@ - - - - - IDEDidComputeMac32BitWarning - - - diff --git a/apps/rider-archive-cubit/macos/Runner/AppDelegate.swift b/apps/rider-archive-cubit/macos/Runner/AppDelegate.swift deleted file mode 100644 index b3c1761..0000000 --- a/apps/rider-archive-cubit/macos/Runner/AppDelegate.swift +++ /dev/null @@ -1,13 +0,0 @@ -import Cocoa -import FlutterMacOS - -@main -class AppDelegate: FlutterAppDelegate { - override func applicationShouldTerminateAfterLastWindowClosed(_ sender: NSApplication) -> Bool { - return true - } - - override func applicationSupportsSecureRestorableState(_ app: NSApplication) -> Bool { - return true - } -} diff --git a/apps/rider-archive-cubit/macos/Runner/Assets.xcassets/AppIcon.appiconset/100.png b/apps/rider-archive-cubit/macos/Runner/Assets.xcassets/AppIcon.appiconset/100.png deleted file mode 100644 index 06a5ca4..0000000 Binary files a/apps/rider-archive-cubit/macos/Runner/Assets.xcassets/AppIcon.appiconset/100.png and /dev/null differ diff --git a/apps/rider-archive-cubit/macos/Runner/Assets.xcassets/AppIcon.appiconset/1024.png b/apps/rider-archive-cubit/macos/Runner/Assets.xcassets/AppIcon.appiconset/1024.png deleted file mode 100644 index 776785b..0000000 Binary files a/apps/rider-archive-cubit/macos/Runner/Assets.xcassets/AppIcon.appiconset/1024.png and /dev/null differ diff --git a/apps/rider-archive-cubit/macos/Runner/Assets.xcassets/AppIcon.appiconset/114.png b/apps/rider-archive-cubit/macos/Runner/Assets.xcassets/AppIcon.appiconset/114.png deleted file mode 100644 index 9d849c2..0000000 Binary files a/apps/rider-archive-cubit/macos/Runner/Assets.xcassets/AppIcon.appiconset/114.png and /dev/null differ diff --git a/apps/rider-archive-cubit/macos/Runner/Assets.xcassets/AppIcon.appiconset/120.png b/apps/rider-archive-cubit/macos/Runner/Assets.xcassets/AppIcon.appiconset/120.png deleted file mode 100644 index fa21b1d..0000000 Binary files a/apps/rider-archive-cubit/macos/Runner/Assets.xcassets/AppIcon.appiconset/120.png and /dev/null differ diff --git a/apps/rider-archive-cubit/macos/Runner/Assets.xcassets/AppIcon.appiconset/128.png b/apps/rider-archive-cubit/macos/Runner/Assets.xcassets/AppIcon.appiconset/128.png deleted file mode 100644 index 723651e..0000000 Binary files a/apps/rider-archive-cubit/macos/Runner/Assets.xcassets/AppIcon.appiconset/128.png and /dev/null differ diff --git a/apps/rider-archive-cubit/macos/Runner/Assets.xcassets/AppIcon.appiconset/144.png b/apps/rider-archive-cubit/macos/Runner/Assets.xcassets/AppIcon.appiconset/144.png deleted file mode 100644 index dae61b3..0000000 Binary files a/apps/rider-archive-cubit/macos/Runner/Assets.xcassets/AppIcon.appiconset/144.png and /dev/null differ diff --git a/apps/rider-archive-cubit/macos/Runner/Assets.xcassets/AppIcon.appiconset/152.png b/apps/rider-archive-cubit/macos/Runner/Assets.xcassets/AppIcon.appiconset/152.png deleted file mode 100644 index d8b1a7f..0000000 Binary files a/apps/rider-archive-cubit/macos/Runner/Assets.xcassets/AppIcon.appiconset/152.png and /dev/null differ diff --git a/apps/rider-archive-cubit/macos/Runner/Assets.xcassets/AppIcon.appiconset/16.png b/apps/rider-archive-cubit/macos/Runner/Assets.xcassets/AppIcon.appiconset/16.png deleted file mode 100644 index f187210..0000000 Binary files a/apps/rider-archive-cubit/macos/Runner/Assets.xcassets/AppIcon.appiconset/16.png and /dev/null differ diff --git a/apps/rider-archive-cubit/macos/Runner/Assets.xcassets/AppIcon.appiconset/167.png b/apps/rider-archive-cubit/macos/Runner/Assets.xcassets/AppIcon.appiconset/167.png deleted file mode 100644 index 9f9ea91..0000000 Binary files a/apps/rider-archive-cubit/macos/Runner/Assets.xcassets/AppIcon.appiconset/167.png and /dev/null differ diff --git a/apps/rider-archive-cubit/macos/Runner/Assets.xcassets/AppIcon.appiconset/180.png b/apps/rider-archive-cubit/macos/Runner/Assets.xcassets/AppIcon.appiconset/180.png deleted file mode 100644 index a4cb198..0000000 Binary files a/apps/rider-archive-cubit/macos/Runner/Assets.xcassets/AppIcon.appiconset/180.png and /dev/null differ diff --git a/apps/rider-archive-cubit/macos/Runner/Assets.xcassets/AppIcon.appiconset/20.png b/apps/rider-archive-cubit/macos/Runner/Assets.xcassets/AppIcon.appiconset/20.png deleted file mode 100644 index 9cd0b7a..0000000 Binary files a/apps/rider-archive-cubit/macos/Runner/Assets.xcassets/AppIcon.appiconset/20.png and /dev/null differ diff --git a/apps/rider-archive-cubit/macos/Runner/Assets.xcassets/AppIcon.appiconset/256.png b/apps/rider-archive-cubit/macos/Runner/Assets.xcassets/AppIcon.appiconset/256.png deleted file mode 100644 index c0ae1fb..0000000 Binary files a/apps/rider-archive-cubit/macos/Runner/Assets.xcassets/AppIcon.appiconset/256.png and /dev/null differ diff --git a/apps/rider-archive-cubit/macos/Runner/Assets.xcassets/AppIcon.appiconset/29.png b/apps/rider-archive-cubit/macos/Runner/Assets.xcassets/AppIcon.appiconset/29.png deleted file mode 100644 index a4c5844..0000000 Binary files a/apps/rider-archive-cubit/macos/Runner/Assets.xcassets/AppIcon.appiconset/29.png and /dev/null differ diff --git a/apps/rider-archive-cubit/macos/Runner/Assets.xcassets/AppIcon.appiconset/32.png b/apps/rider-archive-cubit/macos/Runner/Assets.xcassets/AppIcon.appiconset/32.png deleted file mode 100644 index 5f8c2f2..0000000 Binary files a/apps/rider-archive-cubit/macos/Runner/Assets.xcassets/AppIcon.appiconset/32.png and /dev/null differ diff --git a/apps/rider-archive-cubit/macos/Runner/Assets.xcassets/AppIcon.appiconset/40.png b/apps/rider-archive-cubit/macos/Runner/Assets.xcassets/AppIcon.appiconset/40.png deleted file mode 100644 index b0270d4..0000000 Binary files a/apps/rider-archive-cubit/macos/Runner/Assets.xcassets/AppIcon.appiconset/40.png and /dev/null differ diff --git a/apps/rider-archive-cubit/macos/Runner/Assets.xcassets/AppIcon.appiconset/50.png b/apps/rider-archive-cubit/macos/Runner/Assets.xcassets/AppIcon.appiconset/50.png deleted file mode 100644 index d54573f..0000000 Binary files a/apps/rider-archive-cubit/macos/Runner/Assets.xcassets/AppIcon.appiconset/50.png and /dev/null differ diff --git a/apps/rider-archive-cubit/macos/Runner/Assets.xcassets/AppIcon.appiconset/512.png b/apps/rider-archive-cubit/macos/Runner/Assets.xcassets/AppIcon.appiconset/512.png deleted file mode 100644 index f7af634..0000000 Binary files a/apps/rider-archive-cubit/macos/Runner/Assets.xcassets/AppIcon.appiconset/512.png and /dev/null differ diff --git a/apps/rider-archive-cubit/macos/Runner/Assets.xcassets/AppIcon.appiconset/57.png b/apps/rider-archive-cubit/macos/Runner/Assets.xcassets/AppIcon.appiconset/57.png deleted file mode 100644 index 88246f8..0000000 Binary files a/apps/rider-archive-cubit/macos/Runner/Assets.xcassets/AppIcon.appiconset/57.png and /dev/null differ diff --git a/apps/rider-archive-cubit/macos/Runner/Assets.xcassets/AppIcon.appiconset/58.png b/apps/rider-archive-cubit/macos/Runner/Assets.xcassets/AppIcon.appiconset/58.png deleted file mode 100644 index 579ecfb..0000000 Binary files a/apps/rider-archive-cubit/macos/Runner/Assets.xcassets/AppIcon.appiconset/58.png and /dev/null differ diff --git a/apps/rider-archive-cubit/macos/Runner/Assets.xcassets/AppIcon.appiconset/60.png b/apps/rider-archive-cubit/macos/Runner/Assets.xcassets/AppIcon.appiconset/60.png deleted file mode 100644 index 6375658..0000000 Binary files a/apps/rider-archive-cubit/macos/Runner/Assets.xcassets/AppIcon.appiconset/60.png and /dev/null differ diff --git a/apps/rider-archive-cubit/macos/Runner/Assets.xcassets/AppIcon.appiconset/64.png b/apps/rider-archive-cubit/macos/Runner/Assets.xcassets/AppIcon.appiconset/64.png deleted file mode 100644 index c05e1b0..0000000 Binary files a/apps/rider-archive-cubit/macos/Runner/Assets.xcassets/AppIcon.appiconset/64.png and /dev/null differ diff --git a/apps/rider-archive-cubit/macos/Runner/Assets.xcassets/AppIcon.appiconset/72.png b/apps/rider-archive-cubit/macos/Runner/Assets.xcassets/AppIcon.appiconset/72.png deleted file mode 100644 index 4cdf4ba..0000000 Binary files a/apps/rider-archive-cubit/macos/Runner/Assets.xcassets/AppIcon.appiconset/72.png and /dev/null differ diff --git a/apps/rider-archive-cubit/macos/Runner/Assets.xcassets/AppIcon.appiconset/76.png b/apps/rider-archive-cubit/macos/Runner/Assets.xcassets/AppIcon.appiconset/76.png deleted file mode 100644 index f98f82d..0000000 Binary files a/apps/rider-archive-cubit/macos/Runner/Assets.xcassets/AppIcon.appiconset/76.png and /dev/null differ diff --git a/apps/rider-archive-cubit/macos/Runner/Assets.xcassets/AppIcon.appiconset/80.png b/apps/rider-archive-cubit/macos/Runner/Assets.xcassets/AppIcon.appiconset/80.png deleted file mode 100644 index e1bb646..0000000 Binary files a/apps/rider-archive-cubit/macos/Runner/Assets.xcassets/AppIcon.appiconset/80.png and /dev/null differ diff --git a/apps/rider-archive-cubit/macos/Runner/Assets.xcassets/AppIcon.appiconset/87.png b/apps/rider-archive-cubit/macos/Runner/Assets.xcassets/AppIcon.appiconset/87.png deleted file mode 100644 index f94f8e5..0000000 Binary files a/apps/rider-archive-cubit/macos/Runner/Assets.xcassets/AppIcon.appiconset/87.png and /dev/null differ diff --git a/apps/rider-archive-cubit/macos/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json b/apps/rider-archive-cubit/macos/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json deleted file mode 100644 index ac5afcb..0000000 --- a/apps/rider-archive-cubit/macos/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json +++ /dev/null @@ -1,64 +0,0 @@ -{ - "images": [ - { - "size": "16x16", - "idiom": "mac", - "filename": "app_icon_16.png", - "scale": "1x" - }, - { - "size": "16x16", - "idiom": "mac", - "filename": "app_icon_32.png", - "scale": "2x" - }, - { - "size": "32x32", - "idiom": "mac", - "filename": "app_icon_32.png", - "scale": "1x" - }, - { - "size": "32x32", - "idiom": "mac", - "filename": "app_icon_64.png", - "scale": "2x" - }, - { - "size": "128x128", - "idiom": "mac", - "filename": "app_icon_128.png", - "scale": "1x" - }, - { - "size": "128x128", - "idiom": "mac", - "filename": "app_icon_256.png", - "scale": "2x" - }, - { - "size": "256x256", - "idiom": "mac", - "filename": "app_icon_256.png", - "scale": "1x" - }, - { - "size": "256x256", - "idiom": "mac", - "filename": "app_icon_512.png", - "scale": "2x" - }, - { - "size": "512x512", - "idiom": "mac", - "filename": "app_icon_512.png", - "scale": "1x" - }, - { - "size": "512x512", - "idiom": "mac", - "filename": "app_icon_1024.png", - "scale": "2x" - } - ] -} \ No newline at end of file diff --git a/apps/rider-archive-cubit/macos/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png b/apps/rider-archive-cubit/macos/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png deleted file mode 100644 index dc9ada4..0000000 Binary files a/apps/rider-archive-cubit/macos/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png and /dev/null differ diff --git a/apps/rider-archive-cubit/macos/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png b/apps/rider-archive-cubit/macos/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png deleted file mode 100644 index 7353c41..0000000 Binary files a/apps/rider-archive-cubit/macos/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png and /dev/null differ diff --git a/apps/rider-archive-cubit/macos/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png b/apps/rider-archive-cubit/macos/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png deleted file mode 100644 index 797d452..0000000 Binary files a/apps/rider-archive-cubit/macos/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png and /dev/null differ diff --git a/apps/rider-archive-cubit/macos/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png b/apps/rider-archive-cubit/macos/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png deleted file mode 100644 index 6ed2d93..0000000 Binary files a/apps/rider-archive-cubit/macos/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png and /dev/null differ diff --git a/apps/rider-archive-cubit/macos/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png b/apps/rider-archive-cubit/macos/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png deleted file mode 100644 index 4cd7b00..0000000 Binary files a/apps/rider-archive-cubit/macos/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png and /dev/null differ diff --git a/apps/rider-archive-cubit/macos/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png b/apps/rider-archive-cubit/macos/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png deleted file mode 100644 index fe73094..0000000 Binary files a/apps/rider-archive-cubit/macos/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png and /dev/null differ diff --git a/apps/rider-archive-cubit/macos/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png b/apps/rider-archive-cubit/macos/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png deleted file mode 100644 index 321773c..0000000 Binary files a/apps/rider-archive-cubit/macos/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png and /dev/null differ diff --git a/apps/rider-archive-cubit/macos/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png b/apps/rider-archive-cubit/macos/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png deleted file mode 100644 index 797d452..0000000 Binary files a/apps/rider-archive-cubit/macos/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png and /dev/null differ diff --git a/apps/rider-archive-cubit/macos/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png b/apps/rider-archive-cubit/macos/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png deleted file mode 100644 index 502f463..0000000 Binary files a/apps/rider-archive-cubit/macos/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png and /dev/null differ diff --git a/apps/rider-archive-cubit/macos/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png b/apps/rider-archive-cubit/macos/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png deleted file mode 100644 index 0ec3034..0000000 Binary files a/apps/rider-archive-cubit/macos/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png and /dev/null differ diff --git a/apps/rider-archive-cubit/macos/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png b/apps/rider-archive-cubit/macos/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png deleted file mode 100644 index 0ec3034..0000000 Binary files a/apps/rider-archive-cubit/macos/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png and /dev/null differ diff --git a/apps/rider-archive-cubit/macos/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png b/apps/rider-archive-cubit/macos/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png deleted file mode 100644 index e9f5fea..0000000 Binary files a/apps/rider-archive-cubit/macos/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png and /dev/null differ diff --git a/apps/rider-archive-cubit/macos/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png b/apps/rider-archive-cubit/macos/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png deleted file mode 100644 index 84ac32a..0000000 Binary files a/apps/rider-archive-cubit/macos/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png and /dev/null differ diff --git a/apps/rider-archive-cubit/macos/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png b/apps/rider-archive-cubit/macos/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png deleted file mode 100644 index 8953cba..0000000 Binary files a/apps/rider-archive-cubit/macos/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png and /dev/null differ diff --git a/apps/rider-archive-cubit/macos/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png b/apps/rider-archive-cubit/macos/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png deleted file mode 100644 index 0467bf1..0000000 Binary files a/apps/rider-archive-cubit/macos/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png and /dev/null differ diff --git a/apps/rider-archive-cubit/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_1024.png b/apps/rider-archive-cubit/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_1024.png deleted file mode 100644 index ef7b785..0000000 Binary files a/apps/rider-archive-cubit/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_1024.png and /dev/null differ diff --git a/apps/rider-archive-cubit/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_128.png b/apps/rider-archive-cubit/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_128.png deleted file mode 100644 index 8360e19..0000000 Binary files a/apps/rider-archive-cubit/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_128.png and /dev/null differ diff --git a/apps/rider-archive-cubit/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_16.png b/apps/rider-archive-cubit/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_16.png deleted file mode 100644 index e7bbc83..0000000 Binary files a/apps/rider-archive-cubit/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_16.png and /dev/null differ diff --git a/apps/rider-archive-cubit/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_256.png b/apps/rider-archive-cubit/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_256.png deleted file mode 100644 index 8e1e3d9..0000000 Binary files a/apps/rider-archive-cubit/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_256.png and /dev/null differ diff --git a/apps/rider-archive-cubit/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_32.png b/apps/rider-archive-cubit/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_32.png deleted file mode 100644 index 1dab5d4..0000000 Binary files a/apps/rider-archive-cubit/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_32.png and /dev/null differ diff --git a/apps/rider-archive-cubit/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_512.png b/apps/rider-archive-cubit/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_512.png deleted file mode 100644 index 08e31d1..0000000 Binary files a/apps/rider-archive-cubit/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_512.png and /dev/null differ diff --git a/apps/rider-archive-cubit/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_64.png b/apps/rider-archive-cubit/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_64.png deleted file mode 100644 index 9007c6f..0000000 Binary files a/apps/rider-archive-cubit/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_64.png and /dev/null differ diff --git a/apps/rider-archive-cubit/macos/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json b/apps/rider-archive-cubit/macos/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json deleted file mode 100644 index 0bedcf2..0000000 --- a/apps/rider-archive-cubit/macos/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "images" : [ - { - "idiom" : "universal", - "filename" : "LaunchImage.png", - "scale" : "1x" - }, - { - "idiom" : "universal", - "filename" : "LaunchImage@2x.png", - "scale" : "2x" - }, - { - "idiom" : "universal", - "filename" : "LaunchImage@3x.png", - "scale" : "3x" - } - ], - "info" : { - "version" : 1, - "author" : "xcode" - } -} diff --git a/apps/rider-archive-cubit/macos/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png b/apps/rider-archive-cubit/macos/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png deleted file mode 100644 index 9da19ea..0000000 Binary files a/apps/rider-archive-cubit/macos/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png and /dev/null differ diff --git a/apps/rider-archive-cubit/macos/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png b/apps/rider-archive-cubit/macos/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png deleted file mode 100644 index 9da19ea..0000000 Binary files a/apps/rider-archive-cubit/macos/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png and /dev/null differ diff --git a/apps/rider-archive-cubit/macos/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png b/apps/rider-archive-cubit/macos/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png deleted file mode 100644 index 9da19ea..0000000 Binary files a/apps/rider-archive-cubit/macos/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png and /dev/null differ diff --git a/apps/rider-archive-cubit/macos/Runner/Assets.xcassets/LaunchImage.imageset/README.md b/apps/rider-archive-cubit/macos/Runner/Assets.xcassets/LaunchImage.imageset/README.md deleted file mode 100644 index 89c2725..0000000 --- a/apps/rider-archive-cubit/macos/Runner/Assets.xcassets/LaunchImage.imageset/README.md +++ /dev/null @@ -1,5 +0,0 @@ -# Launch Screen Assets - -You can customize the launch screen with your own desired assets by replacing the image files in this directory. - -You can also do it by opening your Flutter project's Xcode project with `open ios/Runner.xcworkspace`, selecting `Runner/Assets.xcassets` in the Project Navigator and dropping in the desired images. \ No newline at end of file diff --git a/apps/rider-archive-cubit/macos/Runner/Base.lproj/MainMenu.xib b/apps/rider-archive-cubit/macos/Runner/Base.lproj/MainMenu.xib deleted file mode 100644 index 80e867a..0000000 --- a/apps/rider-archive-cubit/macos/Runner/Base.lproj/MainMenu.xib +++ /dev/null @@ -1,343 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/apps/rider-archive-cubit/macos/Runner/Configs/AppInfo.xcconfig b/apps/rider-archive-cubit/macos/Runner/Configs/AppInfo.xcconfig deleted file mode 100644 index 8fc065e..0000000 --- a/apps/rider-archive-cubit/macos/Runner/Configs/AppInfo.xcconfig +++ /dev/null @@ -1,14 +0,0 @@ -// Application-level settings for the Runner target. -// -// This may be replaced with something auto-generated from metadata (e.g., pubspec.yaml) in the -// future. If not, the values below would default to using the project name when this becomes a -// 'flutter create' template. - -// The application's name. By default this is also the title of the Flutter window. -PRODUCT_NAME = ride - -// The application's bundle identifier -PRODUCT_BUNDLE_IDENTIFIER = com.mobileapp.store.ride - -// The copyright displayed in application information -PRODUCT_COPYRIGHT = Copyright © 2023 com.mobileapp.store. All rights reserved. diff --git a/apps/rider-archive-cubit/macos/Runner/Configs/Debug.xcconfig b/apps/rider-archive-cubit/macos/Runner/Configs/Debug.xcconfig deleted file mode 100644 index 36b0fd9..0000000 --- a/apps/rider-archive-cubit/macos/Runner/Configs/Debug.xcconfig +++ /dev/null @@ -1,2 +0,0 @@ -#include "../../Flutter/Flutter-Debug.xcconfig" -#include "Warnings.xcconfig" diff --git a/apps/rider-archive-cubit/macos/Runner/Configs/Release.xcconfig b/apps/rider-archive-cubit/macos/Runner/Configs/Release.xcconfig deleted file mode 100644 index dff4f49..0000000 --- a/apps/rider-archive-cubit/macos/Runner/Configs/Release.xcconfig +++ /dev/null @@ -1,2 +0,0 @@ -#include "../../Flutter/Flutter-Release.xcconfig" -#include "Warnings.xcconfig" diff --git a/apps/rider-archive-cubit/macos/Runner/Configs/Warnings.xcconfig b/apps/rider-archive-cubit/macos/Runner/Configs/Warnings.xcconfig deleted file mode 100644 index 42bcbf4..0000000 --- a/apps/rider-archive-cubit/macos/Runner/Configs/Warnings.xcconfig +++ /dev/null @@ -1,13 +0,0 @@ -WARNING_CFLAGS = -Wall -Wconditional-uninitialized -Wnullable-to-nonnull-conversion -Wmissing-method-return-type -Woverlength-strings -GCC_WARN_UNDECLARED_SELECTOR = YES -CLANG_UNDEFINED_BEHAVIOR_SANITIZER_NULLABILITY = YES -CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE -CLANG_WARN__DUPLICATE_METHOD_MATCH = YES -CLANG_WARN_PRAGMA_PACK = YES -CLANG_WARN_STRICT_PROTOTYPES = YES -CLANG_WARN_COMMA = YES -GCC_WARN_STRICT_SELECTOR_MATCH = YES -CLANG_WARN_OBJC_REPEATED_USE_OF_WEAK = YES -CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES -GCC_WARN_SHADOW = YES -CLANG_WARN_UNREACHABLE_CODE = YES diff --git a/apps/rider-archive-cubit/macos/Runner/DebugProfile.entitlements b/apps/rider-archive-cubit/macos/Runner/DebugProfile.entitlements deleted file mode 100644 index dddb8a3..0000000 --- a/apps/rider-archive-cubit/macos/Runner/DebugProfile.entitlements +++ /dev/null @@ -1,12 +0,0 @@ - - - - - com.apple.security.app-sandbox - - com.apple.security.cs.allow-jit - - com.apple.security.network.server - - - diff --git a/apps/rider-archive-cubit/macos/Runner/Info.plist b/apps/rider-archive-cubit/macos/Runner/Info.plist deleted file mode 100644 index 4789daa..0000000 --- a/apps/rider-archive-cubit/macos/Runner/Info.plist +++ /dev/null @@ -1,32 +0,0 @@ - - - - - CFBundleDevelopmentRegion - $(DEVELOPMENT_LANGUAGE) - CFBundleExecutable - $(EXECUTABLE_NAME) - CFBundleIconFile - - CFBundleIdentifier - $(PRODUCT_BUNDLE_IDENTIFIER) - CFBundleInfoDictionaryVersion - 6.0 - CFBundleName - $(PRODUCT_NAME) - CFBundlePackageType - APPL - CFBundleShortVersionString - $(FLUTTER_BUILD_NAME) - CFBundleVersion - $(FLUTTER_BUILD_NUMBER) - LSMinimumSystemVersion - $(MACOSX_DEPLOYMENT_TARGET) - NSHumanReadableCopyright - $(PRODUCT_COPYRIGHT) - NSMainNibFile - MainMenu - NSPrincipalClass - NSApplication - - diff --git a/apps/rider-archive-cubit/macos/Runner/MainFlutterWindow.swift b/apps/rider-archive-cubit/macos/Runner/MainFlutterWindow.swift deleted file mode 100644 index 3cc05eb..0000000 --- a/apps/rider-archive-cubit/macos/Runner/MainFlutterWindow.swift +++ /dev/null @@ -1,15 +0,0 @@ -import Cocoa -import FlutterMacOS - -class MainFlutterWindow: NSWindow { - override func awakeFromNib() { - let flutterViewController = FlutterViewController() - let windowFrame = self.frame - self.contentViewController = flutterViewController - self.setFrame(windowFrame, display: true) - - RegisterGeneratedPlugins(registry: flutterViewController) - - super.awakeFromNib() - } -} diff --git a/apps/rider-archive-cubit/macos/Runner/Release.entitlements b/apps/rider-archive-cubit/macos/Runner/Release.entitlements deleted file mode 100644 index 852fa1a..0000000 --- a/apps/rider-archive-cubit/macos/Runner/Release.entitlements +++ /dev/null @@ -1,8 +0,0 @@ - - - - - com.apple.security.app-sandbox - - - diff --git a/apps/rider-archive-cubit/macos/RunnerTests/RunnerTests.swift b/apps/rider-archive-cubit/macos/RunnerTests/RunnerTests.swift deleted file mode 100644 index 5418c9f..0000000 --- a/apps/rider-archive-cubit/macos/RunnerTests/RunnerTests.swift +++ /dev/null @@ -1,12 +0,0 @@ -import FlutterMacOS -import Cocoa -import XCTest - -class RunnerTests: XCTestCase { - - func testExample() { - // If you add code to the Runner application, consider adding tests here. - // See https://developer.apple.com/documentation/xctest for more information about using XCTest. - } - -} diff --git a/apps/rider-archive-cubit/macos/firebase_app_id_file.json b/apps/rider-archive-cubit/macos/firebase_app_id_file.json deleted file mode 100644 index 665da2c..0000000 --- a/apps/rider-archive-cubit/macos/firebase_app_id_file.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "file_generated_by": "FlutterFire CLI", - "purpose": "FirebaseAppID & ProjectID for this Firebase app in this directory", - "GOOGLE_APP_ID": "1:594687661098:ios:e8ca02ed508d4737595f53", - "FIREBASE_PROJECT_ID": "ride-b1bd8", - "GCM_SENDER_ID": "594687661098" -} \ No newline at end of file diff --git a/apps/rider-archive-cubit/pubspec.lock b/apps/rider-archive-cubit/pubspec.lock deleted file mode 100644 index 638b344..0000000 --- a/apps/rider-archive-cubit/pubspec.lock +++ /dev/null @@ -1,1055 +0,0 @@ -# Generated by pub -# See https://dart.dev/tools/pub/glossary#lockfile -packages: - _flutterfire_internals: - dependency: transitive - description: - name: _flutterfire_internals - sha256: "460e9e684edb461d85498fc166ff8416f303f22216838d302d80676b348c6a4c" - url: "https://pub.dev" - source: hosted - version: "1.3.75" - ansicolor: - dependency: transitive - description: - name: ansicolor - sha256: "50e982d500bc863e1d703448afdbf9e5a72eb48840a4f766fa361ffd6877055f" - url: "https://pub.dev" - source: hosted - version: "2.0.3" - archive: - dependency: transitive - description: - name: archive - sha256: a96e8b390886ee8abb49b7bd3ac8df6f451c621619f52a26e815fdcf568959ff - url: "https://pub.dev" - source: hosted - version: "4.0.9" - args: - dependency: transitive - description: - name: args - sha256: d0481093c50b1da8910eb0bb301626d4d8eb7284aa739614d2b394ee09e3ea04 - url: "https://pub.dev" - source: hosted - version: "2.7.0" - async: - dependency: transitive - description: - name: async - sha256: e2eb0491ba5ddb6177742d2da23904574082139b07c1e33b8503b9f46f3e1a37 - url: "https://pub.dev" - source: hosted - version: "2.13.1" - bloc: - dependency: transitive - description: - name: bloc - sha256: e03b235924e4f509c27b5d6b2f949200e0a91149a9818b4f65eeb56662b75413 - url: "https://pub.dev" - source: hosted - version: "9.2.1" - boolean_selector: - dependency: transitive - description: - name: boolean_selector - sha256: "8aab1771e1243a5063b8b0ff68042d67334e3feab9e95b9490f9a6ebf73b42ea" - url: "https://pub.dev" - source: hosted - version: "2.1.2" - characters: - dependency: transitive - description: - name: characters - sha256: faf38497bda5ead2a8c7615f4f7939df04333478bf32e4173fcb06d428b5716b - url: "https://pub.dev" - source: hosted - version: "1.4.1" - checked_yaml: - dependency: transitive - description: - name: checked_yaml - sha256: "959525d3162f249993882720d52b7e0c833978df229be20702b33d48d91de70f" - url: "https://pub.dev" - source: hosted - version: "2.0.4" - cli_util: - dependency: transitive - description: - name: cli_util - sha256: ff6785f7e9e3c38ac98b2fb035701789de90154024a75b6cb926445e83197d1c - url: "https://pub.dev" - source: hosted - version: "0.4.2" - clock: - dependency: transitive - description: - name: clock - sha256: fddb70d9b5277016c77a80201021d40a2247104d9f4aa7bab7157b7e3f05b84b - url: "https://pub.dev" - source: hosted - version: "1.1.2" - code_assets: - dependency: transitive - description: - name: code_assets - sha256: bf394f466ba9205f1812a0433b392d6af280f155f56651eda7c18cc32ed493b8 - url: "https://pub.dev" - source: hosted - version: "1.2.1" - collection: - dependency: transitive - description: - name: collection - sha256: "2f5709ae4d3d59dd8f7cd309b4e023046b57d8a6c82130785d2b0e5868084e76" - url: "https://pub.dev" - source: hosted - version: "1.19.1" - crypto: - dependency: transitive - description: - name: crypto - sha256: c8ea0233063ba03258fbcf2ca4d6dadfefe14f02fab57702265467a19f27fadf - url: "https://pub.dev" - source: hosted - version: "3.0.7" - csslib: - dependency: transitive - description: - name: csslib - sha256: "09bad715f418841f976c77db72d5398dc1253c21fb9c0c7f0b0b985860b2d58e" - url: "https://pub.dev" - source: hosted - version: "1.0.2" - cupertino_icons: - dependency: "direct main" - description: - name: cupertino_icons - sha256: "41e005c33bd814be4d3096aff55b1908d419fde52ca656c8c47719ec745873cd" - url: "https://pub.dev" - source: hosted - version: "1.0.9" - dbus: - dependency: transitive - description: - name: dbus - sha256: "0ce9b0a839e6dee59a37a623d2fc26a35bbbe6404213e419b0d6411023d62645" - url: "https://pub.dev" - source: hosted - version: "0.7.14" - device_info_plus: - dependency: "direct main" - description: - name: device_info_plus - sha256: "98f28b42168cc509abc92f88518882fd58061ea372d7999aecc424345c7bff6a" - url: "https://pub.dev" - source: hosted - version: "11.5.0" - device_info_plus_platform_interface: - dependency: transitive - description: - name: device_info_plus_platform_interface - sha256: e1ea89119e34903dca74b883d0dd78eb762814f97fb6c76f35e9ff74d261a18f - url: "https://pub.dev" - source: hosted - version: "7.0.3" - dio: - dependency: "direct main" - description: - name: dio - sha256: ea2bad3c89a27635ce2d85cce4d6b199da49a5a48ec77b03e45b65a3b90922b0 - url: "https://pub.dev" - source: hosted - version: "5.10.0" - dio_web_adapter: - dependency: transitive - description: - name: dio_web_adapter - sha256: dd58dc3861eb36edb13b217efc006a1c21e5bbc341de8c229b85634fa5e362e4 - url: "https://pub.dev" - source: hosted - version: "2.2.0" - equatable: - dependency: "direct main" - description: - name: equatable - sha256: "3bce007a596ff8b3119c45d68aaef631272537c03d30e5d4534dd24bf4c5eaa2" - url: "https://pub.dev" - source: hosted - version: "2.1.0" - fake_async: - dependency: transitive - description: - name: fake_async - sha256: "5368f224a74523e8d2e7399ea1638b37aecfca824a3cc4dfdf77bf1fa905ac44" - url: "https://pub.dev" - source: hosted - version: "1.3.3" - ffi: - dependency: transitive - description: - name: ffi - sha256: "6d7fd89431262d8f3125e81b50d3847a091d846eafcd4fdb88dd06f36d705a45" - url: "https://pub.dev" - source: hosted - version: "2.2.0" - file: - dependency: transitive - description: - name: file - sha256: a3b4f84adafef897088c160faf7dfffb7696046cb13ae90b508c2cbc95d3b8d4 - url: "https://pub.dev" - source: hosted - version: "7.0.1" - firebase_core: - dependency: "direct main" - description: - name: firebase_core - sha256: "6f22d1c62e0c20976f02cd842c7b7cd3c0f561cc2052586411871045c08860c9" - url: "https://pub.dev" - source: hosted - version: "4.12.1" - firebase_core_platform_interface: - dependency: transitive - description: - name: firebase_core_platform_interface - sha256: f74d1d6fabccf7743b0144c2ed363d81049e258e22428ebb6fb0faec2fa7d938 - url: "https://pub.dev" - source: hosted - version: "8.0.0" - firebase_core_web: - dependency: transitive - description: - name: firebase_core_web - sha256: ddab99d709b8c27dd47576eb05a1e719e07a2aa45c009a49ae92ac4d2a8ca555 - url: "https://pub.dev" - source: hosted - version: "3.9.1" - firebase_messaging: - dependency: "direct main" - description: - name: firebase_messaging - sha256: "30ad2d59bcd86117dc49d278c8998a0fb390c5a3202f6e43e4bd215d3f1d0556" - url: "https://pub.dev" - source: hosted - version: "16.4.3" - firebase_messaging_platform_interface: - dependency: transitive - description: - name: firebase_messaging_platform_interface - sha256: "4d144cb42b9a5a42855596be2d7682d32c50169f42e7df2cb3278ecf935e7d63" - url: "https://pub.dev" - source: hosted - version: "4.9.2" - firebase_messaging_web: - dependency: transitive - description: - name: firebase_messaging_web - sha256: fcd25d0b9da55766ef4d28ae05a7460f5189635d6b42607adcd9f08818fd35f0 - url: "https://pub.dev" - source: hosted - version: "4.2.3" - fixnum: - dependency: transitive - description: - name: fixnum - sha256: b6dc7065e46c974bc7c5f143080a6764ec7a4be6da1285ececdc37be96de53be - url: "https://pub.dev" - source: hosted - version: "1.1.1" - flutter: - dependency: "direct main" - description: flutter - source: sdk - version: "0.0.0" - flutter_bloc: - dependency: "direct main" - description: - name: flutter_bloc - sha256: cf51747952201a455a1c840f8171d273be009b932c75093020f9af64f2123e38 - url: "https://pub.dev" - source: hosted - version: "9.1.1" - flutter_launcher_icons: - dependency: "direct dev" - description: - name: flutter_launcher_icons - sha256: "526faf84284b86a4cb36d20a5e45147747b7563d921373d4ee0559c54fcdbcea" - url: "https://pub.dev" - source: hosted - version: "0.13.1" - flutter_lints: - dependency: "direct dev" - description: - name: flutter_lints - sha256: "3105dc8492f6183fb076ccf1f351ac3d60564bff92e20bfc4af9cc1651f4e7e1" - url: "https://pub.dev" - source: hosted - version: "6.0.0" - flutter_localizations: - dependency: "direct main" - description: flutter - source: sdk - version: "0.0.0" - flutter_native_splash: - dependency: "direct dev" - description: - name: flutter_native_splash - sha256: "4fb9f4113350d3a80841ce05ebf1976a36de622af7d19aca0ca9a9911c7ff002" - url: "https://pub.dev" - source: hosted - version: "2.4.7" - flutter_secure_storage: - dependency: "direct main" - description: - name: flutter_secure_storage - sha256: "9cad52d75ebc511adfae3d447d5d13da15a55a92c9410e50f67335b6d21d16ea" - url: "https://pub.dev" - source: hosted - version: "9.2.4" - flutter_secure_storage_linux: - dependency: transitive - description: - name: flutter_secure_storage_linux - sha256: be76c1d24a97d0b98f8b54bce6b481a380a6590df992d0098f868ad54dc8f688 - url: "https://pub.dev" - source: hosted - version: "1.2.3" - flutter_secure_storage_macos: - dependency: transitive - description: - name: flutter_secure_storage_macos - sha256: "6c0a2795a2d1de26ae202a0d78527d163f4acbb11cde4c75c670f3a0fc064247" - url: "https://pub.dev" - source: hosted - version: "3.1.3" - flutter_secure_storage_platform_interface: - dependency: transitive - description: - name: flutter_secure_storage_platform_interface - sha256: cf91ad32ce5adef6fba4d736a542baca9daf3beac4db2d04be350b87f69ac4a8 - url: "https://pub.dev" - source: hosted - version: "1.1.2" - flutter_secure_storage_web: - dependency: transitive - description: - name: flutter_secure_storage_web - sha256: f4ebff989b4f07b2656fb16b47852c0aab9fed9b4ec1c70103368337bc1886a9 - url: "https://pub.dev" - source: hosted - version: "1.2.1" - flutter_secure_storage_windows: - dependency: transitive - description: - name: flutter_secure_storage_windows - sha256: b20b07cb5ed4ed74fc567b78a72936203f587eba460af1df11281c9326cd3709 - url: "https://pub.dev" - source: hosted - version: "3.1.2" - flutter_test: - dependency: "direct dev" - description: flutter - source: sdk - version: "0.0.0" - flutter_web_plugins: - dependency: transitive - description: flutter - source: sdk - version: "0.0.0" - geoclue: - dependency: transitive - description: - name: geoclue - sha256: c2a998c77474fc57aa00c6baa2928e58f4b267649057a1c76738656e9dbd2a7f - url: "https://pub.dev" - source: hosted - version: "0.1.1" - geolocator: - dependency: "direct main" - description: - name: geolocator - sha256: "79939537046c9025be47ec645f35c8090ecadb6fe98eba146a0d25e8c1357516" - url: "https://pub.dev" - source: hosted - version: "14.0.2" - geolocator_android: - dependency: transitive - description: - name: geolocator_android - sha256: "86ea1654e4f61ff51466848e91c116b422d6010ea269fda0fbe1af7e9e742ce1" - url: "https://pub.dev" - source: hosted - version: "5.0.3" - geolocator_apple: - dependency: transitive - description: - name: geolocator_apple - sha256: "853803d6bb1713c094e935b4a5ae5f19c0308acf81da13fa9ff84fb4c70c0b73" - url: "https://pub.dev" - source: hosted - version: "2.3.14" - geolocator_linux: - dependency: transitive - description: - name: geolocator_linux - sha256: d64112a205931926f4363bb6bd48f14cb38e7326833041d170615586cd143797 - url: "https://pub.dev" - source: hosted - version: "0.2.4" - geolocator_platform_interface: - dependency: transitive - description: - name: geolocator_platform_interface - sha256: cdb082e4f048b69da244117b7914cc60d2a8897546ffaa4f2529c786ded7aee2 - url: "https://pub.dev" - source: hosted - version: "4.2.8" - geolocator_web: - dependency: transitive - description: - name: geolocator_web - sha256: "19e485a0f8d6a88abcf9c53cba3a4105e14b7435ed8ac1c108c067b938fe8429" - url: "https://pub.dev" - source: hosted - version: "4.1.4" - geolocator_windows: - dependency: transitive - description: - name: geolocator_windows - sha256: "175435404d20278ffd220de83c2ca293b73db95eafbdc8131fe8609be1421eb6" - url: "https://pub.dev" - source: hosted - version: "0.2.5" - get_it: - dependency: "direct main" - description: - name: get_it - sha256: ae78de7c3f2304b8d81f2bb6e320833e5e81de942188542328f074978cc0efa9 - url: "https://pub.dev" - source: hosted - version: "8.3.0" - go_router: - dependency: "direct main" - description: - name: go_router - sha256: f02fd7d2a4dc512fec615529824fdd217fecb3a3d3de68360293a551f21634b3 - url: "https://pub.dev" - source: hosted - version: "14.8.1" - gsettings: - dependency: transitive - description: - name: gsettings - sha256: "1b0ce661f5436d2db1e51f3c4295a49849f03d304003a7ba177d01e3a858249c" - url: "https://pub.dev" - source: hosted - version: "0.2.8" - hooks: - dependency: transitive - description: - name: hooks - sha256: "9a62a50b50b769a737bc0a8ff381f333529df3ab746b2f6b02e83760231455ba" - url: "https://pub.dev" - source: hosted - version: "2.0.2" - html: - dependency: transitive - description: - name: html - sha256: "6d1264f2dffa1b1101c25a91dff0dc2daee4c18e87cd8538729773c073dbf602" - url: "https://pub.dev" - source: hosted - version: "0.15.6" - http: - dependency: transitive - description: - name: http - sha256: "87721a4a50b19c7f1d49001e51409bddc46303966ce89a65af4f4e6004896412" - url: "https://pub.dev" - source: hosted - version: "1.6.0" - http_parser: - dependency: transitive - description: - name: http_parser - sha256: "178d74305e7866013777bab2c3d8726205dc5a4dd935297175b19a23a2e66571" - url: "https://pub.dev" - source: hosted - version: "4.1.2" - image: - dependency: transitive - description: - name: image - sha256: f9881ff4998044947ec38d098bc7c8316ae1186fa786eddffdb867b9bc94dfce - url: "https://pub.dev" - source: hosted - version: "4.8.0" - intaleq_maps: - dependency: "direct main" - description: - name: intaleq_maps - sha256: "4307196a9a9a4d4dfd29fd984ecd1f7460051523c74f9b201f0ba641dbda78a2" - url: "https://pub.dev" - source: hosted - version: "2.2.1" - intl: - dependency: "direct main" - description: - name: intl - sha256: "3df61194eb431efc39c4ceba583b95633a403f46c9fd341e550ce0bfa50e9aa5" - url: "https://pub.dev" - source: hosted - version: "0.20.2" - jni: - dependency: transitive - description: - name: jni - sha256: c2230682d5bc2362c1c9e8d3c7f406d9cbba23ab3f2e203a025dd47e0fb2e68f - url: "https://pub.dev" - source: hosted - version: "1.0.0" - jni_flutter: - dependency: transitive - description: - name: jni_flutter - sha256: "8b59e590786050b1cd866677dddaf76b1ade5e7bc751abe04b86e84d379d3ba6" - url: "https://pub.dev" - source: hosted - version: "1.0.1" - js: - dependency: transitive - description: - name: js - sha256: f2c445dce49627136094980615a031419f7f3eb393237e4ecd97ac15dea343f3 - url: "https://pub.dev" - source: hosted - version: "0.6.7" - json_annotation: - dependency: transitive - description: - name: json_annotation - sha256: "2a743920d81b7910627f68ee2c9ac1fc0bfee32b9fc3403587d7c6791ca12f80" - url: "https://pub.dev" - source: hosted - version: "4.12.0" - leak_tracker: - dependency: transitive - description: - name: leak_tracker - sha256: "33e2e26bdd85a0112ec15400c8cbffea70d0f9c3407491f672a2fad47915e2de" - url: "https://pub.dev" - source: hosted - version: "11.0.2" - leak_tracker_flutter_testing: - dependency: transitive - description: - name: leak_tracker_flutter_testing - sha256: "1dbc140bb5a23c75ea9c4811222756104fbcd1a27173f0c34ca01e16bea473c1" - url: "https://pub.dev" - source: hosted - version: "3.0.10" - leak_tracker_testing: - dependency: transitive - description: - name: leak_tracker_testing - sha256: "8d5a2d49f4a66b49744b23b018848400d23e54caf9463f4eb20df3eb8acb2eb1" - url: "https://pub.dev" - source: hosted - version: "3.0.2" - lints: - dependency: transitive - description: - name: lints - sha256: "12f842a479589fea194fe5c5a3095abc7be0c1f2ddfa9a0e76aed1dbd26a87df" - url: "https://pub.dev" - source: hosted - version: "6.1.0" - logging: - dependency: transitive - description: - name: logging - sha256: c8245ada5f1717ed44271ed1c26b8ce85ca3228fd2ffdb75468ab01979309d61 - url: "https://pub.dev" - source: hosted - version: "1.3.0" - maplibre_gl: - dependency: transitive - description: - name: maplibre_gl - sha256: d9773555ae4ebab94bbc3ae2176b077cfda486ec729eefe01e1613f164cb8410 - url: "https://pub.dev" - source: hosted - version: "0.25.0" - maplibre_gl_platform_interface: - dependency: transitive - description: - name: maplibre_gl_platform_interface - sha256: bd7de401dea24dd7e8a6f2fa736ddee7dbbee3e24a9027f0afdd619994702047 - url: "https://pub.dev" - source: hosted - version: "0.25.0" - maplibre_gl_web: - dependency: transitive - description: - name: maplibre_gl_web - sha256: af0e48bf96e8dd99f8b958a1953126971eb8a0527b9735441d4f24df3913f5a2 - url: "https://pub.dev" - source: hosted - version: "0.25.0" - matcher: - dependency: transitive - description: - name: matcher - sha256: dc0b7dc7651697ea4ff3e69ef44b0407ea32c487a39fff6a4004fa585e901861 - url: "https://pub.dev" - source: hosted - version: "0.12.19" - material_color_utilities: - dependency: transitive - description: - name: material_color_utilities - sha256: "9c337007e82b1889149c82ed242ed1cb24a66044e30979c44912381e9be4c48b" - url: "https://pub.dev" - source: hosted - version: "0.13.0" - meta: - dependency: transitive - description: - name: meta - sha256: "1741988757a65eb6b36abe716829688cf01910bbf91c34354ff7ec1c3de2b349" - url: "https://pub.dev" - source: hosted - version: "1.18.0" - mime: - dependency: transitive - description: - name: mime - sha256: "41a20518f0cb1256669420fdba0cd90d21561e560ac240f26ef8322e45bb7ed6" - url: "https://pub.dev" - source: hosted - version: "2.0.0" - nested: - dependency: transitive - description: - name: nested - sha256: "03bac4c528c64c95c722ec99280375a6f2fc708eec17c7b3f07253b626cd2a20" - url: "https://pub.dev" - source: hosted - version: "1.0.0" - objective_c: - dependency: transitive - description: - name: objective_c - sha256: "6cb691c686fa2838c6deb34980d426145c2a5d537491cb83d463c33cdbc726ed" - url: "https://pub.dev" - source: hosted - version: "9.4.1" - package_config: - dependency: transitive - description: - name: package_config - sha256: f096c55ebb7deb7e384101542bfba8c52696c1b56fca2eb62827989ef2353bbc - url: "https://pub.dev" - source: hosted - version: "2.2.0" - package_info_plus: - dependency: transitive - description: - name: package_info_plus - sha256: "468c26b4254ab01979fa5e4a98cb343ea3631b9acee6f21028997419a80e1a20" - url: "https://pub.dev" - source: hosted - version: "9.0.1" - package_info_plus_platform_interface: - dependency: transitive - description: - name: package_info_plus_platform_interface - sha256: "202a487f08836a592a6bd4f901ac69b3a8f146af552bbd14407b6b41e1c3f086" - url: "https://pub.dev" - source: hosted - version: "3.2.1" - path: - dependency: transitive - description: - name: path - sha256: "75cca69d1490965be98c73ceaea117e8a04dd21217b37b292c9ddbec0d955bc5" - url: "https://pub.dev" - source: hosted - version: "1.9.1" - path_provider: - dependency: transitive - description: - name: path_provider - sha256: a7f4874f987173da295a61c181b8ee71dab59b332a486b391babf26a1b884825 - url: "https://pub.dev" - source: hosted - version: "2.1.6" - path_provider_android: - dependency: transitive - description: - name: path_provider_android - sha256: "69cbd515a62b94d32a7944f086b2f82b4ac40a1d45bebfc00813a430ab2dabcd" - url: "https://pub.dev" - source: hosted - version: "2.3.1" - path_provider_foundation: - dependency: transitive - description: - name: path_provider_foundation - sha256: "2a376b7d6392d80cd3705782d2caa734ca4727776db0b6ec36ef3f1855197699" - url: "https://pub.dev" - source: hosted - version: "2.6.0" - path_provider_linux: - dependency: transitive - description: - name: path_provider_linux - sha256: "58c2005f147315b11e9b4a7bc889cd5203e250cba8e3f012dae259b4972b5c16" - url: "https://pub.dev" - source: hosted - version: "2.2.2" - path_provider_platform_interface: - dependency: transitive - description: - name: path_provider_platform_interface - sha256: "484838772624c3a4b94f1e44a3e19897fee738f2d5c4ce448443b0417f7c9dda" - url: "https://pub.dev" - source: hosted - version: "2.1.3" - path_provider_windows: - dependency: transitive - description: - name: path_provider_windows - sha256: bd6f00dbd873bfb70d0761682da2b3a2c2fccc2b9e84c495821639601d81afe7 - url: "https://pub.dev" - source: hosted - version: "2.3.0" - permission_handler: - dependency: "direct main" - description: - name: permission_handler - sha256: "59adad729136f01ea9e35a48f5d1395e25cba6cea552249ddbe9cf950f5d7849" - url: "https://pub.dev" - source: hosted - version: "11.4.0" - permission_handler_android: - dependency: transitive - description: - name: permission_handler_android - sha256: d3971dcdd76182a0c198c096b5db2f0884b0d4196723d21a866fc4cdea057ebc - url: "https://pub.dev" - source: hosted - version: "12.1.0" - permission_handler_apple: - dependency: transitive - description: - name: permission_handler_apple - sha256: "79dfa1df734798aa3cfdad166d3a3698c206d8813de13516ea1071b5d7e2f420" - url: "https://pub.dev" - source: hosted - version: "9.4.10" - permission_handler_html: - dependency: transitive - description: - name: permission_handler_html - sha256: "38f000e83355abb3392140f6bc3030660cfaef189e1f87824facb76300b4ff24" - url: "https://pub.dev" - source: hosted - version: "0.1.3+5" - permission_handler_platform_interface: - dependency: transitive - description: - name: permission_handler_platform_interface - sha256: eb99b295153abce5d683cac8c02e22faab63e50679b937fa1bf67d58bb282878 - url: "https://pub.dev" - source: hosted - version: "4.3.0" - permission_handler_windows: - dependency: transitive - description: - name: permission_handler_windows - sha256: "1a790728016f79a41216d88672dbc5df30e686e811ad4e698bfc51f76ad91f1e" - url: "https://pub.dev" - source: hosted - version: "0.2.1" - petitparser: - dependency: transitive - description: - name: petitparser - sha256: "91bd59303e9f769f108f8df05e371341b15d59e995e6806aefab827b58336675" - url: "https://pub.dev" - source: hosted - version: "7.0.2" - platform: - dependency: transitive - description: - name: platform - sha256: "5d6b1b0036a5f331ebc77c850ebc8506cbc1e9416c27e59b439f917a902a4984" - url: "https://pub.dev" - source: hosted - version: "3.1.6" - plugin_platform_interface: - dependency: transitive - description: - name: plugin_platform_interface - sha256: "4820fbfdb9478b1ebae27888254d445073732dae3d6ea81f0b7e06d5dedc3f02" - url: "https://pub.dev" - source: hosted - version: "2.1.8" - posix: - dependency: transitive - description: - name: posix - sha256: "185ef7606574f789b40f289c233efa52e96dead518aed988e040a10737febb07" - url: "https://pub.dev" - source: hosted - version: "6.5.0" - provider: - dependency: transitive - description: - name: provider - sha256: "4e82183fa20e5ca25703ead7e05de9e4cceed1fbd1eadc1ac3cb6f565a09f272" - url: "https://pub.dev" - source: hosted - version: "6.1.5+1" - pub_semver: - dependency: transitive - description: - name: pub_semver - sha256: "5bfcf68ca79ef689f8990d1160781b4bad40a3bd5e5218ad4076ddb7f4081585" - url: "https://pub.dev" - source: hosted - version: "2.2.0" - record_use: - dependency: transitive - description: - name: record_use - sha256: "2551bd8eecfe95d14ae75f6021ad0248be5c27f138c2ec12fcb52b500b3ba1ed" - url: "https://pub.dev" - source: hosted - version: "0.6.0" - shared_preferences: - dependency: "direct main" - description: - name: shared_preferences - sha256: c3025c5534b01739267eb7d76959bbc25a6d10f6988e1c2a3036940133dd10bf - url: "https://pub.dev" - source: hosted - version: "2.5.5" - shared_preferences_android: - dependency: transitive - description: - name: shared_preferences_android - sha256: e8d4762b1e2e8578fc4d0fd548cebf24afd24f49719c08974df92834565e2c53 - url: "https://pub.dev" - source: hosted - version: "2.4.23" - shared_preferences_foundation: - dependency: transitive - description: - name: shared_preferences_foundation - sha256: "4e7eaffc2b17ba398759f1151415869a34771ba11ebbccd1b0145472a619a64f" - url: "https://pub.dev" - source: hosted - version: "2.5.6" - shared_preferences_linux: - dependency: transitive - description: - name: shared_preferences_linux - sha256: "580abfd40f415611503cae30adf626e6656dfb2f0cee8f465ece7b6defb40f2f" - url: "https://pub.dev" - source: hosted - version: "2.4.1" - shared_preferences_platform_interface: - dependency: transitive - description: - name: shared_preferences_platform_interface - sha256: "649dc798a33931919ea356c4305c2d1f81619ea6e92244070b520187b5140ef9" - url: "https://pub.dev" - source: hosted - version: "2.4.2" - shared_preferences_web: - dependency: transitive - description: - name: shared_preferences_web - sha256: c49bd060261c9a3f0ff445892695d6212ff603ef3115edbb448509d407600019 - url: "https://pub.dev" - source: hosted - version: "2.4.3" - shared_preferences_windows: - dependency: transitive - description: - name: shared_preferences_windows - sha256: "94ef0f72b2d71bc3e700e025db3710911bd51a71cefb65cc609dd0d9a982e3c1" - url: "https://pub.dev" - source: hosted - version: "2.4.1" - sky_engine: - dependency: transitive - description: flutter - source: sdk - version: "0.0.0" - socket_io_client: - dependency: "direct main" - description: - name: socket_io_client - sha256: f5990ff303d385e7b2150f0e57cca097a8d20c6a2ae0a22cb2d496661ea8ed9b - url: "https://pub.dev" - source: hosted - version: "3.1.6" - socket_io_common: - dependency: transitive - description: - name: socket_io_common - sha256: "162fbaecbf4bf9a9372a62a341b3550b51dcef2f02f3e5830a297fd48203d45b" - url: "https://pub.dev" - source: hosted - version: "3.1.1" - source_span: - dependency: transitive - description: - name: source_span - sha256: "56a02f1f4cd1a2d96303c0144c93bd6d909eea6bee6bf5a0e0b685edbd4c47ab" - url: "https://pub.dev" - source: hosted - version: "1.10.2" - stack_trace: - dependency: transitive - description: - name: stack_trace - sha256: "8b27215b45d22309b5cddda1aa2b19bdfec9df0e765f2de506401c071d38d1b1" - url: "https://pub.dev" - source: hosted - version: "1.12.1" - stream_channel: - dependency: transitive - description: - name: stream_channel - sha256: "969e04c80b8bcdf826f8f16579c7b14d780458bd97f56d107d3950fdbeef059d" - url: "https://pub.dev" - source: hosted - version: "2.1.4" - string_scanner: - dependency: transitive - description: - name: string_scanner - sha256: "921cd31725b72fe181906c6a94d987c78e3b98c2e205b397ea399d4054872b43" - url: "https://pub.dev" - source: hosted - version: "1.4.1" - term_glyph: - dependency: transitive - description: - name: term_glyph - sha256: "7f554798625ea768a7518313e58f83891c7f5024f88e46e7182a4558850a4b8e" - url: "https://pub.dev" - source: hosted - version: "1.2.2" - test_api: - dependency: transitive - description: - name: test_api - sha256: "949a932224383300f01be9221c39180316445ecb8e7547f70a41a35bf421fb9e" - url: "https://pub.dev" - source: hosted - version: "0.7.11" - typed_data: - dependency: transitive - description: - name: typed_data - sha256: f9049c039ebfeb4cf7a7104a675823cd72dba8297f264b6637062516699fa006 - url: "https://pub.dev" - source: hosted - version: "1.4.0" - universal_io: - dependency: transitive - description: - name: universal_io - sha256: f63cbc48103236abf48e345e07a03ce5757ea86285ed313a6a032596ed9301e2 - url: "https://pub.dev" - source: hosted - version: "2.3.1" - uuid: - dependency: "direct main" - description: - name: uuid - sha256: "9b129329f58692f6e6578329498a8fe9fbe98f090beb764ffbb8ee2eadd01dcd" - url: "https://pub.dev" - source: hosted - version: "4.6.0" - vector_math: - dependency: transitive - description: - name: vector_math - sha256: d530bd74fea330e6e364cda7a85019c434070188383e1cd8d9777ee586914c5b - url: "https://pub.dev" - source: hosted - version: "2.2.0" - vm_service: - dependency: transitive - description: - name: vm_service - sha256: "0016aef94fc66495ac78af5859181e3f3bf2026bd8eecc72b9565601e19ab360" - url: "https://pub.dev" - source: hosted - version: "15.2.0" - web: - dependency: transitive - description: - name: web - sha256: "868d88a33d8a87b18ffc05f9f030ba328ffefba92d6c127917a2ba740f9cfe4a" - url: "https://pub.dev" - source: hosted - version: "1.1.1" - web_socket: - dependency: transitive - description: - name: web_socket - sha256: "34d64019aa8e36bf9842ac014bb5d2f5586ca73df5e4d9bf5c936975cae6982c" - url: "https://pub.dev" - source: hosted - version: "1.0.1" - win32: - dependency: transitive - description: - name: win32 - sha256: d7cb55e04cd34096cd3a79b3330245f54cb96a370a1c27adb3c84b917de8b08e - url: "https://pub.dev" - source: hosted - version: "5.15.0" - win32_registry: - dependency: transitive - description: - name: win32_registry - sha256: "6f1b564492d0147b330dd794fee8f512cec4977957f310f9951b5f9d83618dae" - url: "https://pub.dev" - source: hosted - version: "2.1.0" - xdg_directories: - dependency: transitive - description: - name: xdg_directories - sha256: "7a3f37b05d989967cdddcbb571f1ea834867ae2faa29725fd085180e0883aa15" - url: "https://pub.dev" - source: hosted - version: "1.1.0" - xml: - dependency: transitive - description: - name: xml - sha256: "971043b3a0d3da28727e40ed3e0b5d18b742fa5a68665cca88e74b7876d5e025" - url: "https://pub.dev" - source: hosted - version: "6.6.1" - yaml: - dependency: transitive - description: - name: yaml - sha256: b9da305ac7c39faa3f030eccd175340f968459dae4af175130b3fc47e40d76ce - url: "https://pub.dev" - source: hosted - version: "3.1.3" -sdks: - dart: ">=3.10.3 <4.0.0" - flutter: ">=3.38.4" diff --git a/apps/rider-archive-cubit/pubspec.yaml b/apps/rider-archive-cubit/pubspec.yaml deleted file mode 100644 index 2b09a55..0000000 --- a/apps/rider-archive-cubit/pubspec.yaml +++ /dev/null @@ -1,97 +0,0 @@ -name: rider -description: Tripz rider app — rebuilt on Bloc/Cubit + Tripz backend. -publish_to: "none" - -version: 1.0.0+1 - -environment: - sdk: ">=3.5.0 <4.0.0" - -dependencies: - flutter: - sdk: flutter - flutter_localizations: - sdk: flutter - cupertino_icons: ^1.0.8 - - # الحالة والتوجيه والحقن (بديل GetX) — الإصدارات موحّدة مع تطبيق السائق - # عمداً (docs/23 §9): تباعدهما يعني سلوكاً مختلفاً في كود مشترك حرفياً. - flutter_bloc: ^9.1.1 - equatable: ^2.0.7 - get_it: ^8.0.3 - go_router: ^14.6.2 - - # الشبكة والتخزين - dio: ^5.7.0 - flutter_secure_storage: ^9.2.2 - device_info_plus: ^11.2.0 # بصمة الجهاز (x-device-id — docs/17 D2) - shared_preferences: ^2.3.4 # إعدادات الثيم واللغة (docs/26 §4) - uuid: ^4.5.1 # clientId UUID v4 لحماية الإرسال المزدوج - - # الخرائط: SDK انطلق حصراً (docs/23 §6) — يُصدِّر LatLng/Marker/Polyline - # بنفسه. لا flutter_map ولا latlong2 (نوعا LatLng متضاربان). - intaleq_maps: ^2.2.1 - - # الموقع: جلب موقع المستخدم الحالي (Phase 1 — الخرائط وحساب المسار) - geolocator: ^14.0.0 - permission_handler: ^11.3.1 - - # WebSocket: التتبع اللحظي + عروض السائقين — موحّد مع تطبيق السائق (docs/23 §9) - socket_io_client: ^3.0.2 - - # Firebase (مُعاد استخدامه من الإعداد القديم — FCM لاحقاً) - firebase_core: ^4.1.1 - firebase_messaging: ^16.0.2 - - intl: ^0.20.2 - -dev_dependencies: - flutter_test: - sdk: flutter - flutter_lints: ^6.0.0 - flutter_native_splash: ^2.4.1 - flutter_launcher_icons: ^0.13.1 - -flutter_launcher_icons: - android: "launcher_icon" - ios: true - remove_alpha_ios: true - image_path: "assets/images/splash_logo.png" - min_sdk_android: 21 - -flutter: - generate: true - uses-material-design: true - assets: - - assets/ - - assets/images/ - - assets/fonts/ - - shorebird.yaml - fonts: - - family: Inter - fonts: - - asset: assets/fonts/Inter-Regular.ttf - weight: 400 - - asset: assets/fonts/Inter-Medium.ttf - weight: 500 - - asset: assets/fonts/Inter-SemiBold.ttf - weight: 600 - - asset: assets/fonts/Inter-Bold.ttf - weight: 700 - - family: IBMPlexSansArabic - fonts: - - asset: assets/fonts/IBMPlexSansArabic-Regular.ttf - weight: 400 - - asset: assets/fonts/IBMPlexSansArabic-Medium.ttf - weight: 500 - - asset: assets/fonts/IBMPlexSansArabic-SemiBold.ttf - weight: 600 - - asset: assets/fonts/IBMPlexSansArabic-Bold.ttf - weight: 700 - -flutter_native_splash: - color: "#FFFFFF" - image: "assets/images/splash_logo.png" - android_12: - image: "assets/images/splash_logo.png" - icon_background_color: "#FFFFFF" diff --git a/apps/rider-archive-cubit/secure_string_operations/lib/secure_string_operations.dart b/apps/rider-archive-cubit/secure_string_operations/lib/secure_string_operations.dart deleted file mode 100644 index d428ac3..0000000 --- a/apps/rider-archive-cubit/secure_string_operations/lib/secure_string_operations.dart +++ /dev/null @@ -1,47 +0,0 @@ -// File: lib/secure_string_operations.dart - -library secure_string_operations; - -class X { - static String c(String a, Map b) { - StringBuffer c = StringBuffer(); - c.write(a); - - String d = "Bl"; - c.write(b[d] ?? d); - - StringBuffer e = StringBuffer(); - String f = c.toString(); - - for (int g = 0; g < f.length; g++) { - String h = f[g]; - e.write(b[h] ?? h); - } - - return e.toString(); - } - - static String r(String a, Map b) { - StringBuffer c = StringBuffer(); - String d = "Bl"; - int e = d.length; - - for (int f = 0; f < a.length; f++) { - String g = a[f]; - String h = b.keys.firstWhere( - (i) => b[i] == g, - orElse: () => g, - ); - - c.write(h); - } - - String j = c.toString(); - - if (j.endsWith(d)) { - j = j.substring(0, j.length - e); - } - - return j; - } -} diff --git a/apps/rider-archive-cubit/secure_string_operations/pubspec.lock b/apps/rider-archive-cubit/secure_string_operations/pubspec.lock deleted file mode 100644 index 2643154..0000000 --- a/apps/rider-archive-cubit/secure_string_operations/pubspec.lock +++ /dev/null @@ -1,5 +0,0 @@ -# Generated by pub -# See https://dart.dev/tools/pub/glossary#lockfile -packages: {} -sdks: - dart: ">=3.5.0 <4.0.0" diff --git a/apps/rider-archive-cubit/secure_string_operations/pubspec.yaml b/apps/rider-archive-cubit/secure_string_operations/pubspec.yaml deleted file mode 100644 index 9709971..0000000 --- a/apps/rider-archive-cubit/secure_string_operations/pubspec.yaml +++ /dev/null @@ -1,6 +0,0 @@ -name: secure_string_operations -description: A package for secure string operations -version: 1.0.0 - -environment: - sdk: ">=3.5.0 <4.0.0" diff --git a/apps/rider-archive-cubit/shorebird.yaml b/apps/rider-archive-cubit/shorebird.yaml deleted file mode 100644 index 10c3a35..0000000 --- a/apps/rider-archive-cubit/shorebird.yaml +++ /dev/null @@ -1,14 +0,0 @@ -# This file is used to configure the Shorebird updater used by your app. -# Learn more at https://docs.shorebird.dev -# This file does not contain any sensitive information and should be checked into version control. - -# Your app_id is the unique identifier assigned to your app. -# It is used to identify your app when requesting patches from Shorebird's servers. -# It is not a secret and can be shared publicly. -app_id: 496cb3ac-c25c-455d-9d2e-5ebbea13ab03 - -# auto_update controls if Shorebird should automatically update in the background on launch. -# If auto_update: false, you will need to use package:shorebird_code_push to trigger updates. -# https://pub.dev/packages/shorebird_code_push -# Uncomment the following line to disable automatic updates. -# auto_update: false diff --git a/apps/rider-archive-cubit/test/widget_test.dart b/apps/rider-archive-cubit/test/widget_test.dart deleted file mode 100644 index 4ec8a00..0000000 --- a/apps/rider-archive-cubit/test/widget_test.dart +++ /dev/null @@ -1,11 +0,0 @@ -import 'package:flutter_test/flutter_test.dart'; - -void main() { - testWidgets('Placeholder rider test', (WidgetTester tester) async { - // Testing the actual TripzApp requires mocking dependencies in getIt - // and Firebase. - // await setupDi(); - // await tester.pumpWidget(const TripzApp()); - expect(true, isTrue); - }); -} diff --git a/apps/rider-archive-cubit/web/favicon.png b/apps/rider-archive-cubit/web/favicon.png deleted file mode 100644 index e7bbc83..0000000 Binary files a/apps/rider-archive-cubit/web/favicon.png and /dev/null differ diff --git a/apps/rider-archive-cubit/web/icons/192.png b/apps/rider-archive-cubit/web/icons/192.png deleted file mode 100644 index eb9b4d7..0000000 Binary files a/apps/rider-archive-cubit/web/icons/192.png and /dev/null differ diff --git a/apps/rider-archive-cubit/web/icons/521.png b/apps/rider-archive-cubit/web/icons/521.png deleted file mode 100644 index 88cfd48..0000000 Binary files a/apps/rider-archive-cubit/web/icons/521.png and /dev/null differ diff --git a/apps/rider-archive-cubit/web/icons/Icon-192.png b/apps/rider-archive-cubit/web/icons/Icon-192.png deleted file mode 100644 index 084f2e5..0000000 Binary files a/apps/rider-archive-cubit/web/icons/Icon-192.png and /dev/null differ diff --git a/apps/rider-archive-cubit/web/icons/Icon-512.png b/apps/rider-archive-cubit/web/icons/Icon-512.png deleted file mode 100644 index 08e31d1..0000000 Binary files a/apps/rider-archive-cubit/web/icons/Icon-512.png and /dev/null differ diff --git a/apps/rider-archive-cubit/web/icons/Icon-maskable-192.png b/apps/rider-archive-cubit/web/icons/Icon-maskable-192.png deleted file mode 100644 index 084f2e5..0000000 Binary files a/apps/rider-archive-cubit/web/icons/Icon-maskable-192.png and /dev/null differ diff --git a/apps/rider-archive-cubit/web/icons/Icon-maskable-512.png b/apps/rider-archive-cubit/web/icons/Icon-maskable-512.png deleted file mode 100644 index 08e31d1..0000000 Binary files a/apps/rider-archive-cubit/web/icons/Icon-maskable-512.png and /dev/null differ diff --git a/apps/rider-archive-cubit/web/icons/d.png b/apps/rider-archive-cubit/web/icons/d.png deleted file mode 100644 index d69c566..0000000 Binary files a/apps/rider-archive-cubit/web/icons/d.png and /dev/null differ diff --git a/apps/rider-archive-cubit/web/icons/qq.png b/apps/rider-archive-cubit/web/icons/qq.png deleted file mode 100644 index b749bfe..0000000 Binary files a/apps/rider-archive-cubit/web/icons/qq.png and /dev/null differ diff --git a/apps/rider-archive-cubit/web/index.html b/apps/rider-archive-cubit/web/index.html deleted file mode 100644 index 2bc81e8..0000000 --- a/apps/rider-archive-cubit/web/index.html +++ /dev/null @@ -1,138 +0,0 @@ - - - - - - - - - - - - - - - - - - ride - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/apps/rider-archive-cubit/web/manifest.json b/apps/rider-archive-cubit/web/manifest.json deleted file mode 100644 index 31db40a..0000000 --- a/apps/rider-archive-cubit/web/manifest.json +++ /dev/null @@ -1,35 +0,0 @@ -{ - "name": "ride", - "short_name": "ride", - "start_url": ".", - "display": "standalone", - "background_color": "#hexcode", - "theme_color": "#hexcode", - "description": "A new Flutter project.", - "orientation": "portrait-primary", - "prefer_related_applications": false, - "icons": [ - { - "src": "icons/Icon-192.png", - "sizes": "192x192", - "type": "image/png" - }, - { - "src": "icons/Icon-512.png", - "sizes": "512x512", - "type": "image/png" - }, - { - "src": "icons/Icon-maskable-192.png", - "sizes": "192x192", - "type": "image/png", - "purpose": "maskable" - }, - { - "src": "icons/Icon-maskable-512.png", - "sizes": "512x512", - "type": "image/png", - "purpose": "maskable" - } - ] -} \ No newline at end of file diff --git a/apps/rider-archive-cubit/web/splash/img/dark-1x.png b/apps/rider-archive-cubit/web/splash/img/dark-1x.png deleted file mode 100644 index 6694368..0000000 Binary files a/apps/rider-archive-cubit/web/splash/img/dark-1x.png and /dev/null differ diff --git a/apps/rider-archive-cubit/web/splash/img/dark-2x.png b/apps/rider-archive-cubit/web/splash/img/dark-2x.png deleted file mode 100644 index 769f7c4..0000000 Binary files a/apps/rider-archive-cubit/web/splash/img/dark-2x.png and /dev/null differ diff --git a/apps/rider-archive-cubit/web/splash/img/dark-3x.png b/apps/rider-archive-cubit/web/splash/img/dark-3x.png deleted file mode 100644 index 5fd14db..0000000 Binary files a/apps/rider-archive-cubit/web/splash/img/dark-3x.png and /dev/null differ diff --git a/apps/rider-archive-cubit/web/splash/img/dark-4x.png b/apps/rider-archive-cubit/web/splash/img/dark-4x.png deleted file mode 100644 index 1c91252..0000000 Binary files a/apps/rider-archive-cubit/web/splash/img/dark-4x.png and /dev/null differ diff --git a/apps/rider-archive-cubit/web/splash/img/light-1x.png b/apps/rider-archive-cubit/web/splash/img/light-1x.png deleted file mode 100644 index 6694368..0000000 Binary files a/apps/rider-archive-cubit/web/splash/img/light-1x.png and /dev/null differ diff --git a/apps/rider-archive-cubit/web/splash/img/light-2x.png b/apps/rider-archive-cubit/web/splash/img/light-2x.png deleted file mode 100644 index 769f7c4..0000000 Binary files a/apps/rider-archive-cubit/web/splash/img/light-2x.png and /dev/null differ diff --git a/apps/rider-archive-cubit/web/splash/img/light-3x.png b/apps/rider-archive-cubit/web/splash/img/light-3x.png deleted file mode 100644 index 5fd14db..0000000 Binary files a/apps/rider-archive-cubit/web/splash/img/light-3x.png and /dev/null differ diff --git a/apps/rider-archive-cubit/web/splash/img/light-4x.png b/apps/rider-archive-cubit/web/splash/img/light-4x.png deleted file mode 100644 index 1c91252..0000000 Binary files a/apps/rider-archive-cubit/web/splash/img/light-4x.png and /dev/null differ diff --git a/apps/rider-archive-cubit/windows/.gitignore b/apps/rider-archive-cubit/windows/.gitignore deleted file mode 100644 index d492d0d..0000000 --- a/apps/rider-archive-cubit/windows/.gitignore +++ /dev/null @@ -1,17 +0,0 @@ -flutter/ephemeral/ - -# Visual Studio user-specific files. -*.suo -*.user -*.userosscache -*.sln.docstates - -# Visual Studio build-related files. -x64/ -x86/ - -# Visual Studio cache files -# files ending in .cache can be ignored -*.[Cc]ache -# but keep track of directories ending in .cache -!*.[Cc]ache/ diff --git a/apps/rider-archive-cubit/windows/CMakeLists.txt b/apps/rider-archive-cubit/windows/CMakeLists.txt deleted file mode 100644 index e663f62..0000000 --- a/apps/rider-archive-cubit/windows/CMakeLists.txt +++ /dev/null @@ -1,102 +0,0 @@ -# Project-level configuration. -cmake_minimum_required(VERSION 3.14) -project(ride LANGUAGES CXX) - -# The name of the executable created for the application. Change this to change -# the on-disk name of your application. -set(BINARY_NAME "ride") - -# Explicitly opt in to modern CMake behaviors to avoid warnings with recent -# versions of CMake. -cmake_policy(SET CMP0063 NEW) - -# Define build configuration option. -get_property(IS_MULTICONFIG GLOBAL PROPERTY GENERATOR_IS_MULTI_CONFIG) -if(IS_MULTICONFIG) - set(CMAKE_CONFIGURATION_TYPES "Debug;Profile;Release" - CACHE STRING "" FORCE) -else() - if(NOT CMAKE_BUILD_TYPE AND NOT CMAKE_CONFIGURATION_TYPES) - set(CMAKE_BUILD_TYPE "Debug" CACHE - STRING "Flutter build mode" FORCE) - set_property(CACHE CMAKE_BUILD_TYPE PROPERTY STRINGS - "Debug" "Profile" "Release") - endif() -endif() -# Define settings for the Profile build mode. -set(CMAKE_EXE_LINKER_FLAGS_PROFILE "${CMAKE_EXE_LINKER_FLAGS_RELEASE}") -set(CMAKE_SHARED_LINKER_FLAGS_PROFILE "${CMAKE_SHARED_LINKER_FLAGS_RELEASE}") -set(CMAKE_C_FLAGS_PROFILE "${CMAKE_C_FLAGS_RELEASE}") -set(CMAKE_CXX_FLAGS_PROFILE "${CMAKE_CXX_FLAGS_RELEASE}") - -# Use Unicode for all projects. -add_definitions(-DUNICODE -D_UNICODE) - -# Compilation settings that should be applied to most targets. -# -# Be cautious about adding new options here, as plugins use this function by -# default. In most cases, you should add new options to specific targets instead -# of modifying this function. -function(APPLY_STANDARD_SETTINGS TARGET) - target_compile_features(${TARGET} PUBLIC cxx_std_17) - target_compile_options(${TARGET} PRIVATE /W4 /WX /wd"4100") - target_compile_options(${TARGET} PRIVATE /EHsc) - target_compile_definitions(${TARGET} PRIVATE "_HAS_EXCEPTIONS=0") - target_compile_definitions(${TARGET} PRIVATE "$<$:_DEBUG>") -endfunction() - -# Flutter library and tool build rules. -set(FLUTTER_MANAGED_DIR "${CMAKE_CURRENT_SOURCE_DIR}/flutter") -add_subdirectory(${FLUTTER_MANAGED_DIR}) - -# Application build; see runner/CMakeLists.txt. -add_subdirectory("runner") - - -# Generated plugin build rules, which manage building the plugins and adding -# them to the application. -include(flutter/generated_plugins.cmake) - - -# === Installation === -# Support files are copied into place next to the executable, so that it can -# run in place. This is done instead of making a separate bundle (as on Linux) -# so that building and running from within Visual Studio will work. -set(BUILD_BUNDLE_DIR "$") -# Make the "install" step default, as it's required to run. -set(CMAKE_VS_INCLUDE_INSTALL_TO_DEFAULT_BUILD 1) -if(CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT) - set(CMAKE_INSTALL_PREFIX "${BUILD_BUNDLE_DIR}" CACHE PATH "..." FORCE) -endif() - -set(INSTALL_BUNDLE_DATA_DIR "${CMAKE_INSTALL_PREFIX}/data") -set(INSTALL_BUNDLE_LIB_DIR "${CMAKE_INSTALL_PREFIX}") - -install(TARGETS ${BINARY_NAME} RUNTIME DESTINATION "${CMAKE_INSTALL_PREFIX}" - COMPONENT Runtime) - -install(FILES "${FLUTTER_ICU_DATA_FILE}" DESTINATION "${INSTALL_BUNDLE_DATA_DIR}" - COMPONENT Runtime) - -install(FILES "${FLUTTER_LIBRARY}" DESTINATION "${INSTALL_BUNDLE_LIB_DIR}" - COMPONENT Runtime) - -if(PLUGIN_BUNDLED_LIBRARIES) - install(FILES "${PLUGIN_BUNDLED_LIBRARIES}" - DESTINATION "${INSTALL_BUNDLE_LIB_DIR}" - COMPONENT Runtime) -endif() - -# Fully re-copy the assets directory on each build to avoid having stale files -# from a previous install. -set(FLUTTER_ASSET_DIR_NAME "flutter_assets") -install(CODE " - file(REMOVE_RECURSE \"${INSTALL_BUNDLE_DATA_DIR}/${FLUTTER_ASSET_DIR_NAME}\") - " COMPONENT Runtime) -install(DIRECTORY "${PROJECT_BUILD_DIR}/${FLUTTER_ASSET_DIR_NAME}" - DESTINATION "${INSTALL_BUNDLE_DATA_DIR}" COMPONENT Runtime) - -# Install the AOT library on non-Debug builds only. -install(FILES "${AOT_LIBRARY}" DESTINATION "${INSTALL_BUNDLE_DATA_DIR}" - CONFIGURATIONS Profile;Release - COMPONENT Runtime) diff --git a/apps/rider-archive-cubit/windows/flutter/CMakeLists.txt b/apps/rider-archive-cubit/windows/flutter/CMakeLists.txt deleted file mode 100644 index 903f489..0000000 --- a/apps/rider-archive-cubit/windows/flutter/CMakeLists.txt +++ /dev/null @@ -1,109 +0,0 @@ -# This file controls Flutter-level build steps. It should not be edited. -cmake_minimum_required(VERSION 3.14) - -set(EPHEMERAL_DIR "${CMAKE_CURRENT_SOURCE_DIR}/ephemeral") - -# Configuration provided via flutter tool. -include(${EPHEMERAL_DIR}/generated_config.cmake) - -# TODO: Move the rest of this into files in ephemeral. See -# https://github.com/flutter/flutter/issues/57146. -set(WRAPPER_ROOT "${EPHEMERAL_DIR}/cpp_client_wrapper") - -# Set fallback configurations for older versions of the flutter tool. -if (NOT DEFINED FLUTTER_TARGET_PLATFORM) - set(FLUTTER_TARGET_PLATFORM "windows-x64") -endif() - -# === Flutter Library === -set(FLUTTER_LIBRARY "${EPHEMERAL_DIR}/flutter_windows.dll") - -# Published to parent scope for install step. -set(FLUTTER_LIBRARY ${FLUTTER_LIBRARY} PARENT_SCOPE) -set(FLUTTER_ICU_DATA_FILE "${EPHEMERAL_DIR}/icudtl.dat" PARENT_SCOPE) -set(PROJECT_BUILD_DIR "${PROJECT_DIR}/build/" PARENT_SCOPE) -set(AOT_LIBRARY "${PROJECT_DIR}/build/windows/app.so" PARENT_SCOPE) - -list(APPEND FLUTTER_LIBRARY_HEADERS - "flutter_export.h" - "flutter_windows.h" - "flutter_messenger.h" - "flutter_plugin_registrar.h" - "flutter_texture_registrar.h" -) -list(TRANSFORM FLUTTER_LIBRARY_HEADERS PREPEND "${EPHEMERAL_DIR}/") -add_library(flutter INTERFACE) -target_include_directories(flutter INTERFACE - "${EPHEMERAL_DIR}" -) -target_link_libraries(flutter INTERFACE "${FLUTTER_LIBRARY}.lib") -add_dependencies(flutter flutter_assemble) - -# === Wrapper === -list(APPEND CPP_WRAPPER_SOURCES_CORE - "core_implementations.cc" - "standard_codec.cc" -) -list(TRANSFORM CPP_WRAPPER_SOURCES_CORE PREPEND "${WRAPPER_ROOT}/") -list(APPEND CPP_WRAPPER_SOURCES_PLUGIN - "plugin_registrar.cc" -) -list(TRANSFORM CPP_WRAPPER_SOURCES_PLUGIN PREPEND "${WRAPPER_ROOT}/") -list(APPEND CPP_WRAPPER_SOURCES_APP - "flutter_engine.cc" - "flutter_view_controller.cc" -) -list(TRANSFORM CPP_WRAPPER_SOURCES_APP PREPEND "${WRAPPER_ROOT}/") - -# Wrapper sources needed for a plugin. -add_library(flutter_wrapper_plugin STATIC - ${CPP_WRAPPER_SOURCES_CORE} - ${CPP_WRAPPER_SOURCES_PLUGIN} -) -apply_standard_settings(flutter_wrapper_plugin) -set_target_properties(flutter_wrapper_plugin PROPERTIES - POSITION_INDEPENDENT_CODE ON) -set_target_properties(flutter_wrapper_plugin PROPERTIES - CXX_VISIBILITY_PRESET hidden) -target_link_libraries(flutter_wrapper_plugin PUBLIC flutter) -target_include_directories(flutter_wrapper_plugin PUBLIC - "${WRAPPER_ROOT}/include" -) -add_dependencies(flutter_wrapper_plugin flutter_assemble) - -# Wrapper sources needed for the runner. -add_library(flutter_wrapper_app STATIC - ${CPP_WRAPPER_SOURCES_CORE} - ${CPP_WRAPPER_SOURCES_APP} -) -apply_standard_settings(flutter_wrapper_app) -target_link_libraries(flutter_wrapper_app PUBLIC flutter) -target_include_directories(flutter_wrapper_app PUBLIC - "${WRAPPER_ROOT}/include" -) -add_dependencies(flutter_wrapper_app flutter_assemble) - -# === Flutter tool backend === -# _phony_ is a non-existent file to force this command to run every time, -# since currently there's no way to get a full input/output list from the -# flutter tool. -set(PHONY_OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/_phony_") -set_source_files_properties("${PHONY_OUTPUT}" PROPERTIES SYMBOLIC TRUE) -add_custom_command( - OUTPUT ${FLUTTER_LIBRARY} ${FLUTTER_LIBRARY_HEADERS} - ${CPP_WRAPPER_SOURCES_CORE} ${CPP_WRAPPER_SOURCES_PLUGIN} - ${CPP_WRAPPER_SOURCES_APP} - ${PHONY_OUTPUT} - COMMAND ${CMAKE_COMMAND} -E env - ${FLUTTER_TOOL_ENVIRONMENT} - "${FLUTTER_ROOT}/packages/flutter_tools/bin/tool_backend.bat" - ${FLUTTER_TARGET_PLATFORM} $ - VERBATIM -) -add_custom_target(flutter_assemble DEPENDS - "${FLUTTER_LIBRARY}" - ${FLUTTER_LIBRARY_HEADERS} - ${CPP_WRAPPER_SOURCES_CORE} - ${CPP_WRAPPER_SOURCES_PLUGIN} - ${CPP_WRAPPER_SOURCES_APP} -) diff --git a/apps/rider-archive-cubit/windows/flutter/generated_plugin_registrant.cc b/apps/rider-archive-cubit/windows/flutter/generated_plugin_registrant.cc deleted file mode 100644 index 9e06623..0000000 --- a/apps/rider-archive-cubit/windows/flutter/generated_plugin_registrant.cc +++ /dev/null @@ -1,23 +0,0 @@ -// -// Generated file. Do not edit. -// - -// clang-format off - -#include "generated_plugin_registrant.h" - -#include -#include -#include -#include - -void RegisterPlugins(flutter::PluginRegistry* registry) { - FirebaseCorePluginCApiRegisterWithRegistrar( - registry->GetRegistrarForPlugin("FirebaseCorePluginCApi")); - FlutterSecureStorageWindowsPluginRegisterWithRegistrar( - registry->GetRegistrarForPlugin("FlutterSecureStorageWindowsPlugin")); - GeolocatorWindowsRegisterWithRegistrar( - registry->GetRegistrarForPlugin("GeolocatorWindows")); - PermissionHandlerWindowsPluginRegisterWithRegistrar( - registry->GetRegistrarForPlugin("PermissionHandlerWindowsPlugin")); -} diff --git a/apps/rider-archive-cubit/windows/flutter/generated_plugin_registrant.h b/apps/rider-archive-cubit/windows/flutter/generated_plugin_registrant.h deleted file mode 100644 index dc139d8..0000000 --- a/apps/rider-archive-cubit/windows/flutter/generated_plugin_registrant.h +++ /dev/null @@ -1,15 +0,0 @@ -// -// Generated file. Do not edit. -// - -// clang-format off - -#ifndef GENERATED_PLUGIN_REGISTRANT_ -#define GENERATED_PLUGIN_REGISTRANT_ - -#include - -// Registers Flutter plugins. -void RegisterPlugins(flutter::PluginRegistry* registry); - -#endif // GENERATED_PLUGIN_REGISTRANT_ diff --git a/apps/rider-archive-cubit/windows/flutter/generated_plugins.cmake b/apps/rider-archive-cubit/windows/flutter/generated_plugins.cmake deleted file mode 100644 index bc9b53d..0000000 --- a/apps/rider-archive-cubit/windows/flutter/generated_plugins.cmake +++ /dev/null @@ -1,28 +0,0 @@ -# -# Generated file, do not edit. -# - -list(APPEND FLUTTER_PLUGIN_LIST - firebase_core - flutter_secure_storage_windows - geolocator_windows - permission_handler_windows -) - -list(APPEND FLUTTER_FFI_PLUGIN_LIST - jni -) - -set(PLUGIN_BUNDLED_LIBRARIES) - -foreach(plugin ${FLUTTER_PLUGIN_LIST}) - add_subdirectory(flutter/ephemeral/.plugin_symlinks/${plugin}/windows plugins/${plugin}) - target_link_libraries(${BINARY_NAME} PRIVATE ${plugin}_plugin) - list(APPEND PLUGIN_BUNDLED_LIBRARIES $) - list(APPEND PLUGIN_BUNDLED_LIBRARIES ${${plugin}_bundled_libraries}) -endforeach(plugin) - -foreach(ffi_plugin ${FLUTTER_FFI_PLUGIN_LIST}) - add_subdirectory(flutter/ephemeral/.plugin_symlinks/${ffi_plugin}/windows plugins/${ffi_plugin}) - list(APPEND PLUGIN_BUNDLED_LIBRARIES ${${ffi_plugin}_bundled_libraries}) -endforeach(ffi_plugin) diff --git a/apps/rider-archive-cubit/windows/runner/CMakeLists.txt b/apps/rider-archive-cubit/windows/runner/CMakeLists.txt deleted file mode 100644 index 394917c..0000000 --- a/apps/rider-archive-cubit/windows/runner/CMakeLists.txt +++ /dev/null @@ -1,40 +0,0 @@ -cmake_minimum_required(VERSION 3.14) -project(runner LANGUAGES CXX) - -# Define the application target. To change its name, change BINARY_NAME in the -# top-level CMakeLists.txt, not the value here, or `flutter run` will no longer -# work. -# -# Any new source files that you add to the application should be added here. -add_executable(${BINARY_NAME} WIN32 - "flutter_window.cpp" - "main.cpp" - "utils.cpp" - "win32_window.cpp" - "${FLUTTER_MANAGED_DIR}/generated_plugin_registrant.cc" - "Runner.rc" - "runner.exe.manifest" -) - -# Apply the standard set of build settings. This can be removed for applications -# that need different build settings. -apply_standard_settings(${BINARY_NAME}) - -# Add preprocessor definitions for the build version. -target_compile_definitions(${BINARY_NAME} PRIVATE "FLUTTER_VERSION=\"${FLUTTER_VERSION}\"") -target_compile_definitions(${BINARY_NAME} PRIVATE "FLUTTER_VERSION_MAJOR=${FLUTTER_VERSION_MAJOR}") -target_compile_definitions(${BINARY_NAME} PRIVATE "FLUTTER_VERSION_MINOR=${FLUTTER_VERSION_MINOR}") -target_compile_definitions(${BINARY_NAME} PRIVATE "FLUTTER_VERSION_PATCH=${FLUTTER_VERSION_PATCH}") -target_compile_definitions(${BINARY_NAME} PRIVATE "FLUTTER_VERSION_BUILD=${FLUTTER_VERSION_BUILD}") - -# Disable Windows macros that collide with C++ standard library functions. -target_compile_definitions(${BINARY_NAME} PRIVATE "NOMINMAX") - -# Add dependency libraries and include directories. Add any application-specific -# dependencies here. -target_link_libraries(${BINARY_NAME} PRIVATE flutter flutter_wrapper_app) -target_link_libraries(${BINARY_NAME} PRIVATE "dwmapi.lib") -target_include_directories(${BINARY_NAME} PRIVATE "${CMAKE_SOURCE_DIR}") - -# Run the Flutter tool portions of the build. This must not be removed. -add_dependencies(${BINARY_NAME} flutter_assemble) diff --git a/apps/rider-archive-cubit/windows/runner/Runner.rc b/apps/rider-archive-cubit/windows/runner/Runner.rc deleted file mode 100644 index ba10230..0000000 --- a/apps/rider-archive-cubit/windows/runner/Runner.rc +++ /dev/null @@ -1,121 +0,0 @@ -// Microsoft Visual C++ generated resource script. -// -#pragma code_page(65001) -#include "resource.h" - -#define APSTUDIO_READONLY_SYMBOLS -///////////////////////////////////////////////////////////////////////////// -// -// Generated from the TEXTINCLUDE 2 resource. -// -#include "winres.h" - -///////////////////////////////////////////////////////////////////////////// -#undef APSTUDIO_READONLY_SYMBOLS - -///////////////////////////////////////////////////////////////////////////// -// English (United States) resources - -#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU) -LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US - -#ifdef APSTUDIO_INVOKED -///////////////////////////////////////////////////////////////////////////// -// -// TEXTINCLUDE -// - -1 TEXTINCLUDE -BEGIN - "resource.h\0" -END - -2 TEXTINCLUDE -BEGIN - "#include ""winres.h""\r\n" - "\0" -END - -3 TEXTINCLUDE -BEGIN - "\r\n" - "\0" -END - -#endif // APSTUDIO_INVOKED - - -///////////////////////////////////////////////////////////////////////////// -// -// Icon -// - -// Icon with lowest ID value placed first to ensure application icon -// remains consistent on all systems. -IDI_APP_ICON ICON "resources\\app_icon.ico" - - -///////////////////////////////////////////////////////////////////////////// -// -// Version -// - -#if defined(FLUTTER_VERSION_MAJOR) && defined(FLUTTER_VERSION_MINOR) && defined(FLUTTER_VERSION_PATCH) && defined(FLUTTER_VERSION_BUILD) -#define VERSION_AS_NUMBER FLUTTER_VERSION_MAJOR,FLUTTER_VERSION_MINOR,FLUTTER_VERSION_PATCH,FLUTTER_VERSION_BUILD -#else -#define VERSION_AS_NUMBER 1,0,0,0 -#endif - -#if defined(FLUTTER_VERSION) -#define VERSION_AS_STRING FLUTTER_VERSION -#else -#define VERSION_AS_STRING "1.0.0" -#endif - -VS_VERSION_INFO VERSIONINFO - FILEVERSION VERSION_AS_NUMBER - PRODUCTVERSION VERSION_AS_NUMBER - FILEFLAGSMASK VS_FFI_FILEFLAGSMASK -#ifdef _DEBUG - FILEFLAGS VS_FF_DEBUG -#else - FILEFLAGS 0x0L -#endif - FILEOS VOS__WINDOWS32 - FILETYPE VFT_APP - FILESUBTYPE 0x0L -BEGIN - BLOCK "StringFileInfo" - BEGIN - BLOCK "040904e4" - BEGIN - VALUE "CompanyName", "com.mobileapp.store" "\0" - VALUE "FileDescription", "ride" "\0" - VALUE "FileVersion", VERSION_AS_STRING "\0" - VALUE "InternalName", "ride" "\0" - VALUE "LegalCopyright", "Copyright (C) 2023 com.mobileapp.store. All rights reserved." "\0" - VALUE "OriginalFilename", "ride.exe" "\0" - VALUE "ProductName", "ride" "\0" - VALUE "ProductVersion", VERSION_AS_STRING "\0" - END - END - BLOCK "VarFileInfo" - BEGIN - VALUE "Translation", 0x409, 1252 - END -END - -#endif // English (United States) resources -///////////////////////////////////////////////////////////////////////////// - - - -#ifndef APSTUDIO_INVOKED -///////////////////////////////////////////////////////////////////////////// -// -// Generated from the TEXTINCLUDE 3 resource. -// - - -///////////////////////////////////////////////////////////////////////////// -#endif // not APSTUDIO_INVOKED diff --git a/apps/rider-archive-cubit/windows/runner/flutter_window.cpp b/apps/rider-archive-cubit/windows/runner/flutter_window.cpp deleted file mode 100644 index 955ee30..0000000 --- a/apps/rider-archive-cubit/windows/runner/flutter_window.cpp +++ /dev/null @@ -1,71 +0,0 @@ -#include "flutter_window.h" - -#include - -#include "flutter/generated_plugin_registrant.h" - -FlutterWindow::FlutterWindow(const flutter::DartProject& project) - : project_(project) {} - -FlutterWindow::~FlutterWindow() {} - -bool FlutterWindow::OnCreate() { - if (!Win32Window::OnCreate()) { - return false; - } - - RECT frame = GetClientArea(); - - // The size here must match the window dimensions to avoid unnecessary surface - // creation / destruction in the startup path. - flutter_controller_ = std::make_unique( - frame.right - frame.left, frame.bottom - frame.top, project_); - // Ensure that basic setup of the controller was successful. - if (!flutter_controller_->engine() || !flutter_controller_->view()) { - return false; - } - RegisterPlugins(flutter_controller_->engine()); - SetChildContent(flutter_controller_->view()->GetNativeWindow()); - - flutter_controller_->engine()->SetNextFrameCallback([&]() { - this->Show(); - }); - - // Flutter can complete the first frame before the "show window" callback is - // registered. The following call ensures a frame is pending to ensure the - // window is shown. It is a no-op if the first frame hasn't completed yet. - flutter_controller_->ForceRedraw(); - - return true; -} - -void FlutterWindow::OnDestroy() { - if (flutter_controller_) { - flutter_controller_ = nullptr; - } - - Win32Window::OnDestroy(); -} - -LRESULT -FlutterWindow::MessageHandler(HWND hwnd, UINT const message, - WPARAM const wparam, - LPARAM const lparam) noexcept { - // Give Flutter, including plugins, an opportunity to handle window messages. - if (flutter_controller_) { - std::optional result = - flutter_controller_->HandleTopLevelWindowProc(hwnd, message, wparam, - lparam); - if (result) { - return *result; - } - } - - switch (message) { - case WM_FONTCHANGE: - flutter_controller_->engine()->ReloadSystemFonts(); - break; - } - - return Win32Window::MessageHandler(hwnd, message, wparam, lparam); -} diff --git a/apps/rider-archive-cubit/windows/runner/flutter_window.h b/apps/rider-archive-cubit/windows/runner/flutter_window.h deleted file mode 100644 index 6da0652..0000000 --- a/apps/rider-archive-cubit/windows/runner/flutter_window.h +++ /dev/null @@ -1,33 +0,0 @@ -#ifndef RUNNER_FLUTTER_WINDOW_H_ -#define RUNNER_FLUTTER_WINDOW_H_ - -#include -#include - -#include - -#include "win32_window.h" - -// A window that does nothing but host a Flutter view. -class FlutterWindow : public Win32Window { - public: - // Creates a new FlutterWindow hosting a Flutter view running |project|. - explicit FlutterWindow(const flutter::DartProject& project); - virtual ~FlutterWindow(); - - protected: - // Win32Window: - bool OnCreate() override; - void OnDestroy() override; - LRESULT MessageHandler(HWND window, UINT const message, WPARAM const wparam, - LPARAM const lparam) noexcept override; - - private: - // The project to run. - flutter::DartProject project_; - - // The Flutter instance hosted by this window. - std::unique_ptr flutter_controller_; -}; - -#endif // RUNNER_FLUTTER_WINDOW_H_ diff --git a/apps/rider-archive-cubit/windows/runner/main.cpp b/apps/rider-archive-cubit/windows/runner/main.cpp deleted file mode 100644 index 46fbd8c..0000000 --- a/apps/rider-archive-cubit/windows/runner/main.cpp +++ /dev/null @@ -1,43 +0,0 @@ -#include -#include -#include - -#include "flutter_window.h" -#include "utils.h" - -int APIENTRY wWinMain(_In_ HINSTANCE instance, _In_opt_ HINSTANCE prev, - _In_ wchar_t *command_line, _In_ int show_command) { - // Attach to console when present (e.g., 'flutter run') or create a - // new console when running with a debugger. - if (!::AttachConsole(ATTACH_PARENT_PROCESS) && ::IsDebuggerPresent()) { - CreateAndAttachConsole(); - } - - // Initialize COM, so that it is available for use in the library and/or - // plugins. - ::CoInitializeEx(nullptr, COINIT_APARTMENTTHREADED); - - flutter::DartProject project(L"data"); - - std::vector command_line_arguments = - GetCommandLineArguments(); - - project.set_dart_entrypoint_arguments(std::move(command_line_arguments)); - - FlutterWindow window(project); - Win32Window::Point origin(10, 10); - Win32Window::Size size(1280, 720); - if (!window.Create(L"ride", origin, size)) { - return EXIT_FAILURE; - } - window.SetQuitOnClose(true); - - ::MSG msg; - while (::GetMessage(&msg, nullptr, 0, 0)) { - ::TranslateMessage(&msg); - ::DispatchMessage(&msg); - } - - ::CoUninitialize(); - return EXIT_SUCCESS; -} diff --git a/apps/rider-archive-cubit/windows/runner/resource.h b/apps/rider-archive-cubit/windows/runner/resource.h deleted file mode 100644 index 66a65d1..0000000 --- a/apps/rider-archive-cubit/windows/runner/resource.h +++ /dev/null @@ -1,16 +0,0 @@ -//{{NO_DEPENDENCIES}} -// Microsoft Visual C++ generated include file. -// Used by Runner.rc -// -#define IDI_APP_ICON 101 - -// Next default values for new objects -// -#ifdef APSTUDIO_INVOKED -#ifndef APSTUDIO_READONLY_SYMBOLS -#define _APS_NEXT_RESOURCE_VALUE 102 -#define _APS_NEXT_COMMAND_VALUE 40001 -#define _APS_NEXT_CONTROL_VALUE 1001 -#define _APS_NEXT_SYMED_VALUE 101 -#endif -#endif diff --git a/apps/rider-archive-cubit/windows/runner/resources/app_icon.ico b/apps/rider-archive-cubit/windows/runner/resources/app_icon.ico deleted file mode 100644 index a89238a..0000000 Binary files a/apps/rider-archive-cubit/windows/runner/resources/app_icon.ico and /dev/null differ diff --git a/apps/rider-archive-cubit/windows/runner/resources/app_icon.png b/apps/rider-archive-cubit/windows/runner/resources/app_icon.png deleted file mode 100644 index 776785b..0000000 Binary files a/apps/rider-archive-cubit/windows/runner/resources/app_icon.png and /dev/null differ diff --git a/apps/rider-archive-cubit/windows/runner/resources/playstore.png b/apps/rider-archive-cubit/windows/runner/resources/playstore.png deleted file mode 100644 index 7567e84..0000000 Binary files a/apps/rider-archive-cubit/windows/runner/resources/playstore.png and /dev/null differ diff --git a/apps/rider-archive-cubit/windows/runner/resources/ss.ico b/apps/rider-archive-cubit/windows/runner/resources/ss.ico deleted file mode 100644 index c04e20c..0000000 Binary files a/apps/rider-archive-cubit/windows/runner/resources/ss.ico and /dev/null differ diff --git a/apps/rider-archive-cubit/windows/runner/runner.exe.manifest b/apps/rider-archive-cubit/windows/runner/runner.exe.manifest deleted file mode 100644 index a42ea76..0000000 --- a/apps/rider-archive-cubit/windows/runner/runner.exe.manifest +++ /dev/null @@ -1,20 +0,0 @@ - - - - - PerMonitorV2 - - - - - - - - - - - - - - - diff --git a/apps/rider-archive-cubit/windows/runner/utils.cpp b/apps/rider-archive-cubit/windows/runner/utils.cpp deleted file mode 100644 index b2b0873..0000000 --- a/apps/rider-archive-cubit/windows/runner/utils.cpp +++ /dev/null @@ -1,65 +0,0 @@ -#include "utils.h" - -#include -#include -#include -#include - -#include - -void CreateAndAttachConsole() { - if (::AllocConsole()) { - FILE *unused; - if (freopen_s(&unused, "CONOUT$", "w", stdout)) { - _dup2(_fileno(stdout), 1); - } - if (freopen_s(&unused, "CONOUT$", "w", stderr)) { - _dup2(_fileno(stdout), 2); - } - std::ios::sync_with_stdio(); - FlutterDesktopResyncOutputStreams(); - } -} - -std::vector GetCommandLineArguments() { - // Convert the UTF-16 command line arguments to UTF-8 for the Engine to use. - int argc; - wchar_t** argv = ::CommandLineToArgvW(::GetCommandLineW(), &argc); - if (argv == nullptr) { - return std::vector(); - } - - std::vector command_line_arguments; - - // Skip the first argument as it's the binary name. - for (int i = 1; i < argc; i++) { - command_line_arguments.push_back(Utf8FromUtf16(argv[i])); - } - - ::LocalFree(argv); - - return command_line_arguments; -} - -std::string Utf8FromUtf16(const wchar_t* utf16_string) { - if (utf16_string == nullptr) { - return std::string(); - } - int target_length = ::WideCharToMultiByte( - CP_UTF8, WC_ERR_INVALID_CHARS, utf16_string, - -1, nullptr, 0, nullptr, nullptr) - -1; // remove the trailing null character - int input_length = (int)wcslen(utf16_string); - std::string utf8_string; - if (target_length <= 0 || target_length > utf8_string.max_size()) { - return utf8_string; - } - utf8_string.resize(target_length); - int converted_length = ::WideCharToMultiByte( - CP_UTF8, WC_ERR_INVALID_CHARS, utf16_string, - input_length, utf8_string.data(), target_length, nullptr, nullptr); - if (converted_length == 0) { - return std::string(); - } - return utf8_string; -} diff --git a/apps/rider-archive-cubit/windows/runner/utils.h b/apps/rider-archive-cubit/windows/runner/utils.h deleted file mode 100644 index 3879d54..0000000 --- a/apps/rider-archive-cubit/windows/runner/utils.h +++ /dev/null @@ -1,19 +0,0 @@ -#ifndef RUNNER_UTILS_H_ -#define RUNNER_UTILS_H_ - -#include -#include - -// Creates a console for the process, and redirects stdout and stderr to -// it for both the runner and the Flutter library. -void CreateAndAttachConsole(); - -// Takes a null-terminated wchar_t* encoded in UTF-16 and returns a std::string -// encoded in UTF-8. Returns an empty std::string on failure. -std::string Utf8FromUtf16(const wchar_t* utf16_string); - -// Gets the command line arguments passed in as a std::vector, -// encoded in UTF-8. Returns an empty std::vector on failure. -std::vector GetCommandLineArguments(); - -#endif // RUNNER_UTILS_H_ diff --git a/apps/rider-archive-cubit/windows/runner/win32_window.cpp b/apps/rider-archive-cubit/windows/runner/win32_window.cpp deleted file mode 100644 index 60608d0..0000000 --- a/apps/rider-archive-cubit/windows/runner/win32_window.cpp +++ /dev/null @@ -1,288 +0,0 @@ -#include "win32_window.h" - -#include -#include - -#include "resource.h" - -namespace { - -/// Window attribute that enables dark mode window decorations. -/// -/// Redefined in case the developer's machine has a Windows SDK older than -/// version 10.0.22000.0. -/// See: https://docs.microsoft.com/windows/win32/api/dwmapi/ne-dwmapi-dwmwindowattribute -#ifndef DWMWA_USE_IMMERSIVE_DARK_MODE -#define DWMWA_USE_IMMERSIVE_DARK_MODE 20 -#endif - -constexpr const wchar_t kWindowClassName[] = L"FLUTTER_RUNNER_WIN32_WINDOW"; - -/// Registry key for app theme preference. -/// -/// A value of 0 indicates apps should use dark mode. A non-zero or missing -/// value indicates apps should use light mode. -constexpr const wchar_t kGetPreferredBrightnessRegKey[] = - L"Software\\Microsoft\\Windows\\CurrentVersion\\Themes\\Personalize"; -constexpr const wchar_t kGetPreferredBrightnessRegValue[] = L"AppsUseLightTheme"; - -// The number of Win32Window objects that currently exist. -static int g_active_window_count = 0; - -using EnableNonClientDpiScaling = BOOL __stdcall(HWND hwnd); - -// Scale helper to convert logical scaler values to physical using passed in -// scale factor -int Scale(int source, double scale_factor) { - return static_cast(source * scale_factor); -} - -// Dynamically loads the |EnableNonClientDpiScaling| from the User32 module. -// This API is only needed for PerMonitor V1 awareness mode. -void EnableFullDpiSupportIfAvailable(HWND hwnd) { - HMODULE user32_module = LoadLibraryA("User32.dll"); - if (!user32_module) { - return; - } - auto enable_non_client_dpi_scaling = - reinterpret_cast( - GetProcAddress(user32_module, "EnableNonClientDpiScaling")); - if (enable_non_client_dpi_scaling != nullptr) { - enable_non_client_dpi_scaling(hwnd); - } - FreeLibrary(user32_module); -} - -} // namespace - -// Manages the Win32Window's window class registration. -class WindowClassRegistrar { - public: - ~WindowClassRegistrar() = default; - - // Returns the singleton registrar instance. - static WindowClassRegistrar* GetInstance() { - if (!instance_) { - instance_ = new WindowClassRegistrar(); - } - return instance_; - } - - // Returns the name of the window class, registering the class if it hasn't - // previously been registered. - const wchar_t* GetWindowClass(); - - // Unregisters the window class. Should only be called if there are no - // instances of the window. - void UnregisterWindowClass(); - - private: - WindowClassRegistrar() = default; - - static WindowClassRegistrar* instance_; - - bool class_registered_ = false; -}; - -WindowClassRegistrar* WindowClassRegistrar::instance_ = nullptr; - -const wchar_t* WindowClassRegistrar::GetWindowClass() { - if (!class_registered_) { - WNDCLASS window_class{}; - window_class.hCursor = LoadCursor(nullptr, IDC_ARROW); - window_class.lpszClassName = kWindowClassName; - window_class.style = CS_HREDRAW | CS_VREDRAW; - window_class.cbClsExtra = 0; - window_class.cbWndExtra = 0; - window_class.hInstance = GetModuleHandle(nullptr); - window_class.hIcon = - LoadIcon(window_class.hInstance, MAKEINTRESOURCE(IDI_APP_ICON)); - window_class.hbrBackground = 0; - window_class.lpszMenuName = nullptr; - window_class.lpfnWndProc = Win32Window::WndProc; - RegisterClass(&window_class); - class_registered_ = true; - } - return kWindowClassName; -} - -void WindowClassRegistrar::UnregisterWindowClass() { - UnregisterClass(kWindowClassName, nullptr); - class_registered_ = false; -} - -Win32Window::Win32Window() { - ++g_active_window_count; -} - -Win32Window::~Win32Window() { - --g_active_window_count; - Destroy(); -} - -bool Win32Window::Create(const std::wstring& title, - const Point& origin, - const Size& size) { - Destroy(); - - const wchar_t* window_class = - WindowClassRegistrar::GetInstance()->GetWindowClass(); - - const POINT target_point = {static_cast(origin.x), - static_cast(origin.y)}; - HMONITOR monitor = MonitorFromPoint(target_point, MONITOR_DEFAULTTONEAREST); - UINT dpi = FlutterDesktopGetDpiForMonitor(monitor); - double scale_factor = dpi / 96.0; - - HWND window = CreateWindow( - window_class, title.c_str(), WS_OVERLAPPEDWINDOW, - Scale(origin.x, scale_factor), Scale(origin.y, scale_factor), - Scale(size.width, scale_factor), Scale(size.height, scale_factor), - nullptr, nullptr, GetModuleHandle(nullptr), this); - - if (!window) { - return false; - } - - UpdateTheme(window); - - return OnCreate(); -} - -bool Win32Window::Show() { - return ShowWindow(window_handle_, SW_SHOWNORMAL); -} - -// static -LRESULT CALLBACK Win32Window::WndProc(HWND const window, - UINT const message, - WPARAM const wparam, - LPARAM const lparam) noexcept { - if (message == WM_NCCREATE) { - auto window_struct = reinterpret_cast(lparam); - SetWindowLongPtr(window, GWLP_USERDATA, - reinterpret_cast(window_struct->lpCreateParams)); - - auto that = static_cast(window_struct->lpCreateParams); - EnableFullDpiSupportIfAvailable(window); - that->window_handle_ = window; - } else if (Win32Window* that = GetThisFromHandle(window)) { - return that->MessageHandler(window, message, wparam, lparam); - } - - return DefWindowProc(window, message, wparam, lparam); -} - -LRESULT -Win32Window::MessageHandler(HWND hwnd, - UINT const message, - WPARAM const wparam, - LPARAM const lparam) noexcept { - switch (message) { - case WM_DESTROY: - window_handle_ = nullptr; - Destroy(); - if (quit_on_close_) { - PostQuitMessage(0); - } - return 0; - - case WM_DPICHANGED: { - auto newRectSize = reinterpret_cast(lparam); - LONG newWidth = newRectSize->right - newRectSize->left; - LONG newHeight = newRectSize->bottom - newRectSize->top; - - SetWindowPos(hwnd, nullptr, newRectSize->left, newRectSize->top, newWidth, - newHeight, SWP_NOZORDER | SWP_NOACTIVATE); - - return 0; - } - case WM_SIZE: { - RECT rect = GetClientArea(); - if (child_content_ != nullptr) { - // Size and position the child window. - MoveWindow(child_content_, rect.left, rect.top, rect.right - rect.left, - rect.bottom - rect.top, TRUE); - } - return 0; - } - - case WM_ACTIVATE: - if (child_content_ != nullptr) { - SetFocus(child_content_); - } - return 0; - - case WM_DWMCOLORIZATIONCOLORCHANGED: - UpdateTheme(hwnd); - return 0; - } - - return DefWindowProc(window_handle_, message, wparam, lparam); -} - -void Win32Window::Destroy() { - OnDestroy(); - - if (window_handle_) { - DestroyWindow(window_handle_); - window_handle_ = nullptr; - } - if (g_active_window_count == 0) { - WindowClassRegistrar::GetInstance()->UnregisterWindowClass(); - } -} - -Win32Window* Win32Window::GetThisFromHandle(HWND const window) noexcept { - return reinterpret_cast( - GetWindowLongPtr(window, GWLP_USERDATA)); -} - -void Win32Window::SetChildContent(HWND content) { - child_content_ = content; - SetParent(content, window_handle_); - RECT frame = GetClientArea(); - - MoveWindow(content, frame.left, frame.top, frame.right - frame.left, - frame.bottom - frame.top, true); - - SetFocus(child_content_); -} - -RECT Win32Window::GetClientArea() { - RECT frame; - GetClientRect(window_handle_, &frame); - return frame; -} - -HWND Win32Window::GetHandle() { - return window_handle_; -} - -void Win32Window::SetQuitOnClose(bool quit_on_close) { - quit_on_close_ = quit_on_close; -} - -bool Win32Window::OnCreate() { - // No-op; provided for subclasses. - return true; -} - -void Win32Window::OnDestroy() { - // No-op; provided for subclasses. -} - -void Win32Window::UpdateTheme(HWND const window) { - DWORD light_mode; - DWORD light_mode_size = sizeof(light_mode); - LSTATUS result = RegGetValue(HKEY_CURRENT_USER, kGetPreferredBrightnessRegKey, - kGetPreferredBrightnessRegValue, - RRF_RT_REG_DWORD, nullptr, &light_mode, - &light_mode_size); - - if (result == ERROR_SUCCESS) { - BOOL enable_dark_mode = light_mode == 0; - DwmSetWindowAttribute(window, DWMWA_USE_IMMERSIVE_DARK_MODE, - &enable_dark_mode, sizeof(enable_dark_mode)); - } -} diff --git a/apps/rider-archive-cubit/windows/runner/win32_window.h b/apps/rider-archive-cubit/windows/runner/win32_window.h deleted file mode 100644 index e901dde..0000000 --- a/apps/rider-archive-cubit/windows/runner/win32_window.h +++ /dev/null @@ -1,102 +0,0 @@ -#ifndef RUNNER_WIN32_WINDOW_H_ -#define RUNNER_WIN32_WINDOW_H_ - -#include - -#include -#include -#include - -// A class abstraction for a high DPI-aware Win32 Window. Intended to be -// inherited from by classes that wish to specialize with custom -// rendering and input handling -class Win32Window { - public: - struct Point { - unsigned int x; - unsigned int y; - Point(unsigned int x, unsigned int y) : x(x), y(y) {} - }; - - struct Size { - unsigned int width; - unsigned int height; - Size(unsigned int width, unsigned int height) - : width(width), height(height) {} - }; - - Win32Window(); - virtual ~Win32Window(); - - // Creates a win32 window with |title| that is positioned and sized using - // |origin| and |size|. New windows are created on the default monitor. Window - // sizes are specified to the OS in physical pixels, hence to ensure a - // consistent size this function will scale the inputted width and height as - // as appropriate for the default monitor. The window is invisible until - // |Show| is called. Returns true if the window was created successfully. - bool Create(const std::wstring& title, const Point& origin, const Size& size); - - // Show the current window. Returns true if the window was successfully shown. - bool Show(); - - // Release OS resources associated with window. - void Destroy(); - - // Inserts |content| into the window tree. - void SetChildContent(HWND content); - - // Returns the backing Window handle to enable clients to set icon and other - // window properties. Returns nullptr if the window has been destroyed. - HWND GetHandle(); - - // If true, closing this window will quit the application. - void SetQuitOnClose(bool quit_on_close); - - // Return a RECT representing the bounds of the current client area. - RECT GetClientArea(); - - protected: - // Processes and route salient window messages for mouse handling, - // size change and DPI. Delegates handling of these to member overloads that - // inheriting classes can handle. - virtual LRESULT MessageHandler(HWND window, - UINT const message, - WPARAM const wparam, - LPARAM const lparam) noexcept; - - // Called when CreateAndShow is called, allowing subclass window-related - // setup. Subclasses should return false if setup fails. - virtual bool OnCreate(); - - // Called when Destroy is called. - virtual void OnDestroy(); - - private: - friend class WindowClassRegistrar; - - // OS callback called by message pump. Handles the WM_NCCREATE message which - // is passed when the non-client area is being created and enables automatic - // non-client DPI scaling so that the non-client area automatically - // responds to changes in DPI. All other messages are handled by - // MessageHandler. - static LRESULT CALLBACK WndProc(HWND const window, - UINT const message, - WPARAM const wparam, - LPARAM const lparam) noexcept; - - // Retrieves a class instance pointer for |window| - static Win32Window* GetThisFromHandle(HWND const window) noexcept; - - // Update the window frame's theme to match the system theme. - static void UpdateTheme(HWND const window); - - bool quit_on_close_ = false; - - // window handle for top level window. - HWND window_handle_ = nullptr; - - // window handle for hosted content. - HWND child_content_ = nullptr; -}; - -#endif // RUNNER_WIN32_WINDOW_H_ diff --git a/apps/rider_new/.gitignore b/apps/rider_new/.gitignore deleted file mode 100644 index e64ceb9..0000000 --- a/apps/rider_new/.gitignore +++ /dev/null @@ -1,48 +0,0 @@ -# Miscellaneous -*.class -*.log -*.pyc -*.swp -.DS_Store -.atom/ -.build/ -.buildlog/ -.history -.svn/ -.swiftpm/ -migrate_working_dir/ - -# IntelliJ related -*.iml -*.ipr -*.iws -.idea/ - -# The .vscode folder contains launch configuration and tasks you configure in -# VS Code which you may wish to be included in version control, so this line -# is commented out by default. -#.vscode/ - -# Flutter/Dart/Pub related -**/doc/api/ -**/ios/Flutter/.last_build_id -.dart_tool/ -.flutter-plugins-dependencies -.pub-cache/ -.pub/ -/build/ -/coverage/ - -# Symbolication related -app.*.symbols - -# Obfuscation related -app.*.map.json - -# Android Studio will place build artifacts here -/android/app/debug -/android/app/profile -/android/app/release - -# مُولَّد من ARB — لا يُحرَّر -lib/core/l10n/gen/ diff --git a/apps/rider_new/.metadata b/apps/rider_new/.metadata deleted file mode 100644 index d31e83a..0000000 --- a/apps/rider_new/.metadata +++ /dev/null @@ -1,33 +0,0 @@ -# This file tracks properties of this Flutter project. -# Used by Flutter tool to assess capabilities and perform upgrades etc. -# -# This file should be version controlled and should not be manually edited. - -version: - revision: "90673a4eef275d1a6692c26ac80d6d746d41a73a" - channel: "stable" - -project_type: app - -# Tracks metadata for the flutter migrate command -migration: - platforms: - - platform: root - create_revision: 90673a4eef275d1a6692c26ac80d6d746d41a73a - base_revision: 90673a4eef275d1a6692c26ac80d6d746d41a73a - - platform: android - create_revision: 90673a4eef275d1a6692c26ac80d6d746d41a73a - base_revision: 90673a4eef275d1a6692c26ac80d6d746d41a73a - - platform: ios - create_revision: 90673a4eef275d1a6692c26ac80d6d746d41a73a - base_revision: 90673a4eef275d1a6692c26ac80d6d746d41a73a - - # User provided section - - # List of Local paths (relative to this file) that should be - # ignored by the migrate tool. - # - # Files that are not part of the templates will be ignored by default. - unmanaged_files: - - 'lib/main.dart' - - 'ios/Runner.xcodeproj/project.pbxproj' diff --git a/apps/rider_new/README.md b/apps/rider_new/README.md deleted file mode 100644 index 57e6af4..0000000 --- a/apps/rider_new/README.md +++ /dev/null @@ -1,17 +0,0 @@ -# rider_new - -A new Flutter project. - -## Getting Started - -This project is a starting point for a Flutter application. - -A few resources to get you started if this is your first Flutter project: - -- [Learn Flutter](https://docs.flutter.dev/get-started/learn-flutter) -- [Write your first Flutter app](https://docs.flutter.dev/get-started/codelab) -- [Flutter learning resources](https://docs.flutter.dev/reference/learning-resources) - -For help getting started with Flutter development, view the -[online documentation](https://docs.flutter.dev/), which offers tutorials, -samples, guidance on mobile development, and a full API reference. diff --git a/apps/rider_new/analysis_options.yaml b/apps/rider_new/analysis_options.yaml deleted file mode 100644 index 61b6c4d..0000000 --- a/apps/rider_new/analysis_options.yaml +++ /dev/null @@ -1,29 +0,0 @@ -# This file configures the analyzer, which statically analyzes Dart code to -# check for errors, warnings, and lints. -# -# The issues identified by the analyzer are surfaced in the UI of Dart-enabled -# IDEs (https://dart.dev/tools#ides-and-editors). The analyzer can also be -# invoked from the command line by running `flutter analyze`. - -# The following line activates a set of recommended lints for Flutter apps, -# packages, and plugins designed to encourage good coding practices. -include: package:flutter_lints/flutter.yaml - -linter: - # The lint rules applied to this project can be customized in the - # section below to disable rules from the `package:flutter_lints/flutter.yaml` - # included above or to enable additional rules. A list of all available lints - # and their documentation is published at - # https://dart-lang.github.io/linter/lints/index.html. - # - # Instead of disabling a lint rule for the entire project in the - # section below, it can also be suppressed for a single line of code - # or a specific dart file by using the `// ignore: name_of_lint` and - # `// ignore_for_file: name_of_lint` syntax on the line or in the file - # producing the lint. - rules: - # avoid_print: false # Uncomment to disable the `avoid_print` rule - # prefer_single_quotes: true # Uncomment to enable the `prefer_single_quotes` rule - -# Additional information about this file can be found at -# https://dart.dev/guides/language/analysis-options diff --git a/apps/rider_new/android/.gitignore b/apps/rider_new/android/.gitignore deleted file mode 100644 index ff01b1d..0000000 --- a/apps/rider_new/android/.gitignore +++ /dev/null @@ -1,15 +0,0 @@ -gradle-wrapper.jar -/.gradle -/captures/ -/gradlew -/gradlew.bat -/local.properties -GeneratedPluginRegistrant.java -/.cxx - -# Remember to never publicly share your keystore. -# See https://flutter.dev/docs/deployment/android#reference-the-keystore-from-the-app -key.properties -gradle.properties -**/*.keystore -**/*.jks diff --git a/apps/rider_new/android/app/build.gradle b/apps/rider_new/android/app/build.gradle deleted file mode 100644 index 5b6de45..0000000 --- a/apps/rider_new/android/app/build.gradle +++ /dev/null @@ -1,90 +0,0 @@ - -plugins { - id "com.android.application" - // START: FlutterFire Configuration - id 'com.google.gms.google-services' - // END: FlutterFire Configuration - id "kotlin-android" - // The Flutter Gradle Plugin must be applied after the Android and Kotlin Gradle plugins. - id "dev.flutter.flutter-gradle-plugin" -} - -def keystoreProperties = new Properties() -def keystorePropertiesFile = rootProject.file('key.properties') -// Load keystore properties if the file exists -if (keystorePropertiesFile.exists()) { - keystoreProperties.load(new FileInputStream(keystorePropertiesFile)) -} -android { - namespace = "com.mobileapp.store.ride" - compileSdk = 36 - ndkVersion "29.0.14033849" - - compileOptions { - sourceCompatibility = JavaVersion.VERSION_1_8 - targetCompatibility = JavaVersion.VERSION_1_8 - coreLibraryDesugaringEnabled true - } - externalNativeBuild { - cmake { - path "src/main/cpp/CMakeLists.txt" - version "3.22.1" - } - } - - kotlinOptions { - jvmTarget = JavaVersion.VERSION_1_8 - } - sourceSets { - main { - jniLibs.srcDirs = ['src/main/jniLibs'] - } - } - - defaultConfig { - // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). - applicationId = "com.mobileapp.store.ride" - // You can update the following values to match your application needs. - // For more information, see: https://flutter.dev/to/review-gradle-config. - minSdk = 29 - targetSdk = 36 - versionCode 135 - versionName "2.0.135" - multiDexEnabled = true - ndk { - abiFilters "armeabi-v7a", "arm64-v8a" - } - } - - signingConfigs { - release { - // Check if properties are defined before using them - storeFile = keystoreProperties['storeFile'] ? file(keystoreProperties['storeFile']) : null - storePassword = keystoreProperties['storePassword'] - keyAlias = keystoreProperties['keyAlias'] - keyPassword = keystoreProperties['keyPassword'] - } - } - - buildTypes { - release { - signingConfig signingConfigs.release - minifyEnabled true - shrinkResources true - proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' - } - } -} - -flutter { - source = "../.." -} - -dependencies { - implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version" - coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:2.1.5' - implementation "com.stripe:stripe-android:21.4.2" - implementation 'com.stripe:paymentsheet:21.4.2' - implementation 'com.scottyab:rootbeer-lib:0.1.0' - implementation 'com.google.android.gms:play-services-safetynet:18.1.0' -} \ No newline at end of file diff --git a/apps/rider_new/android/app/proguard-rules.pro b/apps/rider_new/android/app/proguard-rules.pro deleted file mode 100644 index 8843bb1..0000000 --- a/apps/rider_new/android/app/proguard-rules.pro +++ /dev/null @@ -1,44 +0,0 @@ -# Suppress warnings for specific Google ML Kit and Stripe classes --dontwarn com.google.mlkit.vision.text.chinese.ChineseTextRecognizerOptions$Builder --dontwarn com.google.mlkit.vision.text.chinese.ChineseTextRecognizerOptions --dontwarn com.google.mlkit.vision.text.devanagari.DevanagariTextRecognizerOptions$Builder --dontwarn com.google.mlkit.vision.text.devanagari.DevanagariTextRecognizerOptions --dontwarn com.google.mlkit.vision.text.japanese.JapaneseTextRecognizerOptions$Builder --dontwarn com.google.mlkit.vision.text.japanese.JapaneseTextRecognizerOptions --dontwarn com.google.mlkit.vision.text.korean.KoreanTextRecognizerOptions$Builder --dontwarn com.google.mlkit.vision.text.korean.KoreanTextRecognizerOptions --dontwarn com.stripe.android.pushProvisioning.PushProvisioningActivity$g --dontwarn com.stripe.android.pushProvisioning.PushProvisioningActivityStarter$Args --dontwarn com.stripe.android.pushProvisioning.PushProvisioningActivityStarter$Error --dontwarn com.stripe.android.pushProvisioning.PushProvisioningActivityStarter --dontwarn com.stripe.android.pushProvisioning.PushProvisioningEphemeralKeyProvider - -# NEW: Add the -dontwarn rules from missing_rules.txt --dontwarn com.stripe.android.view.AddPaymentMethodActivityStarter$Args$Builder --dontwarn com.stripe.android.view.AddPaymentMethodActivityStarter$Args --dontwarn com.stripe.android.view.AddPaymentMethodActivityStarter$Result$Canceled --dontwarn com.stripe.android.view.AddPaymentMethodActivityStarter$Result$Companion --dontwarn com.stripe.android.view.AddPaymentMethodActivityStarter$Result$Failure --dontwarn com.stripe.android.view.AddPaymentMethodActivityStarter$Result$Success --dontwarn com.stripe.android.view.AddPaymentMethodActivityStarter$Result --dontwarn com.stripe.android.view.AddPaymentMethodActivityStarter - -# Keep rules for Google ML Kit --keep class com.google.mlkit.vision.** { *; } --keep class com.google.mlkit.vision.text.** { *; } --keep class com.google.mlkit.vision.text.chinese.ChineseTextRecognizerOptions { *; } --keep class com.google.mlkit.vision.text.chinese.ChineseTextRecognizerOptions$Builder { *; } --keep class com.google.mlkit.vision.text.devanagari.DevanagariTextRecognizerOptions { *; } --keep class com.google.mlkit.vision.text.devanagari.DevanagariTextRecognizerOptions$Builder { *; } --keep class com.google.mlkit.vision.text.japanese.JapaneseTextRecognizerOptions { *; } --keep class com.google.mlkit.vision.text.japanese.JapaneseTextRecognizerOptions$Builder { *; } --keep class com.google.mlkit.vision.text.korean.KoreanTextRecognizerOptions { *; } --keep class com.google.mlkit.vision.text.korean.KoreanTextRecognizerOptions$Builder { *; } - -# Keep rules for Stripe (Use the broad rule - most reliable) --keep class com.stripe.android.** { *; } - -# Keep rule for RootDetection --keep class com.mobileapp.store.ride.RootDetection { - native ; -} \ No newline at end of file diff --git a/apps/rider_new/android/app/src/debug/AndroidManifest.xml b/apps/rider_new/android/app/src/debug/AndroidManifest.xml deleted file mode 100644 index 399f698..0000000 --- a/apps/rider_new/android/app/src/debug/AndroidManifest.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - diff --git a/apps/rider_new/android/app/src/main/AndroidManifest.xml b/apps/rider_new/android/app/src/main/AndroidManifest.xml deleted file mode 100644 index 3908172..0000000 --- a/apps/rider_new/android/app/src/main/AndroidManifest.xml +++ /dev/null @@ -1,85 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/apps/rider_new/android/app/src/main/cpp/CMakeLists.txt b/apps/rider_new/android/app/src/main/cpp/CMakeLists.txt deleted file mode 100644 index 6099f41..0000000 --- a/apps/rider_new/android/app/src/main/cpp/CMakeLists.txt +++ /dev/null @@ -1,8 +0,0 @@ -cmake_minimum_required(VERSION 3.10.2) # Use 3.10.2 for consistency. -project(ride) - -add_library(native-lib SHARED native-lib.cpp) - -find_library(log-lib log) - -target_link_libraries(native-lib ${log-lib}) \ No newline at end of file diff --git a/apps/rider_new/android/app/src/main/cpp/native-lib.cpp b/apps/rider_new/android/app/src/main/cpp/native-lib.cpp deleted file mode 100644 index cd96d10..0000000 --- a/apps/rider_new/android/app/src/main/cpp/native-lib.cpp +++ /dev/null @@ -1,166 +0,0 @@ -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include // Add this line - - -#define LOG_TAG "NativeLib" -#define LOGD(...) __android_log_print(ANDROID_LOG_DEBUG, LOG_TAG, __VA_ARGS__) -#define LOGE(...) __android_log_print(ANDROID_LOG_ERROR, LOG_TAG, __VA_ARGS__) - -// Function to check for common root binaries -bool isRooted() { - std::string paths[] = { - "/system/app/Superuser.apk", - "/system/xbin/su", - "/system/bin/su", - "/system/bin/magisk", - "/system/xbin/magisk", - "/sbin/magisk" - }; - - for (const auto &path : paths) { - std::ifstream file(path); - if (file.good()) { - return true; - } - } - return false; -} - -// Function to check for the presence of files or directories commonly associated with Frida. -bool checkFridaFiles() { - std::string fridaFiles[] = { - "/data/local/tmp/re.frida.server", //Common Frida server path - "/data/local/tmp/frida-server", - "/usr/lib/libfrida-gadget.so", // Frida gadget (injected library) - "/usr/lib64/libfrida-gadget.so", - "/data/local/re.frida.server", - - }; - - for (const auto &path : fridaFiles) { - if (access(path.c_str(), F_OK) != -1) { - LOGE("Frida file detected: %s", path.c_str()); - return true; - } - } - return false; -} - -// Checks for open ports commonly used by Frida. This is less reliable, as ports can be changed. -bool checkFridaPorts() { - int sock = socket(AF_INET, SOCK_STREAM, 0); - if (sock == -1) { - return false; // Couldn't create socket, not a strong indicator. - } - - sockaddr_in sa; - memset(&sa, 0, sizeof(sa)); - sa.sin_family = AF_INET; - sa.sin_port = htons(27042); // Default Frida port - inet_pton(AF_INET, "127.0.0.1", &sa.sin_addr); - - if (connect(sock, (struct sockaddr *)&sa, sizeof(sa)) != -1) { - LOGE("Frida default port (27042) is open."); - close(sock); - return true; - } - - close(sock); - return false; -} - -// Check the maps file of the current process for any suspicious entries. -bool checkMaps() { - std::ifstream mapsFile("/proc/self/maps"); - std::string line; - - if (mapsFile.is_open()) { - while (std::getline(mapsFile, line)) { - // Look for lines that indicate injected libraries, especially Frida. - if (line.find("frida") != std::string::npos || - line.find("gum-js-") != std::string::npos) { // Gum is Frida's JavaScript engine - LOGE("Suspicious entry in /proc/self/maps: %s", line.c_str()); - return true; - } - } - mapsFile.close(); - } else - { - LOGE("Could not open /proc/self/maps"); - return false; - } - return false; -} - -// Check loaded modules. -bool checkLoadedModules() { - bool found = false; - dl_iterate_phdr([](struct dl_phdr_info *info, size_t size, void *data) { - bool *found_ptr = static_cast(data); - if (std::string(info->dlpi_name).find("frida") != std::string::npos) { - LOGE("Frida module detected: %s", info->dlpi_name); - *found_ptr = true; - return 1; // Stop iterating - } - return 0; // Continue iterating - }, &found); - - return found; -} - - -// This is a simple ptrace check. More sophisticated checks are possible (and necessary for robust detection). -//bool checkPtrace() { -// // Attempt to ptrace ourselves. If another process is already tracing us, this will fail. -// if (ptrace(PTRACE_TRACEME, 0, 1, 0) < 0) { -// LOGE("ptrace failed. Debugger or tracer detected."); -// return true; // Likely being traced -// } -// // Detach. If attached, need to detach to not interfere. -// ptrace(PTRACE_DETACH, 0, 0, 0); -// return false; -//} - -extern "C" -JNIEXPORT jboolean JNICALL -Java_com_mobileapp_store_ride_RootDetection_isNativeRooted(JNIEnv *env, jobject /* this */) { - - if (isRooted()) { - return JNI_TRUE; - } - - if (checkFridaFiles()) { - return JNI_TRUE; - } - - if (checkFridaPorts()) { - return JNI_TRUE; - } - if (checkMaps()) { - return JNI_TRUE; - } - - if (checkLoadedModules()) { - return JNI_TRUE; - } - -// if (checkPtrace()) { -// return JNI_TRUE; -// } - - return JNI_FALSE; -} \ No newline at end of file diff --git a/apps/rider_new/android/app/src/main/kotlin/com/mobileapp/store/ride/MainActivity.kt b/apps/rider_new/android/app/src/main/kotlin/com/mobileapp/store/ride/MainActivity.kt deleted file mode 100644 index 66da379..0000000 --- a/apps/rider_new/android/app/src/main/kotlin/com/mobileapp/store/ride/MainActivity.kt +++ /dev/null @@ -1,203 +0,0 @@ -package com.mobileapp.store.ride - -import android.app.AlertDialog -import android.os.Bundle -import android.util.Log -import android.widget.LinearLayout -import android.widget.ProgressBar -import android.widget.TextView -import androidx.core.view.setPadding -import com.scottyab.rootbeer.RootBeer -import io.flutter.embedding.android.FlutterFragmentActivity -import java.io.File -import java.util.Timer -import kotlin.concurrent.schedule -import io.flutter.embedding.engine.FlutterEngine // Import FlutterEngine -import io.flutter.plugin.common.MethodChannel // Import MethodChannel -import io.flutter.plugin.common.MethodCall // Import MethodCall -import io.flutter.plugin.common.MethodChannel.Result // Import Result - - -class MainActivity : FlutterFragmentActivity() { - - private lateinit var channel: MethodChannel // Declare a MethodChannel variable - - override fun configureFlutterEngine(flutterEngine: FlutterEngine) { - super.configureFlutterEngine(flutterEngine) - - // Initialize the MethodChannel - channel = MethodChannel(flutterEngine.dartExecutor.binaryMessenger, "com.mobileapp.store.ride/security") - - // Set a MethodCallHandler to handle method calls from Flutter - channel.setMethodCallHandler { call, result -> - when (call.method) { - "isNativeRooted" -> { - val isCompromised = isDeviceCompromised() - result.success(isCompromised) // Send the result back to Flutter - } - else -> { - result.notImplemented() // Handle unknown method calls - } - } - } - } - - - override fun onCreate(savedInstanceState: Bundle?) { - super.onCreate(savedInstanceState) - - // Perform all checks. The order can matter; you might want to prioritize - // the faster checks first. - if (isDeviceCompromised()) { - showSecurityWarningDialog() - } - } - - private fun isDeviceCompromised(): Boolean { - return try { - nativeRootCheck() || rootBeerCheck() //|| !safetyNetCheck() - } catch (e: Exception) { - Log.e("DEBUG", "Error during security checks: ${e.message}", e) - true // Consider the device compromised on error - } - } - - private fun nativeRootCheck(): Boolean { - Log.d("DEBUG", "Starting native root detection...") - return try { - val isNativeRooted = RootDetection.isNativeRooted() - Log.d("DEBUG", "Native root detection result: $isNativeRooted") - isNativeRooted - } catch (e: Exception) { - Log.e("DEBUG", "Error in native root detection: ${e.message}", e) - true // Consider rooted on exception - } - } - - private fun rootBeerCheck(): Boolean { - Log.d("DEBUG", "Starting RootBeer root detection...") - val rootBeer = RootBeer(this) - val isRooted = rootBeer.isRooted - Log.d("DEBUG", "RootBeer detection result: $isRooted") - return isRooted - } - - private fun safetyNetCheck(): Boolean { - Log.d("DEBUG", "Starting SafetyNet check...") - var isSafe = false // Initialize a variable to store result - val semaphore = java.util.concurrent.Semaphore(0) // Create a semaphore - - SafetyNetCheck.checkSafetyNet(this, getString(R.string.api_key_safety)) { result -> - isSafe = result - Log.d("DEBUG", "SafetyNet check result: $isSafe") - semaphore.release() // Release the semaphore when the callback is executed - } - - try { - semaphore.acquire() // Wait for the callback to complete - } catch (e: InterruptedException) { - Log.e("DEBUG", "Interrupted while waiting for SafetyNet check", e) - return false // Or handle as appropriate for your app - } - return isSafe - } - - private fun showSecurityWarningDialog() { - var secondsRemaining = 10 // Start at 10 seconds - - // Create views programmatically - val progressBar = ProgressBar(this, null, android.R.attr.progressBarStyleHorizontal) - progressBar.max = 10 // Set max to 10 for 10 seconds - progressBar.progress = 10 // Start full - val textView = TextView(this) - textView.text = getString(R.string.security_warning_message) // Your message - textView.textAlignment = TextView.TEXT_ALIGNMENT_CENTER - - val layout = LinearLayout(this) - layout.orientation = LinearLayout.VERTICAL - layout.setPadding(48) - layout.addView(textView) - layout.addView(progressBar) - - val dialog = - AlertDialog.Builder(this) - .setTitle(getString(R.string.security_warning_title)) // Your title - .setView(layout) // Set the custom layout - .setCancelable( - false - ) // Prevent dismissing by tapping outside or back button - .create() - - dialog.show() - - // Use a Timer to update the progress bar and countdown - val timer = Timer() - timer.schedule(0, 1000) { // Update every 1000ms (1 second) - secondsRemaining-- - runOnUiThread { // Update UI on the main thread - progressBar.progress = - secondsRemaining // Set the progress bar to show remaining seconds - if (secondsRemaining <= 0) { - timer.cancel() // Stop the timer - dialog.dismiss() // Dismiss the dialog - clearAppDataAndExit() // Clear data and exit - } - } - } - } - - private fun clearAppDataAndExit() { - try { - val packageName = applicationContext.packageName - val runtime = Runtime.getRuntime() - runtime.exec("pm clear $packageName") // Clear app data - } catch (e: Exception) { - clearCache() - clearAppData() - } - - finishAffinity() // Finish all activities from this app - System.exit(0) // Terminate the app's process - } - - private fun clearCache() { - try { - val cacheDir = cacheDir - if (cacheDir != null && cacheDir.isDirectory) { - deleteDir(cacheDir) - } - val externalCacheDir = externalCacheDir - if (externalCacheDir != null && externalCacheDir.isDirectory) { - deleteDir(externalCacheDir) - } - } catch (e: Exception) { - Log.e("DEBUG", "Error clearing cache: ${e.message}", e) - } - } - - private fun clearAppData() { - try { - val dataDir = applicationContext.dataDir - if (dataDir != null && dataDir.isDirectory) { - deleteDir(dataDir) - } - } catch (e: Exception) { - Log.e("DEBUG", "Error clearing app data: ${e.message}", e) - } - } - - private fun deleteDir(dir: File?): Boolean { - if (dir != null && dir.isDirectory) { - val children = dir.list() - if (children != null) { - for (child in children) { - val success = deleteDir(File(dir, child)) - if (!success) { - return false - } - } - } - } - return dir?.delete() ?: false - } -} \ No newline at end of file diff --git a/apps/rider_new/android/app/src/main/kotlin/com/mobileapp/store/ride/RootDetection.kt b/apps/rider_new/android/app/src/main/kotlin/com/mobileapp/store/ride/RootDetection.kt deleted file mode 100644 index 98fbc9a..0000000 --- a/apps/rider_new/android/app/src/main/kotlin/com/mobileapp/store/ride/RootDetection.kt +++ /dev/null @@ -1,9 +0,0 @@ -package com.mobileapp.store.ride - -object RootDetection { - init { - System.loadLibrary("native-lib") // Load the native library - } - - external fun isNativeRooted(): Boolean // Declare the external function -} diff --git a/apps/rider_new/android/app/src/main/kotlin/com/mobileapp/store/ride/SafetyNetCheck.kt b/apps/rider_new/android/app/src/main/kotlin/com/mobileapp/store/ride/SafetyNetCheck.kt deleted file mode 100644 index 1b8593b..0000000 --- a/apps/rider_new/android/app/src/main/kotlin/com/mobileapp/store/ride/SafetyNetCheck.kt +++ /dev/null @@ -1,109 +0,0 @@ -import android.content.Context -import android.util.Base64 -import android.util.Log -import com.google.android.gms.safetynet.SafetyNet -import com.google.android.gms.safetynet.SafetyNetApi -import com.google.android.gms.tasks.OnFailureListener -import com.google.android.gms.tasks.OnSuccessListener -import org.json.JSONObject -import java.io.IOException -import java.security.GeneralSecurityException -import java.security.SecureRandom -import java.util.Arrays - -object SafetyNetCheck { - - private const val TAG = "SafetyNetCheck" - - fun checkSafetyNet(context: Context, apiKey: String, callback: (Boolean) -> Unit) { - // Generate a nonce. A good nonce is large, random, and used only once. - val nonce = generateNonce() - - SafetyNet.getClient(context).attest(nonce, apiKey) - .addOnSuccessListener { response -> - // Success! Now, *verify* the response. - val jwsResult = response.jwsResult - if (jwsResult != null) { - try { - val isSafe = SafetyNetResponseVerifier.verify(jwsResult) - Log.d(TAG, "SafetyNet verification result: $isSafe") - callback(isSafe) // Now passing a *verified* result. - } catch (e: Exception) { - Log.e(TAG, "Error verifying SafetyNet response: ${e.message}", e) - callback(false) // Treat verification errors as failures. - } - } else { - Log.e(TAG, "SafetyNet jwsResult is null") - callback(false) // Null result is a failure. - } - } - .addOnFailureListener { e -> - Log.e(TAG, "SafetyNet attest API call failed: ${e.message}", e) - callback(false) // API call failure. - } - } - - - // Helper function to generate a nonce. - private fun generateNonce(): ByteArray { - val byteGenerator = SecureRandom() - val nonce = ByteArray(32) - byteGenerator.nextBytes(nonce) - return nonce - } -} - - - -// Helper class to verify the SafetyNet response. -object SafetyNetResponseVerifier { - - private const val TAG = "SafetyNetVerifier" - - // This method *must* be implemented on a *backend server* for real security. - // This is just a *simplified example* for demonstration purposes and is - // *not* suitable for production without a backend check. - @Throws(GeneralSecurityException::class, IOException::class) - fun verify(jwsResult: String): Boolean { - // 1. Parse the JWS: Split into header, payload, and signature. - val parts = jwsResult.split(".") - if (parts.size != 3) { - Log.e(TAG, "Invalid JWS format") - return false // Invalid JWS format - } - - val header = parts[0] - val payload = parts[1] - val signature = parts[2] - - // 2. Decode the payload (it's Base64 encoded). - val decodedPayload = Base64.decode(payload, Base64.DEFAULT) - val payloadJson = JSONObject(String(decodedPayload)) - - // 3. Check the ctsProfileMatch and basicIntegrity. - val ctsProfileMatch = payloadJson.optBoolean("ctsProfileMatch", false) - val basicIntegrity = payloadJson.optBoolean("basicIntegrity", false) - - Log.d(TAG, "ctsProfileMatch: $ctsProfileMatch, basicIntegrity: $basicIntegrity") - - // 4. **CRITICAL: In a real application, you *must* send the JWS to your - // backend server for verification. The server should use the - // Google SafetyNet API (or a library that wraps it) to verify - // the signature and check the fields. This prevents attackers - // from tampering with the response on the device.** - // - // // Example (pseudo-code) of what the backend check would do: - // // GoogleCredential credential = ...; - // // SafetyNet safetyNet = new SafetyNet.Builder(httpTransport, jsonFactory) - // // .setApplicationName("YourAppName") - // // .setHttpRequestInitializer(credential) - // // .build(); - // // SafetyNetApi.VerifyJwsRequest request = safetyNet.safetynet().verifyJws(jwsResult); - // // SafetyNetApi.VerifyJwsResponse response = request.execute(); - // // return response.isValidSignature() && response.getCtsProfileMatch() && response.getBasicIntegrity(); - - // 5. For this *example* (without a backend), we'll just check the fields. - // This is *NOT SECURE* for production! - return ctsProfileMatch && basicIntegrity - } -} \ No newline at end of file diff --git a/apps/rider_new/android/app/src/main/res/drawable-hdpi/android12splash.png b/apps/rider_new/android/app/src/main/res/drawable-hdpi/android12splash.png deleted file mode 100644 index 05b0cb9..0000000 Binary files a/apps/rider_new/android/app/src/main/res/drawable-hdpi/android12splash.png and /dev/null differ diff --git a/apps/rider_new/android/app/src/main/res/drawable-hdpi/splash.png b/apps/rider_new/android/app/src/main/res/drawable-hdpi/splash.png deleted file mode 100644 index 05b0cb9..0000000 Binary files a/apps/rider_new/android/app/src/main/res/drawable-hdpi/splash.png and /dev/null differ diff --git a/apps/rider_new/android/app/src/main/res/drawable-mdpi/android12splash.png b/apps/rider_new/android/app/src/main/res/drawable-mdpi/android12splash.png deleted file mode 100644 index 6694368..0000000 Binary files a/apps/rider_new/android/app/src/main/res/drawable-mdpi/android12splash.png and /dev/null differ diff --git a/apps/rider_new/android/app/src/main/res/drawable-mdpi/splash.png b/apps/rider_new/android/app/src/main/res/drawable-mdpi/splash.png deleted file mode 100644 index 6694368..0000000 Binary files a/apps/rider_new/android/app/src/main/res/drawable-mdpi/splash.png and /dev/null differ diff --git a/apps/rider_new/android/app/src/main/res/drawable-night-hdpi/android12splash.png b/apps/rider_new/android/app/src/main/res/drawable-night-hdpi/android12splash.png deleted file mode 100644 index 05b0cb9..0000000 Binary files a/apps/rider_new/android/app/src/main/res/drawable-night-hdpi/android12splash.png and /dev/null differ diff --git a/apps/rider_new/android/app/src/main/res/drawable-night-mdpi/android12splash.png b/apps/rider_new/android/app/src/main/res/drawable-night-mdpi/android12splash.png deleted file mode 100644 index 6694368..0000000 Binary files a/apps/rider_new/android/app/src/main/res/drawable-night-mdpi/android12splash.png and /dev/null differ diff --git a/apps/rider_new/android/app/src/main/res/drawable-night-xhdpi/android12splash.png b/apps/rider_new/android/app/src/main/res/drawable-night-xhdpi/android12splash.png deleted file mode 100644 index 769f7c4..0000000 Binary files a/apps/rider_new/android/app/src/main/res/drawable-night-xhdpi/android12splash.png and /dev/null differ diff --git a/apps/rider_new/android/app/src/main/res/drawable-night-xxhdpi/android12splash.png b/apps/rider_new/android/app/src/main/res/drawable-night-xxhdpi/android12splash.png deleted file mode 100644 index 5fd14db..0000000 Binary files a/apps/rider_new/android/app/src/main/res/drawable-night-xxhdpi/android12splash.png and /dev/null differ diff --git a/apps/rider_new/android/app/src/main/res/drawable-night-xxxhdpi/android12splash.png b/apps/rider_new/android/app/src/main/res/drawable-night-xxxhdpi/android12splash.png deleted file mode 100644 index 1c91252..0000000 Binary files a/apps/rider_new/android/app/src/main/res/drawable-night-xxxhdpi/android12splash.png and /dev/null differ diff --git a/apps/rider_new/android/app/src/main/res/drawable-v21/background.png b/apps/rider_new/android/app/src/main/res/drawable-v21/background.png deleted file mode 100644 index 8e21404..0000000 Binary files a/apps/rider_new/android/app/src/main/res/drawable-v21/background.png and /dev/null differ diff --git a/apps/rider_new/android/app/src/main/res/drawable-v21/launch_background.xml b/apps/rider_new/android/app/src/main/res/drawable-v21/launch_background.xml deleted file mode 100644 index 3cc4948..0000000 --- a/apps/rider_new/android/app/src/main/res/drawable-v21/launch_background.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - - - diff --git a/apps/rider_new/android/app/src/main/res/drawable-xhdpi/android12splash.png b/apps/rider_new/android/app/src/main/res/drawable-xhdpi/android12splash.png deleted file mode 100644 index 769f7c4..0000000 Binary files a/apps/rider_new/android/app/src/main/res/drawable-xhdpi/android12splash.png and /dev/null differ diff --git a/apps/rider_new/android/app/src/main/res/drawable-xhdpi/splash.png b/apps/rider_new/android/app/src/main/res/drawable-xhdpi/splash.png deleted file mode 100644 index 769f7c4..0000000 Binary files a/apps/rider_new/android/app/src/main/res/drawable-xhdpi/splash.png and /dev/null differ diff --git a/apps/rider_new/android/app/src/main/res/drawable-xxhdpi/android12splash.png b/apps/rider_new/android/app/src/main/res/drawable-xxhdpi/android12splash.png deleted file mode 100644 index 5fd14db..0000000 Binary files a/apps/rider_new/android/app/src/main/res/drawable-xxhdpi/android12splash.png and /dev/null differ diff --git a/apps/rider_new/android/app/src/main/res/drawable-xxhdpi/splash.png b/apps/rider_new/android/app/src/main/res/drawable-xxhdpi/splash.png deleted file mode 100644 index 5fd14db..0000000 Binary files a/apps/rider_new/android/app/src/main/res/drawable-xxhdpi/splash.png and /dev/null differ diff --git a/apps/rider_new/android/app/src/main/res/drawable-xxxhdpi/android12splash.png b/apps/rider_new/android/app/src/main/res/drawable-xxxhdpi/android12splash.png deleted file mode 100644 index 1c91252..0000000 Binary files a/apps/rider_new/android/app/src/main/res/drawable-xxxhdpi/android12splash.png and /dev/null differ diff --git a/apps/rider_new/android/app/src/main/res/drawable-xxxhdpi/splash.png b/apps/rider_new/android/app/src/main/res/drawable-xxxhdpi/splash.png deleted file mode 100644 index 1c91252..0000000 Binary files a/apps/rider_new/android/app/src/main/res/drawable-xxxhdpi/splash.png and /dev/null differ diff --git a/apps/rider_new/android/app/src/main/res/drawable/app_icon.png b/apps/rider_new/android/app/src/main/res/drawable/app_icon.png deleted file mode 100644 index ab0309f..0000000 Binary files a/apps/rider_new/android/app/src/main/res/drawable/app_icon.png and /dev/null differ diff --git a/apps/rider_new/android/app/src/main/res/drawable/background.png b/apps/rider_new/android/app/src/main/res/drawable/background.png deleted file mode 100644 index 8e21404..0000000 Binary files a/apps/rider_new/android/app/src/main/res/drawable/background.png and /dev/null differ diff --git a/apps/rider_new/android/app/src/main/res/drawable/icon_share.png b/apps/rider_new/android/app/src/main/res/drawable/icon_share.png deleted file mode 100644 index ae92be6..0000000 Binary files a/apps/rider_new/android/app/src/main/res/drawable/icon_share.png and /dev/null differ diff --git a/apps/rider_new/android/app/src/main/res/drawable/icon_support.png b/apps/rider_new/android/app/src/main/res/drawable/icon_support.png deleted file mode 100644 index 5a9fef9..0000000 Binary files a/apps/rider_new/android/app/src/main/res/drawable/icon_support.png and /dev/null differ diff --git a/apps/rider_new/android/app/src/main/res/drawable/icon_user.png b/apps/rider_new/android/app/src/main/res/drawable/icon_user.png deleted file mode 100644 index c8802f2..0000000 Binary files a/apps/rider_new/android/app/src/main/res/drawable/icon_user.png and /dev/null differ diff --git a/apps/rider_new/android/app/src/main/res/drawable/icon_wallet.png b/apps/rider_new/android/app/src/main/res/drawable/icon_wallet.png deleted file mode 100644 index 551f8a4..0000000 Binary files a/apps/rider_new/android/app/src/main/res/drawable/icon_wallet.png and /dev/null differ diff --git a/apps/rider_new/android/app/src/main/res/drawable/launch_background.xml b/apps/rider_new/android/app/src/main/res/drawable/launch_background.xml deleted file mode 100644 index 3cc4948..0000000 --- a/apps/rider_new/android/app/src/main/res/drawable/launch_background.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - - - diff --git a/apps/rider_new/android/app/src/main/res/mipmap-hdpi/launcher_icon.png b/apps/rider_new/android/app/src/main/res/mipmap-hdpi/launcher_icon.png deleted file mode 100644 index 5f35220..0000000 Binary files a/apps/rider_new/android/app/src/main/res/mipmap-hdpi/launcher_icon.png and /dev/null differ diff --git a/apps/rider_new/android/app/src/main/res/mipmap-mdpi/launcher_icon.png b/apps/rider_new/android/app/src/main/res/mipmap-mdpi/launcher_icon.png deleted file mode 100644 index 3a2be81..0000000 Binary files a/apps/rider_new/android/app/src/main/res/mipmap-mdpi/launcher_icon.png and /dev/null differ diff --git a/apps/rider_new/android/app/src/main/res/mipmap-xhdpi/launcher_icon.png b/apps/rider_new/android/app/src/main/res/mipmap-xhdpi/launcher_icon.png deleted file mode 100644 index 2165361..0000000 Binary files a/apps/rider_new/android/app/src/main/res/mipmap-xhdpi/launcher_icon.png and /dev/null differ diff --git a/apps/rider_new/android/app/src/main/res/mipmap-xxhdpi/launcher_icon.png b/apps/rider_new/android/app/src/main/res/mipmap-xxhdpi/launcher_icon.png deleted file mode 100644 index 7514dfe..0000000 Binary files a/apps/rider_new/android/app/src/main/res/mipmap-xxhdpi/launcher_icon.png and /dev/null differ diff --git a/apps/rider_new/android/app/src/main/res/mipmap-xxxhdpi/launcher_icon.png b/apps/rider_new/android/app/src/main/res/mipmap-xxxhdpi/launcher_icon.png deleted file mode 100644 index 8df33f2..0000000 Binary files a/apps/rider_new/android/app/src/main/res/mipmap-xxxhdpi/launcher_icon.png and /dev/null differ diff --git a/apps/rider_new/android/app/src/main/res/raw/app_icon.png b/apps/rider_new/android/app/src/main/res/raw/app_icon.png deleted file mode 100644 index 96cc55a..0000000 Binary files a/apps/rider_new/android/app/src/main/res/raw/app_icon.png and /dev/null differ diff --git a/apps/rider_new/android/app/src/main/res/raw/cancel.wav b/apps/rider_new/android/app/src/main/res/raw/cancel.wav deleted file mode 100644 index dbe6e7c..0000000 Binary files a/apps/rider_new/android/app/src/main/res/raw/cancel.wav and /dev/null differ diff --git a/apps/rider_new/android/app/src/main/res/raw/ding.wav b/apps/rider_new/android/app/src/main/res/raw/ding.wav deleted file mode 100644 index c53cd50..0000000 Binary files a/apps/rider_new/android/app/src/main/res/raw/ding.wav and /dev/null differ diff --git a/apps/rider_new/android/app/src/main/res/raw/promo.wav b/apps/rider_new/android/app/src/main/res/raw/promo.wav deleted file mode 100644 index 3bb2d03..0000000 Binary files a/apps/rider_new/android/app/src/main/res/raw/promo.wav and /dev/null differ diff --git a/apps/rider_new/android/app/src/main/res/raw/start.wav b/apps/rider_new/android/app/src/main/res/raw/start.wav deleted file mode 100644 index 0655506..0000000 Binary files a/apps/rider_new/android/app/src/main/res/raw/start.wav and /dev/null differ diff --git a/apps/rider_new/android/app/src/main/res/raw/tone1.mp3 b/apps/rider_new/android/app/src/main/res/raw/tone1.mp3 deleted file mode 100644 index e32e61b..0000000 Binary files a/apps/rider_new/android/app/src/main/res/raw/tone1.mp3 and /dev/null differ diff --git a/apps/rider_new/android/app/src/main/res/raw/tone2.wav b/apps/rider_new/android/app/src/main/res/raw/tone2.wav deleted file mode 100644 index 0582d47..0000000 Binary files a/apps/rider_new/android/app/src/main/res/raw/tone2.wav and /dev/null differ diff --git a/apps/rider_new/android/app/src/main/res/values-ar/strings.xml b/apps/rider_new/android/app/src/main/res/values-ar/strings.xml deleted file mode 100644 index 6b7cb35..0000000 --- a/apps/rider_new/android/app/src/main/res/values-ar/strings.xml +++ /dev/null @@ -1,6 +0,0 @@ - - تحذير أمني - تم اكتشاف مشكلة أمنية أو تعديل على هذا الجهاز. لا يمكن تشغيل التطبيق على هذا الجهاز. - إغلاق التطبيق - الجهاز آمن. الاستمرار بشكل طبيعي. - \ No newline at end of file diff --git a/apps/rider_new/android/app/src/main/res/values-night-v31/styles.xml b/apps/rider_new/android/app/src/main/res/values-night-v31/styles.xml deleted file mode 100644 index 1b8e45f..0000000 --- a/apps/rider_new/android/app/src/main/res/values-night-v31/styles.xml +++ /dev/null @@ -1,22 +0,0 @@ - - - - - - - diff --git a/apps/rider_new/android/app/src/main/res/values-night/styles.xml b/apps/rider_new/android/app/src/main/res/values-night/styles.xml deleted file mode 100644 index 90b2656..0000000 --- a/apps/rider_new/android/app/src/main/res/values-night/styles.xml +++ /dev/null @@ -1,24 +0,0 @@ - - - - - - - - - diff --git a/apps/rider_new/android/app/src/main/res/values-v31/styles.xml b/apps/rider_new/android/app/src/main/res/values-v31/styles.xml deleted file mode 100644 index 8012d02..0000000 --- a/apps/rider_new/android/app/src/main/res/values-v31/styles.xml +++ /dev/null @@ -1,22 +0,0 @@ - - - - - - - diff --git a/apps/rider_new/android/app/src/main/res/values/strings.xml b/apps/rider_new/android/app/src/main/res/values/strings.xml deleted file mode 100644 index 6bf8cf7..0000000 --- a/apps/rider_new/android/app/src/main/res/values/strings.xml +++ /dev/null @@ -1,15 +0,0 @@ - - My App - - - high_importance_channel - AIzaSyCyfwRXTwSTLOFQSQgN5p7QZgGJVZnEKq0 - Security Warning - AIzaSyB04YNW3LbvmQ5lX1t2bOwEU18-KUoovzw - - A security issue or modification has been detected on - this device. The app cannot run on this device. - Exit App - Device is secure. Proceeding normally. - - \ No newline at end of file diff --git a/apps/rider_new/android/app/src/main/res/values/styles.xml b/apps/rider_new/android/app/src/main/res/values/styles.xml deleted file mode 100644 index ec51116..0000000 --- a/apps/rider_new/android/app/src/main/res/values/styles.xml +++ /dev/null @@ -1,24 +0,0 @@ - - - - - - - - - diff --git a/apps/rider_new/android/app/src/profile/AndroidManifest.xml b/apps/rider_new/android/app/src/profile/AndroidManifest.xml deleted file mode 100644 index 399f698..0000000 --- a/apps/rider_new/android/app/src/profile/AndroidManifest.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - diff --git a/apps/rider_new/android/build.gradle b/apps/rider_new/android/build.gradle deleted file mode 100644 index e3d1a86..0000000 --- a/apps/rider_new/android/build.gradle +++ /dev/null @@ -1,37 +0,0 @@ -buildscript { - ext.kotlin_version = '1.9.10' - repositories { - google() - mavenCentral() - } - - dependencies { - // START: FlutterFire Configuration -// classpath 'com.google.gms:google-services:4.4.2' -// // END: FlutterFire Configuration -// classpath 'com.android.tools.build:gradle:7.3.1' - classpath 'com.google.gms:google-services:4.3.15' - // END: FlutterFire Configuration - classpath 'com.android.tools.build:gradle:8.8.0' - classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" - } -} - -allprojects { - repositories { - google() - mavenCentral() - } -} - -rootProject.buildDir = '../build' -subprojects { - project.buildDir = "${rootProject.buildDir}/${project.name}" -} -subprojects { - project.evaluationDependsOn(':app') -} - -tasks.register("clean", Delete) { - delete rootProject.buildDir -} diff --git a/apps/rider_new/android/gradle/wrapper/gradle-wrapper.properties b/apps/rider_new/android/gradle/wrapper/gradle-wrapper.properties deleted file mode 100644 index 8970476..0000000 --- a/apps/rider_new/android/gradle/wrapper/gradle-wrapper.properties +++ /dev/null @@ -1,7 +0,0 @@ -#Thu Aug 03 17:06:53 EET 2023 -distributionBase=GRADLE_USER_HOME -# distributionUrl=https\://services.gradle.org/distributions/gradle-7.4.2-bin.zip -distributionPath=wrapper/dists -zipStorePath=wrapper/dists -zipStoreBase=GRADLE_USER_HOME -distributionUrl=https\://services.gradle.org/distributions/gradle-8.13-bin.zip \ No newline at end of file diff --git a/apps/rider_new/android/settings.gradle b/apps/rider_new/android/settings.gradle deleted file mode 100644 index 05abf8b..0000000 --- a/apps/rider_new/android/settings.gradle +++ /dev/null @@ -1,28 +0,0 @@ -pluginManagement { - def flutterSdkPath = { - def properties = new Properties() - file("local.properties").withInputStream { properties.load(it) } - def flutterSdkPath = properties.getProperty("flutter.sdk") - assert flutterSdkPath != null, "flutter.sdk not set in local.properties" - return flutterSdkPath - }() - - includeBuild("$flutterSdkPath/packages/flutter_tools/gradle") - - repositories { - google() - mavenCentral() - gradlePluginPortal() - } -} - -plugins { - id "dev.flutter.flutter-plugin-loader" version "1.0.0" - id "com.android.application" version '8.13.0' apply false - // START: FlutterFire Configuration - id "com.google.gms.google-services" version "4.3.10" apply false - // END: FlutterFire Configuration - id "org.jetbrains.kotlin.android" version "2.2.20" apply false -} - -include ":app" diff --git a/apps/rider_new/assets/fonts/IBMPlexSansArabic-Bold.ttf b/apps/rider_new/assets/fonts/IBMPlexSansArabic-Bold.ttf deleted file mode 100644 index d67d9e8..0000000 Binary files a/apps/rider_new/assets/fonts/IBMPlexSansArabic-Bold.ttf and /dev/null differ diff --git a/apps/rider_new/assets/fonts/IBMPlexSansArabic-Medium.ttf b/apps/rider_new/assets/fonts/IBMPlexSansArabic-Medium.ttf deleted file mode 100644 index 09ec8da..0000000 Binary files a/apps/rider_new/assets/fonts/IBMPlexSansArabic-Medium.ttf and /dev/null differ diff --git a/apps/rider_new/assets/fonts/IBMPlexSansArabic-Regular.ttf b/apps/rider_new/assets/fonts/IBMPlexSansArabic-Regular.ttf deleted file mode 100644 index 5e19284..0000000 Binary files a/apps/rider_new/assets/fonts/IBMPlexSansArabic-Regular.ttf and /dev/null differ diff --git a/apps/rider_new/assets/fonts/IBMPlexSansArabic-SemiBold.ttf b/apps/rider_new/assets/fonts/IBMPlexSansArabic-SemiBold.ttf deleted file mode 100644 index 6b48c75..0000000 Binary files a/apps/rider_new/assets/fonts/IBMPlexSansArabic-SemiBold.ttf and /dev/null differ diff --git a/apps/rider_new/assets/fonts/Inter-Bold.ttf b/apps/rider_new/assets/fonts/Inter-Bold.ttf deleted file mode 100644 index 15e908f..0000000 Binary files a/apps/rider_new/assets/fonts/Inter-Bold.ttf and /dev/null differ diff --git a/apps/rider_new/assets/fonts/Inter-Medium.ttf b/apps/rider_new/assets/fonts/Inter-Medium.ttf deleted file mode 100644 index 9342730..0000000 Binary files a/apps/rider_new/assets/fonts/Inter-Medium.ttf and /dev/null differ diff --git a/apps/rider_new/assets/fonts/Inter-Regular.ttf b/apps/rider_new/assets/fonts/Inter-Regular.ttf deleted file mode 100644 index c544be4..0000000 Binary files a/apps/rider_new/assets/fonts/Inter-Regular.ttf and /dev/null differ diff --git a/apps/rider_new/assets/fonts/Inter-SemiBold.ttf b/apps/rider_new/assets/fonts/Inter-SemiBold.ttf deleted file mode 100644 index a32e2b8..0000000 Binary files a/apps/rider_new/assets/fonts/Inter-SemiBold.ttf and /dev/null differ diff --git a/apps/rider_new/assets/fonts/digit.ttf b/apps/rider_new/assets/fonts/digit.ttf deleted file mode 100644 index 5dbe6f9..0000000 Binary files a/apps/rider_new/assets/fonts/digit.ttf and /dev/null differ diff --git a/apps/rider_new/assets/fonts/josefin.ttf b/apps/rider_new/assets/fonts/josefin.ttf deleted file mode 100644 index 98deb67..0000000 Binary files a/apps/rider_new/assets/fonts/josefin.ttf and /dev/null differ diff --git a/apps/rider_new/assets/fonts/mohanad.ttf b/apps/rider_new/assets/fonts/mohanad.ttf deleted file mode 100644 index 854341c..0000000 Binary files a/apps/rider_new/assets/fonts/mohanad.ttf and /dev/null differ diff --git a/apps/rider_new/assets/images/2.png b/apps/rider_new/assets/images/2.png deleted file mode 100644 index 7567e84..0000000 Binary files a/apps/rider_new/assets/images/2.png and /dev/null differ diff --git a/apps/rider_new/assets/images/A.png b/apps/rider_new/assets/images/A.png deleted file mode 100644 index 246b9d2..0000000 Binary files a/apps/rider_new/assets/images/A.png and /dev/null differ diff --git a/apps/rider_new/assets/images/b.png b/apps/rider_new/assets/images/b.png deleted file mode 100644 index b22f96c..0000000 Binary files a/apps/rider_new/assets/images/b.png and /dev/null differ diff --git a/apps/rider_new/assets/images/balash.png b/apps/rider_new/assets/images/balash.png deleted file mode 100644 index 84977a2..0000000 Binary files a/apps/rider_new/assets/images/balash.png and /dev/null differ diff --git a/apps/rider_new/assets/images/blob.png b/apps/rider_new/assets/images/blob.png deleted file mode 100644 index e45e42c..0000000 Binary files a/apps/rider_new/assets/images/blob.png and /dev/null differ diff --git a/apps/rider_new/assets/images/brand.png b/apps/rider_new/assets/images/brand.png deleted file mode 100644 index 9282720..0000000 Binary files a/apps/rider_new/assets/images/brand.png and /dev/null differ diff --git a/apps/rider_new/assets/images/bus.png b/apps/rider_new/assets/images/bus.png deleted file mode 100644 index a1e3958..0000000 Binary files a/apps/rider_new/assets/images/bus.png and /dev/null differ diff --git a/apps/rider_new/assets/images/car.png b/apps/rider_new/assets/images/car.png deleted file mode 100644 index b078ecc..0000000 Binary files a/apps/rider_new/assets/images/car.png and /dev/null differ diff --git a/apps/rider_new/assets/images/car3.png b/apps/rider_new/assets/images/car3.png deleted file mode 100644 index 41627ae..0000000 Binary files a/apps/rider_new/assets/images/car3.png and /dev/null differ diff --git a/apps/rider_new/assets/images/carspeed.png b/apps/rider_new/assets/images/carspeed.png deleted file mode 100644 index b8b2d37..0000000 Binary files a/apps/rider_new/assets/images/carspeed.png and /dev/null differ diff --git a/apps/rider_new/assets/images/cashMTN.png b/apps/rider_new/assets/images/cashMTN.png deleted file mode 100644 index bae958b..0000000 Binary files a/apps/rider_new/assets/images/cashMTN.png and /dev/null differ diff --git a/apps/rider_new/assets/images/education.png b/apps/rider_new/assets/images/education.png deleted file mode 100644 index fcadd1b..0000000 Binary files a/apps/rider_new/assets/images/education.png and /dev/null differ diff --git a/apps/rider_new/assets/images/electric.png b/apps/rider_new/assets/images/electric.png deleted file mode 100644 index b2889b8..0000000 Binary files a/apps/rider_new/assets/images/electric.png and /dev/null differ diff --git a/apps/rider_new/assets/images/electric_car.jpg b/apps/rider_new/assets/images/electric_car.jpg deleted file mode 100644 index b57b770..0000000 Binary files a/apps/rider_new/assets/images/electric_car.jpg and /dev/null differ diff --git a/apps/rider_new/assets/images/employmentType.png b/apps/rider_new/assets/images/employmentType.png deleted file mode 100644 index 8fdcf14..0000000 Binary files a/apps/rider_new/assets/images/employmentType.png and /dev/null differ diff --git a/apps/rider_new/assets/images/freeRide.png b/apps/rider_new/assets/images/freeRide.png deleted file mode 100644 index 0667d42..0000000 Binary files a/apps/rider_new/assets/images/freeRide.png and /dev/null differ diff --git a/apps/rider_new/assets/images/gender.png b/apps/rider_new/assets/images/gender.png deleted file mode 100644 index 134dccb..0000000 Binary files a/apps/rider_new/assets/images/gender.png and /dev/null differ diff --git a/apps/rider_new/assets/images/jeep.png b/apps/rider_new/assets/images/jeep.png deleted file mode 100644 index 8f1cbf3..0000000 Binary files a/apps/rider_new/assets/images/jeep.png and /dev/null differ diff --git a/apps/rider_new/assets/images/lady.png b/apps/rider_new/assets/images/lady.png deleted file mode 100644 index 76277fe..0000000 Binary files a/apps/rider_new/assets/images/lady.png and /dev/null differ diff --git a/apps/rider_new/assets/images/lady1.png b/apps/rider_new/assets/images/lady1.png deleted file mode 100644 index 2797b75..0000000 Binary files a/apps/rider_new/assets/images/lady1.png and /dev/null differ diff --git a/apps/rider_new/assets/images/login_hero.png b/apps/rider_new/assets/images/login_hero.png deleted file mode 100644 index 34bd669..0000000 Binary files a/apps/rider_new/assets/images/login_hero.png and /dev/null differ diff --git a/apps/rider_new/assets/images/logo.gif b/apps/rider_new/assets/images/logo.gif deleted file mode 100644 index 6bb621e..0000000 Binary files a/apps/rider_new/assets/images/logo.gif and /dev/null differ diff --git a/apps/rider_new/assets/images/logo.png b/apps/rider_new/assets/images/logo.png deleted file mode 100644 index 34bd669..0000000 Binary files a/apps/rider_new/assets/images/logo.png and /dev/null differ diff --git a/apps/rider_new/assets/images/maritalStatus.png b/apps/rider_new/assets/images/maritalStatus.png deleted file mode 100644 index 121d555..0000000 Binary files a/apps/rider_new/assets/images/maritalStatus.png and /dev/null differ diff --git a/apps/rider_new/assets/images/moto.png b/apps/rider_new/assets/images/moto.png deleted file mode 100644 index 8257812..0000000 Binary files a/apps/rider_new/assets/images/moto.png and /dev/null differ diff --git a/apps/rider_new/assets/images/moto1.png b/apps/rider_new/assets/images/moto1.png deleted file mode 100644 index 80322db..0000000 Binary files a/apps/rider_new/assets/images/moto1.png and /dev/null differ diff --git a/apps/rider_new/assets/images/mtn.png b/apps/rider_new/assets/images/mtn.png deleted file mode 100644 index 6aa6618..0000000 Binary files a/apps/rider_new/assets/images/mtn.png and /dev/null differ diff --git a/apps/rider_new/assets/images/name_hero.png b/apps/rider_new/assets/images/name_hero.png deleted file mode 100644 index 34bd669..0000000 Binary files a/apps/rider_new/assets/images/name_hero.png and /dev/null differ diff --git a/apps/rider_new/assets/images/notepad.png b/apps/rider_new/assets/images/notepad.png deleted file mode 100644 index 9536a4d..0000000 Binary files a/apps/rider_new/assets/images/notepad.png and /dev/null differ diff --git a/apps/rider_new/assets/images/on1.png b/apps/rider_new/assets/images/on1.png deleted file mode 100644 index 4f75853..0000000 Binary files a/apps/rider_new/assets/images/on1.png and /dev/null differ diff --git a/apps/rider_new/assets/images/on2.png b/apps/rider_new/assets/images/on2.png deleted file mode 100644 index 83b4e38..0000000 Binary files a/apps/rider_new/assets/images/on2.png and /dev/null differ diff --git a/apps/rider_new/assets/images/on3.png b/apps/rider_new/assets/images/on3.png deleted file mode 100644 index 3fe9574..0000000 Binary files a/apps/rider_new/assets/images/on3.png and /dev/null differ diff --git a/apps/rider_new/assets/images/onboarding_1.png b/apps/rider_new/assets/images/onboarding_1.png deleted file mode 100644 index 7f04ae5..0000000 Binary files a/apps/rider_new/assets/images/onboarding_1.png and /dev/null differ diff --git a/apps/rider_new/assets/images/onboarding_2.png b/apps/rider_new/assets/images/onboarding_2.png deleted file mode 100644 index 2b08791..0000000 Binary files a/apps/rider_new/assets/images/onboarding_2.png and /dev/null differ diff --git a/apps/rider_new/assets/images/onboarding_3.png b/apps/rider_new/assets/images/onboarding_3.png deleted file mode 100644 index cdcb027..0000000 Binary files a/apps/rider_new/assets/images/onboarding_3.png and /dev/null differ diff --git a/apps/rider_new/assets/images/picker.png b/apps/rider_new/assets/images/picker.png deleted file mode 100644 index 6a35bf3..0000000 Binary files a/apps/rider_new/assets/images/picker.png and /dev/null differ diff --git a/apps/rider_new/assets/images/pinkBike.png b/apps/rider_new/assets/images/pinkBike.png deleted file mode 100644 index 0ed4ec5..0000000 Binary files a/apps/rider_new/assets/images/pinkBike.png and /dev/null differ diff --git a/apps/rider_new/assets/images/roundtrip.png b/apps/rider_new/assets/images/roundtrip.png deleted file mode 100644 index c6088ba..0000000 Binary files a/apps/rider_new/assets/images/roundtrip.png and /dev/null differ diff --git a/apps/rider_new/assets/images/sedan.png b/apps/rider_new/assets/images/sedan.png deleted file mode 100644 index c69e86d..0000000 Binary files a/apps/rider_new/assets/images/sedan.png and /dev/null differ diff --git a/apps/rider_new/assets/images/shamCash.png b/apps/rider_new/assets/images/shamCash.png deleted file mode 100644 index ab13ac0..0000000 Binary files a/apps/rider_new/assets/images/shamCash.png and /dev/null differ diff --git a/apps/rider_new/assets/images/shamcashsend.png b/apps/rider_new/assets/images/shamcashsend.png deleted file mode 100644 index 0814517..0000000 Binary files a/apps/rider_new/assets/images/shamcashsend.png and /dev/null differ diff --git a/apps/rider_new/assets/images/splash_logo.png b/apps/rider_new/assets/images/splash_logo.png deleted file mode 100644 index 34bd669..0000000 Binary files a/apps/rider_new/assets/images/splash_logo.png and /dev/null differ diff --git a/apps/rider_new/assets/images/syriatel.png b/apps/rider_new/assets/images/syriatel.png deleted file mode 100644 index 2facd27..0000000 Binary files a/apps/rider_new/assets/images/syriatel.png and /dev/null differ diff --git a/apps/rider_new/assets/start.wav b/apps/rider_new/assets/start.wav deleted file mode 100644 index 0655506..0000000 Binary files a/apps/rider_new/assets/start.wav and /dev/null differ diff --git a/apps/rider_new/assets/style.json b/apps/rider_new/assets/style.json deleted file mode 100644 index feed983..0000000 --- a/apps/rider_new/assets/style.json +++ /dev/null @@ -1,2178 +0,0 @@ -{ - "version": 8, - "name": "Siro Premium — Light v2.9", - "metadata": { - "brand": "Siro", - "version": "2.10.0-light", - "description": "Siro light theme — buildings at close zoom only, on-road labels, improved arrows" - }, - "center": [ - 36.276008, - 33.513685 - ], - "zoom": 15, - "glyphs": "https://cdn.protomaps.com/fonts/pbf/{fontstack}/{range}.pbf", - "sprite": "https://demotiles.maplibre.org/styles/osm-bright-gl-style/sprite", - "sources": { - "local-osm-polygons": { - "type": "vector", - "tiles": [ - "https://tiles.intaleqapp.com/planet_osm_polygon/{z}/{x}/{y}" - ], - "maxzoom": 14, - "attribution": "© Siro | © OpenStreetMap contributors" - }, - "local-osm-lines": { - "type": "vector", - "tiles": [ - "https://tiles.intaleqapp.com/planet_osm_line/{z}/{x}/{y}" - ], - "maxzoom": 14 - }, - "local-osm-points": { - "type": "vector", - "tiles": [ - "https://tiles.intaleqapp.com/planet_osm_point/{z}/{x}/{y}" - ], - "maxzoom": 14 - }, - "places_egypt": { - "type": "vector", - "tiles": [ - "https://tiles.intaleqapp.com/places_egypt/{z}/{x}/{y}" - ], - "maxzoom": 14 - }, - "places_syria": { - "type": "vector", - "tiles": [ - "https://tiles.intaleqapp.com/places_syria/{z}/{x}/{y}" - ], - "maxzoom": 14 - }, - "places_jordan": { - "type": "vector", - "tiles": [ - "https://tiles.intaleqapp.com/places_jordan/{z}/{x}/{y}" - ], - "maxzoom": 14 - }, - "overture_buildings": { - "type": "vector", - "tiles": [ - "https://tiles.intaleqapp.com/overture_building/{z}/{x}/{y}" - ], - "maxzoom": 14 - }, - "overture_segments": { - "type": "vector", - "tiles": [ - "https://tiles.intaleqapp.com/overture_segment/{z}/{x}/{y}" - ], - "maxzoom": 14 - } - }, - "layers": [ - { - "id": "background", - "type": "background", - "paint": { - "background-color": "#EEF2F7" - } - }, - { - "id": "landuse-residential", - "type": "fill", - "source": "local-osm-polygons", - "source-layer": "planet_osm_polygon", - "filter": [ - "==", - "landuse", - "residential" - ], - "paint": { - "fill-color": "#F0F4F8", - "fill-opacity": 1.0 - } - }, - { - "id": "landuse-commercial", - "type": "fill", - "source": "local-osm-polygons", - "source-layer": "planet_osm_polygon", - "filter": [ - "==", - "landuse", - "commercial" - ], - "paint": { - "fill-color": "#FAF5EE", - "fill-opacity": 1.0 - } - }, - { - "id": "landuse-cemetery", - "type": "fill", - "source": "local-osm-polygons", - "source-layer": "planet_osm_polygon", - "filter": [ - "==", - "landuse", - "cemetery" - ], - "paint": { - "fill-color": "#B8D4BA", - "fill-opacity": 1.0 - } - }, - { - "id": "landuse-military", - "type": "fill", - "source": "local-osm-polygons", - "source-layer": "planet_osm_polygon", - "filter": [ - "==", - "landuse", - "military" - ], - "paint": { - "fill-color": "#E2D9CC", - "fill-opacity": 1.0 - } - }, - { - "id": "landuse-industrial", - "type": "fill", - "source": "local-osm-polygons", - "source-layer": "planet_osm_polygon", - "filter": [ - "in", - "landuse", - "industrial", - "railway" - ], - "paint": { - "fill-color": "#E4E8EE", - "fill-opacity": 1 - } - }, - { - "id": "park-layer", - "type": "fill", - "source": "local-osm-polygons", - "source-layer": "planet_osm_polygon", - "filter": [ - "any", - [ - "in", - "leisure", - "park", - "garden", - "nature_reserve", - "pitch", - "playground" - ], - [ - "in", - "landuse", - "grass", - "meadow", - "forest" - ], - [ - "in", - "natural", - "wood", - "scrub", - "heath" - ] - ], - "paint": { - "fill-color": [ - "match", - [ - "get", - "leisure" - ], - "pitch", - "#9ED4A0", - "playground", - "#B8E6B8", - "#C5E8C5" - ], - "fill-opacity": 0.85 - } - }, - { - "id": "park-outline", - "type": "line", - "source": "local-osm-polygons", - "source-layer": "planet_osm_polygon", - "filter": [ - "in", - "leisure", - "park", - "garden", - "nature_reserve" - ], - "paint": { - "line-color": "#9ED4A0", - "line-width": 0.8, - "line-opacity": 0.6 - } - }, - { - "id": "water-polygon", - "type": "fill", - "source": "local-osm-polygons", - "source-layer": "planet_osm_polygon", - "filter": [ - "any", - [ - "in", - "natural", - "water", - "lake", - "bay" - ], - [ - "==", - "waterway", - "riverbank" - ], - [ - "in", - "landuse", - "basin", - "reservoir" - ], - [ - "==", - "amenity", - "fountain" - ] - ], - "paint": { - "fill-color": "#9ECFE8", - "fill-opacity": 0.95 - } - }, - { - "id": "water-polygon-outline", - "type": "line", - "source": "local-osm-polygons", - "source-layer": "planet_osm_polygon", - "filter": [ - "any", - [ - "in", - "natural", - "water", - "lake", - "bay" - ], - [ - "==", - "waterway", - "riverbank" - ], - [ - "in", - "landuse", - "basin", - "reservoir" - ] - ], - "paint": { - "line-color": "#6BB8D8", - "line-width": 0.8, - "line-opacity": 0.8 - } - }, - { - "id": "waterway-river", - "type": "line", - "source": "local-osm-lines", - "source-layer": "planet_osm_line", - "filter": [ - "all", - [ - "in", - "waterway", - "river", - "canal" - ], - [ - "!=", - "intermittent", - "yes" - ], - [ - "!=", - "seasonal", - "yes" - ], - [ - "!=", - "tunnel", - "yes" - ] - ], - "paint": { - "line-color": "#6BB8D8", - "line-width": [ - "interpolate", - [ - "linear" - ], - [ - "zoom" - ], - 10, - 1.5, - 14, - 4, - 16, - 7 - ], - "line-opacity": 0.95 - } - }, - { - "id": "waterway-stream-drain", - "type": "line", - "source": "local-osm-lines", - "source-layer": "planet_osm_line", - "filter": [ - "all", - [ - "in", - "waterway", - "stream", - "drain", - "ditch" - ], - [ - "!=", - "intermittent", - "yes" - ], - [ - "!=", - "seasonal", - "yes" - ], - [ - "!=", - "tunnel", - "yes" - ] - ], - "minzoom": 13, - "paint": { - "line-color": "#7FBFD8", - "line-width": [ - "interpolate", - [ - "linear" - ], - [ - "zoom" - ], - 13, - 0.8, - 16, - 2.5 - ], - "line-opacity": 0.85 - } - }, - { - "id": "railway-area", - "type": "fill", - "source": "local-osm-polygons", - "source-layer": "planet_osm_polygon", - "filter": [ - "==", - "landuse", - "railway" - ], - "paint": { - "fill-color": "#DDE2EA", - "fill-opacity": 0.9 - } - }, - { - "id": "railway-rail-casing", - "type": "line", - "source": "local-osm-lines", - "source-layer": "planet_osm_line", - "filter": [ - "all", - [ - "in", - "railway", - "rail", - "narrow_gauge", - "preserved" - ], - [ - "!=", - "service", - "yard" - ], - [ - "!=", - "service", - "siding" - ] - ], - "minzoom": 8, - "paint": { - "line-color": "#B0B8C5", - "line-width": [ - "interpolate", - [ - "linear" - ], - [ - "zoom" - ], - 8, - 2, - 12, - 4, - 16, - 8 - ] - } - }, - { - "id": "railway-rail-core", - "type": "line", - "source": "local-osm-lines", - "source-layer": "planet_osm_line", - "filter": [ - "all", - [ - "in", - "railway", - "rail", - "narrow_gauge", - "preserved" - ], - [ - "!=", - "service", - "yard" - ], - [ - "!=", - "service", - "siding" - ] - ], - "minzoom": 8, - "paint": { - "line-color": "#6B7A8E", - "line-width": [ - "interpolate", - [ - "linear" - ], - [ - "zoom" - ], - 8, - 1, - 12, - 2.5, - 16, - 5 - ], - "line-dasharray": [ - 6, - 4 - ] - } - }, - { - "id": "railway-subway-casing", - "type": "line", - "source": "local-osm-lines", - "source-layer": "planet_osm_line", - "filter": [ - "in", - "railway", - "subway", - "light_rail", - "tram", - "monorail" - ], - "minzoom": 10, - "paint": { - "line-color": [ - "match", - [ - "get", - "railway" - ], - "subway", - "#CC2233", - "light_rail", - "#0066CC", - "tram", - "#8833BB", - "monorail", - "#008855", - "#BB3344" - ], - "line-width": [ - "interpolate", - [ - "linear" - ], - [ - "zoom" - ], - 10, - 3, - 14, - 6, - 16, - 10 - ] - } - }, - { - "id": "railway-subway-core", - "type": "line", - "source": "local-osm-lines", - "source-layer": "planet_osm_line", - "filter": [ - "in", - "railway", - "subway", - "light_rail", - "tram", - "monorail" - ], - "minzoom": 10, - "paint": { - "line-color": [ - "match", - [ - "get", - "railway" - ], - "subway", - "#FF3347", - "light_rail", - "#2288FF", - "tram", - "#AA44EE", - "monorail", - "#00BB66", - "#FF4455" - ], - "line-width": [ - "interpolate", - [ - "linear" - ], - [ - "zoom" - ], - 10, - 1.5, - 14, - 3.5, - 16, - 6 - ] - } - }, - { - "id": "road-casing-track-path", - "type": "line", - "source": "local-osm-lines", - "source-layer": "planet_osm_line", - "filter": [ - "in", - "highway", - "track", - "path", - "footway", - "cycleway", - "steps" - ], - "minzoom": 14, - "paint": { - "line-color": "#D4D8DF", - "line-width": [ - "interpolate", - [ - "linear" - ], - [ - "zoom" - ], - 14, - 1, - 16, - 4 - ], - "line-dasharray": [ - 4, - 3 - ] - } - }, - { - "id": "road-casing-minor", - "type": "line", - "source": "local-osm-lines", - "source-layer": "planet_osm_line", - "filter": [ - "in", - "highway", - "residential", - "service", - "unclassified", - "living_street", - "pedestrian" - ], - "paint": { - "line-color": "#D4D8DF", - "line-width": [ - "interpolate", - [ - "linear" - ], - [ - "zoom" - ], - 12, - 1.5, - 16, - 10 - ], - "line-opacity": 0.7 - } - }, - { - "id": "road-core-minor", - "type": "line", - "source": "local-osm-lines", - "source-layer": "planet_osm_line", - "filter": [ - "in", - "highway", - "residential", - "service", - "unclassified", - "living_street", - "pedestrian" - ], - "paint": { - "line-color": "#FFFFFF", - "line-width": [ - "interpolate", - [ - "linear" - ], - [ - "zoom" - ], - 12, - 0.8, - 16, - 8 - ] - } - }, - { - "id": "road-casing-tertiary", - "type": "line", - "source": "local-osm-lines", - "source-layer": "planet_osm_line", - "filter": [ - "in", - "highway", - "tertiary", - "tertiary_link" - ], - "paint": { - "line-color": "#C9CED8", - "line-width": [ - "interpolate", - [ - "linear" - ], - [ - "zoom" - ], - 11, - 2, - 16, - 14 - ], - "line-opacity": 0.75 - } - }, - { - "id": "road-core-tertiary", - "type": "line", - "source": "local-osm-lines", - "source-layer": "planet_osm_line", - "filter": [ - "in", - "highway", - "tertiary", - "tertiary_link" - ], - "paint": { - "line-color": "#FFFFFF", - "line-width": [ - "interpolate", - [ - "linear" - ], - [ - "zoom" - ], - 11, - 1.2, - 16, - 11 - ] - } - }, - { - "id": "road-casing-secondary", - "type": "line", - "source": "local-osm-lines", - "source-layer": "planet_osm_line", - "filter": [ - "in", - "highway", - "secondary", - "secondary_link" - ], - "paint": { - "line-color": "#C4CFDE", - "line-width": [ - "interpolate", - [ - "linear" - ], - [ - "zoom" - ], - 11, - 2.5, - 16, - 16 - ], - "line-opacity": 0.8 - } - }, - { - "id": "road-core-secondary", - "type": "line", - "source": "local-osm-lines", - "source-layer": "planet_osm_line", - "filter": [ - "in", - "highway", - "secondary", - "secondary_link" - ], - "paint": { - "line-color": "#F8FBFF", - "line-width": [ - "interpolate", - [ - "linear" - ], - [ - "zoom" - ], - 11, - 1.8, - 16, - 13 - ] - } - }, - { - "id": "road-casing-primary", - "type": "line", - "source": "local-osm-lines", - "source-layer": "planet_osm_line", - "filter": [ - "in", - "highway", - "primary", - "primary_link" - ], - "paint": { - "line-color": "#C8B868", - "line-width": [ - "interpolate", - [ - "linear" - ], - [ - "zoom" - ], - 10, - 3, - 16, - 18 - ], - "line-opacity": 0.7 - } - }, - { - "id": "road-core-primary", - "type": "line", - "source": "local-osm-lines", - "source-layer": "planet_osm_line", - "filter": [ - "in", - "highway", - "primary", - "primary_link" - ], - "paint": { - "line-color": "#EDD870", - "line-width": [ - "interpolate", - [ - "linear" - ], - [ - "zoom" - ], - 10, - 2, - 16, - 14 - ] - } - }, - { - "id": "road-casing-motorway", - "type": "line", - "source": "local-osm-lines", - "source-layer": "planet_osm_line", - "filter": [ - "in", - "highway", - "motorway", - "motorway_link", - "trunk", - "trunk_link" - ], - "paint": { - "line-color": "#C8A84B", - "line-width": [ - "interpolate", - [ - "linear" - ], - [ - "zoom" - ], - 9, - 4, - 16, - 20 - ], - "line-opacity": 0.75 - } - }, - { - "id": "road-core-motorway", - "type": "line", - "source": "local-osm-lines", - "source-layer": "planet_osm_line", - "filter": [ - "in", - "highway", - "motorway", - "motorway_link", - "trunk", - "trunk_link" - ], - "paint": { - "line-color": "#F0C040", - "line-width": [ - "interpolate", - [ - "linear" - ], - [ - "zoom" - ], - 9, - 2.5, - 16, - 16 - ] - } - }, - { - "id": "road-direction-arrows", - "type": "symbol", - "source": "local-osm-lines", - "source-layer": "planet_osm_line", - "minzoom": 15, - "filter": [ - "all", - [ - "in", - "highway", - "motorway", - "trunk", - "primary", - "secondary", - "tertiary", - "residential", - "unclassified", - "living_street" - ], - [ - "==", - "oneway", - "yes" - ] - ], - "layout": { - "symbol-placement": "line", - "symbol-spacing": 120, - "text-field": "→", - "text-font": [ - "Noto Sans Regular" - ], - "text-size": [ - "interpolate", - [ - "linear" - ], - [ - "zoom" - ], - 15, - 16, - 17, - 22, - 19, - 28 - ], - "text-keep-upright": false, - "text-rotation-alignment": "map", - "text-pitch-alignment": "viewport", - "text-allow-overlap": true, - "text-ignore-placement": true, - "text-padding": 0, - "text-letter-spacing": -0.1 - }, - "paint": { - "text-color": "rgba(80,96,120,0.55)", - "text-halo-color": "rgba(255,255,255,0.25)", - "text-halo-width": 1 - } - }, - { - "id": "building-fill-flat", - "type": "fill", - "source": "local-osm-polygons", - "source-layer": "planet_osm_polygon", - "filter": [ - "has", - "building" - ], - "minzoom": 15, - "maxzoom": 16, - "paint": { - "fill-color": "#DDD8D0", - "fill-opacity": 0.85, - "fill-outline-color": "#C4BEB4" - } - }, - { - "id": "building-3d", - "type": "fill-extrusion", - "source": "local-osm-polygons", - "source-layer": "planet_osm_polygon", - "minzoom": 16, - "filter": [ - "has", - "building" - ], - "paint": { - "fill-extrusion-color": "#DDD8D0", - "fill-extrusion-height": [ - "coalesce", - [ - "to-number", - [ - "get", - "height" - ] - ], - [ - "*", - [ - "to-number", - [ - "get", - "building:levels" - ], - 2 - ], - 3.5 - ], - 7 - ], - "fill-extrusion-base": [ - "coalesce", - [ - "to-number", - [ - "get", - "min_height" - ] - ], - 0 - ], - "fill-extrusion-opacity": 0.8, - "fill-extrusion-vertical-gradient": true - } - }, - { - "id": "building-3d-overture", - "type": "fill-extrusion", - "source": "overture_buildings", - "source-layer": "overture_building", - "minzoom": 16, - "paint": { - "fill-extrusion-color": [ - "match", - [ - "get", - "subtype" - ], - "commercial", - "#D8D0C0", - "retail", - "#E0D0B8", - "industrial", - "#C8D0DC", - "religious", - "#C8D4EC", - "education", - "#D4E0C4", - "medical", - "#E8D4D4", - "#DDD8D0" - ], - "fill-extrusion-height": [ - "interpolate", - [ - "linear" - ], - [ - "zoom" - ], - 16, - [ - "coalesce", - [ - "to-number", - [ - "get", - "height" - ] - ], - [ - "*", - [ - "coalesce", - [ - "to-number", - [ - "get", - "num_floors" - ] - ], - 3 - ], - 3.5 - ], - 9 - ], - 18, - [ - "coalesce", - [ - "to-number", - [ - "get", - "height" - ] - ], - [ - "*", - [ - "coalesce", - [ - "to-number", - [ - "get", - "num_floors" - ] - ], - 3 - ], - 3.5 - ], - 12 - ] - ], - "fill-extrusion-base": [ - "coalesce", - [ - "to-number", - [ - "get", - "min_height" - ] - ], - 0 - ], - "fill-extrusion-opacity": [ - "interpolate", - [ - "linear" - ], - [ - "zoom" - ], - 15, - 0, - 16, - 0.6, - 17, - 0.88 - ], - "fill-extrusion-vertical-gradient": true - } - }, - { - "id": "overture-building-footprint", - "type": "fill", - "source": "overture_buildings", - "source-layer": "overture_building", - "minzoom": 15, - "maxzoom": 16, - "paint": { - "fill-color": "#DDD8D0", - "fill-opacity": 0.82, - "fill-outline-color": "#C4BEB4" - } - }, - { - "id": "railway-label", - "type": "symbol", - "source": "local-osm-lines", - "source-layer": "planet_osm_line", - "filter": [ - "in", - "railway", - "rail", - "subway", - "light_rail", - "tram" - ], - "minzoom": 13, - "layout": { - "text-field": [ - "coalesce", - [ - "get", - "name:ar" - ], - [ - "get", - "name" - ], - "" - ], - "text-font": [ - "Noto Sans Regular" - ], - "text-size": 10, - "symbol-placement": "line", - "text-padding": 6, - "text-allow-overlap": false - }, - "paint": { - "text-color": [ - "match", - [ - "get", - "railway" - ], - "subway", - "#CC2233", - "light_rail", - "#0055BB", - "tram", - "#7722AA", - "#4A5568" - ], - "text-halo-color": "rgba(255,255,255,0.93)", - "text-halo-width": 2 - } - }, - { - "id": "waterway-label", - "type": "symbol", - "source": "local-osm-lines", - "source-layer": "planet_osm_line", - "filter": [ - "all", - [ - "in", - "waterway", - "river", - "canal" - ], - [ - "!=", - "intermittent", - "yes" - ], - [ - "has", - "name" - ] - ], - "minzoom": 12, - "layout": { - "text-field": [ - "coalesce", - [ - "get", - "name:ar" - ], - [ - "get", - "name" - ], - "" - ], - "text-font": [ - "Noto Sans Regular" - ], - "text-size": 11, - "symbol-placement": "line", - "text-letter-spacing": 0.1 - }, - "paint": { - "text-color": "#2E86AB", - "text-halo-color": "rgba(255,255,255,0.93)", - "text-halo-width": 2 - } - }, - { - "id": "building-number-polygon", - "type": "symbol", - "source": "local-osm-polygons", - "source-layer": "planet_osm_polygon", - "minzoom": 17, - "filter": [ - "has", - "addr:housenumber" - ], - "layout": { - "text-field": "{addr:housenumber}", - "text-font": [ - "Noto Sans Regular" - ], - "text-size": 10, - "text-allow-overlap": false - }, - "paint": { - "text-color": "#5A5048", - "text-halo-color": "rgba(255,255,255,0.93)", - "text-halo-width": 1.5 - } - }, - { - "id": "building-number-point", - "type": "symbol", - "source": "local-osm-points", - "source-layer": "planet_osm_point", - "minzoom": 17, - "filter": [ - "has", - "addr:housenumber" - ], - "layout": { - "text-field": "{addr:housenumber}", - "text-font": [ - "Noto Sans Regular" - ], - "text-size": 10, - "text-allow-overlap": false - }, - "paint": { - "text-color": "#5A5048", - "text-halo-color": "rgba(255,255,255,0.93)", - "text-halo-width": 1.5 - } - }, - { - "id": "overture-building-names", - "type": "symbol", - "source": "overture_buildings", - "source-layer": "overture_building", - "minzoom": 17, - "filter": [ - "has", - "names" - ], - "layout": { - "text-field": [ - "coalesce", - [ - "get", - "names" - ], - "" - ], - "text-font": [ - "Noto Sans Regular" - ], - "text-size": 10, - "text-anchor": "center", - "text-allow-overlap": false, - "text-max-width": 8 - }, - "paint": { - "text-color": "#5A5048", - "text-halo-color": "rgba(255,255,255,0.93)", - "text-halo-width": 1.5 - } - }, - { - "id": "road-labels-minor", - "type": "symbol", - "source": "local-osm-lines", - "source-layer": "planet_osm_line", - "filter": [ - "in", - "highway", - "residential", - "service", - "unclassified", - "living_street" - ], - "minzoom": 16, - "layout": { - "text-field": [ - "coalesce", - [ - "get", - "name:ar" - ], - [ - "get", - "name" - ], - "" - ], - "text-font": [ - "Noto Sans Regular" - ], - "text-size": [ - "interpolate", - [ - "linear" - ], - [ - "zoom" - ], - 16, - 10, - 18, - 13 - ], - "symbol-placement": "line", - "text-rotation-alignment": "map", - "text-pitch-alignment": "viewport", - "text-keep-upright": true, - "text-max-angle": 25, - "symbol-spacing": 300, - "text-letter-spacing": 0.04, - "text-padding": 8, - "text-allow-overlap": false - }, - "paint": { - "text-color": "#4A5568", - "text-halo-color": "rgba(255,255,255,0.93)", - "text-halo-width": 1.8 - } - }, - { - "id": "road-labels-major", - "type": "symbol", - "source": "local-osm-lines", - "source-layer": "planet_osm_line", - "filter": [ - "in", - "highway", - "primary", - "secondary", - "tertiary", - "motorway", - "trunk" - ], - "minzoom": 12, - "layout": { - "text-field": [ - "coalesce", - [ - "get", - "name:ar" - ], - [ - "get", - "name" - ], - "" - ], - "text-font": [ - "Noto Sans Bold" - ], - "text-size": [ - "interpolate", - [ - "linear" - ], - [ - "zoom" - ], - 12, - 10, - 14, - 13, - 18, - 16 - ], - "symbol-placement": "line", - "text-rotation-alignment": "map", - "text-pitch-alignment": "viewport", - "text-keep-upright": true, - "text-max-angle": 22, - "symbol-spacing": 350, - "text-letter-spacing": 0.05, - "text-padding": 12, - "text-allow-overlap": false - }, - "paint": { - "text-color": "#1A2332", - "text-halo-color": "rgba(255,255,255,0.93)", - "text-halo-width": 2.5 - } - }, - { - "id": "overture-street-names", - "type": "symbol", - "source": "overture_segments", - "source-layer": "overture_segment", - "minzoom": 14, - "filter": [ - "has", - "names" - ], - "layout": { - "text-field": [ - "coalesce", - [ - "get", - "names" - ], - "" - ], - "text-font": [ - "Noto Sans Regular" - ], - "text-size": [ - "interpolate", - [ - "linear" - ], - [ - "zoom" - ], - 14, - 9, - 16, - 12, - 18, - 14 - ], - "symbol-placement": "line", - "text-rotation-alignment": "map", - "text-pitch-alignment": "viewport", - "text-keep-upright": true, - "text-max-angle": 28, - "symbol-spacing": 280, - "text-letter-spacing": 0.04, - "text-padding": 15, - "text-allow-overlap": false - }, - "paint": { - "text-color": "#4A5568", - "text-halo-color": "rgba(255,255,255,0.93)", - "text-halo-width": 2 - } - }, - { - "id": "poi-hospital", - "type": "symbol", - "source": "local-osm-points", - "source-layer": "planet_osm_point", - "minzoom": 13, - "filter": [ - "==", - "amenity", - "hospital" - ], - "layout": { - "icon-image": "hospital", - "icon-size": 1.0, - "text-field": [ - "coalesce", - [ - "get", - "name:ar" - ], - [ - "get", - "name" - ], - "" - ], - "text-font": [ - "Noto Sans Regular" - ], - "text-size": 11, - "text-offset": [ - 0, - 1.2 - ], - "text-anchor": "top", - "text-allow-overlap": false - }, - "paint": { - "text-color": "#C0392B", - "text-halo-color": "rgba(255,255,255,0.93)", - "text-halo-width": 2 - } - }, - { - "id": "poi-pharmacy", - "type": "symbol", - "source": "local-osm-points", - "source-layer": "planet_osm_point", - "minzoom": 15, - "filter": [ - "==", - "amenity", - "pharmacy" - ], - "layout": { - "icon-image": "pharmacy", - "icon-size": 0.8, - "text-field": [ - "coalesce", - [ - "get", - "name:ar" - ], - [ - "get", - "name" - ], - "" - ], - "text-font": [ - "Noto Sans Regular" - ], - "text-size": 11, - "text-offset": [ - 0, - 1.2 - ], - "text-anchor": "top", - "text-allow-overlap": false - }, - "paint": { - "text-color": "#1A7A3C", - "text-halo-color": "rgba(255,255,255,0.93)", - "text-halo-width": 2 - } - }, - { - "id": "poi-place-of-worship", - "type": "symbol", - "source": "local-osm-points", - "source-layer": "planet_osm_point", - "minzoom": 14, - "filter": [ - "==", - "amenity", - "place_of_worship" - ], - "layout": { - "icon-image": "tourist", - "icon-size": 0.8, - "text-field": [ - "coalesce", - [ - "get", - "name:ar" - ], - [ - "get", - "name" - ], - "" - ], - "text-font": [ - "Noto Sans Regular" - ], - "text-size": 11, - "text-offset": [ - 0, - 1.2 - ], - "text-anchor": "top", - "text-allow-overlap": false - }, - "paint": { - "text-color": "#1A6B3A", - "text-halo-color": "rgba(255,255,255,0.93)", - "text-halo-width": 2 - } - }, - { - "id": "poi-school", - "type": "symbol", - "source": "local-osm-points", - "source-layer": "planet_osm_point", - "minzoom": 14, - "filter": [ - "in", - "amenity", - "school", - "university", - "college" - ], - "layout": { - "icon-image": "college", - "icon-size": 0.8, - "text-field": [ - "coalesce", - [ - "get", - "name:ar" - ], - [ - "get", - "name" - ], - "" - ], - "text-font": [ - "Noto Sans Regular" - ], - "text-size": 11, - "text-offset": [ - 0, - 1.2 - ], - "text-anchor": "top", - "text-allow-overlap": false - }, - "paint": { - "text-color": "#5A4A8A", - "text-halo-color": "rgba(255,255,255,0.93)", - "text-halo-width": 2 - } - }, - { - "id": "poi-restaurant-cafe", - "type": "symbol", - "source": "local-osm-points", - "source-layer": "planet_osm_point", - "minzoom": 16, - "filter": [ - "in", - "amenity", - "restaurant", - "cafe", - "fast_food" - ], - "layout": { - "icon-image": [ - "match", - [ - "get", - "amenity" - ], - "cafe", - "cafe", - "restaurant" - ], - "icon-size": 0.8, - "text-field": [ - "coalesce", - [ - "get", - "name:ar" - ], - [ - "get", - "name" - ], - "" - ], - "text-font": [ - "Noto Sans Regular" - ], - "text-size": 10, - "text-offset": [ - 0, - 1.2 - ], - "text-anchor": "top" - }, - "paint": { - "text-color": "#3D4A5C", - "text-halo-color": "rgba(255,255,255,0.93)", - "text-halo-width": 1.5 - } - }, - { - "id": "poi-transit-station", - "type": "symbol", - "source": "local-osm-points", - "source-layer": "planet_osm_point", - "minzoom": 12, - "filter": [ - "any", - [ - "==", - "railway", - "station" - ], - [ - "==", - "railway", - "halt" - ], - [ - "==", - "railway", - "tram_stop" - ], - [ - "==", - "station", - "subway" - ], - [ - "==", - "amenity", - "bus_station" - ] - ], - "layout": { - "icon-image": "rail", - "icon-size": 1, - "text-field": [ - "coalesce", - [ - "get", - "name:ar" - ], - [ - "get", - "name" - ], - "" - ], - "text-font": [ - "Noto Sans Regular" - ], - "text-size": 11, - "text-offset": [ - 0, - 1.4 - ], - "text-anchor": "top", - "text-allow-overlap": false - }, - "paint": { - "text-color": "#CC2233", - "text-halo-color": "rgba(255,255,255,0.93)", - "text-halo-width": 2 - } - }, - { - "id": "place-labels-area", - "type": "symbol", - "source": "local-osm-polygons", - "source-layer": "planet_osm_polygon", - "minzoom": 10, - "filter": [ - "has", - "name" - ], - "layout": { - "text-field": [ - "coalesce", - [ - "get", - "name:ar" - ], - [ - "get", - "name" - ], - "" - ], - "text-font": [ - "Noto Sans Regular" - ], - "text-size": [ - "interpolate", - [ - "linear" - ], - [ - "zoom" - ], - 10, - 10, - 14, - 13 - ], - "text-padding": 8, - "text-allow-overlap": false - }, - "paint": { - "text-color": "#34495E", - "text-halo-color": "rgba(255,255,255,0.93)", - "text-halo-width": 2 - } - }, - { - "id": "place-labels-point", - "type": "symbol", - "source": "local-osm-points", - "source-layer": "planet_osm_point", - "minzoom": 10, - "filter": [ - "any", - [ - "in", - "place", - "city", - "town", - "village", - "suburb", - "neighbourhood", - "hamlet", - "locality", - "quarter" - ], - [ - "in", - "natural", - "peak", - "spring" - ] - ], - "layout": { - "text-field": [ - "coalesce", - [ - "get", - "name:ar" - ], - [ - "get", - "name" - ], - "" - ], - "text-font": [ - "Noto Sans Regular" - ], - "text-size": [ - "interpolate", - [ - "linear" - ], - [ - "zoom" - ], - 10, - [ - "match", - [ - "get", - "place" - ], - "city", - 16, - "town", - 14, - 11 - ], - 14, - [ - "match", - [ - "get", - "place" - ], - "city", - 20, - "town", - 16, - 13 - ], - 17, - 14 - ], - "text-letter-spacing": [ - "match", - [ - "get", - "place" - ], - "city", - 0.08, - "town", - 0.05, - 0.02 - ], - "text-anchor": "center", - "text-padding": 10, - "text-allow-overlap": false - }, - "paint": { - "text-color": [ - "match", - [ - "get", - "place" - ], - "city", - "#1A2740", - "town", - "#2C3E50", - "suburb", - "#34495E", - "neighbourhood", - "#34495E", - "#34495E" - ], - "text-halo-color": "rgba(255,255,255,0.93)", - "text-halo-width": [ - "match", - [ - "get", - "place" - ], - "city", - 3, - "town", - 2.5, - 2 - ] - } - }, - { - "id": "places-egypt-labels", - "type": "symbol", - "source": "places_egypt", - "source-layer": "places_egypt", - "minzoom": 12, - "filter": [ - "!in", - "category", - "street" - ], - "layout": { - "text-field": [ - "coalesce", - [ - "get", - "name_ar" - ], - [ - "get", - "name" - ], - "" - ], - "text-font": [ - "Noto Sans Bold" - ], - "text-size": [ - "interpolate", - [ - "linear" - ], - [ - "zoom" - ], - 12, - 9, - 16, - 13 - ], - "text-offset": [ - 0, - 1.5 - ], - "text-anchor": "top", - "text-padding": 8, - "text-allow-overlap": false - }, - "paint": { - "text-color": "#2D3748", - "text-halo-color": "rgba(255,255,255,0.93)", - "text-halo-width": 2 - } - }, - { - "id": "places-syria-labels", - "type": "symbol", - "source": "places_syria", - "source-layer": "places_syria", - "minzoom": 10, - "filter": [ - "!in", - "category", - "street" - ], - "layout": { - "text-field": [ - "coalesce", - [ - "get", - "name_ar" - ], - [ - "get", - "name" - ], - "" - ], - "text-font": [ - "Noto Sans Bold" - ], - "text-size": [ - "interpolate", - [ - "linear" - ], - [ - "zoom" - ], - 12, - 9, - 16, - 13 - ], - "text-offset": [ - 0, - 1.5 - ], - "text-anchor": "top", - "text-padding": 8, - "text-allow-overlap": false - }, - "paint": { - "text-color": "#2D3748", - "text-halo-color": "rgba(255,255,255,0.93)", - "text-halo-width": 2 - } - }, - { - "id": "places-jordan-labels", - "type": "symbol", - "source": "places_jordan", - "source-layer": "places_jordan", - "minzoom": 10, - "filter": [ - "!in", - "category", - "street" - ], - "layout": { - "text-field": [ - "coalesce", - [ - "get", - "name_ar" - ], - [ - "get", - "name" - ], - "" - ], - "text-font": [ - "Noto Sans Bold" - ], - "text-size": [ - "interpolate", - [ - "linear" - ], - [ - "zoom" - ], - 12, - 9, - 16, - 13 - ], - "text-offset": [ - 0, - 1.5 - ], - "text-anchor": "top", - "text-padding": 8, - "text-allow-overlap": false - }, - "paint": { - "text-color": "#2D3748", - "text-halo-color": "rgba(255,255,255,0.93)", - "text-halo-width": 2 - } - } - ] -} \ No newline at end of file diff --git a/apps/rider_new/assets/style_dark.json b/apps/rider_new/assets/style_dark.json deleted file mode 100644 index 182c721..0000000 --- a/apps/rider_new/assets/style_dark.json +++ /dev/null @@ -1,2178 +0,0 @@ -{ - "version": 8, - "name": "Siro Premium — Dark v2.9", - "metadata": { - "brand": "Siro", - "version": "2.10.0-dark", - "description": "Siro dark theme — buildings at close zoom only, on-road labels, improved arrows" - }, - "center": [ - 36.276008, - 33.513685 - ], - "zoom": 15, - "glyphs": "https://cdn.protomaps.com/fonts/pbf/{fontstack}/{range}.pbf", - "sprite": "https://demotiles.maplibre.org/styles/osm-bright-gl-style/sprite", - "sources": { - "local-osm-polygons": { - "type": "vector", - "tiles": [ - "https://tiles.intaleqapp.com/planet_osm_polygon/{z}/{x}/{y}" - ], - "maxzoom": 14, - "attribution": "© Siro | © OpenStreetMap contributors" - }, - "local-osm-lines": { - "type": "vector", - "tiles": [ - "https://tiles.intaleqapp.com/planet_osm_line/{z}/{x}/{y}" - ], - "maxzoom": 14 - }, - "local-osm-points": { - "type": "vector", - "tiles": [ - "https://tiles.intaleqapp.com/planet_osm_point/{z}/{x}/{y}" - ], - "maxzoom": 14 - }, - "places_egypt": { - "type": "vector", - "tiles": [ - "https://tiles.intaleqapp.com/places_egypt/{z}/{x}/{y}" - ], - "maxzoom": 14 - }, - "places_syria": { - "type": "vector", - "tiles": [ - "https://tiles.intaleqapp.com/places_syria/{z}/{x}/{y}" - ], - "maxzoom": 14 - }, - "places_jordan": { - "type": "vector", - "tiles": [ - "https://tiles.intaleqapp.com/places_jordan/{z}/{x}/{y}" - ], - "maxzoom": 14 - }, - "overture_buildings": { - "type": "vector", - "tiles": [ - "https://tiles.intaleqapp.com/overture_building/{z}/{x}/{y}" - ], - "maxzoom": 14 - }, - "overture_segments": { - "type": "vector", - "tiles": [ - "https://tiles.intaleqapp.com/overture_segment/{z}/{x}/{y}" - ], - "maxzoom": 14 - } - }, - "layers": [ - { - "id": "background", - "type": "background", - "paint": { - "background-color": "#141920" - } - }, - { - "id": "landuse-residential", - "type": "fill", - "source": "local-osm-polygons", - "source-layer": "planet_osm_polygon", - "filter": [ - "==", - "landuse", - "residential" - ], - "paint": { - "fill-color": "#1A2130", - "fill-opacity": 0.9 - } - }, - { - "id": "landuse-commercial", - "type": "fill", - "source": "local-osm-polygons", - "source-layer": "planet_osm_polygon", - "filter": [ - "==", - "landuse", - "commercial" - ], - "paint": { - "fill-color": "#1E1C18", - "fill-opacity": 0.9 - } - }, - { - "id": "landuse-cemetery", - "type": "fill", - "source": "local-osm-polygons", - "source-layer": "planet_osm_polygon", - "filter": [ - "==", - "landuse", - "cemetery" - ], - "paint": { - "fill-color": "#1A2E1A", - "fill-opacity": 0.9 - } - }, - { - "id": "landuse-military", - "type": "fill", - "source": "local-osm-polygons", - "source-layer": "planet_osm_polygon", - "filter": [ - "==", - "landuse", - "military" - ], - "paint": { - "fill-color": "#28241C", - "fill-opacity": 0.9 - } - }, - { - "id": "landuse-industrial", - "type": "fill", - "source": "local-osm-polygons", - "source-layer": "planet_osm_polygon", - "filter": [ - "in", - "landuse", - "industrial", - "railway" - ], - "paint": { - "fill-color": "#1C2028", - "fill-opacity": 1 - } - }, - { - "id": "park-layer", - "type": "fill", - "source": "local-osm-polygons", - "source-layer": "planet_osm_polygon", - "filter": [ - "any", - [ - "in", - "leisure", - "park", - "garden", - "nature_reserve", - "pitch", - "playground" - ], - [ - "in", - "landuse", - "grass", - "meadow", - "forest" - ], - [ - "in", - "natural", - "wood", - "scrub", - "heath" - ] - ], - "paint": { - "fill-color": [ - "match", - [ - "get", - "leisure" - ], - "pitch", - "#1A3020", - "playground", - "#1C2A1C", - "#172217" - ], - "fill-opacity": 0.85 - } - }, - { - "id": "park-outline", - "type": "line", - "source": "local-osm-polygons", - "source-layer": "planet_osm_polygon", - "filter": [ - "in", - "leisure", - "park", - "garden", - "nature_reserve" - ], - "paint": { - "line-color": "#1A3020", - "line-width": 0.8, - "line-opacity": 0.6 - } - }, - { - "id": "water-polygon", - "type": "fill", - "source": "local-osm-polygons", - "source-layer": "planet_osm_polygon", - "filter": [ - "any", - [ - "in", - "natural", - "water", - "lake", - "bay" - ], - [ - "==", - "waterway", - "riverbank" - ], - [ - "in", - "landuse", - "basin", - "reservoir" - ], - [ - "==", - "amenity", - "fountain" - ] - ], - "paint": { - "fill-color": "#0D2A40", - "fill-opacity": 0.95 - } - }, - { - "id": "water-polygon-outline", - "type": "line", - "source": "local-osm-polygons", - "source-layer": "planet_osm_polygon", - "filter": [ - "any", - [ - "in", - "natural", - "water", - "lake", - "bay" - ], - [ - "==", - "waterway", - "riverbank" - ], - [ - "in", - "landuse", - "basin", - "reservoir" - ] - ], - "paint": { - "line-color": "#1A4A6A", - "line-width": 0.8, - "line-opacity": 0.8 - } - }, - { - "id": "waterway-river", - "type": "line", - "source": "local-osm-lines", - "source-layer": "planet_osm_line", - "filter": [ - "all", - [ - "in", - "waterway", - "river", - "canal" - ], - [ - "!=", - "intermittent", - "yes" - ], - [ - "!=", - "seasonal", - "yes" - ], - [ - "!=", - "tunnel", - "yes" - ] - ], - "paint": { - "line-color": "#1A4A6A", - "line-width": [ - "interpolate", - [ - "linear" - ], - [ - "zoom" - ], - 10, - 1.5, - 14, - 4, - 16, - 7 - ], - "line-opacity": 0.95 - } - }, - { - "id": "waterway-stream-drain", - "type": "line", - "source": "local-osm-lines", - "source-layer": "planet_osm_line", - "filter": [ - "all", - [ - "in", - "waterway", - "stream", - "drain", - "ditch" - ], - [ - "!=", - "intermittent", - "yes" - ], - [ - "!=", - "seasonal", - "yes" - ], - [ - "!=", - "tunnel", - "yes" - ] - ], - "minzoom": 13, - "paint": { - "line-color": "#153A52", - "line-width": [ - "interpolate", - [ - "linear" - ], - [ - "zoom" - ], - 13, - 0.8, - 16, - 2.5 - ], - "line-opacity": 0.85 - } - }, - { - "id": "railway-area", - "type": "fill", - "source": "local-osm-polygons", - "source-layer": "planet_osm_polygon", - "filter": [ - "==", - "landuse", - "railway" - ], - "paint": { - "fill-color": "#202830", - "fill-opacity": 0.9 - } - }, - { - "id": "railway-rail-casing", - "type": "line", - "source": "local-osm-lines", - "source-layer": "planet_osm_line", - "filter": [ - "all", - [ - "in", - "railway", - "rail", - "narrow_gauge", - "preserved" - ], - [ - "!=", - "service", - "yard" - ], - [ - "!=", - "service", - "siding" - ] - ], - "minzoom": 8, - "paint": { - "line-color": "#3A4050", - "line-width": [ - "interpolate", - [ - "linear" - ], - [ - "zoom" - ], - 8, - 2, - 12, - 4, - 16, - 8 - ] - } - }, - { - "id": "railway-rail-core", - "type": "line", - "source": "local-osm-lines", - "source-layer": "planet_osm_line", - "filter": [ - "all", - [ - "in", - "railway", - "rail", - "narrow_gauge", - "preserved" - ], - [ - "!=", - "service", - "yard" - ], - [ - "!=", - "service", - "siding" - ] - ], - "minzoom": 8, - "paint": { - "line-color": "#4A5568", - "line-width": [ - "interpolate", - [ - "linear" - ], - [ - "zoom" - ], - 8, - 1, - 12, - 2.5, - 16, - 5 - ], - "line-dasharray": [ - 6, - 4 - ] - } - }, - { - "id": "railway-subway-casing", - "type": "line", - "source": "local-osm-lines", - "source-layer": "planet_osm_line", - "filter": [ - "in", - "railway", - "subway", - "light_rail", - "tram", - "monorail" - ], - "minzoom": 10, - "paint": { - "line-color": [ - "match", - [ - "get", - "railway" - ], - "subway", - "#AA1122", - "light_rail", - "#0055AA", - "tram", - "#7722AA", - "monorail", - "#007744", - "#BB3344" - ], - "line-width": [ - "interpolate", - [ - "linear" - ], - [ - "zoom" - ], - 10, - 3, - 14, - 6, - 16, - 10 - ] - } - }, - { - "id": "railway-subway-core", - "type": "line", - "source": "local-osm-lines", - "source-layer": "planet_osm_line", - "filter": [ - "in", - "railway", - "subway", - "light_rail", - "tram", - "monorail" - ], - "minzoom": 10, - "paint": { - "line-color": [ - "match", - [ - "get", - "railway" - ], - "subway", - "#FF4455", - "light_rail", - "#33AAFF", - "tram", - "#CC55FF", - "monorail", - "#00DD88", - "#FF4455" - ], - "line-width": [ - "interpolate", - [ - "linear" - ], - [ - "zoom" - ], - 10, - 1.5, - 14, - 3.5, - 16, - 6 - ] - } - }, - { - "id": "road-casing-track-path", - "type": "line", - "source": "local-osm-lines", - "source-layer": "planet_osm_line", - "filter": [ - "in", - "highway", - "track", - "path", - "footway", - "cycleway", - "steps" - ], - "minzoom": 14, - "paint": { - "line-color": "#252C38", - "line-width": [ - "interpolate", - [ - "linear" - ], - [ - "zoom" - ], - 14, - 1, - 16, - 4 - ], - "line-dasharray": [ - 4, - 3 - ] - } - }, - { - "id": "road-casing-minor", - "type": "line", - "source": "local-osm-lines", - "source-layer": "planet_osm_line", - "filter": [ - "in", - "highway", - "residential", - "service", - "unclassified", - "living_street", - "pedestrian" - ], - "paint": { - "line-color": "#252C38", - "line-width": [ - "interpolate", - [ - "linear" - ], - [ - "zoom" - ], - 12, - 1.5, - 16, - 10 - ], - "line-opacity": 0.7 - } - }, - { - "id": "road-core-minor", - "type": "line", - "source": "local-osm-lines", - "source-layer": "planet_osm_line", - "filter": [ - "in", - "highway", - "residential", - "service", - "unclassified", - "living_street", - "pedestrian" - ], - "paint": { - "line-color": "#2E3848", - "line-width": [ - "interpolate", - [ - "linear" - ], - [ - "zoom" - ], - 12, - 0.8, - 16, - 8 - ] - } - }, - { - "id": "road-casing-tertiary", - "type": "line", - "source": "local-osm-lines", - "source-layer": "planet_osm_line", - "filter": [ - "in", - "highway", - "tertiary", - "tertiary_link" - ], - "paint": { - "line-color": "#2A3040", - "line-width": [ - "interpolate", - [ - "linear" - ], - [ - "zoom" - ], - 11, - 2, - 16, - 14 - ], - "line-opacity": 0.75 - } - }, - { - "id": "road-core-tertiary", - "type": "line", - "source": "local-osm-lines", - "source-layer": "planet_osm_line", - "filter": [ - "in", - "highway", - "tertiary", - "tertiary_link" - ], - "paint": { - "line-color": "#38465A", - "line-width": [ - "interpolate", - [ - "linear" - ], - [ - "zoom" - ], - 11, - 1.2, - 16, - 11 - ] - } - }, - { - "id": "road-casing-secondary", - "type": "line", - "source": "local-osm-lines", - "source-layer": "planet_osm_line", - "filter": [ - "in", - "highway", - "secondary", - "secondary_link" - ], - "paint": { - "line-color": "#3A3010", - "line-width": [ - "interpolate", - [ - "linear" - ], - [ - "zoom" - ], - 11, - 2.5, - 16, - 16 - ], - "line-opacity": 0.8 - } - }, - { - "id": "road-core-secondary", - "type": "line", - "source": "local-osm-lines", - "source-layer": "planet_osm_line", - "filter": [ - "in", - "highway", - "secondary", - "secondary_link" - ], - "paint": { - "line-color": "#4A3E18", - "line-width": [ - "interpolate", - [ - "linear" - ], - [ - "zoom" - ], - 11, - 1.8, - 16, - 13 - ] - } - }, - { - "id": "road-casing-primary", - "type": "line", - "source": "local-osm-lines", - "source-layer": "planet_osm_line", - "filter": [ - "in", - "highway", - "primary", - "primary_link" - ], - "paint": { - "line-color": "#5A4A10", - "line-width": [ - "interpolate", - [ - "linear" - ], - [ - "zoom" - ], - 10, - 3, - 16, - 18 - ], - "line-opacity": 0.7 - } - }, - { - "id": "road-core-primary", - "type": "line", - "source": "local-osm-lines", - "source-layer": "planet_osm_line", - "filter": [ - "in", - "highway", - "primary", - "primary_link" - ], - "paint": { - "line-color": "#7A6418", - "line-width": [ - "interpolate", - [ - "linear" - ], - [ - "zoom" - ], - 10, - 2, - 16, - 14 - ] - } - }, - { - "id": "road-casing-motorway", - "type": "line", - "source": "local-osm-lines", - "source-layer": "planet_osm_line", - "filter": [ - "in", - "highway", - "motorway", - "motorway_link", - "trunk", - "trunk_link" - ], - "paint": { - "line-color": "#6A5010", - "line-width": [ - "interpolate", - [ - "linear" - ], - [ - "zoom" - ], - 9, - 4, - 16, - 20 - ], - "line-opacity": 0.75 - } - }, - { - "id": "road-core-motorway", - "type": "line", - "source": "local-osm-lines", - "source-layer": "planet_osm_line", - "filter": [ - "in", - "highway", - "motorway", - "motorway_link", - "trunk", - "trunk_link" - ], - "paint": { - "line-color": "#8A6A18", - "line-width": [ - "interpolate", - [ - "linear" - ], - [ - "zoom" - ], - 9, - 2.5, - 16, - 16 - ] - } - }, - { - "id": "road-direction-arrows", - "type": "symbol", - "source": "local-osm-lines", - "source-layer": "planet_osm_line", - "minzoom": 15, - "filter": [ - "all", - [ - "in", - "highway", - "motorway", - "trunk", - "primary", - "secondary", - "tertiary", - "residential", - "unclassified", - "living_street" - ], - [ - "==", - "oneway", - "yes" - ] - ], - "layout": { - "symbol-placement": "line", - "symbol-spacing": 120, - "text-field": "→", - "text-font": [ - "Noto Sans Regular" - ], - "text-size": [ - "interpolate", - [ - "linear" - ], - [ - "zoom" - ], - 15, - 16, - 17, - 22, - 19, - 28 - ], - "text-keep-upright": false, - "text-rotation-alignment": "map", - "text-pitch-alignment": "viewport", - "text-allow-overlap": true, - "text-ignore-placement": true, - "text-padding": 0, - "text-letter-spacing": -0.1 - }, - "paint": { - "text-color": "rgba(160,180,210,0.5)", - "text-halo-color": "rgba(0,0,0,0.3)", - "text-halo-width": 1 - } - }, - { - "id": "building-fill-flat", - "type": "fill", - "source": "local-osm-polygons", - "source-layer": "planet_osm_polygon", - "filter": [ - "has", - "building" - ], - "minzoom": 15, - "maxzoom": 16, - "paint": { - "fill-color": "#252C38", - "fill-opacity": 0.85, - "fill-outline-color": "#1E2530" - } - }, - { - "id": "building-3d", - "type": "fill-extrusion", - "source": "local-osm-polygons", - "source-layer": "planet_osm_polygon", - "minzoom": 16, - "filter": [ - "has", - "building" - ], - "paint": { - "fill-extrusion-color": "#252C38", - "fill-extrusion-height": [ - "coalesce", - [ - "to-number", - [ - "get", - "height" - ] - ], - [ - "*", - [ - "to-number", - [ - "get", - "building:levels" - ], - 2 - ], - 3.5 - ], - 7 - ], - "fill-extrusion-base": [ - "coalesce", - [ - "to-number", - [ - "get", - "min_height" - ] - ], - 0 - ], - "fill-extrusion-opacity": 0.8, - "fill-extrusion-vertical-gradient": true - } - }, - { - "id": "building-3d-overture", - "type": "fill-extrusion", - "source": "overture_buildings", - "source-layer": "overture_building", - "minzoom": 16, - "paint": { - "fill-extrusion-color": [ - "match", - [ - "get", - "subtype" - ], - "commercial", - "#2A3A50", - "retail", - "#2E3A4A", - "industrial", - "#1E2A38", - "religious", - "#24203A", - "education", - "#1E3024", - "medical", - "#3A2020", - "#2A3245" - ], - "fill-extrusion-height": [ - "interpolate", - [ - "linear" - ], - [ - "zoom" - ], - 16, - [ - "coalesce", - [ - "to-number", - [ - "get", - "height" - ] - ], - [ - "*", - [ - "coalesce", - [ - "to-number", - [ - "get", - "num_floors" - ] - ], - 3 - ], - 3.5 - ], - 9 - ], - 18, - [ - "coalesce", - [ - "to-number", - [ - "get", - "height" - ] - ], - [ - "*", - [ - "coalesce", - [ - "to-number", - [ - "get", - "num_floors" - ] - ], - 3 - ], - 3.5 - ], - 12 - ] - ], - "fill-extrusion-base": [ - "coalesce", - [ - "to-number", - [ - "get", - "min_height" - ] - ], - 0 - ], - "fill-extrusion-opacity": [ - "interpolate", - [ - "linear" - ], - [ - "zoom" - ], - 15, - 0, - 16, - 0.6, - 17, - 0.88 - ], - "fill-extrusion-vertical-gradient": true - } - }, - { - "id": "overture-building-footprint", - "type": "fill", - "source": "overture_buildings", - "source-layer": "overture_building", - "minzoom": 15, - "maxzoom": 16, - "paint": { - "fill-color": "#252C38", - "fill-opacity": 0.82, - "fill-outline-color": "#1E2530" - } - }, - { - "id": "railway-label", - "type": "symbol", - "source": "local-osm-lines", - "source-layer": "planet_osm_line", - "filter": [ - "in", - "railway", - "rail", - "subway", - "light_rail", - "tram" - ], - "minzoom": 13, - "layout": { - "text-field": [ - "coalesce", - [ - "get", - "name:ar" - ], - [ - "get", - "name" - ], - "" - ], - "text-font": [ - "Noto Sans Regular" - ], - "text-size": 10, - "symbol-placement": "line", - "text-padding": 6, - "text-allow-overlap": false - }, - "paint": { - "text-color": [ - "match", - [ - "get", - "railway" - ], - "subway", - "#FF5566", - "light_rail", - "#0055BB", - "tram", - "#7722AA", - "#4A5568" - ], - "text-halo-color": "rgba(20,25,32,0.92)", - "text-halo-width": 2 - } - }, - { - "id": "waterway-label", - "type": "symbol", - "source": "local-osm-lines", - "source-layer": "planet_osm_line", - "filter": [ - "all", - [ - "in", - "waterway", - "river", - "canal" - ], - [ - "!=", - "intermittent", - "yes" - ], - [ - "has", - "name" - ] - ], - "minzoom": 12, - "layout": { - "text-field": [ - "coalesce", - [ - "get", - "name:ar" - ], - [ - "get", - "name" - ], - "" - ], - "text-font": [ - "Noto Sans Regular" - ], - "text-size": 11, - "symbol-placement": "line", - "text-letter-spacing": 0.1 - }, - "paint": { - "text-color": "#4AA8D8", - "text-halo-color": "rgba(20,25,32,0.92)", - "text-halo-width": 2 - } - }, - { - "id": "building-number-polygon", - "type": "symbol", - "source": "local-osm-polygons", - "source-layer": "planet_osm_polygon", - "minzoom": 17, - "filter": [ - "has", - "addr:housenumber" - ], - "layout": { - "text-field": "{addr:housenumber}", - "text-font": [ - "Noto Sans Regular" - ], - "text-size": 10, - "text-allow-overlap": false - }, - "paint": { - "text-color": "#8898A8", - "text-halo-color": "rgba(20,25,32,0.92)", - "text-halo-width": 1.5 - } - }, - { - "id": "building-number-point", - "type": "symbol", - "source": "local-osm-points", - "source-layer": "planet_osm_point", - "minzoom": 17, - "filter": [ - "has", - "addr:housenumber" - ], - "layout": { - "text-field": "{addr:housenumber}", - "text-font": [ - "Noto Sans Regular" - ], - "text-size": 10, - "text-allow-overlap": false - }, - "paint": { - "text-color": "#8898A8", - "text-halo-color": "rgba(20,25,32,0.92)", - "text-halo-width": 1.5 - } - }, - { - "id": "overture-building-names", - "type": "symbol", - "source": "overture_buildings", - "source-layer": "overture_building", - "minzoom": 17, - "filter": [ - "has", - "names" - ], - "layout": { - "text-field": [ - "coalesce", - [ - "get", - "names" - ], - "" - ], - "text-font": [ - "Noto Sans Regular" - ], - "text-size": 10, - "text-anchor": "center", - "text-allow-overlap": false, - "text-max-width": 8 - }, - "paint": { - "text-color": "#8898A8", - "text-halo-color": "rgba(20,25,32,0.92)", - "text-halo-width": 1.5 - } - }, - { - "id": "road-labels-minor", - "type": "symbol", - "source": "local-osm-lines", - "source-layer": "planet_osm_line", - "filter": [ - "in", - "highway", - "residential", - "service", - "unclassified", - "living_street" - ], - "minzoom": 16, - "layout": { - "text-field": [ - "coalesce", - [ - "get", - "name:ar" - ], - [ - "get", - "name" - ], - "" - ], - "text-font": [ - "Noto Sans Regular" - ], - "text-size": [ - "interpolate", - [ - "linear" - ], - [ - "zoom" - ], - 16, - 10, - 18, - 13 - ], - "symbol-placement": "line", - "text-rotation-alignment": "map", - "text-pitch-alignment": "viewport", - "text-keep-upright": true, - "text-max-angle": 25, - "symbol-spacing": 300, - "text-letter-spacing": 0.04, - "text-padding": 8, - "text-allow-overlap": false - }, - "paint": { - "text-color": "#8BA0B8", - "text-halo-color": "rgba(20,25,32,0.92)", - "text-halo-width": 1.8 - } - }, - { - "id": "road-labels-major", - "type": "symbol", - "source": "local-osm-lines", - "source-layer": "planet_osm_line", - "filter": [ - "in", - "highway", - "primary", - "secondary", - "tertiary", - "motorway", - "trunk" - ], - "minzoom": 12, - "layout": { - "text-field": [ - "coalesce", - [ - "get", - "name:ar" - ], - [ - "get", - "name" - ], - "" - ], - "text-font": [ - "Noto Sans Bold" - ], - "text-size": [ - "interpolate", - [ - "linear" - ], - [ - "zoom" - ], - 12, - 10, - 14, - 13, - 18, - 16 - ], - "symbol-placement": "line", - "text-rotation-alignment": "map", - "text-pitch-alignment": "viewport", - "text-keep-upright": true, - "text-max-angle": 22, - "symbol-spacing": 350, - "text-letter-spacing": 0.05, - "text-padding": 12, - "text-allow-overlap": false - }, - "paint": { - "text-color": "#C8D8E8", - "text-halo-color": "rgba(20,25,32,0.92)", - "text-halo-width": 2.5 - } - }, - { - "id": "overture-street-names", - "type": "symbol", - "source": "overture_segments", - "source-layer": "overture_segment", - "minzoom": 14, - "filter": [ - "has", - "names" - ], - "layout": { - "text-field": [ - "coalesce", - [ - "get", - "names" - ], - "" - ], - "text-font": [ - "Noto Sans Regular" - ], - "text-size": [ - "interpolate", - [ - "linear" - ], - [ - "zoom" - ], - 14, - 9, - 16, - 12, - 18, - 14 - ], - "symbol-placement": "line", - "text-rotation-alignment": "map", - "text-pitch-alignment": "viewport", - "text-keep-upright": true, - "text-max-angle": 28, - "symbol-spacing": 280, - "text-letter-spacing": 0.04, - "text-padding": 15, - "text-allow-overlap": false - }, - "paint": { - "text-color": "#8BA0B8", - "text-halo-color": "rgba(20,25,32,0.92)", - "text-halo-width": 2 - } - }, - { - "id": "poi-hospital", - "type": "symbol", - "source": "local-osm-points", - "source-layer": "planet_osm_point", - "minzoom": 13, - "filter": [ - "==", - "amenity", - "hospital" - ], - "layout": { - "icon-image": "hospital", - "icon-size": 1.0, - "text-field": [ - "coalesce", - [ - "get", - "name:ar" - ], - [ - "get", - "name" - ], - "" - ], - "text-font": [ - "Noto Sans Regular" - ], - "text-size": 11, - "text-offset": [ - 0, - 1.2 - ], - "text-anchor": "top", - "text-allow-overlap": false - }, - "paint": { - "text-color": "#FF6B6B", - "text-halo-color": "rgba(20,25,32,0.92)", - "text-halo-width": 2 - } - }, - { - "id": "poi-pharmacy", - "type": "symbol", - "source": "local-osm-points", - "source-layer": "planet_osm_point", - "minzoom": 15, - "filter": [ - "==", - "amenity", - "pharmacy" - ], - "layout": { - "icon-image": "pharmacy", - "icon-size": 0.8, - "text-field": [ - "coalesce", - [ - "get", - "name:ar" - ], - [ - "get", - "name" - ], - "" - ], - "text-font": [ - "Noto Sans Regular" - ], - "text-size": 11, - "text-offset": [ - 0, - 1.2 - ], - "text-anchor": "top", - "text-allow-overlap": false - }, - "paint": { - "text-color": "#4ADB80", - "text-halo-color": "rgba(20,25,32,0.92)", - "text-halo-width": 2 - } - }, - { - "id": "poi-place-of-worship", - "type": "symbol", - "source": "local-osm-points", - "source-layer": "planet_osm_point", - "minzoom": 14, - "filter": [ - "==", - "amenity", - "place_of_worship" - ], - "layout": { - "icon-image": "tourist", - "icon-size": 0.8, - "text-field": [ - "coalesce", - [ - "get", - "name:ar" - ], - [ - "get", - "name" - ], - "" - ], - "text-font": [ - "Noto Sans Regular" - ], - "text-size": 11, - "text-offset": [ - 0, - 1.2 - ], - "text-anchor": "top", - "text-allow-overlap": false - }, - "paint": { - "text-color": "#4ACA78", - "text-halo-color": "rgba(20,25,32,0.92)", - "text-halo-width": 2 - } - }, - { - "id": "poi-school", - "type": "symbol", - "source": "local-osm-points", - "source-layer": "planet_osm_point", - "minzoom": 14, - "filter": [ - "in", - "amenity", - "school", - "university", - "college" - ], - "layout": { - "icon-image": "college", - "icon-size": 0.8, - "text-field": [ - "coalesce", - [ - "get", - "name:ar" - ], - [ - "get", - "name" - ], - "" - ], - "text-font": [ - "Noto Sans Regular" - ], - "text-size": 11, - "text-offset": [ - 0, - 1.2 - ], - "text-anchor": "top", - "text-allow-overlap": false - }, - "paint": { - "text-color": "#A888E8", - "text-halo-color": "rgba(20,25,32,0.92)", - "text-halo-width": 2 - } - }, - { - "id": "poi-restaurant-cafe", - "type": "symbol", - "source": "local-osm-points", - "source-layer": "planet_osm_point", - "minzoom": 16, - "filter": [ - "in", - "amenity", - "restaurant", - "cafe", - "fast_food" - ], - "layout": { - "icon-image": [ - "match", - [ - "get", - "amenity" - ], - "cafe", - "cafe", - "restaurant" - ], - "icon-size": 0.8, - "text-field": [ - "coalesce", - [ - "get", - "name:ar" - ], - [ - "get", - "name" - ], - "" - ], - "text-font": [ - "Noto Sans Regular" - ], - "text-size": 10, - "text-offset": [ - 0, - 1.2 - ], - "text-anchor": "top" - }, - "paint": { - "text-color": "#A0B8D0", - "text-halo-color": "rgba(20,25,32,0.92)", - "text-halo-width": 1.5 - } - }, - { - "id": "poi-transit-station", - "type": "symbol", - "source": "local-osm-points", - "source-layer": "planet_osm_point", - "minzoom": 12, - "filter": [ - "any", - [ - "==", - "railway", - "station" - ], - [ - "==", - "railway", - "halt" - ], - [ - "==", - "railway", - "tram_stop" - ], - [ - "==", - "station", - "subway" - ], - [ - "==", - "amenity", - "bus_station" - ] - ], - "layout": { - "icon-image": "rail", - "icon-size": 1, - "text-field": [ - "coalesce", - [ - "get", - "name:ar" - ], - [ - "get", - "name" - ], - "" - ], - "text-font": [ - "Noto Sans Regular" - ], - "text-size": 11, - "text-offset": [ - 0, - 1.4 - ], - "text-anchor": "top", - "text-allow-overlap": false - }, - "paint": { - "text-color": "#FF5566", - "text-halo-color": "rgba(20,25,32,0.92)", - "text-halo-width": 2 - } - }, - { - "id": "place-labels-area", - "type": "symbol", - "source": "local-osm-polygons", - "source-layer": "planet_osm_polygon", - "minzoom": 10, - "filter": [ - "has", - "name" - ], - "layout": { - "text-field": [ - "coalesce", - [ - "get", - "name:ar" - ], - [ - "get", - "name" - ], - "" - ], - "text-font": [ - "Noto Sans Regular" - ], - "text-size": [ - "interpolate", - [ - "linear" - ], - [ - "zoom" - ], - 10, - 10, - 14, - 13 - ], - "text-padding": 8, - "text-allow-overlap": false - }, - "paint": { - "text-color": "#8AA0B8", - "text-halo-color": "rgba(20,25,32,0.92)", - "text-halo-width": 2 - } - }, - { - "id": "place-labels-point", - "type": "symbol", - "source": "local-osm-points", - "source-layer": "planet_osm_point", - "minzoom": 10, - "filter": [ - "any", - [ - "in", - "place", - "city", - "town", - "village", - "suburb", - "neighbourhood", - "hamlet", - "locality", - "quarter" - ], - [ - "in", - "natural", - "peak", - "spring" - ] - ], - "layout": { - "text-field": [ - "coalesce", - [ - "get", - "name:ar" - ], - [ - "get", - "name" - ], - "" - ], - "text-font": [ - "Noto Sans Regular" - ], - "text-size": [ - "interpolate", - [ - "linear" - ], - [ - "zoom" - ], - 10, - [ - "match", - [ - "get", - "place" - ], - "city", - 16, - "town", - 14, - 11 - ], - 14, - [ - "match", - [ - "get", - "place" - ], - "city", - 20, - "town", - 16, - 13 - ], - 17, - 14 - ], - "text-letter-spacing": [ - "match", - [ - "get", - "place" - ], - "city", - 0.08, - "town", - 0.05, - 0.02 - ], - "text-anchor": "center", - "text-padding": 10, - "text-allow-overlap": false - }, - "paint": { - "text-color": [ - "match", - [ - "get", - "place" - ], - "city", - "#D0E0F0", - "town", - "#B8CDE0", - "suburb", - "#8AA0B8", - "neighbourhood", - "#8AA0B8", - "#8AA0B8" - ], - "text-halo-color": "rgba(20,25,32,0.92)", - "text-halo-width": [ - "match", - [ - "get", - "place" - ], - "city", - 3, - "town", - 2.5, - 2 - ] - } - }, - { - "id": "places-egypt-labels", - "type": "symbol", - "source": "places_egypt", - "source-layer": "places_egypt", - "minzoom": 12, - "filter": [ - "!in", - "category", - "street" - ], - "layout": { - "text-field": [ - "coalesce", - [ - "get", - "name_ar" - ], - [ - "get", - "name" - ], - "" - ], - "text-font": [ - "Noto Sans Bold" - ], - "text-size": [ - "interpolate", - [ - "linear" - ], - [ - "zoom" - ], - 12, - 9, - 16, - 13 - ], - "text-offset": [ - 0, - 1.5 - ], - "text-anchor": "top", - "text-padding": 8, - "text-allow-overlap": false - }, - "paint": { - "text-color": "#A8C0D8", - "text-halo-color": "rgba(20,25,32,0.92)", - "text-halo-width": 2 - } - }, - { - "id": "places-syria-labels", - "type": "symbol", - "source": "places_syria", - "source-layer": "places_syria", - "minzoom": 10, - "filter": [ - "!in", - "category", - "street" - ], - "layout": { - "text-field": [ - "coalesce", - [ - "get", - "name_ar" - ], - [ - "get", - "name" - ], - "" - ], - "text-font": [ - "Noto Sans Bold" - ], - "text-size": [ - "interpolate", - [ - "linear" - ], - [ - "zoom" - ], - 12, - 9, - 16, - 13 - ], - "text-offset": [ - 0, - 1.5 - ], - "text-anchor": "top", - "text-padding": 8, - "text-allow-overlap": false - }, - "paint": { - "text-color": "#A8C0D8", - "text-halo-color": "rgba(20,25,32,0.92)", - "text-halo-width": 2 - } - }, - { - "id": "places-jordan-labels", - "type": "symbol", - "source": "places_jordan", - "source-layer": "places_jordan", - "minzoom": 10, - "filter": [ - "!in", - "category", - "street" - ], - "layout": { - "text-field": [ - "coalesce", - [ - "get", - "name_ar" - ], - [ - "get", - "name" - ], - "" - ], - "text-font": [ - "Noto Sans Bold" - ], - "text-size": [ - "interpolate", - [ - "linear" - ], - [ - "zoom" - ], - 12, - 9, - 16, - 13 - ], - "text-offset": [ - 0, - 1.5 - ], - "text-anchor": "top", - "text-padding": 8, - "text-allow-overlap": false - }, - "paint": { - "text-color": "#A8C0D8", - "text-halo-color": "rgba(20,25,32,0.92)", - "text-halo-width": 2 - } - } - ] -} \ No newline at end of file diff --git a/apps/rider_new/ios/.gitignore b/apps/rider_new/ios/.gitignore deleted file mode 100644 index 7a7f987..0000000 --- a/apps/rider_new/ios/.gitignore +++ /dev/null @@ -1,34 +0,0 @@ -**/dgph -*.mode1v3 -*.mode2v3 -*.moved-aside -*.pbxuser -*.perspectivev3 -**/*sync/ -.sconsign.dblite -.tags* -**/.vagrant/ -**/DerivedData/ -Icon? -**/Pods/ -**/.symlinks/ -profile -xcuserdata -**/.generated/ -Flutter/App.framework -Flutter/Flutter.framework -Flutter/Flutter.podspec -Flutter/Generated.xcconfig -Flutter/ephemeral/ -Flutter/app.flx -Flutter/app.zip -Flutter/flutter_assets/ -Flutter/flutter_export_environment.sh -ServiceDefinitions.json -Runner/GeneratedPluginRegistrant.* - -# Exceptions to above rules. -!default.mode1v3 -!default.mode2v3 -!default.pbxuser -!default.perspectivev3 diff --git a/apps/rider_new/ios/Flutter/AppFrameworkInfo.plist b/apps/rider_new/ios/Flutter/AppFrameworkInfo.plist deleted file mode 100644 index 391a902..0000000 --- a/apps/rider_new/ios/Flutter/AppFrameworkInfo.plist +++ /dev/null @@ -1,24 +0,0 @@ - - - - - CFBundleDevelopmentRegion - en - CFBundleExecutable - App - CFBundleIdentifier - io.flutter.flutter.app - CFBundleInfoDictionaryVersion - 6.0 - CFBundleName - App - CFBundlePackageType - FMWK - CFBundleShortVersionString - 1.0 - CFBundleSignature - ???? - CFBundleVersion - 1.0 - - diff --git a/apps/rider_new/ios/Flutter/Debug.xcconfig b/apps/rider_new/ios/Flutter/Debug.xcconfig deleted file mode 100644 index ec97fc6..0000000 --- a/apps/rider_new/ios/Flutter/Debug.xcconfig +++ /dev/null @@ -1,2 +0,0 @@ -#include? "Pods/Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig" -#include "Generated.xcconfig" diff --git a/apps/rider_new/ios/Flutter/Release.xcconfig b/apps/rider_new/ios/Flutter/Release.xcconfig deleted file mode 100644 index c4855bf..0000000 --- a/apps/rider_new/ios/Flutter/Release.xcconfig +++ /dev/null @@ -1,2 +0,0 @@ -#include? "Pods/Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig" -#include "Generated.xcconfig" diff --git a/apps/rider_new/ios/Podfile b/apps/rider_new/ios/Podfile deleted file mode 100644 index 99d9041..0000000 --- a/apps/rider_new/ios/Podfile +++ /dev/null @@ -1,60 +0,0 @@ -# Uncomment this line to define a global platform for your project -platform :ios, '16.1' -$iOSVersion = '16.1' # or newer version - -# CocoaPods analytics sends network stats synchronously affecting flutter build latency. -ENV['COCOAPODS_DISABLE_STATS'] = 'true' - -project 'Runner', { - 'Debug' => :debug, - 'Profile' => :release, - 'Release' => :release, -} -def flutter_root - generated_xcode_build_settings_path = File.expand_path(File.join('..', 'Flutter', 'Generated.xcconfig'), __FILE__) - unless File.exist?(generated_xcode_build_settings_path) - raise "#{generated_xcode_build_settings_path} must exist. If you're running pod install manually, make sure flutter pub get is executed first" - end - - File.foreach(generated_xcode_build_settings_path) do |line| - matches = line.match(/FLUTTER_ROOT\=(.*)/) - return matches[1].strip if matches - end - raise "FLUTTER_ROOT not found in #{generated_xcode_build_settings_path}. Try deleting Generated.xcconfig, then run flutter pub get" -end - -require File.expand_path(File.join('packages', 'flutter_tools', 'bin', 'podhelper'), flutter_root) - -flutter_ios_podfile_setup - -target 'Runner' do - use_frameworks! - use_modular_headers! - - flutter_install_all_ios_pods File.dirname(File.realpath(__FILE__)) - target 'RunnerTests' do - inherit! :search_paths - end -end - -post_install do |installer| - # add these lines: - installer.pods_project.build_configurations.each do |config| - config.build_settings["EXCLUDED_ARCHS[sdk=*]"] = "armv7" - config.build_settings['IPHONEOS_DEPLOYMENT_TARGET'] = $iOSVersion - end - installer.pods_project.targets.each do |target| - flutter_additional_ios_build_settings(target) - # add these lines: - target.build_configurations.each do |config| - if Gem::Version.new($iOSVersion) > Gem::Version.new(config.build_settings['IPHONEOS_DEPLOYMENT_TARGET']) - config.build_settings['IPHONEOS_DEPLOYMENT_TARGET'] = $iOSVersion - end - config.build_settings['GCC_PREPROCESSOR_DEFINITIONS'] ||= [ - '$(inherited)', - 'PERMISSION_LOCATION=1', - ] - end - end -end - diff --git a/apps/rider_new/ios/Podfile.lock b/apps/rider_new/ios/Podfile.lock deleted file mode 100644 index 34221d8..0000000 --- a/apps/rider_new/ios/Podfile.lock +++ /dev/null @@ -1,171 +0,0 @@ -PODS: - - device_info_plus (0.0.1): - - Flutter - - Firebase/CoreOnly (12.17.0): - - FirebaseCore (~> 12.17.0) - - Firebase/Messaging (12.17.0): - - Firebase/CoreOnly - - FirebaseMessaging (~> 12.17.0) - - firebase_core (4.13.0): - - Firebase/CoreOnly (= 12.17.0) - - Flutter - - firebase_messaging (16.5.0): - - Firebase/Messaging (= 12.17.0) - - firebase_core - - Flutter - - FirebaseCore (12.17.0): - - FirebaseCoreInternal (~> 12.17.0) - - GoogleUtilities/Environment (~> 8.1) - - GoogleUtilities/Logger (~> 8.1) - - FirebaseCoreInternal (12.17.0): - - "GoogleUtilities/NSData+zlib (~> 8.1)" - - FirebaseInstallations (12.17.0): - - FirebaseCore (~> 12.17.0) - - GoogleUtilities/Environment (~> 8.1) - - GoogleUtilities/UserDefaults (~> 8.1) - - PromisesObjC (~> 2.4) - - FirebaseMessaging (12.17.0): - - FirebaseCore (~> 12.17.0) - - FirebaseInstallations (~> 12.17.0) - - GoogleDataTransport (~> 10.1) - - GoogleUtilities/AppDelegateSwizzler (~> 8.1) - - GoogleUtilities/Environment (~> 8.1) - - GoogleUtilities/Reachability (~> 8.1) - - GoogleUtilities/UserDefaults (~> 8.1) - - nanopb (~> 3.30910.0) - - Flutter (1.0.0) - - flutter_secure_storage_darwin (10.0.0): - - Flutter - - FlutterMacOS - - geolocator_apple (1.2.0): - - Flutter - - FlutterMacOS - - GoogleDataTransport (10.1.1): - - nanopb (~> 3.30910.0) - - PromisesObjC (~> 2.4) - - GoogleUtilities/AppDelegateSwizzler (8.1.2): - - GoogleUtilities/Environment - - GoogleUtilities/Logger - - GoogleUtilities/Network - - GoogleUtilities/Privacy - - GoogleUtilities/Environment (8.1.2): - - GoogleUtilities/Privacy - - GoogleUtilities/Logger (8.1.2): - - GoogleUtilities/Environment - - GoogleUtilities/Privacy - - GoogleUtilities/Network (8.1.2): - - GoogleUtilities/Logger - - "GoogleUtilities/NSData+zlib" - - GoogleUtilities/Privacy - - GoogleUtilities/Reachability - - "GoogleUtilities/NSData+zlib (8.1.2)": - - GoogleUtilities/Privacy - - GoogleUtilities/Privacy (8.1.2) - - GoogleUtilities/Reachability (8.1.2): - - GoogleUtilities/Logger - - GoogleUtilities/Privacy - - GoogleUtilities/UserDefaults (8.1.2): - - GoogleUtilities/Logger - - GoogleUtilities/Privacy - - MapLibre (6.19.1) - - maplibre_gl (0.25.0): - - Flutter - - MapLibre (= 6.19.1) - - nanopb (3.30910.0): - - nanopb/decode (= 3.30910.0) - - nanopb/encode (= 3.30910.0) - - nanopb/decode (3.30910.0) - - nanopb/encode (3.30910.0) - - package_info_plus (0.4.5): - - Flutter - - permission_handler_apple (9.4.8): - - Flutter - - PromisesObjC (2.4.1) - - share_plus (0.0.1): - - Flutter - - shared_preferences_foundation (0.0.1): - - Flutter - - FlutterMacOS - - url_launcher_ios (0.0.1): - - Flutter - -DEPENDENCIES: - - device_info_plus (from `.symlinks/plugins/device_info_plus/ios`) - - firebase_core (from `.symlinks/plugins/firebase_core/ios`) - - firebase_messaging (from `.symlinks/plugins/firebase_messaging/ios`) - - Flutter (from `Flutter`) - - flutter_secure_storage_darwin (from `.symlinks/plugins/flutter_secure_storage_darwin/darwin`) - - geolocator_apple (from `.symlinks/plugins/geolocator_apple/darwin`) - - maplibre_gl (from `.symlinks/plugins/maplibre_gl/ios`) - - package_info_plus (from `.symlinks/plugins/package_info_plus/ios`) - - permission_handler_apple (from `.symlinks/plugins/permission_handler_apple/ios`) - - share_plus (from `.symlinks/plugins/share_plus/ios`) - - shared_preferences_foundation (from `.symlinks/plugins/shared_preferences_foundation/darwin`) - - url_launcher_ios (from `.symlinks/plugins/url_launcher_ios/ios`) - -SPEC REPOS: - trunk: - - Firebase - - FirebaseCore - - FirebaseCoreInternal - - FirebaseInstallations - - FirebaseMessaging - - GoogleDataTransport - - GoogleUtilities - - MapLibre - - nanopb - - PromisesObjC - -EXTERNAL SOURCES: - device_info_plus: - :path: ".symlinks/plugins/device_info_plus/ios" - firebase_core: - :path: ".symlinks/plugins/firebase_core/ios" - firebase_messaging: - :path: ".symlinks/plugins/firebase_messaging/ios" - Flutter: - :path: Flutter - flutter_secure_storage_darwin: - :path: ".symlinks/plugins/flutter_secure_storage_darwin/darwin" - geolocator_apple: - :path: ".symlinks/plugins/geolocator_apple/darwin" - maplibre_gl: - :path: ".symlinks/plugins/maplibre_gl/ios" - package_info_plus: - :path: ".symlinks/plugins/package_info_plus/ios" - permission_handler_apple: - :path: ".symlinks/plugins/permission_handler_apple/ios" - share_plus: - :path: ".symlinks/plugins/share_plus/ios" - shared_preferences_foundation: - :path: ".symlinks/plugins/shared_preferences_foundation/darwin" - url_launcher_ios: - :path: ".symlinks/plugins/url_launcher_ios/ios" - -SPEC CHECKSUMS: - device_info_plus: 21fcca2080fbcd348be798aa36c3e5ed849eefbe - Firebase: e8400c058702940d53f31fc0653e4e7a06332326 - firebase_core: c94f9efeed0ded590b7eecaf6110a374eb865d7a - firebase_messaging: 00bcc97454f71d0dbe0a8adc6f2abf952320cfb2 - FirebaseCore: 52d4512296984a44a8c8870c6494870fc7aeee2f - FirebaseCoreInternal: 3b310521b34a51ce3a6c605e4618b9aef8f6c112 - FirebaseInstallations: bd8e80f51d4c8bdc6c872011dede0b800c5b49ea - FirebaseMessaging: 313d69fe6529c8846813d1660b65d7d38bc16954 - Flutter: cabc95a1d2626b1b06e7179b784ebcf0c0cde467 - flutter_secure_storage_darwin: acdb3f316ed05a3e68f856e0353b133eec373a23 - geolocator_apple: ab36aa0e8b7d7a2d7639b3b4e48308394e8cef5e - GoogleDataTransport: a24e58982ab3ba2f64d79613e027fe7f57e88539 - GoogleUtilities: 766ace00c6b10d8148408f329d10c4f051931850 - MapLibre: 7f24faba45439f80ccb0f83393c29fa32cb81952 - maplibre_gl: a2114567cbd1065866614fbd34dfb75ab782aaa2 - nanopb: fad817b59e0457d11a5dfbde799381cd727c1275 - package_info_plus: af8e2ca6888548050f16fa2f1938db7b5a5df499 - permission_handler_apple: 92d754bbaa7361d436db2d6c3c1c2a0fdcec462e - PromisesObjC: 752c3227f599e3467650e47ea36f433eeb10c273 - share_plus: 50da8cb520a8f0f65671c6c6a99b3617ed10a58a - shared_preferences_foundation: 7036424c3d8ec98dfe75ff1667cb0cd531ec82bb - url_launcher_ios: 7a95fa5b60cc718a708b8f2966718e93db0cef1b - -PODFILE CHECKSUM: 2fb3a1fbcfd139fd6c248e48cbde3560c22a448d - -COCOAPODS: 1.16.2 diff --git a/apps/rider_new/ios/Runner.xcodeproj/project.pbxproj b/apps/rider_new/ios/Runner.xcodeproj/project.pbxproj deleted file mode 100644 index d6f57ea..0000000 --- a/apps/rider_new/ios/Runner.xcodeproj/project.pbxproj +++ /dev/null @@ -1,842 +0,0 @@ -// !$*UTF8*$! -{ - archiveVersion = 1; - classes = { - }; - objectVersion = 54; - objects = { - -/* Begin PBXBuildFile section */ - 0E2EB9A18A85A8C79C1A5B17 /* Pods_RunnerTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 27958A27956787B6764BC14F /* Pods_RunnerTests.framework */; }; - 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */ = {isa = PBXBuildFile; fileRef = 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */; }; - 331C808B294A63AB00263BE5 /* RunnerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 331C807B294A618700263BE5 /* RunnerTests.swift */; }; - 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */ = {isa = PBXBuildFile; fileRef = 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */; }; - 74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 74858FAE1ED2DC5600515810 /* AppDelegate.swift */; }; - 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FA1CF9000F007C117D /* Main.storyboard */; }; - 97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FD1CF9000F007C117D /* Assets.xcassets */; }; - 97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */; }; - C60CA7372BE9EF38002095B2 /* GoogleService-Info.plist in Resources */ = {isa = PBXBuildFile; fileRef = C60CA7362BE9EF38002095B2 /* GoogleService-Info.plist */; }; - C6229B682D610CB20014397D /* JailbreakDetection.swift in Sources */ = {isa = PBXBuildFile; fileRef = C6229B672D610C970014397D /* JailbreakDetection.swift */; }; - C624C4642BD56D34002834AF /* tone1.mp3 in Resources */ = {isa = PBXBuildFile; fileRef = C624C45C2BD56D34002834AF /* tone1.mp3 */; }; - C624C4652BD56D34002834AF /* start.wav in Resources */ = {isa = PBXBuildFile; fileRef = C624C45D2BD56D34002834AF /* start.wav */; }; - C624C4672BD56D34002834AF /* promo.wav in Resources */ = {isa = PBXBuildFile; fileRef = C624C45F2BD56D34002834AF /* promo.wav */; }; - C624C4682BD56D34002834AF /* cancel.wav in Resources */ = {isa = PBXBuildFile; fileRef = C624C4602BD56D34002834AF /* cancel.wav */; }; - C628BC412C316B1200E4D33B /* ding.wav in Resources */ = {isa = PBXBuildFile; fileRef = C628BC402C316B1100E4D33B /* ding.wav */; }; - C6372AD92D81BDE000C44265 /* SecurityChecks.m in Sources */ = {isa = PBXBuildFile; fileRef = C6372AD82D81BDE000C44265 /* SecurityChecks.m */; }; - C6372ADF2D81C68C00C44265 /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = C6372ADE2D81C68700C44265 /* Localizable.strings */; }; - C6372AE42D81F10E00C44265 /* KeychainHelper.swift in Sources */ = {isa = PBXBuildFile; fileRef = C6372AE32D81F10A00C44265 /* KeychainHelper.swift */; }; - C6372AE62D82EB9C00C44265 /* Config.plist in Resources */ = {isa = PBXBuildFile; fileRef = C6372AE52D82EB9C00C44265 /* Config.plist */; }; - C6B15AA12B5FB24600746405 /* order.wav in Resources */ = {isa = PBXBuildFile; fileRef = C6B15A9F2B5FB24600746405 /* order.wav */; }; - C6B15AA22B5FB24600746405 /* tone2.wav in Resources */ = {isa = PBXBuildFile; fileRef = C6B15AA02B5FB24600746405 /* tone2.wav */; }; - C6B450142D67556C001427AA /* Constants1.swift in Sources */ = {isa = PBXBuildFile; fileRef = C6B450132D67556B001427AA /* Constants1.swift */; }; - D529E7C8240CCC30BB7358A2 /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3B099132D71B1299FCDFD9C8 /* Pods_Runner.framework */; }; -/* End PBXBuildFile section */ - -/* Begin PBXContainerItemProxy section */ - 331C8085294A63A400263BE5 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 97C146E61CF9000F007C117D /* Project object */; - proxyType = 1; - remoteGlobalIDString = 97C146ED1CF9000F007C117D; - remoteInfo = Runner; - }; -/* End PBXContainerItemProxy section */ - -/* Begin PBXCopyFilesBuildPhase section */ - 9705A1C41CF9048500538489 /* Embed Frameworks */ = { - isa = PBXCopyFilesBuildPhase; - buildActionMask = 2147483647; - dstPath = ""; - dstSubfolderSpec = 10; - files = ( - ); - name = "Embed Frameworks"; - runOnlyForDeploymentPostprocessing = 0; - }; - C6E5BC612DCFF5F800471574 /* Embed Foundation Extensions */ = { - isa = PBXCopyFilesBuildPhase; - buildActionMask = 2147483647; - dstPath = ""; - dstSubfolderSpec = 13; - files = ( - ); - name = "Embed Foundation Extensions"; - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXCopyFilesBuildPhase section */ - -/* Begin PBXFileReference section */ - 08CDD9E654C52E05FEE40E98 /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = ""; }; - 1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GeneratedPluginRegistrant.h; sourceTree = ""; }; - 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GeneratedPluginRegistrant.m; sourceTree = ""; }; - 27958A27956787B6764BC14F /* Pods_RunnerTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_RunnerTests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - 331C807B294A618700263BE5 /* RunnerTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RunnerTests.swift; sourceTree = ""; }; - 331C8081294A63A400263BE5 /* RunnerTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = RunnerTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; - 3B099132D71B1299FCDFD9C8 /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = AppFrameworkInfo.plist; path = Flutter/AppFrameworkInfo.plist; sourceTree = ""; }; - 42939EAD96568C1F3F0E8006 /* Pods-RunnerTests.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.profile.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.profile.xcconfig"; sourceTree = ""; }; - 43385D55BAC53942A4B30B22 /* Pods-RunnerTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.debug.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.debug.xcconfig"; sourceTree = ""; }; - 45F2ED245254D48D155DD716 /* Pods-RunnerTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.release.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.release.xcconfig"; sourceTree = ""; }; - 74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Runner-Bridging-Header.h"; sourceTree = ""; }; - 74858FAE1ED2DC5600515810 /* AppDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; - 7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = Release.xcconfig; path = Flutter/Release.xcconfig; sourceTree = ""; }; - 9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Debug.xcconfig; path = Flutter/Debug.xcconfig; sourceTree = ""; }; - 9740EEB31CF90195004384FC /* Generated.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Generated.xcconfig; path = Flutter/Generated.xcconfig; sourceTree = ""; }; - 97C146EE1CF9000F007C117D /* Runner.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Runner.app; sourceTree = BUILT_PRODUCTS_DIR; }; - 97C146FB1CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; - 97C146FD1CF9000F007C117D /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; - 97C147001CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; - 97C147021CF9000F007C117D /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - C60CA7362BE9EF38002095B2 /* GoogleService-Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = "GoogleService-Info.plist"; path = "GoogleService-Info.plist"; sourceTree = ""; }; - C6229B672D610C970014397D /* JailbreakDetection.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = JailbreakDetection.swift; sourceTree = ""; }; - C624C45C2BD56D34002834AF /* tone1.mp3 */ = {isa = PBXFileReference; lastKnownFileType = audio.mp3; name = tone1.mp3; path = ../../android/app/src/main/res/raw/tone1.mp3; sourceTree = ""; }; - C624C45D2BD56D34002834AF /* start.wav */ = {isa = PBXFileReference; lastKnownFileType = audio.wav; name = start.wav; path = ../../android/app/src/main/res/raw/start.wav; sourceTree = ""; }; - C624C45F2BD56D34002834AF /* promo.wav */ = {isa = PBXFileReference; lastKnownFileType = audio.wav; name = promo.wav; path = ../../android/app/src/main/res/raw/promo.wav; sourceTree = ""; }; - C624C4602BD56D34002834AF /* cancel.wav */ = {isa = PBXFileReference; lastKnownFileType = audio.wav; name = cancel.wav; path = ../../android/app/src/main/res/raw/cancel.wav; sourceTree = ""; }; - C628BC402C316B1100E4D33B /* ding.wav */ = {isa = PBXFileReference; lastKnownFileType = audio.wav; name = ding.wav; path = ../../android/app/src/main/res/raw/ding.wav; sourceTree = ""; }; - C6372AD72D81BDA900C44265 /* SecurityChecks.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = SecurityChecks.h; sourceTree = ""; }; - C6372AD82D81BDE000C44265 /* SecurityChecks.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = SecurityChecks.m; sourceTree = ""; }; - C6372ADE2D81C68700C44265 /* Localizable.strings */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; path = Localizable.strings; sourceTree = ""; }; - C6372AE32D81F10A00C44265 /* KeychainHelper.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KeychainHelper.swift; sourceTree = ""; }; - C6372AE52D82EB9C00C44265 /* Config.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Config.plist; sourceTree = ""; }; - C69588332A8C1F6B00C3AC67 /* Runner.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = Runner.entitlements; sourceTree = ""; }; - C6B15A9F2B5FB24600746405 /* order.wav */ = {isa = PBXFileReference; lastKnownFileType = audio.wav; path = order.wav; sourceTree = ""; }; - C6B15AA02B5FB24600746405 /* tone2.wav */ = {isa = PBXFileReference; lastKnownFileType = audio.wav; path = tone2.wav; sourceTree = ""; }; - C6B450132D67556B001427AA /* Constants1.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Constants1.swift; sourceTree = ""; }; - C6E5BC4C2DCFF5F600471574 /* WidgetKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = WidgetKit.framework; path = System/Library/Frameworks/WidgetKit.framework; sourceTree = SDKROOT; }; - C6E5BC4E2DCFF5F600471574 /* SwiftUI.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = SwiftUI.framework; path = System/Library/Frameworks/SwiftUI.framework; sourceTree = SDKROOT; }; - CAF37DC30C17166B851DBC8C /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = ""; }; - F231BA28015FE2C634809733 /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = ""; }; -/* End PBXFileReference section */ - -/* Begin PBXFrameworksBuildPhase section */ - 7AD318F74F39A70FCC91E66D /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - 0E2EB9A18A85A8C79C1A5B17 /* Pods_RunnerTests.framework in Frameworks */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 97C146EB1CF9000F007C117D /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - D529E7C8240CCC30BB7358A2 /* Pods_Runner.framework in Frameworks */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXFrameworksBuildPhase section */ - -/* Begin PBXGroup section */ - 331C8082294A63A400263BE5 /* RunnerTests */ = { - isa = PBXGroup; - children = ( - 331C807B294A618700263BE5 /* RunnerTests.swift */, - ); - path = RunnerTests; - sourceTree = ""; - }; - 5684D45491D29A320AB8001A /* Pods */ = { - isa = PBXGroup; - children = ( - 08CDD9E654C52E05FEE40E98 /* Pods-Runner.debug.xcconfig */, - F231BA28015FE2C634809733 /* Pods-Runner.release.xcconfig */, - CAF37DC30C17166B851DBC8C /* Pods-Runner.profile.xcconfig */, - 43385D55BAC53942A4B30B22 /* Pods-RunnerTests.debug.xcconfig */, - 45F2ED245254D48D155DD716 /* Pods-RunnerTests.release.xcconfig */, - 42939EAD96568C1F3F0E8006 /* Pods-RunnerTests.profile.xcconfig */, - ); - path = Pods; - sourceTree = ""; - }; - 9740EEB11CF90186004384FC /* Flutter */ = { - isa = PBXGroup; - children = ( - 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */, - 9740EEB21CF90195004384FC /* Debug.xcconfig */, - 7AFA3C8E1D35360C0083082E /* Release.xcconfig */, - 9740EEB31CF90195004384FC /* Generated.xcconfig */, - ); - name = Flutter; - sourceTree = ""; - }; - 97C146E51CF9000F007C117D = { - isa = PBXGroup; - children = ( - 9740EEB11CF90186004384FC /* Flutter */, - 97C146F01CF9000F007C117D /* Runner */, - 97C146EF1CF9000F007C117D /* Products */, - 331C8082294A63A400263BE5 /* RunnerTests */, - 5684D45491D29A320AB8001A /* Pods */, - B3041BA408DBB12F66846F39 /* Frameworks */, - ); - sourceTree = ""; - }; - 97C146EF1CF9000F007C117D /* Products */ = { - isa = PBXGroup; - children = ( - 97C146EE1CF9000F007C117D /* Runner.app */, - 331C8081294A63A400263BE5 /* RunnerTests.xctest */, - ); - name = Products; - sourceTree = ""; - }; - 97C146F01CF9000F007C117D /* Runner */ = { - isa = PBXGroup; - children = ( - C6372AE32D81F10A00C44265 /* KeychainHelper.swift */, - C6372ADE2D81C68700C44265 /* Localizable.strings */, - C6229B672D610C970014397D /* JailbreakDetection.swift */, - C6372AD72D81BDA900C44265 /* SecurityChecks.h */, - C6372AD82D81BDE000C44265 /* SecurityChecks.m */, - C69588332A8C1F6B00C3AC67 /* Runner.entitlements */, - C6B15A9F2B5FB24600746405 /* order.wav */, - C6B15AA02B5FB24600746405 /* tone2.wav */, - C624C4602BD56D34002834AF /* cancel.wav */, - C628BC402C316B1100E4D33B /* ding.wav */, - C624C45F2BD56D34002834AF /* promo.wav */, - C624C45D2BD56D34002834AF /* start.wav */, - C624C45C2BD56D34002834AF /* tone1.mp3 */, - 97C146FA1CF9000F007C117D /* Main.storyboard */, - 97C146FD1CF9000F007C117D /* Assets.xcassets */, - 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */, - 97C147021CF9000F007C117D /* Info.plist */, - C60CA7362BE9EF38002095B2 /* GoogleService-Info.plist */, - 1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */, - 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */, - 74858FAE1ED2DC5600515810 /* AppDelegate.swift */, - C6B450132D67556B001427AA /* Constants1.swift */, - 74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */, - C6372AE52D82EB9C00C44265 /* Config.plist */, - ); - path = Runner; - sourceTree = ""; - }; - B3041BA408DBB12F66846F39 /* Frameworks */ = { - isa = PBXGroup; - children = ( - 3B099132D71B1299FCDFD9C8 /* Pods_Runner.framework */, - 27958A27956787B6764BC14F /* Pods_RunnerTests.framework */, - C6E5BC4C2DCFF5F600471574 /* WidgetKit.framework */, - C6E5BC4E2DCFF5F600471574 /* SwiftUI.framework */, - ); - name = Frameworks; - sourceTree = ""; - }; -/* End PBXGroup section */ - -/* Begin PBXNativeTarget section */ - 331C8080294A63A400263BE5 /* RunnerTests */ = { - isa = PBXNativeTarget; - buildConfigurationList = 331C8087294A63A400263BE5 /* Build configuration list for PBXNativeTarget "RunnerTests" */; - buildPhases = ( - E21B2D2CCD3CE8A2142D0F2C /* [CP] Check Pods Manifest.lock */, - 331C807D294A63A400263BE5 /* Sources */, - 331C807F294A63A400263BE5 /* Resources */, - 7AD318F74F39A70FCC91E66D /* Frameworks */, - ); - buildRules = ( - ); - dependencies = ( - 331C8086294A63A400263BE5 /* PBXTargetDependency */, - ); - name = RunnerTests; - productName = RunnerTests; - productReference = 331C8081294A63A400263BE5 /* RunnerTests.xctest */; - productType = "com.apple.product-type.bundle.unit-test"; - }; - 97C146ED1CF9000F007C117D /* Runner */ = { - isa = PBXNativeTarget; - buildConfigurationList = 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */; - buildPhases = ( - 3F036A01BF594E9B01799541 /* [CP] Check Pods Manifest.lock */, - 9740EEB61CF901F6004384FC /* Run Script */, - 97C146EA1CF9000F007C117D /* Sources */, - 97C146EB1CF9000F007C117D /* Frameworks */, - 97C146EC1CF9000F007C117D /* Resources */, - 9705A1C41CF9048500538489 /* Embed Frameworks */, - 3B06AD1E1E4923F5004D2608 /* Thin Binary */, - 854CC60BC5A3FC7474EC1FBF /* [CP] Embed Pods Frameworks */, - 7ADB08D4DE3D2A2E09575068 /* [CP] Copy Pods Resources */, - C6E5BC612DCFF5F800471574 /* Embed Foundation Extensions */, - ); - buildRules = ( - ); - dependencies = ( - ); - name = Runner; - productName = Runner; - productReference = 97C146EE1CF9000F007C117D /* Runner.app */; - productType = "com.apple.product-type.application"; - }; -/* End PBXNativeTarget section */ - -/* Begin PBXProject section */ - 97C146E61CF9000F007C117D /* Project object */ = { - isa = PBXProject; - attributes = { - BuildIndependentTargetsInParallel = YES; - LastSwiftUpdateCheck = 1620; - LastUpgradeCheck = 1510; - ORGANIZATIONNAME = ""; - TargetAttributes = { - 331C8080294A63A400263BE5 = { - CreatedOnToolsVersion = 14.0; - TestTargetID = 97C146ED1CF9000F007C117D; - }; - 97C146ED1CF9000F007C117D = { - CreatedOnToolsVersion = 7.3.1; - LastSwiftMigration = 1100; - }; - }; - }; - buildConfigurationList = 97C146E91CF9000F007C117D /* Build configuration list for PBXProject "Runner" */; - compatibilityVersion = "Xcode 9.3"; - developmentRegion = en; - hasScannedForEncodings = 0; - knownRegions = ( - en, - Base, - ); - mainGroup = 97C146E51CF9000F007C117D; - productRefGroup = 97C146EF1CF9000F007C117D /* Products */; - projectDirPath = ""; - projectRoot = ""; - targets = ( - 97C146ED1CF9000F007C117D /* Runner */, - 331C8080294A63A400263BE5 /* RunnerTests */, - ); - }; -/* End PBXProject section */ - -/* Begin PBXResourcesBuildPhase section */ - 331C807F294A63A400263BE5 /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 97C146EC1CF9000F007C117D /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - C6B15AA22B5FB24600746405 /* tone2.wav in Resources */, - C624C4652BD56D34002834AF /* start.wav in Resources */, - C624C4672BD56D34002834AF /* promo.wav in Resources */, - 97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */, - C624C4682BD56D34002834AF /* cancel.wav in Resources */, - C6B15AA12B5FB24600746405 /* order.wav in Resources */, - C6372AE62D82EB9C00C44265 /* Config.plist in Resources */, - 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */, - C628BC412C316B1200E4D33B /* ding.wav in Resources */, - 97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */, - C6372ADF2D81C68C00C44265 /* Localizable.strings in Resources */, - C624C4642BD56D34002834AF /* tone1.mp3 in Resources */, - 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */, - C60CA7372BE9EF38002095B2 /* GoogleService-Info.plist in Resources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXResourcesBuildPhase section */ - -/* Begin PBXShellScriptBuildPhase section */ - 3B06AD1E1E4923F5004D2608 /* Thin Binary */ = { - isa = PBXShellScriptBuildPhase; - alwaysOutOfDate = 1; - buildActionMask = 2147483647; - files = ( - ); - inputPaths = ( - "${TARGET_BUILD_DIR}/${INFOPLIST_PATH}", - ); - name = "Thin Binary"; - outputPaths = ( - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" embed_and_thin"; - }; - 3F036A01BF594E9B01799541 /* [CP] Check Pods Manifest.lock */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputFileListPaths = ( - ); - inputPaths = ( - "${PODS_PODFILE_DIR_PATH}/Podfile.lock", - "${PODS_ROOT}/Manifest.lock", - ); - name = "[CP] Check Pods Manifest.lock"; - outputFileListPaths = ( - ); - outputPaths = ( - "$(DERIVED_FILE_DIR)/Pods-Runner-checkManifestLockResult.txt", - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; - showEnvVarsInLog = 0; - }; - 7ADB08D4DE3D2A2E09575068 /* [CP] Copy Pods Resources */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputFileListPaths = ( - "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-resources-${CONFIGURATION}-input-files.xcfilelist", - ); - name = "[CP] Copy Pods Resources"; - outputFileListPaths = ( - "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-resources-${CONFIGURATION}-output-files.xcfilelist", - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-resources.sh\"\n"; - showEnvVarsInLog = 0; - }; - 854CC60BC5A3FC7474EC1FBF /* [CP] Embed Pods Frameworks */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputFileListPaths = ( - "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-input-files.xcfilelist", - ); - name = "[CP] Embed Pods Frameworks"; - outputFileListPaths = ( - "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-output-files.xcfilelist", - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n"; - showEnvVarsInLog = 0; - }; - 9740EEB61CF901F6004384FC /* Run Script */ = { - isa = PBXShellScriptBuildPhase; - alwaysOutOfDate = 1; - buildActionMask = 2147483647; - files = ( - ); - inputPaths = ( - ); - name = "Run Script"; - outputPaths = ( - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" build"; - }; - E21B2D2CCD3CE8A2142D0F2C /* [CP] Check Pods Manifest.lock */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputFileListPaths = ( - ); - inputPaths = ( - "${PODS_PODFILE_DIR_PATH}/Podfile.lock", - "${PODS_ROOT}/Manifest.lock", - ); - name = "[CP] Check Pods Manifest.lock"; - outputFileListPaths = ( - ); - outputPaths = ( - "$(DERIVED_FILE_DIR)/Pods-RunnerTests-checkManifestLockResult.txt", - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; - showEnvVarsInLog = 0; - }; -/* End PBXShellScriptBuildPhase section */ - -/* Begin PBXSourcesBuildPhase section */ - 331C807D294A63A400263BE5 /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 331C808B294A63AB00263BE5 /* RunnerTests.swift in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 97C146EA1CF9000F007C117D /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - C6229B682D610CB20014397D /* JailbreakDetection.swift in Sources */, - C6372AE42D81F10E00C44265 /* KeychainHelper.swift in Sources */, - C6372AD92D81BDE000C44265 /* SecurityChecks.m in Sources */, - C6B450142D67556C001427AA /* Constants1.swift in Sources */, - 74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */, - 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXSourcesBuildPhase section */ - -/* Begin PBXTargetDependency section */ - 331C8086294A63A400263BE5 /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - target = 97C146ED1CF9000F007C117D /* Runner */; - targetProxy = 331C8085294A63A400263BE5 /* PBXContainerItemProxy */; - }; -/* End PBXTargetDependency section */ - -/* Begin PBXVariantGroup section */ - 97C146FA1CF9000F007C117D /* Main.storyboard */ = { - isa = PBXVariantGroup; - children = ( - 97C146FB1CF9000F007C117D /* Base */, - ); - name = Main.storyboard; - sourceTree = ""; - }; - 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */ = { - isa = PBXVariantGroup; - children = ( - 97C147001CF9000F007C117D /* Base */, - ); - name = LaunchScreen.storyboard; - sourceTree = ""; - }; -/* End PBXVariantGroup section */ - -/* Begin XCBuildConfiguration section */ - 249021D3217E4FDB00AE95B9 /* Profile */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - 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_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; - 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; - }; - 249021D4217E4FDB00AE95B9 /* Profile */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; - buildSettings = { - ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; - CLANG_ENABLE_MODULES = YES; - CODE_SIGN_ENTITLEMENTS = Runner/Runner.entitlements; - COPY_PHASE_STRIP = YES; - CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; - DEPLOYMENT_POSTPROCESSING = YES; - DEVELOPMENT_TEAM = 63CVT8G5P8; - ENABLE_BITCODE = NO; - INFOPLIST_FILE = Runner/Info.plist; - INFOPLIST_KEY_CFBundleDisplayName = Sefer; - INFOPLIST_KEY_LSApplicationCategoryType = "public.app-category.travel"; - LD_RUNPATH_SEARCH_PATHS = ( - "$(inherited)", - "@executable_path/Frameworks", - ); - PRODUCT_BUNDLE_IDENTIFIER = com.mobileapp.store.ride; - PRODUCT_NAME = "$(TARGET_NAME)"; - SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; - SWIFT_VERSION = 5.0; - VERSIONING_SYSTEM = "apple-generic"; - }; - name = Profile; - }; - 331C8088294A63A400263BE5 /* Debug */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 43385D55BAC53942A4B30B22 /* Pods-RunnerTests.debug.xcconfig */; - 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.mobileapp.store.ride.RunnerTests; - 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; - }; - 331C8089294A63A400263BE5 /* Release */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 45F2ED245254D48D155DD716 /* Pods-RunnerTests.release.xcconfig */; - 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.mobileapp.store.ride.RunnerTests; - PRODUCT_NAME = "$(TARGET_NAME)"; - SWIFT_VERSION = 5.0; - TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Runner.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/Runner"; - }; - name = Release; - }; - 331C808A294A63A400263BE5 /* Profile */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 42939EAD96568C1F3F0E8006 /* Pods-RunnerTests.profile.xcconfig */; - 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.mobileapp.store.ride.RunnerTests; - PRODUCT_NAME = "$(TARGET_NAME)"; - SWIFT_VERSION = 5.0; - TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Runner.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/Runner"; - }; - name = Profile; - }; - 97C147031CF9000F007C117D /* Debug */ = { - 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_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; - 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; - }; - 97C147041CF9000F007C117D /* Release */ = { - 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_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; - 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; - }; - 97C147061CF9000F007C117D /* Debug */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 9740EEB21CF90195004384FC /* Debug.xcconfig */; - buildSettings = { - ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; - CLANG_ENABLE_MODULES = YES; - CODE_SIGN_ENTITLEMENTS = Runner/Runner.entitlements; - COPY_PHASE_STRIP = YES; - CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; - DEPLOYMENT_POSTPROCESSING = YES; - DEVELOPMENT_TEAM = 63CVT8G5P8; - ENABLE_BITCODE = NO; - INFOPLIST_FILE = Runner/Info.plist; - INFOPLIST_KEY_CFBundleDisplayName = Sefer; - INFOPLIST_KEY_LSApplicationCategoryType = "public.app-category.travel"; - LD_RUNPATH_SEARCH_PATHS = ( - "$(inherited)", - "@executable_path/Frameworks", - ); - PRODUCT_BUNDLE_IDENTIFIER = com.mobileapp.store.ride; - PRODUCT_NAME = "$(TARGET_NAME)"; - SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; - SWIFT_OPTIMIZATION_LEVEL = "-Onone"; - SWIFT_VERSION = 5.0; - VERSIONING_SYSTEM = "apple-generic"; - }; - name = Debug; - }; - 97C147071CF9000F007C117D /* Release */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; - buildSettings = { - ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; - CLANG_ENABLE_MODULES = YES; - CODE_SIGN_ENTITLEMENTS = Runner/Runner.entitlements; - COPY_PHASE_STRIP = YES; - CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; - DEPLOYMENT_POSTPROCESSING = YES; - DEVELOPMENT_TEAM = 63CVT8G5P8; - ENABLE_BITCODE = NO; - INFOPLIST_FILE = Runner/Info.plist; - INFOPLIST_KEY_CFBundleDisplayName = Sefer; - INFOPLIST_KEY_LSApplicationCategoryType = "public.app-category.travel"; - LD_RUNPATH_SEARCH_PATHS = ( - "$(inherited)", - "@executable_path/Frameworks", - ); - PRODUCT_BUNDLE_IDENTIFIER = com.mobileapp.store.ride; - PRODUCT_NAME = "$(TARGET_NAME)"; - SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; - SWIFT_VERSION = 5.0; - VERSIONING_SYSTEM = "apple-generic"; - }; - name = Release; - }; -/* End XCBuildConfiguration section */ - -/* Begin XCConfigurationList section */ - 331C8087294A63A400263BE5 /* Build configuration list for PBXNativeTarget "RunnerTests" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 331C8088294A63A400263BE5 /* Debug */, - 331C8089294A63A400263BE5 /* Release */, - 331C808A294A63A400263BE5 /* Profile */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - 97C146E91CF9000F007C117D /* Build configuration list for PBXProject "Runner" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 97C147031CF9000F007C117D /* Debug */, - 97C147041CF9000F007C117D /* Release */, - 249021D3217E4FDB00AE95B9 /* Profile */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 97C147061CF9000F007C117D /* Debug */, - 97C147071CF9000F007C117D /* Release */, - 249021D4217E4FDB00AE95B9 /* Profile */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; -/* End XCConfigurationList section */ - }; - rootObject = 97C146E61CF9000F007C117D /* Project object */; -} diff --git a/apps/rider_new/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/apps/rider_new/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata deleted file mode 100644 index 919434a..0000000 --- a/apps/rider_new/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata +++ /dev/null @@ -1,7 +0,0 @@ - - - - - diff --git a/apps/rider_new/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/apps/rider_new/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist deleted file mode 100644 index 18d9810..0000000 --- a/apps/rider_new/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist +++ /dev/null @@ -1,8 +0,0 @@ - - - - - IDEDidComputeMac32BitWarning - - - diff --git a/apps/rider_new/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings b/apps/rider_new/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings deleted file mode 100644 index f9b0d7c..0000000 --- a/apps/rider_new/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings +++ /dev/null @@ -1,8 +0,0 @@ - - - - - PreviewsEnabled - - - diff --git a/apps/rider_new/ios/Runner.xcodeproj/xcshareddata/xcschemes/MyWidgetHome1Extension.xcscheme b/apps/rider_new/ios/Runner.xcodeproj/xcshareddata/xcschemes/MyWidgetHome1Extension.xcscheme deleted file mode 100644 index 56fcbd2..0000000 --- a/apps/rider_new/ios/Runner.xcodeproj/xcshareddata/xcschemes/MyWidgetHome1Extension.xcscheme +++ /dev/null @@ -1,129 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/apps/rider_new/ios/Runner.xcodeproj/xcshareddata/xcschemes/MyWidgetHomeExtension.xcscheme b/apps/rider_new/ios/Runner.xcodeproj/xcshareddata/xcschemes/MyWidgetHomeExtension.xcscheme deleted file mode 100644 index 2c79358..0000000 --- a/apps/rider_new/ios/Runner.xcodeproj/xcshareddata/xcschemes/MyWidgetHomeExtension.xcscheme +++ /dev/null @@ -1,114 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/apps/rider_new/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/apps/rider_new/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme deleted file mode 100644 index e3773d4..0000000 --- a/apps/rider_new/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +++ /dev/null @@ -1,101 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/apps/rider_new/ios/Runner.xcworkspace/contents.xcworkspacedata b/apps/rider_new/ios/Runner.xcworkspace/contents.xcworkspacedata deleted file mode 100644 index 21a3cc1..0000000 --- a/apps/rider_new/ios/Runner.xcworkspace/contents.xcworkspacedata +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - - diff --git a/apps/rider_new/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/apps/rider_new/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist deleted file mode 100644 index 18d9810..0000000 --- a/apps/rider_new/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist +++ /dev/null @@ -1,8 +0,0 @@ - - - - - IDEDidComputeMac32BitWarning - - - diff --git a/apps/rider_new/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings b/apps/rider_new/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings deleted file mode 100644 index f9b0d7c..0000000 --- a/apps/rider_new/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings +++ /dev/null @@ -1,8 +0,0 @@ - - - - - PreviewsEnabled - - - diff --git a/apps/rider_new/ios/Runner/AppDelegate.swift b/apps/rider_new/ios/Runner/AppDelegate.swift deleted file mode 100644 index 2fd6003..0000000 --- a/apps/rider_new/ios/Runner/AppDelegate.swift +++ /dev/null @@ -1,139 +0,0 @@ - -import UIKit -import Flutter -import FirebaseCore -@main -@objc class AppDelegate: FlutterAppDelegate { - - override func application( - _ application: UIApplication, - didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]? - ) -> Bool { - - FirebaseApp.configure() - GeneratedPluginRegistrant.register(with: self) - - // Perform security checks *before* showing the main UI - if SecurityChecks.isDeviceCompromised() { // Call Objective-C method - showSecurityAlert() - return false // Prevent app from launching further - } - //setup method channel - setupMethodChannel() - - return super.application(application, didFinishLaunchingWithOptions: launchOptions) - } - - func setupMethodChannel(){ - guard let controller = window?.rootViewController as? FlutterViewController else { - return - } - - let channel = FlutterMethodChannel(name: "com.mobileapp.store.ride/security", - binaryMessenger: controller.binaryMessenger) - channel.setMethodCallHandler { call, result in - switch call.method { - case "isNativeRooted": - // We already check this in isDeviceCompromised, - // so we can just return the result directly. - result(SecurityChecks.isDeviceCompromised()) - default: - result(FlutterMethodNotImplemented) - } - - } - } - - func showSecurityAlert() { - guard let rootVC = UIApplication.shared.keyWindow?.rootViewController else { - // Handle the case where rootVC is nil (extremely unlikely, but good practice) - exit(0) -// return - } - - let alert = UIAlertController( - title: "Security Warning".localized, // Use localized strings! - message: "Compromised device detected. Exiting.".localized, - preferredStyle: .alert - ) - - // Add an "OK" button with an obfuscated action - alert.addAction(UIAlertAction(title: "OK".localized, style: .destructive) { _ in - // More robust exit (see explanation below) - self.obfuscatedExit() - }) - - // Use a presentationDetents to prevent dismissing - if #available(iOS 15.0, *) { - alert.popoverPresentationController?.sourceView = rootVC.view - alert.popoverPresentationController?.sourceRect = CGRect(x: rootVC.view.bounds.midX, y: rootVC.view.bounds.midY, width: 0, height: 0) - alert.popoverPresentationController?.permittedArrowDirections = [] - alert.presentationController?.delegate = self - if let presentationController = alert.presentationController as? UISheetPresentationController { - presentationController.detents = [.medium()] // Set a fixed height if desired - presentationController.preferredCornerRadius = 20; - presentationController.prefersEdgeAttachedInCompactHeight = true;// Set corner radius - presentationController.prefersGrabberVisible = false // Optional: show a grabber - } - - } else { - // Fallback on earlier versions - } - - rootVC.present(alert, animated: true, completion: nil) - } - - // Obfuscated Exit (Example - you'll need a more robust solution) - func obfuscatedExit() { - // This is a *very* basic example. A real obfuscation would be MUCH more complex. - let selector = NSSelectorFromString(String(format: "%@%@", "ex", "it:")) - if responds(to: selector) { - perform(selector, with: 0) // Call exit(0) indirectly - } - } - - // MARK: - Secure API Key Storage (Example) - func getAPIKey() -> String { - // DO NOT store API keys directly in your code! - // Load it from a more secure location, such as: - // 1. A configuration file that is *not* checked into source control. - // 2. Keychain Services (recommended for iOS). - // 3. A backend server (best option). - - // This is just a placeholder. Replace with your actual key loading. - // In a real app, you'd fetch this from a secure source. - guard let filePath = Bundle.main.path(forResource: "keys", ofType: "plist"), - let plist = NSDictionary(contentsOfFile: filePath), - let apiKey = plist["google_maps_api_key"] as? String else { - fatalError("Couldn't find keys or API Key") // Ensure a crash if not found - } - - return apiKey - } - func loadConfig() -> [String: Any]? { - guard let path = Bundle.main.path(forResource: "Config", ofType: "plist"), - let config = NSDictionary(contentsOfFile: path) as? [String: Any] else { - return nil // Or handle the error appropriately - } - return config - } - - -} -// Add for prevent dismissing -extension AppDelegate: UIAdaptivePresentationControllerDelegate { - func presentationControllerShouldDismiss(_ presentationController: UIPresentationController) -> Bool { - return false - } - - func presentationControllerDidAttemptToDismiss(_ presentationController: UIPresentationController) { - - } -} - -// Add String extension -extension String { - var localized: String { - return NSLocalizedString(self, tableName: nil, bundle: Bundle.main, value: "", comment: "") - } -} diff --git a/apps/rider_new/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json b/apps/rider_new/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json deleted file mode 100644 index be71788..0000000 --- a/apps/rider_new/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json +++ /dev/null @@ -1,158 +0,0 @@ -{ - "images": [ - { - "size": "20x20", - "idiom": "iphone", - "filename": "Icon-App-20x20@2x.png", - "scale": "2x" - }, - { - "size": "20x20", - "idiom": "iphone", - "filename": "Icon-App-20x20@3x.png", - "scale": "3x" - }, - { - "size": "29x29", - "idiom": "iphone", - "filename": "Icon-App-29x29@1x.png", - "scale": "1x" - }, - { - "size": "29x29", - "idiom": "iphone", - "filename": "Icon-App-29x29@2x.png", - "scale": "2x" - }, - { - "size": "29x29", - "idiom": "iphone", - "filename": "Icon-App-29x29@3x.png", - "scale": "3x" - }, - { - "size": "40x40", - "idiom": "iphone", - "filename": "Icon-App-40x40@2x.png", - "scale": "2x" - }, - { - "size": "40x40", - "idiom": "iphone", - "filename": "Icon-App-40x40@3x.png", - "scale": "3x" - }, - { - "size": "57x57", - "idiom": "iphone", - "filename": "Icon-App-57x57@1x.png", - "scale": "1x" - }, - { - "size": "57x57", - "idiom": "iphone", - "filename": "Icon-App-57x57@2x.png", - "scale": "2x" - }, - { - "size": "60x60", - "idiom": "iphone", - "filename": "Icon-App-60x60@2x.png", - "scale": "2x" - }, - { - "size": "60x60", - "idiom": "iphone", - "filename": "Icon-App-60x60@3x.png", - "scale": "3x" - }, - { - "size": "20x20", - "idiom": "ipad", - "filename": "Icon-App-20x20@1x.png", - "scale": "1x" - }, - { - "size": "20x20", - "idiom": "ipad", - "filename": "Icon-App-20x20@2x.png", - "scale": "2x" - }, - { - "size": "29x29", - "idiom": "ipad", - "filename": "Icon-App-29x29@1x.png", - "scale": "1x" - }, - { - "size": "29x29", - "idiom": "ipad", - "filename": "Icon-App-29x29@2x.png", - "scale": "2x" - }, - { - "size": "40x40", - "idiom": "ipad", - "filename": "Icon-App-40x40@1x.png", - "scale": "1x" - }, - { - "size": "40x40", - "idiom": "ipad", - "filename": "Icon-App-40x40@2x.png", - "scale": "2x" - }, - { - "size": "50x50", - "idiom": "ipad", - "filename": "Icon-App-50x50@1x.png", - "scale": "1x" - }, - { - "size": "50x50", - "idiom": "ipad", - "filename": "Icon-App-50x50@2x.png", - "scale": "2x" - }, - { - "size": "72x72", - "idiom": "ipad", - "filename": "Icon-App-72x72@1x.png", - "scale": "1x" - }, - { - "size": "72x72", - "idiom": "ipad", - "filename": "Icon-App-72x72@2x.png", - "scale": "2x" - }, - { - "size": "76x76", - "idiom": "ipad", - "filename": "Icon-App-76x76@1x.png", - "scale": "1x" - }, - { - "size": "76x76", - "idiom": "ipad", - "filename": "Icon-App-76x76@2x.png", - "scale": "2x" - }, - { - "size": "83.5x83.5", - "idiom": "ipad", - "filename": "Icon-App-83.5x83.5@2x.png", - "scale": "2x" - }, - { - "size": "1024x1024", - "idiom": "ios-marketing", - "filename": "Icon-App-1024x1024@1x.png", - "scale": "1x" - } - ], - "info": { - "version": 1, - "author": "xcode" - } -} \ No newline at end of file diff --git a/apps/rider_new/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png b/apps/rider_new/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png deleted file mode 100644 index cb46088..0000000 Binary files a/apps/rider_new/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png and /dev/null differ diff --git a/apps/rider_new/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png b/apps/rider_new/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png deleted file mode 100644 index 36f3434..0000000 Binary files a/apps/rider_new/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png and /dev/null differ diff --git a/apps/rider_new/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png b/apps/rider_new/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png deleted file mode 100644 index d34f885..0000000 Binary files a/apps/rider_new/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png and /dev/null differ diff --git a/apps/rider_new/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png b/apps/rider_new/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png deleted file mode 100644 index 3f24811..0000000 Binary files a/apps/rider_new/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png and /dev/null differ diff --git a/apps/rider_new/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png b/apps/rider_new/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png deleted file mode 100644 index 844093e..0000000 Binary files a/apps/rider_new/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png and /dev/null differ diff --git a/apps/rider_new/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png b/apps/rider_new/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png deleted file mode 100644 index 5620f77..0000000 Binary files a/apps/rider_new/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png and /dev/null differ diff --git a/apps/rider_new/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png b/apps/rider_new/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png deleted file mode 100644 index 6654589..0000000 Binary files a/apps/rider_new/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png and /dev/null differ diff --git a/apps/rider_new/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png b/apps/rider_new/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png deleted file mode 100644 index d34f885..0000000 Binary files a/apps/rider_new/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png and /dev/null differ diff --git a/apps/rider_new/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png b/apps/rider_new/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png deleted file mode 100644 index 2cde9d8..0000000 Binary files a/apps/rider_new/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png and /dev/null differ diff --git a/apps/rider_new/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png b/apps/rider_new/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png deleted file mode 100644 index 2f0d4d8..0000000 Binary files a/apps/rider_new/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png and /dev/null differ diff --git a/apps/rider_new/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-50x50@1x.png b/apps/rider_new/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-50x50@1x.png deleted file mode 100644 index 83c8425..0000000 Binary files a/apps/rider_new/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-50x50@1x.png and /dev/null differ diff --git a/apps/rider_new/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-50x50@2x.png b/apps/rider_new/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-50x50@2x.png deleted file mode 100644 index cfc89be..0000000 Binary files a/apps/rider_new/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-50x50@2x.png and /dev/null differ diff --git a/apps/rider_new/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-57x57@1x.png b/apps/rider_new/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-57x57@1x.png deleted file mode 100644 index 0e71812..0000000 Binary files a/apps/rider_new/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-57x57@1x.png and /dev/null differ diff --git a/apps/rider_new/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-57x57@2x.png b/apps/rider_new/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-57x57@2x.png deleted file mode 100644 index 7310a1f..0000000 Binary files a/apps/rider_new/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-57x57@2x.png and /dev/null differ diff --git a/apps/rider_new/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png b/apps/rider_new/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png deleted file mode 100644 index 2f0d4d8..0000000 Binary files a/apps/rider_new/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png and /dev/null differ diff --git a/apps/rider_new/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png b/apps/rider_new/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png deleted file mode 100644 index c18828b..0000000 Binary files a/apps/rider_new/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png and /dev/null differ diff --git a/apps/rider_new/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-72x72@1x.png b/apps/rider_new/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-72x72@1x.png deleted file mode 100644 index 5f35220..0000000 Binary files a/apps/rider_new/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-72x72@1x.png and /dev/null differ diff --git a/apps/rider_new/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-72x72@2x.png b/apps/rider_new/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-72x72@2x.png deleted file mode 100644 index 7514dfe..0000000 Binary files a/apps/rider_new/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-72x72@2x.png and /dev/null differ diff --git a/apps/rider_new/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png b/apps/rider_new/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png deleted file mode 100644 index 8dbb617..0000000 Binary files a/apps/rider_new/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png and /dev/null differ diff --git a/apps/rider_new/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png b/apps/rider_new/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png deleted file mode 100644 index 4f8bef7..0000000 Binary files a/apps/rider_new/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png and /dev/null differ diff --git a/apps/rider_new/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png b/apps/rider_new/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png deleted file mode 100644 index 184dc96..0000000 Binary files a/apps/rider_new/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png and /dev/null differ diff --git a/apps/rider_new/ios/Runner/Assets.xcassets/Contents.json b/apps/rider_new/ios/Runner/Assets.xcassets/Contents.json deleted file mode 100644 index 73c0059..0000000 --- a/apps/rider_new/ios/Runner/Assets.xcassets/Contents.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "info" : { - "author" : "xcode", - "version" : 1 - } -} diff --git a/apps/rider_new/ios/Runner/Assets.xcassets/LaunchBackground.imageset/Contents.json b/apps/rider_new/ios/Runner/Assets.xcassets/LaunchBackground.imageset/Contents.json deleted file mode 100644 index 9f447e1..0000000 --- a/apps/rider_new/ios/Runner/Assets.xcassets/LaunchBackground.imageset/Contents.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "images" : [ - { - "filename" : "background.png", - "idiom" : "universal", - "scale" : "1x" - }, - { - "idiom" : "universal", - "scale" : "2x" - }, - { - "idiom" : "universal", - "scale" : "3x" - } - ], - "info" : { - "author" : "xcode", - "version" : 1 - } -} diff --git a/apps/rider_new/ios/Runner/Assets.xcassets/LaunchBackground.imageset/background.png b/apps/rider_new/ios/Runner/Assets.xcassets/LaunchBackground.imageset/background.png deleted file mode 100644 index 8e21404..0000000 Binary files a/apps/rider_new/ios/Runner/Assets.xcassets/LaunchBackground.imageset/background.png and /dev/null differ diff --git a/apps/rider_new/ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json b/apps/rider_new/ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json deleted file mode 100644 index 00cabce..0000000 --- a/apps/rider_new/ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "images" : [ - { - "filename" : "LaunchImage.png", - "idiom" : "universal", - "scale" : "1x" - }, - { - "filename" : "LaunchImage@2x.png", - "idiom" : "universal", - "scale" : "2x" - }, - { - "filename" : "LaunchImage@3x.png", - "idiom" : "universal", - "scale" : "3x" - } - ], - "info" : { - "author" : "xcode", - "version" : 1 - } -} diff --git a/apps/rider_new/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png b/apps/rider_new/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png deleted file mode 100644 index 6694368..0000000 Binary files a/apps/rider_new/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png and /dev/null differ diff --git a/apps/rider_new/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png b/apps/rider_new/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png deleted file mode 100644 index 769f7c4..0000000 Binary files a/apps/rider_new/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png and /dev/null differ diff --git a/apps/rider_new/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png b/apps/rider_new/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png deleted file mode 100644 index 5fd14db..0000000 Binary files a/apps/rider_new/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png and /dev/null differ diff --git a/apps/rider_new/ios/Runner/Assets.xcassets/icon_share.imageset/Contents.json b/apps/rider_new/ios/Runner/Assets.xcassets/icon_share.imageset/Contents.json deleted file mode 100644 index 028dbdf..0000000 --- a/apps/rider_new/ios/Runner/Assets.xcassets/icon_share.imageset/Contents.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "images" : [ - { - "filename" : "icon_share.png", - "idiom" : "universal", - "scale" : "1x" - }, - { - "idiom" : "universal", - "scale" : "2x" - }, - { - "idiom" : "universal", - "scale" : "3x" - } - ], - "info" : { - "author" : "xcode", - "version" : 1 - } -} diff --git a/apps/rider_new/ios/Runner/Assets.xcassets/icon_share.imageset/icon_share.png b/apps/rider_new/ios/Runner/Assets.xcassets/icon_share.imageset/icon_share.png deleted file mode 100644 index ae92be6..0000000 Binary files a/apps/rider_new/ios/Runner/Assets.xcassets/icon_share.imageset/icon_share.png and /dev/null differ diff --git a/apps/rider_new/ios/Runner/Assets.xcassets/icon_support.imageset/Contents.json b/apps/rider_new/ios/Runner/Assets.xcassets/icon_support.imageset/Contents.json deleted file mode 100644 index cc0fc26..0000000 --- a/apps/rider_new/ios/Runner/Assets.xcassets/icon_support.imageset/Contents.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "images" : [ - { - "filename" : "icon_support.png", - "idiom" : "universal", - "scale" : "1x" - }, - { - "idiom" : "universal", - "scale" : "2x" - }, - { - "idiom" : "universal", - "scale" : "3x" - } - ], - "info" : { - "author" : "xcode", - "version" : 1 - } -} diff --git a/apps/rider_new/ios/Runner/Assets.xcassets/icon_support.imageset/icon_support.png b/apps/rider_new/ios/Runner/Assets.xcassets/icon_support.imageset/icon_support.png deleted file mode 100644 index 5a9fef9..0000000 Binary files a/apps/rider_new/ios/Runner/Assets.xcassets/icon_support.imageset/icon_support.png and /dev/null differ diff --git a/apps/rider_new/ios/Runner/Assets.xcassets/icon_user.imageset/Contents.json b/apps/rider_new/ios/Runner/Assets.xcassets/icon_user.imageset/Contents.json deleted file mode 100644 index 32ae8f7..0000000 --- a/apps/rider_new/ios/Runner/Assets.xcassets/icon_user.imageset/Contents.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "images" : [ - { - "filename" : "icon_user.png", - "idiom" : "universal", - "scale" : "1x" - }, - { - "idiom" : "universal", - "scale" : "2x" - }, - { - "idiom" : "universal", - "scale" : "3x" - } - ], - "info" : { - "author" : "xcode", - "version" : 1 - } -} diff --git a/apps/rider_new/ios/Runner/Assets.xcassets/icon_user.imageset/icon_user.png b/apps/rider_new/ios/Runner/Assets.xcassets/icon_user.imageset/icon_user.png deleted file mode 100644 index c8802f2..0000000 Binary files a/apps/rider_new/ios/Runner/Assets.xcassets/icon_user.imageset/icon_user.png and /dev/null differ diff --git a/apps/rider_new/ios/Runner/Assets.xcassets/icon_wallet.imageset/Contents.json b/apps/rider_new/ios/Runner/Assets.xcassets/icon_wallet.imageset/Contents.json deleted file mode 100644 index 3800eed..0000000 --- a/apps/rider_new/ios/Runner/Assets.xcassets/icon_wallet.imageset/Contents.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "images" : [ - { - "filename" : "icon_wallet.png", - "idiom" : "universal", - "scale" : "1x" - }, - { - "idiom" : "universal", - "scale" : "2x" - }, - { - "idiom" : "universal", - "scale" : "3x" - } - ], - "info" : { - "author" : "xcode", - "version" : 1 - } -} diff --git a/apps/rider_new/ios/Runner/Assets.xcassets/icon_wallet.imageset/icon_wallet.png b/apps/rider_new/ios/Runner/Assets.xcassets/icon_wallet.imageset/icon_wallet.png deleted file mode 100644 index 551f8a4..0000000 Binary files a/apps/rider_new/ios/Runner/Assets.xcassets/icon_wallet.imageset/icon_wallet.png and /dev/null differ diff --git a/apps/rider_new/ios/Runner/Base.lproj/LaunchScreen.storyboard b/apps/rider_new/ios/Runner/Base.lproj/LaunchScreen.storyboard deleted file mode 100644 index 6f0f33c..0000000 --- a/apps/rider_new/ios/Runner/Base.lproj/LaunchScreen.storyboard +++ /dev/null @@ -1,44 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/apps/rider_new/ios/Runner/Base.lproj/Main.storyboard b/apps/rider_new/ios/Runner/Base.lproj/Main.storyboard deleted file mode 100644 index f3c2851..0000000 --- a/apps/rider_new/ios/Runner/Base.lproj/Main.storyboard +++ /dev/null @@ -1,26 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/apps/rider_new/ios/Runner/Config.plist b/apps/rider_new/ios/Runner/Config.plist deleted file mode 100644 index 508df79..0000000 --- a/apps/rider_new/ios/Runner/Config.plist +++ /dev/null @@ -1,10 +0,0 @@ - - - - - APIKey - AIzaSyCf2mW2h0HD8ZYjwh4VOa2ladw6MJkCDTM - Environment - development - - diff --git a/apps/rider_new/ios/Runner/Constants1.swift b/apps/rider_new/ios/Runner/Constants1.swift deleted file mode 100644 index e240caa..0000000 --- a/apps/rider_new/ios/Runner/Constants1.swift +++ /dev/null @@ -1,12 +0,0 @@ -// -// Constants1.swift -// Runner -// -// Created by Hamza Aleghwairyeen on 20/02/2025. -// - -import Foundation - -struct Constants { - static let googleMapsAPIKey = "AIzaSyD0a1b2c3d4e5f6g7h8i9j0k1l2m3n4o5p6q" -} diff --git a/apps/rider_new/ios/Runner/Info.plist b/apps/rider_new/ios/Runner/Info.plist deleted file mode 100644 index 31e941a..0000000 --- a/apps/rider_new/ios/Runner/Info.plist +++ /dev/null @@ -1,103 +0,0 @@ - - - - - LSApplicationQueriesSchemes - - googlechromes - comgooglemaps - - NSContactsUsageDescription - This app requires contacts access to function properly. - LSMinimumSystemVersion - 12.0 - CFBundleURLTypes - - - CFBundleTypeRole - Editor - CFBundleURLSchemes - - com.googleusercontent.apps.594687661098-8e26699cris2k3nj5msj1osi59it9kpf - - - - CADisableMinimumFrameDurationOnPhone - - CFBundleDevelopmentRegion - $(DEVELOPMENT_LANGUAGE) - CFBundleDisplayName - Tripz - CFBundleExecutable - $(EXECUTABLE_NAME) - CFBundleGetInfoString - - CFBundleIdentifier - $(PRODUCT_BUNDLE_IDENTIFIER) - CFBundleInfoDictionaryVersion - 6.0 - CFBundleName - Tripz - CFBundlePackageType - APPL - CFBundleShortVersionString - 106 - CFBundleSignature - ???? - CFBundleVersion - 5.0.996 - NSHumanReadableCopyright - - FirebaseAppDelegateProxyEnabled - NO - GMSApiKey - YOUR_API_KEY - LSApplicationCategoryType - - LSRequiresIPhoneOS - - NSCameraUsageDescription - Sovo app requires access to your camera in order to scan QR codes and capture images for uploading and access to connect to a call. - NSFaceIDUsageDescription - Use Face ID to securely authenticate payment accounts. - NSLocationAlwaysAndWhenInUseUsageDescription - This app needs access to your location to provide you with the best ride experience. Your location data will be used to find the nearest available cars and connect you with the closest captain for efficient and convenient rides. - NSLocationAlwaysUsageDescription - This app needs access to location. - NSLocationWhenInUseUsageDescription - This app needs access to your location to provide you with the best ride experience. Your location data will be used to find the nearest available cars and connect you with the closest captain for efficient and convenient rides. - NSMicrophoneUsageDescription - This app requires access to your microphone to record audio, allowing you to add voice recordings to your photos and videos and access to connect to a call. - NSPhotoLibraryUsageDescription - Explanation of why your app needs access to the photo library. - UIApplicationSupportsIndirectInputEvents - - UIBackgroundModes - - fetch - location - remote-notification - - UILaunchStoryboardName - LaunchScreen - UIMainStoryboardFile - Main - UISupportedInterfaceOrientations - - UIInterfaceOrientationPortrait - UIInterfaceOrientationLandscapeLeft - UIInterfaceOrientationLandscapeRight - - UISupportedInterfaceOrientations~ipad - - UIInterfaceOrientationPortrait - UIInterfaceOrientationPortraitUpsideDown - UIInterfaceOrientationLandscapeLeft - UIInterfaceOrientationLandscapeRight - - UIViewControllerBasedStatusBarAppearance - - UIStatusBarHidden - - - diff --git a/apps/rider_new/ios/Runner/JailbreakDetection.swift b/apps/rider_new/ios/Runner/JailbreakDetection.swift deleted file mode 100644 index 504e30e..0000000 --- a/apps/rider_new/ios/Runner/JailbreakDetection.swift +++ /dev/null @@ -1,25 +0,0 @@ -// -// JailbreakDetection.swift -// Runner -// -// Created by Hamza Aleghwairyeen on 15/02/2025. -// - -import Foundation - -class JailbreakDetection { - static func isJailbroken() -> Bool { - let paths = [ - "/Applications/Cydia.app", - "/Library/MobileSubstrate/MobileSubstrate.dylib", - "/usr/sbin/sshd", - "/etc/apt" - ] - for path in paths { - if FileManager.default.fileExists(atPath: path) { - return true - } - } - return false - } -} diff --git a/apps/rider_new/ios/Runner/KeychainHelper.swift b/apps/rider_new/ios/Runner/KeychainHelper.swift deleted file mode 100644 index 8e62bc2..0000000 --- a/apps/rider_new/ios/Runner/KeychainHelper.swift +++ /dev/null @@ -1,59 +0,0 @@ -// -// KeychainHelper.swift -// Runner -// -// Created by Hamza Aleghwairyeen on 12/03/2025. -// - -import Foundation -import Security - -class KeychainHelper { - static let shared = KeychainHelper() - - private init() {} - - // حفظ البيانات في Keychain - func save(key: String, value: String) { - let data = value.data(using: .utf8)! - - let query: [String: Any] = [ - kSecClass as String: kSecClassGenericPassword, - kSecAttrAccount as String: key, - kSecValueData as String: data, - kSecAttrAccessible as String: kSecAttrAccessibleWhenUnlockedThisDeviceOnly - ] - - SecItemDelete(query as CFDictionary) // حذف أي قيمة قديمة بنفس المفتاح - SecItemAdd(query as CFDictionary, nil) // إضافة القيمة الجديدة - } - - // استرجاع البيانات من Keychain - func get(key: String) -> String? { - let query: [String: Any] = [ - kSecClass as String: kSecClassGenericPassword, - kSecAttrAccount as String: key, - kSecReturnData as String: kCFBooleanTrue!, - kSecMatchLimit as String: kSecMatchLimitOne - ] - - var dataTypeRef: AnyObject? - let status = SecItemCopyMatching(query as CFDictionary, &dataTypeRef) - - guard status == errSecSuccess, let data = dataTypeRef as? Data else { - return nil - } - - return String(data: data, encoding: .utf8) - } - - // حذف البيانات من Keychain - func delete(key: String) { - let query: [String: Any] = [ - kSecClass as String: kSecClassGenericPassword, - kSecAttrAccount as String: key - ] - - SecItemDelete(query as CFDictionary) - } -} diff --git a/apps/rider_new/ios/Runner/Localizable.strings b/apps/rider_new/ios/Runner/Localizable.strings deleted file mode 100644 index dd8ea57..0000000 --- a/apps/rider_new/ios/Runner/Localizable.strings +++ /dev/null @@ -1,10 +0,0 @@ -// -// Localizable.strings -// Runner -// -// Created by Hamza Aleghwairyeen on 12/03/2025. -// - -"Security Warning" = "تحذير أمني"; -"Compromised device detected. Exiting." = "تم اكتشاف جهاز مُخترق. جارٍ الخروج."; -"OK" = "موافق"; diff --git a/apps/rider_new/ios/Runner/Runner 2025-03-13 15-43-51/DistributionSummary.plist b/apps/rider_new/ios/Runner/Runner 2025-03-13 15-43-51/DistributionSummary.plist deleted file mode 100644 index 5512065..0000000 --- a/apps/rider_new/ios/Runner/Runner 2025-03-13 15-43-51/DistributionSummary.plist +++ /dev/null @@ -1,1660 +0,0 @@ - - - - - Tripz.ipa - - - architectures - - arm64 - - buildNumber - 5.0.98 - certificate - - SHA1 - 0DC7C14BF54BBD12B1B1125DDF97C7F90395C9EF - dateExpires - 16/07/2025 - type - Cloud Managed Apple Distribution - - embeddedBinaries - - - architectures - - arm64 - - buildNumber - 1.0 - certificate - - SHA1 - 0DC7C14BF54BBD12B1B1125DDF97C7F90395C9EF - dateExpires - 16/07/2025 - type - Cloud Managed Apple Distribution - - name - App.framework - team - - id - 63CVT8G5P8 - name - Hamza Ayed - - versionNumber - 1.0 - - - architectures - - arm64 - - buildNumber - 1 - certificate - - SHA1 - 0DC7C14BF54BBD12B1B1125DDF97C7F90395C9EF - dateExpires - 16/07/2025 - type - Cloud Managed Apple Distribution - - name - AppAuth.framework - team - - id - 63CVT8G5P8 - name - Hamza Ayed - - versionNumber - 1.7.6 - - - architectures - - arm64 - - buildNumber - 1 - certificate - - SHA1 - 0DC7C14BF54BBD12B1B1125DDF97C7F90395C9EF - dateExpires - 16/07/2025 - type - Cloud Managed Apple Distribution - - name - FBLPromises.framework - team - - id - 63CVT8G5P8 - name - Hamza Ayed - - versionNumber - 2.4.0 - - - architectures - - arm64 - - buildNumber - 1 - certificate - - SHA1 - 0DC7C14BF54BBD12B1B1125DDF97C7F90395C9EF - dateExpires - 16/07/2025 - type - Cloud Managed Apple Distribution - - name - FirebaseAppCheckInterop.framework - team - - id - 63CVT8G5P8 - name - Hamza Ayed - - versionNumber - 11.6.0 - - - architectures - - arm64 - - buildNumber - 1 - certificate - - SHA1 - 0DC7C14BF54BBD12B1B1125DDF97C7F90395C9EF - dateExpires - 16/07/2025 - type - Cloud Managed Apple Distribution - - name - FirebaseAuth.framework - team - - id - 63CVT8G5P8 - name - Hamza Ayed - - versionNumber - 11.4.0 - - - architectures - - arm64 - - buildNumber - 1 - certificate - - SHA1 - 0DC7C14BF54BBD12B1B1125DDF97C7F90395C9EF - dateExpires - 16/07/2025 - type - Cloud Managed Apple Distribution - - name - FirebaseAuthInterop.framework - team - - id - 63CVT8G5P8 - name - Hamza Ayed - - versionNumber - 11.6.0 - - - architectures - - arm64 - - buildNumber - 1 - certificate - - SHA1 - 0DC7C14BF54BBD12B1B1125DDF97C7F90395C9EF - dateExpires - 16/07/2025 - type - Cloud Managed Apple Distribution - - name - FirebaseCore.framework - team - - id - 63CVT8G5P8 - name - Hamza Ayed - - versionNumber - 11.4.0 - - - architectures - - arm64 - - buildNumber - 1 - certificate - - SHA1 - 0DC7C14BF54BBD12B1B1125DDF97C7F90395C9EF - dateExpires - 16/07/2025 - type - Cloud Managed Apple Distribution - - name - FirebaseCoreExtension.framework - team - - id - 63CVT8G5P8 - name - Hamza Ayed - - versionNumber - 11.4.1 - - - architectures - - arm64 - - buildNumber - 1 - certificate - - SHA1 - 0DC7C14BF54BBD12B1B1125DDF97C7F90395C9EF - dateExpires - 16/07/2025 - type - Cloud Managed Apple Distribution - - name - FirebaseCoreInternal.framework - team - - id - 63CVT8G5P8 - name - Hamza Ayed - - versionNumber - 11.6.0 - - - architectures - - arm64 - - buildNumber - 1 - certificate - - SHA1 - 0DC7C14BF54BBD12B1B1125DDF97C7F90395C9EF - dateExpires - 16/07/2025 - type - Cloud Managed Apple Distribution - - name - FirebaseInstallations.framework - team - - id - 63CVT8G5P8 - name - Hamza Ayed - - versionNumber - 11.4.0 - - - architectures - - arm64 - - buildNumber - 1 - certificate - - SHA1 - 0DC7C14BF54BBD12B1B1125DDF97C7F90395C9EF - dateExpires - 16/07/2025 - type - Cloud Managed Apple Distribution - - name - FirebaseMessaging.framework - team - - id - 63CVT8G5P8 - name - Hamza Ayed - - versionNumber - 11.4.0 - - - architectures - - arm64 - - buildNumber - 1.0 - certificate - - SHA1 - 0DC7C14BF54BBD12B1B1125DDF97C7F90395C9EF - dateExpires - 16/07/2025 - type - Cloud Managed Apple Distribution - - name - Flutter.framework - team - - id - 63CVT8G5P8 - name - Hamza Ayed - - versionNumber - 1.0 - - - architectures - - arm64 - - buildNumber - 1 - certificate - - SHA1 - 0DC7C14BF54BBD12B1B1125DDF97C7F90395C9EF - dateExpires - 16/07/2025 - type - Cloud Managed Apple Distribution - - name - GTMAppAuth.framework - team - - id - 63CVT8G5P8 - name - Hamza Ayed - - versionNumber - 4.1.1 - - - architectures - - arm64 - - buildNumber - 1 - certificate - - SHA1 - 0DC7C14BF54BBD12B1B1125DDF97C7F90395C9EF - dateExpires - 16/07/2025 - type - Cloud Managed Apple Distribution - - name - GTMSessionFetcher.framework - team - - id - 63CVT8G5P8 - name - Hamza Ayed - - versionNumber - 3.5.0 - - - architectures - - arm64 - - buildNumber - 1 - certificate - - SHA1 - 0DC7C14BF54BBD12B1B1125DDF97C7F90395C9EF - dateExpires - 16/07/2025 - type - Cloud Managed Apple Distribution - - name - GoogleDataTransport.framework - team - - id - 63CVT8G5P8 - name - Hamza Ayed - - versionNumber - 10.1.0 - - - architectures - - arm64 - - buildNumber - 1 - certificate - - SHA1 - 0DC7C14BF54BBD12B1B1125DDF97C7F90395C9EF - dateExpires - 16/07/2025 - type - Cloud Managed Apple Distribution - - name - GoogleSignIn.framework - team - - id - 63CVT8G5P8 - name - Hamza Ayed - - versionNumber - 7.1.0 - - - architectures - - arm64 - - buildNumber - 1 - certificate - - SHA1 - 0DC7C14BF54BBD12B1B1125DDF97C7F90395C9EF - dateExpires - 16/07/2025 - type - Cloud Managed Apple Distribution - - name - GoogleUtilities.framework - team - - id - 63CVT8G5P8 - name - Hamza Ayed - - versionNumber - 8.0.2 - - - architectures - - arm64 - - buildNumber - 1 - certificate - - SHA1 - 0DC7C14BF54BBD12B1B1125DDF97C7F90395C9EF - dateExpires - 16/07/2025 - type - Cloud Managed Apple Distribution - - name - IOSSecuritySuite.framework - team - - id - 63CVT8G5P8 - name - Hamza Ayed - - versionNumber - 1.9.11 - - - architectures - - arm64 - - buildNumber - 1 - certificate - - SHA1 - 0DC7C14BF54BBD12B1B1125DDF97C7F90395C9EF - dateExpires - 16/07/2025 - type - Cloud Managed Apple Distribution - - name - RecaptchaInterop.framework - team - - id - 63CVT8G5P8 - name - Hamza Ayed - - versionNumber - 100.0.0 - - - architectures - - arm64 - - buildNumber - 1 - certificate - - SHA1 - 0DC7C14BF54BBD12B1B1125DDF97C7F90395C9EF - dateExpires - 16/07/2025 - type - Cloud Managed Apple Distribution - - name - Stripe.framework - team - - id - 63CVT8G5P8 - name - Hamza Ayed - - versionNumber - 23.30.0 - - - architectures - - arm64 - - buildNumber - 1 - certificate - - SHA1 - 0DC7C14BF54BBD12B1B1125DDF97C7F90395C9EF - dateExpires - 16/07/2025 - type - Cloud Managed Apple Distribution - - name - StripeApplePay.framework - team - - id - 63CVT8G5P8 - name - Hamza Ayed - - versionNumber - 23.30.0 - - - architectures - - arm64 - - buildNumber - 1 - certificate - - SHA1 - 0DC7C14BF54BBD12B1B1125DDF97C7F90395C9EF - dateExpires - 16/07/2025 - type - Cloud Managed Apple Distribution - - name - StripeCore.framework - team - - id - 63CVT8G5P8 - name - Hamza Ayed - - versionNumber - 23.30.0 - - - architectures - - arm64 - - buildNumber - 1 - certificate - - SHA1 - 0DC7C14BF54BBD12B1B1125DDF97C7F90395C9EF - dateExpires - 16/07/2025 - type - Cloud Managed Apple Distribution - - name - StripeFinancialConnections.framework - team - - id - 63CVT8G5P8 - name - Hamza Ayed - - versionNumber - 23.30.0 - - - architectures - - arm64 - - buildNumber - 1 - certificate - - SHA1 - 0DC7C14BF54BBD12B1B1125DDF97C7F90395C9EF - dateExpires - 16/07/2025 - type - Cloud Managed Apple Distribution - - name - StripePaymentSheet.framework - team - - id - 63CVT8G5P8 - name - Hamza Ayed - - versionNumber - 23.30.0 - - - architectures - - arm64 - - buildNumber - 1 - certificate - - SHA1 - 0DC7C14BF54BBD12B1B1125DDF97C7F90395C9EF - dateExpires - 16/07/2025 - type - Cloud Managed Apple Distribution - - name - StripePayments.framework - team - - id - 63CVT8G5P8 - name - Hamza Ayed - - versionNumber - 23.30.0 - - - architectures - - arm64 - - buildNumber - 1 - certificate - - SHA1 - 0DC7C14BF54BBD12B1B1125DDF97C7F90395C9EF - dateExpires - 16/07/2025 - type - Cloud Managed Apple Distribution - - name - StripePaymentsUI.framework - team - - id - 63CVT8G5P8 - name - Hamza Ayed - - versionNumber - 23.30.0 - - - architectures - - arm64 - - buildNumber - 1 - certificate - - SHA1 - 0DC7C14BF54BBD12B1B1125DDF97C7F90395C9EF - dateExpires - 16/07/2025 - type - Cloud Managed Apple Distribution - - name - StripeUICore.framework - team - - id - 63CVT8G5P8 - name - Hamza Ayed - - versionNumber - 23.30.0 - - - architectures - - arm64 - - buildNumber - 1 - certificate - - SHA1 - 0DC7C14BF54BBD12B1B1125DDF97C7F90395C9EF - dateExpires - 16/07/2025 - type - Cloud Managed Apple Distribution - - name - TOCropViewController.framework - team - - id - 63CVT8G5P8 - name - Hamza Ayed - - versionNumber - 2.7.4 - - - architectures - - arm64 - - buildNumber - 1 - certificate - - SHA1 - 0DC7C14BF54BBD12B1B1125DDF97C7F90395C9EF - dateExpires - 16/07/2025 - type - Cloud Managed Apple Distribution - - name - audio_session.framework - team - - id - 63CVT8G5P8 - name - Hamza Ayed - - versionNumber - 0.0.1 - - - architectures - - arm64 - - buildNumber - 1 - certificate - - SHA1 - 0DC7C14BF54BBD12B1B1125DDF97C7F90395C9EF - dateExpires - 16/07/2025 - type - Cloud Managed Apple Distribution - - name - device_info_plus.framework - team - - id - 63CVT8G5P8 - name - Hamza Ayed - - versionNumber - 0.0.1 - - - architectures - - arm64 - - buildNumber - 1 - certificate - - SHA1 - 0DC7C14BF54BBD12B1B1125DDF97C7F90395C9EF - dateExpires - 16/07/2025 - type - Cloud Managed Apple Distribution - - name - flutter_app_group_directory.framework - team - - id - 63CVT8G5P8 - name - Hamza Ayed - - versionNumber - 0.0.1 - - - architectures - - arm64 - - buildNumber - 1 - certificate - - SHA1 - 0DC7C14BF54BBD12B1B1125DDF97C7F90395C9EF - dateExpires - 16/07/2025 - type - Cloud Managed Apple Distribution - - name - flutter_contacts.framework - team - - id - 63CVT8G5P8 - name - Hamza Ayed - - versionNumber - 0.0.1 - - - architectures - - arm64 - - buildNumber - 1 - certificate - - SHA1 - 0DC7C14BF54BBD12B1B1125DDF97C7F90395C9EF - dateExpires - 16/07/2025 - type - Cloud Managed Apple Distribution - - name - flutter_local_notifications.framework - team - - id - 63CVT8G5P8 - name - Hamza Ayed - - versionNumber - 0.0.1 - - - architectures - - arm64 - - buildNumber - 1 - certificate - - SHA1 - 0DC7C14BF54BBD12B1B1125DDF97C7F90395C9EF - dateExpires - 16/07/2025 - type - Cloud Managed Apple Distribution - - name - flutter_secure_storage.framework - team - - id - 63CVT8G5P8 - name - Hamza Ayed - - versionNumber - 6.0.0 - - - architectures - - arm64 - - buildNumber - 1 - certificate - - SHA1 - 0DC7C14BF54BBD12B1B1125DDF97C7F90395C9EF - dateExpires - 16/07/2025 - type - Cloud Managed Apple Distribution - - name - geolocator_apple.framework - team - - id - 63CVT8G5P8 - name - Hamza Ayed - - versionNumber - 1.2.0 - - - architectures - - arm64 - - buildNumber - 1 - certificate - - SHA1 - 0DC7C14BF54BBD12B1B1125DDF97C7F90395C9EF - dateExpires - 16/07/2025 - type - Cloud Managed Apple Distribution - - name - image_cropper.framework - team - - id - 63CVT8G5P8 - name - Hamza Ayed - - versionNumber - 0.0.4 - - - architectures - - arm64 - - buildNumber - 1 - certificate - - SHA1 - 0DC7C14BF54BBD12B1B1125DDF97C7F90395C9EF - dateExpires - 16/07/2025 - type - Cloud Managed Apple Distribution - - name - image_picker_ios.framework - team - - id - 63CVT8G5P8 - name - Hamza Ayed - - versionNumber - 0.0.1 - - - architectures - - arm64 - - buildNumber - 1 - certificate - - SHA1 - 0DC7C14BF54BBD12B1B1125DDF97C7F90395C9EF - dateExpires - 16/07/2025 - type - Cloud Managed Apple Distribution - - name - jailbreak_root_detection.framework - team - - id - 63CVT8G5P8 - name - Hamza Ayed - - versionNumber - 1.0.1 - - - architectures - - arm64 - - buildNumber - 1 - certificate - - SHA1 - 0DC7C14BF54BBD12B1B1125DDF97C7F90395C9EF - dateExpires - 16/07/2025 - type - Cloud Managed Apple Distribution - - name - just_audio.framework - team - - id - 63CVT8G5P8 - name - Hamza Ayed - - versionNumber - 0.0.1 - - - architectures - - arm64 - - buildNumber - 1 - certificate - - SHA1 - 0DC7C14BF54BBD12B1B1125DDF97C7F90395C9EF - dateExpires - 16/07/2025 - type - Cloud Managed Apple Distribution - - name - live_activities.framework - team - - id - 63CVT8G5P8 - name - Hamza Ayed - - versionNumber - 0.0.1 - - - architectures - - arm64 - - buildNumber - 1 - certificate - - SHA1 - 0DC7C14BF54BBD12B1B1125DDF97C7F90395C9EF - dateExpires - 16/07/2025 - type - Cloud Managed Apple Distribution - - name - local_auth_darwin.framework - team - - id - 63CVT8G5P8 - name - Hamza Ayed - - versionNumber - 0.0.1 - - - architectures - - arm64 - - buildNumber - 1 - certificate - - SHA1 - 0DC7C14BF54BBD12B1B1125DDF97C7F90395C9EF - dateExpires - 16/07/2025 - type - Cloud Managed Apple Distribution - - name - location.framework - team - - id - 63CVT8G5P8 - name - Hamza Ayed - - versionNumber - 0.0.1 - - - architectures - - arm64 - - buildNumber - 1 - certificate - - SHA1 - 0DC7C14BF54BBD12B1B1125DDF97C7F90395C9EF - dateExpires - 16/07/2025 - type - Cloud Managed Apple Distribution - - name - nanopb.framework - team - - id - 63CVT8G5P8 - name - Hamza Ayed - - versionNumber - 3.30910.0 - - - architectures - - arm64 - - buildNumber - 1 - certificate - - SHA1 - 0DC7C14BF54BBD12B1B1125DDF97C7F90395C9EF - dateExpires - 16/07/2025 - type - Cloud Managed Apple Distribution - - name - package_info_plus.framework - team - - id - 63CVT8G5P8 - name - Hamza Ayed - - versionNumber - 0.4.5 - - - architectures - - arm64 - - buildNumber - 1 - certificate - - SHA1 - 0DC7C14BF54BBD12B1B1125DDF97C7F90395C9EF - dateExpires - 16/07/2025 - type - Cloud Managed Apple Distribution - - name - path_provider_foundation.framework - team - - id - 63CVT8G5P8 - name - Hamza Ayed - - versionNumber - 0.0.1 - - - architectures - - arm64 - - buildNumber - 1 - certificate - - SHA1 - 0DC7C14BF54BBD12B1B1125DDF97C7F90395C9EF - dateExpires - 16/07/2025 - type - Cloud Managed Apple Distribution - - name - quick_actions_ios.framework - team - - id - 63CVT8G5P8 - name - Hamza Ayed - - versionNumber - 0.0.1 - - - architectures - - arm64 - - buildNumber - 1 - certificate - - SHA1 - 0DC7C14BF54BBD12B1B1125DDF97C7F90395C9EF - dateExpires - 16/07/2025 - type - Cloud Managed Apple Distribution - - name - record_darwin.framework - team - - id - 63CVT8G5P8 - name - Hamza Ayed - - versionNumber - 1.0.0 - - - architectures - - arm64 - - buildNumber - 1 - certificate - - SHA1 - 0DC7C14BF54BBD12B1B1125DDF97C7F90395C9EF - dateExpires - 16/07/2025 - type - Cloud Managed Apple Distribution - - name - share.framework - team - - id - 63CVT8G5P8 - name - Hamza Ayed - - versionNumber - 0.0.1 - - - architectures - - arm64 - - buildNumber - 1 - certificate - - SHA1 - 0DC7C14BF54BBD12B1B1125DDF97C7F90395C9EF - dateExpires - 16/07/2025 - type - Cloud Managed Apple Distribution - - name - sign_in_with_apple.framework - team - - id - 63CVT8G5P8 - name - Hamza Ayed - - versionNumber - 0.0.1 - - - architectures - - arm64 - - buildNumber - 1 - certificate - - SHA1 - 0DC7C14BF54BBD12B1B1125DDF97C7F90395C9EF - dateExpires - 16/07/2025 - type - Cloud Managed Apple Distribution - - name - sqflite_darwin.framework - team - - id - 63CVT8G5P8 - name - Hamza Ayed - - versionNumber - 0.0.4 - - - architectures - - arm64 - - buildNumber - 1 - certificate - - SHA1 - 0DC7C14BF54BBD12B1B1125DDF97C7F90395C9EF - dateExpires - 16/07/2025 - type - Cloud Managed Apple Distribution - - name - stripe_ios.framework - team - - id - 63CVT8G5P8 - name - Hamza Ayed - - versionNumber - 0.0.1 - - - architectures - - arm64 - - buildNumber - 1 - certificate - - SHA1 - 0DC7C14BF54BBD12B1B1125DDF97C7F90395C9EF - dateExpires - 16/07/2025 - type - Cloud Managed Apple Distribution - - name - uni_links.framework - team - - id - 63CVT8G5P8 - name - Hamza Ayed - - versionNumber - 0.0.1 - - - architectures - - arm64 - - buildNumber - 1 - certificate - - SHA1 - 0DC7C14BF54BBD12B1B1125DDF97C7F90395C9EF - dateExpires - 16/07/2025 - type - Cloud Managed Apple Distribution - - name - url_launcher_ios.framework - team - - id - 63CVT8G5P8 - name - Hamza Ayed - - versionNumber - 0.0.1 - - - architectures - - arm64 - - buildNumber - 1 - certificate - - SHA1 - 0DC7C14BF54BBD12B1B1125DDF97C7F90395C9EF - dateExpires - 16/07/2025 - type - Cloud Managed Apple Distribution - - name - vibration.framework - team - - id - 63CVT8G5P8 - name - Hamza Ayed - - versionNumber - 1.7.5 - - - architectures - - arm64 - - buildNumber - 1 - certificate - - SHA1 - 0DC7C14BF54BBD12B1B1125DDF97C7F90395C9EF - dateExpires - 16/07/2025 - type - Cloud Managed Apple Distribution - - name - video_player_avfoundation.framework - team - - id - 63CVT8G5P8 - name - Hamza Ayed - - versionNumber - 0.0.1 - - - architectures - - arm64 - - buildNumber - 1 - certificate - - SHA1 - 0DC7C14BF54BBD12B1B1125DDF97C7F90395C9EF - dateExpires - 16/07/2025 - type - Cloud Managed Apple Distribution - - name - wakelock_plus.framework - team - - id - 63CVT8G5P8 - name - Hamza Ayed - - versionNumber - 0.0.1 - - - architectures - - arm64 - - buildNumber - 1 - certificate - - SHA1 - 0DC7C14BF54BBD12B1B1125DDF97C7F90395C9EF - dateExpires - 16/07/2025 - type - Cloud Managed Apple Distribution - - name - webview_flutter_wkwebview.framework - team - - id - 63CVT8G5P8 - name - Hamza Ayed - - versionNumber - 0.0.1 - - - entitlements - - application-identifier - 63CVT8G5P8.com.mobileapp.store.ride - aps-environment - production - com.apple.developer.applesignin - - Default - - com.apple.developer.team-identifier - 63CVT8G5P8 - get-task-allow - - - name - Runner.app - profile - - UUID - aa6f6d7b-1caf-4321-958b-1047982a17e7 - dateExpires - 16/07/2025 - name - iOS Team Ad Hoc Provisioning Profile: com.mobileapp.store.ride - - team - - id - 63CVT8G5P8 - name - Hamza Ayed - - versionNumber - 98 - - - - diff --git a/apps/rider_new/ios/Runner/Runner 2025-03-13 15-43-51/ExportOptions.plist b/apps/rider_new/ios/Runner/Runner 2025-03-13 15-43-51/ExportOptions.plist deleted file mode 100644 index 2f64685..0000000 --- a/apps/rider_new/ios/Runner/Runner 2025-03-13 15-43-51/ExportOptions.plist +++ /dev/null @@ -1,18 +0,0 @@ - - - - - destination - export - method - release-testing - signingStyle - automatic - stripSwiftSymbols - - teamID - 63CVT8G5P8 - thinning - <none> - - diff --git a/apps/rider_new/ios/Runner/Runner-Bridging-Header.h b/apps/rider_new/ios/Runner/Runner-Bridging-Header.h deleted file mode 100644 index 2dd4564..0000000 --- a/apps/rider_new/ios/Runner/Runner-Bridging-Header.h +++ /dev/null @@ -1,2 +0,0 @@ -#import "GeneratedPluginRegistrant.h" -#import "SecurityChecks.h" diff --git a/apps/rider_new/ios/Runner/Runner.entitlements b/apps/rider_new/ios/Runner/Runner.entitlements deleted file mode 100644 index 80b5221..0000000 --- a/apps/rider_new/ios/Runner/Runner.entitlements +++ /dev/null @@ -1,12 +0,0 @@ - - - - - aps-environment - development - com.apple.developer.applesignin - - Default - - - diff --git a/apps/rider_new/ios/Runner/SecurityChecks.h b/apps/rider_new/ios/Runner/SecurityChecks.h deleted file mode 100644 index b41f391..0000000 --- a/apps/rider_new/ios/Runner/SecurityChecks.h +++ /dev/null @@ -1,24 +0,0 @@ -// -// SecurityChecks.h -// Runner -// -// Created by Hamza Aleghwairyeen on 12/03/2025. -// - -//#ifndef SecurityChecks_h -//#define SecurityChecks_h -// -// -//#endif /* SecurityChecks_h */ - - - -// SecurityChecks.h -#import -#import // Import UIKit - -@interface SecurityChecks : NSObject - -+ (BOOL)isDeviceCompromised; // Combined check - -@end diff --git a/apps/rider_new/ios/Runner/SecurityChecks.m b/apps/rider_new/ios/Runner/SecurityChecks.m deleted file mode 100644 index 752d891..0000000 --- a/apps/rider_new/ios/Runner/SecurityChecks.m +++ /dev/null @@ -1,197 +0,0 @@ -// -// SecurityChecks.m -// Runner -// -// Created by Hamza Aleghwairyeen on 12/03/2025. -// - -#import - - - -#import "SecurityChecks.h" -#import -#include -#import -#include // For _dyld_image_count and _dyld_get_image_name -#include // for fork() -#include //for socket, connect -#include // for sockaddr_in -#include // for inet_pton - -@implementation SecurityChecks - -+ (BOOL)isDeviceJailbroken { - // (Same jailbreak checks as before - from previous responses) - // 1. Check for common jailbreak files - NSArray *jailbreakPaths = @[ - @"/Applications/Cydia.app", -// #if !TARGET_IPHONE_SIMULATOR -// @"/bin/bash", -// #endif - @"/Library/MobileSubstrate/MobileSubstrate.dylib", - @"/bin/bash", - @"/usr/sbin/sshd", - @"/etc/apt", - @"/private/var/lib/apt/", - @"/private/var/tmp/cydia.log", - ]; - - for (NSString *path in jailbreakPaths) { - if ([[NSFileManager defaultManager] fileExistsAtPath:path]) { - NSLog(@"Jailbreak file detected: %@", path); - return YES; - } - } - - // 2. Check if we can write outside the sandbox (a strong indicator) - NSError *error = nil; - NSString *testPath = @"/private/jailbreaktest.txt"; - [@"test" writeToFile:testPath atomically:YES encoding:NSUTF8StringEncoding error:&error]; - - if (!error) { - // If we can write, it's jailbroken. Remove the file immediately. - [[NSFileManager defaultManager] removeItemAtPath:testPath error:nil]; - NSLog(@"Sandbox write test indicates jailbreak."); - return YES; - } - //3: Check for existence of the symbolic link /Applications. - struct stat s; - if (lstat("/Applications", &s) == 0) { - if (S_ISLNK(s.st_mode)) { - NSLog(@"Symbolic link /Applications exists, jailbroken"); - return YES; - } - } - - //4:Check for dyld Libraries - uint32_t count = _dyld_image_count(); - for (uint32_t i = 0 ; i < count ; ++i) { - const char *dyld = _dyld_get_image_name(i); - if (strstr(dyld, "MobileSubstrate") != NULL || strstr(dyld, "libcycript") != NULL) { - NSLog(@"Suspicious dyld library found: %s", dyld); - return YES; - } - } - - //5 Check if fork() is available. Sandboxed apps should not be able to call fork(). - #if !TARGET_IPHONE_SIMULATOR // Don't run this on the simulator - int pid = fork(); - if (pid == 0) - { - //in child, exit immediately to avoid crashing. - exit(0); - } else if (pid > 0) - { - NSLog(@"Fork available. Likely jailbroken."); - return YES; // Fork succeeded; likely jailbroken - } - #endif - - return NO; // No jailbreak indicators found -} -+ (BOOL)isDebuggerAttached { - int mib[4]; - struct kinfo_proc info; - size_t size = sizeof(info); - - mib[0] = CTL_KERN; - mib[1] = KERN_PROC; - mib[2] = KERN_PROC_PID; - mib[3] = getpid(); - - sysctl(mib, 4, &info, &size, NULL, 0); - - return (info.kp_proc.p_flag & P_TRACED) != 0; -} - -// Check for Frida's default port -+ (BOOL)isFridaListeningOnDefaultPort { - int sock = socket(AF_INET, SOCK_STREAM, 0); - if (sock == -1) { - return NO; // Couldn't create socket - } - - struct sockaddr_in sa; - memset(&sa, 0, sizeof(sa)); - sa.sin_family = AF_INET; - sa.sin_port = htons(27042); // Default Frida port - inet_pton(AF_INET, "127.0.0.1", &sa.sin_addr); - - if (connect(sock, (struct sockaddr *)&sa, sizeof(sa)) != -1) { - NSLog(@"Frida default port (27042) is open."); - close(sock); - return YES; - } - - close(sock); - return NO; -} - - -+ (BOOL)isFridaDetected { - int name[] = { CTL_KERN, KERN_PROC, KERN_PROC_ALL, 0 }; - size_t length; - struct kinfo_proc *procs, *proc; - - sysctl(name, 3, NULL, &length, NULL, 0); - procs = malloc(length); - sysctl(name, 3, procs, &length, NULL, 0); - - for (proc = procs; (char *)proc < (char *)procs + length; proc++) { - if (strstr(proc->kp_proc.p_comm, "frida") != NULL) { - free(procs); - return YES; - } - } - - free(procs); - return NO; -} -// Check for loaded dylibs that indicate Frida -+(BOOL) checkForFridaDylib{ - uint32_t count = _dyld_image_count(); - for (uint32_t i = 0 ; i < count ; ++i) { - const char *dyld = _dyld_get_image_name(i); - if (strstr(dyld, "FridaGadget") != NULL) { // Look for FridaGadget - NSLog(@"FridaGadget dylib found: %s", dyld); - return YES; - } - } - return NO; -} - -// Check process name -+ (BOOL)checkProcessName { - NSString* processName = [[NSProcessInfo processInfo] processName]; - if ([processName containsString:@"Frida"]) { - return YES; - } - return NO; -} - -// A combined check for jailbreak and Frida -+ (BOOL)isDeviceCompromised { - if ([SecurityChecks isDeviceJailbroken]) { - return YES; - } - if ([SecurityChecks isFridaListeningOnDefaultPort]) { - return YES; - } - if ([SecurityChecks checkForFridaDylib]) { - return YES; - } - if([SecurityChecks checkProcessName]){ - return YES; - } -// if ([SecurityChecks isDebuggerAttached]) { -// return YES; -// } -// if ([SecurityChecks isFridaDetected]) { -// return YES; -// } - - return NO; -} - -@end diff --git a/apps/rider_new/ios/Runner/order.wav b/apps/rider_new/ios/Runner/order.wav deleted file mode 100644 index b2b0ba2..0000000 Binary files a/apps/rider_new/ios/Runner/order.wav and /dev/null differ diff --git a/apps/rider_new/ios/Runner/tone2.wav b/apps/rider_new/ios/Runner/tone2.wav deleted file mode 100644 index 0582d47..0000000 Binary files a/apps/rider_new/ios/Runner/tone2.wav and /dev/null differ diff --git a/apps/rider_new/ios/RunnerTests/RunnerTests.swift b/apps/rider_new/ios/RunnerTests/RunnerTests.swift deleted file mode 100644 index 86a7c3b..0000000 --- a/apps/rider_new/ios/RunnerTests/RunnerTests.swift +++ /dev/null @@ -1,12 +0,0 @@ -import Flutter -import UIKit -import XCTest - -class RunnerTests: XCTestCase { - - func testExample() { - // If you add code to the Runner application, consider adding tests here. - // See https://developer.apple.com/documentation/xctest for more information about using XCTest. - } - -} diff --git a/apps/rider_new/ios/firebase_app_id_file.json b/apps/rider_new/ios/firebase_app_id_file.json deleted file mode 100644 index 5236662..0000000 --- a/apps/rider_new/ios/firebase_app_id_file.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "file_generated_by": "FlutterFire CLI", - "purpose": "FirebaseAppID & ProjectID for this Firebase app in this directory", - "GOOGLE_APP_ID": "1:594687661098:ios:6f69eee1449be943595f53", - "FIREBASE_PROJECT_ID": "ride-b1bd8", - "GCM_SENDER_ID": "594687661098" -} \ No newline at end of file diff --git a/apps/rider_new/l10n.yaml b/apps/rider_new/l10n.yaml deleted file mode 100644 index c22781d..0000000 --- a/apps/rider_new/l10n.yaml +++ /dev/null @@ -1,7 +0,0 @@ -# توليد الترجمة القياسي (docs/26 §4): ARB + gen_l10n. لا نص مرئي داخل widget. -arb-dir: lib/core/l10n -template-arb-file: app_ar.arb -output-localization-file: app_localizations.dart -output-class: L10n -output-dir: lib/core/l10n/gen -nullable-getter: false diff --git a/apps/rider_new/lib/app.dart b/apps/rider_new/lib/app.dart deleted file mode 100644 index fb42a30..0000000 --- a/apps/rider_new/lib/app.dart +++ /dev/null @@ -1,59 +0,0 @@ -import 'package:flutter/material.dart'; -import 'package:flutter_bloc/flutter_bloc.dart'; -import 'package:flutter_localizations/flutter_localizations.dart'; - -import 'core/build_config.dart'; -import 'core/design/theme.dart'; -import 'core/di.dart'; -import 'core/l10n/l10n.dart'; -import 'core/router.dart'; -import 'core/tenant/tenant_cubit.dart'; -import 'features/settings/cubit/settings_cubit.dart'; -import 'features/settings/cubit/settings_state.dart'; - -class TripzApp extends StatelessWidget { - const TripzApp({super.key}); - - @override - Widget build(BuildContext context) { - return MultiBlocProvider( - providers: [ - BlocProvider.value(value: sl()), - // إعداد المستأجر فوق الشجرة: كل شاشة تسأله عن ميزاتها بلا تمرير. - BlocProvider.value(value: sl()), - ], - child: BlocBuilder( - builder: (context, settings) { - return MaterialApp.router( - title: BuildConfig.appName, - debugShowCheckedModeBanner: false, - routerConfig: appRouter, - - // الثيم يُبنى من مدخلين لا ثالث لهما (docs/26 §4). - theme: buildTheme(Brightness.light, settings.locale), - darkTheme: buildTheme(Brightness.dark, settings.locale), - themeMode: settings.themeMode, - - // الاتجاه يتبع اللغة آلياً — لا `Directionality` مفروضة فوق كل - // شيء، وإلا انكسرت الإنجليزية (docs/26 §4). - locale: settings.locale, - supportedLocales: L10n.supportedLocales, - localizationsDelegates: const [ - ...L10n.localizationsDelegates, - GlobalMaterialLocalizations.delegate, - GlobalWidgetsLocalizations.delegate, - GlobalCupertinoLocalizations.delegate, - ], - - // سقف تكبير النص 1.3 — وهو ما تُفحص عليه الشاشات (docs/26 §9). - // ما فوقه يكسر التخطيط بلا مكسب قرائي. - builder: (context, child) => MediaQuery.withClampedTextScaling( - maxScaleFactor: 1.3, - child: child ?? const SizedBox.shrink(), - ), - ); - }, - ), - ); - } -} diff --git a/apps/rider_new/lib/core/api/antlaq_api.dart b/apps/rider_new/lib/core/api/antlaq_api.dart deleted file mode 100644 index 9470484..0000000 --- a/apps/rider_new/lib/core/api/antlaq_api.dart +++ /dev/null @@ -1,34 +0,0 @@ -import 'package:dio/dio.dart'; - -import '../config.dart'; -import 'api_exception.dart'; - -/// عميل map-saas — **منفصل تماماً** عن `ApiClient`. -/// -/// عمداً بلا `AuthInterceptor`: توكن تريبز لا شأن لخادم الخرائط، وإرساله -/// إليه تسريبٌ بلا مقابل. المصادقة هنا ترويسة `x-api-key` وحدها. -class AntlaqApi { - AntlaqApi._(this._dio); - - final Dio _dio; - - factory AntlaqApi.create() { - return AntlaqApi._(Dio(BaseOptions( - baseUrl: AppConfig.mapBaseUrl, - connectTimeout: AppConfig.connectTimeout, - receiveTimeout: AppConfig.receiveTimeout, - // المفتاح ترويسةً لا استعلاماً: map-saas يرفض `api_key` في الـquery - // بـ400 `property api_key should not exist`. - headers: {'x-api-key': AppConfig.mapApiKey}, - ))); - } - - Future get(String path, {Map? query}) async { - try { - final res = await _dio.get(path, queryParameters: query); - return res.data as T; - } on DioException catch (e) { - throw ApiException.from(e); - } - } -} diff --git a/apps/rider_new/lib/core/api/api_client.dart b/apps/rider_new/lib/core/api/api_client.dart deleted file mode 100644 index 053330c..0000000 --- a/apps/rider_new/lib/core/api/api_client.dart +++ /dev/null @@ -1,71 +0,0 @@ -import 'package:dio/dio.dart'; - -import '../config.dart'; -import '../storage/token_store.dart'; -import 'api_exception.dart'; -import 'auth_interceptor.dart'; - -/// الواجهة الوحيدة للخادم. لا تُنشأ `Dio` في أي مكان آخر. -class ApiClient { - ApiClient._(this._dio); - - final Dio _dio; - - factory ApiClient.create({ - required TokenStore tokens, - required Future Function() onSessionExpired, - }) { - final options = BaseOptions( - baseUrl: AppConfig.apiBaseUrl, - connectTimeout: AppConfig.connectTimeout, - receiveTimeout: AppConfig.receiveTimeout, - contentType: Headers.jsonContentType, - // نتولّى كل ما ليس 2xx بأنفسنا في ApiException. - validateStatus: (s) => s != null && s >= 200 && s < 300, - ); - - final dio = Dio(options); - dio.interceptors.add(AuthInterceptor( - tokens: tokens, - refreshClient: Dio(options), - onSessionExpired: onSessionExpired, - )); - return ApiClient._(dio); - } - - Future get(String path, {Map? query}) => - _send(() => _dio.get(path, queryParameters: query)); - - Future post(String path, {Object? body}) => - _send(() => _dio.post(path, data: body)); - - Future patch(String path, {Object? body}) => - _send(() => _dio.patch(path, data: body)); - - Future delete(String path) => _send(() => _dio.delete(path)); - - /// رفع ملف — الحقل اسمه `file` كما يتوقّعه `FileInterceptor` على الخادم. - /// يمرّ بنفس الـinterceptor فيحمل التوكن والمستأجر والجهاز. - Future upload( - String path, { - required String filePath, - Map fields = const {}, - }) { - return _send(() async { - final form = FormData.fromMap({ - ...fields, - 'file': await MultipartFile.fromFile(filePath), - }); - return _dio.post(path, data: form); - }); - } - - Future _send(Future> Function() call) async { - try { - final res = await call(); - return res.data as T; - } on DioException catch (e) { - throw ApiException.from(e); - } - } -} diff --git a/apps/rider_new/lib/core/api/api_exception.dart b/apps/rider_new/lib/core/api/api_exception.dart deleted file mode 100644 index 6514cc1..0000000 --- a/apps/rider_new/lib/core/api/api_exception.dart +++ /dev/null @@ -1,65 +0,0 @@ -import 'package:dio/dio.dart'; - -/// خطأ موحّد تراه طبقة الميزات — لا `DioException` يتسرّب فوق طبقة الشبكة. -class ApiException implements Exception { - const ApiException({ - required this.message, - this.statusCode, - this.kind = ApiErrorKind.unknown, - }); - - final String message; - final int? statusCode; - final ApiErrorKind kind; - - bool get isUnauthorized => statusCode == 401; - bool get isForbidden => statusCode == 403; - - /// حدّ المعدّل — `send-otp` ثلاث مرات كل خمس دقائق (docs/38 §2). الواجهة - /// تعرض عدّاداً تنازلياً بدل رسالة خطأ عامة. - bool get isRateLimited => statusCode == 429; - - factory ApiException.from(DioException e) { - switch (e.type) { - case DioExceptionType.connectionTimeout: - case DioExceptionType.sendTimeout: - case DioExceptionType.receiveTimeout: - return const ApiException( - message: 'انتهت مهلة الاتصال', - kind: ApiErrorKind.timeout, - ); - case DioExceptionType.connectionError: - return const ApiException( - message: 'تعذّر الاتصال بالخادم', - kind: ApiErrorKind.network, - ); - case DioExceptionType.cancel: - return const ApiException( - message: 'أُلغي الطلب', - kind: ApiErrorKind.cancelled, - ); - default: - final code = e.response?.statusCode; - return ApiException( - message: _messageOf(e.response?.data) ?? 'حدث خطأ غير متوقّع', - statusCode: code, - kind: ApiErrorKind.server, - ); - } - } - - /// NestJS يرجّع `message` نصاً أو مصفوفة نصوص (أخطاء التحقق). - static String? _messageOf(dynamic data) { - if (data is Map) { - final m = data['message']; - if (m is String && m.isNotEmpty) return m; - if (m is List && m.isNotEmpty) return m.join('\n'); - } - return null; - } - - @override - String toString() => 'ApiException($statusCode): $message'; -} - -enum ApiErrorKind { network, timeout, server, cancelled, unknown } diff --git a/apps/rider_new/lib/core/api/api_failure.dart b/apps/rider_new/lib/core/api/api_failure.dart deleted file mode 100644 index 4fb19da..0000000 --- a/apps/rider_new/lib/core/api/api_failure.dart +++ /dev/null @@ -1,38 +0,0 @@ -import 'api_exception.dart'; - -/// سبب الفشل كـ**رمز** لا كنصّ. -/// -/// docs/23 §3 يقول إن الـCubit يحوّل خطأ الشبكة إلى رسالة عربية؛ وdocs/26 §4 -/// (الأحدث، وهو الذي «يفعّل قاعدة docs/23 §2 التي كانت بلا أداة») يوجب مرور -/// كل نص مرئي بطبقة الترجمة. والـCubit لا يعرف `BuildContext` (docs/23 §3). -/// الجمع بينها: الـCubit يُصدر الرمز، والواجهة تترجمه سطراً واحداً — فتبقى -/// الشاشة بلا منطق، والنص بلغتين. -enum ApiFailure { - /// رمز خاطئ أو منتهي الصلاحية. - invalidCode, - - /// تجاوز عدد المحاولات — الخادم يُبطل الرمز فوراً (docs/38 §2). - tooManyAttempts, - - /// تجاوز حدّ طلب الرمز: ثلاثة كل خمس دقائق. - rateLimited, - - network, - timeout, - server, -} - -extension ApiFailureX on ApiException { - ApiFailure toApiFailure() { - if (isRateLimited) return ApiFailure.rateLimited; - if (kind == ApiErrorKind.network) return ApiFailure.network; - if (kind == ApiErrorKind.timeout) return ApiFailure.timeout; - if (isUnauthorized) { - // الخادم يفرّق بين «رمز خاطئ» و«محاولات كثيرة» بالنصّ وحده. - return message.contains('Too many') - ? ApiFailure.tooManyAttempts - : ApiFailure.invalidCode; - } - return ApiFailure.server; - } -} diff --git a/apps/rider_new/lib/core/api/auth_interceptor.dart b/apps/rider_new/lib/core/api/auth_interceptor.dart deleted file mode 100644 index 4663e27..0000000 --- a/apps/rider_new/lib/core/api/auth_interceptor.dart +++ /dev/null @@ -1,126 +0,0 @@ -import 'dart:async'; - -import 'package:dio/dio.dart'; - -import '../build_config.dart'; -import '../config.dart'; -import '../storage/token_store.dart'; - -/// يثبّت ترويسات كل طلب، ويجدّد التوكن **استباقياً** قبل انتهائه. -/// -/// عمر `access_token` خمس عشرة دقيقة فقط (docs/38 §2). لذلك لا ننتظر 401: -/// نجدّد قبل الإرسال إن قاربت الصلاحية. الـ401 يبقى شبكة أمان لا الآلية. -/// -/// التجديد **بطلقة واحدة**: عشرة طلبات متزامنة بتوكن منتهٍ تُنتج نداء تجديد -/// واحداً لا عشرة — وإلا أبطل الخادم رمز التحديث تحت أقدامنا. -class AuthInterceptor extends Interceptor { - AuthInterceptor({ - required TokenStore tokens, - required Dio refreshClient, - required Future Function() onSessionExpired, - }) : _tokens = tokens, - _refreshClient = refreshClient, - _onSessionExpired = onSessionExpired; - - final TokenStore _tokens; - - /// عميل منفصل بلا هذا الـinterceptor — وإلا استدعى التجديدُ نفسَه. - final Dio _refreshClient; - - final Future Function() _onSessionExpired; - - Future? _inFlight; - - @override - Future onRequest( - RequestOptions options, - RequestInterceptorHandler handler, - ) async { - options.headers['x-tenant-id'] = BuildConfig.tenantSlug; - options.headers['x-app-role'] = AppConfig.appRole; - - final deviceId = await _tokens.deviceId(); - if (deviceId != null) options.headers['x-device-id'] = deviceId; - - // نقاط المصادقة لا تحمل توكناً ولا تُشغّل تجديداً. - if (!_needsAuth(options.path)) return handler.next(options); - - if (_tokens.isLoggedIn && - _tokens.isAccessExpired(AppConfig.tokenRefreshLeeway)) { - await _refresh(); - } - - final access = _tokens.accessToken; - if (access != null && access.isNotEmpty) { - options.headers['Authorization'] = 'Bearer $access'; - } - handler.next(options); - } - - @override - Future onError( - DioException err, - ErrorInterceptorHandler handler, - ) async { - final options = err.requestOptions; - final retried = options.extra['__retried'] == true; - - if (err.response?.statusCode != 401 || - retried || - !_needsAuth(options.path) || - !_tokens.isLoggedIn) { - return handler.next(err); - } - - if (!await _refresh()) return handler.next(err); - - options.extra['__retried'] = true; - options.headers['Authorization'] = 'Bearer ${_tokens.accessToken}'; - try { - handler.resolve(await _refreshClient.fetch(options)); - } on DioException catch (e) { - handler.next(e); - } - } - - static bool _needsAuth(String path) => - !path.startsWith('/auth/') && - !path.startsWith('/maps/') && - !path.startsWith('/tenant/config'); - - Future _refresh() { - return _inFlight ??= _doRefresh().whenComplete(() => _inFlight = null); - } - - Future _doRefresh() async { - final refresh = _tokens.refreshToken; - if (refresh == null || refresh.isEmpty) return false; - try { - final deviceId = await _tokens.deviceId(); - final res = await _refreshClient.post>( - '/auth/refresh', - data: {'refresh_token': refresh}, - options: Options(headers: { - 'x-tenant-id': BuildConfig.tenantSlug, - 'x-app-role': AppConfig.appRole, - 'x-device-id': ?deviceId, - }), - ); - final body = res.data; - final access = body?['access_token'] as String?; - if (access == null || access.isEmpty) return false; - await _tokens.save( - accessToken: access, - // الخادم قد لا يدوّر رمز التحديث — نحتفظ بالقديم حينها. - refreshToken: (body?['refresh_token'] as String?) ?? refresh, - signingKey: body?['signing_key'] as String?, - ); - return true; - } on DioException { - // رمز تحديث ميّت = جلسة منتهية. لا معنى للمحاولة مجدداً. - await _tokens.clear(); - await _onSessionExpired(); - return false; - } - } -} diff --git a/apps/rider_new/lib/core/build_config.dart b/apps/rider_new/lib/core/build_config.dart deleted file mode 100644 index 49292cc..0000000 --- a/apps/rider_new/lib/core/build_config.dart +++ /dev/null @@ -1,86 +0,0 @@ -// ⚠️ ملف مُولَّد (docs/23 §1 — N3). لا يُحرَّر يدوياً؛ يُعاد توليده لكل -// مستأجر/طبقة عند البناء. القيم هنا هي القيم الافتراضية للمستأجر التجريبي. - -import 'package:flutter/material.dart'; - -/// المتغيّر الوحيد بين المستأجرين: **لون · لوغو · اسم** (docs/26 §0). -/// أي شيء آخر يتغيّر بين مستأجرين = خطأ يُصحَّح. -class BuildConfig { - const BuildConfig._(); - - static const String appName = 'Tripz'; - static const String tenantSlug = 'siro'; - - /// اللون البذرة — منه تُشتقّ `ColorScheme` للوضعين. - /// - /// كحليّ سيرو (`#1A2340`) بقرار المالك 2026-08-05: الهوية البصرية تقترب من - /// سيرو المجرَّب ميدانياً بدل الأزرق العام. - static const Color seedColor = Color(0xFF1A2340); - - /// اللون الثانوي — بنفسجي فاتح، يُستعمل للتمييز والحالات النشطة. - static const Color accentColor = Color(0xFF8C9CF8); - - static const String logoAsset = 'assets/images/logo.png'; - static const String splashLogoAsset = 'assets/images/splash_logo.png'; - - /// روابط المتاجر الأربعة — **صفحات المتجر الحقيقية المنشورة**، أعطاها - /// المالك 2026-08-05. لا تُستعمل مباشرةً: `StoreLinks` هو من يختار الرابط - /// حسب المنصّة والدور، لأن «قيّم التطبيق» على آيفون سائق ≠ نفس الرابط على - /// أندرويد راكب. - /// - /// المعرّفات تطابق هوية النشر المقفلة: `com.mobileapp.store.ride` للراكب - /// و`com.sefer_driver` للسائق. - static const String riderIosUrl = String.fromEnvironment( - 'RIDER_IOS_URL', - defaultValue: 'https://apps.apple.com/eg/app/tripz-rider/id6458734951', - ); - static const String driverIosUrl = String.fromEnvironment( - 'DRIVER_IOS_URL', - defaultValue: 'https://apps.apple.com/eg/app/tripz-driver/id6502189302', - ); - static const String riderAndroidUrl = String.fromEnvironment( - 'RIDER_ANDROID_URL', - defaultValue: - 'https://play.google.com/store/apps/details?id=com.mobileapp.store.ride', - ); - static const String driverAndroidUrl = String.fromEnvironment( - 'DRIVER_ANDROID_URL', - defaultValue: - 'https://play.google.com/store/apps/details?id=com.sefer_driver', - ); - - static const String privacyUrl = String.fromEnvironment( - 'PRIVACY_URL', - defaultValue: 'https://tripz.app/privacy', - ); - - /// رقم دعم واتساب المستأجر — بصيغة دولية بلا `+`. - static const String supportPhone = String.fromEnvironment( - 'SUPPORT_PHONE', - defaultValue: '962790000000', - ); -} - -/// أعلام الاستحقاقات (docs/23 §5). **`const` إجبارياً** كي يُحذف كود الميزة -/// من الـbinary عند إطفائها — خريطة في وقت التشغيل تُبقي الكود قابلاً -/// للاستخراج. -/// -/// هذه طبقة **الطبقة المُباعة** (lite/pro/max). طبقة ثانية مستقلة تأتي من -/// `GET /tenant/config/:slug` وقت التشغيل (docs/38 §10) وتخفي ما اشتراه -/// المستأجر فعلاً — الاثنتان تتقاطعان: العَلَم `const` يقرّر ما يُبنى، وردّ -/// الخادم يقرّر ما يُعرض ممّا بُني. -class Features { - const Features._(); - - static const bool wallet = true; - static const bool chat = true; - - /// WebRTC غير مبنيّ بعد — الخادم يدعمه (`call:*` في docs/38 §9) لكن - /// التطبيق لا. يبقى مطفأً حتى يُبنى ويُختبر على جهاز حقيقي. - static const bool calls = false; - static const bool rideTypes = true; - static const bool coupons = true; - static const bool geofence = false; - static const bool transit = false; - static const bool marketIntel = false; -} diff --git a/apps/rider_new/lib/core/config.dart b/apps/rider_new/lib/core/config.dart deleted file mode 100644 index 1960ca9..0000000 --- a/apps/rider_new/lib/core/config.dart +++ /dev/null @@ -1,74 +0,0 @@ -/// إعداد وقت التشغيل — يُمرَّر بـ`--dart-define` عند البناء (docs/23 §1). -/// -/// ما يخصّ **هوية المستأجر البصرية** (لون · لوغو · اسم) يعيش في -/// `build_config.dart` المُولَّد، لا هنا. -class AppConfig { - const AppConfig._(); - - /// أصل الـAPI **مع** `/api` (docs/38). - static const String apiBaseUrl = String.fromEnvironment( - 'API_BASE_URL', - defaultValue: 'https://tripz-api.intaleqapp.com/api', - ); - - /// أصل الـWebSocket — بلا `/api` (docs/38 §9). - static const String wsBaseUrl = String.fromEnvironment( - 'WS_BASE_URL', - defaultValue: 'https://tripz-api.intaleqapp.com', - ); - - /// يحدّد هوية المستخدم على الخادم: نفس الرقم بدورين = حسابان منفصلان - /// (docs/38 §1). **يُثبَّت عند البناء ولا يتغيّر في وقت التشغيل أبداً.** - static const String appRole = 'rider'; - - // ── الخرائط ────────────────────────────────────────────────────────── - // قرار المالك 2026-07-20: كل الخرائط — البلاطات والجيوكودنغ والمسار — - // **مباشرة** إلى map-saas بلا مرور بباك إند تريبز. map-saas مِلك المالك، - // والمفتاح يُقيَّد ببصمة التطبيق (نفس نموذج Google Maps SDK). هذا يُلغي - // نقاط `/maps/*` في باك إند تريبز، وهو ما حسم التعارض المسجّل في - // docs/38 §7 — ومنها `/maps/geocode` المعطوب على الخادم المنشور. - - static const String mapBaseUrl = String.fromEnvironment( - 'MAP_BASE_URL', - defaultValue: 'https://map-saas.intaleqapp.com/api', - ); - - /// المفتاح ترويسة **`x-api-key`** لا معامل استعلام — map-saas يرفض - /// المفتاح في الـquery بـ400. الحالي مفتاح سيرو حتى يُصدر المالك مفتاح - /// تريبز المقيّد بالبصمة. - static const String mapApiKey = String.fromEnvironment( - 'MAP_API_KEY', - defaultValue: 'in_9478b32836d19cff73db3063', - ); - - /// المدينة الافتراضية للتعرفة. - /// - /// ⚠️ الخادم يبذر التعرفة بـ`city: 'default'` (`tenants.service.ts:156`) - /// ويستعمل `dto.city ?? 'default'` عند إنشاء الرحلة. إرسال نصّ فارغ أو اسم - /// مدينة حقيقي يرجّع **404 «No active tariff»** — وهو ما كان يظهر - /// للمستخدم كـ«تعذّر حساب الأجرة». - static const String defaultCity = 'default'; - - /// كل كم متر يُرفع موقع السائق. أقل من ذلك يستنزف البطارية بلا فائدة. - static const int locationFilterMeters = 25; - - /// مهلة البحث عن سائق قبل عرض «لا يوجد سائقون». - /// - /// **إلزامية**: الخادم قد لا يُطلق `expired`/`no_drivers` أبداً (ثغرة R1، - /// docs/38 §4)، فانتظار حدثٍ قد لا يصل يعني شاشة بحث أبدية. - static const Duration searchingTimeout = Duration(seconds: 90); - - /// طول رمز التحقّق كما يولّده الخادم (docs/38 §2). - static const int otpLength = 4; - - /// مهلة إعادة إرسال الرمز. الخادم يحدّ `send-otp` بثلاثة طلبات كل خمس - /// دقائق، فبلا عدّاد تنازلي يُحظر المستخدم بثلاث ضغطات (docs/39 §2). - static const Duration otpResendCooldown = Duration(seconds: 60); - - /// هامش التجديد الاستباقي. عمر التوكن 15 دقيقة فقط (docs/38 §2)، - /// فالانتظار حتى 401 يعني فشل طلب في منتصف رحلة. - static const Duration tokenRefreshLeeway = Duration(seconds: 60); - - static const Duration connectTimeout = Duration(seconds: 20); - static const Duration receiveTimeout = Duration(seconds: 30); -} diff --git a/apps/rider_new/lib/core/design/theme.dart b/apps/rider_new/lib/core/design/theme.dart deleted file mode 100644 index fe1141b..0000000 --- a/apps/rider_new/lib/core/design/theme.dart +++ /dev/null @@ -1,117 +0,0 @@ -import 'package:flutter/material.dart'; - -import '../build_config.dart'; -import 'tokens.dart'; -import 'tripz_colors.dart'; -import 'typography.dart'; - -/// دالة بناء الثيم الوحيدة (docs/26 §4): مدخلان لا ثالث لهما. -/// -/// الاتجاه (RTL/LTR) **لا يُفرض هنا** — `MaterialApp` يشتقّه من الـlocale -/// وحده. فرض `Directionality.rtl` يكسر الإنجليزية (docs/26 §4). -ThemeData buildTheme(Brightness brightness, Locale locale) { - // البذرة الكحلية داكنة جداً، و`fromSeed` وحدها تنتج منها أسطحاً باهتة. - // نثبّت الأساسي والثانوي صراحةً ونترك للمشتقّ باقي الأدوار — فيبقى الشكل - // قريباً من سيرو مع ضمان التباين الذي يوفّره M3. - final scheme = ColorScheme.fromSeed( - seedColor: BuildConfig.seedColor, - brightness: brightness, - ).copyWith( - primary: brightness == Brightness.dark - ? BuildConfig.accentColor - : BuildConfig.seedColor, - onPrimary: brightness == Brightness.dark - ? BuildConfig.seedColor - : Colors.white, - secondary: BuildConfig.accentColor, - surface: brightness == Brightness.dark - ? const Color(0xFF161618) - : const Color(0xFFF8FAFC), - onSurface: brightness == Brightness.dark - ? Colors.white - : const Color(0xFF0F172A), - onSurfaceVariant: brightness == Brightness.dark - ? const Color(0xFFB0B3B8) - : const Color(0xFF64748B), - outlineVariant: brightness == Brightness.dark - ? const Color(0xFF3A3A3C) - : const Color(0xFFE2E8F0), - ); - final isDark = brightness == Brightness.dark; - final texts = buildTextTheme(brightness, locale); - final tripz = isDark ? TripzColors.dark : TripzColors.light; - - return ThemeData( - useMaterial3: true, - colorScheme: scheme, - brightness: brightness, - fontFamily: AppFonts.familyFor(locale), - textTheme: texts, - scaffoldBackgroundColor: scheme.surface, - extensions: [tripz], - - // AppBar مسطّح بلا ظل (docs/26 §6). - appBarTheme: AppBarTheme( - backgroundColor: scheme.surface, - foregroundColor: scheme.onSurface, - elevation: 0, - scrolledUnderElevation: 0, - centerTitle: false, - titleTextStyle: texts.titleLarge?.copyWith(color: scheme.onSurface), - ), - - cardTheme: CardThemeData( - color: tripz.surfaceRaised, - elevation: 0, - margin: EdgeInsets.zero, - shape: RoundedRectangleBorder( - borderRadius: Radii.card_, - side: BorderSide(color: scheme.outlineVariant), - ), - ), - - bottomSheetTheme: BottomSheetThemeData( - backgroundColor: scheme.surface, - surfaceTintColor: Colors.transparent, - elevation: 0, - showDragHandle: true, - shape: const RoundedRectangleBorder(borderRadius: Radii.sheetTop), - ), - - inputDecorationTheme: InputDecorationTheme( - filled: true, - fillColor: isDark ? scheme.surfaceContainerHigh : scheme.surface, - contentPadding: const EdgeInsets.symmetric( - horizontal: Space.md, - vertical: Space.sm, - ), - border: _fieldBorder(scheme.outlineVariant), - enabledBorder: _fieldBorder(scheme.outlineVariant), - focusedBorder: _fieldBorder(scheme.primary, width: 1.5), - errorBorder: _fieldBorder(scheme.error), - focusedErrorBorder: _fieldBorder(scheme.error, width: 1.5), - errorStyle: texts.bodySmall?.copyWith(color: scheme.error), - ), - - dividerTheme: DividerThemeData( - color: scheme.outlineVariant, - space: 1, - thickness: 1, - ), - - snackBarTheme: SnackBarThemeData( - behavior: SnackBarBehavior.floating, - backgroundColor: scheme.inverseSurface, - contentTextStyle: - texts.bodyMedium?.copyWith(color: scheme.onInverseSurface), - shape: const RoundedRectangleBorder(borderRadius: Radii.card_), - ), - ); -} - -OutlineInputBorder _fieldBorder(Color color, {double width = 1}) { - return OutlineInputBorder( - borderRadius: Radii.field_, - borderSide: BorderSide(color: color, width: width), - ); -} diff --git a/apps/rider_new/lib/core/design/tokens.dart b/apps/rider_new/lib/core/design/tokens.dart deleted file mode 100644 index 3ae168d..0000000 --- a/apps/rider_new/lib/core/design/tokens.dart +++ /dev/null @@ -1,69 +0,0 @@ -import 'package:flutter/widgets.dart'; - -/// الرموز الثابتة (docs/26 §3). **الشاشة لا تخترع رقماً** — لا مسافة ولا زاوية -/// ولا مدّة خارج هذا الملف. -class Space { - const Space._(); - - /// سلّم مضاعفات الأربعة. - static const double xxs = 4; - static const double xs = 8; - static const double sm = 12; - - /// حشوة الصفحة الافتراضية. - static const double md = 16; - static const double lg = 24; - static const double xl = 32; - static const double xxl = 48; - - static const EdgeInsets page = EdgeInsets.all(md); - static const EdgeInsets pageH = EdgeInsets.symmetric(horizontal: md); -} - -class Radii { - const Radii._(); - - /// حقول وشارات. - static const double field = 8; - - /// أزرار وبطاقات. - static const double card = 12; - - /// الأوراق السفلية. - static const double sheet = 24; - - static const BorderRadius field_ = BorderRadius.all(Radius.circular(field)); - static const BorderRadius card_ = BorderRadius.all(Radius.circular(card)); - static const BorderRadius sheetTop = BorderRadius.vertical( - top: Radius.circular(sheet), - ); -} - -class Motion { - const Motion._(); - - /// استجابة لمسة. - static const Duration tap = Duration(milliseconds: 120); - - /// انتقال ضمن الشاشة. - static const Duration inScreen = Duration(milliseconds: 240); - - /// ورقة سفلية أو صفحة. - static const Duration page = Duration(milliseconds: 400); - - static const Curve curve = Curves.easeOutCubic; -} - -class Sizes { - const Sizes._(); - - static const double iconSm = 20; - static const double icon = 24; - static const double iconLg = 32; - - /// ارتفاع زر الـCTA وحقل الإدخال. - static const double control = 52; - - /// أدنى هدف لمس مقبول. - static const double touchTarget = 48; -} diff --git a/apps/rider_new/lib/core/design/tripz_colors.dart b/apps/rider_new/lib/core/design/tripz_colors.dart deleted file mode 100644 index 97f59e4..0000000 --- a/apps/rider_new/lib/core/design/tripz_colors.dart +++ /dev/null @@ -1,131 +0,0 @@ -import 'package:flutter/material.dart'; - -/// الأدوار الدلالية التي لا يوفّرها `ColorScheme` (docs/26 §2). -/// -/// الشاشة تقول `context.tripzColors.success` — **ولا تقرّر درجة اللون بنفسها، -/// ولا تكتب hex**. تُشتقّ كلها من السطوع لا من لون المستأجر، فتبقى ثابتة عبر -/// كل المستأجرين كما يفرض عقد §0. -@immutable -class TripzColors extends ThemeExtension { - const TripzColors({ - required this.success, - required this.onSuccess, - required this.warning, - required this.onWarning, - required this.danger, - required this.onDanger, - required this.info, - required this.surfaceRaised, - required this.mapRoute, - required this.mapOrigin, - required this.mapDestination, - required this.skeleton, - }); - - final Color success; - final Color onSuccess; - final Color warning; - final Color onWarning; - final Color danger; - final Color onDanger; - final Color info; - - /// السطح المرتفع — في الليلي ارتفاعٌ **بالسطوع لا بالظل** (docs/26 §2). - final Color surfaceRaised; - - final Color mapRoute; - final Color mapOrigin; - final Color mapDestination; - - /// لون هيكل التحميل (skeleton) — لا spinner فارغ (docs/26 §8.4). - final Color skeleton; - - // الأرقام من نظام سيرو الميداني: نجاح `#22C55E` · تحذير `#F59E0B` · - // خطأ `#EF4444` — مألوفة لمستخدمي سيرو ومجرَّبة على شاشات الشمس. - static const light = TripzColors( - success: Color(0xFF22C55E), - onSuccess: Color(0xFFFFFFFF), - warning: Color(0xFFF59E0B), - onWarning: Color(0xFF2A1A00), - danger: Color(0xFFEF4444), - onDanger: Color(0xFFFFFFFF), - info: Color(0xFF8C9CF8), - surfaceRaised: Color(0xFFFFFFFF), - mapRoute: Color(0xFF1A2340), - mapOrigin: Color(0xFF22C55E), - mapDestination: Color(0xFFEF4444), - skeleton: Color(0xFFE2E8F0), - ); - - static const dark = TripzColors( - success: Color(0xFF4ADE80), - onSuccess: Color(0xFF00281A), - warning: Color(0xFFFBBF24), - onWarning: Color(0xFF2A1A00), - danger: Color(0xFFF87171), - onDanger: Color(0xFF33000A), - info: Color(0xFF8C9CF8), - // ليس أسود صرفاً — رمادي داكن متدرّج (بطاقة سيرو `#2C2C2E`). - surfaceRaised: Color(0xFF2C2C2E), - mapRoute: Color(0xFF8C9CF8), - mapOrigin: Color(0xFF4ADE80), - mapDestination: Color(0xFFF87171), - skeleton: Color(0xFF3A3A3C), - ); - - @override - TripzColors copyWith({ - Color? success, - Color? onSuccess, - Color? warning, - Color? onWarning, - Color? danger, - Color? onDanger, - Color? info, - Color? surfaceRaised, - Color? mapRoute, - Color? mapOrigin, - Color? mapDestination, - Color? skeleton, - }) { - return TripzColors( - success: success ?? this.success, - onSuccess: onSuccess ?? this.onSuccess, - warning: warning ?? this.warning, - onWarning: onWarning ?? this.onWarning, - danger: danger ?? this.danger, - onDanger: onDanger ?? this.onDanger, - info: info ?? this.info, - surfaceRaised: surfaceRaised ?? this.surfaceRaised, - mapRoute: mapRoute ?? this.mapRoute, - mapOrigin: mapOrigin ?? this.mapOrigin, - mapDestination: mapDestination ?? this.mapDestination, - skeleton: skeleton ?? this.skeleton, - ); - } - - @override - TripzColors lerp(ThemeExtension? other, double t) { - if (other is! TripzColors) return this; - return TripzColors( - success: Color.lerp(success, other.success, t)!, - onSuccess: Color.lerp(onSuccess, other.onSuccess, t)!, - warning: Color.lerp(warning, other.warning, t)!, - onWarning: Color.lerp(onWarning, other.onWarning, t)!, - danger: Color.lerp(danger, other.danger, t)!, - onDanger: Color.lerp(onDanger, other.onDanger, t)!, - info: Color.lerp(info, other.info, t)!, - surfaceRaised: Color.lerp(surfaceRaised, other.surfaceRaised, t)!, - mapRoute: Color.lerp(mapRoute, other.mapRoute, t)!, - mapOrigin: Color.lerp(mapOrigin, other.mapOrigin, t)!, - mapDestination: Color.lerp(mapDestination, other.mapDestination, t)!, - skeleton: Color.lerp(skeleton, other.skeleton, t)!, - ); - } -} - -extension TripzColorsX on BuildContext { - TripzColors get tripzColors => Theme.of(this).extension()!; - ColorScheme get colors => Theme.of(this).colorScheme; - TextTheme get texts => Theme.of(this).textTheme; -} diff --git a/apps/rider_new/lib/core/design/typography.dart b/apps/rider_new/lib/core/design/typography.dart deleted file mode 100644 index cd53abf..0000000 --- a/apps/rider_new/lib/core/design/typography.dart +++ /dev/null @@ -1,75 +0,0 @@ - -import 'package:flutter/material.dart'; - -/// الخطوط (docs/26 §1) — ملفات محلية في `assets/fonts/`. حزمة `google_fonts` -/// ممنوعة: الشكل يجب أن يكون حتمياً من أول إقلاع بلا شبكة. -class AppFonts { - const AppFonts._(); - - static const arabic = 'IBMPlexSansArabic'; - static const latin = 'Inter'; - - /// الخط يتبع اللغة، والآخر احتياط — كي لا تنكسر كلمة عربية داخل جملة - /// إنجليزية ولا العكس. - static String familyFor(Locale locale) => - locale.languageCode == 'ar' ? arabic : latin; - - static List fallbackFor(Locale locale) => - locale.languageCode == 'ar' ? const [latin] : const [arabic]; -} - -/// أرقام tabular: تمنع «رقص» الأعمدة حين تتغيّر القيمة — للأسعار والعدّادات -/// والمسافات الحيّة (docs/26 §1). يُغني عن خط `digit` المتقاعد. -const tabularFigures = [FontFeature.tabularFigures()]; - -TextTheme buildTextTheme(Brightness brightness, Locale locale) { - final base = brightness == Brightness.dark - ? Typography.material2021().white - : Typography.material2021().black; - - final family = AppFonts.familyFor(locale); - final fallback = AppFonts.fallbackFor(locale); - - return base - .apply(fontFamily: family, fontFamilyFallback: fallback) - .copyWith( - displaySmall: base.displaySmall?.copyWith( - fontFamily: family, - fontFamilyFallback: fallback, - fontWeight: FontWeight.w700, - ), - headlineMedium: base.headlineMedium?.copyWith( - fontFamily: family, - fontFamilyFallback: fallback, - fontWeight: FontWeight.w700, - ), - headlineSmall: base.headlineSmall?.copyWith( - fontFamily: family, - fontFamilyFallback: fallback, - fontWeight: FontWeight.w600, - ), - titleLarge: base.titleLarge?.copyWith( - fontFamily: family, - fontFamilyFallback: fallback, - fontWeight: FontWeight.w600, - ), - titleMedium: base.titleMedium?.copyWith( - fontFamily: family, - fontFamilyFallback: fallback, - fontWeight: FontWeight.w600, - ), - labelLarge: base.labelLarge?.copyWith( - fontFamily: family, - fontFamilyFallback: fallback, - fontWeight: FontWeight.w600, - ), - ); -} - -/// نمط الأرقام الحيّة — يُستعمل للأجرة والرصيد والعدّاد التنازلي. -/// دائماً Inter بأرقام tabular، مهما كانت لغة الواجهة (docs/26 §5: الأرقام -/// لاتينية في اللغتين). -TextStyle numericStyle(TextStyle? base) => (base ?? const TextStyle()).copyWith( - fontFamily: AppFonts.latin, - fontFeatures: tabularFigures, - ); diff --git a/apps/rider_new/lib/core/di.dart b/apps/rider_new/lib/core/di.dart deleted file mode 100644 index b6c885a..0000000 --- a/apps/rider_new/lib/core/di.dart +++ /dev/null @@ -1,147 +0,0 @@ -import 'package:device_info_plus/device_info_plus.dart'; -import 'package:flutter/foundation.dart'; -import 'package:flutter_secure_storage/flutter_secure_storage.dart'; -import 'package:get_it/get_it.dart'; -import 'package:shared_preferences/shared_preferences.dart'; - -import '../features/auth/cubit/login_cubit.dart'; -import '../features/auth/data/auth_repository.dart'; -import '../features/chat/cubit/chat_cubit.dart'; -import '../features/chat/data/chat_repository.dart'; -import '../features/profile/data/profile_repository.dart'; -import '../features/rating/cubit/rating_cubit.dart'; -import '../features/rating/data/rating_repository.dart'; -import '../features/rewards/cubit/rewards_cubit.dart'; -import '../features/rewards/data/rewards_repository.dart'; -import '../features/settings/cubit/settings_cubit.dart'; -import '../features/trip/cubit/history_cubit.dart'; -import '../features/trip/cubit/ride_cubit.dart'; -import '../features/trip/data/history_repository.dart'; -import '../features/trip/data/maps_repository.dart'; -import '../features/trip/data/trip_repository.dart'; -import '../features/wallet/cubit/wallet_cubit.dart'; -import '../features/wallet/data/wallet_repository.dart'; -import 'api/antlaq_api.dart'; -import 'api/api_client.dart'; -import 'build_config.dart'; -import 'location/location_service.dart'; -import '../features/trip/data/recent_places_store.dart'; -import 'notifications/notification_store.dart'; -import 'notifications/push_service.dart'; -import 'realtime/realtime_service.dart'; -import 'session/session_cubit.dart'; -import 'session/session_source.dart'; -import 'storage/token_store.dart'; -import 'tenant/tenant_cubit.dart'; - -final sl = GetIt.instance; - -/// نقطة الإقفال الوحيدة (docs/23 §5): الميزة المطفأة **لا تُسجَّل**، بدل -/// `if` مبعثرة في الشاشات. -Future setupInjector() async { - final prefs = await SharedPreferences.getInstance(); - sl.registerSingleton(prefs); - - const secure = FlutterSecureStorage( - iOptions: IOSOptions(accessibility: KeychainAccessibility.first_unlock), - ); - - final tokens = TokenStore(secure); - await tokens.load(); - await _ensureDeviceId(tokens); - sl.registerSingleton(tokens); - - sl.registerSingleton(SettingsCubit(prefs)); - - // انتهاء الجلسة يصعد من طبقة الشبكة إلى `SessionCubit` مباشرة — الراوتر - // يستمع إليه فيخرج المستخدم بلا `BuildContext` في الـinterceptor. - sl.registerSingleton( - ApiClient.create( - tokens: tokens, - onSessionExpired: () async => sl().onSessionExpired(), - ), - ); - - final authRepo = AuthRepository(sl(), sl()); - sl.registerSingleton(authRepo); - sl.registerSingleton(authRepo); - sl.registerSingleton(ProfileRepository(sl())); - sl.registerSingleton( - SessionCubit(authRepo, onAuthenticated: () => sl().register()), - ); - - // تدفّق الدخول قصير العمر: نسخة جديدة لكل دخول، لا نسخة واحدة أبدية. - sl.registerFactory(() => LoginCubit(sl(), sl())); - - // الخرائط عميل منفصل بلا توكن تريبز — map-saas لا شأن له بجلستنا. - sl.registerSingleton(AntlaqApi.create()); - sl.registerSingleton(MapsRepository(sl())); - sl.registerSingleton(TripRepository(sl())); - sl.registerSingleton(LocationService()); - sl.registerSingleton(RealtimeService(tokens)); - - sl.registerSingleton(TenantCubit(sl(), prefs)); - - // الصندوق يُحمَّل قبل `PushService` كي لا يضيع إشعارٌ يصل أثناء الإقلاع. - final notifications = NotificationStore(); - await notifications.load(); - sl.registerSingleton(notifications); - sl.registerSingleton(PushService(sl(), notifications)); - - sl.registerSingleton(HistoryRepository(sl())); - sl.registerFactory(() => HistoryCubit(sl())); - - sl.registerSingleton(RatingRepository(sl())); - - // المكافآت خلف علم الكوبونات: الدعوات والكوبونات وجهان لنفس الوحدة. - if (Features.coupons) { - sl.registerSingleton(RewardsRepository(sl())); - sl.registerFactory(() => RewardsCubit(sl())); - } - sl.registerFactory(() => RatingCubit(sl())); - - // الدردشة خلف علمها: إطفاؤه يحذف كودها من الـbinary (docs/23 §5). - if (Features.chat) { - sl.registerSingleton(ChatRepository(sl())); - sl.registerFactory(() => ChatCubit(sl())); - } - - // المحفظة خلف علم الاستحقاق: الميزة المطفأة لا تُسجَّل أصلاً (docs/23 §5). - if (Features.wallet) { - sl.registerSingleton(WalletRepository(sl())); - sl.registerFactory(() => WalletCubit(sl())); - } - - // الأماكن الأخيرة تُحمَّل مرة واحدة عند الإقلاع: الشاشة الرئيسية تقرأها - // في أول إطار، وقراءةُ القرص وقتها تعني صفّاً يقفز بعد الرسم. - final recents = RecentPlacesStore(); - await recents.load(); - sl.registerSingleton(recents); - - sl.registerFactory(() => RideCubit( - trips: sl(), - maps: sl(), - location: sl(), - realtime: sl(), - recents: sl(), - )); -} - -/// بصمة الجهاز (`x-device-id`) — يفرضها الخادم عند تفعيل -/// `AUTH_REQUIRE_DEVICE_BINDING` (docs/38 §8). تُرسَل من الآن كي يُفعَّل -/// العَلَم لاحقاً بلا تعديل التطبيق: **أرسل أولاً ثم فعّل الخادم**. -Future _ensureDeviceId(TokenStore tokens) async { - if (await tokens.deviceId() != null) return; - final info = DeviceInfoPlugin(); - String? id; - try { - if (defaultTargetPlatform == TargetPlatform.android) { - id = (await info.androidInfo).id; - } else if (defaultTargetPlatform == TargetPlatform.iOS) { - id = (await info.iosInfo).identifierForVendor; - } - } catch (_) { - // منصّة لا تجيب — المعرّف الفارغ أفضل من إقلاع فاشل. - } - if (id != null && id.isNotEmpty) await tokens.setDeviceId(id); -} diff --git a/apps/rider_new/lib/core/format/money.dart b/apps/rider_new/lib/core/format/money.dart deleted file mode 100644 index 69ae013..0000000 --- a/apps/rider_new/lib/core/format/money.dart +++ /dev/null @@ -1,34 +0,0 @@ -import 'package:intl/intl.dart'; - -/// كل المبالغ تصل من الخادم **نصوصاً** لا أرقاماً (`"0.000"` — docs/38 §12.2). -/// تمريرها لعملية حسابية بلا تحويل يعطي نتائج صامتة خاطئة، لذلك التحويل -/// والعرض يمرّان من هنا وحدهما. -class Money { - const Money._(); - - /// `null` عند نصّ غير صالح — لا صفر: الصفر رصيدٌ حقيقي، والغياب ليس رصيداً. - static double? parse(String? raw) => - raw == null ? null : double.tryParse(raw); - - /// العملة ورمزها من إعداد المستأجر (country pack)، لا ثابتة في التطبيق - /// (docs/26 §5). الأرقام لاتينية في اللغتين. - static String format(String? raw, String currency, {String locale = 'en'}) { - final value = parse(raw); - if (value == null) return '—'; - final digits = currency == 'JOD' ? 3 : 2; - final text = NumberFormat.decimalPatternDigits( - locale: locale, - decimalDigits: digits, - ).format(value); - return currency.isEmpty ? text : '$text $currency'; - } - - static String formatNum(num value, String currency, {int? decimalDigits}) { - final digits = decimalDigits ?? (currency == 'JOD' ? 3 : 2); - final text = NumberFormat.decimalPatternDigits( - locale: 'en', - decimalDigits: digits, - ).format(value); - return currency.isEmpty ? text : '$text $currency'; - } -} diff --git a/apps/rider_new/lib/core/l10n/app_ar.arb b/apps/rider_new/lib/core/l10n/app_ar.arb deleted file mode 100644 index ed6e96a..0000000 --- a/apps/rider_new/lib/core/l10n/app_ar.arb +++ /dev/null @@ -1,270 +0,0 @@ -{ - "@@locale": "ar", - "appTitle": "Tripz", - "actionRetry": "أعد المحاولة", - "actionCancel": "إلغاء", - "actionContinue": "متابعة", - "actionSave": "حفظ", - "actionOpenSettings": "افتح الإعدادات", - "errorGeneric": "حدث خطأ غير متوقّع", - "errorNetwork": "تعذّر الاتصال بالخادم", - "errorTimeout": "انتهت مهلة الاتصال", - "emptyDefault": "لا يوجد شيء هنا بعد", - "splashRider": "تطبيق الراكب", - "splashDriver": "تطبيق السائق", - "agreementTitle": "شروط الاستخدام", - "agreementLead": "قبل أن نبدأ، اقرأ الشروط ووافق عليها.", - "agreementCheckbox": "قرأت الشروط وأوافق عليها", - "agreementAccept": "أوافق وأتابع", - "permissionTitle": "نحتاج موقعك", - "permissionLead": "الموقع هو ما يجعل الرحلة ممكنة: به نعرف أين أنت وأين السائق.", - "permissionAllow": "السماح بالوصول للموقع", - "permissionDeniedForever": "رفضتَ الإذن نهائياً. افتح الإعدادات وفعّله يدوياً ثم عُد.", - "phoneTitle": "أهلاً بك في Tripz", - "phoneLead": "أدخل رقم هاتفك، ونرسل لك رمز تحقّق.", - "phoneLabel": "رقم الهاتف", - "phoneHint": "بلا الصفر في البداية", - "phoneSend": "أرسل رمز التحقّق", - "phoneErrEmpty": "أدخل رقم هاتفك", - "phoneErrLeadingZero": "أدخل الرقم بلا الصفر في البداية", - "phoneErrShort": "الرقم قصير جداً", - "otpTitle": "أدخل رمز التحقّق", - "otpLead": "أرسلنا رمزاً من أربع خانات إلى {phone}", - "@otpLead": { - "placeholders": { - "phone": { - "type": "String" - } - } - }, - "otpVerify": "تحقّق وتابع", - "otpResend": "إعادة إرسال الرمز", - "otpResendIn": "إعادة الإرسال بعد {seconds} ثانية", - "@otpResendIn": { - "placeholders": { - "seconds": { - "type": "int" - } - } - }, - "otpErrIncomplete": "أدخل الرمز كاملاً", - "otpErrInvalid": "الرمز غير صحيح أو انتهت صلاحيته", - "otpErrTooManyAttempts": "محاولات كثيرة. اطلب رمزاً جديداً.", - "otpErrRateLimited": "طلبتَ الرمز مرات كثيرة. انتظر قليلاً ثم أعد المحاولة.", - "otpChangeNumber": "تعديل الرقم", - "profileTitle": "أكمل ملفك", - "profileLead": "اسمك يظهر للسائق عند الرحلة.", - "profileNameLabel": "الاسم", - "profileNameErrEmpty": "أدخل اسمك", - "sessionExpired": "انتهت جلستك. سجّل الدخول من جديد.", - "settingsTitle": "الإعدادات", - "settingsTheme": "المظهر", - "settingsThemeSystem": "حسب النظام", - "settingsThemeLight": "فاتح", - "settingsThemeDark": "داكن", - "settingsLanguage": "اللغة", - "settingsLanguageArabic": "العربية", - "settingsLanguageEnglish": "English", - "settingsSectionGeneral": "عام", - "settingsSectionSupport": "الدعم والمعلومات", - "settingsSupportLead": "أسئلة شائعة وطرق التواصل", - "settingsShareLead": "شارك التطبيق مع أصدقائك", - "rideWhereTo": "إلى أين؟", - "rideOrigin": "من", - "rideDestination": "إلى", - "rideSearchHint": "ابحث عن مكان", - "rideAddStop": "إضافة محطة", - "rideStop": "محطة {n}", - "@rideStop": { - "placeholders": { - "n": { - "type": "int" - } - } - }, - "ridePickOnMap": "تحديد من الخريطة", - "rideConfirmPoint": "تأكيد هذه النقطة", - "rideConfirmTrip": "اطلب الرحلة", - "rideSearchingTitle": "نبحث لك عن سائق", - "rideSearchingLead": "عادةً أقل من دقيقة", - "rideCancelSearch": "إلغاء البحث", - "rideNoDrivers": "لا يوجد سائقون متاحون الآن. جرّب بعد قليل.", - "rideQuoteFailed": "تعذّر حساب الأجرة", - "rideRouteFailed": "تعذّر حساب المسار", - "rideRequestFailed": "تعذّر إرسال الطلب", - "rideSurge": "الطلب مرتفع الآن", - "rideCancelTrip": "إلغاء الرحلة", - "rideEta": "{min} دقيقة", - "@rideEta": { - "placeholders": { - "min": { - "type": "String" - } - } - }, - "rideDistanceKm": "{km} كم", - "@rideDistanceKm": { - "placeholders": { - "km": { - "type": "String" - } - } - }, - "tripAssigned": "السائق في الطريق إليك", - "tripDriverArriving": "السائق يقترب", - "tripDriverArrived": "السائق وصل وينتظرك", - "tripInProgress": "في الطريق إلى وجهتك", - "tripCompleted": "وصلت — رحلة موفّقة", - "driverGoOnline": "ابدأ الاستقبال", - "driverGoOffline": "إيقاف الاستقبال", - "driverOnline": "متصل", - "driverOffline": "غير متصل", - "driverNoOffers": "لا طلبات الآن. ابقَ متصلاً.", - "driverOfferTitle": "طلب رحلة جديد", - "driverAccept": "قبول", - "driverReject": "تجاهل", - "driverOfferTaken": "سبقك سائق آخر لهذا الطلب", - "driverArrivedAction": "وصلت لموقع الراكب", - "driverStartTrip": "بدء الرحلة", - "driverEndTrip": "إنهاء الرحلة", - "driverOnTheWay": "في الطريق للراكب", - "rateTitle": "كيف كانت رحلتك؟", - "rateTitleDriver": "كيف كان الراكب؟", - "rateLead": "تقييمك يساعدنا على تحسين الخدمة", - "rateComment": "أضف ملاحظة (اختياري)", - "rateSubmit": "إرسال التقييم", - "rateSkip": "لاحقاً", - "rateAlready": "سبق أن قيّمت هذه الرحلة", - "tripCall": "اتصال", - "tripMessage": "رسالة", - "tripFareTitle": "تفاصيل الأجرة", - "tripFare": "الأجرة", - "tripEarnings": "أرباحك", - "tripCommission": "العمولة", - "tripCancelTitle": "سبب الإلغاء", - "tripCancelReasonWait": "الانتظار طويل", - "tripCancelReasonMistake": "طلبت بالخطأ", - "tripCancelReasonOther": "سبب آخر", - "tripCancelConfirm": "تأكيد الإلغاء", - "tripCancelKeep": "متابعة الرحلة", - "walletTitle": "المحفظة", - "walletBalance": "الرصيد", - "walletTopup": "شحن الرصيد", - "walletTopupAmount": "المبلغ", - "walletTransactions": "الحركات", - "walletEmpty": "لا حركات بعد", - "walletTopupFailed": "تعذّر الشحن", - "creditTitle": "الرصيد التشغيلي", - "creditLead": "تُخصم منه العمولة عند إنهاء كل رحلة", - "creditBlocked": "رصيدك التشغيلي نفد — اشحنه لتستقبل الطلبات", - "payoutTitle": "سحب الأرباح", - "payoutAmount": "مبلغ السحب", - "payoutChannel": "قناة الاستلام", - "payoutRequest": "أرسل رمز التأكيد", - "payoutOtpTitle": "أكّد السحب", - "payoutOtpLead": "أرسلنا رمزاً إلى رقمك لتأكيد السحب", - "payoutConfirm": "تأكيد السحب", - "payoutDone": "تم إرسال طلب السحب", - "payoutFailed": "تعذّر إتمام السحب", - "payoutInsufficient": "الرصيد لا يكفي", - "payoutHistory": "طلبات السحب", - "menuTitle": "القائمة", - "menuProfile": "حسابي", - "menuTrips": "رحلاتي", - "menuWallet": "المحفظة", - "menuEarnings": "أرباحي", - "menuSettings": "الإعدادات", - "menuSupport": "المساعدة", - "menuNotifications": "الإشعارات", - "notificationsEmpty": "لا إشعارات بعد — سنُعلمك هنا بكل ما يخصّ رحلاتك", - "notificationsClear": "مسح الكل", - "menuAbout": "عن التطبيق", - "menuLogout": "تسجيل الخروج", - "menuLogoutConfirm": "هل تريد الخروج من حسابك؟", - "paymentCash": "نقداً", - "paymentWallet": "من المحفظة", - "historyTitle": "رحلاتي", - "historyEmpty": "لا رحلات بعد — اطلب أول رحلة لك", - "historyStatusCompleted": "مكتملة", - "historyStatusCancelled": "ملغاة", - "historyStatusLive": "جارية", - "profileEditTitle": "تعديل الحساب", - "profilePhone": "رقم الهاتف", - "profilePhoneLocked": "لا يمكن تغيير الرقم — هو هوية حسابك", - "profileSaved": "حُفظت التعديلات", - "supportTitle": "المساعدة", - "supportFaq": "الأسئلة الشائعة", - "supportContact": "تواصل معنا", - "supportWhatsapp": "مراسلة عبر واتساب", - "aboutVersion": "الإصدار", - "notifTitle": "الإشعارات", - "notifEnable": "تفعيل الإشعارات", - "notifDenied": "الإشعارات موقوفة من إعدادات النظام", - "chatTitle": "المحادثة", - "chatHint": "اكتب رسالة", - "chatEmpty": "لا رسائل بعد", - "rideCoupon": "كود خصم", - "rideCouponApply": "تطبيق", - "rideNoLocation": "فعّل الموقع لنعرف أين أنت", - "rideBack": "رجوع", - "rideRetryQuote": "أعد حساب الأجرة", - "rideFrom": "من", - "rideTo": "إلى", - "walletChannel": "طريقة الدفع", - "rideTypeUnavailable": "غير متاح", - "rideSearchNoResults": "لا نتائج — جرّب اسماً آخر أو حدّد من الخريطة", - "walletInvoiceTitle": "أكمل التحويل", - "walletInvoiceRef": "رقم المرجع", - "walletInvoiceTarget": "حوّل إلى", - "walletInvoicePending": "سيُضاف الرصيد فور تأكيد التحويل", - "walletCopy": "نسخ", - "walletCopied": "نُسخ", - "walletNoTarget": "لم يُضبط حساب استلام لهذه القناة بعد — راجع المشغّل", - "rewardsTitle": "مكافآتي", - "rewardsInviteTitle": "ادعُ صديقاً", - "rewardsInviteLead": "شارك كودك — تربح أنت وصديقك", - "rewardsCode": "كود الدعوة", - "rewardsInvited": "دعوتَهم", - "rewardsPending": "قيد التأكيد", - "rewardsPaid": "مكافآت مدفوعة", - "rewardsCoupons": "كوبوناتي", - "rewardsCouponsEmpty": "لا كوبونات صالحة الآن", - "menuRewards": "مكافآتي", - "menuInvite": "ادعُ صديقاً", - "menuShare": "شارك التطبيق", - "menuNotifications": "الإشعارات", - "menuPrivacy": "سياسة الخصوصية", - "menuRateApp": "قيّم التطبيق", - "shareMessage": "جرّب تطبيق Tripz — استعمل كودي {code} واحصل على خصم أول رحلة\n{link}", - "shareMessagePlain": "جرّب تطبيق Tripz\n{link}", - "menuRiderApp": "حمّل تطبيق الراكب", - "menuDriverApp": "سجّل كسائق", - "@shareMessage": { - "placeholders": { - "code": { - "type": "String" - }, - "link": { - "type": "String" - } - } - }, - "@shareMessagePlain": { - "placeholders": { - "link": { - "type": "String" - } - } - }, - "supportFaqQ1": "كيف أطلب رحلة؟", - "supportFaqA1": "حدّد وجهتك من البحث أو من الخريطة، اختر نوع الرحلة، ثم اضغط «اطلب الرحلة».", - "supportFaqQ2": "كيف أشحن رصيدي؟", - "supportFaqA2": "من المحفظة اختر المبلغ وطريقة الدفع. ستظهر لك تعليمات التحويل ورقم مرجع — يُضاف الرصيد بعد تأكيد التحويل.", - "supportFaqQ3": "لماذا لا يظهر سائق؟", - "supportFaqA3": "قد لا يوجد سائقون قريبون في هذا الوقت. جرّب بعد قليل أو غيّر نوع الرحلة.", - "supportFaqQ4": "كيف ألغي رحلة؟", - "supportFaqA4": "من بطاقة الرحلة اضغط «إلغاء الرحلة». الإلغاء بعد وصول السائق قد يترتّب عليه رسم.", - "supportDeviceCheck": "فحص توافق الجهاز", - "supportDeviceOk": "جهازك متوافق", - "supportDeviceIssues": "مشاكل قد تؤثّر على عمل التطبيق" -} \ No newline at end of file diff --git a/apps/rider_new/lib/core/l10n/app_en.arb b/apps/rider_new/lib/core/l10n/app_en.arb deleted file mode 100644 index 322a200..0000000 --- a/apps/rider_new/lib/core/l10n/app_en.arb +++ /dev/null @@ -1,270 +0,0 @@ -{ - "@@locale": "en", - "appTitle": "Tripz", - "actionRetry": "Try again", - "actionCancel": "Cancel", - "actionContinue": "Continue", - "actionSave": "Save", - "actionOpenSettings": "Open settings", - "errorGeneric": "Something went wrong", - "errorNetwork": "Could not reach the server", - "errorTimeout": "The connection timed out", - "emptyDefault": "Nothing here yet", - "splashRider": "Rider app", - "splashDriver": "Driver app", - "agreementTitle": "Terms of use", - "agreementLead": "Before we start, read the terms and accept them.", - "agreementCheckbox": "I have read and accept the terms", - "agreementAccept": "Accept and continue", - "permissionTitle": "We need your location", - "permissionLead": "Location is what makes a trip possible: it tells us where you are and where your driver is.", - "permissionAllow": "Allow location access", - "permissionDeniedForever": "You denied the permission permanently. Open settings, enable it, then come back.", - "phoneTitle": "Welcome to Tripz", - "phoneLead": "Enter your phone number and we'll send you a verification code.", - "phoneLabel": "Phone number", - "phoneHint": "without the leading zero", - "phoneSend": "Send verification code", - "phoneErrEmpty": "Enter your phone number", - "phoneErrLeadingZero": "Enter the number without the leading zero", - "phoneErrShort": "That number is too short", - "otpTitle": "Enter your code", - "otpLead": "We sent a 4-digit code to {phone}", - "@otpLead": { - "placeholders": { - "phone": { - "type": "String" - } - } - }, - "otpVerify": "Verify and continue", - "otpResend": "Resend the code", - "otpResendIn": "Resend in {seconds}s", - "@otpResendIn": { - "placeholders": { - "seconds": { - "type": "int" - } - } - }, - "otpErrIncomplete": "Enter the full code", - "otpErrInvalid": "That code is wrong or expired", - "otpErrTooManyAttempts": "Too many attempts. Request a new code.", - "otpErrRateLimited": "You requested the code too many times. Wait a moment and try again.", - "otpChangeNumber": "Change number", - "profileTitle": "Complete your profile", - "profileLead": "Your name is shown to the driver during a trip.", - "profileNameLabel": "Name", - "profileNameErrEmpty": "Enter your name", - "sessionExpired": "Your session ended. Please sign in again.", - "settingsTitle": "Settings", - "settingsTheme": "Appearance", - "settingsThemeSystem": "Follow system", - "settingsThemeLight": "Light", - "settingsThemeDark": "Dark", - "settingsLanguage": "Language", - "settingsLanguageArabic": "العربية", - "settingsLanguageEnglish": "English", - "settingsSectionGeneral": "General", - "settingsSectionSupport": "Support & info", - "settingsSupportLead": "FAQ and ways to reach us", - "settingsShareLead": "Share the app with your friends", - "rideWhereTo": "Where to?", - "rideOrigin": "From", - "rideDestination": "To", - "rideSearchHint": "Search for a place", - "rideAddStop": "Add a stop", - "rideStop": "Stop {n}", - "@rideStop": { - "placeholders": { - "n": { - "type": "int" - } - } - }, - "ridePickOnMap": "Pick on the map", - "rideConfirmPoint": "Confirm this point", - "rideConfirmTrip": "Request ride", - "rideSearchingTitle": "Finding you a driver", - "rideSearchingLead": "Usually under a minute", - "rideCancelSearch": "Cancel search", - "rideNoDrivers": "No drivers available right now. Try again shortly.", - "rideQuoteFailed": "Could not price this trip", - "rideRouteFailed": "Could not build the route", - "rideRequestFailed": "Could not send the request", - "rideSurge": "Demand is high right now", - "rideCancelTrip": "Cancel ride", - "rideEta": "{min} min", - "@rideEta": { - "placeholders": { - "min": { - "type": "String" - } - } - }, - "rideDistanceKm": "{km} km", - "@rideDistanceKm": { - "placeholders": { - "km": { - "type": "String" - } - } - }, - "tripAssigned": "Your driver is on the way", - "tripDriverArriving": "Your driver is close", - "tripDriverArrived": "Your driver is waiting", - "tripInProgress": "On the way to your destination", - "tripCompleted": "You've arrived", - "driverGoOnline": "Go online", - "driverGoOffline": "Go offline", - "driverOnline": "Online", - "driverOffline": "Offline", - "driverNoOffers": "No requests yet. Stay online.", - "driverOfferTitle": "New ride request", - "driverAccept": "Accept", - "driverReject": "Dismiss", - "driverOfferTaken": "Another driver took this request", - "driverArrivedAction": "I've arrived", - "driverStartTrip": "Start trip", - "driverEndTrip": "End trip", - "driverOnTheWay": "Heading to rider", - "rateTitle": "How was your ride?", - "rateTitleDriver": "How was your rider?", - "rateLead": "Your rating helps us improve", - "rateComment": "Add a note (optional)", - "rateSubmit": "Submit rating", - "rateSkip": "Later", - "rateAlready": "You already rated this trip", - "tripCall": "Call", - "tripMessage": "Message", - "tripFareTitle": "Fare breakdown", - "tripFare": "Fare", - "tripEarnings": "Your earnings", - "tripCommission": "Commission", - "tripCancelTitle": "Why are you cancelling?", - "tripCancelReasonWait": "The wait is too long", - "tripCancelReasonMistake": "I requested by mistake", - "tripCancelReasonOther": "Another reason", - "tripCancelConfirm": "Confirm cancellation", - "tripCancelKeep": "Keep the ride", - "walletTitle": "Wallet", - "walletBalance": "Balance", - "walletTopup": "Top up", - "walletTopupAmount": "Amount", - "walletTransactions": "Transactions", - "walletEmpty": "No transactions yet", - "walletTopupFailed": "Top-up failed", - "creditTitle": "Operating credit", - "creditLead": "Commission is deducted from it when each trip ends", - "creditBlocked": "Your operating credit ran out — top it up to receive requests", - "payoutTitle": "Withdraw earnings", - "payoutAmount": "Amount", - "payoutChannel": "Payout channel", - "payoutRequest": "Send confirmation code", - "payoutOtpTitle": "Confirm withdrawal", - "payoutOtpLead": "We sent a code to your number to confirm this withdrawal", - "payoutConfirm": "Confirm withdrawal", - "payoutDone": "Withdrawal request sent", - "payoutFailed": "Withdrawal failed", - "payoutInsufficient": "Insufficient balance", - "payoutHistory": "Withdrawal requests", - "menuTitle": "Menu", - "menuProfile": "Account", - "menuTrips": "My trips", - "menuWallet": "Wallet", - "menuEarnings": "Earnings", - "menuSettings": "Settings", - "menuSupport": "Help", - "menuNotifications": "Notifications", - "notificationsEmpty": "No notifications yet — we'll keep you posted about your trips here", - "notificationsClear": "Clear all", - "menuAbout": "About", - "menuLogout": "Sign out", - "menuLogoutConfirm": "Sign out of your account?", - "paymentCash": "Cash", - "paymentWallet": "Wallet", - "historyTitle": "My trips", - "historyEmpty": "No trips yet — request your first ride", - "historyStatusCompleted": "Completed", - "historyStatusCancelled": "Cancelled", - "historyStatusLive": "In progress", - "profileEditTitle": "Edit account", - "profilePhone": "Phone number", - "profilePhoneLocked": "Your number can't be changed — it identifies your account", - "profileSaved": "Changes saved", - "supportTitle": "Help", - "supportFaq": "FAQ", - "supportContact": "Contact us", - "supportWhatsapp": "Message on WhatsApp", - "aboutVersion": "Version", - "notifTitle": "Notifications", - "notifEnable": "Enable notifications", - "notifDenied": "Notifications are disabled in system settings", - "chatTitle": "Chat", - "chatHint": "Type a message", - "chatEmpty": "No messages yet", - "rideCoupon": "Promo code", - "rideCouponApply": "Apply", - "rideNoLocation": "Turn on location so we know where you are", - "rideBack": "Back", - "rideRetryQuote": "Recalculate fare", - "rideFrom": "From", - "rideTo": "To", - "walletChannel": "Payment method", - "rideTypeUnavailable": "Unavailable", - "rideSearchNoResults": "No results — try another name or pick on the map", - "walletInvoiceTitle": "Complete the transfer", - "walletInvoiceRef": "Reference", - "walletInvoiceTarget": "Transfer to", - "walletInvoicePending": "Your balance updates once the transfer is confirmed", - "walletCopy": "Copy", - "walletCopied": "Copied", - "walletNoTarget": "No receiving account is configured for this channel yet — contact the operator", - "rewardsTitle": "My rewards", - "rewardsInviteTitle": "Invite a friend", - "rewardsInviteLead": "Share your code — you both earn", - "rewardsCode": "Invite code", - "rewardsInvited": "Invited", - "rewardsPending": "Pending", - "rewardsPaid": "Rewards paid", - "rewardsCoupons": "My coupons", - "rewardsCouponsEmpty": "No valid coupons right now", - "menuRewards": "My rewards", - "menuInvite": "Invite a friend", - "menuShare": "Share the app", - "menuNotifications": "Notifications", - "menuPrivacy": "Privacy policy", - "menuRateApp": "Rate the app", - "shareMessage": "Try Tripz — use my code {code} for a discount on your first ride\n{link}", - "shareMessagePlain": "Try Tripz\n{link}", - "menuRiderApp": "Get the rider app", - "menuDriverApp": "Become a driver", - "@shareMessage": { - "placeholders": { - "code": { - "type": "String" - }, - "link": { - "type": "String" - } - } - }, - "@shareMessagePlain": { - "placeholders": { - "link": { - "type": "String" - } - } - }, - "supportFaqQ1": "How do I request a ride?", - "supportFaqA1": "Pick your destination from search or the map, choose a ride type, then tap “Request ride”.", - "supportFaqQ2": "How do I top up?", - "supportFaqA2": "In the wallet, choose an amount and a payment method. You'll get transfer instructions and a reference — your balance updates once the transfer is confirmed.", - "supportFaqQ3": "Why is no driver showing up?", - "supportFaqA3": "There may be no drivers nearby right now. Try again shortly or change the ride type.", - "supportFaqQ4": "How do I cancel?", - "supportFaqA4": "Tap “Cancel ride” on the trip card. Cancelling after the driver arrives may incur a fee.", - "supportDeviceCheck": "Check device compatibility", - "supportDeviceOk": "Your device is compatible", - "supportDeviceIssues": "Issues that may affect the app" -} \ No newline at end of file diff --git a/apps/rider_new/lib/core/l10n/l10n.dart b/apps/rider_new/lib/core/l10n/l10n.dart deleted file mode 100644 index abd1e2c..0000000 --- a/apps/rider_new/lib/core/l10n/l10n.dart +++ /dev/null @@ -1,10 +0,0 @@ -import 'package:flutter/widgets.dart'; - -import 'gen/app_localizations.dart'; - -export 'gen/app_localizations.dart'; - -/// كل نص مرئي يمرّ من هنا: `context.l10n.phoneTitle` (docs/26 §4). -extension L10nX on BuildContext { - L10n get l10n => L10n.of(this); -} diff --git a/apps/rider_new/lib/core/location/location_service.dart b/apps/rider_new/lib/core/location/location_service.dart deleted file mode 100644 index 0aa0fab..0000000 --- a/apps/rider_new/lib/core/location/location_service.dart +++ /dev/null @@ -1,59 +0,0 @@ -import 'dart:async'; - -import 'package:geolocator/geolocator.dart'; - -import '../config.dart'; - -/// الموقع — نقطة واحدة. لا `Geolocator` منثوراً في الشاشات. -class LocationService { - StreamSubscription? _sub; - - /// بلا هذا الفحص يرمي `getCurrentPosition` ونبتلع الخطأ فتبقى الكاميرا - /// على الاحتياطي بلا سبب ظاهر — وهو ما كان يبدو «الخريطة لا تتبع موقعي». - Future ensureReady() async { - if (!await Geolocator.isLocationServiceEnabled()) return false; - var permission = await Geolocator.checkPermission(); - if (permission == LocationPermission.denied) { - permission = await Geolocator.requestPermission(); - } - return permission == LocationPermission.always || - permission == LocationPermission.whileInUse; - } - - Future<({double lat, double lng})?> current() async { - if (!await ensureReady()) return null; - try { - final p = await Geolocator.getCurrentPosition( - locationSettings: const LocationSettings( - accuracy: LocationAccuracy.high, - timeLimit: Duration(seconds: 12), - ), - ); - return (lat: p.latitude, lng: p.longitude); - } catch (_) { - // آخر موقع معروف أفضل من لا شيء: خريطة تفتح على الصفر تجربة مكسورة. - final last = await Geolocator.getLastKnownPosition(); - return last == null ? null : (lat: last.latitude, lng: last.longitude); - } - } - - /// تدفّق المواقع بمرشّح مسافة — رفع كل متر يستنزف البطارية بلا فائدة. - Stream watch() { - return Geolocator.getPositionStream( - locationSettings: LocationSettings( - accuracy: LocationAccuracy.high, - distanceFilter: AppConfig.locationFilterMeters, - ), - ); - } - - void listen(void Function(Position) onPosition) { - _sub?.cancel(); - _sub = watch().listen(onPosition); - } - - Future stop() async { - await _sub?.cancel(); - _sub = null; - } -} diff --git a/apps/rider_new/lib/core/notifications/notification_store.dart b/apps/rider_new/lib/core/notifications/notification_store.dart deleted file mode 100644 index 129a1e9..0000000 --- a/apps/rider_new/lib/core/notifications/notification_store.dart +++ /dev/null @@ -1,104 +0,0 @@ -import 'dart:convert'; - -import 'package:shared_preferences/shared_preferences.dart'; - -/// إشعار وصل إلى الجهاز — يُحفظ محلياً لأن الخادم لا يسرد شيئاً. -class AppNotification { - const AppNotification({ - required this.title, - required this.body, - required this.receivedAt, - this.read = false, - }); - - final String title; - final String body; - final DateTime receivedAt; - final bool read; - - AppNotification copyWith({bool? read}) => AppNotification( - title: title, - body: body, - receivedAt: receivedAt, - read: read ?? this.read, - ); - - Map toJson() => { - 't': title, - 'b': body, - 'at': receivedAt.toIso8601String(), - 'r': read, - }; - - factory AppNotification.fromJson(Map json) => - AppNotification( - title: json['t'] as String? ?? '', - body: json['b'] as String? ?? '', - receivedAt: - DateTime.tryParse(json['at']?.toString() ?? '') ?? DateTime.now(), - read: json['r'] as bool? ?? false, - ); -} - -/// صندوق الإشعارات — **محلّي بالكامل وعن قصد**. -/// -/// الخادم يوفّر `POST /notifications/token` فقط ولا نقطة سرد -/// (`backend-archive/src/modules/notifications`, docs/38 §11). فبدل شاشة -/// فارغة تعتمد على نقطة غير موجودة، نحفظ ما يصل فعلاً عبر FCM بينما التطبيق -/// يعمل. سيرو يعرض `NotificationPage` في الدراور -/// (`map_menu_widget.dart:354`) — هذا مقابلها الصادق. -/// -/// **حدّ معروف:** ما يصل والتطبيق مغلق تماماً لا يُلتقط — لا `background -/// handler` مسجَّلاً. حين تُضاف نقطة سرد على الخادم، يُستبدل هذا المصدر -/// بها ويبقى نفس عرض الشاشة. -class NotificationStore { - static const _key = 'notifications_inbox'; - - /// سقف الاحتفاظ — صندوق بلا حدّ يتضخّم بلا فائدة. - static const _max = 50; - - List _items = const []; - List get items => _items; - - int get unreadCount => _items.where((n) => !n.read).length; - - Future load() async { - final prefs = await SharedPreferences.getInstance(); - final raw = prefs.getString(_key); - if (raw == null || raw.isEmpty) return; - try { - final list = jsonDecode(raw) as List; - _items = list - .whereType>() - .map(AppNotification.fromJson) - .toList(growable: false); - } catch (_) { - // تخزين تالف لا يمنع فتح الشاشة — يُهمل ويُكتب فوقه عند أول إشعار. - _items = const []; - } - } - - Future add(AppNotification notification) async { - _items = [notification, ..._items].take(_max).toList(growable: false); - await _persist(); - } - - Future markAllRead() async { - if (_items.every((n) => n.read)) return; - _items = _items.map((n) => n.copyWith(read: true)).toList(growable: false); - await _persist(); - } - - Future clear() async { - _items = const []; - await _persist(); - } - - Future _persist() async { - final prefs = await SharedPreferences.getInstance(); - await prefs.setString( - _key, - jsonEncode(_items.map((n) => n.toJson()).toList(growable: false)), - ); - } -} diff --git a/apps/rider_new/lib/core/notifications/push_service.dart b/apps/rider_new/lib/core/notifications/push_service.dart deleted file mode 100644 index 03922fb..0000000 --- a/apps/rider_new/lib/core/notifications/push_service.dart +++ /dev/null @@ -1,85 +0,0 @@ -import 'package:firebase_core/firebase_core.dart'; -import 'package:firebase_messaging/firebase_messaging.dart'; -import 'package:flutter/foundation.dart'; - -import '../api/api_client.dart'; -import '../api/api_exception.dart'; -import 'notification_store.dart'; - -/// إشعارات FCM — **الطبقة الوحيدة التي تعرف Firebase**. -/// -/// عقد الخادم نقطة واحدة: `POST /notifications/token { token, platform }` -/// (docs/38 §11). لا نقطة **سرد** إشعارات، فالصندوق محلّي: ما يصل أثناء عمل -/// التطبيق يُحفظ في [NotificationStore] ويُعرض في `NotificationsPage` — -/// انظر تعليق ذلك الصنف لحدود هذا الاختيار. -/// -/// الإعداد الأصلي جاهز مسبقاً: `google-services.json` و -/// `GoogleService-Info.plist` منقولان مع الطبقة الأصلية، و`build.gradle` -/// يطبّق `com.google.gms.google-services` أصلاً. -class PushService { - PushService(this._api, this._store); - - final ApiClient _api; - final NotificationStore _store; - - /// يُنادى **بعد** الدخول: التسجيل يربط الجهاز بالمستخدم، فقبل الجلسة - /// لا معنى له. - Future register() async { - try { - await Firebase.initializeApp(); - final messaging = FirebaseMessaging.instance; - - final settings = await messaging.requestPermission(); - if (settings.authorizationStatus == AuthorizationStatus.denied) return; - - final token = await messaging.getToken(); - if (token != null) await _send(token); - - // الرمز يُدوَّر من Google دورياً — بلا هذا الاشتراك تتوقّف الإشعارات - // بصمت بعد أسابيع. - messaging.onTokenRefresh.listen(_send); - - // ما يصل والتطبيق مفتوح، وما فُتح التطبيق بالضغط عليه. - FirebaseMessaging.onMessage.listen(_capture); - FirebaseMessaging.onMessageOpenedApp.listen(_capture); - final initial = await messaging.getInitialMessage(); - if (initial != null) await _capture(initial); - } catch (_) { - // غياب الإشعارات لا يمنع استعمال التطبيق — لا يُسقط الإقلاع. - } - } - - /// إشعار بلا عنوان ولا نصّ (رسالة بيانات صرفة) لا يُعرض — سطر فارغ في - /// الصندوق أسوأ من لا شيء. - Future _capture(RemoteMessage message) async { - final title = message.notification?.title ?? ''; - final body = message.notification?.body ?? ''; - if (title.isEmpty && body.isEmpty) return; - await _store.add(AppNotification( - title: title, - body: body, - receivedAt: message.sentTime ?? DateTime.now(), - )); - } - - Future _send(String token) async { - try { - await _api.post>( - '/notifications/token', - body: { - 'token': token, - 'platform': defaultTargetPlatformName, - }, - ); - } on ApiException { - // يُعاد في الإقلاع التالي. - } - } -} - -/// المنصّة كما يتوقّعها الخادم — تُقرأ من المنصّة الفعلية لا من عَلَم بناء. -String get defaultTargetPlatformName => switch (defaultTargetPlatform) { - TargetPlatform.iOS => 'ios', - TargetPlatform.android => 'android', - _ => 'unknown', - }; diff --git a/apps/rider_new/lib/core/payments/country_codes.dart b/apps/rider_new/lib/core/payments/country_codes.dart deleted file mode 100644 index 0c64dfe..0000000 --- a/apps/rider_new/lib/core/payments/country_codes.dart +++ /dev/null @@ -1,48 +0,0 @@ -/// مفاتيح الدول المدعومة. -/// -/// حزمة `intl_phone_field` التي يستعملها سيرو تحمل **240 دولة** ولا نحتاج -/// منها إلا أربعاً، وتجرّ معها أصولاً وتبعيّات. القائمة هنا صريحة ومقصورة -/// على أسواقنا — وتتوسّع بسطر واحد. -/// -/// ترتيب العرض يبدأ بحزمة دولة المستأجر (`countryPack`)، فالمشغّل الأردني -/// يرى الأردن أولاً بلا بحث. -enum CountryCode { - jordan('jo', '962', 'الأردن', 'Jordan', '🇯🇴', 9), - syria('sy', '963', 'سوريا', 'Syria', '🇸🇾', 9), - egypt('eg', '20', 'مصر', 'Egypt', '🇪🇬', 10), - iraq('iq', '964', 'العراق', 'Iraq', '🇮🇶', 10); - - const CountryCode( - this.pack, - this.dial, - this.nameAr, - this.nameEn, - this.flag, - this.nationalLength, - ); - - /// يطابق `countryPack` في إعداد المستأجر. - final String pack; - - /// المفتاح الدولي بلا `+`. - final String dial; - - final String nameAr; - final String nameEn; - final String flag; - - /// طول الرقم الوطني **بلا الصفر البادئ** — أساس التحقّق المحلّي. - final int nationalLength; - - String nameFor(String languageCode) => - languageCode == 'ar' ? nameAr : nameEn; - - static CountryCode fromPack(String pack) => - values.firstWhere((c) => c.pack == pack, orElse: () => jordan); - - /// المستأجر أولاً ثم الباقي — لا ترتيب أبجدي يدفن سوق المشغّل للأسفل. - static List orderedFor(String pack) { - final first = fromPack(pack); - return [first, ...values.where((c) => c != first)]; - } -} diff --git a/apps/rider_new/lib/core/payments/payment_channels.dart b/apps/rider_new/lib/core/payments/payment_channels.dart deleted file mode 100644 index 2bb7195..0000000 --- a/apps/rider_new/lib/core/payments/payment_channels.dart +++ /dev/null @@ -1,61 +0,0 @@ -/// قنوات الدفع والسحب حسب **حزمة دولة المستأجر** (`countryPack` من -/// `GET /tenant/config/:slug` — docs/38 §10)، لا حسب لغة الجهاز ولا موقعه. -/// -/// المستأجر هو من يحدّد السوق: مشغّل أردني يخدم مستخدماً هاتفه إنجليزي -/// وموقعه خارج الأردن يبقى أردنيّ القنوات. -/// -/// الشحن يمرّ بـ**`POST /payments/charge`** لا `POST /wallet/topup` — الأخير -/// كاش-إن تجريبي يزيد الرصيد بلا دفع. -/// -/// كليك وشام كاش وزين كاش تعمل بنمط **الفاتورة**: الخادم يولّد مرجعاً ويعرض -/// حساب الاستلام، والمستخدم يحوّل، والتسوية تصل لاحقاً عبر مطابقة رسالة -/// المزوّد (SMS) — وهو **نفس ما يفعله سيرو** حرفياً -/// (`create_cliq_invoice.php`). لا بوابة تحويل حيّة لأيٍّ منها. -/// PayMob وحده يعمل بإعادة توجيه فعلية. -enum PaymentChannel { - // ⚠️ `wire` يجب أن يطابق اسم المحوّل في `PaymentGatewayRegistry` حرفياً — - // أي اسم آخر يرجّع 400 `unsupported provider`. - cliq('cliq', 'CliQ', 'كليك'), - syriatel('syriatel', 'Syriatel Cash', 'سيرياتيل كاش'), - mtn('mtn', 'MTN Cash', 'إم تي إن كاش'), - shamCash('shamcash', 'Sham Cash', 'شام كاش'), - zainCash('zaincash', 'ZainCash', 'زين كاش'), - paymob('paymob', 'PayMob', 'باي موب'), - cash('cash', 'Cash', 'نقداً'); - - const PaymentChannel(this.wire, this.nameEn, this.nameAr); - - /// القيمة المرسلة للخادم في حقل `channel`. - final String wire; - final String nameEn; - final String nameAr; - - String nameFor(String languageCode) => - languageCode == 'ar' ? nameAr : nameEn; - - /// القنوات المتاحة لكل حزمة دولة — مطابقة لما هو مدعوم فعلياً في السوق - /// (نفس قنوات سيرو الميدانية). - static List forCountry(String countryPack) => - switch (countryPack) { - 'jo' => const [PaymentChannel.cliq, PaymentChannel.cash], - 'sy' => const [ - PaymentChannel.syriatel, - PaymentChannel.mtn, - PaymentChannel.shamCash, - PaymentChannel.cash, - ], - 'eg' => const [PaymentChannel.paymob, PaymentChannel.cash], - // العراق: المحافظ الأشيع محلياً. ⚠️ الباك إند لا يعرف حزمة `iq` بعد - // (`default-tariffs.ts` فيه jo/sy/eg فقط) — مستأجر عراقي يُزوَّد بلا - // تعرفة، وهذا شغل خادم يسبق أي إطلاق عراقي. - 'iq' => const [PaymentChannel.zainCash, PaymentChannel.cash], - // حزمة غير معروفة: النقد وحده — لا نعرض قناة قد لا تعمل في سوقها. - _ => const [PaymentChannel.cash], - }; - - /// قنوات السحب — النقد ليس قناة سحب. - static List payoutFor(String countryPack) => - forCountry(countryPack) - .where((c) => c != PaymentChannel.cash) - .toList(growable: false); -} diff --git a/apps/rider_new/lib/core/realtime/realtime_service.dart b/apps/rider_new/lib/core/realtime/realtime_service.dart deleted file mode 100644 index 29b0022..0000000 --- a/apps/rider_new/lib/core/realtime/realtime_service.dart +++ /dev/null @@ -1,95 +0,0 @@ -import 'dart:async'; - -import 'package:socket_io_client/socket_io_client.dart' as io; - -import '../config.dart'; - -import '../storage/token_store.dart'; - -/// أحداث الخادم كما هي في `backend-archive/src/realtime` (docs/38 §9). -class RealtimeEvent { - const RealtimeEvent(this.name, this.data); - - final String name; - final Map data; - - static const tripUpdate = 'trip:update'; - static const driverLocation = 'driver:location'; - static const tripOffer = 'trip:offer'; - static const tripOfferTaken = 'trip:offer_taken'; -} - -/// اتصال Socket.IO واحد للتطبيق كله. -/// -/// **الاتصال ليس مصدر الحقيقة**: كل ما يصل عبره يجب أن يكون قابلاً للاستنتاج -/// من REST أيضاً. حدثٌ ضائع (شبكة سيّئة، أو ثغرة R1 التي قد تمنع -/// `expired`/`no_drivers` أصلاً) يجب ألّا يُجمّد شاشة. -class RealtimeService { - RealtimeService(this._tokens); - - final TokenStore _tokens; - - io.Socket? _socket; - final _events = StreamController.broadcast(); - - Stream get events => _events.stream; - bool get isConnected => _socket?.connected ?? false; - - Future connect() async { - if (_socket != null) return; - final token = _tokens.accessToken; - if (token == null) return; - - // الأصل بلا `/api` — الـSocket.IO ليس على مسار الـREST (docs/38 §9). - final socket = io.io( - AppConfig.wsBaseUrl, - io.OptionBuilder() - .setTransports(['websocket']) - .setAuth({'token': token}) - .enableReconnection() - .build(), - ); - - for (final name in const [ - RealtimeEvent.tripUpdate, - RealtimeEvent.driverLocation, - RealtimeEvent.tripOffer, - RealtimeEvent.tripOfferTaken, - ]) { - socket.on(name, (data) { - if (data is Map) { - _events.add(RealtimeEvent(name, Map.from(data))); - } - }); - } - - _socket = socket; - } - - /// الانضمام **قبل** أي انتقال حالة، وإلا فاتت الأحداث (docs/38 §9). - void joinTrip(String tripId) => _socket?.emit('trip:join', {'tripId': tripId}); - - void sendDriverLocation(double lat, double lng, {double? heading}) { - _socket?.emit(RealtimeEvent.driverLocation, { - 'lat': lat, - 'lng': lng, - 'heading': ?heading, - }); - } - - /// عند تجديد التوكن أو تبديل المستخدم: قطعٌ وإعادة اتصال بالتوكن الجديد. - Future reconnect() async { - disconnect(); - await connect(); - } - - void disconnect() { - _socket?.dispose(); - _socket = null; - } - - Future dispose() async { - disconnect(); - await _events.close(); - } -} diff --git a/apps/rider_new/lib/core/router.dart b/apps/rider_new/lib/core/router.dart deleted file mode 100644 index 5f2d928..0000000 --- a/apps/rider_new/lib/core/router.dart +++ /dev/null @@ -1,149 +0,0 @@ -import 'dart:async'; - -import 'package:flutter/widgets.dart'; -import 'package:go_router/go_router.dart'; - -import '../features/auth/view/login_page.dart'; -import '../features/chat/view/chat_page.dart'; -import '../features/profile/view/profile_edit_page.dart'; -import '../features/profile/view/profile_setup_page.dart'; -import '../features/rating/data/rating_repository.dart'; -import '../features/notifications/view/notifications_page.dart'; -import '../features/rewards/view/rewards_page.dart'; -import '../features/rating/view/rating_page.dart'; -import '../features/settings/view/settings_page.dart'; -import '../features/splash/view/splash_page.dart'; -import '../features/support/view/support_page.dart'; -import '../features/trip/view/history_page.dart'; -import '../features/trip/view/ride_page.dart'; -import '../features/wallet/view/wallet_page.dart'; -import 'di.dart'; -import 'session/session_cubit.dart'; -import 'session/session_state.dart'; - -class Routes { - const Routes._(); - static const splash = '/'; - static const login = '/login'; - static const profile = '/profile'; - static const home = '/home'; - static const rating = '/rating'; - static const wallet = '/wallet'; - static const history = '/history'; - static const profileEdit = '/account'; - static const settings = '/settings'; - static const support = '/support'; - static const rewards = '/rewards'; - static const chat = '/chat'; - static const notifications = '/notifications'; -} - -/// التوجيه يُشتقّ من `SessionCubit` وحده — لا `Navigator.push` بعد الدخول -/// موزّعة في الشاشات، فلا تتناقض حالتان. -final appRouter = GoRouter( - initialLocation: Routes.splash, - refreshListenable: _CubitListenable(sl().stream), - redirect: (context, state) { - final session = sl().state; - final loc = state.matchedLocation; - - // قبل أن نعرف: نبقى على الإقلاع ولا نقرّر شيئاً. - if (!session.isReady) return loc == Routes.splash ? null : Routes.splash; - - return switch (session.status) { - SessionStatus.unauthenticated => - loc == Routes.login ? null : Routes.login, - SessionStatus.needsProfile => loc == Routes.profile ? null : Routes.profile, - // التقييم المعلّق يحجز التطبيق كله: لا شاشة أخرى قبل حسمه - // (docs/38 §7 — يُفرض عند الفتح). - SessionStatus.authenticated when session.pendingRating != null => - loc == Routes.rating ? null : Routes.rating, - SessionStatus.authenticated => (loc == Routes.login || - loc == Routes.profile || - loc == Routes.splash || - loc == Routes.rating) - ? Routes.home - : null, - SessionStatus.unknown => Routes.splash, - }; - }, - routes: [ - GoRoute( - path: Routes.splash, - builder: (context, state) => const SplashPage(), - ), - GoRoute( - path: Routes.login, - builder: (context, state) => const LoginPage(), - ), - GoRoute( - path: Routes.profile, - builder: (context, state) => const ProfileSetupPage(), - ), - GoRoute( - path: Routes.rating, - builder: (context, state) { - final pending = sl().state.pendingRating!; - return RatingPage( - pending: PendingRating( - tripId: pending.tripId, - role: pending.role, - ), - onDone: sl().onRatingResolved, - ); - }, - ), - GoRoute( - path: Routes.wallet, - builder: (context, state) => const WalletPage(), - ), - GoRoute( - path: Routes.history, - builder: (context, state) => const HistoryPage(), - ), - GoRoute( - path: Routes.profileEdit, - builder: (context, state) => const ProfileEditPage(), - ), - GoRoute( - path: Routes.settings, - builder: (context, state) => const SettingsPage(), - ), - GoRoute( - path: Routes.chat, - builder: (context, state) => - ChatPage(tripId: state.uri.queryParameters['trip'] ?? ''), - ), - GoRoute( - path: Routes.rewards, - builder: (context, state) => const RewardsPage(), - ), - GoRoute( - path: Routes.support, - builder: (context, state) => const SupportPage(), - ), - GoRoute( - path: Routes.notifications, - builder: (context, state) => const NotificationsPage(), - ), - GoRoute( - path: Routes.home, - builder: (context, state) => const RidePage(), - ), - ], -); - -/// جسر بين تيّار الـCubit و`refreshListenable` الذي يطلبه go_router. -class _CubitListenable extends ChangeNotifier { - _CubitListenable(Stream stream) { - _sub = stream.listen((_) => notifyListeners()); - } - - late final StreamSubscription _sub; - - @override - void dispose() { - _sub.cancel(); - super.dispose(); - } -} diff --git a/apps/rider_new/lib/core/session/app_user.dart b/apps/rider_new/lib/core/session/app_user.dart deleted file mode 100644 index d6aac53..0000000 --- a/apps/rider_new/lib/core/session/app_user.dart +++ /dev/null @@ -1,50 +0,0 @@ -import 'package:equatable/equatable.dart'; - -/// المستخدم كما يرجّعه الخادم (docs/38 §2 — شكل مُتحقَّق حيّاً). -class AppUser extends Equatable { - const AppUser({ - required this.id, - required this.tenantId, - required this.phone, - required this.role, - required this.status, - required this.language, - this.name, - this.rating, - }); - - final String id; - final String tenantId; - - /// مطبَّع دولياً من الخادم (`0790000001` ← `962790000001`) — لا يُقارن نصّياً - /// بما أدخله المستخدم (docs/38 §2). - final String phone; - - final String role; - final String status; - final String language; - final String? name; - - /// نصّ لا رقم — كل الأرقام العشرية تصل نصوصاً (docs/38 §12.2). - final String? rating; - - /// `phone_bidx` يصل في الرد لكنه فهرس أعمى للخادم — **لا يُخزَّن ولا يُعرض**. - factory AppUser.fromJson(Map json) { - return AppUser( - id: json['id'] as String, - tenantId: json['tenant_id'] as String, - phone: json['phone'] as String, - role: json['role'] as String? ?? 'rider', - status: json['status'] as String? ?? 'active', - language: json['language'] as String? ?? 'ar', - name: json['name'] as String?, - rating: json['rating']?.toString(), - ); - } - - /// الملف ناقص ما لم يُدخل المستخدم اسمه — يقود شاشة إكمال الملف. - bool get needsProfile => name == null || name!.trim().isEmpty; - - @override - List get props => [id, tenantId, phone, role, status, language, name]; -} diff --git a/apps/rider_new/lib/core/session/session_cubit.dart b/apps/rider_new/lib/core/session/session_cubit.dart deleted file mode 100644 index d390208..0000000 --- a/apps/rider_new/lib/core/session/session_cubit.dart +++ /dev/null @@ -1,90 +0,0 @@ -import 'dart:async'; - -import 'package:flutter_bloc/flutter_bloc.dart'; - -import '../api/api_exception.dart'; -import 'app_user.dart'; -import 'session_source.dart'; -import 'session_state.dart'; - -/// حالة الجلسة على مستوى التطبيق — مصدر قرار التوجيه الوحيد -/// (`core/router.dart` يستمع إليها). -class SessionCubit extends Cubit { - SessionCubit(this._repo, {Future Function()? onAuthenticated}) - : _onAuthenticated = onAuthenticated, - super(const SessionState()); - - final SessionSource _repo; - - /// خطّاف يُنفَّذ مرة عند إثبات الجلسة — يبقي `core/session` جاهلاً بمن - /// يستمع إليه. - final Future Function()? _onAuthenticated; - - /// تُستدعى مرة عند الإقلاع من شاشة الـsplash. - Future restore() async { - if (!_repo.hasSession) { - emit(const SessionState(status: SessionStatus.unauthenticated)); - return; - } - try { - _apply(await _repo.me()); - } on ApiException catch (e) { - // 401 هنا يعني رمز تحديث ميّت — الـinterceptor مسح المخزن أصلاً. - // أي خطأ آخر (شبكة) لا يُسقط الجلسة: المستخدم مسجّل، الشبكة هي الغائبة. - if (e.isUnauthorized) { - emit(const SessionState(status: SessionStatus.unauthenticated)); - } else { - emit(const SessionState(status: SessionStatus.authenticated)); - } - } - } - - void onLoggedIn(AppUser user) => _apply(user); - - void onProfileCompleted(AppUser user) => _apply(user); - - Future logout() async { - await _repo.logout(); - emit(const SessionState(status: SessionStatus.unauthenticated)); - } - - /// انتهاء الجلسة من طبقة الشبكة (رمز تحديث ميّت) — لا يمرّ بالمستودع. - void onSessionExpired() { - emit(const SessionState(status: SessionStatus.unauthenticated)); - } - - /// يُنادى بعد التقييم أو تخطّيه — يرفع الحجز عن بقية التطبيق. - void onRatingResolved() => - emit(state.copyWith(clearPendingRating: true)); - - void _apply(AppUser user) { - emit(SessionState( - status: user.needsProfile - ? SessionStatus.needsProfile - : SessionStatus.authenticated, - user: user, - pendingRating: state.pendingRating, - )); - // بعد إثبات الجلسة: التقييم المعلّق، وتسجيل رمز الإشعارات (يربط الجهاز - // بالمستخدم، فلا معنى له قبل الدخول). - if (!user.needsProfile) { - unawaited(_checkPendingRating()); - unawaited(_onAuthenticated?.call() ?? Future.value()); - } - } - - Future _checkPendingRating() async { - try { - final pending = await _repo.pendingRating(); - if (isClosed || pending == null) return; - emit(state.copyWith( - pendingRating: PendingRatingRef( - tripId: pending.tripId, - role: pending.role, - ), - )); - } on ApiException { - // فحصٌ مساعد لا حاجز دخول. - } - } -} diff --git a/apps/rider_new/lib/core/session/session_source.dart b/apps/rider_new/lib/core/session/session_source.dart deleted file mode 100644 index 6e2e0b3..0000000 --- a/apps/rider_new/lib/core/session/session_source.dart +++ /dev/null @@ -1,16 +0,0 @@ -import 'app_user.dart'; - -/// ما تحتاجه الجلسة من طبقة المصادقة — **ولا شيء أكثر**. -/// -/// `SessionCubit` حالةٌ على مستوى التطبيق (الراوتر والشاشات كلها تقرأها)، -/// فمحلّها `core/`. ولأن `core/` لا يجوز أن يستورد من `features/` كما لا -/// تستورد ميزةٌ من أخرى (docs/23 §1)، تُعرّف الحاجة هنا كواجهة ضيّقة -/// ويُنفّذها `AuthRepository` في ميزة المصادقة. -abstract interface class SessionSource { - Future me(); - - /// رحلة تنتظر تقييماً، أو `null`. يُنفّذها `RatingRepository`. - Future<({String tripId, String role})?> pendingRating(); - Future logout(); - bool get hasSession; -} diff --git a/apps/rider_new/lib/core/session/session_state.dart b/apps/rider_new/lib/core/session/session_state.dart deleted file mode 100644 index 9d0b92d..0000000 --- a/apps/rider_new/lib/core/session/session_state.dart +++ /dev/null @@ -1,56 +0,0 @@ -import 'package:equatable/equatable.dart'; - -import 'app_user.dart'; - -/// رحلة تنتظر تقييماً — تُفحص عند كل فتح للتطبيق (docs/38 §7). -class PendingRatingRef { - const PendingRatingRef({required this.tripId, required this.role}); - - final String tripId; - final String role; - - bool get isDriver => role == 'driver'; -} - -enum SessionStatus { - /// قبل أن نعرف — تُعرض شاشة الإقلاع، ولا يُتّخذ قرار توجيه. - unknown, - authenticated, - - /// مصادَق لكن بلا اسم — يُوجَّه لإكمال الملف قبل أي شاشة أخرى. - needsProfile, - unauthenticated, -} - -class SessionState extends Equatable { - const SessionState({ - this.status = SessionStatus.unknown, - this.user, - this.pendingRating, - }); - - final SessionStatus status; - final AppUser? user; - - /// وجودها يفرض شاشة التقييم قبل أي شاشة أخرى. - final PendingRatingRef? pendingRating; - - bool get isReady => status != SessionStatus.unknown; - - SessionState copyWith({ - SessionStatus? status, - AppUser? user, - PendingRatingRef? pendingRating, - bool clearPendingRating = false, - }) { - return SessionState( - status: status ?? this.status, - user: user ?? this.user, - pendingRating: - clearPendingRating ? null : (pendingRating ?? this.pendingRating), - ); - } - - @override - List get props => [status, user, pendingRating?.tripId]; -} diff --git a/apps/rider_new/lib/core/storage/token_store.dart b/apps/rider_new/lib/core/storage/token_store.dart deleted file mode 100644 index 481b770..0000000 --- a/apps/rider_new/lib/core/storage/token_store.dart +++ /dev/null @@ -1,94 +0,0 @@ -import 'dart:convert'; - -import 'package:flutter_secure_storage/flutter_secure_storage.dart'; - -/// مخزن الرموز — التخزين الآمن وحده. لا يُكتب توكن في `SharedPreferences`. -class TokenStore { - TokenStore(this._storage); - - final FlutterSecureStorage _storage; - - static const _kAccess = 'access_token'; - static const _kRefresh = 'refresh_token'; - static const _kSigning = 'signing_key'; - static const _kDeviceId = 'device_id'; - - // نسخة في الذاكرة: الـinterceptor يقرأ التوكن عند كل طلب، وقراءة Keychain - // في كل مرة عمل ثقيل على المسار الساخن. - String? _access; - String? _refresh; - - Future load() async { - _access = await _storage.read(key: _kAccess); - _refresh = await _storage.read(key: _kRefresh); - } - - String? get accessToken => _access; - String? get refreshToken => _refresh; - bool get isLoggedIn => _refresh != null && _refresh!.isNotEmpty; - - Future save({ - required String accessToken, - required String refreshToken, - String? signingKey, - }) async { - _access = accessToken; - _refresh = refreshToken; - await _write(_kAccess, accessToken); - await _write(_kRefresh, refreshToken); - if (signingKey != null) { - await _write(_kSigning, signingKey); - } - } - - Future clear() async { - _access = null; - _refresh = null; - await _storage.delete(key: _kAccess); - await _storage.delete(key: _kRefresh); - await _storage.delete(key: _kSigning); - // مُعرّف الجهاز لا يُمسح عند الخروج — هو بصمة الجهاز لا بصمة الجلسة. - } - - /// مفتاح توقيع الطلبات — يعود مع رد الدخول (docs/38 §8). يُستهلك في م3. - Future signingKey() => _storage.read(key: _kSigning); - - Future deviceId() => _storage.read(key: _kDeviceId); - Future setDeviceId(String id) => _write(_kDeviceId, id); - - Future _write(String key, String value) async { - try { - await _storage.write(key: key, value: value); - } catch (_) { - await _storage.delete(key: key); - await _storage.write(key: key, value: value); - } - } - - /// هل انتهت صلاحية التوكن (أو ستنتهي خلال [leeway])؟ - /// - /// قراءة محليّة لحقل `exp` — بلا حزمة خارجية. أي عطب في التوكن يُعامل - /// كمنتهٍ: الأسوأ تجديد زائد، لا طلب فاشل. - bool isAccessExpired(Duration leeway) { - final token = _access; - if (token == null || token.isEmpty) return true; - final exp = _expiryOf(token); - if (exp == null) return true; - return DateTime.now().add(leeway).isAfter(exp); - } - - static DateTime? _expiryOf(String jwt) { - try { - final parts = jwt.split('.'); - if (parts.length != 3) return null; - final payload = json.decode( - utf8.decode(base64Url.decode(base64Url.normalize(parts[1]))), - ) as Map; - final exp = payload['exp']; - if (exp is! int) return null; - return DateTime.fromMillisecondsSinceEpoch(exp * 1000); - } catch (_) { - return null; - } - } -} diff --git a/apps/rider_new/lib/core/store_links.dart b/apps/rider_new/lib/core/store_links.dart deleted file mode 100644 index 6b3d8a9..0000000 --- a/apps/rider_new/lib/core/store_links.dart +++ /dev/null @@ -1,37 +0,0 @@ -import 'package:flutter/foundation.dart'; - -import 'build_config.dart'; -import 'config.dart'; - -/// اختيار رابط المتجر الصحيح — **بالمنصّة والدور معاً**. -/// -/// كان الخطأ (مثبت 2026-08-05): رابط واحد ثابت `https://tripz.app` لكل -/// شيء — فـ«قيّم التطبيق» لا يفتح صفحة تقييم، و«شارك التطبيق» يرسل رسالة -/// بلا رابط أصلاً، و«سجّل كسائق» يفتح صفحة تسويقية لا تطبيق السائق. -/// -/// أربع حالات لا واحدة: {آيفون، أندرويد} × {راكب، سائق}. والدور يأتي من -/// [AppConfig.appRole] الذي يميّز البناءين أصلاً. -class StoreLinks { - const StoreLinks._(); - - static bool get _isIos => defaultTargetPlatform == TargetPlatform.iOS; - - static bool get _isDriverBuild => AppConfig.appRole == 'driver'; - - /// رابط تطبيق الراكب على منصّة هذا الجهاز. - static String get rider => - _isIos ? BuildConfig.riderIosUrl : BuildConfig.riderAndroidUrl; - - /// رابط تطبيق السائق على منصّة هذا الجهاز. - static String get driver => - _isIos ? BuildConfig.driverIosUrl : BuildConfig.driverAndroidUrl; - - /// **هذا** التطبيق في متجر هذا الجهاز — لـ«قيّم التطبيق» ولرابط المشاركة. - /// - /// السائق يشارك رابط السائق، والراكب رابط الراكب: مشاركةُ راكبٍ لرابط - /// السائق تُنزِّل المدعوَّ تطبيقاً خاطئاً. - static String get thisApp => _isDriverBuild ? driver : rider; - - /// تطبيق الطرف الآخر — «سجّل كسائق» في تطبيق الراكب، والعكس. - static String get otherApp => _isDriverBuild ? rider : driver; -} diff --git a/apps/rider_new/lib/core/tenant/feature_gate.dart b/apps/rider_new/lib/core/tenant/feature_gate.dart deleted file mode 100644 index 9e5d07a..0000000 --- a/apps/rider_new/lib/core/tenant/feature_gate.dart +++ /dev/null @@ -1,13 +0,0 @@ -import 'package:flutter/widgets.dart'; -import 'package:flutter_bloc/flutter_bloc.dart'; - -import 'tenant_cubit.dart'; - -extension FeatureGateX on BuildContext { - /// هل الميزة مفعّلة **لهذا المستأجر** وقت التشغيل؟ - /// - /// تُقرأ مع علم `Features` الثابت: الأول يقرّر ما بُني، وهذا ما يُعرض. - /// أيّهما `false` يُخفي الميزة. - bool tenantHas(String feature) => - watch().state.has(feature); -} diff --git a/apps/rider_new/lib/core/tenant/tenant_config.dart b/apps/rider_new/lib/core/tenant/tenant_config.dart deleted file mode 100644 index daad1c4..0000000 --- a/apps/rider_new/lib/core/tenant/tenant_config.dart +++ /dev/null @@ -1,79 +0,0 @@ -import 'dart:convert'; - -import 'package:equatable/equatable.dart'; - -/// إعداد المستأجر من `GET /tenant/config/:slug` (شكل مُتحقَّق حيّاً، -/// docs/38 §10) — بلا توكن، فيُجلب قبل الدخول. -/// -/// **طبقتا الميزات**، ولكلٍّ دورها: -/// - `Features` (`const` في `build_config.dart`) يقرّر ما **يُبنى** في -/// الـbinary — إطفاؤه يحذف الكود فلا يُستخرج (docs/23 §5). -/// - هذا الإعداد يقرّر ما **يُعرض** ممّا بُني، حسب ما اشتراه المستأجر فعلاً. -/// الشاشة تتحقّق من الاثنتين: `Features.wallet && tenant.has('wallet')`. -class TenantConfig extends Equatable { - const TenantConfig({ - required this.slug, - required this.name, - required this.countryPack, - required this.plan, - required this.features, - }); - - final String slug; - final String name; - - /// يحدّد مزوّد الرسائل والعملة وصيغة الهاتف — `jo`/`eg`/`sy`. - final String countryPack; - - final String plan; - final Map features; - - static const empty = TenantConfig( - slug: '', - name: '', - countryPack: '', - plan: '', - features: {}, - ); - - /// الافتراض `false` عند غياب المفتاح: ميزة غير معلنة = غير مشتراة. - bool has(String feature) => features[feature] ?? false; - - factory TenantConfig.fromJson(Map json) { - final raw = json['features']; - return TenantConfig( - slug: json['slug'] as String? ?? '', - name: json['name'] as String? ?? '', - countryPack: json['countryPack'] as String? ?? '', - plan: json['plan'] as String? ?? '', - features: raw is Map - ? { - for (final e in raw.entries) - e.key.toString(): e.value == true, - } - : const {}, - ); - } - - Map toJson() => { - 'slug': slug, - 'name': name, - 'countryPack': countryPack, - 'plan': plan, - 'features': features, - }; - - String encode() => json.encode(toJson()); - - static TenantConfig? decode(String? raw) { - if (raw == null || raw.isEmpty) return null; - try { - return TenantConfig.fromJson(json.decode(raw) as Map); - } catch (_) { - return null; - } - } - - @override - List get props => [slug, name, countryPack, plan, features]; -} diff --git a/apps/rider_new/lib/core/tenant/tenant_cubit.dart b/apps/rider_new/lib/core/tenant/tenant_cubit.dart deleted file mode 100644 index c56eebd..0000000 --- a/apps/rider_new/lib/core/tenant/tenant_cubit.dart +++ /dev/null @@ -1,35 +0,0 @@ -import 'package:flutter_bloc/flutter_bloc.dart'; -import 'package:shared_preferences/shared_preferences.dart'; - -import '../api/api_client.dart'; -import '../api/api_exception.dart'; -import '../build_config.dart'; -import 'tenant_config.dart'; - -/// يجلب إعداد المستأجر مرة عند الإقلاع، ويخزّنه محلياً. -/// -/// **النسخة المخزّنة تُعرض فوراً** ثم تُحدَّث من الشبكة: إقلاعٌ بلا إنترنت -/// يجب أن يعرض التطبيق بميزاته المعروفة آخر مرة، لا شاشة فارغة. -class TenantCubit extends Cubit { - TenantCubit(this._api, this._prefs) - : super(TenantConfig.decode(_prefs.getString(_key)) ?? TenantConfig.empty); - - final ApiClient _api; - final SharedPreferences _prefs; - - static const _key = 'tenant.config'; - - Future load() async { - try { - final res = await _api.get>( - '/tenant/config/${BuildConfig.tenantSlug}', - ); - final config = TenantConfig.fromJson(res); - emit(config); - await _prefs.setString(_key, config.encode()); - } on ApiException { - // الفشل يُبقي النسخة المخزّنة — لا يُطفئ ميزات المستخدم لأن الشبكة - // تعثّرت لحظة الإقلاع. - } - } -} diff --git a/apps/rider_new/lib/core/ui/app_drawer.dart b/apps/rider_new/lib/core/ui/app_drawer.dart deleted file mode 100644 index 55e0b71..0000000 --- a/apps/rider_new/lib/core/ui/app_drawer.dart +++ /dev/null @@ -1,285 +0,0 @@ -import 'package:flutter/material.dart'; -import 'package:flutter_bloc/flutter_bloc.dart'; -import 'package:go_router/go_router.dart'; -import 'package:share_plus/share_plus.dart'; -import 'package:url_launcher/url_launcher.dart'; - -import '../build_config.dart'; -import '../config.dart'; -import '../design/tokens.dart'; -import '../design/tripz_colors.dart'; -import '../di.dart'; -import '../l10n/l10n.dart'; -import '../notifications/notification_store.dart'; -import '../router.dart'; -import '../session/session_cubit.dart'; -import '../session/session_state.dart'; -import '../store_links.dart'; -import '../tenant/feature_gate.dart'; - -/// الدراور — نقطة تطبيق **طبقتَي الميزات** معاً (docs/23 §5 + docs/38 §10): -/// -/// * `Features.x` ثابت: يقرّر ما بُني في الـbinary. إطفاؤه يحذف الكود. -/// * `context.tenantHas('x')`: يقرّر ما يُعرض ممّا بُني، حسب اشتراك المستأجر. -/// -/// أيّهما `false` يُخفي المدخل — ولا يُكتب `if` ثانٍ في أي شاشة. -class AppDrawer extends StatelessWidget { - const AppDrawer({super.key}); - - @override - Widget build(BuildContext context) { - final l10n = context.l10n; - final isDriver = AppConfig.appRole == 'driver'; - - return Drawer( - child: SafeArea( - child: Column( - children: [ - const _Header(), - const Divider(height: 1), - Expanded( - child: ListView( - padding: const EdgeInsets.symmetric(vertical: Space.xs), - children: [ - _Item( - icon: Icons.person_outline_rounded, - label: l10n.menuProfile, - route: Routes.profileEdit, - ), - _Item( - icon: Icons.notifications_none_rounded, - label: l10n.menuNotifications, - route: Routes.notifications, - // العدّاد يُقرأ عند بناء الدراور — والدراور يُبنى عند كل - // فتح، فلا حاجة لتيّار يراقب مخزناً في الذاكرة. - badge: sl().unreadCount, - ), - _Item( - icon: Icons.route_outlined, - label: l10n.menuTrips, - route: Routes.history, - ), - if (Features.wallet && context.tenantHas('wallet')) - _Item( - icon: Icons.account_balance_wallet_outlined, - label: isDriver ? l10n.menuEarnings : l10n.menuWallet, - route: Routes.wallet, - ), - if (Features.coupons && context.tenantHas('coupons')) - _Item( - icon: Icons.card_giftcard_rounded, - label: l10n.menuRewards, - route: Routes.rewards, - ), - const Divider(indent: Space.md, endIndent: Space.md), - _Item( - icon: Icons.settings_outlined, - label: l10n.menuSettings, - route: Routes.settings, - ), - _Item( - icon: Icons.help_outline_rounded, - label: l10n.menuSupport, - route: Routes.support, - ), - // مداخل محليّة بلا نقطة خادم — تُنفَّذ في الجهاز مباشرة. - // - // الروابط من `StoreLinks` لا من ثابتٍ واحد: هذا البناء - // يشارك **رابط نفسه** (سائق يشارك رابط السائق)، ويفتح - // متجر منصّته هو. - _Action( - icon: Icons.share_outlined, - label: l10n.menuShare, - onTap: () => SharePlus.instance.share( - ShareParams( - text: l10n.shareMessagePlain(StoreLinks.thisApp), - ), - ), - ), - _Action( - icon: Icons.star_outline_rounded, - label: l10n.menuRateApp, - onTap: () => _open(StoreLinks.thisApp), - ), - _Action( - icon: Icons.shield_outlined, - label: l10n.menuPrivacy, - onTap: () => _open(BuildConfig.privacyUrl), - ), - _Action( - icon: isDriver - ? Icons.person_outline_rounded - : Icons.local_taxi_outlined, - label: isDriver ? l10n.menuRiderApp : l10n.menuDriverApp, - onTap: () => _open(StoreLinks.otherApp), - ), - ], - ), - ), - const Divider(height: 1), - ListTile( - leading: Icon( - Icons.logout_rounded, - color: context.tripzColors.danger, - ), - title: Text( - l10n.menuLogout, - style: TextStyle(color: context.tripzColors.danger), - ), - onTap: () => _confirmLogout(context), - ), - ], - ), - ), - ); - } - - static Future _open(String url) async { - final uri = Uri.tryParse(url); - if (uri == null) return; - // فشل الفتح لا يُسقط شيئاً — رابط خارجي ليس جزءاً من التطبيق. - await launchUrl(uri, mode: LaunchMode.externalApplication); - } - - Future _confirmLogout(BuildContext context) async { - final l10n = context.l10n; - final session = context.read(); - final ok = await showDialog( - context: context, - builder: (context) => AlertDialog( - content: Text(l10n.menuLogoutConfirm), - actions: [ - TextButton( - onPressed: () => Navigator.of(context).pop(false), - child: Text(l10n.actionCancel), - ), - TextButton( - onPressed: () => Navigator.of(context).pop(true), - child: Text(l10n.menuLogout), - ), - ], - ), - ); - // الخروج يمرّ بالجلسة وحدها؛ الراوتر يعيد التوجيه من تلقائه. - if (ok == true) await session.logout(); - } -} - -class _Header extends StatelessWidget { - const _Header(); - - @override - Widget build(BuildContext context) { - return BlocBuilder( - builder: (context, session) { - final user = session.user; - return Padding( - padding: Space.page, - child: Row( - children: [ - CircleAvatar( - radius: 26, - backgroundColor: context.colors.primaryContainer, - child: Icon( - Icons.person_rounded, - color: context.colors.onPrimaryContainer, - ), - ), - const SizedBox(width: Space.sm), - Expanded( - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Text( - user?.name ?? BuildConfig.appName, - style: context.texts.titleMedium, - overflow: TextOverflow.ellipsis, - ), - Text( - user?.phone ?? '', - textDirection: TextDirection.ltr, - style: context.texts.bodySmall?.copyWith( - color: context.colors.onSurfaceVariant, - ), - ), - ], - ), - ), - ], - ), - ); - }, - ); - } -} - -/// مدخل ينفّذ فعلاً محلياً (مشاركة · رابط خارجي) لا تنقّلاً. -class _Action extends StatelessWidget { - const _Action({ - required this.icon, - required this.label, - required this.onTap, - }); - - final IconData icon; - final String label; - final VoidCallback onTap; - - @override - Widget build(BuildContext context) { - return ListTile( - leading: Icon(icon), - title: Text(label), - onTap: () { - Navigator.of(context).pop(); - onTap(); - }, - ); - } -} - -class _Item extends StatelessWidget { - const _Item({ - required this.icon, - required this.label, - required this.route, - this.badge = 0, - }); - - final IconData icon; - final String label; - final String route; - - /// عدّاد غير المقروء — يُخفى عند الصفر. - final int badge; - - @override - Widget build(BuildContext context) { - return ListTile( - leading: Icon(icon), - title: Text(label), - trailing: badge == 0 - ? null - : Container( - padding: const EdgeInsets.symmetric( - horizontal: Space.xs, - vertical: Space.xxs / 2, - ), - decoration: BoxDecoration( - color: context.tripzColors.danger, - borderRadius: Radii.field_, - ), - child: Text( - '$badge', - style: context.texts.labelSmall?.copyWith( - color: context.colors.onPrimary, - ), - ), - ), - onTap: () { - Navigator.of(context).pop(); - context.push(route); - }, - ); - } -} diff --git a/apps/rider_new/lib/core/ui/channel_picker.dart b/apps/rider_new/lib/core/ui/channel_picker.dart deleted file mode 100644 index a17a570..0000000 --- a/apps/rider_new/lib/core/ui/channel_picker.dart +++ /dev/null @@ -1,48 +0,0 @@ -import 'package:flutter/material.dart'; - -import '../design/tokens.dart'; -import '../design/tripz_colors.dart'; -import '../payments/payment_channels.dart'; - -/// اختيار قناة الدفع/السحب. القائمة تأتي من حزمة دولة المستأجر، فلا يرى -/// الأردنيُّ «شام كاش» ولا السوريُّ «كليك». -class ChannelPicker extends StatelessWidget { - const ChannelPicker({ - super.key, - required this.channels, - required this.selected, - required this.onSelect, - }); - - final List channels; - final PaymentChannel? selected; - final ValueChanged onSelect; - - @override - Widget build(BuildContext context) { - if (channels.isEmpty) return const SizedBox.shrink(); - final lang = Localizations.localeOf(context).languageCode; - - return Wrap( - spacing: Space.xs, - runSpacing: Space.xs, - children: [ - for (final channel in channels) - ChoiceChip( - selected: channel == selected, - onSelected: (_) => onSelect(channel), - avatar: Icon(_iconOf(channel), size: Sizes.iconSm), - label: Text(channel.nameFor(lang)), - labelStyle: context.texts.labelLarge, - ), - ], - ); - } - - static IconData _iconOf(PaymentChannel channel) => switch (channel) { - PaymentChannel.cash => Icons.payments_outlined, - PaymentChannel.cliq => Icons.account_balance_outlined, - PaymentChannel.paymob => Icons.credit_card_outlined, - _ => Icons.smartphone_outlined, - }; -} diff --git a/apps/rider_new/lib/core/ui/empty_view.dart b/apps/rider_new/lib/core/ui/empty_view.dart deleted file mode 100644 index bae9cdb..0000000 --- a/apps/rider_new/lib/core/ui/empty_view.dart +++ /dev/null @@ -1,54 +0,0 @@ -import 'package:flutter/material.dart'; - -import '../design/tokens.dart'; -import '../design/tripz_colors.dart'; -import '../l10n/l10n.dart'; -import 'tripz_button.dart'; - -/// حالة الفراغ: رسالة **تدلّ على الفعل التالي** لا مجرّد «لا يوجد» -/// (docs/26 §8.4). -class EmptyView extends StatelessWidget { - const EmptyView({ - super.key, - this.icon = Icons.inbox_rounded, - this.message, - this.actionLabel, - this.onAction, - }); - - final IconData icon; - final String? message; - final String? actionLabel; - final VoidCallback? onAction; - - @override - Widget build(BuildContext context) { - return Center( - child: Padding( - padding: Space.page, - child: Column( - mainAxisSize: MainAxisSize.min, - children: [ - Icon( - icon, - size: Sizes.iconLg, - color: context.colors.onSurfaceVariant, - ), - const SizedBox(height: Space.md), - Text( - message ?? context.l10n.emptyDefault, - textAlign: TextAlign.center, - style: context.texts.bodyMedium?.copyWith( - color: context.colors.onSurfaceVariant, - ), - ), - if (onAction != null && actionLabel != null) ...[ - const SizedBox(height: Space.lg), - TripzButton.secondary(label: actionLabel!, onPressed: onAction), - ], - ], - ), - ), - ); - } -} diff --git a/apps/rider_new/lib/core/ui/error_view.dart b/apps/rider_new/lib/core/ui/error_view.dart deleted file mode 100644 index 0e0eb7c..0000000 --- a/apps/rider_new/lib/core/ui/error_view.dart +++ /dev/null @@ -1,47 +0,0 @@ -import 'package:flutter/material.dart'; - -import '../design/tokens.dart'; -import '../design/tripz_colors.dart'; -import '../l10n/l10n.dart'; -import 'tripz_button.dart'; - -/// حالة الخطأ: رسالة **بالعربية** مع «أعد المحاولة» — لا شاشة صامتة -/// (docs/26 §8.4). الرسالة تأتي جاهزة من الـCubit (docs/23 §3). -class ErrorView extends StatelessWidget { - const ErrorView({super.key, this.message, this.onRetry}); - - final String? message; - final VoidCallback? onRetry; - - @override - Widget build(BuildContext context) { - return Center( - child: Padding( - padding: Space.page, - child: Column( - mainAxisSize: MainAxisSize.min, - children: [ - Icon( - Icons.error_outline_rounded, - size: Sizes.iconLg, - color: context.tripzColors.danger, - ), - const SizedBox(height: Space.md), - Text( - message ?? context.l10n.errorGeneric, - textAlign: TextAlign.center, - style: context.texts.bodyMedium, - ), - if (onRetry != null) ...[ - const SizedBox(height: Space.lg), - TripzButton.secondary( - label: context.l10n.actionRetry, - onPressed: onRetry, - ), - ], - ], - ), - ), - ); - } -} diff --git a/apps/rider_new/lib/core/ui/failure_text.dart b/apps/rider_new/lib/core/ui/failure_text.dart deleted file mode 100644 index 50e14d1..0000000 --- a/apps/rider_new/lib/core/ui/failure_text.dart +++ /dev/null @@ -1,61 +0,0 @@ -import 'package:flutter/material.dart'; - -import '../../features/auth/cubit/phone_error.dart'; -import '../api/api_failure.dart'; -import '../design/tokens.dart'; -import '../design/tripz_colors.dart'; -import '../l10n/l10n.dart'; - -/// النقطة **الوحيدة** التي تُترجَم فيها رموز الفشل إلى نصّ. -/// الشاشات لا تكتب رسائل خطأ، والـCubit لا يعرف اللغة (راجع `auth_failure.dart`). -class ApiFailureText extends StatelessWidget { - const ApiFailureText({super.key, required this.failure}); - - final ApiFailure failure; - - static String messageOf(BuildContext context, ApiFailure failure) { - final l10n = context.l10n; - return switch (failure) { - ApiFailure.invalidCode => l10n.otpErrInvalid, - ApiFailure.tooManyAttempts => l10n.otpErrTooManyAttempts, - ApiFailure.rateLimited => l10n.otpErrRateLimited, - ApiFailure.network => l10n.errorNetwork, - ApiFailure.timeout => l10n.errorTimeout, - ApiFailure.server => l10n.errorGeneric, - }; - } - - static String phoneMessageOf(BuildContext context, PhoneError error) { - final l10n = context.l10n; - return switch (error) { - PhoneError.empty => l10n.phoneErrEmpty, - PhoneError.leadingZero => l10n.phoneErrLeadingZero, - PhoneError.tooShort => l10n.phoneErrShort, - }; - } - - @override - Widget build(BuildContext context) { - return Padding( - padding: const EdgeInsets.only(top: Space.sm), - child: Row( - children: [ - Icon( - Icons.error_outline_rounded, - size: Sizes.iconSm, - color: context.tripzColors.danger, - ), - const SizedBox(width: Space.xs), - Expanded( - child: Text( - messageOf(context, failure), - style: context.texts.bodySmall?.copyWith( - color: context.tripzColors.danger, - ), - ), - ), - ], - ), - ); - } -} diff --git a/apps/rider_new/lib/core/ui/form_header.dart b/apps/rider_new/lib/core/ui/form_header.dart deleted file mode 100644 index 5f4ae60..0000000 --- a/apps/rider_new/lib/core/ui/form_header.dart +++ /dev/null @@ -1,49 +0,0 @@ -import 'package:flutter/material.dart'; - -import '../design/tokens.dart'; -import '../design/tripz_colors.dart'; - -/// ترويسة موحّدة لشاشات الدخول: أيقونة ثم عنوان ثم سطر شارح. -/// «الشاشة مهمة واحدة» — سؤال واحد وزر أساسي واحد أسفلها (docs/26 §8.1). -class FormHeader extends StatelessWidget { - const FormHeader({ - super.key, - required this.icon, - required this.title, - required this.lead, - }); - - final IconData icon; - final String title; - final String lead; - - @override - Widget build(BuildContext context) { - return Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Container( - padding: const EdgeInsets.all(Space.sm), - decoration: BoxDecoration( - color: context.colors.primaryContainer, - borderRadius: Radii.card_, - ), - child: Icon( - icon, - size: Sizes.icon, - color: context.colors.onPrimaryContainer, - ), - ), - const SizedBox(height: Space.md), - Text(title, style: context.texts.headlineSmall), - const SizedBox(height: Space.xs), - Text( - lead, - style: context.texts.bodyMedium?.copyWith( - color: context.colors.onSurfaceVariant, - ), - ), - ], - ); - } -} diff --git a/apps/rider_new/lib/core/ui/phone_field.dart b/apps/rider_new/lib/core/ui/phone_field.dart deleted file mode 100644 index 95e0024..0000000 --- a/apps/rider_new/lib/core/ui/phone_field.dart +++ /dev/null @@ -1,141 +0,0 @@ -import 'package:flutter/material.dart'; -import 'package:flutter/services.dart'; - -import '../design/tokens.dart'; -import '../design/tripz_colors.dart'; -import '../design/typography.dart'; -import '../payments/country_codes.dart'; - -/// حقل الهاتف بمفتاح دولة — النمط المجرَّب في سيرو. -/// -/// المفتاح يُختار من ورقة سفلية لا من قائمة منسدلة: الأصابع على الهاتف -/// أدقّ مع أهداف كبيرة، والقائمة أربع دول لا مئتان. -/// -/// يُخرج الرقم **كاملاً بالمفتاح بلا `+`** (`962790000001`) — وهو ما يقبله -/// الخادم ويطبّعه (docs/38 §2). -class PhoneField extends StatelessWidget { - const PhoneField({ - super.key, - required this.controller, - required this.country, - required this.onCountryChanged, - this.label, - this.hint, - this.errorText, - this.enabled = true, - this.onSubmitted, - }); - - final TextEditingController controller; - final CountryCode country; - final ValueChanged onCountryChanged; - final String? label; - final String? hint; - final String? errorText; - final bool enabled; - final ValueChanged? onSubmitted; - - @override - Widget build(BuildContext context) { - return TextField( - controller: controller, - enabled: enabled, - autofocus: true, - keyboardType: TextInputType.phone, - textInputAction: TextInputAction.done, - onSubmitted: onSubmitted, - maxLength: country.nationalLength + 1, - inputFormatters: [FilteringTextInputFormatter.digitsOnly], - autofillHints: const [AutofillHints.telephoneNumber], - style: numericStyle(context.texts.bodyLarge), - // الرقم يُقرأ يساراً-ليميناً حتى في واجهة عربية. - textDirection: TextDirection.ltr, - decoration: InputDecoration( - labelText: label, - hintText: hint, - errorText: errorText, - counterText: '', - prefixIcon: _DialPrefix( - country: country, - enabled: enabled, - onTap: () => _pickCountry(context), - ), - prefixIconConstraints: const BoxConstraints(minWidth: 0), - ), - ); - } - - Future _pickCountry(BuildContext context) async { - final lang = Localizations.localeOf(context).languageCode; - final picked = await showModalBottomSheet( - context: context, - builder: (context) => SafeArea( - child: Column( - mainAxisSize: MainAxisSize.min, - children: [ - for (final c in CountryCode.values) - ListTile( - leading: Text(c.flag, style: const TextStyle(fontSize: 24)), - title: Text(c.nameFor(lang)), - trailing: Text( - '+${c.dial}', - textDirection: TextDirection.ltr, - style: numericStyle(context.texts.bodyMedium), - ), - selected: c == country, - onTap: () => Navigator.of(context).pop(c), - ), - ], - ), - ), - ); - if (picked != null) onCountryChanged(picked); - } -} - -class _DialPrefix extends StatelessWidget { - const _DialPrefix({ - required this.country, - required this.enabled, - required this.onTap, - }); - - final CountryCode country; - final bool enabled; - final VoidCallback onTap; - - @override - Widget build(BuildContext context) { - return InkWell( - onTap: enabled ? onTap : null, - borderRadius: Radii.field_, - child: Padding( - padding: const EdgeInsets.symmetric(horizontal: Space.sm), - child: Row( - mainAxisSize: MainAxisSize.min, - textDirection: TextDirection.ltr, - children: [ - Text(country.flag, style: const TextStyle(fontSize: 20)), - const SizedBox(width: Space.xxs), - Text( - '+${country.dial}', - style: numericStyle(context.texts.bodyLarge), - ), - Icon( - Icons.arrow_drop_down_rounded, - color: context.colors.onSurfaceVariant, - ), - const SizedBox(width: Space.xxs), - SizedBox( - height: 24, - child: VerticalDivider( - width: 1, - color: context.colors.outlineVariant, - ), - ), - ], - ), - ), - ); - } -} diff --git a/apps/rider_new/lib/core/ui/skeleton.dart b/apps/rider_new/lib/core/ui/skeleton.dart deleted file mode 100644 index 9c5fddb..0000000 --- a/apps/rider_new/lib/core/ui/skeleton.dart +++ /dev/null @@ -1,83 +0,0 @@ -import 'package:flutter/material.dart'; - -import '../design/tokens.dart'; -import '../design/tripz_colors.dart'; - -/// هيكل تحميل — **لا spinner فارغ** (docs/26 §8.4). -/// -/// النبض `AnimatedBuilder` على `Opacity` وحدها: لا يُعاد بناء الشجرة تحته، -/// وهذا ما يفرق بين skeleton رخيص وآخر يأكل إطارات. -class Skeleton extends StatefulWidget { - const Skeleton({ - super.key, - this.width, - this.height = 16, - this.radius = Radii.field, - }); - - /// ثلاثة أسطر بأطوال متفاوتة — الشكل الافتراضي لأي قائمة تُحمَّل. - const Skeleton.lines({super.key}) - : width = null, - height = -1, - radius = Radii.field; - - final double? width; - final double height; - final double radius; - - @override - State createState() => _SkeletonState(); -} - -class _SkeletonState extends State - with SingleTickerProviderStateMixin { - late final AnimationController _controller = AnimationController( - vsync: this, - duration: const Duration(milliseconds: 900), - )..repeat(reverse: true); - - @override - void dispose() { - _controller.dispose(); - super.dispose(); - } - - @override - Widget build(BuildContext context) { - final color = context.tripzColors.skeleton; - - final child = widget.height < 0 - ? Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - _bar(color, double.infinity), - const SizedBox(height: Space.sm), - _bar(color, 220), - const SizedBox(height: Space.sm), - _bar(color, 140), - ], - ) - : _bar(color, widget.width ?? double.infinity, widget.height); - - // تُحترم إعدادات تقليل الحركة في النظام (docs/26 §8.5). - if (MediaQuery.disableAnimationsOf(context)) return child; - - return AnimatedBuilder( - animation: _controller, - builder: (_, inner) => Opacity( - opacity: 0.45 + (_controller.value * 0.35), - child: inner, - ), - child: child, - ); - } - - Widget _bar(Color color, double width, [double height = 16]) => Container( - width: width, - height: height, - decoration: BoxDecoration( - color: color, - borderRadius: BorderRadius.circular(widget.radius), - ), - ); -} diff --git a/apps/rider_new/lib/core/ui/status_banner.dart b/apps/rider_new/lib/core/ui/status_banner.dart deleted file mode 100644 index b2e3c9d..0000000 --- a/apps/rider_new/lib/core/ui/status_banner.dart +++ /dev/null @@ -1,56 +0,0 @@ -import 'package:flutter/material.dart'; - -import '../design/tokens.dart'; -import '../design/tripz_colors.dart'; - -enum BannerTone { info, success, warning, danger } - -/// شريط الحالة الحيّ (docs/26 §7) — حالة الرحلة، تحذير الرصيد، انقطاع الشبكة. -/// اللون من الأدوار الدلالية لا من hex. -class StatusBanner extends StatelessWidget { - const StatusBanner({ - super.key, - required this.message, - this.tone = BannerTone.info, - this.icon, - this.trailing, - }); - - final String message; - final BannerTone tone; - final IconData? icon; - final Widget? trailing; - - @override - Widget build(BuildContext context) { - final c = context.tripzColors; - final color = switch (tone) { - BannerTone.info => c.info, - BannerTone.success => c.success, - BannerTone.warning => c.warning, - BannerTone.danger => c.danger, - }; - - return Container( - padding: const EdgeInsets.symmetric( - horizontal: Space.sm, - vertical: Space.xs, - ), - decoration: BoxDecoration( - color: color.withValues(alpha: 0.12), - borderRadius: Radii.field_, - border: Border.all(color: color.withValues(alpha: 0.35)), - ), - child: Row( - children: [ - Icon(icon ?? Icons.info_outline_rounded, size: Sizes.iconSm, color: color), - const SizedBox(width: Space.xs), - Expanded( - child: Text(message, style: context.texts.bodySmall), - ), - ?trailing, - ], - ), - ); - } -} diff --git a/apps/rider_new/lib/core/ui/tripz_button.dart b/apps/rider_new/lib/core/ui/tripz_button.dart deleted file mode 100644 index 76e4bf2..0000000 --- a/apps/rider_new/lib/core/ui/tripz_button.dart +++ /dev/null @@ -1,114 +0,0 @@ -import 'package:flutter/material.dart'; - -import '../design/tokens.dart'; - -enum _ButtonKind { primary, secondary, text } - -/// الزر الموحّد (docs/26 §7). ارتفاع 52، وحالة تحميل **داخلية**: الشاشة -/// تمرّر `loading: true` ولا تستبدل الزر بمؤشّر — فلا يقفز التخطيط. -class TripzButton extends StatelessWidget { - const TripzButton.primary({ - super.key, - required this.label, - this.onPressed, - this.loading = false, - this.icon, - this.expanded = true, - }) : _kind = _ButtonKind.primary; - - const TripzButton.secondary({ - super.key, - required this.label, - this.onPressed, - this.loading = false, - this.icon, - this.expanded = false, - }) : _kind = _ButtonKind.secondary; - - const TripzButton.text({ - super.key, - required this.label, - this.onPressed, - this.loading = false, - this.icon, - this.expanded = false, - }) : _kind = _ButtonKind.text; - - final String label; - final VoidCallback? onPressed; - final bool loading; - final IconData? icon; - final bool expanded; - final _ButtonKind _kind; - - @override - Widget build(BuildContext context) { - // أثناء التحميل يُعطَّل الزر — يمنع الإرسال المزدوج بلا حارس في كل شاشة. - final onTap = loading ? null : onPressed; - final child = _Content(label: label, icon: icon, loading: loading); - - final button = switch (_kind) { - _ButtonKind.primary => FilledButton( - onPressed: onTap, - style: _style(context), - child: child, - ), - _ButtonKind.secondary => OutlinedButton( - onPressed: onTap, - style: _style(context), - child: child, - ), - _ButtonKind.text => TextButton( - onPressed: onTap, - style: _style(context), - child: child, - ), - }; - - if (!expanded) return button; - return SizedBox(width: double.infinity, child: button); - } - - ButtonStyle _style(BuildContext context) => ButtonStyle( - minimumSize: const WidgetStatePropertyAll( - Size(0, Sizes.control), - ), - shape: const WidgetStatePropertyAll( - RoundedRectangleBorder(borderRadius: Radii.card_), - ), - padding: const WidgetStatePropertyAll( - EdgeInsets.symmetric(horizontal: Space.lg), - ), - textStyle: WidgetStatePropertyAll( - Theme.of(context).textTheme.labelLarge, - ), - ); -} - -class _Content extends StatelessWidget { - const _Content({required this.label, this.icon, required this.loading}); - - final String label; - final IconData? icon; - final bool loading; - - @override - Widget build(BuildContext context) { - if (loading) { - return const SizedBox( - width: Sizes.iconSm, - height: Sizes.iconSm, - child: CircularProgressIndicator(strokeWidth: 2.2), - ); - } - if (icon == null) return Text(label); - return Row( - mainAxisSize: MainAxisSize.min, - children: [ - Icon(icon, size: Sizes.iconSm), - const SizedBox(width: Space.xs), - Text(label), - ], - ); - } -} diff --git a/apps/rider_new/lib/core/ui/tripz_card.dart b/apps/rider_new/lib/core/ui/tripz_card.dart deleted file mode 100644 index 9bf35ca..0000000 --- a/apps/rider_new/lib/core/ui/tripz_card.dart +++ /dev/null @@ -1,29 +0,0 @@ -import 'package:flutter/material.dart'; - -import '../design/tokens.dart'; - -/// بطاقة موحّدة (docs/26 §7): الرحلة · السائق · المحفظة. -/// الحدّ لا الظل — «الوضوح قبل الزينة» (docs/26 §8.2). -class TripzCard extends StatelessWidget { - const TripzCard({ - super.key, - required this.child, - this.onTap, - this.padding = Space.page, - }); - - final Widget child; - final VoidCallback? onTap; - final EdgeInsets padding; - - @override - Widget build(BuildContext context) { - final content = Padding(padding: padding, child: child); - return Card( - clipBehavior: Clip.antiAlias, - child: onTap == null - ? content - : InkWell(onTap: onTap, child: content), - ); - } -} diff --git a/apps/rider_new/lib/core/ui/tripz_otp_field.dart b/apps/rider_new/lib/core/ui/tripz_otp_field.dart deleted file mode 100644 index 0779f88..0000000 --- a/apps/rider_new/lib/core/ui/tripz_otp_field.dart +++ /dev/null @@ -1,131 +0,0 @@ -import 'package:flutter/material.dart'; -import 'package:flutter/services.dart'; - -import '../design/tokens.dart'; -import '../design/typography.dart'; - -/// حقل رمز التحقّق — أربع خانات (طول رمز تريبز، docs/38 §2). -/// -/// حقل حقيقي واحد تحت خانات معروضة: يُبقي اللصق والإكمال التلقائي من الرسالة -/// (`AutofillHints.oneTimeCode`) يعملان — وهو ما يكسره تقسيمُه إلى أربعة -/// حقول منفصلة. يُستدعى [onCompleted] عند اكتمال الطول. -class TripzOtpField extends StatefulWidget { - const TripzOtpField({ - super.key, - required this.controller, - this.length = 4, - this.onCompleted, - this.enabled = true, - this.hasError = false, - }); - - final TextEditingController controller; - final int length; - final ValueChanged? onCompleted; - final bool enabled; - final bool hasError; - - @override - State createState() => _TripzOtpFieldState(); -} - -class _TripzOtpFieldState extends State { - final _focus = FocusNode(); - - @override - void dispose() { - _focus.dispose(); - super.dispose(); - } - - @override - Widget build(BuildContext context) { - return Stack( - alignment: Alignment.center, - children: [ - // الحقل الفعلي — شفّاف بلا حجم بصري، يستقبل الكيبورد واللصق. - SizedBox( - height: Sizes.control, - child: Opacity( - opacity: 0, - child: TextField( - controller: widget.controller, - focusNode: _focus, - enabled: widget.enabled, - autofocus: true, - keyboardType: TextInputType.number, - maxLength: widget.length, - inputFormatters: [FilteringTextInputFormatter.digitsOnly], - autofillHints: const [AutofillHints.oneTimeCode], - onChanged: (v) { - if (v.length == widget.length) widget.onCompleted?.call(v); - }, - ), - ), - ), - GestureDetector( - onTap: () => _focus.requestFocus(), - behavior: HitTestBehavior.opaque, - child: ValueListenableBuilder( - valueListenable: widget.controller, - builder: (context, value, _) => Row( - mainAxisAlignment: MainAxisAlignment.center, - textDirection: TextDirection.ltr, - children: List.generate(widget.length, (i) { - return Padding( - padding: const EdgeInsets.symmetric(horizontal: Space.xxs), - child: _Box( - char: i < value.text.length ? value.text[i] : null, - focused: _focus.hasFocus && i == value.text.length, - hasError: widget.hasError, - ), - ); - }), - ), - ), - ), - ], - ); - } -} - -class _Box extends StatelessWidget { - const _Box({ - required this.char, - required this.focused, - required this.hasError, - }); - - final String? char; - final bool focused; - final bool hasError; - - @override - Widget build(BuildContext context) { - final scheme = Theme.of(context).colorScheme; - final borderColor = hasError - ? scheme.error - : focused - ? scheme.primary - : scheme.outlineVariant; - - return AnimatedContainer( - duration: Motion.tap, - curve: Motion.curve, - width: 56, - height: Sizes.control, - alignment: Alignment.center, - decoration: BoxDecoration( - borderRadius: Radii.field_, - border: Border.all( - color: borderColor, - width: focused || hasError ? 1.5 : 1, - ), - ), - child: Text( - char ?? '', - style: numericStyle(Theme.of(context).textTheme.headlineSmall), - ), - ); - } -} diff --git a/apps/rider_new/lib/core/ui/tripz_scaffold.dart b/apps/rider_new/lib/core/ui/tripz_scaffold.dart deleted file mode 100644 index 8e5fdcf..0000000 --- a/apps/rider_new/lib/core/ui/tripz_scaffold.dart +++ /dev/null @@ -1,130 +0,0 @@ -import 'package:flutter/material.dart'; - -import '../design/tokens.dart'; -import 'empty_view.dart'; -import 'error_view.dart'; -import 'skeleton.dart'; -import 'view_status.dart'; - -/// نقطة التنظيم المركزية (docs/26 §6). **ممنوع `Scaffold` خام في -/// `features/`.** -/// -/// هو ما يحوّل `status` القادم من الـCubit إلى skeleton/خطأ/فراغ/محتوى — فلا -/// تكتب أي شاشة `if (loading)`، وتغيير شكل «التحميل» في التطبيق كله يصير -/// سطراً واحداً هنا. -class TripzScaffold extends StatelessWidget { - const TripzScaffold({ - super.key, - required this.child, - this.title, - this.status = ViewStatus.success, - this.error, - this.onRetry, - this.empty, - this.loading, - this.bottomAction, - this.actions, - this.leading, - this.showAppBar = true, - this.padded = true, - this.resizeToAvoidBottomInset = true, - }); - - /// المحتوى — يُبنى **عند النجاح فقط**. - final Widget child; - - final String? title; - final ViewStatus status; - - /// رسالة الخطأ كما أصدرها الـCubit، بلا إعادة صياغة في الواجهة. - final String? error; - final VoidCallback? onRetry; - - /// شكل الفراغ الخاص بالشاشة — وإلا فالافتراضي. - final Widget? empty; - - /// شكل التحميل الخاص بالشاشة — وإلا فهيكل ثلاثة أسطر. - final Widget? loading; - - /// خانة الـCTA السفلية: ترتفع فوق الكيبورد، وتحترم المنطقة الآمنة. - final Widget? bottomAction; - - final List? actions; - final Widget? leading; - final bool showAppBar; - final bool padded; - final bool resizeToAvoidBottomInset; - - @override - Widget build(BuildContext context) { - return Scaffold( - resizeToAvoidBottomInset: resizeToAvoidBottomInset, - appBar: !showAppBar - ? null - : AppBar( - title: title == null ? null : Text(title!), - actions: actions, - leading: leading, - ), - body: SafeArea( - top: !showAppBar, - child: Padding( - padding: padded ? Space.page : EdgeInsets.zero, - child: _Body( - status: status, - error: error, - onRetry: onRetry, - empty: empty, - loading: loading, - child: child, - ), - ), - ), - bottomNavigationBar: bottomAction == null - ? null - : SafeArea( - top: false, - child: Padding( - // ‏viewInsets يرفع الـCTA فوق الكيبورد بدل أن يختفي تحته. - padding: EdgeInsets.fromLTRB( - Space.md, - Space.xs, - Space.md, - Space.md + MediaQuery.viewInsetsOf(context).bottom, - ), - child: bottomAction, - ), - ), - ); - } -} - -class _Body extends StatelessWidget { - const _Body({ - required this.status, - required this.error, - required this.onRetry, - required this.empty, - required this.loading, - required this.child, - }); - - final ViewStatus status; - final String? error; - final VoidCallback? onRetry; - final Widget? empty; - final Widget? loading; - final Widget child; - - @override - Widget build(BuildContext context) { - return switch (status) { - ViewStatus.idle || - ViewStatus.loading => - loading ?? const Skeleton.lines(), - ViewStatus.error => ErrorView(message: error, onRetry: onRetry), - ViewStatus.empty => empty ?? const EmptyView(), - ViewStatus.success => child, - }; - } -} diff --git a/apps/rider_new/lib/core/ui/tripz_sheet.dart b/apps/rider_new/lib/core/ui/tripz_sheet.dart deleted file mode 100644 index 331e8bb..0000000 --- a/apps/rider_new/lib/core/ui/tripz_sheet.dart +++ /dev/null @@ -1,71 +0,0 @@ -import 'package:flutter/material.dart'; - -import '../design/tokens.dart'; - -/// الورقة السفلية — **الحوار الافتراضي في التطبيق sheet لا dialog** -/// (docs/26 §7). المقبض والزوايا من الثيم، فلا تُعاد كتابتهما في كل نداء. -class TripzSheet extends StatelessWidget { - const TripzSheet({ - super.key, - required this.child, - this.title, - this.bottomAction, - }); - - final Widget child; - final String? title; - final Widget? bottomAction; - - /// [dismissible] = false للحالات التي لا تُغلق بالسحب — مثل شاشة البحث عن - /// سائق: تُغلق بزر الإلغاء وحده كي لا يزيحها المستخدم بالخطأ (docs/39 §3). - static Future show( - BuildContext context, { - required Widget child, - String? title, - Widget? bottomAction, - bool dismissible = true, - }) { - return showModalBottomSheet( - context: context, - isScrollControlled: true, - isDismissible: dismissible, - enableDrag: dismissible, - showDragHandle: dismissible, - builder: (_) => TripzSheet( - title: title, - bottomAction: bottomAction, - child: child, - ), - ); - } - - @override - Widget build(BuildContext context) { - return SafeArea( - top: false, - child: Padding( - padding: EdgeInsets.fromLTRB( - Space.md, - Space.xs, - Space.md, - Space.md + MediaQuery.viewInsetsOf(context).bottom, - ), - child: Column( - mainAxisSize: MainAxisSize.min, - crossAxisAlignment: CrossAxisAlignment.stretch, - children: [ - if (title != null) ...[ - Text(title!, style: Theme.of(context).textTheme.titleLarge), - const SizedBox(height: Space.md), - ], - Flexible(child: child), - if (bottomAction != null) ...[ - const SizedBox(height: Space.md), - bottomAction!, - ], - ], - ), - ), - ); - } -} diff --git a/apps/rider_new/lib/core/ui/tripz_text_field.dart b/apps/rider_new/lib/core/ui/tripz_text_field.dart deleted file mode 100644 index b0e0acb..0000000 --- a/apps/rider_new/lib/core/ui/tripz_text_field.dart +++ /dev/null @@ -1,109 +0,0 @@ -import 'package:flutter/material.dart'; -import 'package:flutter/services.dart'; - -import '../design/tokens.dart'; -import '../design/typography.dart'; - -/// حقل الإدخال الموحّد (docs/26 §7): نصّ · هاتف · بحث. -/// -/// رسالة الخطأ تحته بالعربية، والأرقام لاتينية tabular دائماً — رقم الهاتف -/// ورمز التحقّق لا «يرقصان» أثناء الكتابة. -class TripzTextField extends StatelessWidget { - const TripzTextField({ - super.key, - this.controller, - this.label, - this.hint, - this.errorText, - this.keyboardType, - this.textInputAction, - this.onChanged, - this.onSubmitted, - this.autofocus = false, - this.enabled = true, - this.maxLength, - this.prefixIcon, - this.suffix, - this.inputFormatters, - this.autofillHints, - this.numeric = false, - }); - - /// حقل هاتف: أرقام فقط، لوحة مفاتيح هاتف، إكمال تلقائي من النظام. - factory TripzTextField.phone({ - Key? key, - TextEditingController? controller, - String? label, - String? hint, - String? errorText, - ValueChanged? onChanged, - ValueChanged? onSubmitted, - bool enabled = true, - }) { - return TripzTextField( - key: key, - controller: controller, - label: label, - hint: hint, - errorText: errorText, - enabled: enabled, - numeric: true, - autofocus: true, - keyboardType: TextInputType.phone, - textInputAction: TextInputAction.done, - onChanged: onChanged, - onSubmitted: onSubmitted, - maxLength: 15, - prefixIcon: Icons.phone_outlined, - inputFormatters: [FilteringTextInputFormatter.digitsOnly], - autofillHints: const [AutofillHints.telephoneNumber], - ); - } - - final TextEditingController? controller; - final String? label; - final String? hint; - final String? errorText; - final TextInputType? keyboardType; - final TextInputAction? textInputAction; - final ValueChanged? onChanged; - final ValueChanged? onSubmitted; - final bool autofocus; - final bool enabled; - final int? maxLength; - final IconData? prefixIcon; - final Widget? suffix; - final List? inputFormatters; - final Iterable? autofillHints; - final bool numeric; - - @override - Widget build(BuildContext context) { - final base = Theme.of(context).textTheme.bodyLarge; - return TextField( - controller: controller, - enabled: enabled, - autofocus: autofocus, - keyboardType: keyboardType, - textInputAction: textInputAction, - onChanged: onChanged, - onSubmitted: onSubmitted, - maxLength: maxLength, - inputFormatters: inputFormatters, - autofillHints: autofillHints, - style: numeric ? numericStyle(base) : base, - // الأرقام تُقرأ يساراً-ليميناً حتى في واجهة عربية. - textDirection: numeric ? TextDirection.ltr : null, - decoration: InputDecoration( - labelText: label, - hintText: hint, - errorText: errorText, - counterText: '', - prefixIcon: prefixIcon == null - ? null - : Icon(prefixIcon, size: Sizes.iconSm), - suffixIcon: suffix, - ), - ); - } -} diff --git a/apps/rider_new/lib/core/ui/view_status.dart b/apps/rider_new/lib/core/ui/view_status.dart deleted file mode 100644 index d94443c..0000000 --- a/apps/rider_new/lib/core/ui/view_status.dart +++ /dev/null @@ -1,22 +0,0 @@ -/// حالة العرض الموحّدة التي يُصدرها كل Cubit (docs/23 §3) ويستهلكها -/// `TripzScaffold` (docs/26 §6). -/// -/// هذا ما يجعل نظام التصميم متوافقاً مع Cubit **بالبنية لا بالاتفاق**: -/// الشاشة لا تكتب `if (loading)` أبداً. -enum ViewStatus { - /// لم يبدأ شيء بعد — يُعرض كتحميل لأن المستخدم لا يفرّق. - idle, - loading, - success, - - /// نجح النداء ولا بيانات — يُعرض `EmptyView`. - empty, - error, -} - -extension ViewStatusX on ViewStatus { - bool get isLoading => this == ViewStatus.idle || this == ViewStatus.loading; - bool get isError => this == ViewStatus.error; - bool get isEmpty => this == ViewStatus.empty; - bool get isSuccess => this == ViewStatus.success; -} diff --git a/apps/rider_new/lib/features/auth/cubit/login_cubit.dart b/apps/rider_new/lib/features/auth/cubit/login_cubit.dart deleted file mode 100644 index 7ba625d..0000000 --- a/apps/rider_new/lib/features/auth/cubit/login_cubit.dart +++ /dev/null @@ -1,212 +0,0 @@ -import 'dart:async'; - -import 'package:flutter_bloc/flutter_bloc.dart'; -import 'package:geolocator/geolocator.dart'; -import 'package:permission_handler/permission_handler.dart'; -import 'package:shared_preferences/shared_preferences.dart'; - -import '../../../core/api/api_exception.dart'; -import '../../../core/api/api_failure.dart'; -import '../../../core/config.dart'; -import '../../../core/payments/country_codes.dart'; -import '../data/auth_repository.dart'; -import 'login_state.dart'; -import 'phone_error.dart'; - -/// تدفّق الدخول كاملاً: الشروط ← إذن الموقع ← الهاتف ← الرمز. -/// -/// الـCubit لا يعرف Flutter: لا `BuildContext` ولا تنقّل ولا `SnackBar` -/// (docs/23 §3). يُصدر حالة، والواجهة تتصرّف. -class LoginCubit extends Cubit { - LoginCubit(this._repo, this._prefs) : super(const LoginState()) { - _resolveInitialStep(); - } - - final AuthRepository _repo; - final SharedPreferences _prefs; - - static const _kAgreed = 'auth.agreed_terms'; - - Timer? _resendTimer; - - @override - Future close() { - _resendTimer?.cancel(); - return super.close(); - } - - // ── البوابتان ────────────────────────────────────────────────────────── - - void _resolveInitialStep() { - if (_prefs.getBool(_kAgreed) != true) { - emit(state.copyWith(step: LoginStep.agreement)); - return; - } - emit(state.copyWith(step: LoginStep.permission, agreed: true)); - unawaited(checkLocationPermission()); - } - - void toggleAgreement(bool value) => emit(state.copyWith(agreed: value)); - - Future acceptAgreement() async { - if (!state.agreed) return; - await _prefs.setBool(_kAgreed, true); - emit(state.copyWith(step: LoginStep.permission)); - await checkLocationPermission(); - } - - /// تُستدعى أيضاً عند **العودة من إعدادات النظام**: بلا إعادة الفحص تبقى - /// الشاشة عالقة بعد أن يمنح المستخدم الإذن يدوياً (حالة حافة من docs/39 §2). - Future checkLocationPermission() async { - final geoStatus = await Geolocator.checkPermission(); - if (geoStatus == LocationPermission.always || - geoStatus == LocationPermission.whileInUse) { - emit(state.copyWith( - step: LoginStep.phone, - permissionPermanentlyDenied: false, - )); - return; - } - - final status = await Permission.locationWhenInUse.status; - if (status.isGranted || status.isLimited) { - emit(state.copyWith( - step: LoginStep.phone, - permissionPermanentlyDenied: false, - )); - return; - } - - emit(state.copyWith( - permissionPermanentlyDenied: - geoStatus == LocationPermission.deniedForever || - status.isPermanentlyDenied, - )); - } - - Future requestLocationPermission() async { - final geoStatus = await Geolocator.requestPermission(); - if (geoStatus == LocationPermission.always || - geoStatus == LocationPermission.whileInUse) { - emit(state.copyWith( - step: LoginStep.phone, - permissionPermanentlyDenied: false, - )); - return; - } - - final status = await Permission.locationWhenInUse.request(); - if (status.isGranted || status.isLimited) { - emit(state.copyWith( - step: LoginStep.phone, - permissionPermanentlyDenied: false, - )); - return; - } - - emit(state.copyWith( - permissionPermanentlyDenied: - geoStatus == LocationPermission.deniedForever || - status.isPermanentlyDenied, - )); - } - - Future openSystemSettings() => openAppSettings(); - - // ── الهاتف ───────────────────────────────────────────────────────────── - - /// يُنادى عند الإقلاع بحزمة دولة المستأجر — فيرى الأردنيُّ الأردن أولاً. - void applyTenantCountry(String countryPack) { - if (state.phone.isNotEmpty) return; // لا نغيّر اختياراً واعياً للمستخدم - emit(state.copyWith(country: CountryCode.fromPack(countryPack))); - } - - void countryChanged(CountryCode country) => - emit(state.copyWith(country: country, clearPhoneError: true)); - - void phoneChanged(String value) { - emit(state.copyWith( - phone: value, - clearPhoneError: true, - clearFailure: true, - )); - } - - Future submitPhone() async { - final error = validatePhone(state.phone, state.country); - if (error != null) { - emit(state.copyWith(phoneError: error)); - return; - } - emit(state.copyWith(status: LoginStatus.submitting, clearFailure: true)); - try { - await _repo.sendOtp(state.e164); - emit(state.copyWith(status: LoginStatus.idle, step: LoginStep.otp)); - _startResendCountdown(); - } on ApiException catch (e) { - emit(state.copyWith( - status: LoginStatus.failure, - failure: e.toApiFailure(), - )); - } - } - - void editPhone() { - _resendTimer?.cancel(); - emit(state.copyWith( - step: LoginStep.phone, - status: LoginStatus.idle, - resendIn: 0, - clearFailure: true, - )); - } - - // ── الرمز ────────────────────────────────────────────────────────────── - - Future resendOtp() async { - if (!state.canResend) return; - emit(state.copyWith(status: LoginStatus.submitting, clearFailure: true)); - try { - await _repo.sendOtp(state.e164); - emit(state.copyWith(status: LoginStatus.idle)); - _startResendCountdown(); - } on ApiException catch (e) { - emit(state.copyWith( - status: LoginStatus.failure, - failure: e.toApiFailure(), - )); - // حتى عند الرفض بحدّ المعدّل نبدأ العدّاد — وإلا ضغط المستخدم مجدداً - // فوراً وعمّق الحظر. - _startResendCountdown(); - } - } - - Future submitOtp(String code) async { - if (code.length != AppConfig.otpLength) return; - emit(state.copyWith(status: LoginStatus.submitting, clearFailure: true)); - try { - final user = await _repo.verifyOtp(phone: state.e164, code: code); - _resendTimer?.cancel(); - emit(state.copyWith( - status: LoginStatus.success, - step: LoginStep.done, - user: user, - )); - } on ApiException catch (e) { - emit(state.copyWith( - status: LoginStatus.failure, - failure: e.toApiFailure(), - )); - } - } - - void _startResendCountdown() { - _resendTimer?.cancel(); - emit(state.copyWith(resendIn: AppConfig.otpResendCooldown.inSeconds)); - _resendTimer = Timer.periodic(const Duration(seconds: 1), (timer) { - final next = state.resendIn - 1; - if (next <= 0) timer.cancel(); - emit(state.copyWith(resendIn: next < 0 ? 0 : next)); - }); - } -} diff --git a/apps/rider_new/lib/features/auth/cubit/login_state.dart b/apps/rider_new/lib/features/auth/cubit/login_state.dart deleted file mode 100644 index b599375..0000000 --- a/apps/rider_new/lib/features/auth/cubit/login_state.dart +++ /dev/null @@ -1,99 +0,0 @@ -import 'package:equatable/equatable.dart'; - -import '../../../core/api/api_failure.dart'; -import '../../../core/payments/country_codes.dart'; -import '../../../core/session/app_user.dart'; -import 'phone_error.dart'; - -/// خطوات الدخول بالترتيب الميداني المثبت في سيرو (docs/39 §2): بوابتان -/// كاملتان **قبل** أي حقل إدخال، ثم الهاتف فالرمز. -enum LoginStep { agreement, permission, phone, otp, done } - -enum LoginStatus { idle, submitting, failure, success } - -class LoginState extends Equatable { - const LoginState({ - this.step = LoginStep.agreement, - this.status = LoginStatus.idle, - this.phone = '', - this.country = CountryCode.jordan, - this.agreed = false, - this.failure, - this.phoneError, - this.resendIn = 0, - this.permissionPermanentlyDenied = false, - this.user, - }); - - final LoginStep step; - final LoginStatus status; - - /// الرقم كما أدخله المستخدم — الخادم يطبّعه، فلا نطبّعه نحن (docs/38 §2). - final String phone; - - /// الدولة المختارة — تحدّد المفتاح الدولي وطول التحقّق. تُبدأ من - /// `countryPack` المستأجر لا من لغة الجهاز. - final CountryCode country; - - /// ما يُرسل للخادم: المفتاح + الرقم بلا `+` (`962790000001`). - String get e164 => '${country.dial}${phone.trim()}'; - - final bool agreed; - final ApiFailure? failure; - final PhoneError? phoneError; - - /// ثوانٍ متبقّية قبل السماح بإعادة الإرسال. الخادم يحدّ بثلاثة طلبات كل - /// خمس دقائق، فالعدّاد ليس تجميلاً (docs/39 §2). - final int resendIn; - - /// رُفض الإذن نهائياً — الحل الوحيد فتح إعدادات النظام. - final bool permissionPermanentlyDenied; - - final AppUser? user; - - bool get isSubmitting => status == LoginStatus.submitting; - bool get canResend => resendIn == 0 && !isSubmitting; - - LoginState copyWith({ - LoginStep? step, - LoginStatus? status, - String? phone, - CountryCode? country, - bool? agreed, - ApiFailure? failure, - PhoneError? phoneError, - int? resendIn, - bool? permissionPermanentlyDenied, - AppUser? user, - bool clearFailure = false, - bool clearPhoneError = false, - }) { - return LoginState( - step: step ?? this.step, - status: status ?? this.status, - phone: phone ?? this.phone, - country: country ?? this.country, - agreed: agreed ?? this.agreed, - failure: clearFailure ? null : (failure ?? this.failure), - phoneError: clearPhoneError ? null : (phoneError ?? this.phoneError), - resendIn: resendIn ?? this.resendIn, - permissionPermanentlyDenied: - permissionPermanentlyDenied ?? this.permissionPermanentlyDenied, - user: user ?? this.user, - ); - } - - @override - List get props => [ - step, - status, - phone, - country, - agreed, - failure, - phoneError, - resendIn, - permissionPermanentlyDenied, - user, - ]; -} diff --git a/apps/rider_new/lib/features/auth/cubit/phone_error.dart b/apps/rider_new/lib/features/auth/cubit/phone_error.dart deleted file mode 100644 index 70e754f..0000000 --- a/apps/rider_new/lib/features/auth/cubit/phone_error.dart +++ /dev/null @@ -1,15 +0,0 @@ -import '../../../core/payments/country_codes.dart'; - -/// أخطاء تحقّق **محليّة** لرقم الهاتف — تُكتشف قبل أي نداء شبكة. -/// الشروط الثلاثة منقولة من التحقّق المطبَّق ميدانياً في سيرو (docs/39 §2). -enum PhoneError { empty, leadingZero, tooShort } - -/// الطول المتوقّع من **الدولة المختارة** لا رقماً ثابتاً: الأردن وسوريا 9 -/// خانات، ومصر والعراق 10. -PhoneError? validatePhone(String raw, CountryCode country) { - final v = raw.trim(); - if (v.isEmpty) return PhoneError.empty; - if (v.startsWith('0')) return PhoneError.leadingZero; - if (v.length < country.nationalLength) return PhoneError.tooShort; - return null; -} diff --git a/apps/rider_new/lib/features/auth/data/auth_repository.dart b/apps/rider_new/lib/features/auth/data/auth_repository.dart deleted file mode 100644 index fc7473d..0000000 --- a/apps/rider_new/lib/features/auth/data/auth_repository.dart +++ /dev/null @@ -1,83 +0,0 @@ -import '../../../core/api/api_client.dart'; -import '../../../core/session/app_user.dart'; -import '../../../core/session/session_source.dart'; -import '../../../core/storage/token_store.dart'; - -/// كل نداءات المصادقة (docs/38 §2). الـCubit لا ينادي Dio مباشرة أبداً -/// (docs/23 §3). -class AuthRepository implements SessionSource { - AuthRepository(this._api, this._tokens); - - final ApiClient _api; - final TokenStore _tokens; - - /// حدّ الخادم: ثلاثة طلبات كل خمس دقائق — الواجهة تمنع الضغط المتكرر - /// بعدّاد تنازلي (docs/39 §2). - Future sendOtp(String phone) async { - await _api.post>( - '/auth/send-otp', - body: {'phone': phone}, - ); - } - - /// عند النجاح تُحفظ الرموز **قبل** أن يعود المستخدم — أي نداء تالٍ يجدها. - Future verifyOtp({ - required String phone, - required String code, - String? referralCode, - }) async { - final res = await _api.post>( - '/auth/verify-otp', - body: { - 'phone': phone, - 'code': code, - if (referralCode != null && referralCode.isNotEmpty) - 'referral_code': referralCode, - }, - ); - - await _tokens.save( - accessToken: res['access_token'] as String, - refreshToken: res['refresh_token'] as String, - // مفتاح توقيع الطلبات المالية (docs/38 §8) — يُخزَّن الآن ويُستهلك لاحقاً. - signingKey: res['signing_key'] as String?, - ); - - return AppUser.fromJson(res['user'] as Map); - } - - @override - Future me() async { - final res = await _api.get>('/users/me'); - return AppUser.fromJson(res); - } - - Future updateProfile({String? name, String? language}) async { - final res = await _api.patch>( - '/users/me', - body: { - 'name': ?name, - 'language': ?language, - }, - ); - return AppUser.fromJson(res); - } - - /// من عقد `SessionSource`: الجلسة تحتاج معرفة التقييم المعلّق، ولا يجوز - /// أن يستورد `core` ميزةَ التقييم — فتمرّ عبر الواجهة نفسها. - @override - Future<({String tripId, String role})?> pendingRating() async { - final res = await _api.get>('/trips/rating/pending'); - final pending = res['pending']; - if (pending is! Map) return null; - final tripId = pending['tripId'] as String?; - if (tripId == null) return null; - return (tripId: tripId, role: pending['role'] as String? ?? 'rider'); - } - - @override - Future logout() => _tokens.clear(); - - @override - bool get hasSession => _tokens.isLoggedIn; -} diff --git a/apps/rider_new/lib/features/auth/view/agreement_view.dart b/apps/rider_new/lib/features/auth/view/agreement_view.dart deleted file mode 100644 index 6750178..0000000 --- a/apps/rider_new/lib/features/auth/view/agreement_view.dart +++ /dev/null @@ -1,56 +0,0 @@ -import 'package:flutter/material.dart'; -import 'package:flutter_bloc/flutter_bloc.dart'; - -import '../../../core/design/tokens.dart'; -import '../../../core/design/tripz_colors.dart'; -import '../../../core/l10n/l10n.dart'; -import '../../../core/ui/form_header.dart'; -import '../../../core/ui/tripz_button.dart'; -import '../../../core/ui/tripz_scaffold.dart'; -import '../cubit/login_cubit.dart'; -import '../cubit/login_state.dart'; - -/// البوابة الأولى: شاشة كاملة لا حوار، وزر متابعة **معطّل حتى يُؤشَّر** -/// (docs/39 §2). تُحفظ الموافقة فلا تتكرر. -class AgreementView extends StatelessWidget { - const AgreementView({super.key}); - - @override - Widget build(BuildContext context) { - final l10n = context.l10n; - return BlocBuilder( - buildWhen: (p, n) => p.agreed != n.agreed, - builder: (context, state) { - final cubit = context.read(); - return TripzScaffold( - showAppBar: false, - bottomAction: TripzButton.primary( - label: l10n.agreementAccept, - onPressed: state.agreed ? cubit.acceptAgreement : null, - ), - child: ListView( - children: [ - const SizedBox(height: Space.xl), - FormHeader( - icon: Icons.policy_outlined, - title: l10n.agreementTitle, - lead: l10n.agreementLead, - ), - const SizedBox(height: Space.lg), - CheckboxListTile( - value: state.agreed, - onChanged: (v) => cubit.toggleAgreement(v ?? false), - contentPadding: EdgeInsets.zero, - controlAffinity: ListTileControlAffinity.leading, - title: Text( - l10n.agreementCheckbox, - style: context.texts.bodyMedium, - ), - ), - ], - ), - ); - }, - ); - } -} diff --git a/apps/rider_new/lib/features/auth/view/login_page.dart b/apps/rider_new/lib/features/auth/view/login_page.dart deleted file mode 100644 index 64c4c38..0000000 --- a/apps/rider_new/lib/features/auth/view/login_page.dart +++ /dev/null @@ -1,70 +0,0 @@ -import 'package:flutter/material.dart'; -import 'package:flutter_bloc/flutter_bloc.dart'; - -import '../../../core/di.dart'; -import '../../../core/session/session_cubit.dart'; -import '../cubit/login_cubit.dart'; -import '../cubit/login_state.dart'; -import 'agreement_view.dart'; -import 'otp_view.dart'; -import 'permission_view.dart'; -import 'phone_view.dart'; - -/// مضيف تدفّق الدخول: خطوة واحدة معروضة في كل لحظة، والانتقال بينها من -/// الـCubit لا من التنقّل — فلا يستطيع المستخدم الرجوع لخطوة تخطّاها. -class LoginPage extends StatefulWidget { - const LoginPage({super.key}); - - @override - State createState() => _LoginPageState(); -} - -class _LoginPageState extends State with WidgetsBindingObserver { - late final LoginCubit _cubit = sl(); - - @override - void initState() { - super.initState(); - WidgetsBinding.instance.addObserver(this); - } - - @override - void dispose() { - WidgetsBinding.instance.removeObserver(this); - _cubit.close(); - super.dispose(); - } - - @override - void didChangeAppLifecycleState(AppLifecycleState lifecycle) { - // العودة من إعدادات النظام بعد منح الإذن يدوياً — بلا هذا الفحص تبقى - // شاشة الإذن عالقة (حالة حافة مثبتة ميدانياً، docs/39 §2). - if (lifecycle == AppLifecycleState.resumed && - _cubit.state.step == LoginStep.permission) { - _cubit.checkLocationPermission(); - } - } - - @override - Widget build(BuildContext context) { - return BlocProvider.value( - value: _cubit, - child: BlocListener( - listenWhen: (prev, next) => next.step == LoginStep.done, - listener: (context, state) { - final user = state.user; - if (user != null) context.read().onLoggedIn(user); - }, - child: BlocBuilder( - buildWhen: (prev, next) => prev.step != next.step, - builder: (context, state) => switch (state.step) { - LoginStep.agreement => const AgreementView(), - LoginStep.permission => const PermissionView(), - LoginStep.phone => const PhoneView(), - LoginStep.otp || LoginStep.done => const OtpView(), - }, - ), - ), - ); - } -} diff --git a/apps/rider_new/lib/features/auth/view/otp_view.dart b/apps/rider_new/lib/features/auth/view/otp_view.dart deleted file mode 100644 index 82a8cb4..0000000 --- a/apps/rider_new/lib/features/auth/view/otp_view.dart +++ /dev/null @@ -1,89 +0,0 @@ -import 'package:flutter/material.dart'; -import 'package:flutter_bloc/flutter_bloc.dart'; - -import '../../../core/design/tokens.dart'; -import '../../../core/design/tripz_colors.dart'; -import '../../../core/l10n/l10n.dart'; -import '../../../core/ui/failure_text.dart'; -import '../../../core/ui/form_header.dart'; -import '../../../core/ui/tripz_button.dart'; -import '../../../core/ui/tripz_otp_field.dart'; -import '../../../core/ui/tripz_scaffold.dart'; -import '../cubit/login_cubit.dart'; -import '../cubit/login_state.dart'; - -class OtpView extends StatefulWidget { - const OtpView({super.key}); - - @override - State createState() => _OtpViewState(); -} - -class _OtpViewState extends State { - final _code = TextEditingController(); - - @override - void dispose() { - _code.dispose(); - super.dispose(); - } - - @override - Widget build(BuildContext context) { - final l10n = context.l10n; - return BlocBuilder( - builder: (context, state) { - final cubit = context.read(); - return TripzScaffold( - showAppBar: false, - bottomAction: TripzButton.primary( - label: l10n.otpVerify, - loading: state.isSubmitting, - onPressed: () => cubit.submitOtp(_code.text), - ), - child: ListView( - children: [ - const SizedBox(height: Space.xl), - FormHeader( - icon: Icons.mark_email_read_outlined, - title: l10n.otpTitle, - lead: l10n.otpLead(state.phone), - ), - const SizedBox(height: Space.lg), - TripzOtpField( - controller: _code, - enabled: !state.isSubmitting, - hasError: state.failure != null, - onCompleted: cubit.submitOtp, - ), - if (state.failure != null) - ApiFailureText(failure: state.failure!), - const SizedBox(height: Space.md), - // العدّاد التنازلي ليس تجميلاً: بلا حارس تُحظر ثلاث ضغطات - // المستخدمَ خمس دقائق (docs/38 §2). - Center( - child: state.canResend - ? TripzButton.text( - label: l10n.otpResend, - onPressed: cubit.resendOtp, - ) - : Text( - l10n.otpResendIn(state.resendIn), - style: context.texts.bodySmall?.copyWith( - color: context.colors.onSurfaceVariant, - ), - ), - ), - Center( - child: TripzButton.text( - label: l10n.otpChangeNumber, - onPressed: cubit.editPhone, - ), - ), - ], - ), - ); - }, - ); - } -} diff --git a/apps/rider_new/lib/features/auth/view/permission_view.dart b/apps/rider_new/lib/features/auth/view/permission_view.dart deleted file mode 100644 index e086f51..0000000 --- a/apps/rider_new/lib/features/auth/view/permission_view.dart +++ /dev/null @@ -1,56 +0,0 @@ -import 'package:flutter/material.dart'; -import 'package:flutter_bloc/flutter_bloc.dart'; - -import '../../../core/design/tokens.dart'; -import '../../../core/l10n/l10n.dart'; -import '../../../core/ui/form_header.dart'; -import '../../../core/ui/status_banner.dart'; -import '../../../core/ui/tripz_button.dart'; -import '../../../core/ui/tripz_scaffold.dart'; -import '../cubit/login_cubit.dart'; -import '../cubit/login_state.dart'; - -/// البوابة الثانية: إذن الموقع. عند الرفض النهائي لا يبقى إلا فتح إعدادات -/// النظام — والعودة منها يلتقطها `LoginPage` بمراقبة دورة الحياة. -class PermissionView extends StatelessWidget { - const PermissionView({super.key}); - - @override - Widget build(BuildContext context) { - final l10n = context.l10n; - return BlocBuilder( - buildWhen: (p, n) => - p.permissionPermanentlyDenied != n.permissionPermanentlyDenied, - builder: (context, state) { - final cubit = context.read(); - final denied = state.permissionPermanentlyDenied; - return TripzScaffold( - showAppBar: false, - bottomAction: TripzButton.primary( - label: denied ? l10n.actionOpenSettings : l10n.permissionAllow, - onPressed: denied - ? cubit.openSystemSettings - : cubit.requestLocationPermission, - ), - child: ListView( - children: [ - const SizedBox(height: Space.xl), - FormHeader( - icon: Icons.my_location_rounded, - title: l10n.permissionTitle, - lead: l10n.permissionLead, - ), - if (denied) ...[ - const SizedBox(height: Space.lg), - StatusBanner( - message: l10n.permissionDeniedForever, - tone: BannerTone.warning, - ), - ], - ], - ), - ); - }, - ); - } -} diff --git a/apps/rider_new/lib/features/auth/view/phone_view.dart b/apps/rider_new/lib/features/auth/view/phone_view.dart deleted file mode 100644 index 91106de..0000000 --- a/apps/rider_new/lib/features/auth/view/phone_view.dart +++ /dev/null @@ -1,93 +0,0 @@ -import 'package:flutter/material.dart'; -import 'package:flutter_bloc/flutter_bloc.dart'; - -import '../../../core/design/tokens.dart'; -import '../../../core/l10n/l10n.dart'; -import '../../../core/tenant/tenant_cubit.dart'; -import '../../../core/ui/failure_text.dart'; -import '../../../core/ui/form_header.dart'; -import '../../../core/ui/phone_field.dart'; -import '../../../core/ui/tripz_button.dart'; -import '../../../core/ui/tripz_scaffold.dart'; -import '../cubit/login_cubit.dart'; -import '../cubit/login_state.dart'; - -class PhoneView extends StatefulWidget { - const PhoneView({super.key}); - - @override - State createState() => _PhoneViewState(); -} - -class _PhoneViewState extends State { - final _phone = TextEditingController(); - - @override - void initState() { - super.initState(); - _phone.addListener( - () => context.read().phoneChanged(_phone.text), - ); - // الدولة الافتراضية من المستأجر — يُطبَّق بعد أول إطار كي يتوفّر السياق. - WidgetsBinding.instance.addPostFrameCallback((_) { - if (!mounted) return; - context - .read() - .applyTenantCountry(context.read().state.countryPack); - }); - } - - @override - void dispose() { - _phone.dispose(); - super.dispose(); - } - - @override - Widget build(BuildContext context) { - final l10n = context.l10n; - return BlocBuilder( - buildWhen: (p, n) => - p.status != n.status || - p.phoneError != n.phoneError || - p.country != n.country || - p.failure != n.failure, - builder: (context, state) { - final cubit = context.read(); - return TripzScaffold( - showAppBar: false, - bottomAction: TripzButton.primary( - label: l10n.phoneSend, - loading: state.isSubmitting, - onPressed: cubit.submitPhone, - ), - child: ListView( - children: [ - const SizedBox(height: Space.xl), - FormHeader( - icon: Icons.phone_outlined, - title: l10n.phoneTitle, - lead: l10n.phoneLead, - ), - const SizedBox(height: Space.lg), - PhoneField( - controller: _phone, - country: state.country, - onCountryChanged: cubit.countryChanged, - label: l10n.phoneLabel, - hint: l10n.phoneHint, - enabled: !state.isSubmitting, - onSubmitted: (_) => cubit.submitPhone(), - errorText: state.phoneError == null - ? null - : ApiFailureText.phoneMessageOf(context, state.phoneError!), - ), - if (state.failure != null) - ApiFailureText(failure: state.failure!), - ], - ), - ); - }, - ); - } -} diff --git a/apps/rider_new/lib/features/chat/cubit/chat_cubit.dart b/apps/rider_new/lib/features/chat/cubit/chat_cubit.dart deleted file mode 100644 index a71266a..0000000 --- a/apps/rider_new/lib/features/chat/cubit/chat_cubit.dart +++ /dev/null @@ -1,81 +0,0 @@ -import 'dart:async'; - -import 'package:flutter_bloc/flutter_bloc.dart'; - -import '../../../core/api/api_exception.dart'; -import '../../../core/ui/view_status.dart'; -import '../data/chat_repository.dart'; - -class ChatState { - const ChatState({ - this.status = ViewStatus.idle, - this.messages = const [], - this.sending = false, - this.error, - }); - - final ViewStatus status; - final List messages; - final bool sending; - final String? error; -} - -class ChatCubit extends Cubit { - ChatCubit(this._repo) : super(const ChatState()); - - final ChatRepository _repo; - Timer? _poll; - String? _tripId; - - @override - Future close() { - _poll?.cancel(); - return super.close(); - } - - /// استطلاع كل خمس ثوانٍ — الخادم لا يبثّ الرسائل عبر السوكت - /// (راجع `ChatRepository`). يتوقّف مع إغلاق الشاشة. - Future open(String tripId) async { - _tripId = tripId; - emit(const ChatState(status: ViewStatus.loading)); - await _refresh(); - _poll = Timer.periodic(const Duration(seconds: 5), (_) => _refresh()); - } - - Future _refresh() async { - final tripId = _tripId; - if (tripId == null || isClosed) return; - try { - final messages = await _repo.messages(tripId); - if (isClosed) return; - emit(ChatState( - status: ViewStatus.success, - messages: messages, - sending: state.sending, - )); - } on ApiException catch (e) { - // فشل الاستطلاع لا يمسح ما وصل: الرسائل المعروضة تبقى. - if (!isClosed && state.messages.isEmpty) { - emit(ChatState(status: ViewStatus.error, error: e.message)); - } - } - } - - Future send(String body) async { - final tripId = _tripId; - if (tripId == null || body.trim().isEmpty) return; - emit(ChatState( - status: state.status, - messages: state.messages, - sending: true, - )); - try { - await _repo.send(tripId, body.trim()); - await _refresh(); - } on ApiException { - if (!isClosed) { - emit(ChatState(status: state.status, messages: state.messages)); - } - } - } -} diff --git a/apps/rider_new/lib/features/chat/data/chat_repository.dart b/apps/rider_new/lib/features/chat/data/chat_repository.dart deleted file mode 100644 index a54749a..0000000 --- a/apps/rider_new/lib/features/chat/data/chat_repository.dart +++ /dev/null @@ -1,46 +0,0 @@ -import '../../../core/api/api_client.dart'; - -class ChatMessage { - const ChatMessage({ - required this.id, - required this.body, - required this.senderId, - this.createdAt, - }); - - final String id; - final String body; - final String senderId; - final DateTime? createdAt; - - factory ChatMessage.fromJson(Map json) => ChatMessage( - id: json['id']?.toString() ?? '', - body: json['body'] as String? ?? json['message'] as String? ?? '', - senderId: json['sender_id']?.toString() ?? '', - createdAt: DateTime.tryParse(json['created_at']?.toString() ?? ''), - ); -} - -/// دردشة الرحلة (docs/38 §11). -/// -/// ⚠️ **لا حدث سوكت للرسائل**: قائمة أحداث الخادم لا تتضمّن الدردشة -/// (docs/38 §9)، فالتحديث **باستطلاع دوري** لا ببثّ. هذا قيد الخادم لا -/// اختيار تصميمي — ويُلغى فور إضافة الحدث. -class ChatRepository { - ChatRepository(this._api); - - final ApiClient _api; - - Future> messages(String tripId) async { - final res = await _api.get>('/trips/$tripId/messages'); - return res - .whereType>() - .map(ChatMessage.fromJson) - .toList(growable: false); - } - - Future send(String tripId, String body) => _api.post>( - '/trips/$tripId/messages', - body: {'body': body}, - ); -} diff --git a/apps/rider_new/lib/features/chat/view/chat_page.dart b/apps/rider_new/lib/features/chat/view/chat_page.dart deleted file mode 100644 index 1488e4b..0000000 --- a/apps/rider_new/lib/features/chat/view/chat_page.dart +++ /dev/null @@ -1,114 +0,0 @@ -import 'package:flutter/material.dart'; -import 'package:flutter_bloc/flutter_bloc.dart'; - -import '../../../core/design/tokens.dart'; -import '../../../core/design/tripz_colors.dart'; -import '../../../core/di.dart'; -import '../../../core/l10n/l10n.dart'; -import '../../../core/session/session_cubit.dart'; -import '../../../core/ui/empty_view.dart'; -import '../../../core/ui/tripz_scaffold.dart'; -import '../../../core/ui/tripz_text_field.dart'; -import '../cubit/chat_cubit.dart'; -import '../data/chat_repository.dart'; - -class ChatPage extends StatefulWidget { - const ChatPage({super.key, required this.tripId}); - - final String tripId; - - @override - State createState() => _ChatPageState(); -} - -class _ChatPageState extends State { - late final ChatCubit _cubit = sl()..open(widget.tripId); - final _input = TextEditingController(); - - @override - void dispose() { - _input.dispose(); - _cubit.close(); - super.dispose(); - } - - @override - Widget build(BuildContext context) { - final l10n = context.l10n; - final myId = sl().state.user?.id; - - return BlocProvider.value( - value: _cubit, - child: BlocBuilder( - builder: (context, state) => TripzScaffold( - title: l10n.chatTitle, - status: state.status, - error: state.error, - bottomAction: TripzTextField( - controller: _input, - hint: l10n.chatHint, - textInputAction: TextInputAction.send, - onSubmitted: (v) { - _cubit.send(v); - _input.clear(); - }, - suffix: IconButton( - icon: const Icon(Icons.send_rounded), - onPressed: () { - _cubit.send(_input.text); - _input.clear(); - }, - ), - ), - child: state.messages.isEmpty - ? EmptyView( - icon: Icons.forum_outlined, - message: l10n.chatEmpty, - ) - : ListView.builder( - // الأحدث أسفل، والقائمة مقلوبة كي تبقى عند آخر رسالة. - reverse: true, - itemCount: state.messages.length, - itemBuilder: (context, i) { - final msg = state.messages[state.messages.length - 1 - i]; - return _Bubble(msg: msg, mine: msg.senderId == myId); - }, - ), - ), - ), - ); - } -} - -class _Bubble extends StatelessWidget { - const _Bubble({required this.msg, required this.mine}); - - final ChatMessage msg; - final bool mine; - - @override - Widget build(BuildContext context) { - return Align( - alignment: - mine ? AlignmentDirectional.centerEnd : AlignmentDirectional.centerStart, - child: Container( - margin: const EdgeInsets.symmetric(vertical: Space.xxs), - padding: const EdgeInsets.symmetric( - horizontal: Space.sm, - vertical: Space.xs, - ), - constraints: BoxConstraints( - maxWidth: MediaQuery.sizeOf(context).width * 0.75, - ), - decoration: BoxDecoration( - color: mine - ? context.colors.primaryContainer - : context.tripzColors.surfaceRaised, - borderRadius: Radii.card_, - border: mine ? null : Border.all(color: context.colors.outlineVariant), - ), - child: Text(msg.body, style: context.texts.bodyMedium), - ), - ); - } -} diff --git a/apps/rider_new/lib/features/notifications/view/notifications_page.dart b/apps/rider_new/lib/features/notifications/view/notifications_page.dart deleted file mode 100644 index 3bc1a53..0000000 --- a/apps/rider_new/lib/features/notifications/view/notifications_page.dart +++ /dev/null @@ -1,117 +0,0 @@ -import 'package:flutter/material.dart'; -import 'package:intl/intl.dart'; - -import '../../../core/design/tokens.dart'; -import '../../../core/design/tripz_colors.dart'; -import '../../../core/di.dart'; -import '../../../core/l10n/l10n.dart'; -import '../../../core/notifications/notification_store.dart'; -import '../../../core/ui/empty_view.dart'; -import '../../../core/ui/tripz_card.dart'; -import '../../../core/ui/tripz_scaffold.dart'; -import '../../../core/ui/view_status.dart'; - -/// صندوق الإشعارات — يقابل `NotificationPage` في دراور سيرو -/// (`map_menu_widget.dart:354`). -/// -/// المصدر [NotificationStore] محلّي لا شبكي (السبب في تعليق ذلك الصنف). -/// فلا كيوبت ولا مستودع: قراءة واحدة عند الفتح ثم `setState` — إضافة طبقة -/// حالة لمصدرٍ في الذاكرة تعقيد بلا مقابل. -class NotificationsPage extends StatefulWidget { - const NotificationsPage({super.key}); - - @override - State createState() => _NotificationsPageState(); -} - -class _NotificationsPageState extends State { - final NotificationStore _store = sl(); - - @override - void initState() { - super.initState(); - // فتح الشاشة هو القراءة — لا زرّ «تعليم كمقروء» منفصل. - _store.markAllRead(); - } - - Future _clear() async { - await _store.clear(); - if (mounted) setState(() {}); - } - - @override - Widget build(BuildContext context) { - final l10n = context.l10n; - final items = _store.items; - - return TripzScaffold( - title: l10n.menuNotifications, - status: items.isEmpty ? ViewStatus.empty : ViewStatus.success, - empty: EmptyView( - icon: Icons.notifications_none_rounded, - message: l10n.notificationsEmpty, - ), - actions: [ - if (items.isNotEmpty) - IconButton( - icon: const Icon(Icons.delete_outline_rounded), - tooltip: l10n.notificationsClear, - onPressed: _clear, - ), - ], - child: ListView.separated( - itemCount: items.length, - separatorBuilder: (context, i) => const SizedBox(height: Space.xs), - itemBuilder: (context, i) => _NotificationCard(item: items[i]), - ), - ); - } -} - -class _NotificationCard extends StatelessWidget { - const _NotificationCard({required this.item}); - - final AppNotification item; - - @override - Widget build(BuildContext context) { - return TripzCard( - child: Row( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Icon( - Icons.notifications_active_outlined, - size: Sizes.iconSm, - color: context.colors.primary, - ), - const SizedBox(width: Space.sm), - Expanded( - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - if (item.title.isNotEmpty) - Text(item.title, style: context.texts.titleSmall), - if (item.body.isNotEmpty) ...[ - const SizedBox(height: Space.xxs), - Text( - item.body, - style: context.texts.bodySmall?.copyWith( - color: context.colors.onSurfaceVariant, - ), - ), - ], - const SizedBox(height: Space.xxs), - Text( - DateFormat.yMd().add_jm().format(item.receivedAt.toLocal()), - style: context.texts.labelSmall?.copyWith( - color: context.colors.onSurfaceVariant, - ), - ), - ], - ), - ), - ], - ), - ); - } -} diff --git a/apps/rider_new/lib/features/profile/cubit/profile_cubit.dart b/apps/rider_new/lib/features/profile/cubit/profile_cubit.dart deleted file mode 100644 index 3736c18..0000000 --- a/apps/rider_new/lib/features/profile/cubit/profile_cubit.dart +++ /dev/null @@ -1,56 +0,0 @@ -import 'package:flutter_bloc/flutter_bloc.dart'; - -import '../../../core/api/api_exception.dart'; -import '../../../core/api/api_failure.dart'; -import '../../../core/session/app_user.dart'; -import '../../../core/ui/view_status.dart'; -import '../data/profile_repository.dart'; - -class ProfileState { - const ProfileState({ - this.status = ViewStatus.success, - this.saving = false, - this.failure, - this.user, - }); - - final ViewStatus status; - final bool saving; - final ApiFailure? failure; - final AppUser? user; - - ProfileState copyWith({ - ViewStatus? status, - bool? saving, - ApiFailure? failure, - AppUser? user, - bool clearFailure = false, - }) { - return ProfileState( - status: status ?? this.status, - saving: saving ?? this.saving, - failure: clearFailure ? null : (failure ?? this.failure), - user: user ?? this.user, - ); - } -} - -/// إكمال الملف بعد أول دخول. عقد الخادم يقبل `{ name, language }` فقط -/// (docs/38 §3) — لا اسم أول/أخير ولا بريد كما في سيرو (docs/39 §2). -class ProfileCubit extends Cubit { - ProfileCubit(this._repo) : super(const ProfileState()); - - final ProfileRepository _repo; - - Future save(String name) async { - emit(state.copyWith(saving: true, clearFailure: true)); - try { - final user = await _repo.update(name: name.trim()); - emit(state.copyWith(saving: false, user: user)); - return user; - } on ApiException catch (e) { - emit(state.copyWith(saving: false, failure: e.toApiFailure())); - return null; - } - } -} diff --git a/apps/rider_new/lib/features/profile/data/profile_repository.dart b/apps/rider_new/lib/features/profile/data/profile_repository.dart deleted file mode 100644 index 758fbc3..0000000 --- a/apps/rider_new/lib/features/profile/data/profile_repository.dart +++ /dev/null @@ -1,20 +0,0 @@ -import '../../../core/api/api_client.dart'; -import '../../../core/session/app_user.dart'; - -/// `PATCH /users/me` — يقبل `{ name, language }` فقط (docs/38 §3). -/// -/// مستودع مستقلّ عن `AuthRepository` عمداً: تعديل الملف ليس مصادقة، وربطهما -/// كان يجعل ميزة الملف تستورد ميزة المصادقة — وهو ممنوع (docs/23 §1). -class ProfileRepository { - ProfileRepository(this._api); - - final ApiClient _api; - - Future update({String? name, String? language}) async { - final res = await _api.patch>( - '/users/me', - body: {'name': ?name, 'language': ?language}, - ); - return AppUser.fromJson(res); - } -} diff --git a/apps/rider_new/lib/features/profile/view/profile_edit_page.dart b/apps/rider_new/lib/features/profile/view/profile_edit_page.dart deleted file mode 100644 index b9c10a5..0000000 --- a/apps/rider_new/lib/features/profile/view/profile_edit_page.dart +++ /dev/null @@ -1,179 +0,0 @@ -import 'package:flutter/material.dart'; -import 'package:flutter_bloc/flutter_bloc.dart'; - -import '../../../core/design/tokens.dart'; -import '../../../core/design/tripz_colors.dart'; -import '../../../core/design/typography.dart'; -import '../../../core/di.dart'; -import '../../../core/l10n/l10n.dart'; -import '../../../core/session/session_cubit.dart'; -import '../../../core/ui/tripz_button.dart'; -import '../../../core/ui/tripz_scaffold.dart'; -import '../../../core/ui/tripz_text_field.dart'; -import '../cubit/profile_cubit.dart'; - -/// تعديل الاسم. **الرقم لا يُعدَّل**: هو هوية الحساب على الخادم، وتغييره -/// يعني حساباً آخر (docs/38 §1) — فيُعرض معطّلاً مع سبب واضح لا مخفياً. -class ProfileEditPage extends StatefulWidget { - const ProfileEditPage({super.key}); - - @override - State createState() => _ProfileEditPageState(); -} - -class _ProfileEditPageState extends State { - late final TextEditingController _name; - - @override - void initState() { - super.initState(); - _name = TextEditingController( - text: sl().state.user?.name ?? '', - ); - } - - @override - void dispose() { - _name.dispose(); - super.dispose(); - } - - @override - Widget build(BuildContext context) { - final l10n = context.l10n; - return BlocProvider( - create: (_) => ProfileCubit(sl()), - child: BlocBuilder( - builder: (context, state) { - final user = context.watch().state.user; - return TripzScaffold( - title: l10n.profileEditTitle, - bottomAction: TripzButton.primary( - label: l10n.actionSave, - loading: state.saving, - onPressed: () => _save(context), - ), - child: ListView( - children: [ - // ترويسة الحساب — الاسم والرقم والتقييم في مكان واحد. - // **التقييم كان يصل ولا يُعرض أبداً**: `AppUser.rating` مقروء - // من `GET /users/me` (docs/38 §2) ولم تكن أي شاشة تستعمله، - // بينما الراكب يُقيَّم من السائق ويحقّ له أن يرى نتيجته. - _ProfileHeader( - name: user?.name ?? '', - phone: user?.phone ?? '', - rating: user?.rating, - ), - const SizedBox(height: Space.lg), - TripzTextField( - controller: _name, - label: l10n.profileNameLabel, - enabled: !state.saving, - ), - const SizedBox(height: Space.md), - TripzTextField( - controller: TextEditingController(text: user?.phone ?? ''), - label: l10n.profilePhone, - enabled: false, - numeric: true, - ), - const SizedBox(height: Space.xxs), - Text( - l10n.profilePhoneLocked, - style: context.texts.bodySmall?.copyWith( - color: context.colors.onSurfaceVariant, - ), - ), - ], - ), - ); - }, - ), - ); - } - - Future _save(BuildContext context) async { - final l10n = context.l10n; - final messenger = ScaffoldMessenger.of(context); - final session = context.read(); - final user = await context.read().save(_name.text); - if (user == null) return; - session.onProfileCompleted(user); - messenger.showSnackBar(SnackBar(content: Text(l10n.profileSaved))); - } -} - -/// ترويسة الحساب: حرف الاسم الأول في دائرة، ثم الاسم والرقم والتقييم. -/// -/// لا صورة شخصية: الخادم لا يوفّر رفع صور للمستخدم (سيرو يفعل عبر PHP)، -/// وحرفُ الاسم أصدق من رمزٍ عام يوحي بإمكانية لا توجد. -class _ProfileHeader extends StatelessWidget { - const _ProfileHeader({ - required this.name, - required this.phone, - this.rating, - }); - - final String name; - final String phone; - final String? rating; - - @override - Widget build(BuildContext context) { - final initial = name.trim().isEmpty ? '?' : name.trim().characters.first; - return Row( - children: [ - CircleAvatar( - radius: 32, - backgroundColor: context.colors.primaryContainer, - child: Text( - initial, - style: context.texts.headlineSmall?.copyWith( - color: context.colors.onPrimaryContainer, - ), - ), - ), - const SizedBox(width: Space.md), - Expanded( - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - if (name.trim().isNotEmpty) - Text( - name, - style: context.texts.titleMedium, - maxLines: 1, - overflow: TextOverflow.ellipsis, - ), - Text( - phone, - // الرقم يُقرأ يساراً-يميناً حتى في واجهة عربية. - textDirection: TextDirection.ltr, - style: numericStyle(context.texts.bodySmall).copyWith( - color: context.colors.onSurfaceVariant, - ), - ), - if (rating != null && rating!.isNotEmpty) ...[ - const SizedBox(height: Space.xxs), - Row( - children: [ - Icon( - Icons.star_rounded, - size: Sizes.iconSm, - color: context.tripzColors.warning, - ), - const SizedBox(width: Space.xxs), - Text( - rating!, - style: numericStyle(context.texts.bodySmall), - ), - ], - ), - ], - ], - ), - ), - ], - ); - } -} diff --git a/apps/rider_new/lib/features/profile/view/profile_setup_page.dart b/apps/rider_new/lib/features/profile/view/profile_setup_page.dart deleted file mode 100644 index fb381b6..0000000 --- a/apps/rider_new/lib/features/profile/view/profile_setup_page.dart +++ /dev/null @@ -1,85 +0,0 @@ -import 'package:flutter/material.dart'; -import 'package:flutter_bloc/flutter_bloc.dart'; - -import '../../../core/design/tokens.dart'; -import '../../../core/di.dart'; -import '../../../core/l10n/l10n.dart'; -import '../../../core/session/session_cubit.dart'; -import '../../../core/ui/failure_text.dart'; -import '../../../core/ui/form_header.dart'; -import '../../../core/ui/tripz_button.dart'; -import '../../../core/ui/tripz_scaffold.dart'; -import '../../../core/ui/tripz_text_field.dart'; -import '../cubit/profile_cubit.dart'; - -class ProfileSetupPage extends StatefulWidget { - const ProfileSetupPage({super.key}); - - @override - State createState() => _ProfileSetupPageState(); -} - -class _ProfileSetupPageState extends State { - final _name = TextEditingController(); - String? _error; - - @override - void dispose() { - _name.dispose(); - super.dispose(); - } - - @override - Widget build(BuildContext context) { - final l10n = context.l10n; - return BlocProvider( - create: (_) => ProfileCubit(sl()), - child: BlocBuilder( - builder: (context, state) { - return TripzScaffold( - showAppBar: false, - bottomAction: TripzButton.primary( - label: l10n.actionSave, - loading: state.saving, - onPressed: () => _submit(context), - ), - child: ListView( - children: [ - const SizedBox(height: Space.xl), - FormHeader( - icon: Icons.person_outline_rounded, - title: l10n.profileTitle, - lead: l10n.profileLead, - ), - const SizedBox(height: Space.lg), - TripzTextField( - controller: _name, - label: l10n.profileNameLabel, - autofocus: true, - enabled: !state.saving, - errorText: _error, - textInputAction: TextInputAction.done, - autofillHints: const [AutofillHints.name], - onChanged: (_) => setState(() => _error = null), - onSubmitted: (_) => _submit(context), - ), - if (state.failure != null) - ApiFailureText(failure: state.failure!), - ], - ), - ); - }, - ), - ); - } - - Future _submit(BuildContext context) async { - if (_name.text.trim().isEmpty) { - setState(() => _error = context.l10n.profileNameErrEmpty); - return; - } - final session = context.read(); - final user = await context.read().save(_name.text); - if (user != null) session.onProfileCompleted(user); - } -} diff --git a/apps/rider_new/lib/features/rating/cubit/rating_cubit.dart b/apps/rider_new/lib/features/rating/cubit/rating_cubit.dart deleted file mode 100644 index 05c47e0..0000000 --- a/apps/rider_new/lib/features/rating/cubit/rating_cubit.dart +++ /dev/null @@ -1,40 +0,0 @@ -import 'package:flutter_bloc/flutter_bloc.dart'; - -import '../../../core/api/api_exception.dart'; -import '../data/rating_repository.dart'; -import 'rating_state.dart'; - -class RatingCubit extends Cubit { - RatingCubit(this._repo) : super(const RatingState()); - - final RatingRepository _repo; - - void attach(PendingRating pending) => emit(RatingState(pending: pending)); - - void setStars(int stars) => emit(state.copyWith(stars: stars)); - - void setComment(String comment) => emit(state.copyWith(comment: comment)); - - Future submit() async { - final pending = state.pending; - if (pending == null || !state.canSubmit) return; - - emit(state.copyWith(status: RatingStatus.submitting)); - try { - await _repo.rate( - pending.tripId, - state.stars, - comment: state.comment.trim().isEmpty ? null : state.comment.trim(), - ); - emit(state.copyWith(status: RatingStatus.done)); - } on ApiException catch (e) { - // 400 هنا = تقييم مزدوج، وهو نجاحٌ من منظور المستخدم: الرحلة مُقيَّمة - // فعلاً، فلا يُحبس في شاشة لا مخرج منها. - emit(state.copyWith( - status: e.statusCode == 400 - ? RatingStatus.alreadyRated - : RatingStatus.failed, - )); - } - } -} diff --git a/apps/rider_new/lib/features/rating/cubit/rating_state.dart b/apps/rider_new/lib/features/rating/cubit/rating_state.dart deleted file mode 100644 index 3053676..0000000 --- a/apps/rider_new/lib/features/rating/cubit/rating_state.dart +++ /dev/null @@ -1,38 +0,0 @@ -import 'package:equatable/equatable.dart'; - -import '../data/rating_repository.dart'; - -enum RatingStatus { idle, submitting, done, alreadyRated, failed } - -class RatingState extends Equatable { - const RatingState({ - this.status = RatingStatus.idle, - this.pending, - this.stars = 0, - this.comment = '', - }); - - final RatingStatus status; - final PendingRating? pending; - final int stars; - final String comment; - - bool get canSubmit => stars > 0 && status != RatingStatus.submitting; - - RatingState copyWith({ - RatingStatus? status, - PendingRating? pending, - int? stars, - String? comment, - }) { - return RatingState( - status: status ?? this.status, - pending: pending ?? this.pending, - stars: stars ?? this.stars, - comment: comment ?? this.comment, - ); - } - - @override - List get props => [status, pending?.tripId, stars, comment]; -} diff --git a/apps/rider_new/lib/features/rating/data/rating_repository.dart b/apps/rider_new/lib/features/rating/data/rating_repository.dart deleted file mode 100644 index 7ed24c4..0000000 --- a/apps/rider_new/lib/features/rating/data/rating_repository.dart +++ /dev/null @@ -1,40 +0,0 @@ -import '../../../core/api/api_client.dart'; - -/// رحلة تنتظر تقييماً — يرجّعها الخادم عند كل فتح للتطبيق (docs/38 §7). -class PendingRating { - const PendingRating({required this.tripId, required this.role}); - - final String tripId; - - /// الدور يحدّد نصّ السؤال: الراكب يقيّم السائق والعكس. - final String role; - - bool get isDriver => role == 'driver'; -} - -class RatingRepository { - RatingRepository(this._api); - - final ApiClient _api; - - /// `{"pending": null, "count": 0}` حين لا شيء — شكل مُتحقَّق حيّاً. - Future pending() async { - final res = await _api.get>('/trips/rating/pending'); - final pending = res['pending']; - if (pending is! Map) return null; - final tripId = pending['tripId'] as String?; - if (tripId == null) return null; - return PendingRating( - tripId: tripId, - role: pending['role'] as String? ?? 'rider', - ); - } - - /// التقييم المزدوج يرجّع **400** — تُعامَل كحالة معروفة لا كعطل. - Future rate(String tripId, int stars, {String? comment}) { - return _api.post>( - '/trips/$tripId/rate', - body: {'stars': stars, 'comment': ?comment}, - ); - } -} diff --git a/apps/rider_new/lib/features/rating/view/rating_page.dart b/apps/rider_new/lib/features/rating/view/rating_page.dart deleted file mode 100644 index 24074fc..0000000 --- a/apps/rider_new/lib/features/rating/view/rating_page.dart +++ /dev/null @@ -1,123 +0,0 @@ -import 'package:flutter/material.dart'; -import 'package:flutter_bloc/flutter_bloc.dart'; - -import '../../../core/design/tokens.dart'; -import '../../../core/design/tripz_colors.dart'; -import '../../../core/di.dart'; -import '../../../core/l10n/l10n.dart'; -import '../../../core/ui/tripz_button.dart'; -import '../../../core/ui/tripz_scaffold.dart'; -import '../../../core/ui/tripz_text_field.dart'; -import '../cubit/rating_cubit.dart'; -import '../cubit/rating_state.dart'; -import '../data/rating_repository.dart'; -import 'star_row.dart'; - -/// شاشة التقييم — **تُفرض عند فتح التطبيق** إن كانت هناك رحلة معلّقة -/// (`GET /trips/rating/pending`، docs/38 §7). لذلك بلا زرّ رجوع في الشريط: -/// الطريق الوحيد للخروج هو التقييم أو التخطّي الصريح. -class RatingPage extends StatefulWidget { - const RatingPage({super.key, required this.pending, required this.onDone}); - - final PendingRating pending; - final VoidCallback onDone; - - @override - State createState() => _RatingPageState(); -} - -class _RatingPageState extends State { - late final RatingCubit _cubit = sl()..attach(widget.pending); - final _comment = TextEditingController(); - - @override - void dispose() { - _comment.dispose(); - _cubit.close(); - super.dispose(); - } - - @override - Widget build(BuildContext context) { - final l10n = context.l10n; - // من يقيّم مَن: دور **هذا** المستخدم في الرحلة يأتي من الخادم، ولا - // يُستنتج من نوع التطبيق — الرقم نفسه قد يكون له حسابان (docs/38 §1). - final title = widget.pending.isDriver ? l10n.rateTitleDriver : l10n.rateTitle; - - return BlocProvider.value( - value: _cubit, - child: BlocConsumer( - listenWhen: (p, n) => p.status != n.status, - listener: (context, state) { - if (state.status == RatingStatus.done || - state.status == RatingStatus.alreadyRated) { - widget.onDone(); - } - }, - builder: (context, state) { - return TripzScaffold( - showAppBar: false, - bottomAction: Column( - mainAxisSize: MainAxisSize.min, - children: [ - TripzButton.primary( - label: l10n.rateSubmit, - loading: state.status == RatingStatus.submitting, - onPressed: state.canSubmit ? _cubit.submit : null, - ), - TripzButton.text( - label: l10n.rateSkip, - onPressed: widget.onDone, - ), - ], - ), - child: ListView( - children: [ - const SizedBox(height: Space.xxl), - Icon( - Icons.star_rounded, - size: 56, - color: context.tripzColors.warning, - ), - const SizedBox(height: Space.md), - Text( - title, - textAlign: TextAlign.center, - style: context.texts.headlineSmall, - ), - const SizedBox(height: Space.xs), - Text( - l10n.rateLead, - textAlign: TextAlign.center, - style: context.texts.bodyMedium?.copyWith( - color: context.colors.onSurfaceVariant, - ), - ), - const SizedBox(height: Space.lg), - StarRow(value: state.stars, onChanged: _cubit.setStars), - const SizedBox(height: Space.lg), - TripzTextField( - controller: _comment, - hint: l10n.rateComment, - onChanged: _cubit.setComment, - ), - if (state.status == RatingStatus.failed) ...[ - const SizedBox(height: Space.sm), - Text( - l10n.errorGeneric, - textAlign: TextAlign.center, - style: context.texts.bodySmall?.copyWith( - color: context.tripzColors.danger, - ), - ), - ], - // مساحة للـCTA السفلي كي لا يغطّي الحقل عند فتح الكيبورد. - const SizedBox(height: Sizes.control), - ], - ), - ); - }, - ), - ); - } -} diff --git a/apps/rider_new/lib/features/rating/view/star_row.dart b/apps/rider_new/lib/features/rating/view/star_row.dart deleted file mode 100644 index bd8f664..0000000 --- a/apps/rider_new/lib/features/rating/view/star_row.dart +++ /dev/null @@ -1,43 +0,0 @@ -import 'package:flutter/material.dart'; - -import '../../../core/design/tokens.dart'; -import '../../../core/design/tripz_colors.dart'; - -/// خمس نجوم — أهداف لمس ≥ 48 لأن الشاشة تُستعمل عادةً والمستخدم مستعجل. -class StarRow extends StatelessWidget { - const StarRow({super.key, required this.value, required this.onChanged}); - - final int value; - final ValueChanged onChanged; - - @override - Widget build(BuildContext context) { - return Row( - mainAxisAlignment: MainAxisAlignment.center, - // النجوم تُقرأ يساراً-ليميناً في اللغتين: ترتيبها ليس نصّاً. - textDirection: TextDirection.ltr, - children: List.generate(5, (i) { - final star = i + 1; - final filled = star <= value; - return IconButton( - onPressed: () => onChanged(star), - iconSize: Sizes.iconLg, - constraints: const BoxConstraints( - minWidth: Sizes.touchTarget, - minHeight: Sizes.touchTarget, - ), - icon: AnimatedSwitcher( - duration: Motion.tap, - child: Icon( - filled ? Icons.star_rounded : Icons.star_outline_rounded, - key: ValueKey(filled), - color: filled - ? context.tripzColors.warning - : context.colors.onSurfaceVariant, - ), - ), - ); - }), - ); - } -} diff --git a/apps/rider_new/lib/features/rewards/cubit/rewards_cubit.dart b/apps/rider_new/lib/features/rewards/cubit/rewards_cubit.dart deleted file mode 100644 index 4c5e601..0000000 --- a/apps/rider_new/lib/features/rewards/cubit/rewards_cubit.dart +++ /dev/null @@ -1,46 +0,0 @@ -import 'package:flutter_bloc/flutter_bloc.dart'; - -import '../../../core/api/api_exception.dart'; -import '../../../core/ui/view_status.dart'; -import '../data/rewards_repository.dart'; - -class RewardsState { - const RewardsState({ - this.status = ViewStatus.idle, - this.referrals, - this.coupons = const [], - this.error, - }); - - final ViewStatus status; - final ReferralSummary? referrals; - final List coupons; - final String? error; -} - -class RewardsCubit extends Cubit { - RewardsCubit(this._repo) : super(const RewardsState()); - - final RewardsRepository _repo; - - Future load() async { - emit(const RewardsState(status: ViewStatus.loading)); - try { - // النداءان متوازيان: لا سبب لانتظار أحدهما الآخر. - final results = await Future.wait([ - _repo.referrals(), - _repo.coupons(), - ]); - if (isClosed) return; - emit(RewardsState( - status: ViewStatus.success, - referrals: results[0] as ReferralSummary, - coupons: results[1] as List, - )); - } on ApiException catch (e) { - if (!isClosed) { - emit(RewardsState(status: ViewStatus.error, error: e.message)); - } - } - } -} diff --git a/apps/rider_new/lib/features/rewards/data/rewards_repository.dart b/apps/rider_new/lib/features/rewards/data/rewards_repository.dart deleted file mode 100644 index 7e7fcfd..0000000 --- a/apps/rider_new/lib/features/rewards/data/rewards_repository.dart +++ /dev/null @@ -1,65 +0,0 @@ -import '../../../core/api/api_client.dart'; - -/// ملخّص الدعوات — شكل مُتحقَّق حيّاً: `{code, total, pending, paid}`. -class ReferralSummary { - const ReferralSummary({ - required this.code, - required this.total, - required this.pending, - required this.paid, - }); - - /// كود دعوتي الذي أشاركه. - final String code; - - final int total; - final int pending; - final int paid; - - factory ReferralSummary.fromJson(Map json) => - ReferralSummary( - code: json['code'] as String? ?? '', - total: (json['total'] as num?)?.toInt() ?? 0, - pending: (json['pending'] as num?)?.toInt() ?? 0, - paid: (json['paid'] as num?)?.toInt() ?? 0, - ); -} - -class Coupon { - const Coupon({ - required this.code, - this.description = '', - this.expiresAt, - }); - - final String code; - final String description; - final DateTime? expiresAt; - - factory Coupon.fromJson(Map json) => Coupon( - code: json['code'] as String? ?? '', - description: json['description'] as String? ?? - json['title'] as String? ?? - '', - expiresAt: DateTime.tryParse(json['expires_at']?.toString() ?? ''), - ); -} - -class RewardsRepository { - RewardsRepository(this._api); - - final ApiClient _api; - - Future referrals() async { - final res = await _api.get>('/rewards/referrals'); - return ReferralSummary.fromJson(res); - } - - Future> coupons() async { - final res = await _api.get>('/rewards/coupons'); - return res - .whereType>() - .map(Coupon.fromJson) - .toList(growable: false); - } -} diff --git a/apps/rider_new/lib/features/rewards/view/rewards_page.dart b/apps/rider_new/lib/features/rewards/view/rewards_page.dart deleted file mode 100644 index f1ce8fc..0000000 --- a/apps/rider_new/lib/features/rewards/view/rewards_page.dart +++ /dev/null @@ -1,205 +0,0 @@ -import 'package:flutter/material.dart'; -import 'package:flutter/services.dart'; -import 'package:flutter_bloc/flutter_bloc.dart'; -import 'package:share_plus/share_plus.dart'; - -import '../../../core/design/tokens.dart'; -import '../../../core/design/tripz_colors.dart'; -import '../../../core/design/typography.dart'; -import '../../../core/di.dart'; -import '../../../core/l10n/l10n.dart'; -import '../../../core/store_links.dart'; -import '../../../core/ui/tripz_button.dart'; -import '../../../core/ui/tripz_card.dart'; -import '../../../core/ui/tripz_scaffold.dart'; -import '../cubit/rewards_cubit.dart'; - -/// «مكافآتي» — الدعوات والكوبونات في شاشة واحدة (نمط سيرو: Promos + Invite). -class RewardsPage extends StatefulWidget { - const RewardsPage({super.key}); - - @override - State createState() => _RewardsPageState(); -} - -class _RewardsPageState extends State { - late final RewardsCubit _cubit = sl()..load(); - - @override - void dispose() { - _cubit.close(); - super.dispose(); - } - - @override - Widget build(BuildContext context) { - final l10n = context.l10n; - return BlocProvider.value( - value: _cubit, - child: BlocBuilder( - builder: (context, state) { - final ref = state.referrals; - return TripzScaffold( - title: l10n.rewardsTitle, - status: state.status, - error: state.error, - onRetry: _cubit.load, - child: ListView( - children: [ - if (ref != null) _InviteCard(code: ref.code, summary: ref), - const SizedBox(height: Space.lg), - Text(l10n.rewardsCoupons, style: context.texts.titleMedium), - const SizedBox(height: Space.xs), - if (state.coupons.isEmpty) - Text( - l10n.rewardsCouponsEmpty, - style: context.texts.bodySmall?.copyWith( - color: context.colors.onSurfaceVariant, - ), - ) - else - for (final coupon in state.coupons) ...[ - TripzCard( - child: Row( - children: [ - Icon( - Icons.local_offer_outlined, - color: context.tripzColors.success, - ), - const SizedBox(width: Space.sm), - Expanded( - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Text( - coupon.code, - textDirection: TextDirection.ltr, - style: numericStyle(context.texts.titleSmall), - ), - if (coupon.description.isNotEmpty) - Text( - coupon.description, - style: context.texts.bodySmall?.copyWith( - color: context.colors.onSurfaceVariant, - ), - ), - ], - ), - ), - ], - ), - ), - const SizedBox(height: Space.xs), - ], - ], - ), - ); - }, - ), - ); - } -} - -class _InviteCard extends StatelessWidget { - const _InviteCard({required this.code, required this.summary}); - - final String code; - final dynamic summary; - - @override - Widget build(BuildContext context) { - final l10n = context.l10n; - return Container( - padding: Space.page, - decoration: BoxDecoration( - color: context.colors.primaryContainer, - borderRadius: Radii.card_, - ), - child: Column( - crossAxisAlignment: CrossAxisAlignment.stretch, - children: [ - Text( - l10n.rewardsInviteTitle, - style: context.texts.titleMedium?.copyWith( - color: context.colors.onPrimaryContainer, - ), - ), - const SizedBox(height: Space.xxs), - Text( - l10n.rewardsInviteLead, - style: context.texts.bodySmall?.copyWith( - color: context.colors.onPrimaryContainer.withValues(alpha: 0.8), - ), - ), - const SizedBox(height: Space.md), - // الكود يُنسخ ويُشارك — الطريقان اللذان يستعملهما الناس فعلاً. - Row( - children: [ - Expanded( - child: SelectableText( - code, - textDirection: TextDirection.ltr, - style: numericStyle(context.texts.headlineSmall).copyWith( - letterSpacing: 3, - color: context.colors.onPrimaryContainer, - ), - ), - ), - IconButton( - icon: const Icon(Icons.copy_rounded), - color: context.colors.onPrimaryContainer, - onPressed: () => Clipboard.setData(ClipboardData(text: code)), - ), - ], - ), - const SizedBox(height: Space.sm), - TripzButton.primary( - label: l10n.menuShare, - icon: Icons.share_outlined, - // الكود بلا رابط لا ينفع: المدعوّ لا يعرف من أين يُنزّل. ورابطُ - // **هذا** البناء لا رابطٌ ثابت — سائق يدعو سائقاً وراكب راكباً. - onPressed: () => SharePlus.instance.share( - ShareParams(text: l10n.shareMessage(code, StoreLinks.thisApp)), - ), - ), - const SizedBox(height: Space.md), - Row( - mainAxisAlignment: MainAxisAlignment.spaceAround, - children: [ - _Stat(label: l10n.rewardsInvited, value: summary.total), - _Stat(label: l10n.rewardsPending, value: summary.pending), - _Stat(label: l10n.rewardsPaid, value: summary.paid), - ], - ), - ], - ), - ); - } -} - -class _Stat extends StatelessWidget { - const _Stat({required this.label, required this.value}); - - final String label; - final int value; - - @override - Widget build(BuildContext context) { - return Column( - children: [ - Text( - '$value', - style: numericStyle(context.texts.titleLarge).copyWith( - color: context.colors.onPrimaryContainer, - ), - ), - Text( - label, - style: context.texts.labelSmall?.copyWith( - color: context.colors.onPrimaryContainer.withValues(alpha: 0.8), - ), - ), - ], - ); - } -} diff --git a/apps/rider_new/lib/features/settings/cubit/settings_cubit.dart b/apps/rider_new/lib/features/settings/cubit/settings_cubit.dart deleted file mode 100644 index 4875dff..0000000 --- a/apps/rider_new/lib/features/settings/cubit/settings_cubit.dart +++ /dev/null @@ -1,37 +0,0 @@ -import 'package:flutter/material.dart'; -import 'package:flutter_bloc/flutter_bloc.dart'; -import 'package:shared_preferences/shared_preferences.dart'; - -import 'settings_state.dart'; - -class SettingsCubit extends Cubit { - SettingsCubit(this._prefs) : super(_read(_prefs)); - - final SharedPreferences _prefs; - - static const _kTheme = 'settings.theme_mode'; - static const _kLocale = 'settings.locale'; - - /// تُقرأ **متزامنة** في الباني: تأخير القراءة يعني ومضة بالثيم الخاطئ عند - /// كل إقلاع. - static SettingsState _read(SharedPreferences prefs) { - return SettingsState( - themeMode: switch (prefs.getString(_kTheme)) { - 'light' => ThemeMode.light, - 'dark' => ThemeMode.dark, - _ => ThemeMode.system, - }, - locale: Locale(prefs.getString(_kLocale) ?? 'ar'), - ); - } - - Future setThemeMode(ThemeMode mode) async { - emit(state.copyWith(themeMode: mode)); - await _prefs.setString(_kTheme, mode.name); - } - - Future setLocale(Locale locale) async { - emit(state.copyWith(locale: locale)); - await _prefs.setString(_kLocale, locale.languageCode); - } -} diff --git a/apps/rider_new/lib/features/settings/cubit/settings_state.dart b/apps/rider_new/lib/features/settings/cubit/settings_state.dart deleted file mode 100644 index f841895..0000000 --- a/apps/rider_new/lib/features/settings/cubit/settings_state.dart +++ /dev/null @@ -1,24 +0,0 @@ -import 'package:equatable/equatable.dart'; -import 'package:flutter/material.dart'; - -/// المظهر واللغة (docs/26 §4) — محفوظان محلياً، وليسا سرّاً فيذهبان إلى -/// `SharedPreferences` لا إلى التخزين الآمن. -class SettingsState extends Equatable { - const SettingsState({ - this.themeMode = ThemeMode.system, - this.locale = const Locale('ar'), - }); - - final ThemeMode themeMode; - final Locale locale; - - SettingsState copyWith({ThemeMode? themeMode, Locale? locale}) { - return SettingsState( - themeMode: themeMode ?? this.themeMode, - locale: locale ?? this.locale, - ); - } - - @override - List get props => [themeMode, locale]; -} diff --git a/apps/rider_new/lib/features/settings/view/settings_page.dart b/apps/rider_new/lib/features/settings/view/settings_page.dart deleted file mode 100644 index c654a53..0000000 --- a/apps/rider_new/lib/features/settings/view/settings_page.dart +++ /dev/null @@ -1,213 +0,0 @@ -import 'package:flutter/material.dart'; -import 'package:flutter_bloc/flutter_bloc.dart'; -import 'package:go_router/go_router.dart'; -import 'package:package_info_plus/package_info_plus.dart'; -import 'package:share_plus/share_plus.dart'; -import 'package:url_launcher/url_launcher.dart'; - -import '../../../core/build_config.dart'; -import '../../../core/design/tokens.dart'; -import '../../../core/design/tripz_colors.dart'; -import '../../../core/design/typography.dart'; -import '../../../core/di.dart'; -import '../../../core/l10n/l10n.dart'; -import '../../../core/router.dart'; -import '../../../core/session/session_cubit.dart'; -import '../../../core/store_links.dart'; -import '../../../core/ui/tripz_scaffold.dart'; -import '../../profile/data/profile_repository.dart'; -import '../cubit/settings_cubit.dart'; -import '../cubit/settings_state.dart'; - -/// المظهر واللغة ومعلومات التطبيق — بأقسام كما في سيرو -/// (`setting_page.dart`: General · Preferences · Support & Info) بدل قائمة -/// مسطّحة بلا عناوين. -/// -/// تبديل اللغة **يقلب الاتجاه كاملاً** بلا إعادة تشغيل — `MaterialApp` -/// يشتقّ RTL/LTR من الـlocale (docs/26 §4). -class SettingsPage extends StatelessWidget { - const SettingsPage({super.key}); - - @override - Widget build(BuildContext context) { - final l10n = context.l10n; - return BlocBuilder( - builder: (context, state) { - final cubit = context.read(); - return TripzScaffold( - title: l10n.settingsTitle, - child: ListView( - children: [ - _SectionHeader(title: l10n.settingsSectionGeneral), - Text(l10n.settingsTheme, style: context.texts.titleSmall), - RadioGroup( - groupValue: state.themeMode, - onChanged: (v) => cubit.setThemeMode(v ?? ThemeMode.system), - child: Column( - children: [ - RadioListTile( - value: ThemeMode.system, - contentPadding: EdgeInsets.zero, - title: Text(l10n.settingsThemeSystem), - ), - RadioListTile( - value: ThemeMode.light, - contentPadding: EdgeInsets.zero, - title: Text(l10n.settingsThemeLight), - ), - RadioListTile( - value: ThemeMode.dark, - contentPadding: EdgeInsets.zero, - title: Text(l10n.settingsThemeDark), - ), - ], - ), - ), - const SizedBox(height: Space.md), - Text(l10n.settingsLanguage, style: context.texts.titleSmall), - RadioGroup( - groupValue: state.locale.languageCode, - // اللغة تُحفظ محلياً **وتُرسل للخادم**: الإشعارات تُصاغ على - // الخادم بلغة المستخدم المخزّنة عنده (`PATCH /users/me` - // يقبل `language` — docs/38 §3)، فلغةٌ محليّة وحدها تعني - // واجهةً عربية وإشعاراتٍ إنجليزية. - onChanged: (v) => _setLanguage(context, v ?? 'ar'), - child: Column( - children: [ - RadioListTile( - value: 'ar', - contentPadding: EdgeInsets.zero, - title: Text(l10n.settingsLanguageArabic), - ), - RadioListTile( - value: 'en', - contentPadding: EdgeInsets.zero, - title: Text(l10n.settingsLanguageEnglish), - ), - ], - ), - ), - - _SectionHeader(title: l10n.settingsSectionSupport), - _Tile( - icon: Icons.help_outline_rounded, - title: l10n.menuSupport, - subtitle: l10n.settingsSupportLead, - onTap: () => context.push(Routes.support), - ), - _Tile( - icon: Icons.share_outlined, - title: l10n.menuShare, - subtitle: l10n.settingsShareLead, - onTap: () => SharePlus.instance.share( - ShareParams(text: l10n.shareMessagePlain(StoreLinks.thisApp)), - ), - ), - _Tile( - icon: Icons.shield_outlined, - title: l10n.menuPrivacy, - onTap: () async { - final uri = Uri.tryParse(BuildConfig.privacyUrl); - if (uri == null) return; - await launchUrl(uri, mode: LaunchMode.externalApplication); - }, - ), - const _VersionTile(), - ], - ), - ); - }, - ); - } - - /// فشل الخادم **لا يمنع** تبديل اللغة محلياً: الواجهة تستجيب فوراً، - /// والمزامنة تُعاد عند التبديل التالي. عكسه يعني زرّاً لا يستجيب بلا شبكة. - static Future _setLanguage(BuildContext context, String code) async { - await context.read().setLocale(Locale(code)); - try { - final user = await sl().update(language: code); - sl().onProfileCompleted(user); - } catch (_) { - // المزامنة أفضل-جهد — لا رسالة خطأ على تبديل نجح محلياً. - } - } -} - -class _SectionHeader extends StatelessWidget { - const _SectionHeader({required this.title}); - - final String title; - - @override - Widget build(BuildContext context) { - return Padding( - padding: const EdgeInsets.only(top: Space.lg, bottom: Space.xs), - child: Text( - title, - style: context.texts.labelMedium?.copyWith( - color: context.colors.primary, - ), - ), - ); - } -} - -class _Tile extends StatelessWidget { - const _Tile({ - required this.icon, - required this.title, - required this.onTap, - this.subtitle, - }); - - final IconData icon; - final String title; - final String? subtitle; - final VoidCallback onTap; - - @override - Widget build(BuildContext context) { - return ListTile( - contentPadding: EdgeInsets.zero, - leading: Icon(icon), - title: Text(title), - subtitle: subtitle == null ? null : Text(subtitle!), - trailing: Icon( - Icons.chevron_left_rounded, - color: context.colors.onSurfaceVariant, - ), - onTap: onTap, - ); - } -} - -/// رقم الإصدار — أول ما يُسأل عنه في الدعم، وكان غائباً رغم وجود مفتاح -/// ترجمته أصلاً. -class _VersionTile extends StatelessWidget { - const _VersionTile(); - - @override - Widget build(BuildContext context) { - final l10n = context.l10n; - return FutureBuilder( - future: PackageInfo.fromPlatform(), - builder: (context, snapshot) { - final info = snapshot.data; - return ListTile( - contentPadding: EdgeInsets.zero, - leading: const Icon(Icons.info_outline_rounded), - title: Text(l10n.aboutVersion), - trailing: Text( - // قبل وصول المعلومة يُترك المكان فارغاً لا «—»: القيمة تصل - // في إطار واحد، والشرطة تومض بلا داعٍ. - info == null ? '' : '${info.version} (${info.buildNumber})', - textDirection: TextDirection.ltr, - style: numericStyle(context.texts.bodySmall).copyWith( - color: context.colors.onSurfaceVariant, - ), - ), - ); - }, - ); - } -} diff --git a/apps/rider_new/lib/features/splash/view/splash_page.dart b/apps/rider_new/lib/features/splash/view/splash_page.dart deleted file mode 100644 index c043869..0000000 --- a/apps/rider_new/lib/features/splash/view/splash_page.dart +++ /dev/null @@ -1,69 +0,0 @@ -import 'package:flutter/material.dart'; -import 'package:flutter_bloc/flutter_bloc.dart'; - -import '../../../core/build_config.dart'; -import '../../../core/config.dart'; -import '../../../core/design/tokens.dart'; -import '../../../core/design/tripz_colors.dart'; -import '../../../core/l10n/l10n.dart'; -import '../../../core/session/session_cubit.dart'; -import '../../../core/tenant/tenant_cubit.dart'; - -/// شاشة الإقلاع: تستعيد الجلسة ثم يتولّى الراوتر التوجيه. لا تنقّل من هنا — -/// قرار الوجهة في مكان واحد (`core/router.dart`). -class SplashPage extends StatefulWidget { - const SplashPage({super.key}); - - @override - State createState() => _SplashPageState(); -} - -class _SplashPageState extends State { - @override - void initState() { - super.initState(); - // بعد أول إطار: `restore` قد يُصدر حالة فوراً، وإصدارها أثناء البناء خطأ. - WidgetsBinding.instance.addPostFrameCallback((_) { - if (!mounted) return; - // إعداد المستأجر بلا توكن — يُجلب بالتوازي مع استعادة الجلسة لا بعدها. - context.read().load(); - context.read().restore(); - }); - } - - @override - Widget build(BuildContext context) { - return Scaffold( - body: Center( - child: Column( - mainAxisSize: MainAxisSize.min, - children: [ - Image.asset(BuildConfig.logoAsset, width: 140, height: 140), - const SizedBox(height: Space.lg), - Text( - BuildConfig.appName, - style: context.texts.headlineMedium?.copyWith( - color: context.colors.primary, - ), - ), - const SizedBox(height: Space.xs), - Text( - AppConfig.appRole == 'driver' - ? context.l10n.splashDriver - : context.l10n.splashRider, - style: context.texts.bodyMedium?.copyWith( - color: context.colors.onSurfaceVariant, - ), - ), - const SizedBox(height: Space.xl), - const SizedBox( - width: 28, - height: 28, - child: CircularProgressIndicator(strokeWidth: 2.5), - ), - ], - ), - ), - ); - } -} diff --git a/apps/rider_new/lib/features/support/view/support_page.dart b/apps/rider_new/lib/features/support/view/support_page.dart deleted file mode 100644 index 1e74afd..0000000 --- a/apps/rider_new/lib/features/support/view/support_page.dart +++ /dev/null @@ -1,169 +0,0 @@ -import 'package:flutter/material.dart'; -import 'package:geolocator/geolocator.dart'; -import 'package:permission_handler/permission_handler.dart'; -import 'package:url_launcher/url_launcher.dart'; - -import '../../../core/build_config.dart'; -import '../../../core/design/tokens.dart'; -import '../../../core/design/tripz_colors.dart'; -import '../../../core/l10n/l10n.dart'; -import '../../../core/ui/tripz_card.dart'; -import '../../../core/ui/tripz_scaffold.dart'; - -/// المساعدة: أسئلة شائعة · تواصل · فحص توافق الجهاز · عن التطبيق. -/// -/// المحتوى **محلّي عمداً**: الخادم لا يوفّر نقطة أسئلة شائعة، وربطها بالشبكة -/// يعني شاشة فارغة حين ينقطع الاتصال — وهو بالضبط الوقت الذي يفتح فيه -/// المستخدم المساعدة. -class SupportPage extends StatelessWidget { - const SupportPage({super.key}); - - @override - Widget build(BuildContext context) { - final l10n = context.l10n; - final faq = [ - (l10n.supportFaqQ1, l10n.supportFaqA1), - (l10n.supportFaqQ2, l10n.supportFaqA2), - (l10n.supportFaqQ3, l10n.supportFaqA3), - (l10n.supportFaqQ4, l10n.supportFaqA4), - ]; - - return TripzScaffold( - title: l10n.supportTitle, - child: ListView( - children: [ - Text(l10n.supportFaq, style: context.texts.titleMedium), - const SizedBox(height: Space.xs), - for (final (q, a) in faq) - Card( - margin: const EdgeInsets.only(bottom: Space.xs), - child: ExpansionTile( - shape: const RoundedRectangleBorder(borderRadius: Radii.card_), - title: Text(q, style: context.texts.bodyMedium), - children: [ - Padding( - padding: Space.page, - child: Text( - a, - style: context.texts.bodySmall?.copyWith( - color: context.colors.onSurfaceVariant, - ), - ), - ), - ], - ), - ), - - const SizedBox(height: Space.lg), - Text(l10n.supportContact, style: context.texts.titleMedium), - const SizedBox(height: Space.xs), - TripzCard( - onTap: () => _openWhatsapp(BuildConfig.supportPhone), - child: Row( - children: [ - Icon(Icons.chat_outlined, color: context.tripzColors.success), - const SizedBox(width: Space.sm), - Expanded(child: Text(l10n.supportWhatsapp)), - const Icon(Icons.chevron_left_rounded), - ], - ), - ), - - const SizedBox(height: Space.md), - TripzCard( - onTap: () => _showDeviceCheck(context), - child: Row( - children: [ - const Icon(Icons.phonelink_setup_outlined), - const SizedBox(width: Space.sm), - Expanded(child: Text(l10n.supportDeviceCheck)), - const Icon(Icons.chevron_left_rounded), - ], - ), - ), - - const SizedBox(height: Space.lg), - TripzCard( - child: Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - Text(l10n.aboutVersion, style: context.texts.bodyMedium), - Text( - BuildConfig.appName, - style: context.texts.bodyMedium?.copyWith( - color: context.colors.onSurfaceVariant, - ), - ), - ], - ), - ), - ], - ), - ); - } - - static Future _openWhatsapp(String phone) async { - final uri = Uri.parse('https://wa.me/$phone'); - await launchUrl(uri, mode: LaunchMode.externalApplication); - } - - /// فحص توافق الجهاز — نمط سيرو. يفحص ما يُعطّل التطبيق فعلاً: خدمة الموقع - /// وإذنها وإذن الإشعارات. أسبابٌ حقيقية لشكاوى «التطبيق لا يعمل». - static Future _showDeviceCheck(BuildContext context) async { - final l10n = context.l10n; - final issues = []; - - if (!await Geolocator.isLocationServiceEnabled()) { - issues.add(l10n.rideNoLocation); - } - final locationPermission = await Permission.locationWhenInUse.status; - if (!locationPermission.isGranted && !locationPermission.isLimited) { - issues.add(l10n.permissionDeniedForever); - } - if (await Permission.notification.isDenied) { - issues.add(l10n.notifDenied); - } - - if (!context.mounted) return; - showDialog( - context: context, - builder: (context) => AlertDialog( - title: Text(l10n.supportDeviceCheck), - content: Column( - mainAxisSize: MainAxisSize.min, - crossAxisAlignment: CrossAxisAlignment.start, - children: issues.isEmpty - ? [ - Row(children: [ - Icon(Icons.check_circle_rounded, - color: context.tripzColors.success), - const SizedBox(width: Space.xs), - Expanded(child: Text(l10n.supportDeviceOk)), - ]), - ] - : [ - Text(l10n.supportDeviceIssues), - const SizedBox(height: Space.xs), - for (final issue in issues) - Padding( - padding: const EdgeInsets.only(bottom: Space.xxs), - child: Row(children: [ - Icon(Icons.error_outline_rounded, - size: Sizes.iconSm, - color: context.tripzColors.warning), - const SizedBox(width: Space.xs), - Expanded(child: Text(issue)), - ]), - ), - ], - ), - actions: [ - TextButton( - onPressed: () => Navigator.of(context).pop(), - child: Text(l10n.actionContinue), - ), - ], - ), - ); - } -} diff --git a/apps/rider_new/lib/features/trip/cubit/history_cubit.dart b/apps/rider_new/lib/features/trip/cubit/history_cubit.dart deleted file mode 100644 index 3901e20..0000000 --- a/apps/rider_new/lib/features/trip/cubit/history_cubit.dart +++ /dev/null @@ -1,41 +0,0 @@ -import 'package:flutter_bloc/flutter_bloc.dart'; - -import '../../../core/api/api_exception.dart'; -import '../../../core/ui/view_status.dart'; -import '../data/history_repository.dart'; -import '../data/models/trip.dart'; - -class HistoryState { - const HistoryState({ - this.status = ViewStatus.idle, - this.trips = const [], - this.error, - }); - - final ViewStatus status; - final List trips; - final String? error; -} - -class HistoryCubit extends Cubit { - HistoryCubit(this._repo) : super(const HistoryState()); - - final HistoryRepository _repo; - - Future load() async { - emit(const HistoryState(status: ViewStatus.loading)); - try { - final trips = await _repo.trips(); - if (isClosed) return; - // قائمة فارغة ليست خطأ — لها حالتها الخاصة في TripzScaffold. - emit(HistoryState( - status: trips.isEmpty ? ViewStatus.empty : ViewStatus.success, - trips: trips, - )); - } on ApiException catch (e) { - if (!isClosed) { - emit(HistoryState(status: ViewStatus.error, error: e.message)); - } - } - } -} diff --git a/apps/rider_new/lib/features/trip/cubit/ride_cubit.dart b/apps/rider_new/lib/features/trip/cubit/ride_cubit.dart deleted file mode 100644 index d4ea8f1..0000000 --- a/apps/rider_new/lib/features/trip/cubit/ride_cubit.dart +++ /dev/null @@ -1,518 +0,0 @@ -import 'dart:async'; - -import 'package:flutter_bloc/flutter_bloc.dart'; - -import '../../../core/api/api_exception.dart'; -import '../../../core/config.dart'; -import '../../../core/location/location_service.dart'; -import '../../../core/realtime/realtime_service.dart'; -import '../data/maps_repository.dart'; -import '../data/models/fare_quote.dart'; -import '../data/models/geo_point.dart'; -import '../data/models/place.dart'; -import '../data/models/ride_type.dart'; -import '../data/models/trip.dart'; -import '../data/recent_places_store.dart'; -import '../data/trip_repository.dart'; -import 'ride_state.dart'; - -/// شاشة الراكب كاملة: التخطيط ← التسعيرة ← الطلب ← البحث ← الرحلة الجارية. -/// -/// لا حساب أجرة ولا قرار مطابقة هنا — الخادم مصدر الحقيقة (docs/23 §0.2). -/// دور الكيوبت جمع المدخلات وعرض ما يُعطى. -class RideCubit extends Cubit { - RideCubit({ - required TripRepository trips, - required MapsRepository maps, - required LocationService location, - required RealtimeService realtime, - required RecentPlacesStore recents, - }) : _trips = trips, - _maps = maps, - _location = location, - _realtime = realtime, - _recents = recents, - super(const RideState()); - - final TripRepository _trips; - final MapsRepository _maps; - final LocationService _location; - final RealtimeService _realtime; - final RecentPlacesStore _recents; - - StreamSubscription? _events; - Timer? _searchTimeout; - Timer? _searchPoll; - Timer? _debounce; - - @override - Future close() { - _events?.cancel(); - _searchTimeout?.cancel(); - _searchPoll?.cancel(); - _debounce?.cancel(); - return super.close(); - } - - // ── الإقلاع ──────────────────────────────────────────────────────────── - - Future init() async { - _events = _realtime.events.listen(_onRealtime); - await _realtime.connect(); - - // الكاميرا تتوسّط الموقع **فوراً**، ولا تنتظر العنوان — انتظارها كان - // باگ سيرو المُصلَح 2026-07-20. - unawaited(locateMe()); - unawaited(_loadRideTypes()); - unawaited(_resumeLiveTrip()); - } - - /// تُنادى عند الإقلاع وعند العودة للتطبيق — الإذن قد يُمنح من إعدادات - /// النظام بينما التطبيق في الخلفية. - Future locateMe() async { - final pos = await _location.current(); - if (pos == null || isClosed) { - // بلا موقع لا خريطة مفيدة — تُعرض الحالة كي يفهم المستخدم السبب. - if (!isClosed && state.origin == null) { - emit(state.copyWith(error: RideError.noLocation)); - } - return; - } - final point = GeoPoint(pos.lat, pos.lng); - emit(state.copyWith( - origin: point, - cameraTarget: point, - error: state.error == RideError.noLocation ? RideError.none : null, - )); - - final place = await _maps.reverse(point); - if (isClosed || place == null) return; - emit(state.copyWith(originLabel: place.label)); - } - - Future _loadRideTypes() async { - try { - final types = await _trips.rideTypes(); - if (isClosed || types.isEmpty) return; - emit(state.copyWith( - rideTypes: types, - selectedRideType: state.selectedRideType ?? types.first, - )); - // قد تصل الأنواع بعد رسم المسار — عندها تُسعَّر فوراً بلا تدخّل. - if (state.route != null && state.quotes.isEmpty) await _priceAll(); - } on ApiException { - // قائمة الأنواع ليست حاجزاً للخريطة — تُعاد المحاولة عند التأكيد. - } - } - - /// رحلة جارية من جلسة سابقة (التطبيق أُغلق أثناءها) تُستأنف بلا تدخّل. - Future _resumeLiveTrip() async { - try { - final live = (await _trips.mine()).where((t) => t.status.isLive); - if (isClosed || live.isEmpty) return; - _attachTrip(live.first); - } on ApiException { - // لا شيء يُستأنف — تجربة عادية لا خطأ يُعرض. - } - } - - // ── التخطيط ──────────────────────────────────────────────────────────── - - void couponChanged(String code) => emit(state.copyWith(couponCode: code)); - - void collapsePlanner() => emit(state.copyWith(phase: RidePhase.idle)); - - /// تبديل النوع **لا يُطلق نداءً**: كل الأنواع مسعَّرة مسبقاً في [_priceAll]. - void selectRideType(RideType type) { - emit(state.copyWith( - selectedRideType: type, - quote: state.quoteFor(type.code), - )); - } - - /// بحث نصّي عن مكان، بمهلة ارتداد: كل ضغطة زر لا تُطلق نداءً. - void searchPlaces(String query) { - _debounce?.cancel(); - if (query.trim().length < 2) { - emit(state.copyWith(searchResults: const [], searching: false)); - return; - } - emit(state.copyWith(searching: true)); - _debounce = Timer(const Duration(milliseconds: 350), () async { - try { - final results = await _maps.search(query, near: state.origin); - if (!isClosed) { - emit(state.copyWith(searchResults: results, searching: false)); - } - } on ApiException { - if (!isClosed) { - emit(state.copyWith(searchResults: const [], searching: false)); - } - } - }); - } - - /// الأماكن الأخيرة — تُقرأ في الشاشة، وتُحدَّث عند كل اختيار وجهة. - List get recentPlaces => _recents.items; - - Future pickPlace(Place place, PickTarget target) async { - // الوجهة وحدها تُحفظ: «الأخيرة» تعني أين ذهبتُ لا من أين انطلقت. - if (target == PickTarget.destination) unawaited(_recents.add(place)); - emit(state.copyWith( - origin: target == PickTarget.origin ? place.point : null, - originLabel: target == PickTarget.origin ? place.label : null, - destination: target == PickTarget.destination ? place.point : null, - destinationLabel: - target == PickTarget.destination ? place.label : null, - searchResults: const [], - cameraTarget: place.point, - )); - await _routeAndPrice(); - } - - /// اختيار من الخريطة: المستخدم يحرّك **الخريطة** لا الدبّوس (docs/39 §3). - void startMapPick(PickTarget target) => emit(state.copyWith( - phase: RidePhase.pickingOnMap, - pickTarget: target, - )); - - Future confirmMapPick(GeoPoint point) async { - final isOrigin = state.pickTarget == PickTarget.origin; - emit(state.copyWith( - phase: RidePhase.planning, - origin: isOrigin ? point : null, - destination: isOrigin ? null : point, - )); - - final place = await _maps.reverse(point); - if (isClosed) return; - emit(state.copyWith( - originLabel: isOrigin ? (place?.label ?? '') : null, - destinationLabel: isOrigin ? null : (place?.label ?? ''), - )); - await _routeAndPrice(); - } - - void addStop(GeoPoint stop) => - emit(state.copyWith(stops: [...state.stops, stop])); - - void removeStop(int index) { - final next = [...state.stops]..removeAt(index); - emit(state.copyWith(stops: next)); - } - - /// تراجع خطوة واحدة — المخرج الوحيد من شاشة التأكيد حين تفشل التسعيرة. - void back() { - switch (state.phase) { - case RidePhase.confirming: - emit(state.copyWith(phase: RidePhase.planning, error: RideError.none)); - case RidePhase.pickingOnMap: - case RidePhase.planning: - emit(state.copyWith(phase: RidePhase.idle, error: RideError.none)); - case RidePhase.idle: - case RidePhase.searching: - case RidePhase.active: - break; - } - } - - void clearDestination() => emit(state.copyWith( - clearDestination: true, - clearRoute: true, - phase: RidePhase.planning, - )); - - // ── المسار والتسعيرة ─────────────────────────────────────────────────── - - Future _routeAndPrice() async { - final from = state.origin; - final to = state.destination; - if (from == null || to == null) return; - - emit(state.copyWith(busy: true, error: RideError.none)); - try { - final route = await _maps.route(from, to); - if (isClosed) return; - emit(state.copyWith(route: route, phase: RidePhase.confirming)); - await _priceAll(); - } on ApiException { - if (!isClosed) { - emit(state.copyWith(busy: false, error: RideError.routeFailed)); - } - } - } - - /// يسعّر **كل الأنواع دفعةً واحدة** بعد اكتمال المسار. - /// - /// المسافة والمدة ثابتتان لكل الأنواع، فالفرق في التعرفة وحدها. النداءات - /// متوازية ومرة واحدة — لا نداء عند كل ضغطة نوع. - /// - /// التعرفة تحتاج مسافة ومدة محسوبتين لا إحداثيات، و`city` يجب أن تكون - /// `default` كما يبذرها الخادم — أي قيمة أخرى ترجّع 404 (docs/38 §7). - /// إعادة تسعير يدوية — مخرج المستخدم حين يفشل الحساب. - Future repriceAll() => _priceAll(); - - Future _priceAll() async { - final route = state.route; - final types = state.rideTypes; - if (route == null || types.isEmpty) return; - - emit(state.copyWith(busy: true)); - final results = await Future.wait( - types.map((type) async { - try { - final quote = await _trips.quote( - city: AppConfig.defaultCity, - serviceClass: type.code, - distanceKm: route.distanceKm, - durationMin: route.durationMin, - ); - // 200 بقيم `null` ليس نجاحاً — لا يُعرض رقم غير صالح للمستخدم. - return quote.isUsable ? MapEntry(type.code, quote) : null; - } on ApiException { - // نوعٌ بلا تعرفة نشطة لا يُسقط الباقي — يُخفى سعره وحده. - return null; - } - }), - ); - if (isClosed) return; - - final quotes = Map.fromEntries( - results.whereType>(), - ); - // إن كان المختار بلا تعرفة، ننتقل لأول نوع مسعَّر: تركُه مختاراً يعني - // زرَّ تأكيد معطّلاً بلا سبب ظاهر. - var selected = state.selectedRideType; - if (selected == null || !quotes.containsKey(selected.code)) { - selected = types.where((t) => quotes.containsKey(t.code)).firstOrNull; - } - - emit(state.copyWith( - quotes: quotes, - selectedRideType: selected, - quote: selected == null ? null : quotes[selected.code], - busy: false, - error: quotes.isEmpty ? RideError.quoteFailed : RideError.none, - )); - } - - // ── الطلب والبحث ─────────────────────────────────────────────────────── - - Future requestTrip() async { - final from = state.origin; - final to = state.destination; - final type = state.selectedRideType; - if (from == null || to == null || type == null) return; - - emit(state.copyWith(busy: true, error: RideError.none)); - try { - final res = await _trips.request( - origin: from, - destination: to, - serviceClass: type.code, - stops: state.stops, - couponCode: state.couponCode.trim().isEmpty - ? null - : state.couponCode.trim(), - ); - if (isClosed) return; - - // صفر سائقين = جواب نهائي فوري، لا داعي لانتظار مهلة كاملة. - if (res.offeredDrivers == 0) { - emit(state.copyWith( - busy: false, - error: RideError.noDrivers, - phase: RidePhase.confirming, - )); - unawaited(_trips.cancel(res.trip.id)); - return; - } - - _attachTrip(res.trip); - _startSearchGuards(res.trip.id); - } on ApiException { - if (!isClosed) { - emit(state.copyWith(busy: false, error: RideError.requestFailed)); - } - } - } - - /// حارسان أثناء البحث: - /// 1. **مهلة محليّة** — الخادم قد لا يُطلق `expired`/`no_drivers` أبداً - /// (ثغرة R1، docs/38 §4)، فبلا هذه المهلة تدور الشاشة إلى الأبد. - /// 2. **استطلاع دوري** — يلتقط القبول لو ضاع حدث `trip:update`. - void _startSearchGuards(String tripId) { - _searchTimeout?.cancel(); - _searchPoll?.cancel(); - - _searchTimeout = Timer(AppConfig.searchingTimeout, () async { - if (isClosed || state.phase != RidePhase.searching) return; - await cancelTrip(); - if (!isClosed) emit(state.copyWith(error: RideError.noDrivers)); - }); - - _searchPoll = Timer.periodic(const Duration(seconds: 5), (_) async { - if (isClosed || state.phase != RidePhase.searching) return; - try { - _attachTrip(await _trips.get(tripId)); - } on ApiException { - // الاستطلاع شبكة أمان لا مصدر حقيقة — فشلُه لا يُعرض. - } - }); - } - - Future cancelTrip() async { - final trip = state.trip; - if (trip == null) return; - _stopSearchGuards(); - try { - await _trips.cancel(trip.id); - } on ApiException { - // حتى لو فشل الإلغاء على الخادم، المستخدم خرج من الشاشة — وحالة - // الرحلة تُصحَّح عند الاستئناف التالي. - } - if (!isClosed) _resetToIdle(); - } - - void _stopSearchGuards() { - _searchTimeout?.cancel(); - _searchPoll?.cancel(); - _searchTimeout = null; - _searchPoll = null; - } - - void _resetToIdle() { - emit(state.copyWith( - phase: RidePhase.idle, - clearTrip: true, - clearRoute: true, - clearDestination: true, - busy: false, - stops: const [], - )); - } - - // ── الواقع اللحظي ────────────────────────────────────────────────────── - - void _attachTrip(Trip trip) { - // الانضمام قبل أي انتقال حالة، وإلا فاتت الأحداث (docs/38 §9). - _realtime.joinTrip(trip.id); - - if (trip.status.isOver) { - _stopSearchGuards(); - emit(state.copyWith( - trip: trip, - busy: false, - phase: RidePhase.idle, - error: trip.status == TripStatus.noDrivers || - trip.status == TripStatus.expired - ? RideError.noDrivers - : RideError.none, - )); - return; - } - - if (trip.status != TripStatus.searching) _stopSearchGuards(); - - emit(state.copyWith( - trip: trip, - busy: false, - phase: trip.status == TripStatus.searching - ? RidePhase.searching - : RidePhase.active, - )); - } - - // ── المحاكاة ─────────────────────────────────────────────────────────── - - /// عَلَم بناء: `--dart-define=SIMULATE_TRIP=true`. - /// - /// **`const` عمداً** — في بناء الإنتاج يصير الشرط ثابتاً زمن الترجمة - /// فيُحذف كل نداء محاكاة من الـbinary (نفس منطق `Features` في docs/23 §5). - static const bool simulationEnabled = - bool.fromEnvironment('SIMULATE_TRIP'); - - /// مدخل المحاكي — يمرّ بـ[_attachTrip] نفسه الذي يمرّ به `trip:update` - /// الحقيقي، فالشاشات لا تعرف الفرق ولا يُختبر مسارٌ ثانٍ. - void injectSimulatedTrip(Trip trip) { - if (!simulationEnabled || isClosed) return; - _stopSearchGuards(); - _attachTrip(trip); - } - - void injectSimulatedDriverLocation(GeoPoint point) { - if (!simulationEnabled || isClosed) return; - // نفس مسار الحدث الحقيقي — فمسار الاقتراب يُحسب في المحاكاة أيضاً. - _onDriverMoved(point); - } - - void _onRealtime(RealtimeEvent event) { - switch (event.name) { - case RealtimeEvent.tripUpdate: - final id = event.data['id'] ?? event.data['tripId']; - if (id != null && id != state.trip?.id) return; - _attachTrip(Trip.fromJson(event.data)); - - case RealtimeEvent.driverLocation: - final lat = event.data['lat']; - final lng = event.data['lng']; - if (lat is num && lng is num) { - _onDriverMoved(GeoPoint(lat.toDouble(), lng.toDouble())); - } - } - } - - // ── مسار الاقتراب ────────────────────────────────────────────────────── - - /// أقلّ إزاحة تستدعي إعادة رسم المسار، بالدرجات (~50 متراً). - /// - /// السائق يبثّ موقعه كل بضع ثوانٍ؛ نداءُ مسارٍ عند كل بثّة يعني عشرات - /// النداءات في الدقيقة بلا فرق مرئي. وهذا الحدّ يلتقط **تغيّر الاتجاه** - /// (انعطاف فعلي) ويتجاهل رجفة GPS في المكان. - static const double _redrawThreshold = 0.0005; - - GeoPoint? _lastPickupFrom; - bool _pickupRouting = false; - - void _onDriverMoved(GeoPoint point) { - emit(state.copyWith(driverLocation: point)); - - // المسار يُرسم أثناء الاقتراب فقط — بعد بدء الرحلة صار مسار الرحلة هو - // المعروض، ورسم خطٍّ للسائق إلى راكبٍ في سيارته بلا معنى. - final approaching = const { - TripStatus.assigned, - TripStatus.driverArriving, - }.contains(state.trip?.status); - if (!approaching) { - if (state.pickupRoute != null) { - emit(state.copyWith(clearPickupRoute: true)); - } - return; - } - - final rider = state.origin; - if (rider == null || _pickupRouting) return; - - final last = _lastPickupFrom; - final moved = last == null || - (point.lat - last.lat).abs() > _redrawThreshold || - (point.lng - last.lng).abs() > _redrawThreshold; - if (!moved) return; - - _lastPickupFrom = point; - unawaited(_routePickup(point, rider)); - } - - Future _routePickup(GeoPoint from, GeoPoint to) async { - _pickupRouting = true; - try { - final route = await _maps.route(from, to); - if (!isClosed) emit(state.copyWith(pickupRoute: route)); - } on ApiException { - // تعذّر المسار لا يُخفي السائق ولا يُعرض خطأً — البطاقة تبقى بلا - // وقتٍ ومسافة، والمحاولة تتكرّر مع الحركة التالية. - } finally { - _pickupRouting = false; - } - } -} diff --git a/apps/rider_new/lib/features/trip/cubit/ride_state.dart b/apps/rider_new/lib/features/trip/cubit/ride_state.dart deleted file mode 100644 index eaf41d1..0000000 --- a/apps/rider_new/lib/features/trip/cubit/ride_state.dart +++ /dev/null @@ -1,210 +0,0 @@ -import 'package:equatable/equatable.dart'; - -import '../data/models/fare_quote.dart'; -import '../data/models/geo_point.dart'; -import '../data/models/place.dart'; -import '../data/models/ride_type.dart'; -import '../data/models/route_info.dart'; -import '../data/models/trip.dart'; - -/// مراحل شاشة الراكب. المرحلة تحدّد ما يُعرض على الخريطة وما في الورقة -/// السفلية — «الشاشة مهمة واحدة» (docs/26 §8.1). -enum RidePhase { - /// الخريطة والبطاقة المطوية «إلى أين؟». - idle, - - /// المخطّط الموسّع: المصدر والوجهة والمحطات. - planning, - - /// المستخدم يحرّك الخريطة والدبّوس ثابت في المنتصف. - pickingOnMap, - - /// المسار والتسعيرة معروضان بانتظار التأكيد. - confirming, - - /// البحث عن سائق. - searching, - - /// رحلة جارية. - active, -} - -/// أيّ حقلٍ يلتقط اختيار الخريطة. -enum PickTarget { origin, destination } - -enum RideError { - none, - noDrivers, - quoteFailed, - routeFailed, - requestFailed, - - /// الموقع مرفوض أو الخدمة مطفأة — بلا موقع لا خريطة مفيدة. - noLocation, -} - -class RideState extends Equatable { - const RideState({ - this.phase = RidePhase.idle, - this.origin, - this.destination, - this.originLabel = '', - this.destinationLabel = '', - this.stops = const [], - this.rideTypes = const [], - this.selectedRideType, - this.route, - this.quote, - this.quotes = const {}, - this.trip, - this.driverLocation, - this.pickupRoute, - this.searchResults = const [], - this.searching = false, - this.busy = false, - this.error = RideError.none, - this.pickTarget = PickTarget.destination, - this.cameraTarget, - this.couponCode = '', - }); - - final RidePhase phase; - - final GeoPoint? origin; - final GeoPoint? destination; - final String originLabel; - final String destinationLabel; - final List stops; - - final List rideTypes; - final RideType? selectedRideType; - - final RouteInfo? route; - - /// تسعيرة النوع المختار — مشتقّة من [quotes] للراحة. - final FareQuote? quote; - - /// **كل الأنواع مسعَّرة دفعةً واحدة** بمفتاح `RideType.code`. - /// - /// الراكب يرى أسعار الاقتصادي والمريح والعائلي معاً فيقارن ويقرّر — بدل - /// نداء شبكة عند كل ضغطة نوع. المسافة والمدة ثابتتان للمسار، فالنداءات - /// متوازية ومرة واحدة. - final Map quotes; - - final Trip? trip; - - /// موقع السائق الحيّ من `driver:location`. - final GeoPoint? driverLocation; - - /// مسار **السائق ← الراكب** أثناء الاقتراب، ومنه الوقت والمسافة المعروضان. - /// - /// منفصل عن [route] (مسار الرحلة نفسها) لأنهما يُرسمان معاً بلونين - /// مختلفين، ولأن هذا يُعاد حسابه مع حركة السائق بينما ذاك ثابت. - final RouteInfo? pickupRoute; - - final List searchResults; - - /// بحث نصّي جارٍ — منفصل عن [busy] كي لا يقفل مؤشّرُ البحثِ الشاشةَ كلها. - final bool searching; - final bool busy; - - final RideError error; - final PickTarget pickTarget; - - /// وجهة الكاميرا حين يقودها المنطق لا المستخدم. - final GeoPoint? cameraTarget; - - /// كود الخصم — يُقيَّم على الخادم عند الطلب لا في التطبيق. - final String couponCode; - - /// تسعيرة نوعٍ بعينه — لعرض السعر تحت كل خيار. - FareQuote? quoteFor(String code) => quotes[code]; - - bool get canConfirm => - origin != null && - destination != null && - selectedRideType != null && - quote?.isUsable == true; - - RideState copyWith({ - RidePhase? phase, - GeoPoint? origin, - GeoPoint? destination, - String? originLabel, - String? destinationLabel, - List? stops, - List? rideTypes, - RideType? selectedRideType, - RouteInfo? route, - FareQuote? quote, - Map? quotes, - Trip? trip, - GeoPoint? driverLocation, - RouteInfo? pickupRoute, - List? searchResults, - bool? searching, - bool? busy, - RideError? error, - PickTarget? pickTarget, - GeoPoint? cameraTarget, - String? couponCode, - bool clearDestination = false, - bool clearRoute = false, - bool clearTrip = false, - bool clearCamera = false, - bool clearPickupRoute = false, - }) { - return RideState( - phase: phase ?? this.phase, - origin: origin ?? this.origin, - destination: clearDestination ? null : (destination ?? this.destination), - originLabel: originLabel ?? this.originLabel, - destinationLabel: clearDestination - ? '' - : (destinationLabel ?? this.destinationLabel), - stops: stops ?? this.stops, - rideTypes: rideTypes ?? this.rideTypes, - selectedRideType: selectedRideType ?? this.selectedRideType, - route: clearRoute ? null : (route ?? this.route), - quote: clearRoute ? null : (quote ?? this.quote), - quotes: clearRoute ? const {} : (quotes ?? this.quotes), - trip: clearTrip ? null : (trip ?? this.trip), - driverLocation: driverLocation ?? this.driverLocation, - pickupRoute: clearPickupRoute || clearRoute - ? null - : (pickupRoute ?? this.pickupRoute), - searchResults: searchResults ?? this.searchResults, - searching: searching ?? this.searching, - busy: busy ?? this.busy, - error: error ?? this.error, - pickTarget: pickTarget ?? this.pickTarget, - cameraTarget: clearCamera ? null : (cameraTarget ?? this.cameraTarget), - couponCode: couponCode ?? this.couponCode, - ); - } - - @override - List get props => [ - phase, - origin, - destination, - originLabel, - destinationLabel, - stops, - rideTypes, - selectedRideType, - route, - quote, - quotes, - trip, - driverLocation, - pickupRoute, - searchResults, - searching, - busy, - error, - pickTarget, - cameraTarget, - couponCode, - ]; -} diff --git a/apps/rider_new/lib/features/trip/cubit/trip_simulator.dart b/apps/rider_new/lib/features/trip/cubit/trip_simulator.dart deleted file mode 100644 index c4bfda3..0000000 --- a/apps/rider_new/lib/features/trip/cubit/trip_simulator.dart +++ /dev/null @@ -1,124 +0,0 @@ -import 'dart:async'; - -import '../data/models/geo_point.dart'; -import '../data/models/trip.dart'; -import 'ride_cubit.dart'; - -/// محاكي رحلة — يمشّي الرحلة عبر حالاتها **بلا تطبيق سائق**. -/// -/// ## لماذا يوجد -/// -/// شاشات ما بعد الطلب (`assigned` ← `driver_arriving` ← `driver_arrived` ← -/// `in_progress` ← `completed`) لا تظهر إلا حين يقبل سائقٌ حقيقي ويتقدّم في -/// الرحلة. ومراجعتها بصرياً كانت تعني تشغيل تطبيقين وحسابين وسائقاً متاحاً — -/// فبقيت غير مُراجَعة. -/// -/// ## ما يفعله وما لا يفعله -/// -/// **يحقن `Trip` في `RideCubit` عبر مسار الأحداث نفسه** الذي يسلكه -/// `trip:update` القادم من الخادم — أي أن الشاشات لا تعرف أنها محاكاة، ونفس -/// منطق `_attachTrip` ونفس الانتقالات تُختبر. لا شاشة وهمية ولا فرع `if -/// (simulated)` في أي ودجت. -/// -/// **لا يلمس الخادم**: لا رحلة تُنشأ ولا سائق يُحجز ولا مال يُحرَّك. ولذلك -/// هو أداة *مراجعة شكل* لا اختبار تكامل — ما يثبت هنا لا يثبت أن الخادم -/// يرسل نفس التتابع. -/// -/// ## الأمان -/// -/// محروس بـ[RideCubit.simulationEnabled] المشتقّ من `--dart-define`، وهو -/// `false` افتراضياً. في بناء الإنتاج الشرط ثابتٌ زمن الترجمة فيُحذف الكود. -class TripSimulator { - TripSimulator(this._cubit); - - final RideCubit _cubit; - Timer? _timer; - - /// الخطوات بترتيبها الواقعي ومدّة كل واحدة — مضغوطة كي تُراجَع الشاشات - /// في نصف دقيقة لا في رحلة كاملة. - static const _steps = <(TripStatus, Duration)>[ - (TripStatus.assigned, Duration(seconds: 4)), - (TripStatus.driverArriving, Duration(seconds: 5)), - (TripStatus.driverArrived, Duration(seconds: 4)), - (TripStatus.inProgress, Duration(seconds: 6)), - (TripStatus.completed, Duration(seconds: 3)), - ]; - - static const _driverName = 'سائق تجريبي'; - static const _driverPhone = '0790000000'; - - bool get isRunning => _timer != null; - - /// يبدأ من الحالة الحالية للكيوبت: المصدر والوجهة والأجرة الحقيقية إن - /// وُجدت، وإلا قيم معقولة كي تُملأ الشاشة. - void start() { - if (!RideCubit.simulationEnabled || isRunning) return; - - final state = _cubit.state; - final origin = state.origin ?? const GeoPoint(31.9539, 35.9106); - final destination = state.destination ?? - GeoPoint(origin.lat + 0.012, origin.lng + 0.012); - // المبالغ نصوص في `Trip` (docs/38 §12.2) بينما `FareQuote.total` رقم — - // التحويل هنا لا في الودجت. - final fare = state.quote?.total?.toStringAsFixed(2) ?? '2.50'; - final currency = state.quote?.currency.isNotEmpty == true - ? state.quote!.currency - : 'JOD'; - - var index = 0; - // موقع السائق يتحرّك نحو الراكب ثم نحو الوجهة — بلا حركة تبدو الخريطة - // معطّلة وتضيع نصف الفائدة من المراجعة. - var driver = GeoPoint(origin.lat - 0.006, origin.lng - 0.006); - - void emitStep() { - final (status, _) = _steps[index]; - _cubit.injectSimulatedTrip( - Trip( - id: 'sim-trip', - status: status, - origin: origin, - destination: destination, - quotedFare: fare, - priceForPassenger: fare, - currency: currency, - driverName: _driverName, - driverPhone: _driverPhone, - vehiclePlate: '12-3456', - vehicleModel: 'Toyota Corolla', - vehicleColor: 'أبيض', - vehicleColorHex: '#FFFFFF', - driverRating: '4.8', - ), - ); - - // بعد بدء الرحلة يتّجه السائق للوجهة لا للراكب. - final target = status == TripStatus.inProgress ? destination : origin; - driver = GeoPoint( - driver.lat + (target.lat - driver.lat) * 0.5, - driver.lng + (target.lng - driver.lng) * 0.5, - ); - _cubit.injectSimulatedDriverLocation(driver); - } - - void schedule() { - final (_, delay) = _steps[index]; - _timer = Timer(delay, () { - index++; - if (index >= _steps.length) { - _timer = null; - return; - } - emitStep(); - schedule(); - }); - } - - emitStep(); - schedule(); - } - - void stop() { - _timer?.cancel(); - _timer = null; - } -} diff --git a/apps/rider_new/lib/features/trip/data/history_repository.dart b/apps/rider_new/lib/features/trip/data/history_repository.dart deleted file mode 100644 index 7667b08..0000000 --- a/apps/rider_new/lib/features/trip/data/history_repository.dart +++ /dev/null @@ -1,18 +0,0 @@ -import '../../../core/api/api_client.dart'; -import 'models/trip.dart'; - -/// سجلّ الرحلات. لا يستورد ميزة الرحلة كمنطق — يعيد استعمال نموذجها فقط، -/// وهو الشكل الذي يرجّعه الخادم نفسه لكلا النقطتين. -class HistoryRepository { - HistoryRepository(this._api); - - final ApiClient _api; - - Future> trips() async { - final res = await _api.get>('/trips/mine'); - return res - .whereType>() - .map(Trip.fromJson) - .toList(growable: false); - } -} diff --git a/apps/rider_new/lib/features/trip/data/maps_repository.dart b/apps/rider_new/lib/features/trip/data/maps_repository.dart deleted file mode 100644 index b89c500..0000000 --- a/apps/rider_new/lib/features/trip/data/maps_repository.dart +++ /dev/null @@ -1,58 +0,0 @@ -import '../../../core/api/antlaq_api.dart'; -import 'models/geo_point.dart'; -import 'models/place.dart'; -import 'models/route_info.dart'; - -/// كل الخرائط من map-saas مباشرة (قرار 2026-07-20). نقاط `/maps/*` في باك إند -/// تريبز **لا تُستعمل** — إحداها (`geocode`) معطوبة على المنشور أصلاً. -class MapsRepository { - MapsRepository(this._api); - - final AntlaqApi _api; - - /// ⚠️ **الغلافان مختلفان بين النقطتين** (مثبت بـcurl 2026-08-05): - /// `search` يرجّع `{"results":[…]}` بينما `reverse` يرجّع **مصفوفة عارية**. - /// افتراض أن كليهما مصفوفة كان يُفشل البحث صامتاً — فيبدو للمستخدم أن - /// «البحث لا يستجيب» بينما التحديد من الخريطة يعمل. - Future> search(String query, {GeoPoint? near}) async { - if (query.trim().isEmpty) return const []; - final res = await _api.get>( - '/geocoding/search', - query: { - 'q': query.trim(), - if (near != null) 'lat': near.lat, - if (near != null) 'lng': near.lng, - }, - ); - final results = res['results']; - if (results is! List) return const []; - return results - .whereType>() - .map(Place.fromJson) - .toList(growable: false); - } - - /// يرجّع **مصفوفة** مرتّبة بالأقرب — الأول هو المطلوب. تفكيكها ككائن مفرد - /// كان باگ سيرو الذي أُصلح 2026-07-20. - Future reverse(GeoPoint point) async { - final res = await _api.get>( - '/geocoding/reverse', - query: {'lat': point.lat, 'lng': point.lng}, - ); - final first = res.whereType>().firstOrNull; - return first == null ? null : Place.fromJson(first); - } - - Future route(GeoPoint from, GeoPoint to) async { - final res = await _api.get>( - '/maps/route', - query: { - 'fromLat': from.lat, - 'fromLng': from.lng, - 'toLat': to.lat, - 'toLng': to.lng, - }, - ); - return RouteInfo.fromJson(res); - } -} diff --git a/apps/rider_new/lib/features/trip/data/models/fare_quote.dart b/apps/rider_new/lib/features/trip/data/models/fare_quote.dart deleted file mode 100644 index 898993c..0000000 --- a/apps/rider_new/lib/features/trip/data/models/fare_quote.dart +++ /dev/null @@ -1,42 +0,0 @@ -import 'package:equatable/equatable.dart'; - -/// تسعيرة مسبقة من `POST /tariff/quote`. -/// -/// ⚠️ مصيدتان مثبتتان (docs/38 §7): -/// 1. هذه النقطة **camelCase وحدها** بخلاف كل الـAPI. -/// 2. بالمعاملات الخطأ ترجّع **200 بقيم `null` صامتة** لا خطأً — لذلك -/// [isUsable] شرطٌ قبل عرض أي رقم للمستخدم. -class FareQuote extends Equatable { - const FareQuote({ - required this.total, - required this.currency, - this.subtotal, - this.surgeMultiplier = 1, - this.window = '', - }); - - final double? total; - final String currency; - final double? subtotal; - final double surgeMultiplier; - final String window; - - factory FareQuote.fromJson(Map json) { - final quote = (json['quote'] as Map?) ?? const {}; - return FareQuote( - total: (quote['total'] as num?)?.toDouble(), - currency: quote['currency'] as String? ?? '', - subtotal: (quote['subtotal'] as num?)?.toDouble(), - surgeMultiplier: (quote['surgeMultiplier'] as num?)?.toDouble() ?? 1, - window: quote['window'] as String? ?? '', - ); - } - - bool get isUsable => total != null && total! > 0; - - /// تسعير مرتفع — يُعرض للمستخدم صراحةً قبل التأكيد لا بعده. - bool get hasSurge => surgeMultiplier > 1; - - @override - List get props => [total, currency, subtotal, surgeMultiplier]; -} diff --git a/apps/rider_new/lib/features/trip/data/models/geo_point.dart b/apps/rider_new/lib/features/trip/data/models/geo_point.dart deleted file mode 100644 index b9a5f3a..0000000 --- a/apps/rider_new/lib/features/trip/data/models/geo_point.dart +++ /dev/null @@ -1,22 +0,0 @@ -import 'package:equatable/equatable.dart'; - -/// إحداثية في طبقة النطاق — **مستقلة عن حزمة الخريطة** عمداً. -/// -/// الكيوبت والمستودع لا يعرفان `intaleq_maps`؛ التحويل يقع في الواجهة وحدها. -/// تغيير محرّك الخريطة لاحقاً لا يلمس منطقاً. -class GeoPoint extends Equatable { - const GeoPoint(this.lat, this.lng); - - final double lat; - final double lng; - - factory GeoPoint.fromJson(Map json) => GeoPoint( - (json['lat'] as num).toDouble(), - (json['lng'] as num).toDouble(), - ); - - Map toJson() => {'lat': lat, 'lng': lng}; - - @override - List get props => [lat, lng]; -} diff --git a/apps/rider_new/lib/features/trip/data/models/place.dart b/apps/rider_new/lib/features/trip/data/models/place.dart deleted file mode 100644 index 547c39f..0000000 --- a/apps/rider_new/lib/features/trip/data/models/place.dart +++ /dev/null @@ -1,44 +0,0 @@ -import 'package:equatable/equatable.dart'; - -import 'geo_point.dart'; - -/// مكان من map-saas. حقول الاسم `name`/`name_ar`/`address` — **لا -/// `formattedAddress`** (عقد مثبت بـcurl، راجع قرار الخرائط 2026-07-20). -class Place extends Equatable { - const Place({ - required this.id, - required this.name, - required this.point, - this.address = '', - this.category = '', - }); - - final String id; - final String name; - final GeoPoint point; - final String address; - final String category; - - factory Place.fromJson(Map json) { - return Place( - id: json['id']?.toString() ?? '', - // العربي أولاً — الواجهة عربية افتراضاً، والإنجليزي احتياط. - name: (json['name_ar'] as String?)?.trim().isNotEmpty == true - ? json['name_ar'] as String - : (json['name'] as String? ?? ''), - // `address` قد يصل `null` صراحةً من map-saas — لا يُسقِط النتيجة. - address: json['address'] as String? ?? '', - category: json['category'] as String? ?? '', - point: GeoPoint( - (json['latitude'] as num).toDouble(), - (json['longitude'] as num).toDouble(), - ), - ); - } - - /// ما يُعرض في حقل العنوان: الاسم، وإن غاب فالعنوان. - String get label => name.isNotEmpty ? name : address; - - @override - List get props => [id, name, point, address]; -} diff --git a/apps/rider_new/lib/features/trip/data/models/ride_type.dart b/apps/rider_new/lib/features/trip/data/models/ride_type.dart deleted file mode 100644 index eaf80e5..0000000 --- a/apps/rider_new/lib/features/trip/data/models/ride_type.dart +++ /dev/null @@ -1,47 +0,0 @@ -import 'package:equatable/equatable.dart'; - -/// نوع الرحلة كما يرجّعه `GET /ride-types` (شكل مُتحقَّق حيّاً، docs/38 §7). -/// **شاشة الاختيار تُبنى من هنا** — لا قائمة مكتوبة في التطبيق. -class RideType extends Equatable { - const RideType({ - required this.id, - required this.code, - required this.nameAr, - required this.nameEn, - required this.vehicleKind, - required this.womenOnly, - required this.roundTripSupported, - required this.sort, - this.icon, - }); - - final String id; - final String code; - final String nameAr; - final String nameEn; - final String vehicleKind; - final bool womenOnly; - final bool roundTripSupported; - final int sort; - final String? icon; - - factory RideType.fromJson(Map json) { - return RideType( - id: json['id'] as String, - code: json['code'] as String, - nameAr: json['name_ar'] as String? ?? '', - nameEn: json['name_en'] as String? ?? '', - vehicleKind: json['vehicle_kind'] as String? ?? 'car', - womenOnly: json['women_only'] as bool? ?? false, - roundTripSupported: json['round_trip_supported'] as bool? ?? false, - sort: (json['sort'] as num?)?.toInt() ?? 0, - icon: json['icon'] as String?, - ); - } - - String nameFor(String languageCode) => - languageCode == 'ar' ? nameAr : (nameEn.isEmpty ? nameAr : nameEn); - - @override - List get props => [id, code, sort]; -} diff --git a/apps/rider_new/lib/features/trip/data/models/route_info.dart b/apps/rider_new/lib/features/trip/data/models/route_info.dart deleted file mode 100644 index b913802..0000000 --- a/apps/rider_new/lib/features/trip/data/models/route_info.dart +++ /dev/null @@ -1,33 +0,0 @@ -import 'package:equatable/equatable.dart'; - -/// مسار من map-saas. المسار نفسه **encoded polyline** في حقل `points`، -/// ويُفكّ في الواجهة لا هنا (طبقة النطاق لا تعرف حزمة الخريطة). -class RouteInfo extends Equatable { - const RouteInfo({ - required this.distanceMeters, - required this.durationSeconds, - required this.encodedPoints, - this.name = '', - }); - - final double distanceMeters; - final int durationSeconds; - final String encodedPoints; - final String name; - - factory RouteInfo.fromJson(Map json) { - return RouteInfo( - distanceMeters: (json['distance'] as num?)?.toDouble() ?? 0, - durationSeconds: (json['duration'] as num?)?.round() ?? 0, - encodedPoints: json['points'] as String? ?? '', - name: json['routeName'] as String? ?? '', - ); - } - - /// التعرفة تُطلب بالكيلومترات والدقائق (docs/38 §7). - double get distanceKm => distanceMeters / 1000; - double get durationMin => durationSeconds / 60; - - @override - List get props => [distanceMeters, durationSeconds, encodedPoints]; -} diff --git a/apps/rider_new/lib/features/trip/data/models/trip.dart b/apps/rider_new/lib/features/trip/data/models/trip.dart deleted file mode 100644 index 28ee48b..0000000 --- a/apps/rider_new/lib/features/trip/data/models/trip.dart +++ /dev/null @@ -1,178 +0,0 @@ -import 'package:equatable/equatable.dart'; - -import 'geo_point.dart'; - -/// حالات الرحلة كما يعرّفها الخادم (docs/38 §4). -enum TripStatus { - searching, - assigned, - driverArriving, - driverArrived, - inProgress, - completed, - paid, - cancelled, - expired, - noDrivers, - unknown; - - static TripStatus parse(String? raw) => switch (raw) { - 'searching' => TripStatus.searching, - 'assigned' => TripStatus.assigned, - 'driver_arriving' => TripStatus.driverArriving, - 'driver_arrived' => TripStatus.driverArrived, - 'in_progress' => TripStatus.inProgress, - 'completed' => TripStatus.completed, - 'paid' => TripStatus.paid, - 'cancelled' => TripStatus.cancelled, - 'expired' => TripStatus.expired, - 'no_drivers' => TripStatus.noDrivers, - _ => TripStatus.unknown, - }; - - String get wire => switch (this) { - TripStatus.driverArriving => 'driver_arriving', - TripStatus.driverArrived => 'driver_arrived', - TripStatus.inProgress => 'in_progress', - TripStatus.noDrivers => 'no_drivers', - _ => name, - }; - - /// رحلة جارية تُستأنف عند فتح التطبيق. - bool get isLive => const { - TripStatus.searching, - TripStatus.assigned, - TripStatus.driverArriving, - TripStatus.driverArrived, - TripStatus.inProgress, - }.contains(this); - - bool get isOver => const { - TripStatus.completed, - TripStatus.paid, - TripStatus.cancelled, - TripStatus.expired, - TripStatus.noDrivers, - }.contains(this); -} - -class Trip extends Equatable { - const Trip({ - required this.id, - required this.status, - this.origin, - this.destination, - this.quotedFare, - this.priceForPassenger, - this.priceForDriver, - this.currency = '', - this.driverName, - this.driverPhone, - this.vehiclePlate, - this.vehicleModel, - this.vehicleColor, - this.vehicleColorHex, - this.driverRating, - this.requestedAt, - this.distanceKm, - this.durationMin, - this.paymentMethod, - this.serviceClass, - }); - - final String id; - final TripStatus status; - final GeoPoint? origin; - final GeoPoint? destination; - - /// أجرة مقفولة عند الطلب. - final String? quotedFare; - - /// **حقلان منفصلان** لا حقل واحد — الفرق هو العمولة (docs/38 §4). - final String? priceForPassenger; - final String? priceForDriver; - - final String currency; - final String? driverName; - final String? driverPhone; - final String? vehiclePlate; - final String? vehicleModel; - - /// لون المركبة كاسم (`White`, `أبيض`) — **ما يبحث عنه الراكب في الشارع - /// قبل اللوحة**. الخادم يرسله في `vehicle.color` - /// (`trips.service.ts:427`). - final String? vehicleColor; - - /// اللون كـhex إن وُجد (`vehicles` عندها `color_hex`). يُقدَّم على الاسم - /// عند الرسم لأنه دقيق، والاسم يبقى للعرض النصّي. - final String? vehicleColorHex; - - final String? driverRating; - - // ── حقول السجلّ ──────────────────────────────────────────────────────── - // كلها موجودة في `trip.entity.ts` وتصل مع `GET /trips/mine`، وكانت - // مُهمَلة في القراءة — فبدت بطاقة «رحلاتي» فارغة إلا من سعر وحالة. - - /// وقت الطلب (`requested_at`, `CreateDateColumn`). - final DateTime? requestedAt; - - final double? distanceKm; - final double? durationMin; - - /// `cash` افتراضاً في الخادم — يُعرض كي يعرف الراكب كيف دفع. - final String? paymentMethod; - - /// نوع الخدمة (`economy` افتراضاً). - final String? serviceClass; - - factory Trip.fromJson(Map json) { - GeoPoint? point(String key) { - final v = json[key]; - return v is Map ? GeoPoint.fromJson(v) : null; - } - - final driver = json['driver'] as Map?; - // المركبة تصل بشكلين: مسطّحة (`vehicle_plate`) في ردّ الرحلة، ومتداخلة - // (`vehicle: {plate, color}`) في حدث `assigned` (`trips.service.ts:423`). - // القراءة تقبل الاثنين بدل أن تُفرغ البطاقة عند أحدهما. - final vehicle = (json['vehicle'] ?? driver?['vehicle']) - as Map?; - return Trip( - id: json['id'] as String, - status: TripStatus.parse(json['status'] as String?), - origin: point('origin'), - destination: point('destination'), - // كل المبالغ نصوص (docs/38 §12.2) — تُحفظ كما وصلت ولا تُحوَّل هنا. - quotedFare: json['quoted_fare']?.toString(), - priceForPassenger: json['price_for_passenger']?.toString(), - priceForDriver: json['price_for_driver']?.toString(), - currency: json['currency'] as String? ?? '', - driverName: driver?['name'] as String? ?? json['driver_name'] as String?, - driverPhone: - driver?['phone'] as String? ?? json['driver_phone'] as String?, - vehiclePlate: vehicle?['plate'] as String? ?? - driver?['vehicle_plate'] as String? ?? - json['vehicle_plate'] as String?, - vehicleModel: vehicle?['model'] as String? ?? - driver?['vehicle_model'] as String? ?? - json['vehicle_model'] as String?, - vehicleColor: vehicle?['color'] as String? ?? - driver?['vehicle_color'] as String? ?? - json['vehicle_color'] as String?, - vehicleColorHex: vehicle?['color_hex'] as String? ?? - driver?['vehicle_color_hex'] as String? ?? - json['vehicle_color_hex'] as String?, - driverRating: driver?['rating']?.toString(), - requestedAt: DateTime.tryParse(json['requested_at']?.toString() ?? ''), - // المسافة الفعلية أدقّ من المقدّرة حين تتوفّر بعد انتهاء الرحلة. - distanceKm: (json['actual_distance_km'] as num?)?.toDouble() ?? - (json['distance_km'] as num?)?.toDouble(), - durationMin: (json['duration_min'] as num?)?.toDouble(), - paymentMethod: json['payment_method'] as String?, - serviceClass: json['service_class'] as String?, - ); - } - - @override - List get props => [id, status, priceForPassenger, driverName]; -} diff --git a/apps/rider_new/lib/features/trip/data/recent_places_store.dart b/apps/rider_new/lib/features/trip/data/recent_places_store.dart deleted file mode 100644 index b002e58..0000000 --- a/apps/rider_new/lib/features/trip/data/recent_places_store.dart +++ /dev/null @@ -1,74 +0,0 @@ -import 'dart:convert'; - -import 'package:shared_preferences/shared_preferences.dart'; - -import 'models/geo_point.dart'; -import 'models/place.dart'; - -/// الوجهات الأخيرة — **محلّية**، كما في سيرو -/// (`rp_favorites.dart: RpRecentsRow` + جدول `recentLocations`). -/// -/// أكثر رحلات الراكب تتكرّر: البيت، العمل، بيت الأهل. وبلا هذا يعيد كتابة -/// الاسم نفسه كل مرة — وهي أكبر خطوة ضائعة في الشاشة الرئيسية. -/// -/// محلّي لا خادمي عن قصد: `GET /trips/mine` يرجّع رحلات لا **أماكن** -/// (بلا اسم الوجهة)، فبناء «الأخيرة» عليه يعطي أسطراً بلا عناوين. -class RecentPlacesStore { - static const _key = 'recent_places'; - - /// خمسة تكفي صفّاً أفقياً واحداً؛ أكثر منها يصير قائمةً تُتصفَّح لا تُلمح. - static const _max = 5; - - List _items = const []; - List get items => _items; - - Future load() async { - final prefs = await SharedPreferences.getInstance(); - final raw = prefs.getString(_key); - if (raw == null || raw.isEmpty) return; - try { - final list = jsonDecode(raw) as List; - _items = list - .whereType>() - .map(_decode) - .toList(growable: false); - } catch (_) { - _items = const []; - } - } - - /// يضيف المكان في الصدارة، ويزيح تكراره إن سبق — لا يتكدّس نفس المكان. - Future add(Place place) async { - if (place.label.isEmpty) return; - _items = [ - place, - ..._items.where((p) => p.id != place.id || p.label != place.label), - ].take(_max).toList(growable: false); - - final prefs = await SharedPreferences.getInstance(); - await prefs.setString( - _key, - jsonEncode(_items.map(_encode).toList(growable: false)), - ); - } - - static Map _encode(Place p) => { - 'id': p.id, - 'name': p.name, - 'address': p.address, - 'category': p.category, - 'lat': p.point.lat, - 'lng': p.point.lng, - }; - - static Place _decode(Map json) => Place( - id: json['id']?.toString() ?? '', - name: json['name'] as String? ?? '', - address: json['address'] as String? ?? '', - category: json['category'] as String? ?? '', - point: GeoPoint( - (json['lat'] as num?)?.toDouble() ?? 0, - (json['lng'] as num?)?.toDouble() ?? 0, - ), - ); -} diff --git a/apps/rider_new/lib/features/trip/data/trip_repository.dart b/apps/rider_new/lib/features/trip/data/trip_repository.dart deleted file mode 100644 index 9b1afe9..0000000 --- a/apps/rider_new/lib/features/trip/data/trip_repository.dart +++ /dev/null @@ -1,128 +0,0 @@ -import '../../../core/api/api_client.dart'; -import 'models/fare_quote.dart'; -import 'models/geo_point.dart'; -import 'models/ride_type.dart'; -import 'models/trip.dart'; - -class TripRepository { - TripRepository(this._api); - - final ApiClient _api; - - Future> rideTypes() async { - final res = await _api.get>('/ride-types'); - return res - .whereType>() - .map(RideType.fromJson) - .where((t) => true) - .toList(growable: false) - ..sort((a, b) => a.sort.compareTo(b.sort)); - } - - /// ⚠️ camelCase وحدها في كل الـAPI، وتحتاج **مسافة ومدة محسوبتين مسبقاً** - /// من `/maps/route` — إرسال الإحداثيات يرجّع 200 بقيم `null` صامتة - /// (docs/38 §7). - Future quote({ - required String city, - required String serviceClass, - required double distanceKm, - required double durationMin, - }) async { - final res = await _api.post>( - '/tariff/quote', - body: { - 'city': city, - 'serviceClass': serviceClass, - 'distanceKm': distanceKm, - 'durationMin': durationMin, - }, - ); - return FareQuote.fromJson(res); - } - - /// يرجّع الرحلة وعدد السائقين الذين عُرضت عليهم — الصفر يعني «لا سائقين - /// قريبين» فوراً، بلا انتظار مهلة. - Future<({Trip trip, int offeredDrivers})> request({ - required GeoPoint origin, - required GeoPoint destination, - required String serviceClass, - String paymentMethod = 'wallet', - List stops = const [], - String? couponCode, - bool isRoundTrip = false, - }) async { - final res = await _api.post>('/trips', body: { - 'origin': origin.toJson(), - 'destination': destination.toJson(), - 'service_class': serviceClass, - 'payment_method': paymentMethod, - 'is_round_trip': isRoundTrip, - if (stops.isNotEmpty) - 'stops': stops.map((s) => s.toJson()).toList(growable: false), - 'coupon_code': ?couponCode, - }); - return ( - trip: Trip.fromJson(res['trip'] as Map), - offeredDrivers: (res['offeredDrivers'] as num?)?.toInt() ?? 0, - ); - } - - Future get(String tripId) async { - final res = await _api.get>('/trips/$tripId'); - return Trip.fromJson(res); - } - - Future> mine() async { - final res = await _api.get>('/trips/mine'); - return res - .whereType>() - .map(Trip.fromJson) - .toList(growable: false); - } - - Future cancel(String tripId) => - _api.post>('/trips/$tripId/cancel'); - - // ── طرف السائق ───────────────────────────────────────────────────────── - - Future> available() async { - final res = await _api.get>('/trips/available'); - return res - .whereType>() - .map(Trip.fromJson) - .toList(growable: false); - } - - Future accept(String tripId) => - _api.post>('/trips/$tripId/accept'); - - Future setOnline(bool online) => _api.patch>( - '/drivers/status', - body: {'online': online}, - ); - - /// نبضة الموقع إلى Redis — أساس المطابقة. مرشّح المسافة في - /// `LocationService` يمنع إغراقها. - Future pushLocation(GeoPoint point, {double? heading, double? speed}) => - _api.post>('/drivers/location', body: { - ...point.toJson(), - 'heading': ?heading, - 'speed': ?speed, - }); - - /// الرصيد التشغيلي. للراكب يرجّع 403 `Not a driver` — لا يُنادى إلا من - /// تطبيق السائق (docs/38 §5). - Future<({String balance, bool blocked})> credit() async { - final res = await _api.get>('/credit'); - return ( - balance: res['balance']?.toString() ?? '0', - blocked: res['blocked'] as bool? ?? false, - ); - } - - Future updateStatus(String tripId, TripStatus status) => - _api.patch>( - '/trips/$tripId/status', - body: {'status': status.wire}, - ); -} diff --git a/apps/rider_new/lib/features/trip/view/history_page.dart b/apps/rider_new/lib/features/trip/view/history_page.dart deleted file mode 100644 index 19381a1..0000000 --- a/apps/rider_new/lib/features/trip/view/history_page.dart +++ /dev/null @@ -1,193 +0,0 @@ -import 'package:flutter/material.dart'; -import 'package:flutter_bloc/flutter_bloc.dart'; -import 'package:intl/intl.dart'; - -import '../../../core/design/tokens.dart'; -import '../../../core/design/tripz_colors.dart'; -import '../../../core/design/typography.dart'; -import '../../../core/di.dart'; -import '../../../core/format/money.dart'; -import '../../../core/l10n/l10n.dart'; -import '../../../core/ui/empty_view.dart'; -import '../../../core/ui/tripz_card.dart'; -import '../../../core/ui/tripz_scaffold.dart'; -import '../cubit/history_cubit.dart'; -import '../data/models/trip.dart'; - -class HistoryPage extends StatefulWidget { - const HistoryPage({super.key}); - - @override - State createState() => _HistoryPageState(); -} - -class _HistoryPageState extends State { - late final HistoryCubit _cubit = sl()..load(); - - @override - void dispose() { - _cubit.close(); - super.dispose(); - } - - @override - Widget build(BuildContext context) { - final l10n = context.l10n; - return BlocProvider.value( - value: _cubit, - child: BlocBuilder( - builder: (context, state) => TripzScaffold( - title: l10n.historyTitle, - status: state.status, - error: state.error, - onRetry: _cubit.load, - empty: EmptyView( - icon: Icons.route_outlined, - message: l10n.historyEmpty, - ), - child: ListView.separated( - itemCount: state.trips.length, - separatorBuilder: (context, i) => const SizedBox(height: Space.xs), - itemBuilder: (context, i) => _TripCard(trip: state.trips[i]), - ), - ), - ), - ); - } -} - -/// بطاقة رحلة في السجلّ. -/// -/// كانت ثلاثة عناصر فقط (نقطة · حالة · سعر) — بلا تاريخ ولا مسافة ولا طريقة -/// دفع، رغم أن الخادم يرسلها كلها في `GET /trips/mine` -/// (`trip.entity.ts`: `requested_at`, `distance_km`, `duration_min`, -/// `payment_method`, `service_class`). البطاقة الآن تقرأ ما كان يصل ويُهمَل. -/// -/// **العناوين النصّية غائبة عمداً**: `trip.entity.ts` يخزّن إحداثيات -/// (`origin_lat/lng`) بلا `origin_address`، فسيرو يعرض عناوين ونحن لا نقدر -/// حتى يُضاف الحقل على الخادم. عرضُ إحداثيات خام للراكب أسوأ من لا شيء. -class _TripCard extends StatelessWidget { - const _TripCard({required this.trip}); - - final Trip trip; - - @override - Widget build(BuildContext context) { - final l10n = context.l10n; - final colors = context.tripzColors; - - final (label, color) = switch (trip.status) { - TripStatus.completed || TripStatus.paid => ( - l10n.historyStatusCompleted, - colors.success, - ), - TripStatus.cancelled || - TripStatus.expired || - TripStatus.noDrivers => - (l10n.historyStatusCancelled, colors.danger), - _ => (l10n.historyStatusLive, colors.info), - }; - - // سطر التفاصيل: ما توفّر منه فقط، بفواصل — رحلة ملغاة بلا مسافة لا - // تعرض «0 كم». - final details = [ - if (trip.distanceKm != null && trip.distanceKm! > 0) - l10n.rideDistanceKm(trip.distanceKm!.toStringAsFixed(1)), - if (trip.durationMin != null && trip.durationMin! > 0) - l10n.rideEta(trip.durationMin!.round().toString()), - ].join(' · '); - - return TripzCard( - child: Column( - crossAxisAlignment: CrossAxisAlignment.stretch, - children: [ - Row( - children: [ - Container( - width: 8, - height: 8, - decoration: BoxDecoration(color: color, shape: BoxShape.circle), - ), - const SizedBox(width: Space.sm), - Expanded( - child: Text( - label, - style: context.texts.bodyMedium?.copyWith(color: color), - ), - ), - Text( - Money.format( - trip.priceForPassenger ?? trip.quotedFare, - trip.currency, - ), - style: numericStyle(context.texts.titleSmall), - ), - ], - ), - if (trip.requestedAt != null) ...[ - const SizedBox(height: Space.xs), - Text( - DateFormat.yMMMd().add_jm().format(trip.requestedAt!.toLocal()), - style: context.texts.bodySmall?.copyWith( - color: context.colors.onSurfaceVariant, - ), - ), - ], - if (details.isNotEmpty || trip.paymentMethod != null) ...[ - const SizedBox(height: Space.xs), - Row( - children: [ - if (details.isNotEmpty) - Expanded( - child: Text( - details, - style: numericStyle(context.texts.bodySmall).copyWith( - color: context.colors.onSurfaceVariant, - ), - ), - ) - else - const Spacer(), - if (trip.paymentMethod != null) - _Tag(text: _paymentLabel(context, trip.paymentMethod!)), - ], - ), - ], - ], - ), - ); - } - - /// طرق الدفع المعروفة تُترجم؛ وأي قيمة جديدة من الخادم تُعرض كما هي بدل - /// أن تختفي. - String _paymentLabel(BuildContext context, String method) { - final l10n = context.l10n; - return switch (method) { - 'cash' => l10n.paymentCash, - 'wallet' => l10n.paymentWallet, - _ => method, - }; - } -} - -/// شارة صغيرة — طريقة الدفع في السجلّ. -class _Tag extends StatelessWidget { - const _Tag({required this.text}); - - final String text; - - @override - Widget build(BuildContext context) { - return Container( - padding: const EdgeInsets.symmetric( - horizontal: Space.xs, - vertical: Space.xxs / 2, - ), - decoration: BoxDecoration( - color: context.colors.surfaceContainerHighest, - borderRadius: Radii.field_, - ), - child: Text(text, style: context.texts.labelSmall), - ); - } -} diff --git a/apps/rider_new/lib/features/trip/view/ride_page.dart b/apps/rider_new/lib/features/trip/view/ride_page.dart deleted file mode 100644 index 3061a4e..0000000 --- a/apps/rider_new/lib/features/trip/view/ride_page.dart +++ /dev/null @@ -1,466 +0,0 @@ -import 'package:flutter/material.dart'; -import 'package:flutter_bloc/flutter_bloc.dart'; - -import '../../../core/design/tokens.dart'; -import '../../../core/design/tripz_colors.dart'; -import '../../../core/di.dart'; -import '../../../core/l10n/l10n.dart'; -import '../../../core/ui/app_drawer.dart'; -import '../../../core/ui/status_banner.dart'; -import '../../../core/ui/tripz_button.dart'; -import '../cubit/ride_cubit.dart'; -import '../cubit/ride_state.dart'; -import '../cubit/trip_simulator.dart'; -import '../data/models/geo_point.dart'; -import '../data/models/route_info.dart'; -import 'widgets/active_trip_sheet.dart'; -import 'widgets/center_pin.dart'; -import 'widgets/confirm_sheet.dart'; -import 'widgets/place_search_dialog.dart'; -import 'widgets/planner_sheet.dart'; -import 'widgets/ride_map.dart'; -import 'widgets/searching_sheet.dart'; - -/// شاشة الراكب: خريطة ثابتة + ورقة سفلية تتبدّل بالمرحلة (docs/39 §3). -/// -/// الخريطة **لا تُعاد بناؤها** عند تبدّل الورقة: هي خارج الـ`BlocBuilder` -/// الذي يبني الورقة، ولها `BlocSelector` خاص بما تحتاجه وحدها. هذا هو الفرق -/// بين خريطة سلسة وأخرى تهتزّ عند كل تحديث حالة. -class RidePage extends StatefulWidget { - const RidePage({super.key}); - - @override - State createState() => _RidePageState(); -} - -/// نصيب الورقة السفلية من ارتفاع الشاشة — الخريطة تأخذ ما تبقّى (~67%). -/// -/// قرار المالك 2026-08-05: الخريطة تُرفع عن القاع بالثلث كي تبقى مساحة -/// الورقة خالصة لها. سيرو يرفعها بـ20%، وتريبز بـ33% لأن ورقته تعرض -/// خطوطاً أكثر (الخط الزمني + الأنواع + السعر). -const double _sheetFraction = 0.33; - -class _RidePageState extends State with WidgetsBindingObserver { - late final RideCubit _cubit = sl()..init(); - late final TripSimulator _simulator = TripSimulator(_cubit); - GeoPoint? _mapCenter; - - @override - void initState() { - super.initState(); - WidgetsBinding.instance.addObserver(this); - } - - @override - void dispose() { - WidgetsBinding.instance.removeObserver(this); - _simulator.stop(); - _cubit.close(); - super.dispose(); - } - - @override - void didChangeAppLifecycleState(AppLifecycleState lifecycle) { - // الإذن قد يُمنح من إعدادات النظام والتطبيق في الخلفية — نلتقطه عند - // العودة بدل أن تبقى الخريطة على الموقع الاحتياطي. - if (lifecycle == AppLifecycleState.resumed && _cubit.state.origin == null) { - _cubit.locateMe(); - } - } - - @override - Widget build(BuildContext context) { - return BlocProvider.value( - value: _cubit, - child: Scaffold( - drawer: const AppDrawer(), - body: Stack( - children: [ - // ── الخريطة ──────────────────────────────────────────────── - // - // **مرفوعة عن القاع بمقدار [_sheetFraction]** لا مالئةً الشاشة: - // الثلث السفلي مساحة الورقة وحدها، فلا تغطّي الورقةُ الخريطةَ - // (نمط سيرو — `Positioned(bottom: Get.height * .2, top: 0)` في - // `google_map_passenger_widget.dart`). - // - // والدبّوس **داخل نفس المنطقة** لا في الـ`Stack` الخارجي: مركز - // الكاميرا (`onCameraIdle`) هو مركز ودجت الخريطة، فلو بقي - // الدبّوس متمركزاً على الشاشة لأشار إلى نقطة غير التي تُؤكَّد. - Positioned( - top: 0, - left: 0, - right: 0, - bottom: MediaQuery.sizeOf(context).height * _sheetFraction, - child: Stack( - children: [ - BlocSelector( - selector: (s) => _MapData( - origin: s.origin, - destination: s.destination, - driver: s.driverLocation, - route: s.route, - pickupRoute: s.pickupRoute, - camera: s.cameraTarget, - originLabel: s.originLabel, - destinationLabel: s.destinationLabel, - ), - builder: (context, data) => RideMap( - origin: data.origin, - destination: data.destination, - driver: data.driver, - route: data.route, - pickupRoute: data.pickupRoute, - cameraTarget: data.camera, - onCameraIdle: (p) => _mapCenter = p, - // الورقة لم تعد تغطّي الخريطة — تبقى حشوة تنفّس فقط - // كي لا يلتصق المسار بحافّة الخريطة السفلية. - bottomInset: Space.xxl, - originLabel: data.originLabel, - destinationLabel: data.destinationLabel, - ), - ), - - // ── دبّوس الاختيار ───────────────────────────────────── - BlocSelector( - selector: (s) => s.phase == RidePhase.pickingOnMap, - builder: (context, picking) => - picking ? const CenterPin() : const SizedBox.shrink(), - ), - ], - ), - ), - - // زر القائمة — يطفو فوق الخريطة، ويحترم المنطقة الآمنة. - SafeArea( - child: Padding( - padding: Space.page, - child: Row( - children: [ - Builder( - builder: (context) => _MapFab( - icon: Icons.menu_rounded, - onTap: Scaffold.of(context).openDrawer, - ), - ), - // زرّ المحاكاة — يظهر فقط مع - // `--dart-define=SIMULATE_TRIP=true`. الشرط `const` فيُحذف - // هو وما تحته من بناء الإنتاج. - if (RideCubit.simulationEnabled) ...[ - const SizedBox(width: Space.xs), - _MapFab( - icon: Icons.play_arrow_rounded, - onTap: () => _simulator.start(), - ), - ], - ], - ), - ), - ), - - // ── الورقة السفلية ───────────────────────────────────────── - Align( - alignment: Alignment.bottomCenter, - child: BlocBuilder( - builder: (context, state) => _Sheet( - state: state, - onConfirmPick: () { - final center = _mapCenter; - if (center != null) _cubit.confirmMapPick(center); - }, - ), - ), - ), - ], - ), - ), - ); - } -} - -/// ما تحتاجه الخريطة وحدها — تغيّرُ أي شيء آخر في الحالة لا يعيد بناءها. -class _MapData { - const _MapData({ - this.origin, - this.destination, - this.driver, - this.route, - this.pickupRoute, - this.camera, - this.originLabel = '', - this.destinationLabel = '', - }); - - final GeoPoint? origin; - final GeoPoint? destination; - final GeoPoint? driver; - final RouteInfo? route; - final RouteInfo? pickupRoute; - final GeoPoint? camera; - final String originLabel; - final String destinationLabel; - - @override - bool operator ==(Object other) => - other is _MapData && - other.origin == origin && - other.destination == destination && - other.driver == driver && - other.route == route && - other.pickupRoute == pickupRoute && - other.camera == camera && - other.originLabel == originLabel && - other.destinationLabel == destinationLabel; - - @override - int get hashCode => Object.hash( - origin, - destination, - driver, - route, - pickupRoute, - camera, - originLabel, - destinationLabel, - ); -} - -class _Sheet extends StatelessWidget { - const _Sheet({required this.state, required this.onConfirmPick}); - - final RideState state; - final VoidCallback onConfirmPick; - - @override - Widget build(BuildContext context) { - final child = switch (state.phase) { - RidePhase.idle => _Collapsed( - noLocation: state.error == RideError.noLocation, - originLabel: state.originLabel, - ), - RidePhase.planning => PlannerSheet(state: state), - RidePhase.pickingOnMap => _PickConfirm(onConfirm: onConfirmPick), - RidePhase.confirming => ConfirmSheet(state: state), - RidePhase.searching => const SearchingSheet(), - RidePhase.active => ActiveTripSheet( - trip: state.trip!, - pickupRoute: state.pickupRoute, - ), - }; - - return Container( - width: double.infinity, - // الحدّ الأدنى = المساحة المحجوزة للورقة تحت الخريطة، وإلا ظهر فراغُ - // الـ`Scaffold` بينهما في المراحل قصيرة المحتوى (`idle` مثلاً). - // وهو حدّ أدنى لا ثابت: `active` و`confirming` يكبران فوقه بحرّية. - constraints: BoxConstraints( - minHeight: MediaQuery.sizeOf(context).height * _sheetFraction, - ), - decoration: BoxDecoration( - color: context.colors.surface, - borderRadius: Radii.sheetTop, - ), - child: SafeArea( - top: false, - child: Padding( - padding: Space.page, - child: AnimatedSize( - duration: Motion.inScreen, - curve: Motion.curve, - alignment: Alignment.bottomCenter, - child: child, - ), - ), - ), - ); - } -} - -/// زر دائري فوق الخريطة — سطح مرتفع كي يُقرأ فوق أي لون بلاطة. -class _MapFab extends StatelessWidget { - const _MapFab({required this.icon, required this.onTap}); - - final IconData icon; - final VoidCallback onTap; - - @override - Widget build(BuildContext context) { - return Align( - alignment: AlignmentDirectional.topStart, - child: Material( - color: context.tripzColors.surfaceRaised, - shape: const CircleBorder(), - clipBehavior: Clip.antiAlias, - child: InkWell( - onTap: onTap, - child: Padding( - padding: EdgeInsets.all(Space.sm), - child: Icon(icon, size: Sizes.icon), - ), - ), - ), - ); - } -} - -/// البطاقة المطوية — واجهة «إلى أين؟». -/// -/// حقل بحث حقيقي لا زرّ يفتح شاشة: الراكب يبدأ الكتابة فوراً. وموقعه الحالي -/// معروض فوقه كي يتأكّد أن نقطة البداية صحيحة قبل أن يفكّر في الوجهة. -class _Collapsed extends StatelessWidget { - const _Collapsed({required this.noLocation, required this.originLabel}); - - final bool noLocation; - final String originLabel; - - @override - Widget build(BuildContext context) { - final cubit = context.read(); - return Column( - mainAxisSize: MainAxisSize.min, - crossAxisAlignment: CrossAxisAlignment.stretch, - children: [ - // بلا موقع لا خريطة مفيدة — السبب يُعرض مع مخرجه بدل خريطة صامتة - // على موقع خاطئ. - if (noLocation) ...[ - StatusBanner( - message: context.l10n.rideNoLocation, - tone: BannerTone.warning, - icon: Icons.location_off_outlined, - trailing: TripzButton.text( - label: context.l10n.actionRetry, - onPressed: cubit.locateMe, - ), - ), - const SizedBox(height: Space.sm), - ], - if (originLabel.isNotEmpty) ...[ - Row( - children: [ - Container( - width: 10, - height: 10, - decoration: BoxDecoration( - color: context.tripzColors.mapOrigin, - shape: BoxShape.circle, - ), - ), - const SizedBox(width: Space.xs), - Expanded( - child: Text( - originLabel, - maxLines: 1, - overflow: TextOverflow.ellipsis, - style: context.texts.bodySmall?.copyWith( - color: context.colors.onSurfaceVariant, - ), - ), - ), - ], - ), - const SizedBox(height: Space.sm), - ], - // حقل بحث لا زرّ: الضغط عليه يفتح بحث الأماكن بملء الشاشة مباشرةً - // (docs/40 §2) — لا ورقةً وسيطة ثم بحثاً داخلها. - // - // الحشوة سخيّة عمداً: الثلث السفلي صار مساحة الورقة وحدها بعد رفع - // الخريطة، وحقلٌ نحيف وسط فراغ يبدو مقصوصاً لا أنيقاً. - Material( - color: context.colors.surfaceContainerHighest, - borderRadius: Radii.card_, - child: InkWell( - onTap: () => PlaceSearchDialog.show( - context, - target: PickTarget.destination, - ), - borderRadius: Radii.card_, - child: Padding( - padding: const EdgeInsets.symmetric( - horizontal: Space.md, - vertical: Space.md, - ), - child: Row( - children: [ - Icon( - Icons.search_rounded, - size: Sizes.icon, - color: context.colors.primary, - ), - const SizedBox(width: Space.sm), - Expanded( - child: Text( - context.l10n.rideWhereTo, - style: context.texts.titleMedium?.copyWith( - color: context.colors.onSurfaceVariant, - ), - ), - ), - Icon( - Icons.chevron_left_rounded, - color: context.colors.onSurfaceVariant, - ), - ], - ), - ), - ), - ), - // الوجهات الأخيرة — نمط سيرو (`rp_favorites.dart: RpRecentsRow`). - // أكثر الرحلات تتكرّر، وبلا هذا يعيد الراكب كتابة الاسم نفسه كل مرة. - const _RecentsRow(), - ], - ); - } -} - -/// صفّ أفقي للوجهات الأخيرة — يختفي كلياً حين لا توجد، فلا يترك فراغاً. -class _RecentsRow extends StatelessWidget { - const _RecentsRow(); - - @override - Widget build(BuildContext context) { - final cubit = context.read(); - final places = cubit.recentPlaces; - if (places.isEmpty) return const SizedBox.shrink(); - - return Padding( - padding: const EdgeInsets.only(top: Space.sm), - child: SizedBox( - height: Sizes.touchTarget, - child: ListView.separated( - scrollDirection: Axis.horizontal, - itemCount: places.length, - separatorBuilder: (context, i) => const SizedBox(width: Space.xs), - itemBuilder: (context, i) { - final place = places[i]; - return ActionChip( - avatar: Icon( - Icons.history_rounded, - size: Sizes.iconSm, - color: context.colors.onSurfaceVariant, - ), - label: Text( - place.label, - maxLines: 1, - overflow: TextOverflow.ellipsis, - ), - onPressed: () => cubit.pickPlace(place, PickTarget.destination), - ); - }, - ), - ), - ); - } -} - -class _PickConfirm extends StatelessWidget { - const _PickConfirm({required this.onConfirm}); - - final VoidCallback onConfirm; - - @override - Widget build(BuildContext context) { - return TripzButton.primary( - label: context.l10n.rideConfirmPoint, - onPressed: onConfirm, - ); - } -} diff --git a/apps/rider_new/lib/features/trip/view/widgets/active_trip_sheet.dart b/apps/rider_new/lib/features/trip/view/widgets/active_trip_sheet.dart deleted file mode 100644 index 528b3d8..0000000 --- a/apps/rider_new/lib/features/trip/view/widgets/active_trip_sheet.dart +++ /dev/null @@ -1,85 +0,0 @@ -import 'package:flutter/material.dart'; -import 'package:flutter_bloc/flutter_bloc.dart'; - -import '../../../../core/design/tokens.dart'; -import '../../../../core/design/tripz_colors.dart'; -import '../../../../core/l10n/l10n.dart'; -import '../../../../core/ui/tripz_button.dart'; -import '../../cubit/ride_cubit.dart'; -import '../../data/models/route_info.dart'; -import '../../data/models/trip.dart'; -import 'cancel_sheet.dart'; -import 'driver_badge.dart'; -import 'fare_summary.dart'; -import 'trip_contact_row.dart'; - -/// بطاقة الرحلة الجارية: حالة واضحة ثم بيانات السائق ثم فعل واحد. -class ActiveTripSheet extends StatelessWidget { - const ActiveTripSheet({super.key, required this.trip, this.pickupRoute}); - - final Trip trip; - - /// مسار اقتراب السائق — منه شريط الوقت والمسافة. - final RouteInfo? pickupRoute; - - @override - Widget build(BuildContext context) { - final l10n = context.l10n; - final canCancel = const { - TripStatus.assigned, - TripStatus.driverArriving, - }.contains(trip.status); - - // الشريط أثناء الاقتراب وحده: بعد ركوب الراكب لم يعد «كم بقي ليصل» سؤالاً. - final eta = const { - TripStatus.assigned, - TripStatus.driverArriving, - }.contains(trip.status) - ? pickupRoute - : null; - - return Column( - mainAxisSize: MainAxisSize.min, - crossAxisAlignment: CrossAxisAlignment.stretch, - children: [ - Text(_statusText(context), style: context.texts.titleMedium), - if (eta != null) ...[ - const SizedBox(height: Space.sm), - TripEtaStrip(minutes: eta.durationMin, km: eta.distanceKm), - ], - const SizedBox(height: Space.md), - DriverBadge(trip: trip), - const SizedBox(height: Space.sm), - TripContactRow(trip: trip), - if (trip.priceForPassenger != null) ...[ - const SizedBox(height: Space.md), - FareSummary(trip: trip), - ], - if (canCancel) ...[ - const SizedBox(height: Space.md), - TripzButton.text( - label: l10n.rideCancelTrip, - expanded: true, - // تأكيد صريح: الإلغاء أثناء رحلة مسندة له كلفة على الطرفين. - onPressed: () async { - final cubit = context.read(); - if (await CancelSheet.confirm(context)) await cubit.cancelTrip(); - }, - ), - ], - ], - ); - } - - String _statusText(BuildContext context) { - final l10n = context.l10n; - return switch (trip.status) { - TripStatus.assigned => l10n.tripAssigned, - TripStatus.driverArriving => l10n.tripDriverArriving, - TripStatus.driverArrived => l10n.tripDriverArrived, - TripStatus.inProgress => l10n.tripInProgress, - TripStatus.completed || TripStatus.paid => l10n.tripCompleted, - _ => l10n.rideSearchingTitle, - }; - } -} diff --git a/apps/rider_new/lib/features/trip/view/widgets/cancel_sheet.dart b/apps/rider_new/lib/features/trip/view/widgets/cancel_sheet.dart deleted file mode 100644 index 2b70745..0000000 --- a/apps/rider_new/lib/features/trip/view/widgets/cancel_sheet.dart +++ /dev/null @@ -1,60 +0,0 @@ -import 'package:flutter/material.dart'; - -import '../../../../core/design/tokens.dart'; -import '../../../../core/l10n/l10n.dart'; -import '../../../../core/ui/tripz_button.dart'; -import '../../../../core/ui/tripz_sheet.dart'; - -/// الإلغاء لا يقع بضغطة واحدة: تأكيدٌ صريح مع سبب. -/// -/// السبب لا يُرسَل للخادم (لا يقبله عقد `POST /trips/:id/cancel` — docs/38 -/// §4)، لكن السؤال نفسه يخفض الإلغاء العرضي، ويجهّز الحقل حين يقبله الخادم. -class CancelSheet { - const CancelSheet._(); - - static Future confirm(BuildContext context) async { - final l10n = context.l10n; - var reason = 0; - - final result = await TripzSheet.show( - context, - title: l10n.tripCancelTitle, - child: StatefulBuilder( - builder: (context, setState) => RadioGroup( - groupValue: reason, - onChanged: (v) => setState(() => reason = v ?? 0), - child: Column( - mainAxisSize: MainAxisSize.min, - children: [ - for (final (i, label) in [ - l10n.tripCancelReasonWait, - l10n.tripCancelReasonMistake, - l10n.tripCancelReasonOther, - ].indexed) - RadioListTile( - value: i, - contentPadding: EdgeInsets.zero, - title: Text(label), - ), - ], - ), - ), - ), - bottomAction: Column( - mainAxisSize: MainAxisSize.min, - children: [ - TripzButton.primary( - label: l10n.tripCancelKeep, - onPressed: () => Navigator.of(context).pop(false), - ), - const SizedBox(height: Space.xxs), - TripzButton.text( - label: l10n.tripCancelConfirm, - onPressed: () => Navigator.of(context).pop(true), - ), - ], - ), - ); - return result ?? false; - } -} diff --git a/apps/rider_new/lib/features/trip/view/widgets/center_pin.dart b/apps/rider_new/lib/features/trip/view/widgets/center_pin.dart deleted file mode 100644 index a047591..0000000 --- a/apps/rider_new/lib/features/trip/view/widgets/center_pin.dart +++ /dev/null @@ -1,41 +0,0 @@ -import 'package:flutter/material.dart'; - -import '../../../../core/design/tokens.dart'; -import '../../../../core/design/tripz_colors.dart'; - -/// دبّوس ثابت في منتصف الشاشة أثناء الاختيار من الخريطة. -/// -/// النمط الصحيح المثبت ميدانياً: **المستخدم يحرّك الخريطة لا الدبّوس** -/// (docs/39 §3) — الدبّوس لا يُسحب، فلا يضيع تحت الإصبع. -class CenterPin extends StatelessWidget { - const CenterPin({super.key, this.isOrigin = false}); - - final bool isOrigin; - - @override - Widget build(BuildContext context) { - final color = - isOrigin ? context.tripzColors.mapOrigin : context.tripzColors.mapDestination; - return IgnorePointer( - child: Center( - child: Column( - mainAxisSize: MainAxisSize.min, - children: [ - Icon(Icons.location_on, size: Sizes.iconLg, color: color), - // ظلّ صغير يثبّت الإحساس بموضع النقطة على الأرض. - Container( - width: 8, - height: 4, - margin: const EdgeInsets.only(top: 2), - decoration: BoxDecoration( - color: Colors.black.withValues(alpha: 0.25), - borderRadius: BorderRadius.circular(4), - ), - ), - const SizedBox(height: Sizes.iconLg), - ], - ), - ), - ); - } -} diff --git a/apps/rider_new/lib/features/trip/view/widgets/confirm_sheet.dart b/apps/rider_new/lib/features/trip/view/widgets/confirm_sheet.dart deleted file mode 100644 index 0e0b2e1..0000000 --- a/apps/rider_new/lib/features/trip/view/widgets/confirm_sheet.dart +++ /dev/null @@ -1,139 +0,0 @@ -import 'package:flutter/material.dart'; -import 'package:flutter_bloc/flutter_bloc.dart'; - -import '../../../../core/build_config.dart'; -import '../../../../core/design/tokens.dart'; -import '../../../../core/design/tripz_colors.dart'; -import '../../../../core/design/typography.dart'; -import '../../../../core/l10n/l10n.dart'; -import '../../../../core/tenant/feature_gate.dart'; -import '../../../../core/ui/status_banner.dart'; -import '../../../../core/ui/tripz_button.dart'; -import '../../../../core/ui/tripz_text_field.dart'; -import '../../cubit/ride_cubit.dart'; -import '../../cubit/ride_state.dart'; -import 'ride_type_picker.dart'; -import 'route_timeline.dart'; - -/// التأكيد: نوع الرحلة والأجرة والمسافة والمدة — ثم زر واحد. -class ConfirmSheet extends StatelessWidget { - const ConfirmSheet({super.key, required this.state}); - - final RideState state; - - @override - Widget build(BuildContext context) { - final l10n = context.l10n; - final cubit = context.read(); - final route = state.route; - final quote = state.quote; - - return Column( - mainAxisSize: MainAxisSize.min, - crossAxisAlignment: CrossAxisAlignment.stretch, - children: [ - // زر التراجع: بلا مخرج كان المستخدم يعلق في الشاشة إذا فشلت التسعيرة. - Align( - alignment: AlignmentDirectional.centerStart, - child: TripzButton.text( - label: l10n.rideBack, - icon: Icons.arrow_back_rounded, - onPressed: cubit.back, - ), - ), - RouteTimeline( - originLabel: state.originLabel, - destinationLabel: state.destinationLabel, - stopCount: state.stops.length, - onTapDestination: cubit.clearDestination, - ), - const SizedBox(height: Space.md), - RideTypePicker( - types: state.rideTypes, - selected: state.selectedRideType, - quotes: state.quotes, - onSelect: cubit.selectRideType, - ), - const SizedBox(height: Space.md), - if (route != null) - Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - _Metric( - icon: Icons.route_outlined, - value: l10n.rideDistanceKm(route.distanceKm.toStringAsFixed(1)), - ), - _Metric( - icon: Icons.schedule_rounded, - value: l10n.rideEta(route.durationMin.round().toString()), - ), - // الأجرة لا تُعرض إلا إن كانت صالحة: النقطة ترجّع 200 بقيم - // `null` عند المدخلات الخطأ (docs/38 §7). - if (quote != null && quote.isUsable) - Text( - '${quote.total!.toStringAsFixed(2)} ${quote.currency}', - style: numericStyle(context.texts.titleLarge), - ), - ], - ), - if (quote?.hasSurge == true) ...[ - const SizedBox(height: Space.sm), - StatusBanner( - message: l10n.rideSurge, - tone: BannerTone.warning, - icon: Icons.trending_up_rounded, - ), - ], - if (state.error == RideError.quoteFailed) ...[ - const SizedBox(height: Space.sm), - StatusBanner( - message: l10n.rideQuoteFailed, - tone: BannerTone.danger, - trailing: TripzButton.text( - label: l10n.actionRetry, - onPressed: cubit.repriceAll, - ), - ), - ], - if (state.error == RideError.noDrivers) ...[ - const SizedBox(height: Space.sm), - StatusBanner(message: l10n.rideNoDrivers, tone: BannerTone.warning), - ], - // الكوبون خلف طبقتَي الميزات: مبنيّ في الـbinary ومشترى للمستأجر. - if (Features.coupons && context.tenantHas('coupons')) ...[ - const SizedBox(height: Space.md), - TripzTextField( - hint: l10n.rideCoupon, - prefixIcon: Icons.local_offer_outlined, - onChanged: cubit.couponChanged, - ), - ], - const SizedBox(height: Space.md), - TripzButton.primary( - label: l10n.rideConfirmTrip, - loading: state.busy, - onPressed: state.canConfirm ? cubit.requestTrip : null, - ), - ], - ); - } -} - -class _Metric extends StatelessWidget { - const _Metric({required this.icon, required this.value}); - - final IconData icon; - final String value; - - @override - Widget build(BuildContext context) { - return Row( - mainAxisSize: MainAxisSize.min, - children: [ - Icon(icon, size: Sizes.iconSm, color: context.colors.onSurfaceVariant), - const SizedBox(width: Space.xxs), - Text(value, style: numericStyle(context.texts.bodyMedium)), - ], - ); - } -} diff --git a/apps/rider_new/lib/features/trip/view/widgets/driver_badge.dart b/apps/rider_new/lib/features/trip/view/widgets/driver_badge.dart deleted file mode 100644 index 1c5e890..0000000 --- a/apps/rider_new/lib/features/trip/view/widgets/driver_badge.dart +++ /dev/null @@ -1,140 +0,0 @@ -import 'package:flutter/material.dart'; - -import '../../../../core/design/tokens.dart'; -import '../../../../core/design/tripz_colors.dart'; -import '../../../../core/design/typography.dart'; -import '../../data/models/trip.dart'; -import 'vehicle_color.dart'; - -/// بطاقة السائق ولوحة المركبة — أهم ما يبحث عنه الراكب في الشارع، فيأخذ -/// أوضح موضع وأكبر تباين. -class DriverBadge extends StatelessWidget { - const DriverBadge({super.key, required this.trip}); - - final Trip trip; - - @override - Widget build(BuildContext context) { - if (trip.driverName == null) return const SizedBox.shrink(); - - // اللون **يُرسم لا يُكتب فقط**: الراكب يمسح الشارع بعينه بحثاً عن سيارة - // بيضاء، لا يقرأ كلمة «أبيض». نمط سيرو (`apply_order_widget.dart:333`) - // يلوّن رمز السيارة بلون المركبة الفعلي — وهذا مقابله. - final carColor = VehicleColor.resolve( - hex: trip.vehicleColorHex, - name: trip.vehicleColor, - ); - - // سطر المركبة: الموديل واللون معاً بفاصل — أحدهما قد يغيب. - final vehicleLine = [ - if (trip.vehicleModel != null && trip.vehicleModel!.isNotEmpty) - trip.vehicleModel!, - if (trip.vehicleColor != null && trip.vehicleColor!.isNotEmpty) - trip.vehicleColor!, - ].join(' • '); - - return Row( - children: [ - _CarAvatar(color: carColor), - const SizedBox(width: Space.sm), - Expanded( - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Text(trip.driverName!, style: context.texts.titleSmall), - if (vehicleLine.isNotEmpty) - Text( - vehicleLine, - style: context.texts.bodySmall?.copyWith( - color: context.colors.onSurfaceVariant, - ), - ), - if (trip.driverRating != null) - Row( - children: [ - Icon( - Icons.star_rounded, - size: Sizes.iconSm, - color: context.tripzColors.warning, - ), - const SizedBox(width: Space.xxs), - Text( - trip.driverRating!, - style: numericStyle(context.texts.bodySmall), - ), - ], - ), - ], - ), - ), - if (trip.vehiclePlate != null) _Plate(plate: trip.vehiclePlate!), - ], - ); - } -} - -/// رمز سيارة ملوّن بلون المركبة الحقيقي. -/// -/// اللون الفاتح (أبيض/بيج) يختفي على سطح فاتح، فتُرسم حلقة حدّ حوله دائماً — -/// وبها تبقى السيارة البيضاء مقروءة في الوضع النهاري. -class _CarAvatar extends StatelessWidget { - const _CarAvatar({this.color}); - - final Color? color; - - @override - Widget build(BuildContext context) { - final resolved = color ?? context.colors.onSurfaceVariant; - return Container( - width: 48, - height: 48, - decoration: BoxDecoration( - // ‏10% من لون السيارة خلفيةً — يربط الرمز بلونه بلا صراخ. - color: color?.withValues(alpha: 0.12) ?? - context.colors.surfaceContainerHighest, - shape: BoxShape.circle, - border: Border.all(color: context.colors.outlineVariant), - ), - child: Center( - child: Icon( - Icons.directions_car_filled_rounded, - size: Sizes.icon, - color: resolved, - // ظلّ خفيف كي لا تذوب السيارة البيضاء في الخلفية الفاتحة. - shadows: const [ - Shadow(color: Color(0x33000000), blurRadius: 2), - ], - ), - ), - ); - } -} - -/// لوحة مرسومة لا نصّ عادي — تُقرأ من بعيد ومن زاوية. -class _Plate extends StatelessWidget { - const _Plate({required this.plate}); - - final String plate; - - @override - Widget build(BuildContext context) { - return Container( - padding: const EdgeInsets.symmetric( - horizontal: Space.sm, - vertical: Space.xxs, - ), - decoration: BoxDecoration( - borderRadius: Radii.field_, - border: Border.all(color: context.colors.outline, width: 1.5), - color: context.tripzColors.surfaceRaised, - ), - child: Text( - plate, - textDirection: TextDirection.ltr, - style: numericStyle(context.texts.titleMedium).copyWith( - letterSpacing: 1.5, - ), - ), - ); - } -} diff --git a/apps/rider_new/lib/features/trip/view/widgets/fare_summary.dart b/apps/rider_new/lib/features/trip/view/widgets/fare_summary.dart deleted file mode 100644 index baf4f83..0000000 --- a/apps/rider_new/lib/features/trip/view/widgets/fare_summary.dart +++ /dev/null @@ -1,51 +0,0 @@ -import 'package:flutter/material.dart'; - -import '../../../../core/design/tokens.dart'; -import '../../../../core/design/tripz_colors.dart'; -import '../../../../core/design/typography.dart'; -import '../../../../core/format/money.dart'; -import '../../../../core/l10n/l10n.dart'; -import '../../data/models/trip.dart'; - -/// ملخّص الأجرة عند الإنهاء. -/// -/// ⚠️ `price_for_passenger` و`price_for_driver` **حقلان منفصلان** والفرق -/// بينهما هو العمولة (docs/38 §4). كلٌّ يرى رقمه: الراكب ما يدفع، والسائق ما -/// يكسب — عرض رقم واحد للطرفين خطأ لا اختصار. -class FareSummary extends StatelessWidget { - const FareSummary({super.key, required this.trip, this.forDriver = false}); - - final Trip trip; - final bool forDriver; - - @override - Widget build(BuildContext context) { - final l10n = context.l10n; - final amount = forDriver ? trip.priceForDriver : trip.priceForPassenger; - - return Column( - crossAxisAlignment: CrossAxisAlignment.stretch, - children: [ - Text(l10n.tripFareTitle, style: context.texts.titleMedium), - const SizedBox(height: Space.sm), - Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - Text( - forDriver ? l10n.tripEarnings : l10n.tripFare, - style: context.texts.bodyMedium?.copyWith( - color: context.colors.onSurfaceVariant, - ), - ), - Text( - Money.format(amount, trip.currency), - style: numericStyle(context.texts.headlineSmall).copyWith( - color: forDriver ? context.tripzColors.success : null, - ), - ), - ], - ), - ], - ); - } -} diff --git a/apps/rider_new/lib/features/trip/view/widgets/map_label.dart b/apps/rider_new/lib/features/trip/view/widgets/map_label.dart deleted file mode 100644 index a30d64f..0000000 --- a/apps/rider_new/lib/features/trip/view/widgets/map_label.dart +++ /dev/null @@ -1,66 +0,0 @@ -import 'package:flutter/material.dart'; - -import '../../../../core/design/tokens.dart'; -import '../../../../core/design/tripz_colors.dart'; - -/// بطاقة اسم فوق نقطة على الخريطة — نمط سيرو: الراكب يقرأ «دوّار عبدون» على -/// الخريطة نفسها لا في الورقة السفلية وحدها، فيتأكّد أن النقطة صحيحة قبل -/// أن يطلب. -/// -/// تُرسم في طبقة فلاتر فوق الخريطة لا كـmarker: نصّ عربي داخل صورة علامة -/// يصعب ضبطه، وطبقة فلاتر تعطينا الخط والاتجاه والثيم مجاناً. -class MapLabel extends StatelessWidget { - const MapLabel({ - super.key, - required this.text, - required this.color, - this.icon, - }); - - final String text; - final Color color; - final IconData? icon; - - @override - Widget build(BuildContext context) { - if (text.isEmpty) return const SizedBox.shrink(); - return Container( - constraints: const BoxConstraints(maxWidth: 200), - padding: const EdgeInsets.symmetric( - horizontal: Space.xs, - vertical: Space.xxs, - ), - decoration: BoxDecoration( - color: context.tripzColors.surfaceRaised, - borderRadius: Radii.field_, - border: Border.all(color: color, width: 1.5), - boxShadow: [ - BoxShadow( - color: Colors.black.withValues(alpha: 0.18), - blurRadius: 6, - offset: const Offset(0, 2), - ), - ], - ), - child: Row( - mainAxisSize: MainAxisSize.min, - children: [ - Container( - width: 8, - height: 8, - decoration: BoxDecoration(color: color, shape: BoxShape.circle), - ), - const SizedBox(width: Space.xxs), - Flexible( - child: Text( - text, - maxLines: 1, - overflow: TextOverflow.ellipsis, - style: context.texts.labelMedium, - ), - ), - ], - ), - ); - } -} diff --git a/apps/rider_new/lib/features/trip/view/widgets/map_pin.dart b/apps/rider_new/lib/features/trip/view/widgets/map_pin.dart deleted file mode 100644 index 193e1e6..0000000 --- a/apps/rider_new/lib/features/trip/view/widgets/map_pin.dart +++ /dev/null @@ -1,41 +0,0 @@ -import 'package:flutter/material.dart'; - -import '../../../../core/design/tripz_colors.dart'; - -/// نقطة على الخريطة — **طبقة فلاتر لا annotation**. -/// -/// السبب في `ride_map.dart`: مديرو تعليقات MapLibre يُهدمون مع كل إعادة -/// تحميل ستايل، وإضافة دائرة في تلك النافذة تُسقط التطبيق من الطبقة الأصلية. -/// رسمها بفلاتر يزيل هذا الصنف من الأعطال كلياً، ويعطينا الثيم والحدّ الأبيض -/// مجاناً. -class MapPin extends StatelessWidget { - const MapPin({super.key, required this.color, this.icon, this.size = 28}); - - final Color color; - final IconData? icon; - final double size; - - @override - Widget build(BuildContext context) { - return Container( - width: size, - height: size, - decoration: BoxDecoration( - color: color, - shape: BoxShape.circle, - // حدّ أبيض يفصل النقطة عن أي لون بلاطة تحتها. - border: Border.all(color: context.tripzColors.surfaceRaised, width: 3), - boxShadow: [ - BoxShadow( - color: Colors.black.withValues(alpha: 0.25), - blurRadius: 4, - offset: const Offset(0, 2), - ), - ], - ), - child: icon == null - ? null - : Icon(icon, size: size * 0.5, color: Colors.white), - ); - } -} diff --git a/apps/rider_new/lib/features/trip/view/widgets/place_search_dialog.dart b/apps/rider_new/lib/features/trip/view/widgets/place_search_dialog.dart deleted file mode 100644 index aa82cbc..0000000 --- a/apps/rider_new/lib/features/trip/view/widgets/place_search_dialog.dart +++ /dev/null @@ -1,219 +0,0 @@ -import 'package:flutter/material.dart'; -import 'package:flutter_bloc/flutter_bloc.dart'; - -import '../../../../core/design/tokens.dart'; -import '../../../../core/design/tripz_colors.dart'; -import '../../../../core/l10n/l10n.dart'; -import '../../../../core/ui/tripz_text_field.dart'; -import '../../cubit/ride_cubit.dart'; -import '../../cubit/ride_state.dart'; -import '../../data/models/place.dart'; -import 'route_timeline.dart'; - -/// بحث الأماكن بملء الشاشة — نمط سيرو -/// (`apps/rider/lib/views/home/route_planner/rp_search_dialog.dart`): -/// ديالوج منفصل عن الورقة السفلية بدل حقل مضغوط داخلها (docs/40 §2). -/// -/// [target] يحدّد الحقل الذي يُملأ عند الاختيار — البحث نفسه (`searchPlaces`) -/// مشترك، فلا حاجة لنسخة ثانية من الكيوبت لكل اتجاه. -class PlaceSearchDialog extends StatefulWidget { - const PlaceSearchDialog({super.key, required this.target}); - - final PickTarget target; - - static Future show(BuildContext context, {required PickTarget target}) { - final cubit = context.read(); - return showGeneralDialog( - context: context, - barrierDismissible: true, - barrierLabel: MaterialLocalizations.of(context).modalBarrierDismissLabel, - barrierColor: Colors.black54, - transitionDuration: Motion.page, - pageBuilder: (context, animation, secondaryAnimation) => - BlocProvider.value( - value: cubit, - child: PlaceSearchDialog(target: target), - ), - transitionBuilder: (context, animation, secondaryAnimation, child) { - return SlideTransition( - position: Tween( - begin: const Offset(0, 1), - end: Offset.zero, - ).animate(CurvedAnimation(parent: animation, curve: Curves.easeOutCubic)), - child: child, - ); - }, - ); - } - - @override - State createState() => _PlaceSearchDialogState(); -} - -class _PlaceSearchDialogState extends State { - final _query = TextEditingController(); - - @override - void dispose() { - // البحث ينتهي مع الديالوج — لا يبقى مصدر نتائج قديمة معلَّقاً في الحالة - // حين يُفتح البحث ثانيةً بحقل فارغ. - context.read().searchPlaces(''); - _query.dispose(); - super.dispose(); - } - - IconData _iconFor(String category) => switch (category) { - 'street' || 'road' => Icons.route_outlined, - 'restaurant' || 'cafe' || 'food' => Icons.restaurant_outlined, - 'hospital' || 'clinic' || 'pharmacy' => Icons.local_hospital_outlined, - 'school' || 'university' => Icons.school_outlined, - 'mall' || 'shop' || 'store' => Icons.storefront_outlined, - 'mosque' => Icons.mosque_outlined, - 'hotel' => Icons.hotel_outlined, - _ => Icons.place_outlined, - }; - - void _select(BuildContext context, Place place) { - Navigator.of(context).pop(); - context.read().pickPlace(place, widget.target); - } - - @override - Widget build(BuildContext context) { - final l10n = context.l10n; - final hint = widget.target == PickTarget.origin - ? l10n.rideOrigin - : l10n.rideSearchHint; - - return Scaffold( - backgroundColor: context.colors.surface, - body: SafeArea( - child: Padding( - padding: Space.page, - child: Column( - crossAxisAlignment: CrossAxisAlignment.stretch, - children: [ - Row( - children: [ - IconButton( - icon: const Icon(Icons.arrow_back_rounded), - onPressed: () => Navigator.of(context).pop(), - ), - Expanded( - child: Text(l10n.rideWhereTo, style: context.texts.titleMedium), - ), - ], - ), - const SizedBox(height: Space.sm), - BlocSelector( - selector: (s) => (o: s.originLabel, d: s.destinationLabel, stops: s.stops.length), - builder: (context, r) => RouteTimeline( - originLabel: r.o, - destinationLabel: r.d, - stopCount: r.stops, - onTapOrigin: () { - if (widget.target != PickTarget.origin) { - Navigator.of(context).pop(); - PlaceSearchDialog.show(context, target: PickTarget.origin); - } - }, - onTapDestination: () { - if (widget.target != PickTarget.destination) { - Navigator.of(context).pop(); - PlaceSearchDialog.show(context, target: PickTarget.destination); - } - }, - ), - ), - const SizedBox(height: Space.md), - TripzTextField( - controller: _query, - hint: hint, - prefixIcon: Icons.search_rounded, - autofocus: true, - onChanged: context.read().searchPlaces, - suffix: _query.text.isEmpty - ? null - : IconButton( - icon: const Icon(Icons.close_rounded), - onPressed: () { - _query.clear(); - context.read().searchPlaces(''); - setState(() {}); - }, - ), - ), - const SizedBox(height: Space.sm), - Expanded( - child: BlocBuilder( - builder: (context, state) { - if (state.searching) { - return const Padding( - padding: EdgeInsets.only(top: Space.md), - child: LinearProgressIndicator(minHeight: 2), - ); - } - if (_query.text.trim().length >= 2 && - state.searchResults.isEmpty) { - return Center( - child: Padding( - padding: const EdgeInsets.only(top: Space.lg), - child: Text( - l10n.rideSearchNoResults, - textAlign: TextAlign.center, - style: context.texts.bodySmall?.copyWith( - color: context.colors.onSurfaceVariant, - ), - ), - ), - ); - } - // حقل فارغ ⇒ الأخيرة بدل شاشة بيضاء — الراكب غالباً - // ذاهبٌ لمكان سبق أن ذهب إليه. - final results = state.searchResults.isEmpty && - _query.text.trim().isEmpty - ? context.read().recentPlaces - : state.searchResults; - return ListView.separated( - padding: const EdgeInsets.only(top: Space.xs), - itemCount: results.length, - separatorBuilder: (context, i) => const Divider(height: 1), - itemBuilder: (context, i) { - final place = results[i]; - return ListTile( - contentPadding: EdgeInsets.zero, - leading: CircleAvatar( - radius: 18, - backgroundColor: context.colors.surfaceContainerHighest, - child: Icon( - _iconFor(place.category), - size: Sizes.iconSm, - color: context.colors.onSurfaceVariant, - ), - ), - title: Text(place.label, maxLines: 1, overflow: TextOverflow.ellipsis), - subtitle: place.address.isEmpty - ? null - : Text(place.address, maxLines: 1, overflow: TextOverflow.ellipsis), - onTap: () => _select(context, place), - ); - }, - ); - }, - ), - ), - TextButton.icon( - icon: const Icon(Icons.map_outlined), - label: Text(l10n.ridePickOnMap), - onPressed: () { - Navigator.of(context).pop(); - context.read().startMapPick(widget.target); - }, - ), - ], - ), - ), - ), - ); - } -} diff --git a/apps/rider_new/lib/features/trip/view/widgets/planner_sheet.dart b/apps/rider_new/lib/features/trip/view/widgets/planner_sheet.dart deleted file mode 100644 index c5194d1..0000000 --- a/apps/rider_new/lib/features/trip/view/widgets/planner_sheet.dart +++ /dev/null @@ -1,48 +0,0 @@ -import 'package:flutter/material.dart'; -import 'package:flutter_bloc/flutter_bloc.dart'; - -import '../../../../core/design/tokens.dart'; -import '../../../../core/l10n/l10n.dart'; -import '../../../../core/ui/tripz_button.dart'; -import '../../cubit/ride_cubit.dart'; -import '../../cubit/ride_state.dart'; -import 'place_search_dialog.dart'; -import 'route_timeline.dart'; - -/// المخطّط الموسّع: الخط الزمني للمسار فقط — البحث بحدّ ذاته انتقل إلى -/// [PlaceSearchDialog] بملء الشاشة (docs/40 §2). الضغط على أي حقل في الخط -/// الزمني يفتح ذلك الديالوج بدل بحث مضغوط داخل هذه الورقة. -class PlannerSheet extends StatelessWidget { - const PlannerSheet({super.key, required this.state}); - - final RideState state; - - @override - Widget build(BuildContext context) { - final l10n = context.l10n; - final cubit = context.read(); - - return Column( - mainAxisSize: MainAxisSize.min, - crossAxisAlignment: CrossAxisAlignment.stretch, - children: [ - RouteTimeline( - originLabel: state.originLabel, - destinationLabel: state.destinationLabel, - stopCount: state.stops.length, - onTapOrigin: () => - PlaceSearchDialog.show(context, target: PickTarget.origin), - onTapDestination: () => - PlaceSearchDialog.show(context, target: PickTarget.destination), - ), - const SizedBox(height: Space.md), - TripzButton.secondary( - label: l10n.ridePickOnMap, - icon: Icons.map_outlined, - expanded: true, - onPressed: () => cubit.startMapPick(PickTarget.destination), - ), - ], - ); - } -} diff --git a/apps/rider_new/lib/features/trip/view/widgets/ride_map.dart b/apps/rider_new/lib/features/trip/view/widgets/ride_map.dart deleted file mode 100644 index 929f308..0000000 --- a/apps/rider_new/lib/features/trip/view/widgets/ride_map.dart +++ /dev/null @@ -1,387 +0,0 @@ -import 'dart:developer' as dev; - -import 'package:flutter/material.dart'; -import 'package:intaleq_maps/intaleq_maps.dart' as im; - -import '../../../../core/config.dart'; -import '../../../../core/design/tripz_colors.dart'; -import '../../data/models/geo_point.dart'; -import '../../data/models/route_info.dart'; -import 'map_label.dart'; -import 'map_pin.dart'; - -/// الخريطة — **الطبقة الوحيدة التي تعرف `intaleq_maps`**. ما فوقها يتعامل -/// مع `GeoPoint` وحده، فتبديل محرّك الخريطة لاحقاً لا يلمس منطقاً. -/// -/// البلاطات تُجلب مباشرة من map-saas بمفتاح مقيّد ببصمة التطبيق -/// (قرار 2026-07-20). -/// -/// ## لماذا النقاط مرسومة بفلاتر لا كـ annotations -/// -/// MapLibre يُنشئ «مديري التعليقات» (circle/symbol/line) **عند تحميل الستايل -/// وحده**، ويهدمهم عند كل إعادة تحميل له — وتبديل الوضع الليلي إعادةُ تحميل. -/// وأي `addCircle` في تلك النافذة يرمي -/// `This Annotation Manager has not been initialized`، وقد رأيناه يُسقط -/// التطبيق بـ`std::domain_error` من الطبقة الأصلية (2026-08-05). -/// -/// حارسٌ زمنيّ لا يكفي: `didUpdateWidget` في الحزمة يستدعي `diffCircles` -/// بمجرّد وجود المتحكّم، وهو موجود قبل تحميل الستايل وأثناء إعادة تحميله. -/// -/// لذلك: **الدائرتان والاسمان والسائق كلهم طبقة فلاتر** فوق الخريطة، محسوبة -/// من `getScreenCoordinate`. المسار وحده يبقى `Polyline` لأنه لا بديل له، -/// ومحروسٌ بعَلَم يُصفَّر عند كل تغيير ستايل. -class RideMap extends StatefulWidget { - const RideMap({ - super.key, - this.origin, - this.destination, - this.driver, - this.route, - this.pickupRoute, - this.cameraTarget, - this.onCameraIdle, - this.bottomInset = 280, - this.originLabel = '', - this.destinationLabel = '', - }); - - final GeoPoint? origin; - final GeoPoint? destination; - final GeoPoint? driver; - final RouteInfo? route; - - /// مسار اقتراب السائق — يُرسم بلون وعرض مختلفين عن [route]. - final RouteInfo? pickupRoute; - - final GeoPoint? cameraTarget; - - /// مركز الخريطة عند استقرارها — يغذّي اختيار النقطة بالدبّوس الثابت. - final ValueChanged? onCameraIdle; - - /// ارتفاع ما تغطّيه الورقة السفلية — يُحسب منه إطار المسار. - final double bottomInset; - - /// أسماء النقطتين — تُرسم بطاقاتها فوق الخريطة (نمط سيرو). - final String originLabel; - final String destinationLabel; - - @override - State createState() => _RideMapState(); -} - -class _RideMapState extends State { - im.IntaleqMapController? _controller; - im.LatLng? _center; - - /// يُصفَّر عند كل تغيير ستايل: المديرون يُهدمون وتُعاد تهيئتهم. - bool _styleReady = false; - - String? _styleUrl; - - /// مواضع النقاط على الشاشة — تُحدَّث مع حركة الكاميرا. - Offset? _originPx; - Offset? _destPx; - Offset? _driverPx; - - /// حارس تزامن: `onCameraMove` يُطلق عشرات المرات في الثانية أثناء السحب، - /// وكل مزامنة ثلاثة نداءات منصّة. بلا هذا الحارس تتكدّس النداءات وتلتهم - /// الإطارات — وهو بالضبط ما تمنعه ميزانية الأداء (docs/37 م2.12). - bool _syncing = false; - - static const _fallback = im.LatLng(31.9539, 35.9106); // عمّان - - /// حارس الإحداثيات — **بلا هذا يسقط التطبيق أصلاً لا استثناءً في دارت**. - /// - /// `std::domain_error` الذي رأيناه (2026-08-05) يأتي من `mbgl::LatLng` - /// في MapLibre الأصلي، وهو يرمي حرفياً عند: `latitude must not be NaN` · - /// `longitude must not be NaN` · `latitude must be between -90 and 90` · - /// `longitude must not be infinite`. (السلاسل الأربع موجودة في ثنائي - /// `MapLibre.framework`، وهي مصدر `std::domain_error` الوحيد فيه — أمّا - /// الستايل فبريء: الملفّات الخمسة كلها اجتازت `validateStyleMin` بصفر - /// أخطاء.) - /// - /// وهو استثناء **C++ يعبر حدّ المنصّة**، فلا `try/catch` في دارت يمسكه: - /// المنع قبل التمرير هو العلاج الوحيد. - static im.LatLng? _safe(GeoPoint? p, String tag) { - if (p == null) return null; - final ok = p.lat.isFinite && p.lng.isFinite && p.lat.abs() <= 90; - if (!ok) { - dev.log('إحداثية غير صالحة رُفضت [$tag]: ${p.lat}, ${p.lng}', - name: 'RideMap'); - return null; - } - return im.LatLng(p.lat, p.lng); - } - - /// الستايلان مرفقان في `assets/` — منقولان من سيرو الميداني. - static const _lightStyleAsset = 'assets/style.json'; - static const _darkStyleAsset = 'assets/style_dark.json'; - - @override - void didUpdateWidget(RideMap old) { - super.didUpdateWidget(old); - if (widget.route != null && widget.route != old.route) { - _fitRoute(); - } else { - final target = widget.cameraTarget; - if (target != null && target != old.cameraTarget) _moveTo(target); - } - // النقاط قد تتغيّر بلا حركة كاميرا — نعيد حساب مواضعها. - if (widget.origin != old.origin || - widget.destination != old.destination || - widget.driver != old.driver) { - _syncPixels(); - } - } - - /// الموقع الحالي غالباً يصل *قبل* إنشاء الخريطة، فالتحريك في - /// `didUpdateWidget` وحده يضيع وتبقى الكاميرا على الاحتياطي. هنا نلحق بما فات. - void _onCreated(im.IntaleqMapController controller) { - _controller = controller; - final target = widget.cameraTarget ?? widget.origin; - if (widget.route != null) { - _fitRoute(); - } else if (target != null) { - _moveTo(target); - } - } - - void _onStyleLoaded() { - if (!mounted) return; - setState(() => _styleReady = true); - _syncPixels(); - } - - void _moveTo(GeoPoint p) { - final target = _safe(p, 'moveTo'); - if (target == null) return; - _controller?.animateCamera(im.CameraUpdate.newLatLngZoom(target, 15.5)); - } - - /// يفكّ ترميز المسار **مصفّىً**: مسار مشوّه من الخادم (أو سلسلة مقطوعة) - /// يعطي خطوط عرض خارج ±90، وتلك تصل `mbgl::LatLng` فتُسقط التطبيق أصلاً. - static List _decodeRoute(String encoded) { - final all = im.PolylineUtils.decode(encoded); - final good = all - .where((p) => - p.latitude.isFinite && - p.longitude.isFinite && - p.latitude.abs() <= 90) - .toList(); - if (good.length != all.length) { - dev.log('نقاط مسار غير صالحة رُفضت: ${all.length - good.length}', - name: 'RideMap'); - } - return good; - } - - /// المسارات كطبقات `Polyline` — مجموعة فارغة ما لم يكن الستايل جاهزاً - /// والنقاط صالحة. - /// - /// **خطّان لا خطّ**: مسار الرحلة (`route`) بلون المسار وعرض 5، ومسار - /// اقتراب السائق (`pickupRoute`) أرفع وبلون المعلومات — كي يفرّق الراكب - /// بنظرة بين «طريقي» و«طريق السائق إليّ». - Set _routePolylines(Color routeColor, Color pickupColor) { - if (!_styleReady) return const {}; - - final lines = {}; - - final encoded = widget.route?.encodedPoints; - if (encoded != null && encoded.isNotEmpty) { - final points = _decodeRoute(encoded); - if (points.length >= 2) { - lines.add(im.Polyline( - polylineId: const im.PolylineId('route'), - points: points, - color: routeColor, - width: 5, - )); - } - } - - final pickup = widget.pickupRoute?.encodedPoints; - if (pickup != null && pickup.isNotEmpty) { - final points = _decodeRoute(pickup); - if (points.length >= 2) { - lines.add(im.Polyline( - polylineId: const im.PolylineId('pickup'), - points: points, - color: pickupColor, - width: 4, - )); - } - } - - return lines; - } - - /// يضبط الكاميرا على المسار كاملاً بدل نقطة واحدة. - /// - /// الحشوة السفلية أكبر لأن الورقة السفلية تغطّي نحو ثلث الشاشة — بلا ذلك - /// يختفي نصف المسار تحتها. - void _fitRoute() { - final encoded = widget.route?.encodedPoints; - if (encoded == null || encoded.isEmpty) return; - final points = _decodeRoute(encoded); - if (points.length < 2) return; - - var minLat = points.first.latitude, maxLat = points.first.latitude; - var minLng = points.first.longitude, maxLng = points.first.longitude; - for (final p in points) { - if (p.latitude < minLat) minLat = p.latitude; - if (p.latitude > maxLat) maxLat = p.latitude; - if (p.longitude < minLng) minLng = p.longitude; - if (p.longitude > maxLng) maxLng = p.longitude; - } - - // `mbgl::EdgeInsets` يرمي هو الآخر على NaN (`bottom must not be NaN`)، - // و`bottomInset` مشتقّ من `MediaQuery` فقد يصل صفراً أو NaN في أوّل إطار. - final bottom = widget.bottomInset.isFinite ? widget.bottomInset : 280.0; - - _controller?.animateCamera( - im.CameraUpdate.newLatLngBounds( - im.LatLngBounds( - southwest: im.LatLng(minLat, minLng), - northeast: im.LatLng(maxLat, maxLng), - ), - left: 48, - right: 48, - top: 120, - bottom: bottom, - ), - ); - } - - /// يحوّل الإحداثيات إلى بكسلات الشاشة لرسم الطبقة الفلاترية فوقها. - Future _syncPixels() async { - final controller = _controller; - if (controller == null || _syncing) return; - _syncing = true; - - // `getScreenCoordinate` يعبر إلى `mbgl::LatLng` هو الآخر — نفس الحارس. - Future px(GeoPoint? p, String tag) async { - final target = _safe(p, tag); - if (target == null) return null; - final point = await controller.getScreenCoordinate(target); - return Offset(point.x.toDouble(), point.y.toDouble()); - } - - try { - final results = await Future.wait([ - px(widget.origin, 'origin'), - px(widget.destination, 'destination'), - px(widget.driver, 'driver'), - ]); - if (!mounted) return; - setState(() { - _originPx = results[0]; - _destPx = results[1]; - _driverPx = results[2]; - }); - } catch (_) { - // الخريطة بين حالتين — تُخفى الطبقة بدل أن تُرسم في مكان خاطئ. - if (mounted) { - setState(() => _originPx = _destPx = _driverPx = null); - } - } finally { - _syncing = false; - } - } - - @override - Widget build(BuildContext context) { - final colors = context.tripzColors; - final isDark = Theme.of(context).brightness == Brightness.dark; - - // الخريطة تبدّل ستايلها مع الثيم — خريطة نهارية في وضع ليلي تكسر - // الغرض (docs/26 §2). وتبديله يهدم مديري التعليقات، فيُصفَّر العَلَم. - // - // **ستايل محلّي لا بعيد** — كما في سيرو الميداني حرفياً: - // `apps/rider/lib/views/home/map_widget.dart/google_map_passenger_widget.dart` - // يمرّر `'assets/style.json'` / `'assets/style_dark.json'` نفسهما، وملفّاه - // مطابقان لهذين طبقةً بطبقة (لا يختلفان إلا في اسم العلامة التجارية). - // ومعها نكسب الإقلاع بلا انتظار شبكة — وهو ما يعنيه «الشكل حتمي من أول - // إقلاع» (docs/26 §1). - // - // ملاحظة تصحيحية (2026-08-05): كان مكتوباً هنا أن ستايل map-saas البعيد - // هو سبب `std::domain_error` لأنه بلا `sprite`. **هذا خطأ.** الستايلات - // الخمسة (المحلّيان + البعيد + ستايلا الحزمة) اجتازت - // `validateStyleMin` من `@maplibre/maplibre-gl-style-spec` بصفر أخطاء، - // والسقوط تكرّر بالستايل المحلّي أيضاً. المصدر الحقيقي هو حارس - // الإحداثيات في `mbgl::LatLng`/`mbgl::EdgeInsets` — انظر `_safe` أعلاه. - final styleUrl = isDark ? _darkStyleAsset : _lightStyleAsset; - if (_styleUrl != null && _styleUrl != styleUrl) _styleReady = false; - _styleUrl = styleUrl; - - return Stack( - children: [ - im.IntaleqMap( - apiKey: AppConfig.mapApiKey, - // التنزيل المسبق للمناطق لا معنى له مع ستايل من `assets/` — الحزمة - // تتخطّاه على iOS أصلاً لكنها تترك عَلَم «جارٍ التنزيل» مرفوعاً، - // فنقفله من هنا بدل الاتّكال على ذلك. - autoCache: false, - initialCameraPosition: im.CameraPosition( - target: _safe(widget.origin, 'initialCamera') ?? _fallback, - zoom: 15, - ), - styleUrl: styleUrl, - // نقطة «موقعي» تُفعَّل **بعد** أن يصلنا موقع حقيقي لا عند الإنشاء. - // قبل ذلك يكون `MLNMapView.userLocation.coordinate` هو - // `kCLLocationCoordinate2DInvalid` أي (-180, -180) — وخط عرض -180 - // يخترق حارس `mbgl::LatLng` نفسه (`latitude must be between -90 - // and 90`). و`origin` لا يصير غير فارغ إلا بعد منح الإذن ووصول - // قراءة فعلية، فهو الشرط الصحيح تماماً. - myLocationEnabled: widget.origin != null, - compassEnabled: false, - zoomControlsEnabled: false, - onMapCreated: _onCreated, - onStyleLoaded: _onStyleLoaded, - onCameraMove: (position) { - _center = position.target; - // الطبقة تتبع الخريطة أثناء السحب لا بعده فقط. - _syncPixels(); - }, - onCameraIdle: () { - final c = _center; - if (c != null) { - widget.onCameraIdle?.call(GeoPoint(c.latitude, c.longitude)); - } - _syncPixels(); - }, - // **المسار وحده annotation** — لا بديل عنه، ومحروسٌ بعَلَم الستايل - // وبتصفية الإحداثيات (نقاط المسار تعبر إلى `mbgl::LatLng` أيضاً). - polylines: _routePolylines(colors.mapRoute, colors.info), - ), - - // ── الطبقة الفلاترية: نقاط وأسماء وسائق ────────────────────────── - _pin(_originPx, colors.mapOrigin, null), - _pin(_destPx, colors.mapDestination, Icons.place_rounded), - _pin(_driverPx, colors.info, Icons.local_taxi_rounded), - _label(_originPx, widget.originLabel, colors.mapOrigin), - _label(_destPx, widget.destinationLabel, colors.mapDestination), - ], - ); - } - - Widget _pin(Offset? px, Color color, IconData? icon) { - if (px == null) return const SizedBox.shrink(); - return Positioned( - left: px.dx - 14, - top: px.dy - 14, - child: IgnorePointer(child: MapPin(color: color, icon: icon)), - ); - } - - Widget _label(Offset? px, String text, Color color) { - if (px == null || text.isEmpty) return const SizedBox.shrink(); - return Positioned( - left: px.dx - 100, - top: px.dy - 52, - width: 200, - child: IgnorePointer( - child: Center(child: MapLabel(text: text, color: color)), - ), - ); - } -} diff --git a/apps/rider_new/lib/features/trip/view/widgets/ride_type_picker.dart b/apps/rider_new/lib/features/trip/view/widgets/ride_type_picker.dart deleted file mode 100644 index accc94e..0000000 --- a/apps/rider_new/lib/features/trip/view/widgets/ride_type_picker.dart +++ /dev/null @@ -1,157 +0,0 @@ -import 'package:flutter/material.dart'; - -import '../../../../core/design/tokens.dart'; -import '../../../../core/design/tripz_colors.dart'; -import '../../../../core/design/typography.dart'; -import '../../../../core/format/money.dart'; -import '../../../../core/l10n/l10n.dart'; -import '../../data/models/fare_quote.dart'; -import '../../data/models/ride_type.dart'; - -/// اختيار نوع الرحلة — **بالسعر تحت كل خيار**. -/// -/// كل الأنواع مسعَّرة دفعةً واحدة بعد اكتمال المسار، فالراكب يقارن الاقتصادي -/// بالمريح ويقرّر بنظرة. تبديل النوع لا يُطلق نداءً. -/// -/// القائمة نفسها من `GET /ride-types` لا من قائمة مكتوبة (docs/38 §7)، -/// و`women_only` علامة مرئية لا فلتر صامت. -class RideTypePicker extends StatelessWidget { - const RideTypePicker({ - super.key, - required this.types, - required this.selected, - required this.quotes, - required this.onSelect, - }); - - final List types; - final RideType? selected; - final Map quotes; - final ValueChanged onSelect; - - @override - Widget build(BuildContext context) { - if (types.isEmpty) return const SizedBox.shrink(); - final lang = Localizations.localeOf(context).languageCode; - - return SizedBox( - height: 96, - child: ListView.separated( - scrollDirection: Axis.horizontal, - itemCount: types.length, - separatorBuilder: (context, i) => const SizedBox(width: Space.xs), - itemBuilder: (context, i) { - final type = types[i]; - final quote = quotes[type.code]; - return _Tile( - type: type, - quote: quote, - selected: type.id == selected?.id, - label: type.nameFor(lang), - // نوعٌ بلا تعرفة نشطة **لا يُختار**: اختياره يُفشل طلب الرحلة - // بـ«No pricing available». يبقى ظاهراً معطّلاً كي يعرف المستخدم - // أن الخيار موجود لكنه غير متاح الآن — لا أن يختفي بلا تفسير. - enabled: quote != null, - onTap: () => onSelect(type), - ); - }, - ), - ); - } -} - -class _Tile extends StatelessWidget { - const _Tile({ - required this.type, - required this.quote, - required this.selected, - required this.label, - required this.enabled, - required this.onTap, - }); - - final RideType type; - final FareQuote? quote; - final bool selected; - final String label; - final bool enabled; - final VoidCallback onTap; - - @override - Widget build(BuildContext context) { - final scheme = context.colors; - final fare = quote; - final dim = scheme.onSurfaceVariant; - - return AnimatedContainer( - duration: Motion.tap, - curve: Motion.curve, - width: 112, - decoration: BoxDecoration( - color: - selected ? scheme.primaryContainer : context.tripzColors.surfaceRaised, - borderRadius: Radii.card_, - border: Border.all( - color: selected ? scheme.primary : scheme.outlineVariant, - width: selected ? 1.5 : 1, - ), - ), - child: InkWell( - onTap: enabled ? onTap : null, - borderRadius: Radii.card_, - child: Padding( - padding: const EdgeInsets.all(Space.xs), - child: Column( - mainAxisAlignment: MainAxisAlignment.center, - children: [ - Icon( - type.womenOnly - ? Icons.female_rounded - : type.vehicleKind == 'moto' - ? Icons.two_wheeler_rounded - : Icons.directions_car_rounded, - size: Sizes.icon, - color: !enabled - ? dim - : selected - ? scheme.onPrimaryContainer - : scheme.onSurface, - ), - const SizedBox(height: Space.xxs), - Text( - label, - maxLines: 1, - overflow: TextOverflow.ellipsis, - style: context.texts.labelMedium?.copyWith( - color: !enabled - ? dim - : selected - ? scheme.onPrimaryContainer - : null, - ), - ), - const SizedBox(height: Space.xxs), - // نوعٌ بلا تعرفة نشطة يظهر بشرطة بدل أن يُخفى: إخفاؤه يترك - // المستخدم يتساءل أين ذهب الخيار. - if (fare == null) - Text( - context.l10n.rideTypeUnavailable, - maxLines: 1, - style: context.texts.labelSmall?.copyWith(color: dim), - ) - else - Text( - Money.formatNum(fare.total!, fare.currency), - maxLines: 1, - style: numericStyle(context.texts.titleSmall).copyWith( - color: - selected ? scheme.onPrimaryContainer : scheme.primary, - ), - ), - ], - ), - ), - ), - ); - } -} diff --git a/apps/rider_new/lib/features/trip/view/widgets/route_timeline.dart b/apps/rider_new/lib/features/trip/view/widgets/route_timeline.dart deleted file mode 100644 index e2c0894..0000000 --- a/apps/rider_new/lib/features/trip/view/widgets/route_timeline.dart +++ /dev/null @@ -1,112 +0,0 @@ -import 'package:flutter/material.dart'; - -import '../../../../core/design/tokens.dart'; -import '../../../../core/design/tripz_colors.dart'; -import '../../../../core/l10n/l10n.dart'; - -/// الخط الزمني للمسار: المصدر ← المحطات ← الوجهة، بنقاط ملوّنة تطابق -/// علامات الخريطة كي يربط المستخدم بينهما بلا شرح. -class RouteTimeline extends StatelessWidget { - const RouteTimeline({ - super.key, - required this.originLabel, - required this.destinationLabel, - this.stopCount = 0, - this.onTapOrigin, - this.onTapDestination, - }); - - final String originLabel; - final String destinationLabel; - final int stopCount; - final VoidCallback? onTapOrigin; - final VoidCallback? onTapDestination; - - @override - Widget build(BuildContext context) { - final l10n = context.l10n; - final colors = context.tripzColors; - return Column( - children: [ - _Row( - color: colors.mapOrigin, - label: l10n.rideOrigin, - value: originLabel, - onTap: onTapOrigin, - ), - if (stopCount > 0) - for (var i = 0; i < stopCount; i++) - _Row( - color: colors.info, - label: l10n.rideStop(i + 1), - value: '', - ), - _Row( - color: colors.mapDestination, - label: l10n.rideDestination, - value: destinationLabel, - onTap: onTapDestination, - ), - ], - ); - } -} - -class _Row extends StatelessWidget { - const _Row({ - required this.color, - required this.label, - required this.value, - this.onTap, - }); - - final Color color; - final String label; - final String value; - final VoidCallback? onTap; - - @override - Widget build(BuildContext context) { - return InkWell( - onTap: onTap, - borderRadius: Radii.field_, - child: Padding( - padding: const EdgeInsets.symmetric(vertical: Space.sm), - child: Row( - children: [ - Container( - width: 10, - height: 10, - decoration: BoxDecoration(color: color, shape: BoxShape.circle), - ), - const SizedBox(width: Space.sm), - Expanded( - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Text( - label, - style: context.texts.labelSmall?.copyWith( - color: context.colors.onSurfaceVariant, - ), - ), - Text( - value.isEmpty ? '—' : value, - maxLines: 1, - overflow: TextOverflow.ellipsis, - style: context.texts.bodyMedium, - ), - ], - ), - ), - if (onTap != null) - Icon( - Icons.chevron_left_rounded, - color: context.colors.onSurfaceVariant, - ), - ], - ), - ), - ); - } -} diff --git a/apps/rider_new/lib/features/trip/view/widgets/searching_sheet.dart b/apps/rider_new/lib/features/trip/view/widgets/searching_sheet.dart deleted file mode 100644 index d8e2830..0000000 --- a/apps/rider_new/lib/features/trip/view/widgets/searching_sheet.dart +++ /dev/null @@ -1,112 +0,0 @@ -import 'package:flutter/material.dart'; -import 'package:flutter_bloc/flutter_bloc.dart'; - -import '../../../../core/design/tokens.dart'; -import '../../../../core/design/tripz_colors.dart'; -import '../../../../core/l10n/l10n.dart'; -import '../../../../core/ui/tripz_button.dart'; -import '../../cubit/ride_cubit.dart'; - -/// نافذة البحث عن سائق. -/// -/// **لا تُغلق بالسحب — بزر الإلغاء وحده** (قرار تصميمي مثبت ميدانياً، -/// docs/39 §3): المستخدم لا يزيح شاشة البحث بالخطأ فيفقد أثر رحلته. -/// الويدجت «غبي» بلا منطق — المهلة والاستطلاع في الكيوبت. -class SearchingSheet extends StatefulWidget { - const SearchingSheet({super.key}); - - @override - State createState() => _SearchingSheetState(); -} - -class _SearchingSheetState extends State - with SingleTickerProviderStateMixin { - late final AnimationController _radar = AnimationController( - vsync: this, - duration: const Duration(seconds: 2), - )..repeat(); - - @override - void dispose() { - _radar.dispose(); - super.dispose(); - } - - @override - Widget build(BuildContext context) { - final l10n = context.l10n; - return Column( - mainAxisSize: MainAxisSize.min, - crossAxisAlignment: CrossAxisAlignment.stretch, - children: [ - SizedBox( - height: 120, - child: Center( - child: RepaintBoundary( - child: AnimatedBuilder( - animation: _radar, - builder: (context, _) => CustomPaint( - size: const Size(120, 120), - painter: _RadarPainter( - progress: _radar.value, - color: context.colors.primary, - ), - ), - ), - ), - ), - ), - const SizedBox(height: Space.md), - Text( - l10n.rideSearchingTitle, - textAlign: TextAlign.center, - style: context.texts.titleMedium, - ), - const SizedBox(height: Space.xxs), - Text( - l10n.rideSearchingLead, - textAlign: TextAlign.center, - style: context.texts.bodySmall?.copyWith( - color: context.colors.onSurfaceVariant, - ), - ), - const SizedBox(height: Space.lg), - TripzButton.secondary( - label: l10n.rideCancelSearch, - expanded: true, - onPressed: context.read().cancelTrip, - ), - ], - ); - } -} - -class _RadarPainter extends CustomPainter { - const _RadarPainter({required this.progress, required this.color}); - - final double progress; - final Color color; - - @override - void paint(Canvas canvas, Size size) { - final center = size.center(Offset.zero); - final maxRadius = size.width / 2; - - // ثلاث حلقات متتابعة الطور — إحساس بالبثّ المستمر لا بنبضة واحدة. - for (var i = 0; i < 3; i++) { - final t = (progress + i / 3) % 1.0; - canvas.drawCircle( - center, - maxRadius * t, - Paint() - ..style = PaintingStyle.stroke - ..strokeWidth = 2 - ..color = color.withValues(alpha: (1 - t) * 0.6), - ); - } - canvas.drawCircle(center, 8, Paint()..color = color); - } - - @override - bool shouldRepaint(_RadarPainter old) => old.progress != progress; -} diff --git a/apps/rider_new/lib/features/trip/view/widgets/trip_contact_row.dart b/apps/rider_new/lib/features/trip/view/widgets/trip_contact_row.dart deleted file mode 100644 index b36997a..0000000 --- a/apps/rider_new/lib/features/trip/view/widgets/trip_contact_row.dart +++ /dev/null @@ -1,174 +0,0 @@ -import 'package:flutter/material.dart'; -import 'package:go_router/go_router.dart'; -import 'package:url_launcher/url_launcher.dart'; - -import '../../../../core/build_config.dart'; -import '../../../../core/design/tokens.dart'; -import '../../../../core/design/tripz_colors.dart'; -import '../../../../core/l10n/l10n.dart'; -import '../../../../core/router.dart'; -import '../../../../core/tenant/feature_gate.dart'; -import '../../data/models/trip.dart'; - -/// طرق التواصل مع السائق في صفّ واحد — نمط سيرو -/// (`controller/functions/launch.dart`: هاتف · رسالة · واتساب). -/// -/// **ثلاثة أفعال لا زرّ واحد**: الشبكة تسقط فتفشل المحادثة داخل التطبيق، -/// وحينها يبقى الاتصال الهاتفي العادي — وهو الوحيد الذي يعمل بلا إنترنت. -/// لذلك لا يُختزل شيء منها في قائمة مخفيّة. -/// -/// **المكالمة المجانية (VoIP) غير موجودة هنا** عن قصد: `Features.calls` -/// مطفأ لأن WebRTC لم يُبنَ في التطبيق بعد (الخادم يدعمه — `call:*` في -/// docs/38 §9). حين يُبنى يُضاف زرّ رابع خلف نفس العَلَم. -class TripContactRow extends StatelessWidget { - const TripContactRow({super.key, required this.trip}); - - final Trip trip; - - @override - Widget build(BuildContext context) { - final l10n = context.l10n; - final phone = trip.driverPhone; - final hasPhone = phone != null && phone.trim().isNotEmpty; - - return Row( - children: [ - if (Features.chat && context.tenantHas('chat')) - Expanded( - child: _ContactAction( - icon: Icons.forum_outlined, - label: l10n.chatTitle, - onTap: () => context.push('${Routes.chat}?trip=${trip.id}'), - ), - ), - if (hasPhone) ...[ - const SizedBox(width: Space.xs), - Expanded( - child: _ContactAction( - icon: Icons.call_outlined, - label: l10n.tripCall, - onTap: () => _launch('tel:${_clean(phone)}'), - ), - ), - const SizedBox(width: Space.xs), - Expanded( - child: _ContactAction( - icon: Icons.sms_outlined, - label: l10n.tripMessage, - onTap: () => _launch('sms:${_clean(phone)}'), - ), - ), - ], - ], - ); - } - - /// الأرقام تصل بصيغ مختلفة (`0790…`, `+962790…`, بمسافات) — يُنظَّف الرقم - /// من كل ما ليس رقماً أو `+`، وإلا رفضه `tel:` صامتاً. - static String _clean(String raw) { - final kept = raw.replaceAll(RegExp(r'[^0-9+]'), ''); - return kept.isEmpty ? raw : kept; - } - - static Future _launch(String url) async { - final uri = Uri.tryParse(url); - if (uri == null) return; - // جهازٌ بلا تطبيق هاتف (جهاز لوحي) يفشل هنا — لا يُسقط الشاشة. - await launchUrl(uri, mode: LaunchMode.externalApplication); - } -} - -class _ContactAction extends StatelessWidget { - const _ContactAction({ - required this.icon, - required this.label, - required this.onTap, - }); - - final IconData icon; - final String label; - final VoidCallback onTap; - - @override - Widget build(BuildContext context) { - return Material( - color: context.colors.surfaceContainerHighest, - borderRadius: Radii.card_, - child: InkWell( - onTap: onTap, - borderRadius: Radii.card_, - child: Padding( - padding: const EdgeInsets.symmetric(vertical: Space.sm), - child: Column( - mainAxisSize: MainAxisSize.min, - children: [ - Icon(icon, size: Sizes.iconSm, color: context.colors.primary), - const SizedBox(height: Space.xxs), - Text( - label, - maxLines: 1, - overflow: TextOverflow.ellipsis, - style: context.texts.labelSmall, - ), - ], - ), - ), - ), - ); - } -} - -/// شريط «كم بقي» — الوقت والمسافة من مسار الاقتراب الحيّ. -/// -/// هذا **أكثر ما يسأل عنه الراكب** بعد وصول السائق للشاشة، وكان غائباً -/// تماماً: البطاقة كانت تقول «السائق في الطريق» بلا رقم واحد. -class TripEtaStrip extends StatelessWidget { - const TripEtaStrip({ - super.key, - required this.minutes, - required this.km, - }); - - final double minutes; - final double km; - - @override - Widget build(BuildContext context) { - final l10n = context.l10n; - return Container( - padding: const EdgeInsets.symmetric( - horizontal: Space.md, - vertical: Space.sm, - ), - decoration: BoxDecoration( - color: context.tripzColors.info.withValues(alpha: 0.10), - borderRadius: Radii.card_, - ), - child: Row( - mainAxisAlignment: MainAxisAlignment.center, - children: [ - Icon( - Icons.access_time_rounded, - size: Sizes.iconSm, - color: context.tripzColors.info, - ), - const SizedBox(width: Space.xs), - Text( - // أقلّ من دقيقة يُعرض «1» لا «0» — «0 دقيقة» تعني «وصل» وهي كذبة. - l10n.rideEta(minutes < 1 ? '1' : minutes.round().toString()), - style: context.texts.titleSmall, - ), - const SizedBox(width: Space.sm), - Text('·', style: context.texts.titleSmall), - const SizedBox(width: Space.sm), - Text( - l10n.rideDistanceKm(km.toStringAsFixed(1)), - style: context.texts.bodyMedium?.copyWith( - color: context.colors.onSurfaceVariant, - ), - ), - ], - ), - ); - } -} diff --git a/apps/rider_new/lib/features/trip/view/widgets/vehicle_color.dart b/apps/rider_new/lib/features/trip/view/widgets/vehicle_color.dart deleted file mode 100644 index cd9ddc2..0000000 --- a/apps/rider_new/lib/features/trip/view/widgets/vehicle_color.dart +++ /dev/null @@ -1,67 +0,0 @@ -import 'package:flutter/material.dart'; - -/// يحوّل لون المركبة — hex أو اسماً — إلى لون يُرسم به. -/// -/// الخادم غير متّسق عمداً: `vehicles` عندها `color_hex` بينما حدث `assigned` -/// يرسل `color` اسماً (`trips.service.ts:427`). فالمُحوِّل يقبل الاثنين -/// ويُقدّم الـhex لأنه دقيق. -/// -/// الأسماء تُطابَق **بالعربية والإنجليزية معاً**: السائقون يُدخلونها بلغتهم، -/// وقائمة إنجليزية وحدها تعني رمادياً افتراضياً لنصف الأسطول. -class VehicleColor { - const VehicleColor._(); - - /// اللون الذي يُرسم به رمز السيارة، أو `null` إن تعذّرت المطابقة — - /// و`null` تعني «لا تلوّن» لا «لوّن رمادياً»، فالرمادي لونُ سيارةٍ حقيقي - /// ولا يصحّ أن يعني «مجهول». - static Color? resolve({String? hex, String? name}) => - _fromHex(hex) ?? _fromName(name); - - static Color? _fromHex(String? hex) { - if (hex == null) return null; - var raw = hex.replaceFirst('#', '').trim(); - if (raw.length == 3) { - // ‏`#f00` → `#ff0000`: صيغة مختصرة شائعة في لوحات الإدارة. - raw = raw.split('').map((c) => '$c$c').join(); - } - if (raw.length == 6) raw = 'FF$raw'; - if (raw.length != 8) return null; - final value = int.tryParse(raw, radix: 16); - return value == null ? null : Color(value); - } - - static const _names = { - 'white': Colors.white, - 'أبيض': Colors.white, - 'black': Colors.black, - 'أسود': Colors.black, - 'silver': Color(0xFFC0C0C0), - 'فضي': Color(0xFFC0C0C0), - 'grey': Color(0xFF808080), - 'gray': Color(0xFF808080), - 'رمادي': Color(0xFF808080), - 'red': Color(0xFFD32F2F), - 'أحمر': Color(0xFFD32F2F), - 'blue': Color(0xFF1976D2), - 'أزرق': Color(0xFF1976D2), - 'green': Color(0xFF388E3C), - 'أخضر': Color(0xFF388E3C), - 'yellow': Color(0xFFFBC02D), - 'أصفر': Color(0xFFFBC02D), - 'orange': Color(0xFFF57C00), - 'برتقالي': Color(0xFFF57C00), - 'brown': Color(0xFF6D4C41), - 'بني': Color(0xFF6D4C41), - 'beige': Color(0xFFE8DCC4), - 'بيج': Color(0xFFE8DCC4), - 'gold': Color(0xFFC9A227), - 'ذهبي': Color(0xFFC9A227), - 'navy': Color(0xFF1A2340), - 'كحلي': Color(0xFF1A2340), - }; - - static Color? _fromName(String? name) { - if (name == null) return null; - return _names[name.trim().toLowerCase()]; - } -} diff --git a/apps/rider_new/lib/features/wallet/cubit/wallet_cubit.dart b/apps/rider_new/lib/features/wallet/cubit/wallet_cubit.dart deleted file mode 100644 index 5dca2d2..0000000 --- a/apps/rider_new/lib/features/wallet/cubit/wallet_cubit.dart +++ /dev/null @@ -1,59 +0,0 @@ -import 'package:flutter_bloc/flutter_bloc.dart'; - -import '../../../core/api/api_exception.dart'; -import '../../../core/ui/view_status.dart'; -import '../data/wallet_repository.dart'; -import 'wallet_state.dart'; - -class WalletCubit extends Cubit { - WalletCubit(this._repo) : super(const WalletState()); - - final WalletRepository _repo; - - Future load() async { - emit(state.copyWith(status: ViewStatus.loading)); - try { - final wallet = await _repo.wallet(); - final txns = await _repo.transactions(); - if (isClosed) return; - emit(state.copyWith( - status: ViewStatus.success, - wallet: wallet, - transactions: txns, - )); - } on ApiException catch (e) { - if (!isClosed) { - emit(state.copyWith(status: ViewStatus.error, error: e.message)); - } - } - } - - /// شحن حقيقي. **لا يزيد الرصيد فوراً** إلا في نمط الدفع الفوري — الفاتورة - /// تُعرض للمستخدم ويحوّل، والتسوية تصل لاحقاً عبر مطابقة رسالة المزوّد. - Future topup({required num amount, required String provider}) async { - if (amount <= 0) return; - emit(state.copyWith(action: WalletAction.toppingUp)); - try { - final result = await _repo.charge( - amount: amount, - provider: provider, - currency: state.currency, - ); - if (isClosed) return; - - if (result.isInstant) { - emit(state.copyWith(action: WalletAction.topupDone)); - // الرصيد يُعاد جلبه من الخادم لا يُحسب محلياً: المال لا يُقدَّر - // في التطبيق (docs/23 §0.2). - await load(); - return; - } - emit(state.copyWith( - action: WalletAction.invoiceReady, - invoice: result, - )); - } on ApiException { - if (!isClosed) emit(state.copyWith(action: WalletAction.topupFailed)); - } - } -} diff --git a/apps/rider_new/lib/features/wallet/cubit/wallet_state.dart b/apps/rider_new/lib/features/wallet/cubit/wallet_state.dart deleted file mode 100644 index 121258f..0000000 --- a/apps/rider_new/lib/features/wallet/cubit/wallet_state.dart +++ /dev/null @@ -1,56 +0,0 @@ -import 'package:equatable/equatable.dart'; - -import '../../../core/ui/view_status.dart'; -import '../data/models/wallet.dart'; -import '../data/models/wallet_txn.dart'; -import '../data/wallet_repository.dart'; - -enum WalletAction { none, toppingUp, topupFailed, topupDone, invoiceReady } - -class WalletState extends Equatable { - const WalletState({ - this.status = ViewStatus.idle, - this.wallet, - this.transactions = const [], - this.action = WalletAction.none, - this.invoice, - this.error, - }); - - final ViewStatus status; - final Wallet? wallet; - final List transactions; - - /// فعلٌ جارٍ داخل الشاشة — منفصل عن [status] كي لا يُخفي الشحنُ الرصيدَ - /// المعروض خلفه. - final WalletAction action; - - /// فاتورة تحويل بانتظار الدفع — تُعرض للمستخدم بمرجعها وحساب الاستلام. - final TopupResult? invoice; - - final String? error; - - String get currency => wallet?.currency ?? ''; - - WalletState copyWith({ - ViewStatus? status, - Wallet? wallet, - List? transactions, - WalletAction? action, - TopupResult? invoice, - String? error, - }) { - return WalletState( - status: status ?? this.status, - wallet: wallet ?? this.wallet, - transactions: transactions ?? this.transactions, - action: action ?? this.action, - invoice: invoice ?? this.invoice, - error: error ?? this.error, - ); - } - - @override - List get props => - [status, wallet, transactions, action, invoice?.reference, error]; -} diff --git a/apps/rider_new/lib/features/wallet/data/models/wallet.dart b/apps/rider_new/lib/features/wallet/data/models/wallet.dart deleted file mode 100644 index b10a0e1..0000000 --- a/apps/rider_new/lib/features/wallet/data/models/wallet.dart +++ /dev/null @@ -1,31 +0,0 @@ -import 'package:equatable/equatable.dart'; - -/// المحفظة كما يرجّعها `GET /wallet` (شكل مُتحقَّق حيّاً، docs/38 §6). -/// -/// ⚠️ **محفظتان لا واحدة**: محفظة الراكب **التزام** على المنصّة (رصيدٌ دفعه -/// ولم يستهلكه بعد)، ومحفظة السائق **إيراد** له. دمجهما في شاشة أو حساب -/// واحد خطأ محاسبي لا تجميلي — لذلك لا تُوحَّد شاشتاهما (docs/39 §4). -class Wallet extends Equatable { - const Wallet({ - required this.id, - required this.balance, - required this.currency, - }); - - final String id; - - /// نصّ لا رقم (`"0.000"`) — يُحوَّل عبر `Money` عند الحاجة فقط. - final String balance; - - /// من إعداد المستأجر: `JOD`/`EGP`/`SYP` — لا تُثبَّت في التطبيق. - final String currency; - - factory Wallet.fromJson(Map json) => Wallet( - id: json['id'] as String? ?? '', - balance: json['balance']?.toString() ?? '0', - currency: json['currency'] as String? ?? '', - ); - - @override - List get props => [id, balance, currency]; -} diff --git a/apps/rider_new/lib/features/wallet/data/models/wallet_txn.dart b/apps/rider_new/lib/features/wallet/data/models/wallet_txn.dart deleted file mode 100644 index 75e5204..0000000 --- a/apps/rider_new/lib/features/wallet/data/models/wallet_txn.dart +++ /dev/null @@ -1,29 +0,0 @@ -import 'package:equatable/equatable.dart'; - -class WalletTxn extends Equatable { - const WalletTxn({ - required this.id, - required this.amount, - required this.reason, - this.createdAt, - }); - - final String id; - - /// موجب = دخول، سالب = خروج. النصّ كما وصل، والإشارة تُقرأ منه. - final String amount; - final String reason; - final DateTime? createdAt; - - factory WalletTxn.fromJson(Map json) => WalletTxn( - id: json['id']?.toString() ?? '', - amount: json['amount']?.toString() ?? '0', - reason: json['reason'] as String? ?? json['type'] as String? ?? '', - createdAt: DateTime.tryParse(json['created_at']?.toString() ?? ''), - ); - - bool get isCredit => !amount.trim().startsWith('-'); - - @override - List get props => [id, amount, reason, createdAt]; -} diff --git a/apps/rider_new/lib/features/wallet/data/wallet_repository.dart b/apps/rider_new/lib/features/wallet/data/wallet_repository.dart deleted file mode 100644 index 70ea750..0000000 --- a/apps/rider_new/lib/features/wallet/data/wallet_repository.dart +++ /dev/null @@ -1,109 +0,0 @@ -import '../../../core/api/api_client.dart'; -import 'models/wallet.dart'; -import 'models/wallet_txn.dart'; - -/// نتيجة الشحن — ثلاثة أنماط: فوري · فاتورة · إعادة توجيه. -class TopupResult { - const TopupResult({ - required this.status, - this.reference, - this.transferTarget, - this.instructions, - this.redirectUrl, - }); - - final String status; - - /// مرجع الفاتورة الذي يذكره المستخدم عند التحويل — به تُطابَق رسالة - /// المزوّد لاحقاً. - final String? reference; - - /// حساب/رقم استلام المستأجر عند هذا المزوّد. - final String? transferTarget; - - final String? instructions; - final String? redirectUrl; - - bool get isInvoice => reference != null; - bool get isInstant => status == 'success'; - bool get isRedirect => redirectUrl != null; -} - -class WalletRepository { - WalletRepository(this._api); - - final ApiClient _api; - - Future wallet() async { - final res = await _api.get>('/wallet'); - return Wallet.fromJson(res); - } - - Future> transactions() async { - final res = await _api.get>('/wallet/transactions'); - return res - .whereType>() - .map(WalletTxn.fromJson) - .toList(growable: false); - } - - /// شحن حقيقي عبر `POST /payments/charge`. - /// - /// **لا يزيد الرصيد فوراً.** كليك وشام كاش وزين كاش تعمل بنمط الفاتورة: - /// الخادم يولّد مرجعاً ويعرض حساب الاستلام، ثم يحوّل المستخدم، والتسوية - /// تصل لاحقاً عبر مطابقة رسالة المزوّد. هذا **نفس مسار سيرو** حرفياً. - /// PayMob وحده يرجّع رابط إعادة توجيه، و`cash` وحده فوري. - Future charge({ - required num amount, - required String provider, - required String currency, - }) async { - final res = await _api.post>( - '/payments/charge', - body: { - 'amount': amount, - 'provider': provider, - 'purpose': 'topup', - 'currency': currency, - }, - ); - final payment = res['payment'] as Map?; - return TopupResult( - status: payment?['status'] as String? ?? 'pending', - reference: res['reference'] as String?, - transferTarget: res['transferTarget'] as String?, - instructions: res['instructions'] as String?, - redirectUrl: res['redirectUrl'] as String?, - ); - } - - // ── السحب: خطوتان لا خطوة ──────────────────────────────────────────── - // `request` يرسل رمزاً **بلا خصم**، و`confirm` هو ما يخصم ويحجز - // (docs/38 §6). شاشة سيرو كانت خطوة واحدة — لا تُقلَّد. - - Future<({String payoutId, String? devCode})> requestPayout({ - required num amount, - required String channel, - }) async { - final res = await _api.post>( - '/payouts/request', - body: {'amount': amount, 'channel': channel}, - ); - final payout = res['payout'] as Map?; - return ( - payoutId: payout?['id'] as String? ?? '', - devCode: res['dev_code']?.toString(), - ); - } - - Future confirmPayout(String payoutId, String code) => - _api.post>( - '/payouts/$payoutId/confirm', - body: {'code': code}, - ); - - Future>> payouts() async { - final res = await _api.get>('/payouts/mine'); - return res.whereType>().toList(growable: false); - } -} diff --git a/apps/rider_new/lib/features/wallet/view/wallet_page.dart b/apps/rider_new/lib/features/wallet/view/wallet_page.dart deleted file mode 100644 index e2a03a9..0000000 --- a/apps/rider_new/lib/features/wallet/view/wallet_page.dart +++ /dev/null @@ -1,156 +0,0 @@ -import 'package:flutter/material.dart'; -import 'package:flutter_bloc/flutter_bloc.dart'; - -import '../../../core/design/tokens.dart'; -import '../../../core/design/tripz_colors.dart'; -import '../../../core/di.dart'; -import '../../../core/l10n/l10n.dart'; -import '../../../core/payments/payment_channels.dart'; -import '../../../core/tenant/tenant_cubit.dart'; -import '../../../core/ui/channel_picker.dart'; -import '../../../core/ui/empty_view.dart'; -import '../../../core/ui/status_banner.dart'; -import '../../../core/ui/tripz_button.dart'; -import '../../../core/ui/tripz_scaffold.dart'; -import '../../../core/ui/tripz_sheet.dart'; -import '../../../core/ui/tripz_text_field.dart'; -import '../cubit/wallet_cubit.dart'; -import '../cubit/wallet_state.dart'; -import 'widgets/balance_card.dart'; -import 'widgets/invoice_sheet.dart'; -import 'widgets/txn_tile.dart'; - -/// محفظة الراكب — **رصيدٌ دفعه ولم يستهلكه**، أي التزامٌ على المنصّة. -/// شاشة السائق مختلفة عمداً (أرباح + سحب): لا تُوحَّدان (docs/39 §4). -class WalletPage extends StatefulWidget { - const WalletPage({super.key}); - - @override - State createState() => _WalletPageState(); -} - -class _WalletPageState extends State { - late final WalletCubit _cubit = sl()..load(); - - @override - void dispose() { - _cubit.close(); - super.dispose(); - } - - @override - Widget build(BuildContext context) { - final l10n = context.l10n; - return BlocProvider.value( - value: _cubit, - child: BlocConsumer( - listenWhen: (p, n) => p.action != n.action, - listener: (context, state) { - if (state.action == WalletAction.topupFailed) { - ScaffoldMessenger.of(context).showSnackBar( - SnackBar(content: Text(l10n.walletTopupFailed)), - ); - } - // الفاتورة تُعرض فور جهوزها: المستخدم يحتاج المرجع وحساب الاستلام - // قبل أن يغادر التطبيق ليحوّل. - final invoice = state.invoice; - if (state.action == WalletAction.invoiceReady && invoice != null) { - TripzSheet.show(context, child: InvoiceSheet(invoice: invoice)); - } - }, - builder: (context, state) { - return TripzScaffold( - title: l10n.walletTitle, - status: state.status, - error: state.error, - onRetry: _cubit.load, - child: ListView( - children: [ - BalanceCard( - label: l10n.walletBalance, - balance: state.wallet?.balance, - currency: state.currency, - action: TripzButton.primary( - label: l10n.walletTopup, - loading: state.action == WalletAction.toppingUp, - onPressed: () => _openTopup(context), - ), - ), - const SizedBox(height: Space.lg), - Text(l10n.walletTransactions, style: context.texts.titleMedium), - const SizedBox(height: Space.xs), - if (state.transactions.isEmpty) - Padding( - padding: const EdgeInsets.only(top: Space.xl), - child: EmptyView( - icon: Icons.receipt_long_outlined, - message: l10n.walletEmpty, - ), - ) - else - for (final txn in state.transactions) - TxnTile(txn: txn, currency: state.currency), - ], - ), - ); - }, - ), - ); - } - - void _openTopup(BuildContext context) { - final l10n = context.l10n; - final controller = TextEditingController(); - // القنوات من حزمة دولة المستأجر لا من لغة الجهاز (docs/38 §10). - final channels = PaymentChannel.forCountry( - context.read().state.countryPack, - ); - var channel = channels.first; - - TripzSheet.show( - context, - title: l10n.walletTopup, - child: StatefulBuilder( - builder: (context, setState) => Column( - mainAxisSize: MainAxisSize.min, - crossAxisAlignment: CrossAxisAlignment.stretch, - children: [ - TripzTextField( - controller: controller, - label: l10n.walletTopupAmount, - numeric: true, - autofocus: true, - keyboardType: const TextInputType.numberWithOptions(decimal: true), - ), - const SizedBox(height: Space.md), - Text(l10n.walletChannel, style: context.texts.titleSmall), - const SizedBox(height: Space.xs), - ChannelPicker( - channels: channels, - selected: channel, - onSelect: (c) => setState(() => channel = c), - ), - const SizedBox(height: Space.md), - // الشحن ليس فورياً في قنوات الفاتورة — يُقال قبل الضغط لا بعده. - if (channel != PaymentChannel.cash) - StatusBanner( - message: l10n.walletInvoicePending, - tone: BannerTone.info, - icon: Icons.schedule_rounded, - ), - ], - ), - ), - bottomAction: TripzButton.primary( - label: l10n.walletTopup, - onPressed: () { - final amount = num.tryParse(controller.text.trim()); - Navigator.of(context).pop(); - if (amount != null) { - _cubit.topup(amount: amount, provider: channel.wire); - } - }, - ), - ); - } -} diff --git a/apps/rider_new/lib/features/wallet/view/widgets/balance_card.dart b/apps/rider_new/lib/features/wallet/view/widgets/balance_card.dart deleted file mode 100644 index 469815a..0000000 --- a/apps/rider_new/lib/features/wallet/view/widgets/balance_card.dart +++ /dev/null @@ -1,67 +0,0 @@ -import 'package:flutter/material.dart'; - -import '../../../../core/design/tokens.dart'; -import '../../../../core/design/tripz_colors.dart'; -import '../../../../core/design/typography.dart'; -import '../../../../core/format/money.dart'; - -/// بطاقة الرصيد — الرقم هو بطل الشاشة، فيأخذ أكبر حجم وأعلى تباين. -class BalanceCard extends StatelessWidget { - const BalanceCard({ - super.key, - required this.label, - required this.balance, - required this.currency, - this.hint, - this.action, - }); - - final String label; - final String? balance; - final String currency; - final String? hint; - final Widget? action; - - @override - Widget build(BuildContext context) { - return Container( - width: double.infinity, - padding: Space.page, - decoration: BoxDecoration( - color: context.colors.primaryContainer, - borderRadius: Radii.card_, - ), - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Text( - label, - style: context.texts.labelLarge?.copyWith( - color: context.colors.onPrimaryContainer, - ), - ), - const SizedBox(height: Space.xs), - Text( - Money.format(balance, currency), - style: numericStyle(context.texts.displaySmall).copyWith( - color: context.colors.onPrimaryContainer, - ), - ), - if (hint != null) ...[ - const SizedBox(height: Space.xxs), - Text( - hint!, - style: context.texts.bodySmall?.copyWith( - color: context.colors.onPrimaryContainer.withValues(alpha: 0.8), - ), - ), - ], - if (action != null) ...[ - const SizedBox(height: Space.md), - action!, - ], - ], - ), - ); - } -} diff --git a/apps/rider_new/lib/features/wallet/view/widgets/invoice_sheet.dart b/apps/rider_new/lib/features/wallet/view/widgets/invoice_sheet.dart deleted file mode 100644 index 3e3834c..0000000 --- a/apps/rider_new/lib/features/wallet/view/widgets/invoice_sheet.dart +++ /dev/null @@ -1,105 +0,0 @@ -import 'package:flutter/material.dart'; -import 'package:flutter/services.dart'; - -import '../../../../core/design/tokens.dart'; -import '../../../../core/design/tripz_colors.dart'; -import '../../../../core/design/typography.dart'; -import '../../../../core/l10n/l10n.dart'; -import '../../../../core/ui/status_banner.dart'; -import '../../data/wallet_repository.dart'; - -/// فاتورة التحويل — نمط سيرو حرفياً (`create_cliq_invoice.php`). -/// -/// المستخدم يحوّل بنفسه إلى حساب المشغّل ويذكر المرجع، والتسوية تصل لاحقاً -/// بمطابقة رسالة المزوّد. **الرصيد لا يزيد الآن** — وهذا يُقال صراحةً بدل -/// أن ينتظر المستخدم رقماً لن يتغيّر. -class InvoiceSheet extends StatelessWidget { - const InvoiceSheet({super.key, required this.invoice}); - - final TopupResult invoice; - - @override - Widget build(BuildContext context) { - final l10n = context.l10n; - final target = invoice.transferTarget; - - return Column( - mainAxisSize: MainAxisSize.min, - crossAxisAlignment: CrossAxisAlignment.stretch, - children: [ - Text(l10n.walletInvoiceTitle, style: context.texts.titleLarge), - const SizedBox(height: Space.md), - - // حساب الاستلام قد لا يكون مضبوطاً للمستأجر — يُقال بوضوح بدل تعليمات - // ناقصة تُرسل المال إلى لا مكان. - if (target == null || target.isEmpty) - StatusBanner(message: l10n.walletNoTarget, tone: BannerTone.danger) - else - _CopyRow(label: l10n.walletInvoiceTarget, value: target), - - const SizedBox(height: Space.sm), - if (invoice.reference != null) - _CopyRow(label: l10n.walletInvoiceRef, value: invoice.reference!), - - const SizedBox(height: Space.md), - StatusBanner( - message: l10n.walletInvoicePending, - tone: BannerTone.info, - icon: Icons.schedule_rounded, - ), - ], - ); - } -} - -/// قيمة مع زرّ نسخ — الرقم يُحوَّل يدوياً في تطبيق بنك آخر، فالنسخ ليس رفاهية. -class _CopyRow extends StatelessWidget { - const _CopyRow({required this.label, required this.value}); - - final String label; - final String value; - - @override - Widget build(BuildContext context) { - return Container( - padding: Space.page, - decoration: BoxDecoration( - color: context.colors.surfaceContainerHighest, - borderRadius: Radii.card_, - ), - child: Row( - children: [ - Expanded( - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Text( - label, - style: context.texts.labelSmall?.copyWith( - color: context.colors.onSurfaceVariant, - ), - ), - const SizedBox(height: Space.xxs), - SelectableText( - value, - textDirection: TextDirection.ltr, - style: numericStyle(context.texts.titleMedium), - ), - ], - ), - ), - IconButton( - icon: const Icon(Icons.copy_rounded), - tooltip: context.l10n.walletCopy, - onPressed: () { - Clipboard.setData(ClipboardData(text: value)); - ScaffoldMessenger.of(context).showSnackBar( - SnackBar(content: Text(context.l10n.walletCopied)), - ); - }, - ), - ], - ), - ); - } -} diff --git a/apps/rider_new/lib/features/wallet/view/widgets/txn_tile.dart b/apps/rider_new/lib/features/wallet/view/widgets/txn_tile.dart deleted file mode 100644 index dacd33f..0000000 --- a/apps/rider_new/lib/features/wallet/view/widgets/txn_tile.dart +++ /dev/null @@ -1,49 +0,0 @@ -import 'package:flutter/material.dart'; - -import '../../../../core/design/tokens.dart'; -import '../../../../core/design/tripz_colors.dart'; -import '../../../../core/design/typography.dart'; -import '../../../../core/format/money.dart'; -import '../../data/models/wallet_txn.dart'; - -class TxnTile extends StatelessWidget { - const TxnTile({super.key, required this.txn, required this.currency}); - - final WalletTxn txn; - final String currency; - - @override - Widget build(BuildContext context) { - final colors = context.tripzColors; - final isCredit = txn.isCredit; - - return ListTile( - contentPadding: EdgeInsets.zero, - leading: CircleAvatar( - backgroundColor: - (isCredit ? colors.success : colors.danger).withValues(alpha: 0.12), - child: Icon( - isCredit ? Icons.south_west_rounded : Icons.north_east_rounded, - size: Sizes.iconSm, - color: isCredit ? colors.success : colors.danger, - ), - ), - title: Text(txn.reason, style: context.texts.bodyMedium), - subtitle: txn.createdAt == null - ? null - : Text( - // التاريخ بصيغة الـlocale (docs/26 §5). - MaterialLocalizations.of(context).formatFullDate(txn.createdAt!), - style: context.texts.bodySmall?.copyWith( - color: context.colors.onSurfaceVariant, - ), - ), - trailing: Text( - Money.format(txn.amount, currency), - style: numericStyle(context.texts.titleSmall).copyWith( - color: isCredit ? colors.success : colors.danger, - ), - ), - ); - } -} diff --git a/apps/rider_new/lib/main.dart b/apps/rider_new/lib/main.dart deleted file mode 100644 index 955cded..0000000 --- a/apps/rider_new/lib/main.dart +++ /dev/null @@ -1,15 +0,0 @@ -import 'package:flutter/material.dart'; -import 'package:flutter_bloc/flutter_bloc.dart'; - -import 'app.dart'; -import 'core/di.dart'; -import 'core/session/session_cubit.dart'; - -Future main() async { - WidgetsFlutterBinding.ensureInitialized(); - await setupInjector(); - runApp( - // الجلسة فوق الجميع: الراوتر والشاشات يقرآنها من نقطة واحدة. - BlocProvider.value(value: sl(), child: const TripzApp()), - ); -} diff --git a/apps/rider_new/pubspec.lock b/apps/rider_new/pubspec.lock deleted file mode 100644 index 2759eca..0000000 --- a/apps/rider_new/pubspec.lock +++ /dev/null @@ -1,1071 +0,0 @@ -# Generated by pub -# See https://dart.dev/tools/pub/glossary#lockfile -packages: - _flutterfire_internals: - dependency: transitive - description: - name: _flutterfire_internals - sha256: "6727cf2ced9b104abca9daa278380be2eca2b98ce33d4b46f11708e387dc6b4d" - url: "https://pub.dev" - source: hosted - version: "1.3.76" - archive: - dependency: transitive - description: - name: archive - sha256: a96e8b390886ee8abb49b7bd3ac8df6f451c621619f52a26e815fdcf568959ff - url: "https://pub.dev" - source: hosted - version: "4.0.9" - args: - dependency: transitive - description: - name: args - sha256: d0481093c50b1da8910eb0bb301626d4d8eb7284aa739614d2b394ee09e3ea04 - url: "https://pub.dev" - source: hosted - version: "2.7.0" - async: - dependency: transitive - description: - name: async - sha256: e2eb0491ba5ddb6177742d2da23904574082139b07c1e33b8503b9f46f3e1a37 - url: "https://pub.dev" - source: hosted - version: "2.13.1" - bloc: - dependency: transitive - description: - name: bloc - sha256: e03b235924e4f509c27b5d6b2f949200e0a91149a9818b4f65eeb56662b75413 - url: "https://pub.dev" - source: hosted - version: "9.2.1" - boolean_selector: - dependency: transitive - description: - name: boolean_selector - sha256: "8aab1771e1243a5063b8b0ff68042d67334e3feab9e95b9490f9a6ebf73b42ea" - url: "https://pub.dev" - source: hosted - version: "2.1.2" - characters: - dependency: transitive - description: - name: characters - sha256: faf38497bda5ead2a8c7615f4f7939df04333478bf32e4173fcb06d428b5716b - url: "https://pub.dev" - source: hosted - version: "1.4.1" - clock: - dependency: transitive - description: - name: clock - sha256: fddb70d9b5277016c77a80201021d40a2247104d9f4aa7bab7157b7e3f05b84b - url: "https://pub.dev" - source: hosted - version: "1.1.2" - code_assets: - dependency: transitive - description: - name: code_assets - sha256: bf394f466ba9205f1812a0433b392d6af280f155f56651eda7c18cc32ed493b8 - url: "https://pub.dev" - source: hosted - version: "1.2.1" - collection: - dependency: transitive - description: - name: collection - sha256: "2f5709ae4d3d59dd8f7cd309b4e023046b57d8a6c82130785d2b0e5868084e76" - url: "https://pub.dev" - source: hosted - version: "1.19.1" - cross_file: - dependency: transitive - description: - name: cross_file - sha256: "92c9c43c383bfa1c32079d3bc492d55d6d4318044b7b47edaff8971cbb555c51" - url: "https://pub.dev" - source: hosted - version: "0.3.5+4" - crypto: - dependency: transitive - description: - name: crypto - sha256: c8ea0233063ba03258fbcf2ca4d6dadfefe14f02fab57702265467a19f27fadf - url: "https://pub.dev" - source: hosted - version: "3.0.7" - cupertino_icons: - dependency: "direct main" - description: - name: cupertino_icons - sha256: "41e005c33bd814be4d3096aff55b1908d419fde52ca656c8c47719ec745873cd" - url: "https://pub.dev" - source: hosted - version: "1.0.9" - dbus: - dependency: transitive - description: - name: dbus - sha256: "0ce9b0a839e6dee59a37a623d2fc26a35bbbe6404213e419b0d6411023d62645" - url: "https://pub.dev" - source: hosted - version: "0.7.14" - device_info_plus: - dependency: "direct main" - description: - name: device_info_plus - sha256: "4df8babf73058181227e18b08e6ea3520cf5fc5d796888d33b7cb0f33f984b7c" - url: "https://pub.dev" - source: hosted - version: "12.3.0" - device_info_plus_platform_interface: - dependency: transitive - description: - name: device_info_plus_platform_interface - sha256: e1ea89119e34903dca74b883d0dd78eb762814f97fb6c76f35e9ff74d261a18f - url: "https://pub.dev" - source: hosted - version: "7.0.3" - dio: - dependency: "direct main" - description: - name: dio - sha256: "0df44ebba85e503958eb75d07eedd3c86275a58c1d3eda2f2ce8f0a2c3abbb3c" - url: "https://pub.dev" - source: hosted - version: "5.11.0" - dio_web_adapter: - dependency: transitive - description: - name: dio_web_adapter - sha256: "0786d0b7295a373de356fc0af4f6f1d0ab2844ed31b19dfc5e7556b70e24212c" - url: "https://pub.dev" - source: hosted - version: "2.2.1" - equatable: - dependency: "direct main" - description: - name: equatable - sha256: "3bce007a596ff8b3119c45d68aaef631272537c03d30e5d4534dd24bf4c5eaa2" - url: "https://pub.dev" - source: hosted - version: "2.1.0" - fake_async: - dependency: transitive - description: - name: fake_async - sha256: "5368f224a74523e8d2e7399ea1638b37aecfca824a3cc4dfdf77bf1fa905ac44" - url: "https://pub.dev" - source: hosted - version: "1.3.3" - ffi: - dependency: transitive - description: - name: ffi - sha256: "6d7fd89431262d8f3125e81b50d3847a091d846eafcd4fdb88dd06f36d705a45" - url: "https://pub.dev" - source: hosted - version: "2.2.0" - file: - dependency: transitive - description: - name: file - sha256: a3b4f84adafef897088c160faf7dfffb7696046cb13ae90b508c2cbc95d3b8d4 - url: "https://pub.dev" - source: hosted - version: "7.0.1" - firebase_core: - dependency: "direct main" - description: - name: firebase_core - sha256: "9478ca6700c02d315c6aba37e206e612317f98bb4f335bb1cbd6e0ce67dcf764" - url: "https://pub.dev" - source: hosted - version: "4.13.0" - firebase_core_platform_interface: - dependency: transitive - description: - name: firebase_core_platform_interface - sha256: e28f9afdcb5b0f0a8ea74ea3b322f5a7592c81cb45dd9d189913bdae08a2089a - url: "https://pub.dev" - source: hosted - version: "8.1.0" - firebase_core_web: - dependency: transitive - description: - name: firebase_core_web - sha256: f471a288b0101a45567548322ac4a5ad31e3ecbf87a576dcc0e424e6a11e04ea - url: "https://pub.dev" - source: hosted - version: "3.10.0" - firebase_messaging: - dependency: "direct main" - description: - name: firebase_messaging - sha256: "55cf1000dd72d229ebff3ce6a399bd35705a7675275478b31308afd90ac85751" - url: "https://pub.dev" - source: hosted - version: "16.5.0" - firebase_messaging_platform_interface: - dependency: transitive - description: - name: firebase_messaging_platform_interface - sha256: e5fbb62bd23a27c983825277877ac91fdfdb6bfb31c6e5399700963ae586e339 - url: "https://pub.dev" - source: hosted - version: "4.9.3" - firebase_messaging_web: - dependency: transitive - description: - name: firebase_messaging_web - sha256: "663d320e90a41fe57d651ec79df2bc831bf29e051bc0c2cd41faf3106eb412d9" - url: "https://pub.dev" - source: hosted - version: "4.2.4" - fixnum: - dependency: transitive - description: - name: fixnum - sha256: b6dc7065e46c974bc7c5f143080a6764ec7a4be6da1285ececdc37be96de53be - url: "https://pub.dev" - source: hosted - version: "1.1.1" - flutter: - dependency: "direct main" - description: flutter - source: sdk - version: "0.0.0" - flutter_bloc: - dependency: "direct main" - description: - name: flutter_bloc - sha256: cf51747952201a455a1c840f8171d273be009b932c75093020f9af64f2123e38 - url: "https://pub.dev" - source: hosted - version: "9.1.1" - flutter_lints: - dependency: "direct dev" - description: - name: flutter_lints - sha256: "3105dc8492f6183fb076ccf1f351ac3d60564bff92e20bfc4af9cc1651f4e7e1" - url: "https://pub.dev" - source: hosted - version: "6.0.0" - flutter_localizations: - dependency: "direct main" - description: flutter - source: sdk - version: "0.0.0" - flutter_secure_storage: - dependency: "direct main" - description: - name: flutter_secure_storage - sha256: "7686b1d6a29985dcbb808c59518226e603e3bfa7c0ddfd1a0d00e4cda77c868e" - url: "https://pub.dev" - source: hosted - version: "10.3.1" - flutter_secure_storage_darwin: - dependency: transitive - description: - name: flutter_secure_storage_darwin - sha256: "82329fa5cdf343773b1b6897dea959105a29f092454259edff92f9f6637e8149" - url: "https://pub.dev" - source: hosted - version: "0.3.2" - flutter_secure_storage_linux: - dependency: transitive - description: - name: flutter_secure_storage_linux - sha256: a5f35ddab43cf5c8215d2feb4ce1957851f28c5c37e6f04335066a0602087bf5 - url: "https://pub.dev" - source: hosted - version: "3.0.1" - flutter_secure_storage_platform_interface: - dependency: transitive - description: - name: flutter_secure_storage_platform_interface - sha256: "06686df417f34fe9f963ed217b7fdce250e2f637ddd6c374d7eb054549770633" - url: "https://pub.dev" - source: hosted - version: "2.0.2" - flutter_secure_storage_web: - dependency: transitive - description: - name: flutter_secure_storage_web - sha256: "073a62b3aeb866ab4ce795f960413948e51e5a42a9b0c8333b6daf5bb3208a1c" - url: "https://pub.dev" - source: hosted - version: "2.1.1" - flutter_secure_storage_windows: - dependency: transitive - description: - name: flutter_secure_storage_windows - sha256: "3b7c8e068875dfd46719ff57c90d8c459c87f2302ed6b00ff006b3c9fcad1613" - url: "https://pub.dev" - source: hosted - version: "4.1.0" - flutter_test: - dependency: "direct dev" - description: flutter - source: sdk - version: "0.0.0" - flutter_web_plugins: - dependency: transitive - description: flutter - source: sdk - version: "0.0.0" - geoclue: - dependency: transitive - description: - name: geoclue - sha256: c2a998c77474fc57aa00c6baa2928e58f4b267649057a1c76738656e9dbd2a7f - url: "https://pub.dev" - source: hosted - version: "0.1.1" - geolocator: - dependency: "direct main" - description: - name: geolocator - sha256: "79939537046c9025be47ec645f35c8090ecadb6fe98eba146a0d25e8c1357516" - url: "https://pub.dev" - source: hosted - version: "14.0.2" - geolocator_android: - dependency: transitive - description: - name: geolocator_android - sha256: "86ea1654e4f61ff51466848e91c116b422d6010ea269fda0fbe1af7e9e742ce1" - url: "https://pub.dev" - source: hosted - version: "5.0.3" - geolocator_apple: - dependency: transitive - description: - name: geolocator_apple - sha256: "853803d6bb1713c094e935b4a5ae5f19c0308acf81da13fa9ff84fb4c70c0b73" - url: "https://pub.dev" - source: hosted - version: "2.3.14" - geolocator_linux: - dependency: transitive - description: - name: geolocator_linux - sha256: c4e966f0a7a87e70049eac7a2617f9e16fd4c585a26e4330bdfc3a71e6a721f3 - url: "https://pub.dev" - source: hosted - version: "0.2.3" - geolocator_platform_interface: - dependency: transitive - description: - name: geolocator_platform_interface - sha256: cdb082e4f048b69da244117b7914cc60d2a8897546ffaa4f2529c786ded7aee2 - url: "https://pub.dev" - source: hosted - version: "4.2.8" - geolocator_web: - dependency: transitive - description: - name: geolocator_web - sha256: "19e485a0f8d6a88abcf9c53cba3a4105e14b7435ed8ac1c108c067b938fe8429" - url: "https://pub.dev" - source: hosted - version: "4.1.4" - geolocator_windows: - dependency: transitive - description: - name: geolocator_windows - sha256: "175435404d20278ffd220de83c2ca293b73db95eafbdc8131fe8609be1421eb6" - url: "https://pub.dev" - source: hosted - version: "0.2.5" - get_it: - dependency: "direct main" - description: - name: get_it - sha256: ae78de7c3f2304b8d81f2bb6e320833e5e81de942188542328f074978cc0efa9 - url: "https://pub.dev" - source: hosted - version: "8.3.0" - go_router: - dependency: "direct main" - description: - name: go_router - sha256: f02fd7d2a4dc512fec615529824fdd217fecb3a3d3de68360293a551f21634b3 - url: "https://pub.dev" - source: hosted - version: "14.8.1" - gsettings: - dependency: transitive - description: - name: gsettings - sha256: "1b0ce661f5436d2db1e51f3c4295a49849f03d304003a7ba177d01e3a858249c" - url: "https://pub.dev" - source: hosted - version: "0.2.8" - hooks: - dependency: transitive - description: - name: hooks - sha256: "9a62a50b50b769a737bc0a8ff381f333529df3ab746b2f6b02e83760231455ba" - url: "https://pub.dev" - source: hosted - version: "2.0.2" - http: - dependency: transitive - description: - name: http - sha256: "87721a4a50b19c7f1d49001e51409bddc46303966ce89a65af4f4e6004896412" - url: "https://pub.dev" - source: hosted - version: "1.6.0" - http_parser: - dependency: transitive - description: - name: http_parser - sha256: "178d74305e7866013777bab2c3d8726205dc5a4dd935297175b19a23a2e66571" - url: "https://pub.dev" - source: hosted - version: "4.1.2" - image: - dependency: transitive - description: - name: image - sha256: f9881ff4998044947ec38d098bc7c8316ae1186fa786eddffdb867b9bc94dfce - url: "https://pub.dev" - source: hosted - version: "4.8.0" - intaleq_maps: - dependency: "direct main" - description: - name: intaleq_maps - sha256: "755ed2f28350cbef80deb055f4d98f94a8a23370f8dbf77d7eb4cd91a1ffd76b" - url: "https://pub.dev" - source: hosted - version: "2.3.0" - intl: - dependency: "direct main" - description: - name: intl - sha256: "3df61194eb431efc39c4ceba583b95633a403f46c9fd341e550ce0bfa50e9aa5" - url: "https://pub.dev" - source: hosted - version: "0.20.2" - jni: - dependency: transitive - description: - name: jni - sha256: f038e58b4dc2c9037f50e233175086337e0b305e356d28211bf55f21c504cbd3 - url: "https://pub.dev" - source: hosted - version: "1.0.3" - jni_flutter: - dependency: transitive - description: - name: jni_flutter - sha256: "7b717011ea40d04fd47c2731d3d1d36eb99eba3435c2753d62489e8c3c9991d5" - url: "https://pub.dev" - source: hosted - version: "1.0.2" - jni_util: - dependency: transitive - description: - name: jni_util - sha256: "1ba86da04a5f2bf18fde2edb235587e70c5b0fc5bd4ba955f46b00942c3fc35f" - url: "https://pub.dev" - source: hosted - version: "1.0.0" - leak_tracker: - dependency: transitive - description: - name: leak_tracker - sha256: "33e2e26bdd85a0112ec15400c8cbffea70d0f9c3407491f672a2fad47915e2de" - url: "https://pub.dev" - source: hosted - version: "11.0.2" - leak_tracker_flutter_testing: - dependency: transitive - description: - name: leak_tracker_flutter_testing - sha256: "1dbc140bb5a23c75ea9c4811222756104fbcd1a27173f0c34ca01e16bea473c1" - url: "https://pub.dev" - source: hosted - version: "3.0.10" - leak_tracker_testing: - dependency: transitive - description: - name: leak_tracker_testing - sha256: "8d5a2d49f4a66b49744b23b018848400d23e54caf9463f4eb20df3eb8acb2eb1" - url: "https://pub.dev" - source: hosted - version: "3.0.2" - lints: - dependency: transitive - description: - name: lints - sha256: "12f842a479589fea194fe5c5a3095abc7be0c1f2ddfa9a0e76aed1dbd26a87df" - url: "https://pub.dev" - source: hosted - version: "6.1.0" - logging: - dependency: transitive - description: - name: logging - sha256: c8245ada5f1717ed44271ed1c26b8ce85ca3228fd2ffdb75468ab01979309d61 - url: "https://pub.dev" - source: hosted - version: "1.3.0" - maplibre_gl: - dependency: transitive - description: - name: maplibre_gl - sha256: d9773555ae4ebab94bbc3ae2176b077cfda486ec729eefe01e1613f164cb8410 - url: "https://pub.dev" - source: hosted - version: "0.25.0" - maplibre_gl_platform_interface: - dependency: transitive - description: - name: maplibre_gl_platform_interface - sha256: bd7de401dea24dd7e8a6f2fa736ddee7dbbee3e24a9027f0afdd619994702047 - url: "https://pub.dev" - source: hosted - version: "0.25.0" - maplibre_gl_web: - dependency: transitive - description: - name: maplibre_gl_web - sha256: af0e48bf96e8dd99f8b958a1953126971eb8a0527b9735441d4f24df3913f5a2 - url: "https://pub.dev" - source: hosted - version: "0.25.0" - matcher: - dependency: transitive - description: - name: matcher - sha256: "12956d0ad8390bbcc63ca2e1469c0619946ccb52809807067a7020d57e647aa6" - url: "https://pub.dev" - source: hosted - version: "0.12.18" - material_color_utilities: - dependency: transitive - description: - name: material_color_utilities - sha256: "9c337007e82b1889149c82ed242ed1cb24a66044e30979c44912381e9be4c48b" - url: "https://pub.dev" - source: hosted - version: "0.13.0" - meta: - dependency: transitive - description: - name: meta - sha256: "23f08335362185a5ea2ad3a4e597f1375e78bce8a040df5c600c8d3552ef2394" - url: "https://pub.dev" - source: hosted - version: "1.17.0" - mime: - dependency: transitive - description: - name: mime - sha256: "41a20518f0cb1256669420fdba0cd90d21561e560ac240f26ef8322e45bb7ed6" - url: "https://pub.dev" - source: hosted - version: "2.0.0" - nested: - dependency: transitive - description: - name: nested - sha256: "03bac4c528c64c95c722ec99280375a6f2fc708eec17c7b3f07253b626cd2a20" - url: "https://pub.dev" - source: hosted - version: "1.0.0" - objective_c: - dependency: transitive - description: - name: objective_c - sha256: b7fb95a6d9a4f009edd63dc5ac69f07420b23a16161c6dd8660290b59c602e8e - url: "https://pub.dev" - source: hosted - version: "9.5.0" - package_config: - dependency: transitive - description: - name: package_config - sha256: ffcf4cf3d6c0b74ac43708d9f56625506e8a68aa935abe9d267a7330f320eb5d - url: "https://pub.dev" - source: hosted - version: "3.0.0" - package_info_plus: - dependency: "direct main" - description: - name: package_info_plus - sha256: "16eee997588c60225bda0488b6dcfac69280a6b7a3cf02c741895dd370a02968" - url: "https://pub.dev" - source: hosted - version: "8.3.1" - package_info_plus_platform_interface: - dependency: transitive - description: - name: package_info_plus_platform_interface - sha256: "202a487f08836a592a6bd4f901ac69b3a8f146af552bbd14407b6b41e1c3f086" - url: "https://pub.dev" - source: hosted - version: "3.2.1" - path: - dependency: transitive - description: - name: path - sha256: "75cca69d1490965be98c73ceaea117e8a04dd21217b37b292c9ddbec0d955bc5" - url: "https://pub.dev" - source: hosted - version: "1.9.1" - path_provider: - dependency: transitive - description: - name: path_provider - sha256: a7f4874f987173da295a61c181b8ee71dab59b332a486b391babf26a1b884825 - url: "https://pub.dev" - source: hosted - version: "2.1.6" - path_provider_android: - dependency: transitive - description: - name: path_provider_android - sha256: "69cbd515a62b94d32a7944f086b2f82b4ac40a1d45bebfc00813a430ab2dabcd" - url: "https://pub.dev" - source: hosted - version: "2.3.1" - path_provider_foundation: - dependency: transitive - description: - name: path_provider_foundation - sha256: "2a376b7d6392d80cd3705782d2caa734ca4727776db0b6ec36ef3f1855197699" - url: "https://pub.dev" - source: hosted - version: "2.6.0" - path_provider_linux: - dependency: transitive - description: - name: path_provider_linux - sha256: "58c2005f147315b11e9b4a7bc889cd5203e250cba8e3f012dae259b4972b5c16" - url: "https://pub.dev" - source: hosted - version: "2.2.2" - path_provider_platform_interface: - dependency: transitive - description: - name: path_provider_platform_interface - sha256: "484838772624c3a4b94f1e44a3e19897fee738f2d5c4ce448443b0417f7c9dda" - url: "https://pub.dev" - source: hosted - version: "2.1.3" - path_provider_windows: - dependency: transitive - description: - name: path_provider_windows - sha256: bd6f00dbd873bfb70d0761682da2b3a2c2fccc2b9e84c495821639601d81afe7 - url: "https://pub.dev" - source: hosted - version: "2.3.0" - permission_handler: - dependency: "direct main" - description: - name: permission_handler - sha256: fe54465bcc62a4564c6e4db337bbaded6c0c0fa6e10487414436d163114784f6 - url: "https://pub.dev" - source: hosted - version: "12.0.3" - permission_handler_android: - dependency: transitive - description: - name: permission_handler_android - sha256: "1e3bc410ca1bf84662104b100eb126e066cb55791b7451307f9708d4007350e6" - url: "https://pub.dev" - source: hosted - version: "13.0.1" - permission_handler_apple: - dependency: transitive - description: - name: permission_handler_apple - sha256: "11b7e94a9d2fbee23c27f0cae0105c6266c03fd83b9a2eda6cf09141fc82624b" - url: "https://pub.dev" - source: hosted - version: "9.5.0" - permission_handler_html: - dependency: transitive - description: - name: permission_handler_html - sha256: "6ea98b3f17f60d3b527f2647ed2ab4dc0f6bfe25b22cb1c363f5d8f62252f6ac" - url: "https://pub.dev" - source: hosted - version: "0.1.4+1" - permission_handler_platform_interface: - dependency: transitive - description: - name: permission_handler_platform_interface - sha256: a5c8a97ecf5616112a5b16d4b8e9ec0e5ae90ef63ac69c0d7b8ae240be760b23 - url: "https://pub.dev" - source: hosted - version: "4.4.0" - permission_handler_windows: - dependency: transitive - description: - name: permission_handler_windows - sha256: caeae01858a0a7d2df67a445ac98e1ad95e55a0e77c73044f4e9b1c8c2289cbd - url: "https://pub.dev" - source: hosted - version: "0.2.2" - petitparser: - dependency: transitive - description: - name: petitparser - sha256: "91bd59303e9f769f108f8df05e371341b15d59e995e6806aefab827b58336675" - url: "https://pub.dev" - source: hosted - version: "7.0.2" - platform: - dependency: transitive - description: - name: platform - sha256: "5d6b1b0036a5f331ebc77c850ebc8506cbc1e9416c27e59b439f917a902a4984" - url: "https://pub.dev" - source: hosted - version: "3.1.6" - plugin_platform_interface: - dependency: transitive - description: - name: plugin_platform_interface - sha256: "4820fbfdb9478b1ebae27888254d445073732dae3d6ea81f0b7e06d5dedc3f02" - url: "https://pub.dev" - source: hosted - version: "2.1.8" - posix: - dependency: transitive - description: - name: posix - sha256: bc1bad54ad2b735816e31f8d4600cfde6c7839975085ddfbca48b6c9f7c4044e - url: "https://pub.dev" - source: hosted - version: "6.5.2" - provider: - dependency: transitive - description: - name: provider - sha256: "4e82183fa20e5ca25703ead7e05de9e4cceed1fbd1eadc1ac3cb6f565a09f272" - url: "https://pub.dev" - source: hosted - version: "6.1.5+1" - pub_semver: - dependency: transitive - description: - name: pub_semver - sha256: "5bfcf68ca79ef689f8990d1160781b4bad40a3bd5e5218ad4076ddb7f4081585" - url: "https://pub.dev" - source: hosted - version: "2.2.0" - record_use: - dependency: transitive - description: - name: record_use - sha256: "2551bd8eecfe95d14ae75f6021ad0248be5c27f138c2ec12fcb52b500b3ba1ed" - url: "https://pub.dev" - source: hosted - version: "0.6.0" - share_plus: - dependency: "direct main" - description: - name: share_plus - sha256: "223873d106614442ea6f20db5a038685cc5b32a2fba81cdecaefbbae0523f7fa" - url: "https://pub.dev" - source: hosted - version: "12.0.2" - share_plus_platform_interface: - dependency: transitive - description: - name: share_plus_platform_interface - sha256: "88023e53a13429bd65d8e85e11a9b484f49d4c190abbd96c7932b74d6927cc9a" - url: "https://pub.dev" - source: hosted - version: "6.1.0" - shared_preferences: - dependency: "direct main" - description: - name: shared_preferences - sha256: c3025c5534b01739267eb7d76959bbc25a6d10f6988e1c2a3036940133dd10bf - url: "https://pub.dev" - source: hosted - version: "2.5.5" - shared_preferences_android: - dependency: transitive - description: - name: shared_preferences_android - sha256: e8d4762b1e2e8578fc4d0fd548cebf24afd24f49719c08974df92834565e2c53 - url: "https://pub.dev" - source: hosted - version: "2.4.23" - shared_preferences_foundation: - dependency: transitive - description: - name: shared_preferences_foundation - sha256: "4e7eaffc2b17ba398759f1151415869a34771ba11ebbccd1b0145472a619a64f" - url: "https://pub.dev" - source: hosted - version: "2.5.6" - shared_preferences_linux: - dependency: transitive - description: - name: shared_preferences_linux - sha256: "580abfd40f415611503cae30adf626e6656dfb2f0cee8f465ece7b6defb40f2f" - url: "https://pub.dev" - source: hosted - version: "2.4.1" - shared_preferences_platform_interface: - dependency: transitive - description: - name: shared_preferences_platform_interface - sha256: "649dc798a33931919ea356c4305c2d1f81619ea6e92244070b520187b5140ef9" - url: "https://pub.dev" - source: hosted - version: "2.4.2" - shared_preferences_web: - dependency: transitive - description: - name: shared_preferences_web - sha256: c49bd060261c9a3f0ff445892695d6212ff603ef3115edbb448509d407600019 - url: "https://pub.dev" - source: hosted - version: "2.4.3" - shared_preferences_windows: - dependency: transitive - description: - name: shared_preferences_windows - sha256: "94ef0f72b2d71bc3e700e025db3710911bd51a71cefb65cc609dd0d9a982e3c1" - url: "https://pub.dev" - source: hosted - version: "2.4.1" - sky_engine: - dependency: transitive - description: flutter - source: sdk - version: "0.0.0" - socket_io_client: - dependency: "direct main" - description: - name: socket_io_client - sha256: f5990ff303d385e7b2150f0e57cca097a8d20c6a2ae0a22cb2d496661ea8ed9b - url: "https://pub.dev" - source: hosted - version: "3.1.6" - socket_io_common: - dependency: transitive - description: - name: socket_io_common - sha256: "162fbaecbf4bf9a9372a62a341b3550b51dcef2f02f3e5830a297fd48203d45b" - url: "https://pub.dev" - source: hosted - version: "3.1.1" - source_span: - dependency: transitive - description: - name: source_span - sha256: "56a02f1f4cd1a2d96303c0144c93bd6d909eea6bee6bf5a0e0b685edbd4c47ab" - url: "https://pub.dev" - source: hosted - version: "1.10.2" - stack_trace: - dependency: transitive - description: - name: stack_trace - sha256: "8b27215b45d22309b5cddda1aa2b19bdfec9df0e765f2de506401c071d38d1b1" - url: "https://pub.dev" - source: hosted - version: "1.12.1" - stream_channel: - dependency: transitive - description: - name: stream_channel - sha256: "969e04c80b8bcdf826f8f16579c7b14d780458bd97f56d107d3950fdbeef059d" - url: "https://pub.dev" - source: hosted - version: "2.1.4" - string_scanner: - dependency: transitive - description: - name: string_scanner - sha256: "921cd31725b72fe181906c6a94d987c78e3b98c2e205b397ea399d4054872b43" - url: "https://pub.dev" - source: hosted - version: "1.4.1" - term_glyph: - dependency: transitive - description: - name: term_glyph - sha256: "7f554798625ea768a7518313e58f83891c7f5024f88e46e7182a4558850a4b8e" - url: "https://pub.dev" - source: hosted - version: "1.2.2" - test_api: - dependency: transitive - description: - name: test_api - sha256: "93167629bfc610f71560ab9312acdda4959de4df6fac7492c89ff0d3886f6636" - url: "https://pub.dev" - source: hosted - version: "0.7.9" - typed_data: - dependency: transitive - description: - name: typed_data - sha256: f9049c039ebfeb4cf7a7104a675823cd72dba8297f264b6637062516699fa006 - url: "https://pub.dev" - source: hosted - version: "1.4.0" - url_launcher: - dependency: "direct main" - description: - name: url_launcher - sha256: f6a7e5c4835bb4e3026a04793a4199ca2d14c739ec378fdfe23fc8075d0439f8 - url: "https://pub.dev" - source: hosted - version: "6.3.2" - url_launcher_android: - dependency: transitive - description: - name: url_launcher_android - sha256: "17bc677f0b301615530dd1d67e0a9828cafa2d0b6b6eae4cd3679b7eac4a273c" - url: "https://pub.dev" - source: hosted - version: "6.3.30" - url_launcher_ios: - dependency: transitive - description: - name: url_launcher_ios - sha256: "580fe5dfb51671ae38191d316e027f6b76272b026370708c2d898799750a02b0" - url: "https://pub.dev" - source: hosted - version: "6.4.1" - url_launcher_linux: - dependency: transitive - description: - name: url_launcher_linux - sha256: d5e14138b3bc193a0f63c10a53c94b91d399df0512b1f29b94a043db7482384a - url: "https://pub.dev" - source: hosted - version: "3.2.2" - url_launcher_macos: - dependency: transitive - description: - name: url_launcher_macos - sha256: "368adf46f71ad3c21b8f06614adb38346f193f3a59ba8fe9a2fd74133070ba18" - url: "https://pub.dev" - source: hosted - version: "3.2.5" - url_launcher_platform_interface: - dependency: transitive - description: - name: url_launcher_platform_interface - sha256: "552f8a1e663569be95a8190206a38187b531910283c3e982193e4f2733f01029" - url: "https://pub.dev" - source: hosted - version: "2.3.2" - url_launcher_web: - dependency: transitive - description: - name: url_launcher_web - sha256: "85c81589622fbc87c1c683aaea164d3604a7777495a79d91e39ffcdec39ddb34" - url: "https://pub.dev" - source: hosted - version: "2.4.3" - url_launcher_windows: - dependency: transitive - description: - name: url_launcher_windows - sha256: "712c70ab1b99744ff066053cbe3e80c73332b38d46e5e945c98689b2e66fc15f" - url: "https://pub.dev" - source: hosted - version: "3.1.5" - uuid: - dependency: transitive - description: - name: uuid - sha256: "9b129329f58692f6e6578329498a8fe9fbe98f090beb764ffbb8ee2eadd01dcd" - url: "https://pub.dev" - source: hosted - version: "4.6.0" - vector_math: - dependency: transitive - description: - name: vector_math - sha256: d530bd74fea330e6e364cda7a85019c434070188383e1cd8d9777ee586914c5b - url: "https://pub.dev" - source: hosted - version: "2.2.0" - vm_service: - dependency: transitive - description: - name: vm_service - sha256: "0016aef94fc66495ac78af5859181e3f3bf2026bd8eecc72b9565601e19ab360" - url: "https://pub.dev" - source: hosted - version: "15.2.0" - web: - dependency: transitive - description: - name: web - sha256: "868d88a33d8a87b18ffc05f9f030ba328ffefba92d6c127917a2ba740f9cfe4a" - url: "https://pub.dev" - source: hosted - version: "1.1.1" - web_socket: - dependency: transitive - description: - name: web_socket - sha256: "34d64019aa8e36bf9842ac014bb5d2f5586ca73df5e4d9bf5c936975cae6982c" - url: "https://pub.dev" - source: hosted - version: "1.0.1" - win32: - dependency: transitive - description: - name: win32 - sha256: d7cb55e04cd34096cd3a79b3330245f54cb96a370a1c27adb3c84b917de8b08e - url: "https://pub.dev" - source: hosted - version: "5.15.0" - win32_registry: - dependency: transitive - description: - name: win32_registry - sha256: "6f1b564492d0147b330dd794fee8f512cec4977957f310f9951b5f9d83618dae" - url: "https://pub.dev" - source: hosted - version: "2.1.0" - xdg_directories: - dependency: transitive - description: - name: xdg_directories - sha256: "7a3f37b05d989967cdddcbb571f1ea834867ae2faa29725fd085180e0883aa15" - url: "https://pub.dev" - source: hosted - version: "1.1.0" - xml: - dependency: transitive - description: - name: xml - sha256: "971043b3a0d3da28727e40ed3e0b5d18b742fa5a68665cca88e74b7876d5e025" - url: "https://pub.dev" - source: hosted - version: "6.6.1" - yaml: - dependency: transitive - description: - name: yaml - sha256: b9da305ac7c39faa3f030eccd175340f968459dae4af175130b3fc47e40d76ce - url: "https://pub.dev" - source: hosted - version: "3.1.3" -sdks: - dart: ">=3.11.0 <4.0.0" - flutter: ">=3.38.4" diff --git a/apps/rider_new/pubspec.yaml b/apps/rider_new/pubspec.yaml deleted file mode 100644 index 62fa82a..0000000 --- a/apps/rider_new/pubspec.yaml +++ /dev/null @@ -1,104 +0,0 @@ -name: rider_new -description: "تطبيق الراكب — Tripz. مبنيّ من الصفر على Bloc/Cubit وباك إند NestJS (docs/37)." -publish_to: "none" - -# يطابق هوية النشر في android/app/build.gradle — لا يُغيَّر إلا مع رفع إصدار -# حقيقي في المتجر (docs/37 §2.ج). -version: 2.0.135+135 - -environment: - sdk: ^3.11.0 - -dependencies: - flutter: - sdk: flutter - flutter_localizations: - sdk: flutter - - # الحالة والتوجيه والحقن — الإصدارات موحّدة حرفياً مع driver_new (docs/23 §9): - # تباعدهما يعني سلوكاً مختلفاً في كود مشترك. - flutter_bloc: ^9.1.1 - equatable: ^2.0.7 - get_it: ^8.0.3 - go_router: ^14.6.2 - - # الشبكة - dio: ^5.9.1 - - # التخزين — الرموز في التخزين الآمن، والتفضيلات في العادي - flutter_secure_storage: ^10.0.0 - shared_preferences: ^2.3.3 - - intl: ^0.20.2 - - # م4: الخريطة والموقع والواقع اللحظي - intaleq_maps: ^2.3.0 - geolocator: ^14.0.2 - socket_io_client: ^3.0.2 - - # الدراور: المشاركة وفتح الروابط - share_plus: ^12.0.1 - url_launcher: ^6.3.2 - - # م6: الإشعارات — الإعداد الأصلي (google-services) منقول مع الطبقة الأصلية - firebase_core: ^4.4.0 - firebase_messaging: ^16.1.1 - - # م3: الأذونات وبصمة الجهاز - permission_handler: ^12.0.1 - device_info_plus: 12.3.0 - - # رقم الإصدار في شاشة الإعدادات — كانت موجودة كاعتماد غير مباشر أصلاً، - # فترقيتها لمباشر لا تجرّ كوداً أصلياً جديداً. - package_info_plus: ^8.1.1 - - cupertino_icons: ^1.0.8 - -# باقي الحزم تُضاف في مرحلتها لا قبلها (docs/37 §1.7): -# م3 لاحقاً: crypto (توقيع طلبات النقاط المالية) -# م4: الخريطة · geolocator · socket_io_client -# م5: التقييم والمحفظة م6: الإشعارات والدردشة - -dev_dependencies: - flutter_test: - sdk: flutter - flutter_lints: ^6.0.0 - -flutter: - uses-material-design: true - - # توليد الترجمة من ARB (docs/26 §4) - generate: true - - assets: - - assets/ - - assets/images/ - - shorebird.yaml - - fonts: - # عربية — تايبوغرافيا نظام التصميم (docs/26) - - family: IBMPlexSansArabic - fonts: - - asset: assets/fonts/IBMPlexSansArabic-Regular.ttf - weight: 400 - - asset: assets/fonts/IBMPlexSansArabic-Medium.ttf - weight: 500 - - asset: assets/fonts/IBMPlexSansArabic-SemiBold.ttf - weight: 600 - - asset: assets/fonts/IBMPlexSansArabic-Bold.ttf - weight: 700 - # لاتينية - - family: Inter - fonts: - - asset: assets/fonts/Inter-Regular.ttf - weight: 400 - - asset: assets/fonts/Inter-Medium.ttf - weight: 500 - - asset: assets/fonts/Inter-SemiBold.ttf - weight: 600 - - asset: assets/fonts/Inter-Bold.ttf - weight: 700 - # أرقام العدّادات (الأجرة/المؤقّت) - - family: Digit - fonts: - - asset: assets/fonts/digit.ttf diff --git a/apps/rider_new/shorebird.yaml b/apps/rider_new/shorebird.yaml deleted file mode 100644 index 10c3a35..0000000 --- a/apps/rider_new/shorebird.yaml +++ /dev/null @@ -1,14 +0,0 @@ -# This file is used to configure the Shorebird updater used by your app. -# Learn more at https://docs.shorebird.dev -# This file does not contain any sensitive information and should be checked into version control. - -# Your app_id is the unique identifier assigned to your app. -# It is used to identify your app when requesting patches from Shorebird's servers. -# It is not a secret and can be shared publicly. -app_id: 496cb3ac-c25c-455d-9d2e-5ebbea13ab03 - -# auto_update controls if Shorebird should automatically update in the background on launch. -# If auto_update: false, you will need to use package:shorebird_code_push to trigger updates. -# https://pub.dev/packages/shorebird_code_push -# Uncomment the following line to disable automatic updates. -# auto_update: false