Initial commit
| @ -0,0 +1,2 @@ | ||||
| # Auto detect text files and perform LF normalization | ||||
| * text=auto | ||||
| @ -0,0 +1,47 @@ | ||||
| # Miscellaneous | ||||
| *.class | ||||
| *.log | ||||
| *.pyc | ||||
| *.swp | ||||
| .DS_Store | ||||
| .atom/ | ||||
| .buildlog/ | ||||
| .history | ||||
| .svn/ | ||||
| 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 | ||||
| .flutter-plugins-dependencies | ||||
| .packages | ||||
| .pub-cache/ | ||||
| .pub/ | ||||
| /build/ | ||||
| 
 | ||||
| # Web related | ||||
| lib/generated_plugin_registrant.dart | ||||
| 
 | ||||
| # 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 | ||||
| @ -0,0 +1,33 @@ | ||||
| # 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. | ||||
| 
 | ||||
| version: | ||||
|   revision: fb57da5f945d02ef4f98dfd9409a72b7cce74268 | ||||
|   channel: stable | ||||
| 
 | ||||
| project_type: app | ||||
| 
 | ||||
| # Tracks metadata for the flutter migrate command | ||||
| migration: | ||||
|   platforms: | ||||
|     - platform: root | ||||
|       create_revision: fb57da5f945d02ef4f98dfd9409a72b7cce74268 | ||||
|       base_revision: fb57da5f945d02ef4f98dfd9409a72b7cce74268 | ||||
|     - platform: android | ||||
|       create_revision: fb57da5f945d02ef4f98dfd9409a72b7cce74268 | ||||
|       base_revision: fb57da5f945d02ef4f98dfd9409a72b7cce74268 | ||||
|     - platform: ios | ||||
|       create_revision: fb57da5f945d02ef4f98dfd9409a72b7cce74268 | ||||
|       base_revision: fb57da5f945d02ef4f98dfd9409a72b7cce74268 | ||||
| 
 | ||||
|   # 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' | ||||
| @ -0,0 +1,16 @@ | ||||
| # test_sa | ||||
| 
 | ||||
| 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. | ||||
| @ -0,0 +1,29 @@ | ||||
| # 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 | ||||
| @ -0,0 +1,13 @@ | ||||
| gradle-wrapper.jar | ||||
| /.gradle | ||||
| /captures/ | ||||
| /gradlew | ||||
| /gradlew.bat | ||||
| /local.properties | ||||
| GeneratedPluginRegistrant.java | ||||
| 
 | ||||
| # Remember to never publicly share your keystore. | ||||
| # See https://flutter.dev/docs/deployment/android#reference-the-keystore-from-the-app | ||||
| key.properties | ||||
| **/*.keystore | ||||
| **/*.jks | ||||
| @ -0,0 +1,62 @@ | ||||
| def localProperties = new Properties() | ||||
| def localPropertiesFile = rootProject.file('local.properties') | ||||
| if (localPropertiesFile.exists()) { | ||||
|     localPropertiesFile.withReader('UTF-8') { reader -> | ||||
|         localProperties.load(reader) | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| def flutterRoot = localProperties.getProperty('flutter.sdk') | ||||
| if (flutterRoot == null) { | ||||
|     throw new GradleException("Flutter SDK not found. Define location with flutter.sdk in the local.properties file.") | ||||
| } | ||||
| 
 | ||||
| def flutterVersionCode = localProperties.getProperty('flutter.versionCode') | ||||
| if (flutterVersionCode == null) { | ||||
|     flutterVersionCode = '1' | ||||
| } | ||||
| 
 | ||||
| def flutterVersionName = localProperties.getProperty('flutter.versionName') | ||||
| if (flutterVersionName == null) { | ||||
|     flutterVersionName = '1.0' | ||||
| } | ||||
| 
 | ||||
| apply plugin: 'com.android.application' | ||||
| apply plugin: 'kotlin-android' | ||||
| apply plugin: 'com.google.gms.google-services' | ||||
| apply from: "$flutterRoot/packages/flutter_tools/gradle/flutter.gradle" | ||||
| 
 | ||||
| android { | ||||
|     compileSdkVersion 33 | ||||
|     ndkVersion flutter.ndkVersion | ||||
| 
 | ||||
|     compileOptions { | ||||
|         sourceCompatibility JavaVersion.VERSION_1_8 | ||||
|         targetCompatibility JavaVersion.VERSION_1_8 | ||||
|     } | ||||
| 
 | ||||
|     defaultConfig { | ||||
|         // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). | ||||
|         applicationId "com.example.test_sa" | ||||
|         // You can update the following values to match your application needs.  | ||||
|         // For more information, see: https://docs.flutter.dev/deployment/android#reviewing-the-build-configuration. | ||||
|         minSdkVersion 21 | ||||
|         targetSdkVersion 33 | ||||
|         versionCode flutterVersionCode.toInteger() | ||||
|         versionName flutterVersionName | ||||
|     } | ||||
| 
 | ||||
|     buildTypes { | ||||
|         release { | ||||
|             proguardFiles getDefaultProguardFile('proguard-android.txt'), | ||||
|                     'proguard-rules.pro' | ||||
|             // TODO: Add your own signing config for the release build. | ||||
|             // Signing with the debug keys for now, so `flutter run --release` works. | ||||
|             signingConfig signingConfigs.debug | ||||
|         } | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| flutter { | ||||
|     source '../..' | ||||
| } | ||||
| @ -0,0 +1,39 @@ | ||||
| { | ||||
|   "project_info": { | ||||
|     "project_number": "176272925817", | ||||
|     "project_id": "opencis-sa", | ||||
|     "storage_bucket": "opencis-sa.appspot.com" | ||||
|   }, | ||||
|   "client": [ | ||||
|     { | ||||
|       "client_info": { | ||||
|         "mobilesdk_app_id": "1:176272925817:android:ba70bca496bc5bf2a9e0a8", | ||||
|         "android_client_info": { | ||||
|           "package_name": "com.example.test_sa" | ||||
|         } | ||||
|       }, | ||||
|       "oauth_client": [ | ||||
|         { | ||||
|           "client_id": "176272925817-e6gb9lhsteiisnat8r4mm3kne1g79m36.apps.googleusercontent.com", | ||||
|           "client_type": 3 | ||||
|         } | ||||
|       ], | ||||
|       "api_key": [ | ||||
|         { | ||||
|           "current_key": "AIzaSyAuZo6KixrW7nYOFM9An900tio0vA0fzS4" | ||||
|         } | ||||
|       ], | ||||
|       "services": { | ||||
|         "appinvite_service": { | ||||
|           "other_platform_oauth_client": [ | ||||
|             { | ||||
|               "client_id": "176272925817-e6gb9lhsteiisnat8r4mm3kne1g79m36.apps.googleusercontent.com", | ||||
|               "client_type": 3 | ||||
|             } | ||||
|           ] | ||||
|         } | ||||
|       } | ||||
|     } | ||||
|   ], | ||||
|   "configuration_version": "1" | ||||
| } | ||||
| @ -0,0 +1,27 @@ | ||||
| ## Gson rules | ||||
| # Gson uses generic type information stored in a class file when working with fields. Proguard | ||||
| # removes such information by default, so configure it to keep all of it. | ||||
| -keepattributes Signature | ||||
| 
 | ||||
| # For using GSON @Expose annotation | ||||
| -keepattributes *Annotation* | ||||
| 
 | ||||
| # Gson specific classes | ||||
| -dontwarn sun.misc.** | ||||
| #-keep class com.google.gson.stream.** { *; } | ||||
| 
 | ||||
| # Prevent proguard from stripping interface information from TypeAdapter, TypeAdapterFactory, | ||||
| # JsonSerializer, JsonDeserializer instances (so they can be used in @JsonAdapter) | ||||
| -keep class * extends com.google.gson.TypeAdapter | ||||
| -keep class * implements com.google.gson.TypeAdapterFactory | ||||
| -keep class * implements com.google.gson.JsonSerializer | ||||
| -keep class * implements com.google.gson.JsonDeserializer | ||||
| 
 | ||||
| # Prevent R8 from leaving Data object members always null | ||||
| -keepclassmembers,allowobfuscation class * { | ||||
|   @com.google.gson.annotations.SerializedName <fields>; | ||||
| } | ||||
| 
 | ||||
| # Retain generic signatures of TypeToken and its subclasses with R8 version 3.0 and higher. | ||||
| -keep,allowobfuscation,allowshrinking class com.google.gson.reflect.TypeToken | ||||
| -keep,allowobfuscation,allowshrinking class * extends com.google.gson.reflect.TypeToken | ||||
| @ -0,0 +1,8 @@ | ||||
| <manifest xmlns:android="http://schemas.android.com/apk/res/android" | ||||
|     package="com.example.test_sa"> | ||||
|     <!-- The INTERNET permission is required for development. Specifically, | ||||
|          the Flutter tool needs it to communicate with the running application | ||||
|          to allow setting breakpoints, to provide hot reload, etc. | ||||
|     --> | ||||
|     <uses-permission android:name="android.permission.INTERNET"/> | ||||
| </manifest> | ||||
| @ -0,0 +1,55 @@ | ||||
| <manifest xmlns:android="http://schemas.android.com/apk/res/android" | ||||
|     package="com.example.test_sa"> | ||||
| 
 | ||||
|     <uses-permission android:name="android.permission.INTERNET"/> | ||||
|     <uses-permission android:name="android.permission.ACCESS_NOTIFICATION_POLICY" /> | ||||
|     <uses-permission android:name="android.permission.VIBRATE"/> | ||||
|     <uses-permission android:name="android.permission.WAKE_LOCK" /> | ||||
|     <uses-permission android:name="android.permission.USE_FULL_SCREEN_INTENT" /> | ||||
|     <uses-permission android:name="android.permission.RECORD_AUDIO" /> | ||||
|     <uses-permission android:name="android.permission.BLUETOOTH"/> | ||||
|     <uses-permission android:name="android.permission.BLUETOOTH_ADMIN"/> | ||||
|     <uses-permission android:name="android.permission.BLUETOOTH_CONNECT"/> | ||||
|     <uses-permission android:name="android.permission.NFC"/> | ||||
| 
 | ||||
|     <queries> | ||||
|         <intent> | ||||
|             <action android:name="android.speech.RecognitionService" /> | ||||
|         </intent> | ||||
|     </queries> | ||||
| 
 | ||||
|    <application | ||||
|         android:label="ATOMS" | ||||
|        android:showWhenLocked="true" | ||||
|        android:turnScreenOn="true" | ||||
|        android:usesCleartextTraffic="true" | ||||
|         android:name="${applicationName}" | ||||
|         android:icon="@mipmap/ic_launcher"> | ||||
|         <activity | ||||
|             android:name=".MainActivity" | ||||
|             android:exported="true" | ||||
|             android:launchMode="singleTop" | ||||
|             android:theme="@style/LaunchTheme" | ||||
|             android:configChanges="orientation|keyboardHidden|keyboard|screenSize|smallestScreenSize|locale|layoutDirection|fontScale|screenLayout|density|uiMode" | ||||
|             android:hardwareAccelerated="true" | ||||
|             android:windowSoftInputMode="adjustResize"> | ||||
|             <!-- Specifies an Android theme to apply to this Activity as soon as | ||||
|                  the Android process has started. This theme is visible to the user | ||||
|                  while the Flutter UI initializes. After that, this theme continues | ||||
|                  to determine the Window background behind the Flutter UI. --> | ||||
|             <meta-data | ||||
|               android:name="io.flutter.embedding.android.NormalTheme" | ||||
|               android:resource="@style/NormalTheme" | ||||
|               /> | ||||
|             <intent-filter> | ||||
|                 <action android:name="android.intent.action.MAIN"/> | ||||
|                 <category android:name="android.intent.category.LAUNCHER"/> | ||||
|             </intent-filter> | ||||
|         </activity> | ||||
|         <!-- Don't delete the meta-data below. | ||||
|              This is used by the Flutter tool to generate GeneratedPluginRegistrant.java --> | ||||
|         <meta-data | ||||
|             android:name="flutterEmbedding" | ||||
|             android:value="2" /> | ||||
|     </application> | ||||
| </manifest> | ||||
| @ -0,0 +1,6 @@ | ||||
| package com.example.test_sa; | ||||
| 
 | ||||
| import io.flutter.embedding.android.FlutterActivity; | ||||
| 
 | ||||
| public class MainActivity extends FlutterActivity { | ||||
| } | ||||
| @ -0,0 +1,12 @@ | ||||
| <?xml version="1.0" encoding="utf-8"?> | ||||
| <!-- Modify this file to customize your launch splash screen --> | ||||
| <layer-list xmlns:android="http://schemas.android.com/apk/res/android"> | ||||
|     <item android:drawable="?android:colorBackground" /> | ||||
| 
 | ||||
|     <!-- You can insert your own image assets here --> | ||||
|     <!-- <item> | ||||
|         <bitmap | ||||
|             android:gravity="center" | ||||
|             android:src="@mipmap/launch_image" /> | ||||
|     </item> --> | ||||
| </layer-list> | ||||
| After Width: | Height: | Size: 9.6 KiB | 
| @ -0,0 +1,12 @@ | ||||
| <?xml version="1.0" encoding="utf-8"?> | ||||
| <!-- Modify this file to customize your launch splash screen --> | ||||
| <layer-list xmlns:android="http://schemas.android.com/apk/res/android"> | ||||
|     <item android:drawable="@android:color/white" /> | ||||
| 
 | ||||
|     <!-- You can insert your own image assets here --> | ||||
|     <!-- <item> | ||||
|         <bitmap | ||||
|             android:gravity="center" | ||||
|             android:src="@mipmap/launch_image" /> | ||||
|     </item> --> | ||||
| </layer-list> | ||||
| After Width: | Height: | Size: 4.9 KiB | 
| After Width: | Height: | Size: 2.5 KiB | 
| After Width: | Height: | Size: 7.9 KiB | 
| After Width: | Height: | Size: 16 KiB | 
| After Width: | Height: | Size: 25 KiB | 
| @ -0,0 +1,18 @@ | ||||
| <?xml version="1.0" encoding="utf-8"?> | ||||
| <resources> | ||||
|     <!-- Theme applied to the Android Window while the process is starting when the OS's Dark Mode setting is on --> | ||||
|     <style name="LaunchTheme" parent="@android:style/Theme.Black.NoTitleBar"> | ||||
|         <!-- Show a splash screen on the activity. Automatically removed when | ||||
|              the Flutter engine draws its first frame --> | ||||
|         <item name="android:windowBackground">@drawable/launch_background</item> | ||||
|     </style> | ||||
|     <!-- Theme applied to the Android Window as soon as the process has started. | ||||
|          This theme determines the color of the Android Window while your | ||||
|          Flutter UI initializes, as well as behind your Flutter UI while its | ||||
|          running. | ||||
| 
 | ||||
|          This Theme is only used starting with V2 of Flutter's Android embedding. --> | ||||
|     <style name="NormalTheme" parent="@android:style/Theme.Black.NoTitleBar"> | ||||
|         <item name="android:windowBackground">?android:colorBackground</item> | ||||
|     </style> | ||||
| </resources> | ||||
| @ -0,0 +1,18 @@ | ||||
| <?xml version="1.0" encoding="utf-8"?> | ||||
| <resources> | ||||
|     <!-- Theme applied to the Android Window while the process is starting when the OS's Dark Mode setting is off --> | ||||
|     <style name="LaunchTheme" parent="@android:style/Theme.Light.NoTitleBar"> | ||||
|         <!-- Show a splash screen on the activity. Automatically removed when | ||||
|              the Flutter engine draws its first frame --> | ||||
|         <item name="android:windowBackground">@drawable/launch_background</item> | ||||
|     </style> | ||||
|     <!-- Theme applied to the Android Window as soon as the process has started. | ||||
|          This theme determines the color of the Android Window while your | ||||
|          Flutter UI initializes, as well as behind your Flutter UI while its | ||||
|          running. | ||||
| 
 | ||||
|          This Theme is only used starting with V2 of Flutter's Android embedding. --> | ||||
|     <style name="NormalTheme" parent="@android:style/Theme.Light.NoTitleBar"> | ||||
|         <item name="android:windowBackground">?android:colorBackground</item> | ||||
|     </style> | ||||
| </resources> | ||||
| @ -0,0 +1,8 @@ | ||||
| <manifest xmlns:android="http://schemas.android.com/apk/res/android" | ||||
|     package="com.example.test_sa"> | ||||
|     <!-- The INTERNET permission is required for development. Specifically, | ||||
|          the Flutter tool needs it to communicate with the running application | ||||
|          to allow setting breakpoints, to provide hot reload, etc. | ||||
|     --> | ||||
|     <uses-permission android:name="android.permission.INTERNET"/> | ||||
| </manifest> | ||||
| @ -0,0 +1,32 @@ | ||||
| buildscript { | ||||
|     ext.kotlin_version = '1.6.10' | ||||
|     repositories { | ||||
|         google() | ||||
|         mavenCentral() | ||||
|     } | ||||
| 
 | ||||
|     dependencies { | ||||
|         classpath 'com.android.tools.build:gradle:7.1.2' | ||||
|         classpath 'com.google.gms:google-services:4.3.13' | ||||
|         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') | ||||
| } | ||||
| 
 | ||||
| task clean(type: Delete) { | ||||
|     delete rootProject.buildDir | ||||
| } | ||||
| @ -0,0 +1,3 @@ | ||||
| org.gradle.jvmargs=-Xmx1536M | ||||
| android.useAndroidX=true | ||||
| android.enableJetifier=true | ||||
| @ -0,0 +1,6 @@ | ||||
| #Fri Jun 23 08:50:38 CEST 2017 | ||||
| distributionBase=GRADLE_USER_HOME | ||||
| distributionPath=wrapper/dists | ||||
| zipStoreBase=GRADLE_USER_HOME | ||||
| zipStorePath=wrapper/dists | ||||
| distributionUrl=https\://services.gradle.org/distributions/gradle-7.4-all.zip | ||||
| @ -0,0 +1,11 @@ | ||||
| include ':app' | ||||
| 
 | ||||
| def localPropertiesFile = new File(rootProject.projectDir, "local.properties") | ||||
| def properties = new Properties() | ||||
| 
 | ||||
| assert localPropertiesFile.exists() | ||||
| localPropertiesFile.withReader("UTF-8") { reader -> properties.load(reader) } | ||||
| 
 | ||||
| def flutterSdkPath = properties.getProperty("flutter.sdk") | ||||
| assert flutterSdkPath != null, "flutter.sdk not set in local.properties" | ||||
| apply from: "$flutterSdkPath/packages/flutter_tools/gradle/app_plugin_loader.gradle" | ||||
| After Width: | Height: | Size: 122 KiB | 
| After Width: | Height: | Size: 503 KiB | 
| After Width: | Height: | Size: 364 KiB | 
| After Width: | Height: | Size: 208 KiB | 
| After Width: | Height: | Size: 608 KiB | 
| After Width: | Height: | Size: 11 KiB | 
| After Width: | Height: | Size: 283 KiB | 
| After Width: | Height: | Size: 21 KiB | 
| After Width: | Height: | Size: 93 KiB | 
| After Width: | Height: | Size: 30 KiB | 
| After Width: | Height: | Size: 122 KiB | 
| @ -0,0 +1,192 @@ | ||||
| { | ||||
|   "server_error_message": "الخدمة غير متاحة حاليا", | ||||
|   "failed_request_message": "الفشل في إكمال الطلب", | ||||
|   "successful_request_message": "تم إكمال الطلب بنجاح", | ||||
|   "request_lock_message": "انتظر حتى إكمال الطلب", | ||||
| 
 | ||||
| 
 | ||||
|   "cancel": "إلغاء", | ||||
|   "confirm": "تاكيد", | ||||
|   "done": "تم", | ||||
|   "exit": "إغلاق", | ||||
|   "exit_alert": "هل انت متاكد من رغبتك في إغلاق التطبيق؟", | ||||
|   "sign_out": "تسجيل الخروج", | ||||
|   "logout_alert": "هل انت متاكد من رغبتك في تسجيل الخروج؟", | ||||
|   "language": "اللغة", | ||||
| 
 | ||||
|   "name": "الاسم", | ||||
|   "email": "البريد الالكتروني", | ||||
|   "phone_number": "رقم الهاتف", | ||||
|   "password": "كلمة المرور", | ||||
|   "confirm_password": "تاكيد كلمة المرور", | ||||
|   "sign_in": "تسجيل الدخول", | ||||
|   "sign_up": "انشاء حساب", | ||||
|   "forget_password": "نسيت كلمة المرور", | ||||
|   "accept_terms_and_conditions": "موافقة علي الشروط والاحكام", | ||||
|   "email_validate_message": "البريد الالكتروني غير صحيح", | ||||
|   "name_validate_message": "الاسم مطلوب", | ||||
|   "password_validate_message": "علي الاقل استخدم 6 حروف او ارقام", | ||||
|   "confirm_password_validate_message": "كلمة المرور و تاكيد كلمة المرور غير متطابقان", | ||||
|   "phone_number_validate_message": "رقم الهاتف غير صالح", | ||||
|   "terms_and_conditions_validate_message": "موافقة علي الشروط والاحكام مطاوبة", | ||||
| 
 | ||||
|   "update": "تحديث", | ||||
|   "step": "خطوة", | ||||
|   "forget_password_with_mark": "نسيت كلمة المرور؟", | ||||
|   "show_password": "اظهار كلمة المرور", | ||||
|   "wrong_email_or_password": "البريد الالكتروني او كلمة المرور غير صحيح", | ||||
|   "email_exist": "البريد الالكتروني موجود بالفعل", | ||||
|   "phone_number_exist": "رقم الهاتف موجود بالفعل", | ||||
|   "next": "التالي", | ||||
|   "back": "السابق", | ||||
|   "search": "بحث", | ||||
|   "search_by_name": "بحث بالاسم", | ||||
|   "address": "العنوان", | ||||
|   "address_not_found": "لا يوجد عنوان", | ||||
|   "address_validate_message": "العنوان مطلوب", | ||||
|   "data_not_found": "لا يوجد تاريخ", | ||||
|   "description": "الوصف", | ||||
|   "description_not_found": "لا يوجد وصف", | ||||
|   "description_validate_message": "الوصف مطلوب", | ||||
|   "edit": "تعدل", | ||||
|   "email_not_found": "لا يوجد بريد الكتروني", | ||||
|   "from": "من", | ||||
|   "to": "إلى", | ||||
|   "link_not_found": "لا يوجد رابط", | ||||
|   "name_not_found": "لا يوجد إسم", | ||||
|   "phone_number_not_found": "لا يوجد رقم هاتف", | ||||
|   "title": "عنوان", | ||||
|   "title_not_found": "لا يوجد عنوان", | ||||
|   "title_validate_message": "العنوان مطلوب", | ||||
|   "url_not_found": "لا يوجد رابط", | ||||
| 
 | ||||
|   "date": "تاريخ", | ||||
|   "status": "الحالة", | ||||
|   "code": "كود", | ||||
|   "serialNumber": "رقم تسلسلي", | ||||
|   "add": "اضافة", | ||||
|   "brand": "ماركة", | ||||
|   "clearSearch": "تنظيف البحث", | ||||
|   "closed": "غلق", | ||||
|   "create": "انشاء", | ||||
|   "createServiceRequest": "انشاء طلب خدمة", | ||||
|   "delete": "مسح", | ||||
|   "details": "تفاصيل", | ||||
|   "device": "جهاز", | ||||
|   "deviceArName": "اسم الجهاز بعربي", | ||||
|   "deviceEnName": "اسم الجهاز بالانجليزية", | ||||
|   "deviceImages": "صور الجهاز", | ||||
|   "deviceModel": "مركة الجهاز", | ||||
|   "deviceName": "اسم الجهاز", | ||||
|   "deviceRequired": "الجهاز مطلوب", | ||||
|   "deviceSN": "رقم تسلسلي للجهاز", | ||||
|   "engineerName": "اسم المهندس", | ||||
|   "engineerPhone": "رقم المهندس", | ||||
|   "facebook": "فيسبوك", | ||||
|   "faultDescription": "تفاصيل الخطأ", | ||||
|   "general": "تفاصيل العامة", | ||||
|   "hospital": "العميل", | ||||
|   "hospitalRequired": "العميل مطلوبة", | ||||
|   "hotLine": "الخط ساخن", | ||||
|   "jobSheetNumber": "رقم ورقة العمل", | ||||
|   "linkedIn": "لينكد إن", | ||||
|   "maintenanceIssue": "مشكلة الصيانة", | ||||
|   "maintenanceIssueRequired": "مطلوب مسألة صيانة", | ||||
|   "maxImagesNumberIs5": "أقصى عدد للصورة 5", | ||||
|   "model": "نموذج", | ||||
|   "nameExist": "الاسم موجود", | ||||
|   "newServiceRequest": "طلب خدمة جديدة", | ||||
|   "newWord": "جديد", | ||||
|   "noDateFound": "لم يتم العثور على تاريخ", | ||||
|   "noDeviceFound": "لم يتم العثور على جهاز", | ||||
|   "noHospitalFound": "لا يوجد عميل", | ||||
|   "noModelFound": "لم يتم العثور على نموذج", | ||||
|   "noServiceRequestFound": "لم يتم العثور على طلب خدمة", | ||||
|   "noSnFound": "لم يتم العثور على رقم تسلسلي", | ||||
|   "notifications": "إشعارات", | ||||
|   "notificationsNotFound": "لم يتم العثور على إشعارات", | ||||
|   "noUniteFound": "لا توجد اقسام", | ||||
|   "ourWebsite": "موقعنا", | ||||
|   "pickDevice": "اختر الجهاز", | ||||
|   "pickHospital": "اختر العميل", | ||||
|   "pickUnite": "اختر القسم", | ||||
|   "policy": "سياسة", | ||||
|   "reason1": "لم يؤكد المهندس موعد الزيارة قبل ساعتين من وقت الطلب", | ||||
|   "reason2": "يقوم المهندس بتغيير موعد الزيارة دون التنسيق معي", | ||||
|   "reason3": "لم يحضر المهندس في التاريخ / الوقت", | ||||
|   "reason4": "لا يمكنني الوصول إلى المهندس عن طريق الهاتف أو الرسائل القصيرة", | ||||
|   "reason5": "هناك تأخير في إحضار قطع الغيار", | ||||
|   "repaired": "تم الاصلاح", | ||||
|   "repeated": "معاد", | ||||
|   "reportIssue": "الإبلاغ عن مشكلة", | ||||
|   "requestInformation": "معلومات طلب", | ||||
|   "searchBySn": "البحث بالرقم التسلسلي", | ||||
|   "serviceRequestInformation": "معلومات طلب الخدمة", | ||||
|   "serviceRequests": "طلبات الخدمة", | ||||
|   "shareAntherIssue": "مشاركة قضية أخرى", | ||||
|   "shareApp": "مشاركة التطبيق", | ||||
|   "sn": "الرقم التسلسلي", | ||||
|   "submit": "إرسال", | ||||
|   "trackServiceRequest": "تتبع طلبات الخدمة", | ||||
|   "twitter": "تويتر", | ||||
|   "underRepair": "تحت الاصلاح", | ||||
|   "unite": "قسم", | ||||
|   "uniteRequired": "القسم مطلوب", | ||||
|   "visitDate": "تاريخ الزيارة", | ||||
|   "whatsApp": "واتساب", | ||||
|   "workPerformed": "العمل انجز", | ||||
| 
 | ||||
|   "actualDate": "تاريخ الفعلي", | ||||
|   "done": "تم الانتهاء", | ||||
|   "expectDate": "التاريخ المتوقع", | ||||
|   "images": "الصور", | ||||
|   "imagesRequired": "الصور مطلوبة", | ||||
|   "noSerialNumberFound": "لا يوجد رقم تسلسلي", | ||||
|   "notYet": "ليس بعد", | ||||
|   "noVisitsFound": "لا توجد زيارات", | ||||
|   "onHold": "معلق", | ||||
|   "pickFromCamera": "الالتقاط من الكاميرا", | ||||
|   "pickFromGallery": "الاختيار من معرض صور", | ||||
|   "preventiveMaintenance": "الصيانة الوقائية", | ||||
|   "preventiveMaintenanceUpdatedSuccessfully": "تم تحديث الصيانة الوقائية بنجاح", | ||||
|   "regularVisits": "زيارات منتظمة", | ||||
|   "regularVisitsUpdatedSuccessfully": "تم تحديث الزيارات المنتظمة بنجاح", | ||||
|   "requiredStatus": "الحالة المطلوبة", | ||||
|   "updatePreventiveMaintenance": "تحديث الصيانة الوقائية", | ||||
|   "updateRegularVisits": "تحديث الزيارات المنتظمة", | ||||
|   "updateVisitsGroup": "تحديث مجموعة الزيارات", | ||||
|   "updatingDots": "تحديث ...", | ||||
|   "expectedVisitDate": "تاريخ الزيارة القادم", | ||||
|   "visitInformation": "معلومات الزيارة", | ||||
|   "travelingHours": "ساعات السفر", | ||||
|   "workingHours": "ساعات العمل", | ||||
|   "contactStatus": "تخصص", | ||||
|   "image": "صورة", | ||||
|   "pickImage": "اختر صورة", | ||||
|   "requiredImage": "الصورة مطلوبة", | ||||
|   "taskStatus": "حالة الطلب", | ||||
|   "activationAlert": "الحساب قيد المراجعة يرجى الانتظار حتى يتم تفعيله", | ||||
| 
 | ||||
|   "attachImage": "ارفق صورة", | ||||
|   "callLastSituation": "اخر موقف للطلب", | ||||
|   "customer": "العميل", | ||||
|   "editServiceReport": "تعديل التقرير الخدمة", | ||||
|   "invoiceCode": "كود الفتورة", | ||||
|   "invoiceNumber": "رقم الفتورة", | ||||
|   "newServiceReport": "تقرير خدمة جديد", | ||||
|   "number": "رقم", | ||||
|   "operatingHours": "ساعات العمل", | ||||
|   "partNumber": "رقم القطعة", | ||||
|   "quantity": "كمية", | ||||
|   "reasons": "الاسباب", | ||||
|   "reportStatus": "حالة التقرير", | ||||
|   "reportType": "نوع التقرير", | ||||
|   "callId": "رقم الطلب", | ||||
|   "requiredWord": "مطلوب", | ||||
|   "serviceType": "نوع الخدمة", | ||||
|   "workPreformed": "العمل المنجز", | ||||
|   "alert": "تنبيه", | ||||
|   "duplicateAlert": "تنبيه التكرار", | ||||
|   "duplicateAlertMessage": "هل أنت متأكد أنك تريد تكرار الطلب؟", | ||||
|   "duplicateRequest": "تكرار الطلب" | ||||
| } | ||||
| @ -0,0 +1,192 @@ | ||||
| { | ||||
|   "server_error_message": "Currently, Service not available", | ||||
|   "failed_request_message": "Failed to complete request", | ||||
|   "successful_request_message": "Request complete successfully", | ||||
|   "request_lock_message": "Wait until your request complete", | ||||
| 
 | ||||
|   "cancel": "Cancel", | ||||
|   "confirm": "Confirm", | ||||
|   "done": "Done", | ||||
|   "exit": "Exit", | ||||
|   "exit_alert": "Are you sure you want to exit?", | ||||
|   "sign_out": "Sign Out", | ||||
|   "logout_alert": "Are you sure you want to Sign Out?", | ||||
|   "language": "English", | ||||
| 
 | ||||
|   "name": "Name", | ||||
|   "email": "Email", | ||||
|   "phone_number": "Phone Number", | ||||
|   "password": "Password", | ||||
|   "confirm_password": "Confirm Password", | ||||
|   "sign_in": "Sign In", | ||||
|   "sign_up": "Sign Up", | ||||
|   "forget_password": "Forget Password", | ||||
|   "accept_terms_and_conditions": "Accept Terms And Conditions", | ||||
|   "email_validate_message": "Not valid email", | ||||
|   "name_validate_message": "name is required", | ||||
|   "password_validate_message": "at least 6 characters or numbers", | ||||
|   "confirm_password_validate_message": "Password and confirm password not match", | ||||
|   "phone_number_validate_message": "Not valid phone number", | ||||
|   "terms_and_conditions_validate_message": "Accept terms and conditions is required", | ||||
| 
 | ||||
|   "update": "Update", | ||||
|   "step": "Step", | ||||
|   "forget_password_with_mark": "Forget Password?", | ||||
|   "show_password": "show password", | ||||
|   "wrong_email_or_password": "Wrong email or password", | ||||
|   "email_exist": "Email exist", | ||||
|   "phone_number_exist": "Phone number exist", | ||||
|   "next": "Next", | ||||
|   "back": "Back", | ||||
|   "search": "Search", | ||||
|   "search_by_name": "Search by name", | ||||
|   "address": "Address", | ||||
|   "address_not_found": "Address not found", | ||||
|   "address_validate_message": "Address validate_message", | ||||
|   "data_not_found": "Data not found", | ||||
|   "description": "Description", | ||||
|   "description_not_found": "Description not found", | ||||
|   "description_validate_message": "Description can't be empty", | ||||
|   "edit": "Edit", | ||||
|   "email_not_found": "Email not found", | ||||
|   "from": "From", | ||||
|   "to": "To", | ||||
|   "link_not_found": "Link not found", | ||||
|   "name_not_found": "Name not found", | ||||
|   "phone_number_not_found": "Phone number not found", | ||||
|   "title": "Title", | ||||
|   "title_not_found": "Title not found", | ||||
|   "title_validate_message": "Title Can't be empty", | ||||
|   "url_not_found": "URL not found", | ||||
| 
 | ||||
|   "date": "Date", | ||||
|   "status": "Status", | ||||
|   "code": "Code", | ||||
|   "serialNumber": "Serial Number", | ||||
|   "add": "Add", | ||||
|   "brand": "Brand", | ||||
|   "clearSearch": "Clear Search", | ||||
|   "closed": "Closed", | ||||
|   "create": "Create", | ||||
|   "createServiceRequest": "Create Service Request", | ||||
|   "delete": "Delete", | ||||
|   "details": "Details", | ||||
|   "device": "Asset", | ||||
|   "deviceArName": "Asset Ar Name", | ||||
|   "deviceEnName": "Asset En Name", | ||||
|   "deviceImages": "Asset Images", | ||||
|   "deviceModel": "Asset Model", | ||||
|   "deviceName": "Asset Name", | ||||
|   "deviceRequired": "Asset Required", | ||||
|   "deviceSN": "Asset SN", | ||||
|   "engineerName": "Engineer Name", | ||||
|   "engineerPhone": "Engineer Phone", | ||||
|   "facebook": "facebook", | ||||
|   "faultDescription": "Fault Description", | ||||
|   "general": "General", | ||||
|   "hospital": "Client", | ||||
|   "hospitalRequired": "Client Required", | ||||
|   "hotLine": "Hot Line", | ||||
|   "jobSheetNumber": "Job Sheet Number", | ||||
|   "linkedIn": "linkedIn", | ||||
|   "maintenanceIssue": "Maintenance Issue", | ||||
|   "maintenanceIssueRequired": "maintenance Issue Required", | ||||
|   "maxImagesNumberIs5": "Maximum Images Number Is 5", | ||||
|   "model": "Model", | ||||
|   "nameExist": "Name Exist", | ||||
|   "newServiceRequest": "New Service Request", | ||||
|   "newWord": "New", | ||||
|   "noDateFound": "No Date Found", | ||||
|   "noDeviceFound": "No Device Found", | ||||
|   "noHospitalFound": "No Client Found", | ||||
|   "noModelFound": "No Model Found", | ||||
|   "noServiceRequestFound": "No Service Request Found", | ||||
|   "noSnFound": "No SN Found", | ||||
|   "notifications": "Notifications", | ||||
|   "notificationsNotFound": "Notifications Not Found", | ||||
|   "noUniteFound": "No Unit Found", | ||||
|   "ourWebsite": "Our Website", | ||||
|   "pickDevice": "Pick Device", | ||||
|   "pickHospital": "Pick Client", | ||||
|   "pickUnite": "Pick Unit", | ||||
|   "policy": "Policy", | ||||
|   "reason1": "The engineer didn't confirm visit date with 2 hours from the request time", | ||||
|   "reason2": "The engineer change the visit date without coordination with me", | ||||
|   "reason3": "the engineer didn't attend on date/time", | ||||
|   "reason4": "I can't reach engineer by phone or SMS", | ||||
|   "reason5": "There is delay ib bringing  the spare parts", | ||||
|   "repaired": "Repaired", | ||||
|   "repeated": "Repeated", | ||||
|   "reportIssue": "Report a Issue", | ||||
|   "requestInformation": "request Information", | ||||
|   "searchBySn": "Search By Sn", | ||||
|   "serviceRequestInformation": "Service Request Information", | ||||
|   "serviceRequests": "Service Requests", | ||||
|   "shareAntherIssue": "share Another Issue", | ||||
|   "shareApp": "Share App", | ||||
|   "sn": "SN", | ||||
|   "submit": "Submit", | ||||
|   "trackServiceRequest": "Track Service Requests", | ||||
|   "twitter": "Twitter", | ||||
|   "underRepair": "Under Repair", | ||||
|   "unite": "Unit", | ||||
|   "uniteRequired": "Unit Required", | ||||
|   "visitDate": "Visit Date", | ||||
|   "whatsApp": "WhatsApp", | ||||
|   "workPerformed": "Work Performed", | ||||
| 
 | ||||
|   "actualDate": "Actual Date", | ||||
|   "done": "Done", | ||||
|   "expectDate": "Expect Date", | ||||
|   "images": "Images", | ||||
|   "imagesRequired": "Images Required", | ||||
|   "noSerialNumberFound": "No Serial Number Found", | ||||
|   "notYet": "Not Yet", | ||||
|   "noVisitsFound": "No Visits Found", | ||||
|   "onHold": "On Hold", | ||||
|   "pickFromCamera": "Pick From Camera", | ||||
|   "pickFromGallery": "Pick From Gallery", | ||||
|   "preventiveMaintenance": "Preventive Maintenance", | ||||
|   "preventiveMaintenanceUpdatedSuccessfully": "Preventive Maintenance Updated Successfully", | ||||
|   "regularVisits": "Regular Visits", | ||||
|   "regularVisitsUpdatedSuccessfully": "Regular Visits Updated Successfully", | ||||
|   "requiredStatus": "Required Status", | ||||
|   "updatePreventiveMaintenance": "Update Preventive Maintenance", | ||||
|   "updateRegularVisits": "Update Regular Visits", | ||||
|   "updateVisitsGroup": "Update Visits Group", | ||||
|   "updatingDots": "Updating ...", | ||||
|   "expectedVisitDate": "Next Visit Date", | ||||
|   "visitInformation": "Visit Information", | ||||
|   "travelingHours": "Traveling Hours", | ||||
|   "workingHours": "Working Hours", | ||||
|   "contactStatus": "Assigned To", | ||||
|   "image": "Image", | ||||
|   "pickImage": "Pick Image", | ||||
|   "requiredImage": "Image Required", | ||||
|   "taskStatus": "Task Status", | ||||
|   "activationAlert": "Account under reviewing please wait until be activated", | ||||
| 
 | ||||
|   "attachImage": "Attach Image", | ||||
|   "callLastSituation": "Call's Last Situation", | ||||
|   "customer": "Customer", | ||||
|   "editServiceReport": "Edit Service Report", | ||||
|   "invoiceCode": "Invoice Code", | ||||
|   "invoiceNumber": "Invoice Number", | ||||
|   "newServiceReport": "New Service Report", | ||||
|   "number": "Number", | ||||
|   "operatingHours": "Operating Hours", | ||||
|   "partNumber": "Part Number", | ||||
|   "quantity": "Quantity", | ||||
|   "reasons": "Reasons", | ||||
|   "reportStatus": "Report Status", | ||||
|   "reportType": "Report Type", | ||||
|   "callId": "Call Id", | ||||
|   "requiredWord": "required", | ||||
|   "serviceType": "Service Type", | ||||
|   "workPreformed": "Work Preformed", | ||||
| 
 | ||||
|   "alert": "Alert", | ||||
|   "duplicateAlert": "Duplicate Alert", | ||||
|   "duplicateAlertMessage": "Are you sure you want to duplicate request?", | ||||
|   "duplicateRequest": "Duplicate Request" | ||||
| } | ||||
| @ -0,0 +1,34 @@ | ||||
| **/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 | ||||
| @ -0,0 +1,26 @@ | ||||
| <?xml version="1.0" encoding="UTF-8"?> | ||||
| <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> | ||||
| <plist version="1.0"> | ||||
| <dict> | ||||
|   <key>CFBundleDevelopmentRegion</key> | ||||
|   <string>en</string> | ||||
|   <key>CFBundleExecutable</key> | ||||
|   <string>App</string> | ||||
|   <key>CFBundleIdentifier</key> | ||||
|   <string>io.flutter.flutter.app</string> | ||||
|   <key>CFBundleInfoDictionaryVersion</key> | ||||
|   <string>6.0</string> | ||||
|   <key>CFBundleName</key> | ||||
|   <string>App</string> | ||||
|   <key>CFBundlePackageType</key> | ||||
|   <string>FMWK</string> | ||||
|   <key>CFBundleShortVersionString</key> | ||||
|   <string>1.0</string> | ||||
|   <key>CFBundleSignature</key> | ||||
|   <string>????</string> | ||||
|   <key>CFBundleVersion</key> | ||||
|   <string>1.0</string> | ||||
|   <key>MinimumOSVersion</key> | ||||
|   <string>9.0</string> | ||||
| </dict> | ||||
| </plist> | ||||
| @ -0,0 +1 @@ | ||||
| #include "Generated.xcconfig" | ||||
| @ -0,0 +1 @@ | ||||
| #include "Generated.xcconfig" | ||||
| @ -0,0 +1,481 @@ | ||||
| // !$*UTF8*$! | ||||
| { | ||||
| 	archiveVersion = 1; | ||||
| 	classes = { | ||||
| 	}; | ||||
| 	objectVersion = 50; | ||||
| 	objects = { | ||||
| 
 | ||||
| /* Begin PBXBuildFile section */ | ||||
| 		1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */ = {isa = PBXBuildFile; fileRef = 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */; }; | ||||
| 		3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */ = {isa = PBXBuildFile; fileRef = 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */; }; | ||||
| 		74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 74858FAE1ED2DC5600515810 /* AppDelegate.swift */; }; | ||||
| 		97C146FC1CF9000F007C117D /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FA1CF9000F007C117D /* Main.storyboard */; }; | ||||
| 		97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FD1CF9000F007C117D /* Assets.xcassets */; }; | ||||
| 		97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */; }; | ||||
| /* End PBXBuildFile section */ | ||||
| 
 | ||||
| /* Begin PBXCopyFilesBuildPhase section */ | ||||
| 		9705A1C41CF9048500538489 /* Embed Frameworks */ = { | ||||
| 			isa = PBXCopyFilesBuildPhase; | ||||
| 			buildActionMask = 2147483647; | ||||
| 			dstPath = ""; | ||||
| 			dstSubfolderSpec = 10; | ||||
| 			files = ( | ||||
| 			); | ||||
| 			name = "Embed Frameworks"; | ||||
| 			runOnlyForDeploymentPostprocessing = 0; | ||||
| 		}; | ||||
| /* End PBXCopyFilesBuildPhase section */ | ||||
| 
 | ||||
| /* Begin PBXFileReference section */ | ||||
| 		1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GeneratedPluginRegistrant.h; sourceTree = "<group>"; }; | ||||
| 		1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GeneratedPluginRegistrant.m; sourceTree = "<group>"; }; | ||||
| 		3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = AppFrameworkInfo.plist; path = Flutter/AppFrameworkInfo.plist; sourceTree = "<group>"; }; | ||||
| 		74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Runner-Bridging-Header.h"; sourceTree = "<group>"; }; | ||||
| 		74858FAE1ED2DC5600515810 /* AppDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = "<group>"; }; | ||||
| 		7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = Release.xcconfig; path = Flutter/Release.xcconfig; sourceTree = "<group>"; }; | ||||
| 		9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Debug.xcconfig; path = Flutter/Debug.xcconfig; sourceTree = "<group>"; }; | ||||
| 		9740EEB31CF90195004384FC /* Generated.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Generated.xcconfig; path = Flutter/Generated.xcconfig; sourceTree = "<group>"; }; | ||||
| 		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 = "<group>"; }; | ||||
| 		97C146FD1CF9000F007C117D /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = "<group>"; }; | ||||
| 		97C147001CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = "<group>"; }; | ||||
| 		97C147021CF9000F007C117D /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; }; | ||||
| /* End PBXFileReference section */ | ||||
| 
 | ||||
| /* Begin PBXFrameworksBuildPhase section */ | ||||
| 		97C146EB1CF9000F007C117D /* Frameworks */ = { | ||||
| 			isa = PBXFrameworksBuildPhase; | ||||
| 			buildActionMask = 2147483647; | ||||
| 			files = ( | ||||
| 			); | ||||
| 			runOnlyForDeploymentPostprocessing = 0; | ||||
| 		}; | ||||
| /* End PBXFrameworksBuildPhase section */ | ||||
| 
 | ||||
| /* Begin PBXGroup section */ | ||||
| 		9740EEB11CF90186004384FC /* Flutter */ = { | ||||
| 			isa = PBXGroup; | ||||
| 			children = ( | ||||
| 				3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */, | ||||
| 				9740EEB21CF90195004384FC /* Debug.xcconfig */, | ||||
| 				7AFA3C8E1D35360C0083082E /* Release.xcconfig */, | ||||
| 				9740EEB31CF90195004384FC /* Generated.xcconfig */, | ||||
| 			); | ||||
| 			name = Flutter; | ||||
| 			sourceTree = "<group>"; | ||||
| 		}; | ||||
| 		97C146E51CF9000F007C117D = { | ||||
| 			isa = PBXGroup; | ||||
| 			children = ( | ||||
| 				9740EEB11CF90186004384FC /* Flutter */, | ||||
| 				97C146F01CF9000F007C117D /* Runner */, | ||||
| 				97C146EF1CF9000F007C117D /* Products */, | ||||
| 			); | ||||
| 			sourceTree = "<group>"; | ||||
| 		}; | ||||
| 		97C146EF1CF9000F007C117D /* Products */ = { | ||||
| 			isa = PBXGroup; | ||||
| 			children = ( | ||||
| 				97C146EE1CF9000F007C117D /* Runner.app */, | ||||
| 			); | ||||
| 			name = Products; | ||||
| 			sourceTree = "<group>"; | ||||
| 		}; | ||||
| 		97C146F01CF9000F007C117D /* Runner */ = { | ||||
| 			isa = PBXGroup; | ||||
| 			children = ( | ||||
| 				97C146FA1CF9000F007C117D /* Main.storyboard */, | ||||
| 				97C146FD1CF9000F007C117D /* Assets.xcassets */, | ||||
| 				97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */, | ||||
| 				97C147021CF9000F007C117D /* Info.plist */, | ||||
| 				1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */, | ||||
| 				1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */, | ||||
| 				74858FAE1ED2DC5600515810 /* AppDelegate.swift */, | ||||
| 				74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */, | ||||
| 			); | ||||
| 			path = Runner; | ||||
| 			sourceTree = "<group>"; | ||||
| 		}; | ||||
| /* End PBXGroup section */ | ||||
| 
 | ||||
| /* Begin PBXNativeTarget section */ | ||||
| 		97C146ED1CF9000F007C117D /* Runner */ = { | ||||
| 			isa = PBXNativeTarget; | ||||
| 			buildConfigurationList = 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */; | ||||
| 			buildPhases = ( | ||||
| 				9740EEB61CF901F6004384FC /* Run Script */, | ||||
| 				97C146EA1CF9000F007C117D /* Sources */, | ||||
| 				97C146EB1CF9000F007C117D /* Frameworks */, | ||||
| 				97C146EC1CF9000F007C117D /* Resources */, | ||||
| 				9705A1C41CF9048500538489 /* Embed Frameworks */, | ||||
| 				3B06AD1E1E4923F5004D2608 /* Thin Binary */, | ||||
| 			); | ||||
| 			buildRules = ( | ||||
| 			); | ||||
| 			dependencies = ( | ||||
| 			); | ||||
| 			name = Runner; | ||||
| 			productName = Runner; | ||||
| 			productReference = 97C146EE1CF9000F007C117D /* Runner.app */; | ||||
| 			productType = "com.apple.product-type.application"; | ||||
| 		}; | ||||
| /* End PBXNativeTarget section */ | ||||
| 
 | ||||
| /* Begin PBXProject section */ | ||||
| 		97C146E61CF9000F007C117D /* Project object */ = { | ||||
| 			isa = PBXProject; | ||||
| 			attributes = { | ||||
| 				LastUpgradeCheck = 1300; | ||||
| 				ORGANIZATIONNAME = ""; | ||||
| 				TargetAttributes = { | ||||
| 					97C146ED1CF9000F007C117D = { | ||||
| 						CreatedOnToolsVersion = 7.3.1; | ||||
| 						LastSwiftMigration = 1100; | ||||
| 					}; | ||||
| 				}; | ||||
| 			}; | ||||
| 			buildConfigurationList = 97C146E91CF9000F007C117D /* Build configuration list for PBXProject "Runner" */; | ||||
| 			compatibilityVersion = "Xcode 9.3"; | ||||
| 			developmentRegion = en; | ||||
| 			hasScannedForEncodings = 0; | ||||
| 			knownRegions = ( | ||||
| 				en, | ||||
| 				Base, | ||||
| 			); | ||||
| 			mainGroup = 97C146E51CF9000F007C117D; | ||||
| 			productRefGroup = 97C146EF1CF9000F007C117D /* Products */; | ||||
| 			projectDirPath = ""; | ||||
| 			projectRoot = ""; | ||||
| 			targets = ( | ||||
| 				97C146ED1CF9000F007C117D /* Runner */, | ||||
| 			); | ||||
| 		}; | ||||
| /* End PBXProject section */ | ||||
| 
 | ||||
| /* Begin PBXResourcesBuildPhase section */ | ||||
| 		97C146EC1CF9000F007C117D /* Resources */ = { | ||||
| 			isa = PBXResourcesBuildPhase; | ||||
| 			buildActionMask = 2147483647; | ||||
| 			files = ( | ||||
| 				97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */, | ||||
| 				3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */, | ||||
| 				97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */, | ||||
| 				97C146FC1CF9000F007C117D /* Main.storyboard in Resources */, | ||||
| 			); | ||||
| 			runOnlyForDeploymentPostprocessing = 0; | ||||
| 		}; | ||||
| /* End PBXResourcesBuildPhase section */ | ||||
| 
 | ||||
| /* Begin PBXShellScriptBuildPhase section */ | ||||
| 		3B06AD1E1E4923F5004D2608 /* Thin Binary */ = { | ||||
| 			isa = PBXShellScriptBuildPhase; | ||||
| 			buildActionMask = 2147483647; | ||||
| 			files = ( | ||||
| 			); | ||||
| 			inputPaths = ( | ||||
| 			); | ||||
| 			name = "Thin Binary"; | ||||
| 			outputPaths = ( | ||||
| 			); | ||||
| 			runOnlyForDeploymentPostprocessing = 0; | ||||
| 			shellPath = /bin/sh; | ||||
| 			shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" embed_and_thin"; | ||||
| 		}; | ||||
| 		9740EEB61CF901F6004384FC /* Run Script */ = { | ||||
| 			isa = PBXShellScriptBuildPhase; | ||||
| 			buildActionMask = 2147483647; | ||||
| 			files = ( | ||||
| 			); | ||||
| 			inputPaths = ( | ||||
| 			); | ||||
| 			name = "Run Script"; | ||||
| 			outputPaths = ( | ||||
| 			); | ||||
| 			runOnlyForDeploymentPostprocessing = 0; | ||||
| 			shellPath = /bin/sh; | ||||
| 			shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" build"; | ||||
| 		}; | ||||
| /* End PBXShellScriptBuildPhase section */ | ||||
| 
 | ||||
| /* Begin PBXSourcesBuildPhase section */ | ||||
| 		97C146EA1CF9000F007C117D /* Sources */ = { | ||||
| 			isa = PBXSourcesBuildPhase; | ||||
| 			buildActionMask = 2147483647; | ||||
| 			files = ( | ||||
| 				74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */, | ||||
| 				1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */, | ||||
| 			); | ||||
| 			runOnlyForDeploymentPostprocessing = 0; | ||||
| 		}; | ||||
| /* End PBXSourcesBuildPhase section */ | ||||
| 
 | ||||
| /* Begin PBXVariantGroup section */ | ||||
| 		97C146FA1CF9000F007C117D /* Main.storyboard */ = { | ||||
| 			isa = PBXVariantGroup; | ||||
| 			children = ( | ||||
| 				97C146FB1CF9000F007C117D /* Base */, | ||||
| 			); | ||||
| 			name = Main.storyboard; | ||||
| 			sourceTree = "<group>"; | ||||
| 		}; | ||||
| 		97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */ = { | ||||
| 			isa = PBXVariantGroup; | ||||
| 			children = ( | ||||
| 				97C147001CF9000F007C117D /* Base */, | ||||
| 			); | ||||
| 			name = LaunchScreen.storyboard; | ||||
| 			sourceTree = "<group>"; | ||||
| 		}; | ||||
| /* End PBXVariantGroup section */ | ||||
| 
 | ||||
| /* Begin XCBuildConfiguration section */ | ||||
| 		249021D3217E4FDB00AE95B9 /* Profile */ = { | ||||
| 			isa = XCBuildConfiguration; | ||||
| 			buildSettings = { | ||||
| 				ALWAYS_SEARCH_USER_PATHS = NO; | ||||
| 				CLANG_ANALYZER_NONNULL = YES; | ||||
| 				CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; | ||||
| 				CLANG_CXX_LIBRARY = "libc++"; | ||||
| 				CLANG_ENABLE_MODULES = YES; | ||||
| 				CLANG_ENABLE_OBJC_ARC = YES; | ||||
| 				CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; | ||||
| 				CLANG_WARN_BOOL_CONVERSION = YES; | ||||
| 				CLANG_WARN_COMMA = YES; | ||||
| 				CLANG_WARN_CONSTANT_CONVERSION = YES; | ||||
| 				CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; | ||||
| 				CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; | ||||
| 				CLANG_WARN_EMPTY_BODY = YES; | ||||
| 				CLANG_WARN_ENUM_CONVERSION = YES; | ||||
| 				CLANG_WARN_INFINITE_RECURSION = YES; | ||||
| 				CLANG_WARN_INT_CONVERSION = YES; | ||||
| 				CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; | ||||
| 				CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; | ||||
| 				CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; | ||||
| 				CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; | ||||
| 				CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; | ||||
| 				CLANG_WARN_STRICT_PROTOTYPES = YES; | ||||
| 				CLANG_WARN_SUSPICIOUS_MOVE = YES; | ||||
| 				CLANG_WARN_UNREACHABLE_CODE = YES; | ||||
| 				CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; | ||||
| 				"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; | ||||
| 				COPY_PHASE_STRIP = NO; | ||||
| 				DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; | ||||
| 				ENABLE_NS_ASSERTIONS = NO; | ||||
| 				ENABLE_STRICT_OBJC_MSGSEND = YES; | ||||
| 				GCC_C_LANGUAGE_STANDARD = gnu99; | ||||
| 				GCC_NO_COMMON_BLOCKS = YES; | ||||
| 				GCC_WARN_64_TO_32_BIT_CONVERSION = YES; | ||||
| 				GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; | ||||
| 				GCC_WARN_UNDECLARED_SELECTOR = YES; | ||||
| 				GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; | ||||
| 				GCC_WARN_UNUSED_FUNCTION = YES; | ||||
| 				GCC_WARN_UNUSED_VARIABLE = YES; | ||||
| 				IPHONEOS_DEPLOYMENT_TARGET = 9.0; | ||||
| 				MTL_ENABLE_DEBUG_INFO = NO; | ||||
| 				SDKROOT = iphoneos; | ||||
| 				SUPPORTED_PLATFORMS = iphoneos; | ||||
| 				TARGETED_DEVICE_FAMILY = "1,2"; | ||||
| 				VALIDATE_PRODUCT = YES; | ||||
| 			}; | ||||
| 			name = Profile; | ||||
| 		}; | ||||
| 		249021D4217E4FDB00AE95B9 /* Profile */ = { | ||||
| 			isa = XCBuildConfiguration; | ||||
| 			baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; | ||||
| 			buildSettings = { | ||||
| 				ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; | ||||
| 				CLANG_ENABLE_MODULES = YES; | ||||
| 				CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; | ||||
| 				ENABLE_BITCODE = NO; | ||||
| 				INFOPLIST_FILE = Runner/Info.plist; | ||||
| 				LD_RUNPATH_SEARCH_PATHS = ( | ||||
| 					"$(inherited)", | ||||
| 					"@executable_path/Frameworks", | ||||
| 				); | ||||
| 				PRODUCT_BUNDLE_IDENTIFIER = com.example.testSa; | ||||
| 				PRODUCT_NAME = "$(TARGET_NAME)"; | ||||
| 				SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; | ||||
| 				SWIFT_VERSION = 5.0; | ||||
| 				VERSIONING_SYSTEM = "apple-generic"; | ||||
| 			}; | ||||
| 			name = Profile; | ||||
| 		}; | ||||
| 		97C147031CF9000F007C117D /* Debug */ = { | ||||
| 			isa = XCBuildConfiguration; | ||||
| 			buildSettings = { | ||||
| 				ALWAYS_SEARCH_USER_PATHS = NO; | ||||
| 				CLANG_ANALYZER_NONNULL = YES; | ||||
| 				CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; | ||||
| 				CLANG_CXX_LIBRARY = "libc++"; | ||||
| 				CLANG_ENABLE_MODULES = YES; | ||||
| 				CLANG_ENABLE_OBJC_ARC = YES; | ||||
| 				CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; | ||||
| 				CLANG_WARN_BOOL_CONVERSION = YES; | ||||
| 				CLANG_WARN_COMMA = YES; | ||||
| 				CLANG_WARN_CONSTANT_CONVERSION = YES; | ||||
| 				CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; | ||||
| 				CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; | ||||
| 				CLANG_WARN_EMPTY_BODY = YES; | ||||
| 				CLANG_WARN_ENUM_CONVERSION = YES; | ||||
| 				CLANG_WARN_INFINITE_RECURSION = YES; | ||||
| 				CLANG_WARN_INT_CONVERSION = YES; | ||||
| 				CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; | ||||
| 				CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; | ||||
| 				CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; | ||||
| 				CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; | ||||
| 				CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; | ||||
| 				CLANG_WARN_STRICT_PROTOTYPES = YES; | ||||
| 				CLANG_WARN_SUSPICIOUS_MOVE = YES; | ||||
| 				CLANG_WARN_UNREACHABLE_CODE = YES; | ||||
| 				CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; | ||||
| 				"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; | ||||
| 				COPY_PHASE_STRIP = NO; | ||||
| 				DEBUG_INFORMATION_FORMAT = dwarf; | ||||
| 				ENABLE_STRICT_OBJC_MSGSEND = YES; | ||||
| 				ENABLE_TESTABILITY = YES; | ||||
| 				GCC_C_LANGUAGE_STANDARD = gnu99; | ||||
| 				GCC_DYNAMIC_NO_PIC = NO; | ||||
| 				GCC_NO_COMMON_BLOCKS = YES; | ||||
| 				GCC_OPTIMIZATION_LEVEL = 0; | ||||
| 				GCC_PREPROCESSOR_DEFINITIONS = ( | ||||
| 					"DEBUG=1", | ||||
| 					"$(inherited)", | ||||
| 				); | ||||
| 				GCC_WARN_64_TO_32_BIT_CONVERSION = YES; | ||||
| 				GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; | ||||
| 				GCC_WARN_UNDECLARED_SELECTOR = YES; | ||||
| 				GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; | ||||
| 				GCC_WARN_UNUSED_FUNCTION = YES; | ||||
| 				GCC_WARN_UNUSED_VARIABLE = YES; | ||||
| 				IPHONEOS_DEPLOYMENT_TARGET = 9.0; | ||||
| 				MTL_ENABLE_DEBUG_INFO = YES; | ||||
| 				ONLY_ACTIVE_ARCH = YES; | ||||
| 				SDKROOT = iphoneos; | ||||
| 				TARGETED_DEVICE_FAMILY = "1,2"; | ||||
| 			}; | ||||
| 			name = Debug; | ||||
| 		}; | ||||
| 		97C147041CF9000F007C117D /* Release */ = { | ||||
| 			isa = XCBuildConfiguration; | ||||
| 			buildSettings = { | ||||
| 				ALWAYS_SEARCH_USER_PATHS = NO; | ||||
| 				CLANG_ANALYZER_NONNULL = YES; | ||||
| 				CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; | ||||
| 				CLANG_CXX_LIBRARY = "libc++"; | ||||
| 				CLANG_ENABLE_MODULES = YES; | ||||
| 				CLANG_ENABLE_OBJC_ARC = YES; | ||||
| 				CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; | ||||
| 				CLANG_WARN_BOOL_CONVERSION = YES; | ||||
| 				CLANG_WARN_COMMA = YES; | ||||
| 				CLANG_WARN_CONSTANT_CONVERSION = YES; | ||||
| 				CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; | ||||
| 				CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; | ||||
| 				CLANG_WARN_EMPTY_BODY = YES; | ||||
| 				CLANG_WARN_ENUM_CONVERSION = YES; | ||||
| 				CLANG_WARN_INFINITE_RECURSION = YES; | ||||
| 				CLANG_WARN_INT_CONVERSION = YES; | ||||
| 				CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; | ||||
| 				CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; | ||||
| 				CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; | ||||
| 				CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; | ||||
| 				CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; | ||||
| 				CLANG_WARN_STRICT_PROTOTYPES = YES; | ||||
| 				CLANG_WARN_SUSPICIOUS_MOVE = YES; | ||||
| 				CLANG_WARN_UNREACHABLE_CODE = YES; | ||||
| 				CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; | ||||
| 				"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; | ||||
| 				COPY_PHASE_STRIP = NO; | ||||
| 				DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; | ||||
| 				ENABLE_NS_ASSERTIONS = NO; | ||||
| 				ENABLE_STRICT_OBJC_MSGSEND = YES; | ||||
| 				GCC_C_LANGUAGE_STANDARD = gnu99; | ||||
| 				GCC_NO_COMMON_BLOCKS = YES; | ||||
| 				GCC_WARN_64_TO_32_BIT_CONVERSION = YES; | ||||
| 				GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; | ||||
| 				GCC_WARN_UNDECLARED_SELECTOR = YES; | ||||
| 				GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; | ||||
| 				GCC_WARN_UNUSED_FUNCTION = YES; | ||||
| 				GCC_WARN_UNUSED_VARIABLE = YES; | ||||
| 				IPHONEOS_DEPLOYMENT_TARGET = 9.0; | ||||
| 				MTL_ENABLE_DEBUG_INFO = NO; | ||||
| 				SDKROOT = iphoneos; | ||||
| 				SUPPORTED_PLATFORMS = iphoneos; | ||||
| 				SWIFT_COMPILATION_MODE = wholemodule; | ||||
| 				SWIFT_OPTIMIZATION_LEVEL = "-O"; | ||||
| 				TARGETED_DEVICE_FAMILY = "1,2"; | ||||
| 				VALIDATE_PRODUCT = YES; | ||||
| 			}; | ||||
| 			name = Release; | ||||
| 		}; | ||||
| 		97C147061CF9000F007C117D /* Debug */ = { | ||||
| 			isa = XCBuildConfiguration; | ||||
| 			baseConfigurationReference = 9740EEB21CF90195004384FC /* Debug.xcconfig */; | ||||
| 			buildSettings = { | ||||
| 				ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; | ||||
| 				CLANG_ENABLE_MODULES = YES; | ||||
| 				CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; | ||||
| 				ENABLE_BITCODE = NO; | ||||
| 				INFOPLIST_FILE = Runner/Info.plist; | ||||
| 				LD_RUNPATH_SEARCH_PATHS = ( | ||||
| 					"$(inherited)", | ||||
| 					"@executable_path/Frameworks", | ||||
| 				); | ||||
| 				PRODUCT_BUNDLE_IDENTIFIER = com.example.testSa; | ||||
| 				PRODUCT_NAME = "$(TARGET_NAME)"; | ||||
| 				SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; | ||||
| 				SWIFT_OPTIMIZATION_LEVEL = "-Onone"; | ||||
| 				SWIFT_VERSION = 5.0; | ||||
| 				VERSIONING_SYSTEM = "apple-generic"; | ||||
| 			}; | ||||
| 			name = Debug; | ||||
| 		}; | ||||
| 		97C147071CF9000F007C117D /* Release */ = { | ||||
| 			isa = XCBuildConfiguration; | ||||
| 			baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; | ||||
| 			buildSettings = { | ||||
| 				ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; | ||||
| 				CLANG_ENABLE_MODULES = YES; | ||||
| 				CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; | ||||
| 				ENABLE_BITCODE = NO; | ||||
| 				INFOPLIST_FILE = Runner/Info.plist; | ||||
| 				LD_RUNPATH_SEARCH_PATHS = ( | ||||
| 					"$(inherited)", | ||||
| 					"@executable_path/Frameworks", | ||||
| 				); | ||||
| 				PRODUCT_BUNDLE_IDENTIFIER = com.example.testSa; | ||||
| 				PRODUCT_NAME = "$(TARGET_NAME)"; | ||||
| 				SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; | ||||
| 				SWIFT_VERSION = 5.0; | ||||
| 				VERSIONING_SYSTEM = "apple-generic"; | ||||
| 			}; | ||||
| 			name = Release; | ||||
| 		}; | ||||
| /* End XCBuildConfiguration section */ | ||||
| 
 | ||||
| /* Begin XCConfigurationList section */ | ||||
| 		97C146E91CF9000F007C117D /* Build configuration list for PBXProject "Runner" */ = { | ||||
| 			isa = XCConfigurationList; | ||||
| 			buildConfigurations = ( | ||||
| 				97C147031CF9000F007C117D /* Debug */, | ||||
| 				97C147041CF9000F007C117D /* Release */, | ||||
| 				249021D3217E4FDB00AE95B9 /* Profile */, | ||||
| 			); | ||||
| 			defaultConfigurationIsVisible = 0; | ||||
| 			defaultConfigurationName = Release; | ||||
| 		}; | ||||
| 		97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */ = { | ||||
| 			isa = XCConfigurationList; | ||||
| 			buildConfigurations = ( | ||||
| 				97C147061CF9000F007C117D /* Debug */, | ||||
| 				97C147071CF9000F007C117D /* Release */, | ||||
| 				249021D4217E4FDB00AE95B9 /* Profile */, | ||||
| 			); | ||||
| 			defaultConfigurationIsVisible = 0; | ||||
| 			defaultConfigurationName = Release; | ||||
| 		}; | ||||
| /* End XCConfigurationList section */ | ||||
| 	}; | ||||
| 	rootObject = 97C146E61CF9000F007C117D /* Project object */; | ||||
| } | ||||
| @ -0,0 +1,7 @@ | ||||
| <?xml version="1.0" encoding="UTF-8"?> | ||||
| <Workspace | ||||
|    version = "1.0"> | ||||
|    <FileRef | ||||
|       location = "self:"> | ||||
|    </FileRef> | ||||
| </Workspace> | ||||
| @ -0,0 +1,8 @@ | ||||
| <?xml version="1.0" encoding="UTF-8"?> | ||||
| <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> | ||||
| <plist version="1.0"> | ||||
| <dict> | ||||
| 	<key>IDEDidComputeMac32BitWarning</key> | ||||
| 	<true/> | ||||
| </dict> | ||||
| </plist> | ||||
| @ -0,0 +1,8 @@ | ||||
| <?xml version="1.0" encoding="UTF-8"?> | ||||
| <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> | ||||
| <plist version="1.0"> | ||||
| <dict> | ||||
| 	<key>PreviewsEnabled</key> | ||||
| 	<false/> | ||||
| </dict> | ||||
| </plist> | ||||
| @ -0,0 +1,87 @@ | ||||
| <?xml version="1.0" encoding="UTF-8"?> | ||||
| <Scheme | ||||
|    LastUpgradeVersion = "1300" | ||||
|    version = "1.3"> | ||||
|    <BuildAction | ||||
|       parallelizeBuildables = "YES" | ||||
|       buildImplicitDependencies = "YES"> | ||||
|       <BuildActionEntries> | ||||
|          <BuildActionEntry | ||||
|             buildForTesting = "YES" | ||||
|             buildForRunning = "YES" | ||||
|             buildForProfiling = "YES" | ||||
|             buildForArchiving = "YES" | ||||
|             buildForAnalyzing = "YES"> | ||||
|             <BuildableReference | ||||
|                BuildableIdentifier = "primary" | ||||
|                BlueprintIdentifier = "97C146ED1CF9000F007C117D" | ||||
|                BuildableName = "Runner.app" | ||||
|                BlueprintName = "Runner" | ||||
|                ReferencedContainer = "container:Runner.xcodeproj"> | ||||
|             </BuildableReference> | ||||
|          </BuildActionEntry> | ||||
|       </BuildActionEntries> | ||||
|    </BuildAction> | ||||
|    <TestAction | ||||
|       buildConfiguration = "Debug" | ||||
|       selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB" | ||||
|       selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB" | ||||
|       shouldUseLaunchSchemeArgsEnv = "YES"> | ||||
|       <MacroExpansion> | ||||
|          <BuildableReference | ||||
|             BuildableIdentifier = "primary" | ||||
|             BlueprintIdentifier = "97C146ED1CF9000F007C117D" | ||||
|             BuildableName = "Runner.app" | ||||
|             BlueprintName = "Runner" | ||||
|             ReferencedContainer = "container:Runner.xcodeproj"> | ||||
|          </BuildableReference> | ||||
|       </MacroExpansion> | ||||
|       <Testables> | ||||
|       </Testables> | ||||
|    </TestAction> | ||||
|    <LaunchAction | ||||
|       buildConfiguration = "Debug" | ||||
|       selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB" | ||||
|       selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB" | ||||
|       launchStyle = "0" | ||||
|       useCustomWorkingDirectory = "NO" | ||||
|       ignoresPersistentStateOnLaunch = "NO" | ||||
|       debugDocumentVersioning = "YES" | ||||
|       debugServiceExtension = "internal" | ||||
|       allowLocationSimulation = "YES"> | ||||
|       <BuildableProductRunnable | ||||
|          runnableDebuggingMode = "0"> | ||||
|          <BuildableReference | ||||
|             BuildableIdentifier = "primary" | ||||
|             BlueprintIdentifier = "97C146ED1CF9000F007C117D" | ||||
|             BuildableName = "Runner.app" | ||||
|             BlueprintName = "Runner" | ||||
|             ReferencedContainer = "container:Runner.xcodeproj"> | ||||
|          </BuildableReference> | ||||
|       </BuildableProductRunnable> | ||||
|    </LaunchAction> | ||||
|    <ProfileAction | ||||
|       buildConfiguration = "Profile" | ||||
|       shouldUseLaunchSchemeArgsEnv = "YES" | ||||
|       savedToolIdentifier = "" | ||||
|       useCustomWorkingDirectory = "NO" | ||||
|       debugDocumentVersioning = "YES"> | ||||
|       <BuildableProductRunnable | ||||
|          runnableDebuggingMode = "0"> | ||||
|          <BuildableReference | ||||
|             BuildableIdentifier = "primary" | ||||
|             BlueprintIdentifier = "97C146ED1CF9000F007C117D" | ||||
|             BuildableName = "Runner.app" | ||||
|             BlueprintName = "Runner" | ||||
|             ReferencedContainer = "container:Runner.xcodeproj"> | ||||
|          </BuildableReference> | ||||
|       </BuildableProductRunnable> | ||||
|    </ProfileAction> | ||||
|    <AnalyzeAction | ||||
|       buildConfiguration = "Debug"> | ||||
|    </AnalyzeAction> | ||||
|    <ArchiveAction | ||||
|       buildConfiguration = "Release" | ||||
|       revealArchiveInOrganizer = "YES"> | ||||
|    </ArchiveAction> | ||||
| </Scheme> | ||||
| @ -0,0 +1,7 @@ | ||||
| <?xml version="1.0" encoding="UTF-8"?> | ||||
| <Workspace | ||||
|    version = "1.0"> | ||||
|    <FileRef | ||||
|       location = "group:Runner.xcodeproj"> | ||||
|    </FileRef> | ||||
| </Workspace> | ||||
| @ -0,0 +1,8 @@ | ||||
| <?xml version="1.0" encoding="UTF-8"?> | ||||
| <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> | ||||
| <plist version="1.0"> | ||||
| <dict> | ||||
| 	<key>IDEDidComputeMac32BitWarning</key> | ||||
| 	<true/> | ||||
| </dict> | ||||
| </plist> | ||||
| @ -0,0 +1,8 @@ | ||||
| <?xml version="1.0" encoding="UTF-8"?> | ||||
| <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> | ||||
| <plist version="1.0"> | ||||
| <dict> | ||||
| 	<key>PreviewsEnabled</key> | ||||
| 	<false/> | ||||
| </dict> | ||||
| </plist> | ||||
| @ -0,0 +1,13 @@ | ||||
| import UIKit | ||||
| import Flutter | ||||
| 
 | ||||
| @UIApplicationMain | ||||
| @objc class AppDelegate: FlutterAppDelegate { | ||||
|   override func application( | ||||
|     _ application: UIApplication, | ||||
|     didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]? | ||||
|   ) -> Bool { | ||||
|     GeneratedPluginRegistrant.register(with: self) | ||||
|     return super.application(application, didFinishLaunchingWithOptions: launchOptions) | ||||
|   } | ||||
| } | ||||
| @ -0,0 +1,122 @@ | ||||
| { | ||||
|   "images" : [ | ||||
|     { | ||||
|       "size" : "20x20", | ||||
|       "idiom" : "iphone", | ||||
|       "filename" : "Icon-App-20x20@2x.png", | ||||
|       "scale" : "2x" | ||||
|     }, | ||||
|     { | ||||
|       "size" : "20x20", | ||||
|       "idiom" : "iphone", | ||||
|       "filename" : "Icon-App-20x20@3x.png", | ||||
|       "scale" : "3x" | ||||
|     }, | ||||
|     { | ||||
|       "size" : "29x29", | ||||
|       "idiom" : "iphone", | ||||
|       "filename" : "Icon-App-29x29@1x.png", | ||||
|       "scale" : "1x" | ||||
|     }, | ||||
|     { | ||||
|       "size" : "29x29", | ||||
|       "idiom" : "iphone", | ||||
|       "filename" : "Icon-App-29x29@2x.png", | ||||
|       "scale" : "2x" | ||||
|     }, | ||||
|     { | ||||
|       "size" : "29x29", | ||||
|       "idiom" : "iphone", | ||||
|       "filename" : "Icon-App-29x29@3x.png", | ||||
|       "scale" : "3x" | ||||
|     }, | ||||
|     { | ||||
|       "size" : "40x40", | ||||
|       "idiom" : "iphone", | ||||
|       "filename" : "Icon-App-40x40@2x.png", | ||||
|       "scale" : "2x" | ||||
|     }, | ||||
|     { | ||||
|       "size" : "40x40", | ||||
|       "idiom" : "iphone", | ||||
|       "filename" : "Icon-App-40x40@3x.png", | ||||
|       "scale" : "3x" | ||||
|     }, | ||||
|     { | ||||
|       "size" : "60x60", | ||||
|       "idiom" : "iphone", | ||||
|       "filename" : "Icon-App-60x60@2x.png", | ||||
|       "scale" : "2x" | ||||
|     }, | ||||
|     { | ||||
|       "size" : "60x60", | ||||
|       "idiom" : "iphone", | ||||
|       "filename" : "Icon-App-60x60@3x.png", | ||||
|       "scale" : "3x" | ||||
|     }, | ||||
|     { | ||||
|       "size" : "20x20", | ||||
|       "idiom" : "ipad", | ||||
|       "filename" : "Icon-App-20x20@1x.png", | ||||
|       "scale" : "1x" | ||||
|     }, | ||||
|     { | ||||
|       "size" : "20x20", | ||||
|       "idiom" : "ipad", | ||||
|       "filename" : "Icon-App-20x20@2x.png", | ||||
|       "scale" : "2x" | ||||
|     }, | ||||
|     { | ||||
|       "size" : "29x29", | ||||
|       "idiom" : "ipad", | ||||
|       "filename" : "Icon-App-29x29@1x.png", | ||||
|       "scale" : "1x" | ||||
|     }, | ||||
|     { | ||||
|       "size" : "29x29", | ||||
|       "idiom" : "ipad", | ||||
|       "filename" : "Icon-App-29x29@2x.png", | ||||
|       "scale" : "2x" | ||||
|     }, | ||||
|     { | ||||
|       "size" : "40x40", | ||||
|       "idiom" : "ipad", | ||||
|       "filename" : "Icon-App-40x40@1x.png", | ||||
|       "scale" : "1x" | ||||
|     }, | ||||
|     { | ||||
|       "size" : "40x40", | ||||
|       "idiom" : "ipad", | ||||
|       "filename" : "Icon-App-40x40@2x.png", | ||||
|       "scale" : "2x" | ||||
|     }, | ||||
|     { | ||||
|       "size" : "76x76", | ||||
|       "idiom" : "ipad", | ||||
|       "filename" : "Icon-App-76x76@1x.png", | ||||
|       "scale" : "1x" | ||||
|     }, | ||||
|     { | ||||
|       "size" : "76x76", | ||||
|       "idiom" : "ipad", | ||||
|       "filename" : "Icon-App-76x76@2x.png", | ||||
|       "scale" : "2x" | ||||
|     }, | ||||
|     { | ||||
|       "size" : "83.5x83.5", | ||||
|       "idiom" : "ipad", | ||||
|       "filename" : "Icon-App-83.5x83.5@2x.png", | ||||
|       "scale" : "2x" | ||||
|     }, | ||||
|     { | ||||
|       "size" : "1024x1024", | ||||
|       "idiom" : "ios-marketing", | ||||
|       "filename" : "Icon-App-1024x1024@1x.png", | ||||
|       "scale" : "1x" | ||||
|     } | ||||
|   ], | ||||
|   "info" : { | ||||
|     "version" : 1, | ||||
|     "author" : "xcode" | ||||
|   } | ||||
| } | ||||
| After Width: | Height: | Size: 278 KiB | 
| After Width: | Height: | Size: 704 B | 
| After Width: | Height: | Size: 1.8 KiB | 
| After Width: | Height: | Size: 3.6 KiB | 
| After Width: | Height: | Size: 1.1 KiB | 
| After Width: | Height: | Size: 3.4 KiB | 
| After Width: | Height: | Size: 6.7 KiB | 
| After Width: | Height: | Size: 1.8 KiB | 
| After Width: | Height: | Size: 5.8 KiB | 
| After Width: | Height: | Size: 12 KiB | 
| After Width: | Height: | Size: 2.6 KiB | 
| After Width: | Height: | Size: 8.5 KiB | 
| After Width: | Height: | Size: 3.3 KiB | 
| After Width: | Height: | Size: 11 KiB | 
| After Width: | Height: | Size: 12 KiB | 
| After Width: | Height: | Size: 23 KiB | 
| After Width: | Height: | Size: 4.9 KiB | 
| After Width: | Height: | Size: 16 KiB | 
| After Width: | Height: | Size: 5.3 KiB | 
| After Width: | Height: | Size: 17 KiB | 
| After Width: | Height: | Size: 20 KiB | 
| @ -0,0 +1,23 @@ | ||||
| { | ||||
|   "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" | ||||
|   } | ||||
| } | ||||
| After Width: | Height: | Size: 68 B | 
| After Width: | Height: | Size: 68 B | 
| After Width: | Height: | Size: 68 B | 
| @ -0,0 +1,5 @@ | ||||
| # 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. | ||||
| @ -0,0 +1,37 @@ | ||||
| <?xml version="1.0" encoding="UTF-8" standalone="no"?> | ||||
| <document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="12121" systemVersion="16G29" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" launchScreen="YES" colorMatched="YES" initialViewController="01J-lp-oVM"> | ||||
|     <dependencies> | ||||
|         <deployment identifier="iOS"/> | ||||
|         <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="12089"/> | ||||
|     </dependencies> | ||||
|     <scenes> | ||||
|         <!--View Controller--> | ||||
|         <scene sceneID="EHf-IW-A2E"> | ||||
|             <objects> | ||||
|                 <viewController id="01J-lp-oVM" sceneMemberID="viewController"> | ||||
|                     <layoutGuides> | ||||
|                         <viewControllerLayoutGuide type="top" id="Ydg-fD-yQy"/> | ||||
|                         <viewControllerLayoutGuide type="bottom" id="xbc-2k-c8Z"/> | ||||
|                     </layoutGuides> | ||||
|                     <view key="view" contentMode="scaleToFill" id="Ze5-6b-2t3"> | ||||
|                         <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/> | ||||
|                         <subviews> | ||||
|                             <imageView opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" image="LaunchImage" translatesAutoresizingMaskIntoConstraints="NO" id="YRO-k0-Ey4"> | ||||
|                             </imageView> | ||||
|                         </subviews> | ||||
|                         <color key="backgroundColor" red="1" green="1" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/> | ||||
|                         <constraints> | ||||
|                             <constraint firstItem="YRO-k0-Ey4" firstAttribute="centerX" secondItem="Ze5-6b-2t3" secondAttribute="centerX" id="1a2-6s-vTC"/> | ||||
|                             <constraint firstItem="YRO-k0-Ey4" firstAttribute="centerY" secondItem="Ze5-6b-2t3" secondAttribute="centerY" id="4X2-HB-R7a"/> | ||||
|                         </constraints> | ||||
|                     </view> | ||||
|                 </viewController> | ||||
|                 <placeholder placeholderIdentifier="IBFirstResponder" id="iYj-Kq-Ea1" userLabel="First Responder" sceneMemberID="firstResponder"/> | ||||
|             </objects> | ||||
|             <point key="canvasLocation" x="53" y="375"/> | ||||
|         </scene> | ||||
|     </scenes> | ||||
|     <resources> | ||||
|         <image name="LaunchImage" width="168" height="185"/> | ||||
|     </resources> | ||||
| </document> | ||||
| @ -0,0 +1,26 @@ | ||||
| <?xml version="1.0" encoding="UTF-8" standalone="no"?> | ||||
| <document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="10117" systemVersion="15F34" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" initialViewController="BYZ-38-t0r"> | ||||
|     <dependencies> | ||||
|         <deployment identifier="iOS"/> | ||||
|         <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="10085"/> | ||||
|     </dependencies> | ||||
|     <scenes> | ||||
|         <!--Flutter View Controller--> | ||||
|         <scene sceneID="tne-QT-ifu"> | ||||
|             <objects> | ||||
|                 <viewController id="BYZ-38-t0r" customClass="FlutterViewController" sceneMemberID="viewController"> | ||||
|                     <layoutGuides> | ||||
|                         <viewControllerLayoutGuide type="top" id="y3c-jy-aDJ"/> | ||||
|                         <viewControllerLayoutGuide type="bottom" id="wfy-db-euE"/> | ||||
|                     </layoutGuides> | ||||
|                     <view key="view" contentMode="scaleToFill" id="8bC-Xf-vdC"> | ||||
|                         <rect key="frame" x="0.0" y="0.0" width="600" height="600"/> | ||||
|                         <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/> | ||||
|                         <color key="backgroundColor" white="1" alpha="1" colorSpace="custom" customColorSpace="calibratedWhite"/> | ||||
|                     </view> | ||||
|                 </viewController> | ||||
|                 <placeholder placeholderIdentifier="IBFirstResponder" id="dkx-z0-nzr" sceneMemberID="firstResponder"/> | ||||
|             </objects> | ||||
|         </scene> | ||||
|     </scenes> | ||||
| </document> | ||||
| @ -0,0 +1,49 @@ | ||||
| <?xml version="1.0" encoding="UTF-8"?> | ||||
| <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> | ||||
| <plist version="1.0"> | ||||
| <dict> | ||||
| 	<key>CFBundleDevelopmentRegion</key> | ||||
| 	<string>$(DEVELOPMENT_LANGUAGE)</string> | ||||
| 	<key>CFBundleDisplayName</key> | ||||
| 	<string>Test Sa</string> | ||||
| 	<key>CFBundleExecutable</key> | ||||
| 	<string>$(EXECUTABLE_NAME)</string> | ||||
| 	<key>CFBundleIdentifier</key> | ||||
| 	<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string> | ||||
| 	<key>CFBundleInfoDictionaryVersion</key> | ||||
| 	<string>6.0</string> | ||||
| 	<key>CFBundleName</key> | ||||
| 	<string>ATOMS</string> | ||||
| 	<key>CFBundlePackageType</key> | ||||
| 	<string>APPL</string> | ||||
| 	<key>CFBundleShortVersionString</key> | ||||
| 	<string>$(FLUTTER_BUILD_NAME)</string> | ||||
| 	<key>CFBundleSignature</key> | ||||
| 	<string>????</string> | ||||
| 	<key>CFBundleVersion</key> | ||||
| 	<string>$(FLUTTER_BUILD_NUMBER)</string> | ||||
| 	<key>LSRequiresIPhoneOS</key> | ||||
| 	<true/> | ||||
| 	<key>UILaunchStoryboardName</key> | ||||
| 	<string>LaunchScreen</string> | ||||
| 	<key>UIMainStoryboardFile</key> | ||||
| 	<string>Main</string> | ||||
| 	<key>UISupportedInterfaceOrientations</key> | ||||
| 	<array> | ||||
| 		<string>UIInterfaceOrientationPortrait</string> | ||||
| 		<string>UIInterfaceOrientationLandscapeLeft</string> | ||||
| 		<string>UIInterfaceOrientationLandscapeRight</string> | ||||
| 	</array> | ||||
| 	<key>UISupportedInterfaceOrientations~ipad</key> | ||||
| 	<array> | ||||
| 		<string>UIInterfaceOrientationPortrait</string> | ||||
| 		<string>UIInterfaceOrientationPortraitUpsideDown</string> | ||||
| 		<string>UIInterfaceOrientationLandscapeLeft</string> | ||||
| 		<string>UIInterfaceOrientationLandscapeRight</string> | ||||
| 	</array> | ||||
| 	<key>UIViewControllerBasedStatusBarAppearance</key> | ||||
| 	<false/> | ||||
| 	<key>CADisableMinimumFrameDurationOnPhone</key> | ||||
| 	<true/> | ||||
| </dict> | ||||
| </plist> | ||||
| @ -0,0 +1 @@ | ||||
| #import "GeneratedPluginRegistrant.h" | ||||
| @ -0,0 +1,57 @@ | ||||
| class URLs{ | ||||
|   URLs._(); | ||||
|   static const host2 = "http://194.163.164.213/atoms/api"; | ||||
|   static const host1 = "http://194.163.164.213/atoms/api"; | ||||
| 
 | ||||
|   // API Routes | ||||
|   static const login = "/handle/user/login"; // post | ||||
|   static const register = "/handle/create/user"; // post | ||||
|   static const updateProfile = "/update/user/profile"; // post | ||||
|   static const getHospitals = "/handle/return/all/clients"; // get | ||||
|   static const getDepartments = "/handle/return/all/departments"; // get | ||||
|   static const getEquipment = "/handle/return/all/client/equipments"; // get ?client=208051 | ||||
|   static const getServiceRequests = "/return/user/calls"; // get | ||||
| 
 | ||||
|   static const getPreventiveMaintenanceVisits = "/return/user/calibrations"; // get | ||||
|   static const updatePreventiveMaintenanceVisits = "/update/user/calibrations"; // get | ||||
| 
 | ||||
|   static const getRegularVisits = "/return/user/ppm"; // get | ||||
|   static const updateRegularVisits = "/update/user/ppm"; // get | ||||
| 
 | ||||
|   static const getSingleServiceRequest = "/return/call/information"; // get | ||||
|   static const getNotifications = "/return/user/notification"; // get | ||||
|   static const getRecentNotifications = "/return/user/recent/notification"; // get | ||||
|   static const createRequest = "/handle/create/request"; // get | ||||
|   static const createReport = "/handle/create/report/issue"; // get | ||||
|   static const updateRequestDate = "/handle/update/request"; // get | ||||
| 
 | ||||
|   // service report | ||||
|   static const createServiceReport = "/handle/create/service/report"; // get | ||||
|   static const updateServiceReport = "/handle/update/service/report"; // get | ||||
|   static const getServiceReport = "/handle/view/service/report"; // get | ||||
|   static const createDuplicatedReport = "/handle/duplicate/request"; // get | ||||
| 
 | ||||
|   static const getServiceReportReasons  = "/return/service/report/reasons"; // get | ||||
|   static const getServiceReportTypes = "/return/service/report/type"; // get | ||||
|   static const getServiceReportStatus = "/return/service/report/status"; // get | ||||
|   static const getServiceReportLastCalls = "/return/call/last/situation"; // get | ||||
|   static const getServiceTypes = "/return/service/type"; // get | ||||
|   static const getPartNumber = "/handle/return/all/parts"; // get | ||||
| 
 | ||||
|   //gas refill | ||||
|   static const getGasTypes = "/return/gas/refill/types"; // get | ||||
|   static const getGasCylinderSize = "/return/gas/refill/size/cylinder"; // get | ||||
|   static const getGasStatus = "/return/gas/refill/status"; // get | ||||
|   static const requestGasRefill = "/create/gas/refill"; // get | ||||
|   static const updateGasRefill = "/update/gas/refill/"; // get | ||||
|   static const getGasRefill = "/search/gas/refill"; // get | ||||
| 
 | ||||
|   //device transfer | ||||
|   static const requestDeviceTransfer = "/create/transfer/asset"; // get | ||||
|   static const updateDeviceTransfer = "/update/transfer/asset"; // get | ||||
|   static const getDeviceTransfer = "/search/transfer/asset"; // get | ||||
| 
 | ||||
|   // employee | ||||
|   static const getEmployees = "/return/assigned/employee"; // get | ||||
| 
 | ||||
| } | ||||
| @ -0,0 +1,40 @@ | ||||
| import 'package:test_sa/models/subtitle.dart'; | ||||
| import 'package:meta/meta.dart'; | ||||
| 
 | ||||
| class HttpStatusManger{ | ||||
|   static String getStatusMessage({ | ||||
|     @required int status, | ||||
|     @required Subtitle subtitle, | ||||
|     String messageFor400, | ||||
|     String messageFor200, | ||||
|   }){ | ||||
|     if(status == null) | ||||
|       // no status code - code error no need for subtitle | ||||
|       return "careful null status"; | ||||
|     if(status == -1) | ||||
|       // client's request in process | ||||
|       return subtitle.currentlyServiceNotAvailable; | ||||
|     if(status == -2){ | ||||
|       // client's request in process | ||||
|       return subtitle.waitUntilYourRequestComplete; | ||||
|     }else if(status >= 200 && status < 300){ | ||||
|       // client's request was successfully received | ||||
|       return messageFor200 ?? subtitle.requestCompleteSuccessfully; | ||||
|     } else if(status >= 400 && status < 500){ | ||||
|       // client's request have error | ||||
|       switch(status){ | ||||
|         case 400: | ||||
|           return messageFor400 ?? subtitle.failedToCompleteRequest; | ||||
|         default: | ||||
|           return subtitle.failedToCompleteRequest; | ||||
|       } | ||||
|     } else if(status >= 500){ | ||||
|       // server error | ||||
|       return subtitle.currentlyServiceNotAvailable; | ||||
|     } else { | ||||
|       // no error match so return default error | ||||
|       return subtitle.failedToCompleteRequest; | ||||
|     } | ||||
| 
 | ||||
|   } | ||||
| } | ||||
| @ -0,0 +1,48 @@ | ||||
| import 'dart:convert'; | ||||
| 
 | ||||
| import 'package:test_sa/models/subtitle.dart'; | ||||
| import 'package:flutter/material.dart'; | ||||
| import 'package:flutter/services.dart'; | ||||
| 
 | ||||
| 
 | ||||
| class AppLocalization { | ||||
|   AppLocalization(this.locale); | ||||
| 
 | ||||
|   final Locale locale; | ||||
|   static AppLocalization of(BuildContext context) { | ||||
|     return Localizations.of<AppLocalization>(context, AppLocalization); | ||||
|   } | ||||
| 
 | ||||
|   Subtitle _subtitle; | ||||
|   Subtitle get subtitle => _subtitle; | ||||
| 
 | ||||
|   Future<void> load() async { | ||||
|     String jsonStringValues = | ||||
|     await rootBundle.loadString('assets/subtitles/${locale.languageCode}_subtitle.json'); | ||||
|     _subtitle = Subtitle.fromJson(json.decode(jsonStringValues)); | ||||
|   } | ||||
| 
 | ||||
|   // static member to have simple access to the delegate from Material App | ||||
|   static const LocalizationsDelegate<AppLocalization> delegate = | ||||
|   _DemoLocalizationsDelegate(); | ||||
| } | ||||
| 
 | ||||
| class _DemoLocalizationsDelegate | ||||
|     extends LocalizationsDelegate<AppLocalization> { | ||||
|   const _DemoLocalizationsDelegate(); | ||||
| 
 | ||||
|   @override | ||||
|   bool isSupported(Locale locale) { | ||||
|     return ['en','ar'].contains(locale.languageCode); | ||||
|   } | ||||
| 
 | ||||
|   @override | ||||
|   Future<AppLocalization> load(Locale locale) async { | ||||
|     AppLocalization localization = new AppLocalization(locale); | ||||
|     await localization.load(); | ||||
|     return localization; | ||||
|   } | ||||
| 
 | ||||
|   @override | ||||
|   bool shouldReload(LocalizationsDelegate<AppLocalization> old) => false; | ||||
| } | ||||
| @ -0,0 +1,83 @@ | ||||
| import 'dart:convert'; | ||||
| 
 | ||||
| import 'package:test_sa/models/app_notification.dart'; | ||||
| import 'package:firebase_core/firebase_core.dart'; | ||||
| import 'package:firebase_messaging/firebase_messaging.dart'; | ||||
| import 'package:flutter/material.dart'; | ||||
| 
 | ||||
| import 'notification_manger.dart'; | ||||
| 
 | ||||
| class FirebaseNotificationManger{ | ||||
| 
 | ||||
|   static FirebaseMessaging messaging = FirebaseMessaging.instance; | ||||
|   static String token; | ||||
| 
 | ||||
|   static Future<String> getToken() async { | ||||
|     NotificationSettings settings = await messaging.requestPermission( | ||||
|       alert: true, | ||||
|       announcement: false, | ||||
|       badge: true, | ||||
|       carPlay: false, | ||||
|       criticalAlert: false, | ||||
|       provisional: false, | ||||
|       sound: true, | ||||
|     ); | ||||
| 
 | ||||
|     if(settings.authorizationStatus == AuthorizationStatus.authorized){ | ||||
|       token = await messaging.getToken(); | ||||
|     } | ||||
|     return token; | ||||
|   } | ||||
| 
 | ||||
|   static initialized(BuildContext context) async { | ||||
|     await Firebase.initializeApp(); | ||||
|     NotificationSettings settings; | ||||
|     try{ | ||||
|       settings = await messaging.requestPermission( | ||||
|         alert: true, | ||||
|         announcement: false, | ||||
|         badge: true, | ||||
|         carPlay: false, | ||||
|         criticalAlert: false, | ||||
|         provisional: false, | ||||
|         sound: true, | ||||
|       ); | ||||
|     }catch(error){ | ||||
|       return; | ||||
|     } | ||||
| 
 | ||||
|     if(settings.authorizationStatus != AuthorizationStatus.authorized){ | ||||
|       return; | ||||
|     } | ||||
| 
 | ||||
|     // Also handle any interaction when the app is in the background via a | ||||
|     // Stream listener | ||||
|     FirebaseMessaging.onBackgroundMessage(firebaseMessagingBackgroundHandler); | ||||
| 
 | ||||
|     FirebaseMessaging.onMessageOpenedApp.listen((RemoteMessage message) { | ||||
|       AppNotification notification = AppNotification.fromJson(message.data); | ||||
|       if(notification.path == null | ||||
|           || notification.path.isEmpty) | ||||
|         return; | ||||
|       Navigator.pushNamed( | ||||
|           context, | ||||
|           notification.path, | ||||
|           arguments: notification.requestId | ||||
|       ); | ||||
|     }); | ||||
| 
 | ||||
|     FirebaseMessaging.onMessage.listen((RemoteMessage message) { | ||||
|       AppNotification notification = AppNotification.fromJson(message.data); | ||||
|       NotificationManger.showNotification( | ||||
|         title: message.notification.title, | ||||
|         subtext: message.notification.body, | ||||
|         hashcode: int.tryParse(notification.requestId ?? "") ?? 1, | ||||
|         payload: json.encode(message.data) | ||||
|       ); | ||||
|       return; | ||||
|     }); | ||||
|   } | ||||
| } | ||||
| 
 | ||||
| Future<void> firebaseMessagingBackgroundHandler(RemoteMessage message) async { | ||||
| } | ||||
| @ -0,0 +1,85 @@ | ||||
| import 'package:test_sa/views/app_style/colors.dart'; | ||||
| import 'package:flutter/foundation.dart'; | ||||
| import 'package:flutter_local_notifications/flutter_local_notifications.dart'; | ||||
| 
 | ||||
| class NotificationManger{ | ||||
|   // private constructor to avoid create object | ||||
|   NotificationManger._(); | ||||
| 
 | ||||
|   static FlutterLocalNotificationsPlugin localNotificationsPlugin = FlutterLocalNotificationsPlugin(); | ||||
| 
 | ||||
|   /// initialisation setting for all platform | ||||
|   /// onNotificationPressed action when notification pressed to open tap | ||||
|   /// onIOSNotificationPressed action when notification pressed | ||||
|   /// to open tap in iOS versions older than 10 | ||||
|   static initialisation( | ||||
|       Function(NotificationResponse) onNotificationPressed, | ||||
|       DidReceiveLocalNotificationCallback onIOSNotificationPressed | ||||
|     ) async { | ||||
|     FlutterLocalNotificationsPlugin flutterLocalNotificationsPlugin = | ||||
|     FlutterLocalNotificationsPlugin(); | ||||
|     // initialise the plugin. app_icon needs to be a added as a drawable resource to the Android head project | ||||
|     const AndroidInitializationSettings initializationSettingsAndroid = | ||||
|     AndroidInitializationSettings('app_icon',); | ||||
| 
 | ||||
|     final DarwinInitializationSettings initializationSettingsDarwin = | ||||
|     DarwinInitializationSettings( | ||||
|         onDidReceiveLocalNotification: onIOSNotificationPressed); | ||||
| 
 | ||||
|     final InitializationSettings initializationSettings = InitializationSettings( | ||||
|         android: initializationSettingsAndroid, | ||||
|         iOS: initializationSettingsDarwin, | ||||
|         macOS: initializationSettingsDarwin); | ||||
| 
 | ||||
|     await flutterLocalNotificationsPlugin.initialize( | ||||
|         initializationSettings, | ||||
|         onDidReceiveNotificationResponse: onNotificationPressed); | ||||
|   } | ||||
| 
 | ||||
|   // push new notification | ||||
|   static Future showNotification( | ||||
|       { | ||||
|         @required String title, | ||||
|         @required String subtext, | ||||
|         @required int hashcode, | ||||
|         String payload | ||||
|       }) async { | ||||
| 
 | ||||
|     const AndroidNotificationDetails androidChannel = AndroidNotificationDetails( | ||||
|       'com.newtrack.testsa', | ||||
|       'Test SA', | ||||
|       channelDescription:'Push notification service for Test SA', | ||||
|       importance: Importance.max, | ||||
|       priority: Priority.max, | ||||
|       playSound: true, | ||||
|       channelShowBadge: true, | ||||
|       enableLights: true, | ||||
|       visibility: NotificationVisibility.public, | ||||
|       ledColor: AColors.secondaryColor, | ||||
|       ledOnMs: 1, | ||||
|       ledOffMs: 0, | ||||
|       enableVibration: true, | ||||
|       groupKey: 'com.newtrack.testsa', | ||||
|     ); | ||||
| 
 | ||||
|     const DarwinNotificationDetails iosNotificationDetails = | ||||
|     DarwinNotificationDetails( | ||||
|       categoryIdentifier: "testSA", | ||||
|     ); | ||||
| 
 | ||||
|     const platformChannel = NotificationDetails( | ||||
|       android: androidChannel, | ||||
|       iOS: iosNotificationDetails, | ||||
|       macOS: iosNotificationDetails, | ||||
|     ); | ||||
| 
 | ||||
|     await localNotificationsPlugin.show( | ||||
|       hashcode, | ||||
|       title, | ||||
|       subtext, | ||||
|       platformChannel, | ||||
|       payload: payload, | ||||
|     ); | ||||
|   } | ||||
| 
 | ||||
| } | ||||
| @ -0,0 +1,67 @@ | ||||
| import 'dart:convert'; | ||||
| 
 | ||||
| import 'package:test_sa/controllers/api_routes/urls.dart'; | ||||
| import 'package:test_sa/models/department.dart'; | ||||
| import 'package:flutter/cupertino.dart'; | ||||
| import 'package:http/http.dart'; | ||||
| 
 | ||||
| class DepartmentsProvider extends ChangeNotifier{ | ||||
| 
 | ||||
|   //reset provider data | ||||
|   void reset(){ | ||||
|     departments = null; | ||||
|     stateCode = null; | ||||
|   } | ||||
| 
 | ||||
|   // state code of current request to defied error message | ||||
|   // like 400 customer request failed | ||||
|   // 500 service not available | ||||
|   int stateCode; | ||||
| 
 | ||||
| 
 | ||||
|   // contain user data | ||||
|   // when user not login or register _user = null | ||||
|   List<Department> departments; | ||||
| 
 | ||||
|   // when categories in-process _loading = true | ||||
|   // done _loading = true | ||||
|   // failed _loading = false | ||||
|   bool isLoading; | ||||
| 
 | ||||
| 
 | ||||
|   /// return -2 if request in progress | ||||
|   /// return -1 if error happen when sending request | ||||
|   /// return state code if request complete may be 200, 404 or 403 | ||||
|   /// for more details check http state manager | ||||
|   /// lib\controllers\http_status_manger\http_status_manger.dart | ||||
|   Future<int> getDepartment (String host) async { | ||||
|     if(isLoading == true) | ||||
|       return -2; | ||||
|     isLoading = true; | ||||
|     notifyListeners(); | ||||
|     Response response; | ||||
|     try{ | ||||
|       response = await get( | ||||
|           Uri.parse(host + URLs.getDepartments), | ||||
|         headers: { | ||||
|             "Content-Type":"application/json; charset=utf-8" | ||||
|         } | ||||
|       ); | ||||
|     } catch(error) { | ||||
|       isLoading = false; | ||||
|       stateCode = -1; | ||||
|       notifyListeners(); | ||||
|       return -1; | ||||
|     } | ||||
|     stateCode = response.statusCode; | ||||
|     if(response.statusCode >= 200 && response.statusCode < 300) { | ||||
|       // client's request was successfully received | ||||
|       List listJson = json.decode(utf8.decode(response.bodyBytes).replaceAll("\\", "")); | ||||
|       departments = listJson.map((department) => Department.fromJson(department)).toList(); | ||||
|     } | ||||
|     isLoading = false; | ||||
|     notifyListeners(); | ||||
|     return response.statusCode; | ||||
|   } | ||||
| 
 | ||||
| } | ||||
| @ -0,0 +1,206 @@ | ||||
| import 'dart:convert'; | ||||
| 
 | ||||
| import 'package:test_sa/controllers/api_routes/urls.dart'; | ||||
| import 'package:test_sa/controllers/http_status_manger/http_status_manger.dart'; | ||||
| import 'package:test_sa/models/department.dart'; | ||||
| import 'package:test_sa/models/device/device_transfer.dart'; | ||||
| import 'package:test_sa/models/device/device.dart'; | ||||
| import 'package:test_sa/models/device/device_transfer_info.dart'; | ||||
| import 'package:test_sa/models/gas_refill/gas_refill_model.dart'; | ||||
| import 'package:test_sa/models/hospital.dart'; | ||||
| import 'package:test_sa/models/issue.dart'; | ||||
| import 'package:test_sa/models/service_report.dart'; | ||||
| import 'package:test_sa/models/service_request/service_request.dart'; | ||||
| import 'package:test_sa/models/service_request/service_request_search.dart'; | ||||
| import 'package:test_sa/models/subtitle.dart'; | ||||
| import 'package:test_sa/models/user.dart'; | ||||
| import 'package:flutter/cupertino.dart'; | ||||
| import 'package:http/http.dart'; | ||||
| 
 | ||||
| class DeviceTransferProvider extends ChangeNotifier{ | ||||
| 
 | ||||
|   // number of items call in each request | ||||
|   final pageItemNumber = 50; | ||||
| 
 | ||||
|   //reset provider data | ||||
|   void reset(){ | ||||
|     items = null; | ||||
|     nextPage = true; | ||||
|     stateCode = null; | ||||
|   } | ||||
| 
 | ||||
|   // state code of current request to defied error message | ||||
|   // like 400 customer request failed | ||||
|   // 500 service not available | ||||
|   int stateCode; | ||||
| 
 | ||||
|   // true if there is next page in product list and false if not | ||||
|   bool nextPage = true; | ||||
| 
 | ||||
|   // list of user requests | ||||
|   List<DeviceTransfer> items; | ||||
| 
 | ||||
|   // when requests in-process _loading = true | ||||
|   // done _loading = true | ||||
|   // failed _loading = false | ||||
|   bool isLoading; | ||||
| 
 | ||||
|   /// return -2 if request in progress | ||||
|   /// return -1 if error happen when sending request | ||||
|   /// return state code if request complete may be 200, 404 or 403 | ||||
|   /// for more details check http state manager | ||||
|   /// lib\controllers\http_status_manger\http_status_manger.dart | ||||
|   Future<int> getRequests ({ | ||||
|     @required String host, | ||||
|     @required User user, | ||||
|   }) async { | ||||
|     if(isLoading == true) | ||||
|       return -2; | ||||
|     isLoading = true; | ||||
| 
 | ||||
|     // isLoading = false; | ||||
|     // stateCode = 200; | ||||
|     // items = []; | ||||
|     // items.addAll(List.generate(20, (index) => DeviceTransfer( | ||||
|     //   title: "ddddd", | ||||
|     //   id: "5", | ||||
|     //   device: Device(id: "1",brand: "brand",model: "model"), | ||||
|     //   destinationClient: Hospital(name: "hospital name",id: "1"), | ||||
|     //   destinationDepartment: Department(id: "5",name: "destination Department"), | ||||
|     //   senderDepartment: Department(id: "5",name: "sender Department"), | ||||
|     //   userId: "5" | ||||
|     // ))); | ||||
|     // notifyListeners(); | ||||
|     // return 200; | ||||
|     Response response; | ||||
|     try{ | ||||
|       print( Uri.parse( | ||||
|           "$host${URLs.getDeviceTransfer}?uid=${user.id}" | ||||
|               "&token=${user.token}&page=${(items?.length ?? 0) ~/pageItemNumber}" | ||||
|       ),); | ||||
|       response = await get( | ||||
|           Uri.parse( | ||||
|               "$host${URLs.getDeviceTransfer}?uid=${user.id}" | ||||
|               "&token=${user.token}&page=${(items?.length ?? 0) ~/pageItemNumber}" | ||||
|           ), | ||||
|         headers: { | ||||
|             "Content-Type":"application/json; charset=utf-8" | ||||
|         } | ||||
|       ); | ||||
|       stateCode = response.statusCode; | ||||
|       if(stateCode >= 200 && stateCode < 300) { | ||||
|         // client's request was successfully received | ||||
|         List listJson = json.decode(utf8.decode(response.bodyBytes).replaceAll("\\", "")); | ||||
|         List<DeviceTransfer> itemsPage = listJson.map( | ||||
|                 (request) => DeviceTransfer.fromJson(request)).toList(); | ||||
|         items ??= []; | ||||
|         items.addAll(itemsPage); | ||||
|         if(itemsPage.length == pageItemNumber){ | ||||
|           nextPage = true; | ||||
|         }else{ | ||||
|           nextPage = false; | ||||
|         } | ||||
|       } | ||||
|       isLoading = false; | ||||
|       notifyListeners(); | ||||
|       return response.statusCode; | ||||
| 
 | ||||
|     } catch(error) { | ||||
|       print(error); | ||||
|       isLoading = false; | ||||
|       stateCode = -1; | ||||
|       notifyListeners(); | ||||
|       return -1; | ||||
|     } | ||||
| 
 | ||||
|   } | ||||
| 
 | ||||
|   Future<int> createRequest ({ | ||||
|     @required String host, | ||||
|     @required User user, | ||||
|     @required DeviceTransfer model, | ||||
|   }) async { | ||||
|     Map<String,dynamic> body = { | ||||
|       "uid": user.id.toString(), | ||||
|       "token": user.token ?? "", | ||||
|       "serial_id": model.device.id ?? "", | ||||
|       "destination_client": model.receiver.client.id ?? "", | ||||
|       "destination_department": model.receiver.department.id ?? "", | ||||
|     }; | ||||
| 
 | ||||
| 
 | ||||
|     Response response; | ||||
|     try{ | ||||
|       response = await post( | ||||
|           Uri.parse( | ||||
|           host+URLs.requestDeviceTransfer), | ||||
|           body: body, | ||||
|       ); | ||||
| 
 | ||||
|       print(response.body); | ||||
|       stateCode = response.statusCode; | ||||
|       if(response.statusCode >= 200 && response.statusCode < 300) { | ||||
|         if(items != null) { | ||||
|           items.insert( | ||||
|               0, | ||||
|               DeviceTransfer.fromJson( | ||||
|                 json.decode(utf8.decode(response.bodyBytes))[0] | ||||
|               ) | ||||
|           ); | ||||
|           notifyListeners(); | ||||
|         } | ||||
|       } | ||||
|       return response.statusCode; | ||||
| 
 | ||||
|     } catch(error) { | ||||
|       print(error); | ||||
|       return -1; | ||||
|     } | ||||
| 
 | ||||
|   } | ||||
| 
 | ||||
|   Future<int> updateRequest ({ | ||||
|     @required String host, | ||||
|     @required User user, | ||||
|     @required bool isSender, | ||||
|     @required String requestId, | ||||
|     @required DeviceTransfer oldModel, | ||||
|     @required DeviceTransferInfo newModel, | ||||
|   }) async { | ||||
| 
 | ||||
|     Map<String,dynamic> body = { | ||||
|       "uid": user.id.toString(), | ||||
|       "token": user.token ?? "", | ||||
|       "current_user": user.id ?? "", | ||||
|     }; | ||||
|      | ||||
|     body.addAll(newModel.toJson(isSender)); | ||||
|     print(body); | ||||
|     Response response; | ||||
|     try{ | ||||
|       print(Uri.parse("$host${URLs.updateDeviceTransfer}/$requestId"),); | ||||
|       response = await post( | ||||
|         Uri.parse("$host${URLs.updateDeviceTransfer}/$requestId"), | ||||
|         body: body, | ||||
|       ); | ||||
| 
 | ||||
|       print(response.body); | ||||
|       stateCode = response.statusCode; | ||||
|       if(response.statusCode >= 200 && response.statusCode < 300) { | ||||
|         reset(); | ||||
|         // oldModel.fromDeviceTransfer( | ||||
|         //   DeviceTransfer.fromJson( | ||||
|         //       json.decode(utf8.decode(response.bodyBytes))[0] | ||||
|         //   ) | ||||
|         // ); | ||||
|         notifyListeners(); | ||||
|       } | ||||
|       return response.statusCode; | ||||
| 
 | ||||
|     } catch(error) { | ||||
|       print(error); | ||||
|       return -1; | ||||
|     } | ||||
| 
 | ||||
|   } | ||||
| } | ||||
| @ -0,0 +1,145 @@ | ||||
| import 'dart:convert'; | ||||
| 
 | ||||
| import 'package:test_sa/controllers/api_routes/urls.dart'; | ||||
| import 'package:test_sa/models/device/device.dart'; | ||||
| import 'package:test_sa/models/user.dart'; | ||||
| import 'package:flutter/cupertino.dart'; | ||||
| import 'package:http/http.dart'; | ||||
| 
 | ||||
| class DevicesProvider extends ChangeNotifier{ | ||||
| 
 | ||||
|   //reset provider data | ||||
|   void reset(){ | ||||
|     _devices = null; | ||||
|     _stateCode = null; | ||||
|   } | ||||
| 
 | ||||
|   // state code of current request to defied error message | ||||
|   // like 400 customer request failed | ||||
|   // 500 service not available | ||||
|   int _stateCode; | ||||
|   int get stateCode => _stateCode; | ||||
| 
 | ||||
|   List<Device> _devices; | ||||
|   List<Device> get devices => _devices; | ||||
| 
 | ||||
|   // when categories in-process _loading = true | ||||
|   // done _loading = true | ||||
|   // failed _loading = false | ||||
|   bool _loading; | ||||
|   bool get isLoading => _loading; | ||||
|   set isLoading(bool isLoading){ | ||||
|     _loading = isLoading; | ||||
|     notifyListeners(); | ||||
|   } | ||||
| 
 | ||||
|   /// return -2 if request in progress | ||||
|   /// return -1 if error happen when sending request | ||||
|   /// return state code if request complete may be 200, 404 or 403 | ||||
|   /// for more details check http state manager | ||||
|   /// lib\controllers\http_status_manger\http_status_manger.dart | ||||
|   Future<int> getEquipment ({ | ||||
|     @required String host, | ||||
|     @required User user, | ||||
|     @required String hospitalId | ||||
|   }) async { | ||||
|     if(_loading == true) | ||||
|       return -2; | ||||
|     _loading = true; | ||||
|     notifyListeners(); | ||||
|     Response response; | ||||
|     try{ | ||||
|       response = await get( | ||||
|           Uri.parse(host + URLs.getEquipment+"?client=$hospitalId"), | ||||
|         headers: { | ||||
|             "Content-Type":"application/json; charset=utf-8" | ||||
|         } | ||||
|       ); | ||||
|     } catch(error) { | ||||
|       _loading = false; | ||||
|       _stateCode = -1; | ||||
|       notifyListeners(); | ||||
|       return -1; | ||||
|     } | ||||
|     _stateCode = response.statusCode; | ||||
|     if(response.statusCode >= 200 && response.statusCode < 300) { | ||||
|       // client's request was successfully received | ||||
|       List equipmentListJson = json.decode(utf8.decode(response.bodyBytes)); | ||||
|       _devices = equipmentListJson.map((device) => Device.fromJson(device)).toList(); | ||||
|     } | ||||
|     _loading = false; | ||||
|     notifyListeners(); | ||||
|     return response.statusCode; | ||||
|   } | ||||
| 
 | ||||
|   /// return -2 if request in progress | ||||
|   /// return -1 if error happen when sending request | ||||
|   /// return state code if request complete may be 200, 404 or 403 | ||||
|   /// for more details check http state manager | ||||
|   /// lib\controllers\http_status_manger\http_status_manger.dart | ||||
|   Future<List<Device>> getDevicesList ({ | ||||
|     @required String host, | ||||
|     @required User user, | ||||
|     @required String hospitalId, | ||||
|     @required String title}) async { | ||||
|     Response response; | ||||
|     try{ | ||||
|       response = await get( | ||||
|           Uri.parse(host + URLs.getEquipment+"?client=$hospitalId" | ||||
|               + ( title == null || title.isEmpty ? "" : "&name=$title" )), | ||||
|       ); | ||||
|       _stateCode = response.statusCode; | ||||
|       List<Device>  _page = []; | ||||
|       if(response.statusCode >= 200 && response.statusCode < 300) { | ||||
|         // client's request was successfully received | ||||
|         List categoriesListJson = json.decode(utf8.decode(response.bodyBytes)); | ||||
|         _page = categoriesListJson.map((device) => Device.fromJson(device)).toList(); | ||||
|       } | ||||
|       return _page; | ||||
|     } catch(error) { | ||||
|       _loading = false; | ||||
|       _stateCode = -1; | ||||
|       notifyListeners(); | ||||
|       return []; | ||||
|     } | ||||
| 
 | ||||
|   } | ||||
| 
 | ||||
|   /// return -2 if request in progress | ||||
|   /// return -1 if error happen when sending request | ||||
|   /// return state code if request complete may be 200, 404 or 403 | ||||
|   /// for more details check http state manager | ||||
|   /// lib\controllers\http_status_manger\http_status_manger.dart | ||||
|   Future<List<Device>> getDevicesListBySN ({ | ||||
|     @required String host, | ||||
|     @required User user, | ||||
|     @required String hospitalId, | ||||
|     @required String sn | ||||
|   }) async { | ||||
|     Response response; | ||||
|     try{ | ||||
|       response = await get( | ||||
|         Uri.parse(host + URLs.getEquipment+"?client=$hospitalId" | ||||
|             + ( sn == null || sn.isEmpty ? "" : "&serial_qr=$sn" )), | ||||
|       ); | ||||
| 
 | ||||
|       _stateCode = response.statusCode; | ||||
|       List<Device>  _page = []; | ||||
|       if(response.statusCode >= 200 && response.statusCode < 300) { | ||||
|         // client's request was successfully received | ||||
|         List categoriesListJson = json.decode(utf8.decode(response.bodyBytes)); | ||||
|         print(categoriesListJson.length); | ||||
|         _page = categoriesListJson.map((device) => Device.fromJson(device)).toList(); | ||||
|         print(_page.length); | ||||
|       } | ||||
|       return _page; | ||||
|     } catch(error) { | ||||
|       print(error); | ||||
|       _loading = false; | ||||
|       _stateCode = -1; | ||||
|       notifyListeners(); | ||||
|       return []; | ||||
|     } | ||||
| 
 | ||||
|   } | ||||
| } | ||||
| @ -0,0 +1,191 @@ | ||||
| import 'dart:convert'; | ||||
| 
 | ||||
| import 'package:test_sa/controllers/api_routes/urls.dart'; | ||||
| import 'package:test_sa/controllers/http_status_manger/http_status_manger.dart'; | ||||
| import 'package:test_sa/models/gas_refill/gas_refill_model.dart'; | ||||
| import 'package:test_sa/models/issue.dart'; | ||||
| import 'package:test_sa/models/service_report.dart'; | ||||
| import 'package:test_sa/models/service_request/service_request.dart'; | ||||
| import 'package:test_sa/models/service_request/service_request_search.dart'; | ||||
| import 'package:test_sa/models/subtitle.dart'; | ||||
| import 'package:test_sa/models/user.dart'; | ||||
| import 'package:flutter/cupertino.dart'; | ||||
| import 'package:http/http.dart'; | ||||
| 
 | ||||
| class GasRefillProvider extends ChangeNotifier{ | ||||
| 
 | ||||
|   // number of items call in each request | ||||
|   final pageItemNumber = 50; | ||||
| 
 | ||||
|   //reset provider data | ||||
|   void reset(){ | ||||
|     items = null; | ||||
|     nextPage = true; | ||||
|     stateCode = null; | ||||
|   } | ||||
| 
 | ||||
|   // state code of current request to defied error message | ||||
|   // like 400 customer request failed | ||||
|   // 500 service not available | ||||
|   int stateCode; | ||||
| 
 | ||||
|   // true if there is next page in product list and false if not | ||||
|   bool nextPage = true; | ||||
| 
 | ||||
|   // list of user requests | ||||
|   List<GasRefillModel> items; | ||||
| 
 | ||||
|   // when requests in-process _loading = true | ||||
|   // done _loading = true | ||||
|   // failed _loading = false | ||||
|   bool isLoading; | ||||
| 
 | ||||
|   /// return -2 if request in progress | ||||
|   /// return -1 if error happen when sending request | ||||
|   /// return state code if request complete may be 200, 404 or 403 | ||||
|   /// for more details check http state manager | ||||
|   /// lib\controllers\http_status_manger\http_status_manger.dart | ||||
|   Future<int> getRequests ({ | ||||
|     @required String host, | ||||
|     @required User user, | ||||
|   }) async { | ||||
|     if(isLoading == true) | ||||
|       return -2; | ||||
|     isLoading = true; | ||||
|     Response response; | ||||
|     try{ | ||||
|       print(  Uri.parse( | ||||
|           "$host${URLs.getGasRefill}?uid=${user.id}" | ||||
|           "&token=${user.token}&page=${(items?.length ?? 0) ~/pageItemNumber}" | ||||
|       )); | ||||
|       response = await get( | ||||
|           Uri.parse( | ||||
|               "$host${URLs.getGasRefill}?uid=${user.id}" | ||||
|               "&token=${user.token}&page=${(items?.length ?? 0) ~/pageItemNumber}" | ||||
|           ), | ||||
|         headers: { | ||||
|             "Content-Type":"application/json; charset=utf-8" | ||||
|         } | ||||
|       ); | ||||
|       print(response.body); | ||||
|       stateCode = response.statusCode; | ||||
|       if(stateCode >= 200 && stateCode < 300) { | ||||
|         // client's request was successfully received | ||||
|         List requestsListJson = json.decode(utf8.decode(response.bodyBytes)); | ||||
|         List<GasRefillModel> itemsPage = requestsListJson.map( | ||||
|                 (request) => GasRefillModel.fromJson(request)).toList(); | ||||
|         items ??= []; | ||||
|         items.addAll(itemsPage); | ||||
|         if(itemsPage.length == pageItemNumber){ | ||||
|           nextPage = true; | ||||
|         }else{ | ||||
|           nextPage = false; | ||||
|         } | ||||
|       } | ||||
|       isLoading = false; | ||||
|       notifyListeners(); | ||||
|       return response.statusCode; | ||||
| 
 | ||||
|     } catch(error) { | ||||
|       print(error); | ||||
|       isLoading = false; | ||||
|       stateCode = -1; | ||||
|       notifyListeners(); | ||||
|       return -1; | ||||
|     } | ||||
| 
 | ||||
|   } | ||||
| 
 | ||||
|   Future<int> createModel ({ | ||||
|     @required String host, | ||||
|     @required User user, | ||||
|     @required GasRefillModel model, | ||||
|   }) async { | ||||
|     Map<String,dynamic> body = { | ||||
|       "uid": user.id.toString(), | ||||
|       "token": user.token ?? "", | ||||
|       "title": model.title ?? "", | ||||
|       "status": "0",//model.status.value.toString(), | ||||
|     }; | ||||
| 
 | ||||
|     body["details"] = jsonEncode(model.details.map((model) => { | ||||
|       "type": model.type.id.toString(), | ||||
|       "size": model.cylinderSize.id.toString(), | ||||
|       "requsted_qty": model.requestedQuantity.toString(), | ||||
|     }).toList()); | ||||
| 
 | ||||
|     print(body); | ||||
|     Response response; | ||||
|     try{ | ||||
|       response = await post( | ||||
|           Uri.parse( | ||||
|           host+URLs.requestGasRefill), | ||||
|           body: body, | ||||
|       ); | ||||
| 
 | ||||
|       print(response.body); | ||||
|       stateCode = response.statusCode; | ||||
|       if(response.statusCode >= 200 && response.statusCode < 300) { | ||||
|         if(items != null) { | ||||
|           items.insert( | ||||
|               0, | ||||
|               GasRefillModel.fromJson( | ||||
|                   json.decode(utf8.decode(response.bodyBytes))[0] | ||||
|               ) | ||||
|           ); | ||||
|           notifyListeners(); | ||||
|         } | ||||
|       } | ||||
|       return response.statusCode; | ||||
| 
 | ||||
|     } catch(error) { | ||||
|       print(error); | ||||
|       return -1; | ||||
|     } | ||||
| 
 | ||||
|   } | ||||
| 
 | ||||
|   Future<int> updateModel ({ | ||||
|     @required String host, | ||||
|     @required User user, | ||||
|     @required GasRefillModel oldModel, | ||||
|     @required GasRefillModel newModel, | ||||
|   }) async { | ||||
|     Map<String,dynamic> body = { | ||||
|       "uid": user.id.toString(), | ||||
|       "token": user.token ?? "", | ||||
|       "title": newModel.title ?? "", | ||||
|       "status": newModel.status.id.toString(), | ||||
|     }; | ||||
| 
 | ||||
|     body["details"] = jsonEncode(newModel.details.map((model) => { | ||||
|       "type": model.type.id.toString(), | ||||
|       "size": model.cylinderSize.id.toString(), | ||||
|       "requsted_qty": model.requestedQuantity.toString(), | ||||
|       "deliverd_qty": model.deliveredQuantity.toString(), | ||||
|     }).toList()); | ||||
| 
 | ||||
|     print(body); | ||||
|     print(Uri.parse("$host${URLs.updateGasRefill}/${newModel.id}"),); | ||||
|     Response response; | ||||
|     try{ | ||||
|       response = await post( | ||||
|         Uri.parse("$host${URLs.updateGasRefill}/${newModel.id}"), | ||||
|         body: body, | ||||
|       ); | ||||
| 
 | ||||
|       print(response.body); | ||||
|       stateCode = response.statusCode; | ||||
|       if(response.statusCode >= 200 && response.statusCode < 300) { | ||||
|         oldModel.fromGasRefillModel(newModel); | ||||
|         notifyListeners(); | ||||
|       } | ||||
|       return response.statusCode; | ||||
| 
 | ||||
|     } catch(error) { | ||||
|       print(error); | ||||
|       return -1; | ||||
|     } | ||||
| 
 | ||||
|   } | ||||
| } | ||||
| @ -0,0 +1,133 @@ | ||||
| import 'dart:convert'; | ||||
| 
 | ||||
| import 'package:test_sa/controllers/api_routes/urls.dart'; | ||||
| import 'package:test_sa/models/hospital.dart'; | ||||
| import 'package:test_sa/models/user.dart'; | ||||
| import 'package:flutter/cupertino.dart'; | ||||
| import 'package:flutter/material.dart'; | ||||
| import 'package:http/http.dart'; | ||||
| 
 | ||||
| class HospitalsProvider extends ChangeNotifier{ | ||||
| 
 | ||||
|   // number of items call in each request | ||||
|   final pageItemNumber = 50; | ||||
| 
 | ||||
|   //reset provider data | ||||
|   void reset(){ | ||||
|     _hospitals = null; | ||||
|     _stateCode = null; | ||||
|   } | ||||
| 
 | ||||
|   // state code of current request to defied error message | ||||
|   // like 400 customer request failed | ||||
|   // 500 service not available | ||||
|   int _stateCode; | ||||
|   int get stateCode => _stateCode; | ||||
| 
 | ||||
|   // true if there is next page in product list and false if not | ||||
|   bool _nextPage = true; | ||||
|   bool get nextPage => _nextPage; | ||||
| 
 | ||||
|   // contain user data | ||||
|   // when user not login or register _user = null | ||||
|   List<Hospital> _hospitals; | ||||
|   List<Hospital> get hospitals => _hospitals; | ||||
| 
 | ||||
|   // when categories in-process _loading = true | ||||
|   // done _loading = true | ||||
|   // failed _loading = false | ||||
|   bool _loading; | ||||
|   bool get isLoading => _loading; | ||||
|   set isLoading(bool isLoading){ | ||||
|     _loading = isLoading; | ||||
|     notifyListeners(); | ||||
|   } | ||||
| 
 | ||||
|   /// return -2 if request in progress | ||||
|   /// return -1 if error happen when sending request | ||||
|   /// return state code if request complete may be 200, 404 or 403 | ||||
|   /// for more details check http state manager | ||||
|   /// lib\controllers\http_status_manger\http_status_manger.dart | ||||
|   Future<int> getHospitals ({String host,User user,String title}) async { | ||||
|     if(_loading == true) | ||||
|       return -2; | ||||
|     _loading = true; | ||||
|     notifyListeners(); | ||||
|     Response response; | ||||
|     try{ | ||||
|       print( Uri.parse( | ||||
|           host + URLs.getHospitals | ||||
|               + "?page=${(_hospitals?.length ?? 0) ~/pageItemNumber}" | ||||
|               + ( title == null || title.isEmpty ? "" : "&name=$title" ))); | ||||
|       response = await get( | ||||
|           Uri.parse( | ||||
|               host + URLs.getHospitals | ||||
|           + "?page=${(_hospitals?.length ?? 0) ~/pageItemNumber}" | ||||
|           + ( title == null || title.isEmpty ? "" : "&name=$title" ) | ||||
|           ), | ||||
|         headers: { | ||||
|           "Content-Type":"application/json; charset=utf-8" | ||||
|         } | ||||
|       ); | ||||
|       _stateCode = response.statusCode; | ||||
|       if(response.statusCode >= 200 && response.statusCode < 300) { | ||||
|         // client's request was successfully received | ||||
|         List categoriesListJson = json.decode(utf8.decode(response.bodyBytes)); | ||||
|         List<Hospital>  _page = categoriesListJson.map((category) => Hospital.fromJson(category)).toList(); | ||||
|         if(hospitals == null) | ||||
|           _hospitals = []; | ||||
| 
 | ||||
|         _hospitals.addAll(_page); | ||||
|         if(_page.length >= pageItemNumber){ | ||||
|           _nextPage = true; | ||||
|         }else{ | ||||
|           _nextPage = false; | ||||
|         } | ||||
|       } | ||||
|       _loading = false; | ||||
|       notifyListeners(); | ||||
|       return response.statusCode; | ||||
|     } catch(error) { | ||||
|       _loading = false; | ||||
|       _stateCode = -1; | ||||
|       notifyListeners(); | ||||
|       return -1; | ||||
|     } | ||||
| 
 | ||||
|   } | ||||
| 
 | ||||
|   /// return -2 if request in progress | ||||
|   /// return -1 if error happen when sending request | ||||
|   /// return state code if request complete may be 200, 404 or 403 | ||||
|   /// for more details check http state manager | ||||
|   /// lib\controllers\http_status_manger\http_status_manger.dart | ||||
|   Future<List<Hospital>> getHospitalsList ({String host,User user,String title}) async { | ||||
|     Response response; | ||||
|     try{ | ||||
| 
 | ||||
|       response = await get( | ||||
|           Uri.parse(host + URLs.getHospitals | ||||
|               + ( title == null || title.isEmpty ? "" : "?name=$title" )), | ||||
|           headers: { | ||||
|             "Content-Type":"application/json; charset=utf-8" | ||||
|           } | ||||
|       ); | ||||
|       _stateCode = response.statusCode; | ||||
| 
 | ||||
|       List<Hospital>  _page = []; | ||||
|       if(response.statusCode >= 200 && response.statusCode < 300) { | ||||
|         // client's request was successfully received | ||||
|         List categoriesListJson = json.decode(utf8.decode(response.bodyBytes)); | ||||
|         _page = categoriesListJson.map((category) => Hospital.fromJson(category)).toList(); | ||||
|       } | ||||
|       return _page; | ||||
|     } catch(error) { | ||||
|       _loading = false; | ||||
|       _stateCode = -1; | ||||
|       notifyListeners(); | ||||
|       return []; | ||||
|     } | ||||
| 
 | ||||
|   } | ||||
| 
 | ||||
| } | ||||
| @ -0,0 +1,127 @@ | ||||
| import 'dart:convert'; | ||||
| 
 | ||||
| import 'package:test_sa/controllers/api_routes/urls.dart'; | ||||
| import 'package:test_sa/models/app_notification.dart'; | ||||
| import 'package:test_sa/models/user.dart'; | ||||
| import 'package:flutter/cupertino.dart'; | ||||
| import 'package:http/http.dart'; | ||||
| 
 | ||||
| class NotificationsProvider extends ChangeNotifier{ | ||||
| 
 | ||||
|   // number of items call in each request | ||||
|   final pageItemNumber = 20; | ||||
| 
 | ||||
|   //reset provider data | ||||
|   void reset(){ | ||||
|     notifications = null; | ||||
|     nextPage = true; | ||||
|     stateCode = null; | ||||
|   } | ||||
| 
 | ||||
|   // state code of current request to defied error message | ||||
|   // like 400 customer request failed | ||||
|   // 500 service not available | ||||
|   int stateCode; | ||||
| 
 | ||||
|   // true if there is next page in product list and false if not | ||||
|   bool nextPage = true; | ||||
| 
 | ||||
|   // list of user requests | ||||
|   List<AppNotification> notifications; | ||||
| 
 | ||||
|   // when requests in-process _loading = true | ||||
|   // done _loading = true | ||||
|   // failed _loading = false | ||||
|   bool isLoading; | ||||
| 
 | ||||
| 
 | ||||
|   /// return -2 if request in progress | ||||
|   /// return -1 if error happen when sending request | ||||
|   /// return state code if request complete may be 200, 404 or 403 | ||||
|   /// for more details check http state manager | ||||
|   /// lib\controllers\http_status_manger\http_status_manger.dart | ||||
|   Future<int> getNotifications ({ | ||||
|     @required String host, | ||||
|     @required User user, | ||||
|     @required String hospitalId, | ||||
|   }) async { | ||||
|     if(isLoading == true) | ||||
|       return -2; | ||||
|     isLoading = true; | ||||
|     notifyListeners(); | ||||
|     Response response; | ||||
|    // userId = 397.toString(); // testing id to view data | ||||
|     try{ | ||||
|       response = await get( | ||||
|           Uri.parse(host+URLs.getNotifications | ||||
|           +"?uid=${user.id}" | ||||
|           "&token=${user.token}" | ||||
|           "&page=${(notifications?.length ?? 0) ~/pageItemNumber}"), | ||||
|         headers: { | ||||
|             "Content-Type":"application/json; charset=utf-8" | ||||
|         } | ||||
|       ); | ||||
|       stateCode = response.statusCode; | ||||
|       if(response.statusCode >= 200 && response.statusCode < 300) { | ||||
|         // client's request was successfully received | ||||
|         List requestsListJson = json.decode(utf8.decode(response.bodyBytes)); | ||||
|         List<AppNotification> _serviceRequestsPage = requestsListJson.map( | ||||
|                 (request) => AppNotification.fromJson(request)).toList(); | ||||
|         if(notifications == null) | ||||
|           notifications = []; | ||||
|         notifications.addAll(_serviceRequestsPage); | ||||
|         if(_serviceRequestsPage.length == pageItemNumber){ | ||||
|           nextPage = true; | ||||
|         }else{ | ||||
|           nextPage = false; | ||||
|         } | ||||
|       } | ||||
|       isLoading = false; | ||||
|       notifyListeners(); | ||||
|       return response.statusCode; | ||||
|     } catch(error) { | ||||
|       isLoading = false; | ||||
|       stateCode = -1; | ||||
|       notifyListeners(); | ||||
|       return -1; | ||||
|     } | ||||
| 
 | ||||
|   } | ||||
| 
 | ||||
|   /// return -2 if request in progress | ||||
|   /// return -1 if error happen when sending request | ||||
|   /// return state code if request complete may be 200, 404 or 403 | ||||
|   /// for more details check http state manager | ||||
|   /// lib\controllers\http_status_manger\http_status_manger.dart | ||||
|   Future<List<AppNotification>> getRecentNotifications ({ | ||||
|     @required String host, | ||||
|     @required User user, | ||||
|   }) async { | ||||
|     Response response; | ||||
|     //userId = 397.toString(); // testing id to view data | ||||
| 
 | ||||
|     try{ | ||||
|       response = await get( | ||||
|           Uri.parse(host+URLs.getNotifications | ||||
|               +"?uid=${user.id}&token=${user.token}"), | ||||
|           headers: { | ||||
|             "Content-Type":"application/json; charset=utf-8" | ||||
|           } | ||||
|       ); | ||||
| 
 | ||||
|       stateCode = response.statusCode; | ||||
|       if(response.statusCode >= 200 && response.statusCode < 300) { | ||||
|         // client's request was successfully received | ||||
|         List requestsListJson = json.decode(utf8.decode(response.bodyBytes)); | ||||
|         List<AppNotification> _recentNotifications = requestsListJson.map( | ||||
|                 (request) => AppNotification.fromJson(request)).toList(); | ||||
|         return _recentNotifications; | ||||
|       } | ||||
|       return null; | ||||
| 
 | ||||
|     } catch(error) { | ||||
|       return null; | ||||
|     } | ||||
| 
 | ||||
|   } | ||||
| } | ||||