diff --git a/sigap-mobile/.env b/sigap-mobile/.env index ebb1c48..46e136c 100644 --- a/sigap-mobile/.env +++ b/sigap-mobile/.env @@ -35,7 +35,7 @@ SEND_EMAIL_HOOK_SECRET="jeroAB/CXdS721OiHV0Ac0yRcxO7eNihgjblH62xMhLBNc6OwK3DQnkb DENO_ENV=development -MAPBOX_ACCESS_TOKEN="pk.eyJ1IjoidmVyZ2lsZ29vZDEiLCJhIjoiY205b254eGltMGJ5dzJqb2F4cGpsZXlpNSJ9.zxmnSQxuc5NBwiFpsTGJCg" -MAPBOX_TILESET_ID="vergilgood1.cm9x176pl09k11ope7hzkij0r-06afz" +MAPBOX_ACCESS_TOKEN=pk.eyJ1IjoidmVyZ2lsZ29vZDEiLCJhIjoiY205b254eGltMGJ5dzJqb2F4cGpsZXlpNSJ9.zxmnSQxuc5NBwiFpsTGJCg +MAPBOX_TILESET_ID=vergilgood1.cm9x176pl09k11ope7hzkij0r-06afz NODE_ENV=development diff --git a/sigap-mobile/.vscode/settings.json b/sigap-mobile/.vscode/settings.json index f49799b..4afc3b0 100644 --- a/sigap-mobile/.vscode/settings.json +++ b/sigap-mobile/.vscode/settings.json @@ -21,5 +21,6 @@ "http", "net" ], - "files.autoSave": "afterDelay" + "files.autoSave": "afterDelay", + "java.configuration.updateBuildConfiguration": "interactive" } diff --git a/sigap-mobile/android/app/build.gradle.kts b/sigap-mobile/android/app/build.gradle.kts index ad2800e..d8d8deb 100644 --- a/sigap-mobile/android/app/build.gradle.kts +++ b/sigap-mobile/android/app/build.gradle.kts @@ -8,13 +8,38 @@ plugins { android { namespace = "com.backspacex.sigap" compileSdk = flutter.compileSdkVersion - ndkVersion = flutter.ndkVersion + ndkVersion = "27.0.12077973" compileOptions { + // Flag to enable support for the new language APIs + + // For AGP 4.1+ + isCoreLibraryDesugaringEnabled = true + // For AGP 4.0 + // coreLibraryDesugaringEnabled = true + + // Sets Java compatibility to Java 8 sourceCompatibility = JavaVersion.VERSION_11 targetCompatibility = JavaVersion.VERSION_11 } + dependencies { + // For AGP 7.4+ + coreLibraryDesugaring("com.android.tools:desugar_jdk_libs:2.1.5") + // For AGP 7.3 + // coreLibraryDesugaring("com.android.tools:desugar_jdk_libs:1.2.3") + // For AGP 4.0 to 7.2 + // coreLibraryDesugaring("com.android.tools:desugar_jdk_libs:1.1.9") + + // Material components for Android + implementation("com.google.android.material:material:1.14.0-alpha01") + + // AppCompat library + val appcompat_version = "1.7.0" + implementation("androidx.appcompat:appcompat:$appcompat_version") + implementation("androidx.appcompat:appcompat-resources:$appcompat_version") + } + kotlinOptions { jvmTarget = JavaVersion.VERSION_11.toString() } diff --git a/sigap-mobile/android/app/src/main/AndroidManifest.xml b/sigap-mobile/android/app/src/main/AndroidManifest.xml index 04a1e76..a7a76dd 100644 --- a/sigap-mobile/android/app/src/main/AndroidManifest.xml +++ b/sigap-mobile/android/app/src/main/AndroidManifest.xml @@ -6,7 +6,7 @@ - + + - - - - + + + + + + + + + diff --git a/sigap-mobile/android/app/src/main/res/drawable-xhdpi/android12splash.png b/sigap-mobile/android/app/src/main/res/drawable-xhdpi/android12splash.png new file mode 100644 index 0000000..c3094ac Binary files /dev/null and b/sigap-mobile/android/app/src/main/res/drawable-xhdpi/android12splash.png differ diff --git a/sigap-mobile/android/app/src/main/res/drawable-xhdpi/branding.png b/sigap-mobile/android/app/src/main/res/drawable-xhdpi/branding.png new file mode 100644 index 0000000..c3094ac Binary files /dev/null and b/sigap-mobile/android/app/src/main/res/drawable-xhdpi/branding.png differ diff --git a/sigap-mobile/android/app/src/main/res/drawable-xhdpi/splash.png b/sigap-mobile/android/app/src/main/res/drawable-xhdpi/splash.png new file mode 100644 index 0000000..c3094ac Binary files /dev/null and b/sigap-mobile/android/app/src/main/res/drawable-xhdpi/splash.png differ diff --git a/sigap-mobile/android/app/src/main/res/drawable-xxhdpi/android12splash.png b/sigap-mobile/android/app/src/main/res/drawable-xxhdpi/android12splash.png new file mode 100644 index 0000000..406593f Binary files /dev/null and b/sigap-mobile/android/app/src/main/res/drawable-xxhdpi/android12splash.png differ diff --git a/sigap-mobile/android/app/src/main/res/drawable-xxhdpi/branding.png b/sigap-mobile/android/app/src/main/res/drawable-xxhdpi/branding.png new file mode 100644 index 0000000..406593f Binary files /dev/null and b/sigap-mobile/android/app/src/main/res/drawable-xxhdpi/branding.png differ diff --git a/sigap-mobile/android/app/src/main/res/drawable-xxhdpi/splash.png b/sigap-mobile/android/app/src/main/res/drawable-xxhdpi/splash.png new file mode 100644 index 0000000..406593f Binary files /dev/null and b/sigap-mobile/android/app/src/main/res/drawable-xxhdpi/splash.png differ diff --git a/sigap-mobile/android/app/src/main/res/drawable-xxxhdpi/android12splash.png b/sigap-mobile/android/app/src/main/res/drawable-xxxhdpi/android12splash.png new file mode 100644 index 0000000..9bd0de2 Binary files /dev/null and b/sigap-mobile/android/app/src/main/res/drawable-xxxhdpi/android12splash.png differ diff --git a/sigap-mobile/android/app/src/main/res/drawable-xxxhdpi/branding.png b/sigap-mobile/android/app/src/main/res/drawable-xxxhdpi/branding.png new file mode 100644 index 0000000..9bd0de2 Binary files /dev/null and b/sigap-mobile/android/app/src/main/res/drawable-xxxhdpi/branding.png differ diff --git a/sigap-mobile/android/app/src/main/res/drawable-xxxhdpi/splash.png b/sigap-mobile/android/app/src/main/res/drawable-xxxhdpi/splash.png new file mode 100644 index 0000000..9bd0de2 Binary files /dev/null and b/sigap-mobile/android/app/src/main/res/drawable-xxxhdpi/splash.png differ diff --git a/sigap-mobile/android/app/src/main/res/drawable/background.png b/sigap-mobile/android/app/src/main/res/drawable/background.png new file mode 100644 index 0000000..8e21404 Binary files /dev/null and b/sigap-mobile/android/app/src/main/res/drawable/background.png differ diff --git a/sigap-mobile/android/app/src/main/res/drawable/launch_background.xml b/sigap-mobile/android/app/src/main/res/drawable/launch_background.xml index 304732f..5367a88 100644 --- a/sigap-mobile/android/app/src/main/res/drawable/launch_background.xml +++ b/sigap-mobile/android/app/src/main/res/drawable/launch_background.xml @@ -1,12 +1,12 @@ - - - - - + + + + + + + + + diff --git a/sigap-mobile/android/app/src/main/res/values-night-v31/styles.xml b/sigap-mobile/android/app/src/main/res/values-night-v31/styles.xml new file mode 100644 index 0000000..a35c870 --- /dev/null +++ b/sigap-mobile/android/app/src/main/res/values-night-v31/styles.xml @@ -0,0 +1,22 @@ + + + + + + + diff --git a/sigap-mobile/android/app/src/main/res/values-night/styles.xml b/sigap-mobile/android/app/src/main/res/values-night/styles.xml index 06952be..dbc9ea9 100644 --- a/sigap-mobile/android/app/src/main/res/values-night/styles.xml +++ b/sigap-mobile/android/app/src/main/res/values-night/styles.xml @@ -5,6 +5,10 @@ @drawable/launch_background + false + false + false + shortEdges + + + + diff --git a/sigap-mobile/android/app/src/main/res/values/styles.xml b/sigap-mobile/android/app/src/main/res/values/styles.xml index efffa6c..e6cafe5 100644 --- a/sigap-mobile/android/app/src/main/res/values/styles.xml +++ b/sigap-mobile/android/app/src/main/res/values/styles.xml @@ -1,10 +1,12 @@ - - diff --git a/sigap-mobile/assets/images/animations/loader.json b/sigap-mobile/assets/images/animations/loader.json new file mode 100644 index 0000000..c30b930 --- /dev/null +++ b/sigap-mobile/assets/images/animations/loader.json @@ -0,0 +1 @@ +{"v":"4.6.9","fr":29.9700012207031,"ip":0,"op":45.0000018328876,"w":800,"h":600,"nm":"Loader","ddd":0,"assets":[{"id":"comp_0","layers":[{"ddd":0,"ind":1,"ty":4,"nm":"Shape Layer 1","ks":{"o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[49.206,49.9,0]},"a":{"a":0,"k":[0,0,0]},"s":{"a":0,"k":[100,100,100]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":1,"k":[{"i":{"x":[0,0],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0.167,0.167]},"n":["0_1_0p167_0p167","0_1_0p167_0p167"],"t":12,"s":[10,10],"e":[25,25]},{"i":{"x":[0.833,0.833],"y":[0.833,0.833]},"o":{"x":[0.167,0.167],"y":[0.167,0.167]},"n":["0p833_0p833_0p167_0p167","0p833_0p833_0p167_0p167"],"t":22,"s":[25,25],"e":[25,25]},{"i":{"x":[0,0],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0.167,0.167]},"n":["0_1_0p167_0p167","0_1_0p167_0p167"],"t":37,"s":[25,25],"e":[10,10]},{"t":47.0000019143492}]},"p":{"a":0,"k":[75,-75]},"r":{"a":0,"k":0},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect"},{"ty":"fl","c":{"a":0,"k":[0.105882,0.105882,0.105882,1]},"o":{"a":0,"k":100},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill"},{"ty":"tr","p":{"a":0,"k":[-36.706,37.6],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Rectangle 16","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group"},{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":1,"k":[{"i":{"x":[0,0],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0.167,0.167]},"n":["0_1_0p167_0p167","0_1_0p167_0p167"],"t":10,"s":[10,10],"e":[25,25]},{"i":{"x":[0.833,0.833],"y":[0.833,0.833]},"o":{"x":[0.167,0.167],"y":[0.167,0.167]},"n":["0p833_0p833_0p167_0p167","0p833_0p833_0p167_0p167"],"t":20,"s":[25,25],"e":[25,25]},{"i":{"x":[0,0],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0.167,0.167]},"n":["0_1_0p167_0p167","0_1_0p167_0p167"],"t":35,"s":[25,25],"e":[10,10]},{"t":45.0000018328876}]},"p":{"a":0,"k":[50,-75]},"r":{"a":0,"k":0},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect"},{"ty":"fl","c":{"a":0,"k":[0.105882,0.105882,0.105882,1]},"o":{"a":0,"k":100},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill"},{"ty":"tr","p":{"a":0,"k":[-36.706,37.6],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Rectangle 15","np":3,"cix":2,"ix":2,"mn":"ADBE Vector Group"},{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":1,"k":[{"i":{"x":[0,0],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0.167,0.167]},"n":["0_1_0p167_0p167","0_1_0p167_0p167"],"t":8,"s":[10,10],"e":[25,25]},{"i":{"x":[0.833,0.833],"y":[0.833,0.833]},"o":{"x":[0.167,0.167],"y":[0.167,0.167]},"n":["0p833_0p833_0p167_0p167","0p833_0p833_0p167_0p167"],"t":18,"s":[25,25],"e":[25,25]},{"i":{"x":[0,0],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0.167,0.167]},"n":["0_1_0p167_0p167","0_1_0p167_0p167"],"t":33,"s":[25,25],"e":[10,10]},{"t":43.0000017514259}]},"p":{"a":0,"k":[25,-75]},"r":{"a":0,"k":0},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect"},{"ty":"fl","c":{"a":0,"k":[0.105882,0.105882,0.105882,1]},"o":{"a":0,"k":100},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill"},{"ty":"tr","p":{"a":0,"k":[-36.706,37.6],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Rectangle 14","np":3,"cix":2,"ix":3,"mn":"ADBE Vector Group"},{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":1,"k":[{"i":{"x":[0,0],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0.167,0.167]},"n":["0_1_0p167_0p167","0_1_0p167_0p167"],"t":6,"s":[10,10],"e":[25,25]},{"i":{"x":[0.833,0.833],"y":[0.833,0.833]},"o":{"x":[0.167,0.167],"y":[0.167,0.167]},"n":["0p833_0p833_0p167_0p167","0p833_0p833_0p167_0p167"],"t":16,"s":[25,25],"e":[25,25]},{"i":{"x":[0,0],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0.167,0.167]},"n":["0_1_0p167_0p167","0_1_0p167_0p167"],"t":31,"s":[25,25],"e":[10,10]},{"t":41.0000016699642}]},"p":{"a":0,"k":[0,-75]},"r":{"a":0,"k":0},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect"},{"ty":"fl","c":{"a":0,"k":[0.105882,0.105882,0.105882,1]},"o":{"a":0,"k":100},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill"},{"ty":"tr","p":{"a":0,"k":[-36.706,37.6],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Rectangle 13","np":3,"cix":2,"ix":4,"mn":"ADBE Vector Group"},{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":1,"k":[{"i":{"x":[0,0],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0.167,0.167]},"n":["0_1_0p167_0p167","0_1_0p167_0p167"],"t":10,"s":[10,10],"e":[25,25]},{"i":{"x":[0.833,0.833],"y":[0.833,0.833]},"o":{"x":[0.167,0.167],"y":[0.167,0.167]},"n":["0p833_0p833_0p167_0p167","0p833_0p833_0p167_0p167"],"t":20,"s":[25,25],"e":[25,25]},{"i":{"x":[0,0],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0.167,0.167]},"n":["0_1_0p167_0p167","0_1_0p167_0p167"],"t":35,"s":[25,25],"e":[10,10]},{"t":45.0000018328876}]},"p":{"a":0,"k":[75,-50]},"r":{"a":0,"k":0},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect"},{"ty":"fl","c":{"a":0,"k":[0.105882,0.105882,0.105882,1]},"o":{"a":0,"k":100},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill"},{"ty":"tr","p":{"a":0,"k":[-36.706,37.6],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Rectangle 12","np":3,"cix":2,"ix":5,"mn":"ADBE Vector Group"},{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":1,"k":[{"i":{"x":[0,0],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0.167,0.167]},"n":["0_1_0p167_0p167","0_1_0p167_0p167"],"t":8,"s":[10,10],"e":[25,25]},{"i":{"x":[0.833,0.833],"y":[0.833,0.833]},"o":{"x":[0.167,0.167],"y":[0.167,0.167]},"n":["0p833_0p833_0p167_0p167","0p833_0p833_0p167_0p167"],"t":18,"s":[25,25],"e":[25,25]},{"i":{"x":[0,0],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0.167,0.167]},"n":["0_1_0p167_0p167","0_1_0p167_0p167"],"t":33,"s":[25,25],"e":[10,10]},{"t":43.0000017514259}]},"p":{"a":0,"k":[50,-50]},"r":{"a":0,"k":0},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect"},{"ty":"fl","c":{"a":0,"k":[0.105882,0.105882,0.105882,1]},"o":{"a":0,"k":100},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill"},{"ty":"tr","p":{"a":0,"k":[-36.706,37.6],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Rectangle 11","np":3,"cix":2,"ix":6,"mn":"ADBE Vector Group"},{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":1,"k":[{"i":{"x":[0,0],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0.167,0.167]},"n":["0_1_0p167_0p167","0_1_0p167_0p167"],"t":6,"s":[10,10],"e":[25,25]},{"i":{"x":[0.833,0.833],"y":[0.833,0.833]},"o":{"x":[0.167,0.167],"y":[0.167,0.167]},"n":["0p833_0p833_0p167_0p167","0p833_0p833_0p167_0p167"],"t":16,"s":[25,25],"e":[25,25]},{"i":{"x":[0,0],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0.167,0.167]},"n":["0_1_0p167_0p167","0_1_0p167_0p167"],"t":31,"s":[25,25],"e":[10,10]},{"t":41.0000016699642}]},"p":{"a":0,"k":[25,-50]},"r":{"a":0,"k":0},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect"},{"ty":"fl","c":{"a":0,"k":[0.105882,0.105882,0.105882,1]},"o":{"a":0,"k":100},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill"},{"ty":"tr","p":{"a":0,"k":[-36.706,37.6],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Rectangle 10","np":3,"cix":2,"ix":7,"mn":"ADBE Vector Group"},{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":1,"k":[{"i":{"x":[0,0],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0.167,0.167]},"n":["0_1_0p167_0p167","0_1_0p167_0p167"],"t":4,"s":[10,10],"e":[25,25]},{"i":{"x":[0.833,0.833],"y":[0.833,0.833]},"o":{"x":[0.167,0.167],"y":[0.167,0.167]},"n":["0p833_0p833_0p167_0p167","0p833_0p833_0p167_0p167"],"t":14,"s":[25,25],"e":[25,25]},{"i":{"x":[0,0],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0.167,0.167]},"n":["0_1_0p167_0p167","0_1_0p167_0p167"],"t":29,"s":[25,25],"e":[10,10]},{"t":39.0000015885026}]},"p":{"a":0,"k":[0,-50]},"r":{"a":0,"k":0},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect"},{"ty":"fl","c":{"a":0,"k":[0.105882,0.105882,0.105882,1]},"o":{"a":0,"k":100},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill"},{"ty":"tr","p":{"a":0,"k":[-36.706,37.6],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Rectangle 9","np":3,"cix":2,"ix":8,"mn":"ADBE Vector Group"},{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":1,"k":[{"i":{"x":[0,0],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0.167,0.167]},"n":["0_1_0p167_0p167","0_1_0p167_0p167"],"t":8,"s":[10,10],"e":[25,25]},{"i":{"x":[0.833,0.833],"y":[0.833,0.833]},"o":{"x":[0.167,0.167],"y":[0.167,0.167]},"n":["0p833_0p833_0p167_0p167","0p833_0p833_0p167_0p167"],"t":18,"s":[25,25],"e":[25,25]},{"i":{"x":[0,0],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0.167,0.167]},"n":["0_1_0p167_0p167","0_1_0p167_0p167"],"t":33,"s":[25,25],"e":[10,10]},{"t":43.0000017514259}]},"p":{"a":0,"k":[75,-25]},"r":{"a":0,"k":0},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect"},{"ty":"fl","c":{"a":0,"k":[0.105882,0.105882,0.105882,1]},"o":{"a":0,"k":100},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill"},{"ty":"tr","p":{"a":0,"k":[-36.706,37.6],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Rectangle 8","np":3,"cix":2,"ix":9,"mn":"ADBE Vector Group"},{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":1,"k":[{"i":{"x":[0,0],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0.167,0.167]},"n":["0_1_0p167_0p167","0_1_0p167_0p167"],"t":6,"s":[10,10],"e":[25,25]},{"i":{"x":[0.833,0.833],"y":[0.833,0.833]},"o":{"x":[0.167,0.167],"y":[0.167,0.167]},"n":["0p833_0p833_0p167_0p167","0p833_0p833_0p167_0p167"],"t":16,"s":[25,25],"e":[25,25]},{"i":{"x":[0,0],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0.167,0.167]},"n":["0_1_0p167_0p167","0_1_0p167_0p167"],"t":31,"s":[25,25],"e":[10,10]},{"t":41.0000016699642}]},"p":{"a":0,"k":[50,-25]},"r":{"a":0,"k":0},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect"},{"ty":"fl","c":{"a":0,"k":[0.105882,0.105882,0.105882,1]},"o":{"a":0,"k":100},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill"},{"ty":"tr","p":{"a":0,"k":[-36.706,37.6],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Rectangle 7","np":3,"cix":2,"ix":10,"mn":"ADBE Vector Group"},{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":1,"k":[{"i":{"x":[0,0],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0.167,0.167]},"n":["0_1_0p167_0p167","0_1_0p167_0p167"],"t":4,"s":[10,10],"e":[25,25]},{"i":{"x":[0.833,0.833],"y":[0.833,0.833]},"o":{"x":[0.167,0.167],"y":[0.167,0.167]},"n":["0p833_0p833_0p167_0p167","0p833_0p833_0p167_0p167"],"t":14,"s":[25,25],"e":[25,25]},{"i":{"x":[0,0],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0.167,0.167]},"n":["0_1_0p167_0p167","0_1_0p167_0p167"],"t":29,"s":[25,25],"e":[10,10]},{"t":39.0000015885026}]},"p":{"a":0,"k":[25,-25]},"r":{"a":0,"k":0},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect"},{"ty":"fl","c":{"a":0,"k":[0.105882,0.105882,0.105882,1]},"o":{"a":0,"k":100},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill"},{"ty":"tr","p":{"a":0,"k":[-36.706,37.6],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Rectangle 6","np":3,"cix":2,"ix":11,"mn":"ADBE Vector Group"},{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":1,"k":[{"i":{"x":[0,0],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0.167,0.167]},"n":["0_1_0p167_0p167","0_1_0p167_0p167"],"t":2,"s":[10,10],"e":[25,25]},{"i":{"x":[0.833,0.833],"y":[0.833,0.833]},"o":{"x":[0.167,0.167],"y":[0.167,0.167]},"n":["0p833_0p833_0p167_0p167","0p833_0p833_0p167_0p167"],"t":12,"s":[25,25],"e":[25,25]},{"i":{"x":[0,0],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0.167,0.167]},"n":["0_1_0p167_0p167","0_1_0p167_0p167"],"t":27,"s":[25,25],"e":[10,10]},{"t":37.0000015070409}]},"p":{"a":0,"k":[0,-25]},"r":{"a":0,"k":0},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect"},{"ty":"fl","c":{"a":0,"k":[0.105882,0.105882,0.105882,1]},"o":{"a":0,"k":100},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill"},{"ty":"tr","p":{"a":0,"k":[-36.706,37.6],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Rectangle 5","np":3,"cix":2,"ix":12,"mn":"ADBE Vector Group"},{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":1,"k":[{"i":{"x":[0,0],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0.167,0.167]},"n":["0_1_0p167_0p167","0_1_0p167_0p167"],"t":6,"s":[10,10],"e":[25,25]},{"i":{"x":[0.833,0.833],"y":[0.833,0.833]},"o":{"x":[0.167,0.167],"y":[0.167,0.167]},"n":["0p833_0p833_0p167_0p167","0p833_0p833_0p167_0p167"],"t":16,"s":[25,25],"e":[25,25]},{"i":{"x":[0,0],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0.167,0.167]},"n":["0_1_0p167_0p167","0_1_0p167_0p167"],"t":31,"s":[25,25],"e":[10,10]},{"t":41.0000016699642}]},"p":{"a":0,"k":[75,0]},"r":{"a":0,"k":0},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect"},{"ty":"fl","c":{"a":0,"k":[0.105882,0.105882,0.105882,1]},"o":{"a":0,"k":100},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill"},{"ty":"tr","p":{"a":0,"k":[-36.706,37.6],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Rectangle 4","np":3,"cix":2,"ix":13,"mn":"ADBE Vector Group"},{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":1,"k":[{"i":{"x":[0,0],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0.167,0.167]},"n":["0_1_0p167_0p167","0_1_0p167_0p167"],"t":4,"s":[10,10],"e":[25,25]},{"i":{"x":[0.833,0.833],"y":[0.833,0.833]},"o":{"x":[0.167,0.167],"y":[0.167,0.167]},"n":["0p833_0p833_0p167_0p167","0p833_0p833_0p167_0p167"],"t":14,"s":[25,25],"e":[25,25]},{"i":{"x":[0,0],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0.167,0.167]},"n":["0_1_0p167_0p167","0_1_0p167_0p167"],"t":29,"s":[25,25],"e":[10,10]},{"t":39.0000015885026}]},"p":{"a":0,"k":[50,0]},"r":{"a":0,"k":0},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect"},{"ty":"fl","c":{"a":0,"k":[0.105882,0.105882,0.105882,1]},"o":{"a":0,"k":100},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill"},{"ty":"tr","p":{"a":0,"k":[-36.706,37.6],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Rectangle 3","np":3,"cix":2,"ix":14,"mn":"ADBE Vector Group"},{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":1,"k":[{"i":{"x":[0,0],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0.167,0.167]},"n":["0_1_0p167_0p167","0_1_0p167_0p167"],"t":2,"s":[10,10],"e":[25,25]},{"i":{"x":[0.833,0.833],"y":[0.833,0.833]},"o":{"x":[0.167,0.167],"y":[0.167,0.167]},"n":["0p833_0p833_0p167_0p167","0p833_0p833_0p167_0p167"],"t":12,"s":[25,25],"e":[25,25]},{"i":{"x":[0,0],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0.167,0.167]},"n":["0_1_0p167_0p167","0_1_0p167_0p167"],"t":27,"s":[25,25],"e":[10,10]},{"t":37.0000015070409}]},"p":{"a":0,"k":[25,0]},"r":{"a":0,"k":0},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect"},{"ty":"fl","c":{"a":0,"k":[0.105882,0.105882,0.105882,1]},"o":{"a":0,"k":100},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill"},{"ty":"tr","p":{"a":0,"k":[-36.706,37.6],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Rectangle 2","np":3,"cix":2,"ix":15,"mn":"ADBE Vector Group"},{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":1,"k":[{"i":{"x":[0,0],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0.167,0.167]},"n":["0_1_0p167_0p167","0_1_0p167_0p167"],"t":0,"s":[10,10],"e":[25,25]},{"i":{"x":[0.833,0.833],"y":[0.833,0.833]},"o":{"x":[0.167,0.167],"y":[0.167,0.167]},"n":["0p833_0p833_0p167_0p167","0p833_0p833_0p167_0p167"],"t":10,"s":[25,25],"e":[25,25]},{"i":{"x":[0,0],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0.167,0.167]},"n":["0_1_0p167_0p167","0_1_0p167_0p167"],"t":25,"s":[25,25],"e":[10,10]},{"t":35.0000014255792}]},"p":{"a":0,"k":[0,0]},"r":{"a":0,"k":0},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect"},{"ty":"fl","c":{"a":0,"k":[0.105882,0.105882,0.105882,1]},"o":{"a":0,"k":100},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill"},{"ty":"tr","p":{"a":0,"k":[-36.706,37.6],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Rectangle 1","np":3,"cix":2,"ix":16,"mn":"ADBE Vector Group"}],"ip":0,"op":300.00001221925,"st":0,"bm":0,"sr":1}]}],"layers":[{"ddd":0,"ind":6,"ty":0,"nm":"Loader 2","refId":"comp_0","ks":{"o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[400,300,0]},"a":{"a":0,"k":[50,50,0]},"s":{"a":0,"k":[100,100,100]}},"ao":0,"w":100,"h":100,"ip":0,"op":90.0000036657751,"st":0,"bm":0,"sr":1}]} \ No newline at end of file diff --git a/sigap-mobile/assets/images/animations/splash-dark.json b/sigap-mobile/assets/images/animations/splash-dark.json new file mode 100644 index 0000000..25958bf --- /dev/null +++ b/sigap-mobile/assets/images/animations/splash-dark.json @@ -0,0 +1 @@ +{"assets":[{"id":"6","layers":[{"ind":5,"ty":4,"ks":{},"ip":0,"op":181,"st":0,"shapes":[{"ty":"rc","p":{"a":0,"k":[25,25]},"r":{"a":0,"k":0},"s":{"a":0,"k":[50,50]}},{"ty":"fl","c":{"a":0,"k":[0,0,0,0]},"o":{"a":0,"k":0}}]},{"ind":0,"ty":4,"ks":{"s":{"a":0,"k":[133.33,133.33]}},"ip":0,"op":181,"st":0,"shapes":[{"ty":"gr","it":[{"ty":"gr","it":[{"ty":"sh","ks":{"a":0,"k":{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[19.21,9.38],[19.21,18.75],[27.32,23.44],[35.41,28.13],[35.41,18.75],[27.32,14.06],[27.32,4.69],[19.21,0]]}}},{"ty":"fl","c":{"a":0,"k":[0.11,0.11,0.12,1]},"r":2,"o":{"a":0,"k":100}},{"ty":"tr","o":{"a":0,"k":100}}]},{"ty":"gr","it":[{"ty":"gr","it":[{"ty":"sh","ks":{"a":0,"k":{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[11.11,23.44],[11.11,4.69],[3,9.38],[3,28.13],[11.11,32.81],[19.21,37.5],[27.32,32.81],[19.21,28.13]]}}},{"ty":"fl","c":{"a":0,"k":[0.11,0.11,0.12,1]},"r":2,"o":{"a":0,"k":100}},{"ty":"tr","o":{"a":0,"k":100}}]},{"ty":"tr","o":{"a":0,"k":100}}]},{"ty":"tr","o":{"a":0,"k":100}}]}]}]}],"fr":60,"h":400,"ip":0,"layers":[{"ind":8,"ty":0,"parent":4,"ks":{},"w":50,"h":50,"ip":0,"op":181,"st":0,"refId":"6"},{"ind":4,"ty":3,"parent":3,"ks":{"s":{"a":0,"k":[240,240]}},"ip":0,"op":181,"st":0},{"ind":3,"ty":3,"parent":2,"ks":{"a":{"a":0,"k":[60,60]},"p":{"a":0,"k":[120,120]},"s":{"a":1,"k":[{"t":0,"s":[0,0],"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"t":6,"s":[0,0],"i":{"x":[0.25,0.25],"y":[1,1]},"o":{"x":[0.25,0.25],"y":[0.1,0.1]}},{"t":30,"s":[100,100],"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"t":180,"s":[100,100],"h":1}]}},"ip":0,"op":181,"st":0},{"ind":10,"ty":4,"parent":9,"ks":{},"ip":0,"op":181,"st":0,"shapes":[{"ty":"el","p":{"a":0,"k":[120,120]},"s":{"a":0,"k":[240,240]}},{"ty":"fl","c":{"a":0,"k":[1,1,1]},"o":{"a":0,"k":100}}]},{"ind":9,"ty":3,"parent":2,"ks":{},"ip":0,"op":181,"st":0},{"ind":2,"ty":3,"parent":1,"ks":{"a":{"a":0,"k":[120,120]},"p":{"a":0,"k":[200,200]},"s":{"a":1,"k":[{"t":0,"s":[0,0],"i":{"x":[0.25,0.25],"y":[1,1]},"o":{"x":[0.25,0.25],"y":[0.1,0.1]}},{"t":24,"s":[100,100],"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"t":156,"s":[100,100],"i":{"x":[0.667,0.667],"y":[0.001,0.001]},"o":{"x":[0.334,0.334],"y":[0,0]}},{"t":180,"s":[0,0],"h":1}]}},"ip":0,"op":181,"st":0},{"ind":1,"ty":3,"parent":0,"ks":{},"ip":0,"op":181,"st":0},{"ind":0,"ty":3,"ks":{},"ip":0,"op":181,"st":0}],"meta":{"g":"https://jitter.video"},"op":180,"v":"5.7.4","w":400} \ No newline at end of file diff --git a/sigap-mobile/assets/images/animations/splash-light.json b/sigap-mobile/assets/images/animations/splash-light.json new file mode 100644 index 0000000..99089fa --- /dev/null +++ b/sigap-mobile/assets/images/animations/splash-light.json @@ -0,0 +1 @@ +{"assets":[{"id":"6","layers":[{"ind":5,"ty":4,"ks":{},"ip":0,"op":181,"st":0,"shapes":[{"ty":"rc","p":{"a":0,"k":[25,25]},"r":{"a":0,"k":0},"s":{"a":0,"k":[50,50]}},{"ty":"fl","c":{"a":0,"k":[0,0,0,0]},"o":{"a":0,"k":0}}]},{"ind":0,"ty":4,"ks":{"s":{"a":0,"k":[133.33,133.33]}},"ip":0,"op":181,"st":0,"shapes":[{"ty":"gr","it":[{"ty":"gr","it":[{"ty":"sh","ks":{"a":0,"k":{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[19.21,9.38],[19.21,18.75],[27.32,23.44],[35.41,28.13],[35.41,18.75],[27.32,14.06],[27.32,4.69],[19.21,0]]}}},{"ty":"fl","c":{"a":0,"k":[1,1,1,1]},"r":2,"o":{"a":0,"k":100}},{"ty":"tr","o":{"a":0,"k":100}}]},{"ty":"gr","it":[{"ty":"gr","it":[{"ty":"sh","ks":{"a":0,"k":{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[11.11,23.44],[11.11,4.69],[3,9.38],[3,28.13],[11.11,32.81],[19.21,37.5],[27.32,32.81],[19.21,28.13]]}}},{"ty":"fl","c":{"a":0,"k":[1,1,1,1]},"r":2,"o":{"a":0,"k":100}},{"ty":"tr","o":{"a":0,"k":100}}]},{"ty":"tr","o":{"a":0,"k":100}}]},{"ty":"tr","o":{"a":0,"k":100}}]}]}]}],"fr":60,"h":400,"ip":0,"layers":[{"ind":8,"ty":0,"parent":4,"ks":{},"w":50,"h":50,"ip":0,"op":181,"st":0,"refId":"6"},{"ind":4,"ty":3,"parent":3,"ks":{"s":{"a":0,"k":[240,240]}},"ip":0,"op":181,"st":0},{"ind":3,"ty":3,"parent":2,"ks":{"a":{"a":0,"k":[60,60]},"p":{"a":0,"k":[120,120]},"s":{"a":1,"k":[{"t":0,"s":[0,0],"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"t":6,"s":[0,0],"i":{"x":[0.25,0.25],"y":[1,1]},"o":{"x":[0.25,0.25],"y":[0.1,0.1]}},{"t":30,"s":[100,100],"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"t":180,"s":[100,100],"h":1}]}},"ip":0,"op":181,"st":0},{"ind":10,"ty":4,"parent":9,"ks":{},"ip":0,"op":181,"st":0,"shapes":[{"ty":"el","p":{"a":0,"k":[120,120]},"s":{"a":0,"k":[240,240]}},{"ty":"fl","c":{"a":0,"k":[0.114,0.114,0.122]},"o":{"a":0,"k":100}}]},{"ind":9,"ty":3,"parent":2,"ks":{},"ip":0,"op":181,"st":0},{"ind":2,"ty":3,"parent":1,"ks":{"a":{"a":0,"k":[120,120]},"p":{"a":0,"k":[200,200]},"s":{"a":1,"k":[{"t":0,"s":[0,0],"i":{"x":[0.25,0.25],"y":[1,1]},"o":{"x":[0.25,0.25],"y":[0.1,0.1]}},{"t":24,"s":[100,100],"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"t":156,"s":[100,100],"i":{"x":[0.667,0.667],"y":[0.001,0.001]},"o":{"x":[0.334,0.334],"y":[0,0]}},{"t":180,"s":[0,0],"h":1}]}},"ip":0,"op":181,"st":0},{"ind":1,"ty":3,"parent":0,"ks":{},"ip":0,"op":181,"st":0},{"ind":0,"ty":3,"ks":{},"ip":0,"op":181,"st":0}],"meta":{"g":"https://jitter.video"},"op":180,"v":"5.7.4","w":400} \ No newline at end of file diff --git a/sigap-mobile/assets/images/content/backpacking-dark.svg b/sigap-mobile/assets/images/content/backpacking-dark.svg new file mode 100644 index 0000000..83d248d --- /dev/null +++ b/sigap-mobile/assets/images/content/backpacking-dark.svg @@ -0,0 +1,175 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/sigap-mobile/assets/images/content/backpacking.svg b/sigap-mobile/assets/images/content/backpacking.svg new file mode 100644 index 0000000..ff1c5ce --- /dev/null +++ b/sigap-mobile/assets/images/content/backpacking.svg @@ -0,0 +1,170 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/sigap-mobile/assets/images/content/calling-help-dark.svg b/sigap-mobile/assets/images/content/calling-help-dark.svg new file mode 100644 index 0000000..053e55f --- /dev/null +++ b/sigap-mobile/assets/images/content/calling-help-dark.svg @@ -0,0 +1,123 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/sigap-mobile/assets/images/content/calling-help.svg b/sigap-mobile/assets/images/content/calling-help.svg new file mode 100644 index 0000000..561a1a6 --- /dev/null +++ b/sigap-mobile/assets/images/content/calling-help.svg @@ -0,0 +1,118 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/sigap-mobile/assets/images/content/communication-dark.svg b/sigap-mobile/assets/images/content/communication-dark.svg new file mode 100644 index 0000000..22ebd2e --- /dev/null +++ b/sigap-mobile/assets/images/content/communication-dark.svg @@ -0,0 +1,156 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/sigap-mobile/assets/images/content/communication.svg b/sigap-mobile/assets/images/content/communication.svg new file mode 100644 index 0000000..769f358 --- /dev/null +++ b/sigap-mobile/assets/images/content/communication.svg @@ -0,0 +1,151 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/sigap-mobile/assets/images/content/crashed-error-dark.svg b/sigap-mobile/assets/images/content/crashed-error-dark.svg new file mode 100644 index 0000000..1eb653a --- /dev/null +++ b/sigap-mobile/assets/images/content/crashed-error-dark.svg @@ -0,0 +1,159 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/sigap-mobile/assets/images/content/crashed-error.svg b/sigap-mobile/assets/images/content/crashed-error.svg new file mode 100644 index 0000000..a8f408b --- /dev/null +++ b/sigap-mobile/assets/images/content/crashed-error.svg @@ -0,0 +1,154 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/sigap-mobile/assets/images/content/customer-support-dark.svg b/sigap-mobile/assets/images/content/customer-support-dark.svg new file mode 100644 index 0000000..88697a2 --- /dev/null +++ b/sigap-mobile/assets/images/content/customer-support-dark.svg @@ -0,0 +1,101 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/sigap-mobile/assets/images/content/customer-support.svg b/sigap-mobile/assets/images/content/customer-support.svg new file mode 100644 index 0000000..a6dd664 --- /dev/null +++ b/sigap-mobile/assets/images/content/customer-support.svg @@ -0,0 +1,96 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/sigap-mobile/assets/images/content/falling-dark.svg b/sigap-mobile/assets/images/content/falling-dark.svg new file mode 100644 index 0000000..780b73b --- /dev/null +++ b/sigap-mobile/assets/images/content/falling-dark.svg @@ -0,0 +1,128 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/sigap-mobile/assets/images/content/falling.svg b/sigap-mobile/assets/images/content/falling.svg new file mode 100644 index 0000000..1ed6b62 --- /dev/null +++ b/sigap-mobile/assets/images/content/falling.svg @@ -0,0 +1,128 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/sigap-mobile/assets/images/content/hitchhiking-dark.svg b/sigap-mobile/assets/images/content/hitchhiking-dark.svg new file mode 100644 index 0000000..d1c200b --- /dev/null +++ b/sigap-mobile/assets/images/content/hitchhiking-dark.svg @@ -0,0 +1,111 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/sigap-mobile/assets/images/content/hitchhiking.svg b/sigap-mobile/assets/images/content/hitchhiking.svg new file mode 100644 index 0000000..a95297a --- /dev/null +++ b/sigap-mobile/assets/images/content/hitchhiking.svg @@ -0,0 +1,111 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/sigap-mobile/assets/images/content/home-office-dark.svg b/sigap-mobile/assets/images/content/home-office-dark.svg new file mode 100644 index 0000000..22b95bb --- /dev/null +++ b/sigap-mobile/assets/images/content/home-office-dark.svg @@ -0,0 +1,152 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/sigap-mobile/assets/images/content/home-office.svg b/sigap-mobile/assets/images/content/home-office.svg new file mode 100644 index 0000000..f6932c1 --- /dev/null +++ b/sigap-mobile/assets/images/content/home-office.svg @@ -0,0 +1,154 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/sigap-mobile/assets/images/content/looking-at-the-map-dark.svg b/sigap-mobile/assets/images/content/looking-at-the-map-dark.svg new file mode 100644 index 0000000..66930b1 --- /dev/null +++ b/sigap-mobile/assets/images/content/looking-at-the-map-dark.svg @@ -0,0 +1,97 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/sigap-mobile/assets/images/content/looking-at-the-map.svg b/sigap-mobile/assets/images/content/looking-at-the-map.svg new file mode 100644 index 0000000..8ba2022 --- /dev/null +++ b/sigap-mobile/assets/images/content/looking-at-the-map.svg @@ -0,0 +1,92 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/sigap-mobile/assets/images/content/online-dating-dark.svg b/sigap-mobile/assets/images/content/online-dating-dark.svg new file mode 100644 index 0000000..8200785 --- /dev/null +++ b/sigap-mobile/assets/images/content/online-dating-dark.svg @@ -0,0 +1,78 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/sigap-mobile/assets/images/content/online-dating.svg b/sigap-mobile/assets/images/content/online-dating.svg new file mode 100644 index 0000000..1b313c0 --- /dev/null +++ b/sigap-mobile/assets/images/content/online-dating.svg @@ -0,0 +1,80 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/sigap-mobile/assets/images/content/paper-plane-dark.svg b/sigap-mobile/assets/images/content/paper-plane-dark.svg new file mode 100644 index 0000000..4eb834b --- /dev/null +++ b/sigap-mobile/assets/images/content/paper-plane-dark.svg @@ -0,0 +1,157 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/sigap-mobile/assets/images/content/paper-plane.svg b/sigap-mobile/assets/images/content/paper-plane.svg new file mode 100644 index 0000000..f9855a0 --- /dev/null +++ b/sigap-mobile/assets/images/content/paper-plane.svg @@ -0,0 +1,157 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/sigap-mobile/assets/images/content/question-mark-dark.svg b/sigap-mobile/assets/images/content/question-mark-dark.svg new file mode 100644 index 0000000..a959f50 --- /dev/null +++ b/sigap-mobile/assets/images/content/question-mark-dark.svg @@ -0,0 +1,93 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/sigap-mobile/assets/images/content/question-mark.svg b/sigap-mobile/assets/images/content/question-mark.svg new file mode 100644 index 0000000..6e10cf3 --- /dev/null +++ b/sigap-mobile/assets/images/content/question-mark.svg @@ -0,0 +1,95 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/sigap-mobile/assets/images/content/searching-location-on-the-phone-dark.svg b/sigap-mobile/assets/images/content/searching-location-on-the-phone-dark.svg new file mode 100644 index 0000000..824f941 --- /dev/null +++ b/sigap-mobile/assets/images/content/searching-location-on-the-phone-dark.svg @@ -0,0 +1,101 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/sigap-mobile/assets/images/content/searching-location-on-the-phone.svg b/sigap-mobile/assets/images/content/searching-location-on-the-phone.svg new file mode 100644 index 0000000..4569bd2 --- /dev/null +++ b/sigap-mobile/assets/images/content/searching-location-on-the-phone.svg @@ -0,0 +1,101 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/sigap-mobile/assets/images/content/telephone-call-dark.svg b/sigap-mobile/assets/images/content/telephone-call-dark.svg new file mode 100644 index 0000000..4b40104 --- /dev/null +++ b/sigap-mobile/assets/images/content/telephone-call-dark.svg @@ -0,0 +1,160 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/sigap-mobile/assets/images/content/telephone-call.svg b/sigap-mobile/assets/images/content/telephone-call.svg new file mode 100644 index 0000000..b2fc38f --- /dev/null +++ b/sigap-mobile/assets/images/content/telephone-call.svg @@ -0,0 +1,155 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/sigap-mobile/assets/images/content/traveling-with-a-suitcase-dark.svg b/sigap-mobile/assets/images/content/traveling-with-a-suitcase-dark.svg new file mode 100644 index 0000000..6459a5e --- /dev/null +++ b/sigap-mobile/assets/images/content/traveling-with-a-suitcase-dark.svg @@ -0,0 +1,135 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/sigap-mobile/assets/images/content/traveling-with-a-suitcase.svg b/sigap-mobile/assets/images/content/traveling-with-a-suitcase.svg new file mode 100644 index 0000000..c2e71f6 --- /dev/null +++ b/sigap-mobile/assets/images/content/traveling-with-a-suitcase.svg @@ -0,0 +1,130 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/sigap-mobile/assets/images/content/video-call-dark.svg b/sigap-mobile/assets/images/content/video-call-dark.svg new file mode 100644 index 0000000..6417d69 --- /dev/null +++ b/sigap-mobile/assets/images/content/video-call-dark.svg @@ -0,0 +1,128 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/sigap-mobile/assets/images/content/video-call.svg b/sigap-mobile/assets/images/content/video-call.svg new file mode 100644 index 0000000..79f7c9e --- /dev/null +++ b/sigap-mobile/assets/images/content/video-call.svg @@ -0,0 +1,130 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/sigap-mobile/assets/images/content/woman-hugging-earth-dark.svg b/sigap-mobile/assets/images/content/woman-hugging-earth-dark.svg new file mode 100644 index 0000000..3d2a2f3 --- /dev/null +++ b/sigap-mobile/assets/images/content/woman-hugging-earth-dark.svg @@ -0,0 +1,91 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/sigap-mobile/assets/images/content/woman-hugging-earth.svg b/sigap-mobile/assets/images/content/woman-hugging-earth.svg new file mode 100644 index 0000000..d0208f9 --- /dev/null +++ b/sigap-mobile/assets/images/content/woman-hugging-earth.svg @@ -0,0 +1,93 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/sigap-mobile/assets/images/content/woman-tourist-dark.svg b/sigap-mobile/assets/images/content/woman-tourist-dark.svg new file mode 100644 index 0000000..2e641a8 --- /dev/null +++ b/sigap-mobile/assets/images/content/woman-tourist-dark.svg @@ -0,0 +1,146 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/sigap-mobile/assets/images/content/woman-tourist.svg b/sigap-mobile/assets/images/content/woman-tourist.svg new file mode 100644 index 0000000..04843fb --- /dev/null +++ b/sigap-mobile/assets/images/content/woman-tourist.svg @@ -0,0 +1,141 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/sigap-mobile/assets/logos/logo-bg-dark.png b/sigap-mobile/assets/logos/logo-bg-dark.png new file mode 100644 index 0000000..91f25b5 Binary files /dev/null and b/sigap-mobile/assets/logos/logo-bg-dark.png differ diff --git a/sigap-mobile/assets/logos/logo-bg-dark.svg b/sigap-mobile/assets/logos/logo-bg-dark.svg new file mode 100644 index 0000000..4c0becd --- /dev/null +++ b/sigap-mobile/assets/logos/logo-bg-dark.svg @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + + + diff --git a/sigap-mobile/assets/logos/logo-bg-light.png b/sigap-mobile/assets/logos/logo-bg-light.png new file mode 100644 index 0000000..87eb83e Binary files /dev/null and b/sigap-mobile/assets/logos/logo-bg-light.png differ diff --git a/sigap-mobile/assets/logos/logo-bg-light.svg b/sigap-mobile/assets/logos/logo-bg-light.svg new file mode 100644 index 0000000..e62d21a --- /dev/null +++ b/sigap-mobile/assets/logos/logo-bg-light.svg @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/sigap-mobile/assets/logos/logo-dark.png b/sigap-mobile/assets/logos/logo-dark.png new file mode 100644 index 0000000..7e37ca3 Binary files /dev/null and b/sigap-mobile/assets/logos/logo-dark.png differ diff --git a/sigap-mobile/assets/logos/logo-dark.svg b/sigap-mobile/assets/logos/logo-dark.svg new file mode 100644 index 0000000..4b421c5 --- /dev/null +++ b/sigap-mobile/assets/logos/logo-dark.svg @@ -0,0 +1,4 @@ + + + + diff --git a/sigap-mobile/assets/logos/logo-light.png b/sigap-mobile/assets/logos/logo-light.png new file mode 100644 index 0000000..0ee065e Binary files /dev/null and b/sigap-mobile/assets/logos/logo-light.png differ diff --git a/sigap-mobile/assets/logos/logo-light.svg b/sigap-mobile/assets/logos/logo-light.svg new file mode 100644 index 0000000..5ee81ad --- /dev/null +++ b/sigap-mobile/assets/logos/logo-light.svg @@ -0,0 +1,4 @@ + + + + diff --git a/sigap-mobile/assets/logos/logo.png b/sigap-mobile/assets/logos/logo.png new file mode 100644 index 0000000..e686563 Binary files /dev/null and b/sigap-mobile/assets/logos/logo.png differ diff --git a/sigap-mobile/assets/logos/logo.svg b/sigap-mobile/assets/logos/logo.svg new file mode 100644 index 0000000..6d966da --- /dev/null +++ b/sigap-mobile/assets/logos/logo.svg @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/sigap-mobile/flutter_native_splash.yaml b/sigap-mobile/flutter_native_splash.yaml new file mode 100644 index 0000000..83c296b --- /dev/null +++ b/sigap-mobile/flutter_native_splash.yaml @@ -0,0 +1,15 @@ +flutter_native_splash: + color: "#ffffff" + image: assets/logos/logo-light.png + branding: assets/logos/logo-light.png + color_dark: "#121212" + image_dark: assets/logos/logo-dark.png + branding_dark: assets/logos/logo-dark.png + + android_12: + image: assets/logos/logo-light.png + icon_background_color: "#ffffff" + image_dark: assets/logos/logo-dark.png + icon_background_color_dark: "#121212" + + web: false diff --git a/sigap-mobile/ios/Runner/Assets.xcassets/BrandingImage.imageset/BrandingImage.png b/sigap-mobile/ios/Runner/Assets.xcassets/BrandingImage.imageset/BrandingImage.png new file mode 100644 index 0000000..1899490 Binary files /dev/null and b/sigap-mobile/ios/Runner/Assets.xcassets/BrandingImage.imageset/BrandingImage.png differ diff --git a/sigap-mobile/ios/Runner/Assets.xcassets/BrandingImage.imageset/BrandingImage@2x.png b/sigap-mobile/ios/Runner/Assets.xcassets/BrandingImage.imageset/BrandingImage@2x.png new file mode 100644 index 0000000..c3094ac Binary files /dev/null and b/sigap-mobile/ios/Runner/Assets.xcassets/BrandingImage.imageset/BrandingImage@2x.png differ diff --git a/sigap-mobile/ios/Runner/Assets.xcassets/BrandingImage.imageset/BrandingImage@3x.png b/sigap-mobile/ios/Runner/Assets.xcassets/BrandingImage.imageset/BrandingImage@3x.png new file mode 100644 index 0000000..406593f Binary files /dev/null and b/sigap-mobile/ios/Runner/Assets.xcassets/BrandingImage.imageset/BrandingImage@3x.png differ diff --git a/sigap-mobile/ios/Runner/Assets.xcassets/BrandingImage.imageset/BrandingImageDark.png b/sigap-mobile/ios/Runner/Assets.xcassets/BrandingImage.imageset/BrandingImageDark.png new file mode 100644 index 0000000..970899f Binary files /dev/null and b/sigap-mobile/ios/Runner/Assets.xcassets/BrandingImage.imageset/BrandingImageDark.png differ diff --git a/sigap-mobile/ios/Runner/Assets.xcassets/BrandingImage.imageset/BrandingImageDark@2x.png b/sigap-mobile/ios/Runner/Assets.xcassets/BrandingImage.imageset/BrandingImageDark@2x.png new file mode 100644 index 0000000..23b8228 Binary files /dev/null and b/sigap-mobile/ios/Runner/Assets.xcassets/BrandingImage.imageset/BrandingImageDark@2x.png differ diff --git a/sigap-mobile/ios/Runner/Assets.xcassets/BrandingImage.imageset/BrandingImageDark@3x.png b/sigap-mobile/ios/Runner/Assets.xcassets/BrandingImage.imageset/BrandingImageDark@3x.png new file mode 100644 index 0000000..fee2fa1 Binary files /dev/null and b/sigap-mobile/ios/Runner/Assets.xcassets/BrandingImage.imageset/BrandingImageDark@3x.png differ diff --git a/sigap-mobile/ios/Runner/Assets.xcassets/BrandingImage.imageset/Contents.json b/sigap-mobile/ios/Runner/Assets.xcassets/BrandingImage.imageset/Contents.json new file mode 100644 index 0000000..bdbce88 --- /dev/null +++ b/sigap-mobile/ios/Runner/Assets.xcassets/BrandingImage.imageset/Contents.json @@ -0,0 +1,56 @@ +{ + "images" : [ + { + "filename" : "BrandingImage.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "dark" + } + ], + "filename" : "BrandingImageDark.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "BrandingImage@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "dark" + } + ], + "filename" : "BrandingImageDark@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "BrandingImage@3x.png", + "idiom" : "universal", + "scale" : "3x" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "dark" + } + ], + "filename" : "BrandingImageDark@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/sigap-mobile/ios/Runner/Assets.xcassets/LaunchBackground.imageset/Contents.json b/sigap-mobile/ios/Runner/Assets.xcassets/LaunchBackground.imageset/Contents.json new file mode 100644 index 0000000..8bb185b --- /dev/null +++ b/sigap-mobile/ios/Runner/Assets.xcassets/LaunchBackground.imageset/Contents.json @@ -0,0 +1,22 @@ +{ + "images" : [ + { + "filename" : "background.png", + "idiom" : "universal" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "dark" + } + ], + "filename" : "darkbackground.png", + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/sigap-mobile/ios/Runner/Assets.xcassets/LaunchBackground.imageset/background.png b/sigap-mobile/ios/Runner/Assets.xcassets/LaunchBackground.imageset/background.png new file mode 100644 index 0000000..8e21404 Binary files /dev/null and b/sigap-mobile/ios/Runner/Assets.xcassets/LaunchBackground.imageset/background.png differ diff --git a/sigap-mobile/ios/Runner/Assets.xcassets/LaunchBackground.imageset/darkbackground.png b/sigap-mobile/ios/Runner/Assets.xcassets/LaunchBackground.imageset/darkbackground.png new file mode 100644 index 0000000..75b99f0 Binary files /dev/null and b/sigap-mobile/ios/Runner/Assets.xcassets/LaunchBackground.imageset/darkbackground.png differ diff --git a/sigap-mobile/ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json b/sigap-mobile/ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json index 0bedcf2..f3387d4 100644 --- a/sigap-mobile/ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json +++ b/sigap-mobile/ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json @@ -1,23 +1,56 @@ { "images" : [ { - "idiom" : "universal", "filename" : "LaunchImage.png", + "idiom" : "universal", "scale" : "1x" }, { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "dark" + } + ], + "filename" : "LaunchImageDark.png", "idiom" : "universal", + "scale" : "1x" + }, + { "filename" : "LaunchImage@2x.png", + "idiom" : "universal", "scale" : "2x" }, { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "dark" + } + ], + "filename" : "LaunchImageDark@2x.png", "idiom" : "universal", + "scale" : "2x" + }, + { "filename" : "LaunchImage@3x.png", + "idiom" : "universal", + "scale" : "3x" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "dark" + } + ], + "filename" : "LaunchImageDark@3x.png", + "idiom" : "universal", "scale" : "3x" } ], "info" : { - "version" : 1, - "author" : "xcode" + "author" : "xcode", + "version" : 1 } } diff --git a/sigap-mobile/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png b/sigap-mobile/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png index 9da19ea..1899490 100644 Binary files a/sigap-mobile/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png and b/sigap-mobile/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png differ diff --git a/sigap-mobile/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png b/sigap-mobile/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png index 9da19ea..c3094ac 100644 Binary files a/sigap-mobile/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png and b/sigap-mobile/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png differ diff --git a/sigap-mobile/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png b/sigap-mobile/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png index 9da19ea..406593f 100644 Binary files a/sigap-mobile/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png and b/sigap-mobile/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png differ diff --git a/sigap-mobile/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImageDark.png b/sigap-mobile/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImageDark.png new file mode 100644 index 0000000..970899f Binary files /dev/null and b/sigap-mobile/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImageDark.png differ diff --git a/sigap-mobile/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImageDark@2x.png b/sigap-mobile/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImageDark@2x.png new file mode 100644 index 0000000..23b8228 Binary files /dev/null and b/sigap-mobile/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImageDark@2x.png differ diff --git a/sigap-mobile/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImageDark@3x.png b/sigap-mobile/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImageDark@3x.png new file mode 100644 index 0000000..fee2fa1 Binary files /dev/null and b/sigap-mobile/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImageDark@3x.png differ diff --git a/sigap-mobile/ios/Runner/Base.lproj/LaunchScreen.storyboard b/sigap-mobile/ios/Runner/Base.lproj/LaunchScreen.storyboard index f2e259c..7c020dc 100644 --- a/sigap-mobile/ios/Runner/Base.lproj/LaunchScreen.storyboard +++ b/sigap-mobile/ios/Runner/Base.lproj/LaunchScreen.storyboard @@ -16,13 +16,22 @@ - - + + + - - + + + + + + + + + + @@ -32,6 +41,8 @@ - + + + diff --git a/sigap-mobile/ios/Runner/Info.plist b/sigap-mobile/ios/Runner/Info.plist index 5f19451..117733b 100644 --- a/sigap-mobile/ios/Runner/Info.plist +++ b/sigap-mobile/ios/Runner/Info.plist @@ -1,64 +1,75 @@ - - CFBundleDevelopmentRegion - $(DEVELOPMENT_LANGUAGE) - CFBundleDisplayName - Sigap - CFBundleExecutable - $(EXECUTABLE_NAME) - CFBundleIdentifier - $(PRODUCT_BUNDLE_IDENTIFIER) - CFBundleInfoDictionaryVersion - 6.0 - CFBundleName - sigap - CFBundlePackageType - APPL - CFBundleShortVersionString - $(FLUTTER_BUILD_NAME) - CFBundleSignature - ???? - CFBundleVersion - $(FLUTTER_BUILD_NUMBER) - LSRequiresIPhoneOS - - UILaunchStoryboardName - LaunchScreen - UIMainStoryboardFile - Main - UISupportedInterfaceOrientations - - UIInterfaceOrientationPortrait - UIInterfaceOrientationLandscapeLeft - UIInterfaceOrientationLandscapeRight - - UISupportedInterfaceOrientations~ipad - - UIInterfaceOrientationPortrait - UIInterfaceOrientationPortraitUpsideDown - UIInterfaceOrientationLandscapeLeft - UIInterfaceOrientationLandscapeRight - - CADisableMinimumFrameDurationOnPhone - - UIApplicationSupportsIndirectInputEvents - - - CFBundleURLTypes - - - CFBundleTypeRole - Editor - CFBundleURLSchemes - - io.supabase.flutterquickstart - - - - - NSLocationWhenInUseUsageDescription - This app needs access to location when open. - - \ No newline at end of file + + CFBundleDevelopmentRegion + $(DEVELOPMENT_LANGUAGE) + CFBundleDisplayName + Sigap + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + sigap + CFBundlePackageType + APPL + CFBundleShortVersionString + $(FLUTTER_BUILD_NAME) + CFBundleSignature + ???? + CFBundleVersion + $(FLUTTER_BUILD_NUMBER) + LSRequiresIPhoneOS + + UILaunchStoryboardName + LaunchScreen + UIMainStoryboardFile + Main + UISupportedInterfaceOrientations + + UIInterfaceOrientationPortrait + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + UISupportedInterfaceOrientations~ipad + + UIInterfaceOrientationPortrait + UIInterfaceOrientationPortraitUpsideDown + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + CADisableMinimumFrameDurationOnPhone + + UIApplicationSupportsIndirectInputEvents + + + CFBundleURLTypes + + + CFBundleTypeRole + Editor + CFBundleURLSchemes + + io.supabase.flutterquickstart + + + + + + + NSLocationWhenInUseUsageDescription + Aplikasi ini memerlukan akses lokasi untuk menunjukkan posisi Anda pada peta + NSLocationAlwaysUsageDescription + Aplikasi ini memerlukan akses lokasi untuk navigasi latar belakang + io.flutter.embedded_views_preview + + MGLMapboxAccessToken + $(MAPBOX_ACCESS_TOKEN) + UIStatusBarHidden + + + diff --git a/sigap-mobile/lib/app.dart b/sigap-mobile/lib/app.dart index da2be11..d7f92f5 100644 --- a/sigap-mobile/lib/app.dart +++ b/sigap-mobile/lib/app.dart @@ -1,9 +1,9 @@ import 'package:flutter/material.dart'; import 'package:flutter_localizations/flutter_localizations.dart'; -import 'package:get/get_navigation/src/root/get_material_app.dart'; +import 'package:get/get.dart'; +import 'package:sigap/splash_screen.dart'; import 'package:sigap/src/cores/bindings/app_bindings.dart'; import 'package:sigap/src/cores/routes/app_pages.dart'; -import 'package:sigap/src/utils/constants/colors.dart'; import 'package:sigap/src/utils/constants/text_strings.dart'; import 'package:sigap/src/utils/theme/theme.dart'; @@ -12,6 +12,7 @@ class App extends StatelessWidget { @override Widget build(BuildContext context) { + return GetMaterialApp( title: TTexts.appName, themeMode: ThemeMode.system, @@ -22,10 +23,7 @@ class App extends StatelessWidget { localizationsDelegates: GlobalMaterialLocalizations.delegates, supportedLocales: const [Locale('id', '')], getPages: AppPages.routes, - home: const Scaffold( - backgroundColor: TColors.primary, - body: Center(child: CircularProgressIndicator(color: TColors.white)), - ), + home: const AnimatedSplashScreenWidget(), ); } } diff --git a/sigap-mobile/lib/main.dart b/sigap-mobile/lib/main.dart index 394b76c..59f6502 100644 --- a/sigap-mobile/lib/main.dart +++ b/sigap-mobile/lib/main.dart @@ -1,25 +1,25 @@ import 'package:flutter/material.dart'; import 'package:flutter_dotenv/flutter_dotenv.dart'; -import 'package:flutter_native_splash/flutter_native_splash.dart'; import 'package:get_storage/get_storage.dart'; +import 'package:mapbox_maps_flutter/mapbox_maps_flutter.dart'; import 'package:sigap/app.dart'; import 'package:supabase_flutter/supabase_flutter.dart'; Future main() async { // Ensure that the Flutter binding is initialized before calling any Flutter - final WidgetsBinding widgetBinding = - WidgetsFlutterBinding.ensureInitialized(); + // WidgetsBinding widgetsBinding = WidgetsFlutterBinding.ensureInitialized(); + // FlutterNativeSplash.preserve(widgetsBinding: widgetsBinding); + + // Load environment variables from the .env file + await dotenv.load(fileName: ".env"); // -- GetX Local Storage await GetStorage.init(); - // -- Await splash until other item load - FlutterNativeSplash.preserve(widgetsBinding: widgetBinding); - // Initialize the authentication repository with Supabase await Supabase.initialize( - url: dotenv.env['SUPABASE_URL']!, - anonKey: dotenv.env['SUPABASE_ANON_KEY']!, + url: dotenv.env['SUPABASE_URL'] ?? '', + anonKey: dotenv.env['SUPABASE_ANON_KEY'] ?? '', authOptions: const FlutterAuthClientOptions( authFlowType: AuthFlowType.pkce, // detectSessionInUri: true, @@ -29,6 +29,12 @@ Future main() async { ), storageOptions: const StorageClientOptions(retryAttempts: 10), ); + + // Initialize the Mapbox + String mapboxAccesToken = dotenv.env['MAPBOX_ACCESS_TOKEN'] ?? ''; + MapboxOptions.setAccessToken(mapboxAccesToken); + runApp(const App()); } + diff --git a/sigap-mobile/lib/splash_screen.dart b/sigap-mobile/lib/splash_screen.dart new file mode 100644 index 0000000..775c7d6 --- /dev/null +++ b/sigap-mobile/lib/splash_screen.dart @@ -0,0 +1,64 @@ +import 'package:animated_splash_screen/animated_splash_screen.dart'; +import 'package:flutter/material.dart'; +import 'package:lottie/lottie.dart'; +import 'package:sigap/src/features/onboarding/screens/onboarding/onboarding_screen.dart'; +import 'package:sigap/src/utils/constants/colors.dart'; +import 'package:sigap/src/utils/constants/image_strings.dart'; +import 'package:sigap/src/utils/helpers/helper_functions.dart'; + +class AnimatedSplashScreenWidget extends StatelessWidget { + const AnimatedSplashScreenWidget({super.key}); + + @override + Widget build(BuildContext context) { + final isDark = THelperFunctions.isDarkMode(context); + + // Try to find SplashController, but don't fail if it's not ready yet + // SplashController? splashController; + // if (Get.isRegistered()) { + // splashController = Get.find(); + // } else { + // // Register a temporary controller if the real one isn't ready + // splashController = Get.put(SplashController()); + // } + + return AnimatedSplashScreen( + splash: Center( + child: Lottie.asset( + isDark ? TImages.darkSplashApp : TImages.lightSplashApp, + ), + ), + splashIconSize: 300, + duration: 3500, + nextScreen: const OnboardingScreen(), + backgroundColor: isDark ? TColors.dark : TColors.white, + ); + } +} + +// A transition screen that shows a loading indicator +// until authentication is ready +// class _LoadingScreen extends StatelessWidget { +// const _LoadingScreen(); + +// @override +// Widget build(BuildContext context) { +// final isDark = THelperFunctions.isDarkMode(context); + +// // This will be shown after the animated splash screen +// // while we wait for initialization to complete +// return Scaffold( +// backgroundColor: isDark ? TColors.dark : TColors.white, +// body: const Center( +// child: Column( +// mainAxisAlignment: MainAxisAlignment.center, +// children: [ +// CircularProgressIndicator(), +// SizedBox(height: 24), +// Text("Menyiapkan aplikasi..."), +// ], +// ), +// ), +// ); +// } +// } diff --git a/sigap-mobile/lib/src/cores/bindings/general_bindings.dart b/sigap-mobile/lib/src/cores/bindings/general_bindings.dart index a0d1fe0..9323e93 100644 --- a/sigap-mobile/lib/src/cores/bindings/general_bindings.dart +++ b/sigap-mobile/lib/src/cores/bindings/general_bindings.dart @@ -7,6 +7,7 @@ class UtilityBindings extends Bindings { @override void dependencies() { + // Get.put(BackgroundService.instance, permanent: true); Get.put(NetworkManager()); Get.put(logger); } diff --git a/sigap-mobile/lib/src/cores/bindings/repository_bindings.dart b/sigap-mobile/lib/src/cores/bindings/repository_bindings.dart index f2efcc5..4c1eb90 100644 --- a/sigap-mobile/lib/src/cores/bindings/repository_bindings.dart +++ b/sigap-mobile/lib/src/cores/bindings/repository_bindings.dart @@ -1,5 +1,5 @@ import 'package:get/get.dart'; -import 'package:sigap/src/cores/repositories/authentication/authentication_repositories.dart'; +import 'package:sigap/src/cores/repositories/authentication/authentication_repository.dart'; import 'package:sigap/src/cores/repositories/daily-ops/officers_repository.dart'; import 'package:sigap/src/cores/repositories/daily-ops/units_repository.dart'; import 'package:sigap/src/cores/repositories/personalization/profile_repository.dart'; diff --git a/sigap-mobile/lib/src/cores/bindings/service_bindings.dart b/sigap-mobile/lib/src/cores/bindings/service_bindings.dart index fe8edbc..06b0e3d 100644 --- a/sigap-mobile/lib/src/cores/bindings/service_bindings.dart +++ b/sigap-mobile/lib/src/cores/bindings/service_bindings.dart @@ -1,4 +1,5 @@ import 'package:get/get.dart'; +import 'package:sigap/src/cores/services/background_service.dart'; import 'package:sigap/src/cores/services/biometric_service.dart'; import 'package:sigap/src/cores/services/location_service.dart'; import 'package:sigap/src/cores/services/supabase_service.dart'; @@ -6,9 +7,13 @@ import 'package:sigap/src/cores/services/supabase_service.dart'; class ServiceBindings extends Bindings { @override Future dependencies() async { + final locationService = await BackgroundService.instance + .compute((message) => LocationService(), null); + final biometricService = await BackgroundService.instance + .compute((message) => BiometricService(), null); // Initialize services await Get.putAsync(() => SupabaseService().init()); - await Get.putAsync(() => BiometricService().init()); - await Get.putAsync(() => LocationService().init()); + await Get.putAsync(() => biometricService.init(), permanent: true); + await Get.putAsync(() => locationService.init(), permanent: true); } } diff --git a/sigap-mobile/lib/src/cores/repositories/authentication/authentication_repositories.dart b/sigap-mobile/lib/src/cores/repositories/authentication/authentication_repository.dart similarity index 89% rename from sigap-mobile/lib/src/cores/repositories/authentication/authentication_repositories.dart rename to sigap-mobile/lib/src/cores/repositories/authentication/authentication_repository.dart index d5faf79..d76eb08 100644 --- a/sigap-mobile/lib/src/cores/repositories/authentication/authentication_repositories.dart +++ b/sigap-mobile/lib/src/cores/repositories/authentication/authentication_repository.dart @@ -1,5 +1,4 @@ import 'package:flutter/services.dart'; -import 'package:flutter_native_splash/flutter_native_splash.dart'; import 'package:get/get.dart'; import 'package:get_storage/get_storage.dart'; import 'package:sigap/src/cores/services/biometric_service.dart'; @@ -16,19 +15,24 @@ import 'package:supabase_flutter/supabase_flutter.dart'; class AuthenticationRepository extends GetxController { static AuthenticationRepository get instance => Get.find(); + // --------------------------------------------------------------------------- + // VARIABLES & GETTERS + // --------------------------------------------------------------------------- // Variable final storage = GetStorage(); final _supabase = SupabaseService.instance.client; final _locationService = LocationService.instance; - final _biometricService = Get.put(BiometricService()); + final _biometricService = Get.find(); // Getters that use the Supabase service User? get authUser => SupabaseService.instance.currentUser; String? get currentUserId => SupabaseService.instance.currentUserId; + // --------------------------------------------------------------------------- + // LIFECYCLE & REDIRECT + // --------------------------------------------------------------------------- @override void onReady() { - FlutterNativeSplash.remove(); screenRedirect(); } @@ -58,6 +62,7 @@ class AuthenticationRepository extends GetxController { } } + // Redirect user to appropriate screen on app start screenRedirect() async { final user = _supabase.auth.currentUser; if (user != null) { @@ -76,7 +81,10 @@ class AuthenticationRepository extends GetxController { } } - // ----------------- Email and Password Sign In ----------------- + // --------------------------------------------------------------------------- + // EMAIL & PASSWORD AUTHENTICATION + // --------------------------------------------------------------------------- + // Sign in with email and password Future signInWithEmailPassword({ required String email, required String password, @@ -119,7 +127,10 @@ class AuthenticationRepository extends GetxController { } } - // [SESSION] - CHECK SESSION + // --------------------------------------------------------------------------- + // SESSION MANAGEMENT + // --------------------------------------------------------------------------- + // Get current session Future?> getSession() async { try { final session = _supabase.auth.currentSession; @@ -134,7 +145,10 @@ class AuthenticationRepository extends GetxController { } } - // [Email Verification] - EMAIL VERIFICATION + // --------------------------------------------------------------------------- + // EMAIL VERIFICATION & PASSWORD RESET + // --------------------------------------------------------------------------- + // Send email verification Future sendEmailVerification() async { try { await _supabase.auth.resend( @@ -154,7 +168,7 @@ class AuthenticationRepository extends GetxController { } } - // [Email Reset Password ] - RESET PASSWORD + // Send reset password email Future sendResetPasswordForEmail(String email) async { try { await _supabase.auth.resetPasswordForEmail(email); @@ -171,7 +185,7 @@ class AuthenticationRepository extends GetxController { } } - // Compare OTP + // Verify OTP Future verifyOtp(String otp) async { try { final AuthResponse res = await _supabase.auth.verifyOTP( @@ -220,6 +234,7 @@ class AuthenticationRepository extends GetxController { } } + // Change password (requires reauthentication) Future changePassword( String currentPassword, String newPassword, @@ -247,7 +262,7 @@ class AuthenticationRepository extends GetxController { } } - // [Email Verification] - CREATE NEW VERIFICATION USER EMAIL + // Resend email verification Future resendEmailVerification(String email) async { try { await _supabase.auth.resend(type: OtpType.signup, email: email); @@ -264,8 +279,10 @@ class AuthenticationRepository extends GetxController { } } - // ----------------- Social Sign In ----------------- - // [GoogleAuthentication] - GOOGLE + // --------------------------------------------------------------------------- + // SOCIAL AUTHENTICATION + // --------------------------------------------------------------------------- + // Google sign in Future signInWithGoogle() async { try { return await _supabase.auth.signInWithOAuth( @@ -285,7 +302,7 @@ class AuthenticationRepository extends GetxController { } } - // [FacebookAuthentication] - FACEBOOK + // Facebook sign in Future signInWithFacebook() async { try { return await _supabase.auth.signInWithOAuth( @@ -305,7 +322,7 @@ class AuthenticationRepository extends GetxController { } } - // [AppleAuthentication] - APPLE + // Apple sign in Future signInWithApple() async { try { return await _supabase.auth.signInWithOAuth( @@ -325,7 +342,7 @@ class AuthenticationRepository extends GetxController { } } - // [GithubAuthentication] - GITHUB + // Github sign in Future signInWithGithub() async { try { return await _supabase.auth.signInWithOAuth( @@ -345,7 +362,7 @@ class AuthenticationRepository extends GetxController { } } - // [TwitterAuthentication] - TWITTER + // Twitter sign in Future signInWithTwitter() async { try { return await _supabase.auth.signInWithOAuth( @@ -365,7 +382,10 @@ class AuthenticationRepository extends GetxController { } } - // [Email AUTH] - SIGN UP with role selection and location verification + // --------------------------------------------------------------------------- + // SIGN UP & ROLE MANAGEMENT + // --------------------------------------------------------------------------- + // Sign up with credential (email, password, NIK/NRP, etc) Future signUpWithCredential( String email, String password, @@ -492,63 +512,7 @@ class AuthenticationRepository extends GetxController { } } - // Enable or disable biometric login - Future toggleBiometricLogin(bool enable) async { - if (enable) { - await _biometricService.enableBiometricLogin(); - } else { - await _biometricService.disableBiometricLogin(); - } - } - - // Check if biometric login is enabled - Future isBiometricLoginEnabled() async { - return await _biometricService.isBiometricLoginEnabled(); - } - - // Check if biometrics are available on the device - Future isBiometricAvailable() async { - return _biometricService.isBiometricAvailable.value; - } - - // ----------------- Logout ----------------- - // [Sign Out] - SIGN OUT - Future signOut() async { - try { - await _supabase.auth.signOut(); - Get.offAll(() => const SignInScreen()); - } on AuthException catch (e) { - throw TExceptions(e.message); - } on FormatException catch (_) { - throw const TFormatException(); - } on PlatformException catch (e) { - throw TPlatformException(e.code).message; - } on PostgrestException catch (error) { - throw TExceptions.fromCode(error.code ?? 'unknown_error'); - } catch (e) { - throw TExceptions('Something went wrong. Please try again later.'); - } - } - - // ----------------- Delete Account ----------------- - Future deleteAccount() async { - try { - final userId = _supabase.auth.currentUser!.id; - await _supabase.rpc('delete_account', params: {'user_id': userId}); - } on AuthException catch (e) { - throw TExceptions(e.message); - } on FormatException catch (_) { - throw const TFormatException(); - } on PlatformException catch (e) { - throw TPlatformException(e.code).message; - } on PostgrestException catch (error) { - throw TExceptions.fromCode(error.code ?? 'unknown_error'); - } catch (e) { - throw TExceptions('Something went wrong. Please try again later.'); - } - } - - /// Updates a user's profile with the officer status and metadata + // Update user role (officer/user) and metadata Future updateUserRole({ required bool isOfficer, Map? officerData, @@ -579,4 +543,65 @@ class AuthenticationRepository extends GetxController { throw TExceptions('Something went wrong. Please try again later.'); } } + + // --------------------------------------------------------------------------- + // BIOMETRIC AUTHENTICATION + // --------------------------------------------------------------------------- + // Enable or disable biometric login + Future toggleBiometricLogin(bool enable) async { + if (enable) { + await _biometricService.enableBiometricLogin(); + } else { + await _biometricService.disableBiometricLogin(); + } + } + + // Check if biometric login is enabled + Future isBiometricLoginEnabled() async { + return await _biometricService.isBiometricLoginEnabled(); + } + + // Check if biometrics are available on the device + Future isBiometricAvailable() async { + return _biometricService.isBiometricAvailable.value; + } + + // --------------------------------------------------------------------------- + // LOGOUT & ACCOUNT DELETION + // --------------------------------------------------------------------------- + // Sign out + Future signOut() async { + try { + await _supabase.auth.signOut(); + Get.offAll(() => const SignInScreen()); + } on AuthException catch (e) { + throw TExceptions(e.message); + } on FormatException catch (_) { + throw const TFormatException(); + } on PlatformException catch (e) { + throw TPlatformException(e.code).message; + } on PostgrestException catch (error) { + throw TExceptions.fromCode(error.code ?? 'unknown_error'); + } catch (e) { + throw TExceptions('Something went wrong. Please try again later.'); + } + } + + // Delete account + Future deleteAccount() async { + try { + final userId = _supabase.auth.currentUser!.id; + await _supabase.rpc('delete_account', params: {'user_id': userId}); + } on AuthException catch (e) { + throw TExceptions(e.message); + } on FormatException catch (_) { + throw const TFormatException(); + } on PlatformException catch (e) { + throw TPlatformException(e.code).message; + } on PostgrestException catch (error) { + throw TExceptions.fromCode(error.code ?? 'unknown_error'); + } catch (e) { + throw TExceptions('Something went wrong. Please try again later.'); + } + } } diff --git a/sigap-mobile/lib/src/cores/repositories/daily-ops/officers_repository.dart b/sigap-mobile/lib/src/cores/repositories/daily-ops/officers_repository.dart index 88c48f5..c8e6784 100644 --- a/sigap-mobile/lib/src/cores/repositories/daily-ops/officers_repository.dart +++ b/sigap-mobile/lib/src/cores/repositories/daily-ops/officers_repository.dart @@ -1,6 +1,6 @@ import 'package:flutter/services.dart'; import 'package:get/get.dart'; -import 'package:sigap/src/cores/repositories/authentication/authentication_repositories.dart'; +import 'package:sigap/src/cores/repositories/authentication/authentication_repository.dart'; import 'package:sigap/src/features/daily-ops/models/models/officers_model.dart'; import 'package:sigap/src/utils/exceptions/exceptions.dart'; import 'package:sigap/src/utils/exceptions/format_exceptions.dart'; diff --git a/sigap-mobile/lib/src/cores/repositories/daily-ops/units_repository.dart b/sigap-mobile/lib/src/cores/repositories/daily-ops/units_repository.dart index 0f66e13..779cf4e 100644 --- a/sigap-mobile/lib/src/cores/repositories/daily-ops/units_repository.dart +++ b/sigap-mobile/lib/src/cores/repositories/daily-ops/units_repository.dart @@ -1,8 +1,6 @@ import 'package:get/get.dart'; import 'package:sigap/src/cores/services/supabase_service.dart'; import 'package:sigap/src/features/daily-ops/models/models/units_model.dart'; -import 'package:sigap/src/features/daily-ops/models/models/patrol_units_model.dart'; -import 'package:sigap/src/features/daily-ops/models/models/unit_statistics_model.dart'; import 'package:sigap/src/utils/exceptions/exceptions.dart'; import 'package:supabase_flutter/supabase_flutter.dart'; diff --git a/sigap-mobile/lib/src/cores/repositories/map/cities_repository.dart b/sigap-mobile/lib/src/cores/repositories/map/cities_repository.dart index af53fc5..904223d 100644 --- a/sigap-mobile/lib/src/cores/repositories/map/cities_repository.dart +++ b/sigap-mobile/lib/src/cores/repositories/map/cities_repository.dart @@ -25,7 +25,7 @@ class CitiesRepository extends GetxController { .select('*, districts(*), units(*)') .order('name'); - final data = response.data as List; + final data = response as List; final cities = data.map((json) => CityModel.fromJson(json)).toList(); // Update cache @@ -55,7 +55,7 @@ class CitiesRepository extends GetxController { .eq('id', cityId) .single(); - return CityModel.fromJson(response.data); + return CityModel.fromJson(response); } catch (e) { _log.e('Error fetching city $cityId: $e'); throw Exception('Failed to load city details: $e'); @@ -72,7 +72,7 @@ class CitiesRepository extends GetxController { .eq('name', 'Jember') .single(); - return CityModel.fromJson(response.data); + return CityModel.fromJson(response); } catch (e) { _log.e('Error fetching default city: $e'); throw Exception('Failed to load default city: $e'); diff --git a/sigap-mobile/lib/src/cores/repositories/map/demographics_repository.dart b/sigap-mobile/lib/src/cores/repositories/map/demographics_repository.dart index 214cf29..7c1d187 100644 --- a/sigap-mobile/lib/src/cores/repositories/map/demographics_repository.dart +++ b/sigap-mobile/lib/src/cores/repositories/map/demographics_repository.dart @@ -36,7 +36,7 @@ class DemographicsRepository extends GetxController { .select('*, districts(*)') .eq('year', year); - final data = response.data as List; + final data = response as List; return data.map((json) => DemographicModel.fromJson(json)).toList(); } catch (e) { _log.e('Error fetching demographic data for year $year: $e'); @@ -109,7 +109,7 @@ class DemographicsRepository extends GetxController { .select('*, districts(*)') .single(); - return DemographicModel.fromJson(response.data); + return DemographicModel.fromJson(response); } catch (e) { _log.e('Error saving demographic data: $e'); throw Exception('Failed to save demographic data: $e'); @@ -129,7 +129,7 @@ class DemographicsRepository extends GetxController { .order('population_density', ascending: false) .limit(limit); - final data = response.data as List; + final data = response as List; return data.map((json) => DemographicModel.fromJson(json)).toList(); } catch (e) { _log.e('Error fetching highest population density districts: $e'); @@ -149,7 +149,7 @@ class DemographicsRepository extends GetxController { params: {'selected_year': year, 'limit_count': limit}, ); - final data = response.data as List; + final data = response as List; return data.map((json) => DemographicModel.fromJson(json)).toList(); } catch (e) { _log.e('Error fetching highest unemployment districts: $e'); diff --git a/sigap-mobile/lib/src/cores/repositories/map/districts_repository.dart b/sigap-mobile/lib/src/cores/repositories/map/districts_repository.dart index 0fbbd06..add153f 100644 --- a/sigap-mobile/lib/src/cores/repositories/map/districts_repository.dart +++ b/sigap-mobile/lib/src/cores/repositories/map/districts_repository.dart @@ -27,7 +27,7 @@ class DistrictsRepository extends GetxController { .eq('city_id', cityId) .order('name'); - final data = response.data as List; + final data = response as List; final districts = data.map((json) => DistrictModel.fromJson(json)).toList(); @@ -62,7 +62,7 @@ class DistrictsRepository extends GetxController { .eq('id', districtId) .single(); - return DistrictModel.fromJson(response.data); + return DistrictModel.fromJson(response); } catch (e) { _log.e('Error fetching district $districtId: $e'); throw Exception('Failed to load district details: $e'); @@ -87,7 +87,7 @@ class DistrictsRepository extends GetxController { } final response = await request; - final data = response.data as List; + final data = response as List; return data.map((json) => DistrictModel.fromJson(json)).toList(); } catch (e) { diff --git a/sigap-mobile/lib/src/cores/repositories/map/geogrpaphics_repository.dart b/sigap-mobile/lib/src/cores/repositories/map/geogrpaphics_repository.dart index 8a1ea6b..dfbdbf3 100644 --- a/sigap-mobile/lib/src/cores/repositories/map/geogrpaphics_repository.dart +++ b/sigap-mobile/lib/src/cores/repositories/map/geogrpaphics_repository.dart @@ -19,7 +19,7 @@ class GeographicsRepository extends GetxController { .select('*, districts(*)') .eq('district_id', districtId); - final data = response.data as List; + final data = response as List; return data.map((json) => GeographicModel.fromJson(json)).toList(); } catch (e) { _log.e('Error fetching geographic data for district $districtId: $e'); @@ -37,7 +37,7 @@ class GeographicsRepository extends GetxController { .eq('id', geographicId) .single(); - return GeographicModel.fromJson(response.data); + return GeographicModel.fromJson(response); } catch (e) { _log.e('Error fetching geographic data $geographicId: $e'); throw Exception('Failed to load geographic details: $e'); @@ -52,7 +52,7 @@ class GeographicsRepository extends GetxController { .select('*, districts(*)') .eq('type', type); - final data = response.data as List; + final data = response as List; return data.map((json) => GeographicModel.fromJson(json)).toList(); } catch (e) { _log.e('Error fetching geographic data of type $type: $e'); @@ -68,7 +68,7 @@ class GeographicsRepository extends GetxController { .select('*, districts(*)') .eq('year', year); - final data = response.data as List; + final data = response as List; return data.map((json) => GeographicModel.fromJson(json)).toList(); } catch (e) { _log.e('Error fetching geographic data for year $year: $e'); @@ -108,7 +108,7 @@ class GeographicsRepository extends GetxController { .select('*, districts(*)') .single(); - return GeographicModel.fromJson(response.data); + return GeographicModel.fromJson(response); } catch (e) { _log.e('Error saving geographic data: $e'); throw Exception('Failed to save geographic data: $e'); diff --git a/sigap-mobile/lib/src/cores/repositories/map/location_logs_repository.dart b/sigap-mobile/lib/src/cores/repositories/map/location_logs_repository.dart index 078bc4d..7e1b930 100644 --- a/sigap-mobile/lib/src/cores/repositories/map/location_logs_repository.dart +++ b/sigap-mobile/lib/src/cores/repositories/map/location_logs_repository.dart @@ -22,7 +22,7 @@ class LocationLogsRepository extends GetxController { .order('timestamp', ascending: false) .limit(limit); - final data = response.data as List; + final data = response as List; return data.map((json) => LocationLogModel.fromJson(json)).toList(); } catch (e) { _log.e('Error fetching location logs for user $userId: $e'); @@ -53,7 +53,7 @@ class LocationLogsRepository extends GetxController { .select('*, users(*)') .single(); - return LocationLogModel.fromJson(response.data); + return LocationLogModel.fromJson(response); } catch (e) { _log.e('Error adding location log: $e'); throw Exception('Failed to add location log: $e'); @@ -71,7 +71,7 @@ class LocationLogsRepository extends GetxController { .order('timestamp', ascending: false) .limit(limit); - final data = response.data as List; + final data = response as List; return data.map((json) => LocationLogModel.fromJson(json)).toList(); } catch (e) { _log.e('Error fetching recent location logs: $e'); @@ -92,7 +92,7 @@ class LocationLogsRepository extends GetxController { .lte('timestamp', end.toIso8601String()) .order('timestamp', ascending: true); - final data = response.data as List; + final data = response as List; return data.map((json) => LocationLogModel.fromJson(json)).toList(); } catch (e) { _log.e('Error fetching location logs in range: $e'); diff --git a/sigap-mobile/lib/src/cores/repositories/map/locations_repository.dart b/sigap-mobile/lib/src/cores/repositories/map/locations_repository.dart index c0a60bd..ecaeba0 100644 --- a/sigap-mobile/lib/src/cores/repositories/map/locations_repository.dart +++ b/sigap-mobile/lib/src/cores/repositories/map/locations_repository.dart @@ -21,7 +21,7 @@ class LocationsRepository extends GetxController { ) .eq('district_id', districtId); - final data = response.data as List; + final data = response as List; return data.map((json) => LocationModel.fromJson(json)).toList(); } catch (e) { _log.e('Error fetching locations for district $districtId: $e'); @@ -41,7 +41,7 @@ class LocationsRepository extends GetxController { .eq('id', locationId) .single(); - return LocationModel.fromJson(response.data); + return LocationModel.fromJson(response); } catch (e) { _log.e('Error fetching location $locationId: $e'); throw Exception('Failed to load location details: $e'); @@ -65,7 +65,7 @@ class LocationsRepository extends GetxController { }, ); - final data = response.data as List; + final data = response as List; return data.map((json) => LocationModel.fromJson(json)).toList(); } catch (e) { _log.e('Error fetching nearby locations: $e'); @@ -99,7 +99,7 @@ class LocationsRepository extends GetxController { .select('*, event(*)') .single(); - return LocationModel.fromJson(response.data); + return LocationModel.fromJson(response); } catch (e) { _log.e('Error adding location: $e'); throw Exception('Failed to add location: $e'); diff --git a/sigap-mobile/lib/src/cores/services/background_service.dart b/sigap-mobile/lib/src/cores/services/background_service.dart new file mode 100644 index 0000000..46ffbf4 --- /dev/null +++ b/sigap-mobile/lib/src/cores/services/background_service.dart @@ -0,0 +1,62 @@ +import 'dart:async'; +import 'dart:isolate'; + +import 'package:flutter/foundation.dart'; +import 'package:flutter/foundation.dart' as flutter; + +class BackgroundService { + static final BackgroundService _instance = BackgroundService._internal(); + factory BackgroundService() => _instance; + BackgroundService._internal(); + + static BackgroundService get instance => _instance; + + /// Run a heavy computation in the background using compute + /// This is useful for JSON parsing, data processing, etc. + Future compute(ComputeCallback callback, U message) async { + return await flutter.compute(callback, message); + } + + /// Run a task in an isolate with message passing capability + Future runTaskInIsolate(Future Function() task) async { + final completer = Completer(); + + final receivePort = ReceivePort(); + final isolate = await Isolate.spawn( + _isolateEntry, + _IsolateData(receivePort.sendPort, task), + ); + + receivePort.listen((message) { + if (message is T) { + completer.complete(message); + receivePort.close(); + isolate.kill(); + } else if (message is Error) { + completer.completeError(message); + receivePort.close(); + isolate.kill(); + } + }); + + return completer.future; + } +} + +// Helper function to run code in isolate +void _isolateEntry(_IsolateData data) async { + try { + final result = await data.task(); + data.sendPort.send(result); + } catch (e) { + data.sendPort.send(Error()); + } +} + +// Data class for isolate communication +class _IsolateData { + final SendPort sendPort; + final Future Function() task; + + _IsolateData(this.sendPort, this.task); +} diff --git a/sigap-mobile/lib/src/features/auth/controllers/email_verification_controller.dart b/sigap-mobile/lib/src/features/auth/controllers/email_verification_controller.dart index 24ce664..7fb5e17 100644 --- a/sigap-mobile/lib/src/features/auth/controllers/email_verification_controller.dart +++ b/sigap-mobile/lib/src/features/auth/controllers/email_verification_controller.dart @@ -2,7 +2,7 @@ import 'dart:async'; import 'package:flutter/material.dart'; import 'package:get/get.dart'; -import 'package:sigap/src/cores/repositories/authentication/authentication_repositories.dart'; +import 'package:sigap/src/cores/repositories/authentication/authentication_repository.dart'; import 'package:sigap/src/utils/constants/app_routes.dart'; import 'package:sigap/src/utils/popups/loaders.dart'; diff --git a/sigap-mobile/lib/src/features/auth/controllers/forgot_password_controller.dart b/sigap-mobile/lib/src/features/auth/controllers/forgot_password_controller.dart index a38ab35..3751d25 100644 --- a/sigap-mobile/lib/src/features/auth/controllers/forgot_password_controller.dart +++ b/sigap-mobile/lib/src/features/auth/controllers/forgot_password_controller.dart @@ -1,6 +1,6 @@ import 'package:flutter/material.dart'; import 'package:get/get.dart'; -import 'package:sigap/src/cores/repositories/auth/auth_repositories.dart'; +import 'package:sigap/src/cores/repositories/authentication/authentication_repository.dart'; import 'package:sigap/src/utils/popups/loaders.dart'; import 'package:sigap/src/utils/validators/validation.dart'; diff --git a/sigap-mobile/lib/src/features/auth/controllers/signin_controller.dart b/sigap-mobile/lib/src/features/auth/controllers/signin_controller.dart index e1892ef..e28e65f 100644 --- a/sigap-mobile/lib/src/features/auth/controllers/signin_controller.dart +++ b/sigap-mobile/lib/src/features/auth/controllers/signin_controller.dart @@ -1,7 +1,7 @@ import 'package:flutter/material.dart'; import 'package:get/get.dart'; import 'package:get_storage/get_storage.dart'; -import 'package:sigap/src/cores/repositories/authentication/authentication_repositories.dart'; +import 'package:sigap/src/cores/repositories/authentication/authentication_repository.dart'; import 'package:sigap/src/utils/constants/app_routes.dart'; import 'package:sigap/src/utils/helpers/network_manager.dart'; import 'package:sigap/src/utils/popups/loaders.dart'; diff --git a/sigap-mobile/lib/src/features/auth/controllers/signup_controller.dart b/sigap-mobile/lib/src/features/auth/controllers/signup_controller.dart index 74d6a30..475f2dd 100644 --- a/sigap-mobile/lib/src/features/auth/controllers/signup_controller.dart +++ b/sigap-mobile/lib/src/features/auth/controllers/signup_controller.dart @@ -2,7 +2,7 @@ import 'package:flutter/material.dart'; import 'package:get/get.dart'; import 'package:get_storage/get_storage.dart'; import 'package:logger/logger.dart'; -import 'package:sigap/src/cores/repositories/auth/auth_repositories.dart'; +import 'package:sigap/src/cores/repositories/authentication/authentication_repository.dart'; import 'package:sigap/src/features/auth/models/user_metadata_model.dart'; import 'package:sigap/src/utils/constants/app_routes.dart'; import 'package:sigap/src/utils/helpers/network_manager.dart'; @@ -141,10 +141,10 @@ class SignUpController extends GetxController { // Register user with Supabase Auth Logger().i('Registering user with Supabase Auth'); final authResponse = await AuthenticationRepository.instance - .signUpWithEmailPassword( - email: emailController.text.trim(), - password: passwordController.text.trim(), - userMetadata: updatedMetadata.toJson(), + .signUpWithCredential( + emailController.text.trim(), + passwordController.text.trim(), + updatedMetadata.toJson().toString(), // Pass user metadata as a JSON string ); // Store email for verification or next steps diff --git a/sigap-mobile/lib/src/features/onboarding/bindings/onboarding_binding.dart b/sigap-mobile/lib/src/features/onboarding/bindings/onboarding_binding.dart index c44cb2e..cbffcae 100644 --- a/sigap-mobile/lib/src/features/onboarding/bindings/onboarding_binding.dart +++ b/sigap-mobile/lib/src/features/onboarding/bindings/onboarding_binding.dart @@ -1,6 +1,7 @@ import 'package:get/get.dart'; import 'package:sigap/src/features/onboarding/controllers/onboarding_controller.dart'; import 'package:sigap/src/features/onboarding/controllers/role_selection_controller.dart'; +import 'package:sigap/src/features/onboarding/controllers/splash_controller.dart'; class OnboardingBindings extends Bindings { @override @@ -8,5 +9,6 @@ class OnboardingBindings extends Bindings { // Register all feature onboarding controllers Get.lazyPut(() => OnboardingController()); Get.lazyPut(() => RoleSelectionController()); + Get.lazyPut(() => SplashController()); } } diff --git a/sigap-mobile/lib/src/features/onboarding/controllers/splash_controller.dart b/sigap-mobile/lib/src/features/onboarding/controllers/splash_controller.dart new file mode 100644 index 0000000..434e595 --- /dev/null +++ b/sigap-mobile/lib/src/features/onboarding/controllers/splash_controller.dart @@ -0,0 +1,25 @@ +import 'package:get/get.dart'; +import 'package:sigap/src/cores/repositories/authentication/authentication_repository.dart'; + +class SplashController extends GetxController { + final authRepository = Get.find(); + + // Variable to track if authentication is ready + final RxBool isAuthReady = false.obs; + + @override + void onInit() { + super.onInit(); + // Wait for 3 seconds (matching AnimatedSplashScreen's duration) + // before handling authentication + Future.delayed(const Duration(seconds: 3), () { + isAuthReady.value = true; + handleAuthentication(); + }); + } + + void handleAuthentication() { + // Let the AuthenticationRepository handle the screen redirection + authRepository.screenRedirect(); + } +} diff --git a/sigap-mobile/lib/src/features/onboarding/datas/onboarding_data.dart b/sigap-mobile/lib/src/features/onboarding/datas/onboarding_data.dart index ea3b165..ce880eb 100644 --- a/sigap-mobile/lib/src/features/onboarding/datas/onboarding_data.dart +++ b/sigap-mobile/lib/src/features/onboarding/datas/onboarding_data.dart @@ -5,18 +5,18 @@ final List contents = [ title: 'Crime Mapping & Analysis', description: 'Visualize crime levels across Jember Regency with advanced K-means clustering based on population density, unemployment, and crime incidents.', - image: 'assets/images/onboarding1.png', + image: 'assets/images/content/looking-at-the-map.svg', ), OnboardingContent( title: 'Emergency Panic Button', description: 'One-click emergency alert with automatic geolocation transmission to connect directly with police dispatch in critical situations.', - image: 'assets/images/onboarding2.png', + image: 'assets/images/content/searching-location-on-the-phone.svg', ), OnboardingContent( title: 'Data-Driven Insights', description: 'Track crime trends from 2020 to 2024 with interactive maps and comprehensive reports for better decision making.', - image: 'assets/images/onboarding3.png', + image: 'assets/images/content/paper-plane.svg', ), ]; diff --git a/sigap-mobile/lib/src/features/onboarding/screens/onboarding/onboarding_screen.dart b/sigap-mobile/lib/src/features/onboarding/screens/onboarding/onboarding_screen.dart index 5d4a62f..ce837e6 100644 --- a/sigap-mobile/lib/src/features/onboarding/screens/onboarding/onboarding_screen.dart +++ b/sigap-mobile/lib/src/features/onboarding/screens/onboarding/onboarding_screen.dart @@ -1,8 +1,10 @@ import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; +import 'package:flutter_svg/svg.dart'; import 'package:get/get.dart'; import 'package:sigap/src/features/onboarding/datas/onboarding_data.dart'; import 'package:sigap/src/utils/constants/colors.dart'; +import 'package:sigap/src/utils/helpers/helper_functions.dart'; import '../../controllers/onboarding_controller.dart'; @@ -14,6 +16,8 @@ class OnboardingScreen extends StatelessWidget { // Get the controller final controller = Get.find(); + bool isDark = THelperFunctions.isDarkMode(context); + // Set system overlay style SystemChrome.setSystemUIOverlayStyle( const SystemUiOverlayStyle( @@ -27,7 +31,7 @@ class OnboardingScreen extends StatelessWidget { final isSmallScreen = size.height < 700; return Scaffold( - backgroundColor: TColors.light, + backgroundColor: isDark ? TColors.dark : TColors.light, body: SafeArea( child: Column( children: [ @@ -69,9 +73,10 @@ class OnboardingScreen extends StatelessWidget { opacity: controller.fadeAnimation, child: SlideTransition( position: controller.slideAnimation, - child: Image.asset( + child: SvgPicture.asset( contents[i].image, fit: BoxFit.contain, + height: isSmallScreen ? 200 : 300, ), ), ), @@ -146,32 +151,23 @@ class OnboardingScreen extends StatelessWidget { horizontal: 24.0, vertical: 16.0, ), - child: SizedBox( - width: double.infinity, - height: 56, - child: Obx( - () => ElevatedButton( + child: Align( + alignment: Alignment.centerRight, + child: Container( + margin: const EdgeInsets.only(right: 8.0), + child: FloatingActionButton( onPressed: controller.nextPage, - style: ElevatedButton.styleFrom( backgroundColor: TColors.primary, - foregroundColor: TColors.white, - shape: RoundedRectangleBorder( - borderRadius: BorderRadius.circular(16), - ), - elevation: 0, - ), - child: Text( - controller.currentIndex.value == contents.length - 1 - ? 'Get Started' - : 'Next', - style: const TextStyle( - fontSize: 16, - fontWeight: FontWeight.bold, + elevation: 2, + child: const Icon( + Icons.chevron_right, + color: Colors.white, + size: 30, ), ), ), ), - ), + ), ], ), diff --git a/sigap-mobile/lib/src/utils/constants/image_strings.dart b/sigap-mobile/lib/src/utils/constants/image_strings.dart index bc7eba9..5c2c1e9 100644 --- a/sigap-mobile/lib/src/utils/constants/image_strings.dart +++ b/sigap-mobile/lib/src/utils/constants/image_strings.dart @@ -2,11 +2,16 @@ /// This class contains all the App Images in String formats. class TImages { - // -- App Logos - static const String darkAppLogo = - "assets/logos/t-store-splash-logo-black.png"; - static const String lightAppLogo = - "assets/logos/t-store-splash-logo-white.png"; + // -- App splash Logos + static const String darkSplashApp = + "assets/images/animations/splash-dark.json"; + static const String lightSplashApp = + "assets/images/animations/splash-light.json"; + static const darkAppBgLogo = "assets/logos/logo-bg-dark.svg"; + static const lightAppBgLogo = "assets/logos/logo-bg-dark.svg"; + static const String darkAppLogo = "assets/logos/logo-dark.svg"; + static const String lightAppLogo = "assets/logos/logo-light.svg"; + static const String darkAppLogo2 = "assets/logos/logo.svg"; // -- Social Logos static const String google = "assets/logos/google-icon.png"; @@ -110,6 +115,7 @@ class TImages { static const String comingSoon = "assets/images/animations/coming-soon1.json"; static const String comingSoon2 = "assets/images/animations/coming-soon2.json"; + static const String loader = "assets/images/animations/loader.json"; // static const String characterExplore2 = // "assets/images/animations/char_explore2.json"; } diff --git a/sigap-mobile/macos/Flutter/GeneratedPluginRegistrant.swift b/sigap-mobile/macos/Flutter/GeneratedPluginRegistrant.swift index ba93e15..e624e6e 100644 --- a/sigap-mobile/macos/Flutter/GeneratedPluginRegistrant.swift +++ b/sigap-mobile/macos/Flutter/GeneratedPluginRegistrant.swift @@ -14,6 +14,7 @@ import flutter_secure_storage_macos import geolocator_apple import google_sign_in_ios import local_auth_darwin +import location import path_provider_foundation import shared_preferences_foundation import url_launcher_macos @@ -28,6 +29,7 @@ func RegisterGeneratedPlugins(registry: FlutterPluginRegistry) { GeolocatorPlugin.register(with: registry.registrar(forPlugin: "GeolocatorPlugin")) FLTGoogleSignInPlugin.register(with: registry.registrar(forPlugin: "FLTGoogleSignInPlugin")) FLALocalAuthPlugin.register(with: registry.registrar(forPlugin: "FLALocalAuthPlugin")) + LocationPlugin.register(with: registry.registrar(forPlugin: "LocationPlugin")) PathProviderPlugin.register(with: registry.registrar(forPlugin: "PathProviderPlugin")) SharedPreferencesPlugin.register(with: registry.registrar(forPlugin: "SharedPreferencesPlugin")) UrlLauncherPlugin.register(with: registry.registrar(forPlugin: "UrlLauncherPlugin")) diff --git a/sigap-mobile/pubspec.lock b/sigap-mobile/pubspec.lock index 95b1a2e..6560cd7 100644 --- a/sigap-mobile/pubspec.lock +++ b/sigap-mobile/pubspec.lock @@ -1,6 +1,22 @@ # Generated by pub # See https://dart.dev/tools/pub/glossary#lockfile packages: + animated_splash_screen: + dependency: "direct main" + description: + name: animated_splash_screen + sha256: f45634db6ec4e8cf034c53e03f3bd83898a16fe3c9286bf5510b6831dfcf2124 + url: "https://pub.dev" + source: hosted + version: "1.3.0" + ansicolor: + dependency: transitive + description: + name: ansicolor + sha256: "50e982d500bc863e1d703448afdbf9e5a72eb48840a4f766fa361ffd6877055f" + url: "https://pub.dev" + source: hosted + version: "2.0.3" app_links: dependency: transitive description: @@ -37,10 +53,10 @@ packages: dependency: transitive description: name: archive - sha256: cb6a278ef2dbb298455e1a713bda08524a175630ec643a242c399c932a0a1f7d + sha256: "2fde1607386ab523f7a36bb3e7edb43bd58e6edaf2ffb29d8a6d578b297fdbbd" url: "https://pub.dev" source: hosted - version: "3.6.1" + version: "4.0.7" args: dependency: transitive description: @@ -117,10 +133,10 @@ packages: dependency: transitive description: name: cli_util - sha256: "66f86e916d285c1a93d3b79587d94bd71984a66aac4ff74e524cfa7877f1395c" + sha256: ff6785f7e9e3c38ac98b2fb035701789de90154024a75b6cb926445e83197d1c url: "https://pub.dev" source: hosted - version: "0.3.5" + version: "0.4.2" clock: dependency: transitive description: @@ -185,14 +201,6 @@ packages: url: "https://pub.dev" source: hosted version: "1.0.8" - dart_earcut: - dependency: transitive - description: - name: dart_earcut - sha256: e485001bfc05dcbc437d7bfb666316182e3522d4c3f9668048e004d0eb2ce43b - url: "https://pub.dev" - source: hosted - version: "1.2.0" dart_sort_queue: dependency: transitive description: @@ -338,10 +346,10 @@ packages: dependency: "direct main" description: name: flutter_launcher_icons - sha256: ce0e501cfc258907842238e4ca605e74b7fd1cdf04b3b43e86c43f3e40a1592c + sha256: bfa04787c85d80ecb3f8777bde5fc10c3de809240c48fa061a2c2bf15ea5211c url: "https://pub.dev" source: hosted - version: "0.11.0" + version: "0.14.3" flutter_lints: dependency: "direct dev" description: @@ -387,22 +395,14 @@ packages: description: flutter source: sdk version: "0.0.0" - flutter_map: - dependency: "direct main" - description: - name: flutter_map - sha256: f7d0379477274f323c3f3bc12d369a2b42eb86d1e7bd2970ae1ea3cff782449a - url: "https://pub.dev" - source: hosted - version: "8.1.1" flutter_native_splash: dependency: "direct main" description: name: flutter_native_splash - sha256: "6777a3abb974021a39b5fdd2d46a03ca390e03903b6351f21d10e7ecc969f12d" + sha256: "8321a6d11a8d13977fa780c89de8d257cce3d841eecfb7a4cadffcc4f12d82dc" url: "https://pub.dev" source: hosted - version: "2.2.16" + version: "2.4.6" flutter_otp_text_field: dependency: "direct main" description: @@ -419,6 +419,14 @@ packages: url: "https://pub.dev" source: hosted version: "2.0.28" + flutter_polyline_points: + dependency: "direct main" + description: + name: flutter_polyline_points + sha256: "3a1c8c30abee9fb0fbe44c70d5d1cedb10ef28ec7ea285c669f02b3e183483aa" + url: "https://pub.dev" + source: hosted + version: "2.1.0" flutter_rating_bar: dependency: "direct main" description: @@ -475,6 +483,14 @@ packages: url: "https://pub.dev" source: hosted version: "3.1.2" + flutter_svg: + dependency: "direct main" + description: + name: flutter_svg + sha256: d44bf546b13025ec7353091516f6881f1d4c633993cb109c3916c3a0159dadf1 + url: "https://pub.dev" + source: hosted + version: "2.1.0" flutter_test: dependency: "direct dev" description: flutter @@ -713,10 +729,10 @@ packages: dependency: transitive description: name: image - sha256: "8e9d133755c3e84c73288363e6343157c383a0c6c56fc51afcc5d4d7180306d6" + sha256: "4e973fcf4caae1a4be2fa0a13157aa38a8f9cb049db6529aa00b4d71abc4d928" url: "https://pub.dev" source: hosted - version: "3.3.0" + version: "4.5.4" image_picker: dependency: "direct main" description: @@ -853,14 +869,6 @@ packages: url: "https://pub.dev" source: hosted version: "5.1.1" - lists: - dependency: transitive - description: - name: lists - sha256: "4ca5c19ae4350de036a7e996cdd1ee39c93ac0a2b840f4915459b7d0a7d4ab27" - url: "https://pub.dev" - source: hosted - version: "1.0.1" local_auth: dependency: "direct main" description: @@ -901,6 +909,30 @@ packages: url: "https://pub.dev" source: hosted version: "1.0.11" + location: + dependency: "direct main" + description: + name: location + sha256: c2c4304071ec860525d5c50d142410072f8620c1d9f74874811af2e804e1a9c8 + url: "https://pub.dev" + source: hosted + version: "8.0.0" + location_platform_interface: + dependency: transitive + description: + name: location_platform_interface + sha256: a3404ea6d74e89b121630be62ed8edcc7b39fd108bd19805d0ae55c397135dd7 + url: "https://pub.dev" + source: hosted + version: "6.0.0" + location_web: + dependency: transitive + description: + name: location_web + sha256: "744bdff53dc455a2dc9a34474c49cde364d4fbef2aee009f8b0b4b68570c27a1" + url: "https://pub.dev" + source: hosted + version: "6.0.0" logger: dependency: "direct main" description: @@ -921,42 +953,10 @@ packages: dependency: "direct main" description: name: lottie - sha256: "377d87b8dcef640c04717e93afb86a510f0e1117a399ab94dc4b3f39c85eaa87" + sha256: c5fa04a80a620066c15cf19cc44773e19e9b38e989ff23ea32e5903ef1015950 url: "https://pub.dev" source: hosted - version: "3.3.0" - mapbox_gl: - dependency: "direct main" - description: - name: mapbox_gl - sha256: d78907338ff232e3cf6c1d6dba45e6a8814069496fd352e49bb1967d498f09af - url: "https://pub.dev" - source: hosted - version: "0.16.0" - mapbox_gl_dart: - dependency: transitive - description: - name: mapbox_gl_dart - sha256: de6d03718e5eb05c9eb1ddaae7f0383b28acb5afa16405e1deed7ff04dd34f3d - url: "https://pub.dev" - source: hosted - version: "0.2.1" - mapbox_gl_platform_interface: - dependency: transitive - description: - name: mapbox_gl_platform_interface - sha256: b7c1490b022e650afd20412bdf8ae45a1897118b7ce6049ef6c42df09193d4b2 - url: "https://pub.dev" - source: hosted - version: "0.16.0" - mapbox_gl_web: - dependency: transitive - description: - name: mapbox_gl_web - sha256: e77113bf95a4f321ff44938232517e0f2725aae991f0b283af1afaa7e7a58aca - url: "https://pub.dev" - source: hosted - version: "0.16.0" + version: "3.3.1" mapbox_maps_flutter: dependency: "direct main" description: @@ -989,14 +989,6 @@ packages: url: "https://pub.dev" source: hosted version: "1.16.0" - mgrs_dart: - dependency: transitive - description: - name: mgrs_dart - sha256: fb89ae62f05fa0bb90f70c31fc870bcbcfd516c843fb554452ab3396f78586f7 - url: "https://pub.dev" - source: hosted - version: "2.0.0" mime: dependency: transitive description: @@ -1013,6 +1005,14 @@ packages: url: "https://pub.dev" source: hosted version: "0.5.0" + page_transition: + dependency: transitive + description: + name: page_transition + sha256: "9d2a780d7d68b53ae82fbcc43e06a16195e6775e9aae40e55dc0cbb593460f9d" + url: "https://pub.dev" + source: hosted + version: "2.2.1" path: dependency: "direct main" description: @@ -1157,14 +1157,22 @@ packages: url: "https://pub.dev" source: hosted version: "2.1.8" - polylabel: - dependency: transitive + polyline_do: + dependency: "direct main" description: - name: polylabel - sha256: "41b9099afb2aa6c1730bdd8a0fab1400d287694ec7615dd8516935fa3144214b" + name: polyline_do + sha256: "41b7a4c3d3f259816764d577beba843e683f59117958c51e90a5ca975ff3d298" url: "https://pub.dev" source: hosted - version: "1.0.1" + version: "0.1.0" + posix: + dependency: transitive + description: + name: posix + sha256: f0d7856b6ca1887cfa6d1d394056a296ae33489db914e365e2044fdada449e62 + url: "https://pub.dev" + source: hosted + version: "6.0.2" postgrest: dependency: transitive description: @@ -1173,14 +1181,6 @@ packages: url: "https://pub.dev" source: hosted version: "2.4.2" - proj4dart: - dependency: transitive - description: - name: proj4dart - sha256: c8a659ac9b6864aa47c171e78d41bbe6f5e1d7bd790a5814249e6b68bc44324e - url: "https://pub.dev" - source: hosted - version: "2.1.0" rbush: dependency: transitive description: @@ -1442,14 +1442,6 @@ packages: url: "https://pub.dev" source: hosted version: "1.4.0" - unicode: - dependency: transitive - description: - name: unicode - sha256: "0f69e46593d65245774d4f17125c6084d2c20b4e473a983f6e21b7d7762218f1" - url: "https://pub.dev" - source: hosted - version: "0.3.1" universal_io: dependency: transitive description: @@ -1530,6 +1522,30 @@ packages: url: "https://pub.dev" source: hosted version: "4.5.1" + vector_graphics: + dependency: transitive + description: + name: vector_graphics + sha256: "44cc7104ff32563122a929e4620cf3efd584194eec6d1d913eb5ba593dbcf6de" + url: "https://pub.dev" + source: hosted + version: "1.1.18" + vector_graphics_codec: + dependency: transitive + description: + name: vector_graphics_codec + sha256: "99fd9fbd34d9f9a32efd7b6a6aae14125d8237b10403b422a6a6dfeac2806146" + url: "https://pub.dev" + source: hosted + version: "1.1.13" + vector_graphics_compiler: + dependency: transitive + description: + name: vector_graphics_compiler + sha256: "1b4b9e706a10294258727674a340ae0d6e64a7231980f9f9a3d12e4b42407aad" + url: "https://pub.dev" + source: hosted + version: "1.1.16" vector_math: dependency: transitive description: @@ -1578,14 +1594,6 @@ packages: url: "https://pub.dev" source: hosted version: "5.13.0" - wkt_parser: - dependency: transitive - description: - name: wkt_parser - sha256: "8a555fc60de3116c00aad67891bcab20f81a958e4219cc106e3c037aa3937f13" - url: "https://pub.dev" - source: hosted - version: "2.0.0" xdg_directories: dependency: transitive description: diff --git a/sigap-mobile/pubspec.yaml b/sigap-mobile/pubspec.yaml index 858eefd..1f877f8 100644 --- a/sigap-mobile/pubspec.yaml +++ b/sigap-mobile/pubspec.yaml @@ -21,90 +21,101 @@ version: 1.0.0+1 environment: sdk: ^3.7.2 -# Dependencies specify other packages that your package needs in order to work. -# To automatically upgrade your package dependencies to the latest versions -# consider running `flutter pub upgrade --major-versions`. Alternatively, -# dependencies can be manually updated by changing the version numbers below to -# the latest version available on pub.dev. To see which dependencies have newer -# versions available, run `flutter pub outdated`. dependencies: flutter: sdk: flutter -# Utility Packages + # --- Date & Time Utilities --- intl: ^0.19.0 + timeago: + time_slot: + calendar_date_picker2: + easy_date_timeline: + + # --- Logging & Debugging --- logger: + + # --- URL & Launcher --- url_launcher: - flutter_native_splash: + + # --- Splash & Icons --- + flutter_launcher_icons: + animated_splash_screen: ^1.3.0 + flutter_native_splash: ^2.4.6 + + # --- UI & Animation --- smooth_page_indicator: - connectivity_plus: lottie: - flutter_otp_text_field: + shimmer: + badges: carousel_slider: flutter_rating_bar: readmore: dropdown_search: - time_slot: - calendar_date_picker2: - easy_date_timeline: - shimmer: - badges: - image_picker: - timeago: - flutter_dotenv: - path: - file_picker: dotted_border: - uuid: + flutter_svg: ^2.1.0 + + # --- Input & Forms --- + flutter_otp_text_field: + image_picker: + file_picker: + + # --- Storage & Filesystem --- + path: path_provider: + flutter_secure_storage: + + # --- Data & Utilities --- + uuid: crypto: - flutter_launcher_icons: + + # --- Notifications & Permissions --- flutter_local_notifications: permission_handler: - # Map + # --- Environment & Config --- + flutter_dotenv: + + # --- Connectivity --- + connectivity_plus: + + # --- Map & Location --- mapbox_maps_flutter: - mapbox_gl: - flutter_map: + + # mapbox_gl: + polyline_do: + flutter_polyline_points: + location: latlong2: geolocator: geocoding: - # Icons + # --- Icons --- iconsax: cupertino_icons: font_awesome_flutter: - # State Management + # --- State Management & Storage --- get: get_storage: - # Supabase + # --- Supabase & API Services --- supabase_flutter: - - # Authentication - google_sign_in: - local_auth: - flutter_secure_storage: - - # API Services dio: - # Fonts + # --- Authentication --- + google_sign_in: + local_auth: + + # --- Fonts --- google_fonts: - # Localization - + # --- Localization --- + # (add localization dependencies here if needed) dev_dependencies: flutter_test: sdk: flutter - - # The "flutter_lints" package below contains a set of recommended lints to - # encourage good coding practices. The lint set provided by the package is - # activated in the `analysis_options.yaml` file located at the root of your - # package. See that file for information about deactivating specific lint - # rules and activating additional ones. flutter_lints: ^5.0.0 # For information on the generic Dart part of this file, see the @@ -123,6 +134,9 @@ flutter: #--------------- LOCAL ASSETS ------------------# assets: + # Environment variables + - .env + # Images - assets/logos/ - assets/icons/brands/ - assets/images/content/