diff --git a/.dart_tool/package_config.json b/.dart_tool/package_config.json index 36b5cbf..4c61743 100644 --- a/.dart_tool/package_config.json +++ b/.dart_tool/package_config.json @@ -3,13 +3,13 @@ "packages": [ { "name": "_flutterfire_internals", - "rootUri": "file:///C:/Users/ASUS/AppData/Local/Pub/Cache/hosted/pub.dev/_flutterfire_internals-1.3.53", + "rootUri": "file:///C:/Users/ASUS/AppData/Local/Pub/Cache/hosted/pub.dev/_flutterfire_internals-1.3.54", "packageUri": "lib/", "languageVersion": "3.2" }, { "name": "args", - "rootUri": "file:///C:/Users/ASUS/AppData/Local/Pub/Cache/hosted/pub.dev/args-2.6.0", + "rootUri": "file:///C:/Users/ASUS/AppData/Local/Pub/Cache/hosted/pub.dev/args-2.7.0", "packageUri": "lib/", "languageVersion": "3.3" }, @@ -57,19 +57,19 @@ }, { "name": "cloud_firestore", - "rootUri": "file:///C:/Users/ASUS/AppData/Local/Pub/Cache/hosted/pub.dev/cloud_firestore-5.6.4", + "rootUri": "file:///C:/Users/ASUS/AppData/Local/Pub/Cache/hosted/pub.dev/cloud_firestore-5.6.6", "packageUri": "lib/", "languageVersion": "3.2" }, { "name": "cloud_firestore_platform_interface", - "rootUri": "file:///C:/Users/ASUS/AppData/Local/Pub/Cache/hosted/pub.dev/cloud_firestore_platform_interface-6.6.4", + "rootUri": "file:///C:/Users/ASUS/AppData/Local/Pub/Cache/hosted/pub.dev/cloud_firestore_platform_interface-6.6.6", "packageUri": "lib/", "languageVersion": "3.2" }, { "name": "cloud_firestore_web", - "rootUri": "file:///C:/Users/ASUS/AppData/Local/Pub/Cache/hosted/pub.dev/cloud_firestore_web-4.4.4", + "rootUri": "file:///C:/Users/ASUS/AppData/Local/Pub/Cache/hosted/pub.dev/cloud_firestore_web-4.4.6", "packageUri": "lib/", "languageVersion": "3.4" }, @@ -79,6 +79,12 @@ "packageUri": "lib/", "languageVersion": "2.18" }, + { + "name": "cross_file", + "rootUri": "file:///C:/Users/ASUS/AppData/Local/Pub/Cache/hosted/pub.dev/cross_file-0.3.4+2", + "packageUri": "lib/", + "languageVersion": "3.3" + }, { "name": "crypto", "rootUri": "file:///C:/Users/ASUS/AppData/Local/Pub/Cache/hosted/pub.dev/crypto-3.0.6", @@ -91,6 +97,18 @@ "packageUri": "lib/", "languageVersion": "3.1" }, + { + "name": "device_info_plus", + "rootUri": "file:///C:/Users/ASUS/AppData/Local/Pub/Cache/hosted/pub.dev/device_info_plus-11.3.0", + "packageUri": "lib/", + "languageVersion": "3.4" + }, + { + "name": "device_info_plus_platform_interface", + "rootUri": "file:///C:/Users/ASUS/AppData/Local/Pub/Cache/hosted/pub.dev/device_info_plus_platform_interface-7.0.2", + "packageUri": "lib/", + "languageVersion": "2.18" + }, { "name": "dotted_dashed_line", "rootUri": "file:///C:/Users/ASUS/AppData/Local/Pub/Cache/hosted/pub.dev/dotted_dashed_line-0.0.3", @@ -121,27 +139,33 @@ "packageUri": "lib/", "languageVersion": "3.0" }, + { + "name": "file_picker", + "rootUri": "file:///C:/Users/ASUS/AppData/Local/Pub/Cache/hosted/pub.dev/file_picker-10.0.0", + "packageUri": "lib/", + "languageVersion": "3.4" + }, { "name": "firebase_auth", - "rootUri": "file:///C:/Users/ASUS/AppData/Local/Pub/Cache/hosted/pub.dev/firebase_auth-5.5.1", + "rootUri": "file:///C:/Users/ASUS/AppData/Local/Pub/Cache/hosted/pub.dev/firebase_auth-5.5.2", "packageUri": "lib/", "languageVersion": "3.2" }, { "name": "firebase_auth_platform_interface", - "rootUri": "file:///C:/Users/ASUS/AppData/Local/Pub/Cache/hosted/pub.dev/firebase_auth_platform_interface-7.6.1", + "rootUri": "file:///C:/Users/ASUS/AppData/Local/Pub/Cache/hosted/pub.dev/firebase_auth_platform_interface-7.6.2", "packageUri": "lib/", "languageVersion": "3.2" }, { "name": "firebase_auth_web", - "rootUri": "file:///C:/Users/ASUS/AppData/Local/Pub/Cache/hosted/pub.dev/firebase_auth_web-5.14.1", + "rootUri": "file:///C:/Users/ASUS/AppData/Local/Pub/Cache/hosted/pub.dev/firebase_auth_web-5.14.2", "packageUri": "lib/", "languageVersion": "3.4" }, { "name": "firebase_core", - "rootUri": "file:///C:/Users/ASUS/AppData/Local/Pub/Cache/hosted/pub.dev/firebase_core-3.12.1", + "rootUri": "file:///C:/Users/ASUS/AppData/Local/Pub/Cache/hosted/pub.dev/firebase_core-3.13.0", "packageUri": "lib/", "languageVersion": "3.2" }, @@ -153,25 +177,25 @@ }, { "name": "firebase_core_web", - "rootUri": "file:///C:/Users/ASUS/AppData/Local/Pub/Cache/hosted/pub.dev/firebase_core_web-2.21.1", + "rootUri": "file:///C:/Users/ASUS/AppData/Local/Pub/Cache/hosted/pub.dev/firebase_core_web-2.22.0", "packageUri": "lib/", "languageVersion": "3.4" }, { "name": "firebase_storage", - "rootUri": "file:///C:/Users/ASUS/AppData/Local/Pub/Cache/hosted/pub.dev/firebase_storage-12.4.4", + "rootUri": "file:///C:/Users/ASUS/AppData/Local/Pub/Cache/hosted/pub.dev/firebase_storage-12.4.5", "packageUri": "lib/", "languageVersion": "3.2" }, { "name": "firebase_storage_platform_interface", - "rootUri": "file:///C:/Users/ASUS/AppData/Local/Pub/Cache/hosted/pub.dev/firebase_storage_platform_interface-5.2.4", + "rootUri": "file:///C:/Users/ASUS/AppData/Local/Pub/Cache/hosted/pub.dev/firebase_storage_platform_interface-5.2.5", "packageUri": "lib/", "languageVersion": "3.2" }, { "name": "firebase_storage_web", - "rootUri": "file:///C:/Users/ASUS/AppData/Local/Pub/Cache/hosted/pub.dev/firebase_storage_web-3.10.11", + "rootUri": "file:///C:/Users/ASUS/AppData/Local/Pub/Cache/hosted/pub.dev/firebase_storage_web-3.10.12", "packageUri": "lib/", "languageVersion": "3.4" }, @@ -187,6 +211,12 @@ "packageUri": "lib/", "languageVersion": "2.12" }, + { + "name": "flutter_plugin_android_lifecycle", + "rootUri": "file:///C:/Users/ASUS/AppData/Local/Pub/Cache/hosted/pub.dev/flutter_plugin_android_lifecycle-2.0.26", + "packageUri": "lib/", + "languageVersion": "3.5" + }, { "name": "flutter_screenutil", "rootUri": "file:///C:/Users/ASUS/AppData/Local/Pub/Cache/hosted/pub.dev/flutter_screenutil-5.9.3", @@ -219,7 +249,7 @@ }, { "name": "get", - "rootUri": "file:///C:/Users/ASUS/AppData/Local/Pub/Cache/hosted/pub.dev/get-4.6.6", + "rootUri": "file:///C:/Users/ASUS/AppData/Local/Pub/Cache/hosted/pub.dev/get-4.7.2", "packageUri": "lib/", "languageVersion": "2.15" }, @@ -337,6 +367,42 @@ "packageUri": "lib/", "languageVersion": "3.2" }, + { + "name": "permission_handler", + "rootUri": "file:///C:/Users/ASUS/AppData/Local/Pub/Cache/hosted/pub.dev/permission_handler-11.4.0", + "packageUri": "lib/", + "languageVersion": "3.5" + }, + { + "name": "permission_handler_android", + "rootUri": "file:///C:/Users/ASUS/AppData/Local/Pub/Cache/hosted/pub.dev/permission_handler_android-12.1.0", + "packageUri": "lib/", + "languageVersion": "3.5" + }, + { + "name": "permission_handler_apple", + "rootUri": "file:///C:/Users/ASUS/AppData/Local/Pub/Cache/hosted/pub.dev/permission_handler_apple-9.4.6", + "packageUri": "lib/", + "languageVersion": "2.15" + }, + { + "name": "permission_handler_html", + "rootUri": "file:///C:/Users/ASUS/AppData/Local/Pub/Cache/hosted/pub.dev/permission_handler_html-0.1.3+5", + "packageUri": "lib/", + "languageVersion": "3.3" + }, + { + "name": "permission_handler_platform_interface", + "rootUri": "file:///C:/Users/ASUS/AppData/Local/Pub/Cache/hosted/pub.dev/permission_handler_platform_interface-4.3.0", + "packageUri": "lib/", + "languageVersion": "3.5" + }, + { + "name": "permission_handler_windows", + "rootUri": "file:///C:/Users/ASUS/AppData/Local/Pub/Cache/hosted/pub.dev/permission_handler_windows-0.2.1", + "packageUri": "lib/", + "languageVersion": "2.12" + }, { "name": "petitparser", "rootUri": "file:///C:/Users/ASUS/AppData/Local/Pub/Cache/hosted/pub.dev/petitparser-6.0.2", @@ -363,13 +429,13 @@ }, { "name": "shared_preferences", - "rootUri": "file:///C:/Users/ASUS/AppData/Local/Pub/Cache/hosted/pub.dev/shared_preferences-2.5.2", + "rootUri": "file:///C:/Users/ASUS/AppData/Local/Pub/Cache/hosted/pub.dev/shared_preferences-2.5.3", "packageUri": "lib/", "languageVersion": "3.5" }, { "name": "shared_preferences_android", - "rootUri": "file:///C:/Users/ASUS/AppData/Local/Pub/Cache/hosted/pub.dev/shared_preferences_android-2.4.6", + "rootUri": "file:///C:/Users/ASUS/AppData/Local/Pub/Cache/hosted/pub.dev/shared_preferences_android-2.4.7", "packageUri": "lib/", "languageVersion": "3.5" }, @@ -489,7 +555,19 @@ }, { "name": "web", - "rootUri": "file:///C:/Users/ASUS/AppData/Local/Pub/Cache/hosted/pub.dev/web-1.1.0", + "rootUri": "file:///C:/Users/ASUS/AppData/Local/Pub/Cache/hosted/pub.dev/web-1.1.1", + "packageUri": "lib/", + "languageVersion": "3.4" + }, + { + "name": "win32", + "rootUri": "file:///C:/Users/ASUS/AppData/Local/Pub/Cache/hosted/pub.dev/win32-5.10.1", + "packageUri": "lib/", + "languageVersion": "3.5" + }, + { + "name": "win32_registry", + "rootUri": "file:///C:/Users/ASUS/AppData/Local/Pub/Cache/hosted/pub.dev/win32_registry-1.1.5", "packageUri": "lib/", "languageVersion": "3.4" }, @@ -518,7 +596,7 @@ "languageVersion": "3.4" } ], - "generated": "2025-03-29T09:11:46.461455Z", + "generated": "2025-03-31T15:19:30.948302Z", "generator": "pub", "generatorVersion": "3.5.0", "flutterRoot": "file:///D:/Flutter/flutter_sdk/flutter_3.24.0", diff --git a/.dart_tool/package_config_subset b/.dart_tool/package_config_subset index b64d2e2..63478b5 100644 --- a/.dart_tool/package_config_subset +++ b/.dart_tool/package_config_subset @@ -1,11 +1,11 @@ _flutterfire_internals 3.2 -file:///C:/Users/ASUS/AppData/Local/Pub/Cache/hosted/pub.dev/_flutterfire_internals-1.3.53/ -file:///C:/Users/ASUS/AppData/Local/Pub/Cache/hosted/pub.dev/_flutterfire_internals-1.3.53/lib/ +file:///C:/Users/ASUS/AppData/Local/Pub/Cache/hosted/pub.dev/_flutterfire_internals-1.3.54/ +file:///C:/Users/ASUS/AppData/Local/Pub/Cache/hosted/pub.dev/_flutterfire_internals-1.3.54/lib/ args 3.3 -file:///C:/Users/ASUS/AppData/Local/Pub/Cache/hosted/pub.dev/args-2.6.0/ -file:///C:/Users/ASUS/AppData/Local/Pub/Cache/hosted/pub.dev/args-2.6.0/lib/ +file:///C:/Users/ASUS/AppData/Local/Pub/Cache/hosted/pub.dev/args-2.7.0/ +file:///C:/Users/ASUS/AppData/Local/Pub/Cache/hosted/pub.dev/args-2.7.0/lib/ async 2.18 file:///C:/Users/ASUS/AppData/Local/Pub/Cache/hosted/pub.dev/async-2.11.0/ @@ -36,20 +36,24 @@ file:///C:/Users/ASUS/AppData/Local/Pub/Cache/hosted/pub.dev/clock-1.1.1/ file:///C:/Users/ASUS/AppData/Local/Pub/Cache/hosted/pub.dev/clock-1.1.1/lib/ cloud_firestore 3.2 -file:///C:/Users/ASUS/AppData/Local/Pub/Cache/hosted/pub.dev/cloud_firestore-5.6.4/ -file:///C:/Users/ASUS/AppData/Local/Pub/Cache/hosted/pub.dev/cloud_firestore-5.6.4/lib/ +file:///C:/Users/ASUS/AppData/Local/Pub/Cache/hosted/pub.dev/cloud_firestore-5.6.6/ +file:///C:/Users/ASUS/AppData/Local/Pub/Cache/hosted/pub.dev/cloud_firestore-5.6.6/lib/ cloud_firestore_platform_interface 3.2 -file:///C:/Users/ASUS/AppData/Local/Pub/Cache/hosted/pub.dev/cloud_firestore_platform_interface-6.6.4/ -file:///C:/Users/ASUS/AppData/Local/Pub/Cache/hosted/pub.dev/cloud_firestore_platform_interface-6.6.4/lib/ +file:///C:/Users/ASUS/AppData/Local/Pub/Cache/hosted/pub.dev/cloud_firestore_platform_interface-6.6.6/ +file:///C:/Users/ASUS/AppData/Local/Pub/Cache/hosted/pub.dev/cloud_firestore_platform_interface-6.6.6/lib/ cloud_firestore_web 3.4 -file:///C:/Users/ASUS/AppData/Local/Pub/Cache/hosted/pub.dev/cloud_firestore_web-4.4.4/ -file:///C:/Users/ASUS/AppData/Local/Pub/Cache/hosted/pub.dev/cloud_firestore_web-4.4.4/lib/ +file:///C:/Users/ASUS/AppData/Local/Pub/Cache/hosted/pub.dev/cloud_firestore_web-4.4.6/ +file:///C:/Users/ASUS/AppData/Local/Pub/Cache/hosted/pub.dev/cloud_firestore_web-4.4.6/lib/ collection 2.18 file:///C:/Users/ASUS/AppData/Local/Pub/Cache/hosted/pub.dev/collection-1.18.0/ file:///C:/Users/ASUS/AppData/Local/Pub/Cache/hosted/pub.dev/collection-1.18.0/lib/ +cross_file +3.3 +file:///C:/Users/ASUS/AppData/Local/Pub/Cache/hosted/pub.dev/cross_file-0.3.4+2/ +file:///C:/Users/ASUS/AppData/Local/Pub/Cache/hosted/pub.dev/cross_file-0.3.4+2/lib/ crypto 3.4 file:///C:/Users/ASUS/AppData/Local/Pub/Cache/hosted/pub.dev/crypto-3.0.6/ @@ -58,6 +62,14 @@ cupertino_icons 3.1 file:///C:/Users/ASUS/AppData/Local/Pub/Cache/hosted/pub.dev/cupertino_icons-1.0.8/ file:///C:/Users/ASUS/AppData/Local/Pub/Cache/hosted/pub.dev/cupertino_icons-1.0.8/lib/ +device_info_plus +3.4 +file:///C:/Users/ASUS/AppData/Local/Pub/Cache/hosted/pub.dev/device_info_plus-11.3.0/ +file:///C:/Users/ASUS/AppData/Local/Pub/Cache/hosted/pub.dev/device_info_plus-11.3.0/lib/ +device_info_plus_platform_interface +2.18 +file:///C:/Users/ASUS/AppData/Local/Pub/Cache/hosted/pub.dev/device_info_plus_platform_interface-7.0.2/ +file:///C:/Users/ASUS/AppData/Local/Pub/Cache/hosted/pub.dev/device_info_plus_platform_interface-7.0.2/lib/ dotted_dashed_line 2.17 file:///C:/Users/ASUS/AppData/Local/Pub/Cache/hosted/pub.dev/dotted_dashed_line-0.0.3/ @@ -78,46 +90,54 @@ file 3.0 file:///C:/Users/ASUS/AppData/Local/Pub/Cache/hosted/pub.dev/file-7.0.1/ file:///C:/Users/ASUS/AppData/Local/Pub/Cache/hosted/pub.dev/file-7.0.1/lib/ +file_picker +3.4 +file:///C:/Users/ASUS/AppData/Local/Pub/Cache/hosted/pub.dev/file_picker-10.0.0/ +file:///C:/Users/ASUS/AppData/Local/Pub/Cache/hosted/pub.dev/file_picker-10.0.0/lib/ firebase_auth 3.2 -file:///C:/Users/ASUS/AppData/Local/Pub/Cache/hosted/pub.dev/firebase_auth-5.5.1/ -file:///C:/Users/ASUS/AppData/Local/Pub/Cache/hosted/pub.dev/firebase_auth-5.5.1/lib/ +file:///C:/Users/ASUS/AppData/Local/Pub/Cache/hosted/pub.dev/firebase_auth-5.5.2/ +file:///C:/Users/ASUS/AppData/Local/Pub/Cache/hosted/pub.dev/firebase_auth-5.5.2/lib/ firebase_auth_platform_interface 3.2 -file:///C:/Users/ASUS/AppData/Local/Pub/Cache/hosted/pub.dev/firebase_auth_platform_interface-7.6.1/ -file:///C:/Users/ASUS/AppData/Local/Pub/Cache/hosted/pub.dev/firebase_auth_platform_interface-7.6.1/lib/ +file:///C:/Users/ASUS/AppData/Local/Pub/Cache/hosted/pub.dev/firebase_auth_platform_interface-7.6.2/ +file:///C:/Users/ASUS/AppData/Local/Pub/Cache/hosted/pub.dev/firebase_auth_platform_interface-7.6.2/lib/ firebase_auth_web 3.4 -file:///C:/Users/ASUS/AppData/Local/Pub/Cache/hosted/pub.dev/firebase_auth_web-5.14.1/ -file:///C:/Users/ASUS/AppData/Local/Pub/Cache/hosted/pub.dev/firebase_auth_web-5.14.1/lib/ +file:///C:/Users/ASUS/AppData/Local/Pub/Cache/hosted/pub.dev/firebase_auth_web-5.14.2/ +file:///C:/Users/ASUS/AppData/Local/Pub/Cache/hosted/pub.dev/firebase_auth_web-5.14.2/lib/ firebase_core 3.2 -file:///C:/Users/ASUS/AppData/Local/Pub/Cache/hosted/pub.dev/firebase_core-3.12.1/ -file:///C:/Users/ASUS/AppData/Local/Pub/Cache/hosted/pub.dev/firebase_core-3.12.1/lib/ +file:///C:/Users/ASUS/AppData/Local/Pub/Cache/hosted/pub.dev/firebase_core-3.13.0/ +file:///C:/Users/ASUS/AppData/Local/Pub/Cache/hosted/pub.dev/firebase_core-3.13.0/lib/ firebase_core_platform_interface 3.2 file:///C:/Users/ASUS/AppData/Local/Pub/Cache/hosted/pub.dev/firebase_core_platform_interface-5.4.0/ file:///C:/Users/ASUS/AppData/Local/Pub/Cache/hosted/pub.dev/firebase_core_platform_interface-5.4.0/lib/ firebase_core_web 3.4 -file:///C:/Users/ASUS/AppData/Local/Pub/Cache/hosted/pub.dev/firebase_core_web-2.21.1/ -file:///C:/Users/ASUS/AppData/Local/Pub/Cache/hosted/pub.dev/firebase_core_web-2.21.1/lib/ +file:///C:/Users/ASUS/AppData/Local/Pub/Cache/hosted/pub.dev/firebase_core_web-2.22.0/ +file:///C:/Users/ASUS/AppData/Local/Pub/Cache/hosted/pub.dev/firebase_core_web-2.22.0/lib/ firebase_storage 3.2 -file:///C:/Users/ASUS/AppData/Local/Pub/Cache/hosted/pub.dev/firebase_storage-12.4.4/ -file:///C:/Users/ASUS/AppData/Local/Pub/Cache/hosted/pub.dev/firebase_storage-12.4.4/lib/ +file:///C:/Users/ASUS/AppData/Local/Pub/Cache/hosted/pub.dev/firebase_storage-12.4.5/ +file:///C:/Users/ASUS/AppData/Local/Pub/Cache/hosted/pub.dev/firebase_storage-12.4.5/lib/ firebase_storage_platform_interface 3.2 -file:///C:/Users/ASUS/AppData/Local/Pub/Cache/hosted/pub.dev/firebase_storage_platform_interface-5.2.4/ -file:///C:/Users/ASUS/AppData/Local/Pub/Cache/hosted/pub.dev/firebase_storage_platform_interface-5.2.4/lib/ +file:///C:/Users/ASUS/AppData/Local/Pub/Cache/hosted/pub.dev/firebase_storage_platform_interface-5.2.5/ +file:///C:/Users/ASUS/AppData/Local/Pub/Cache/hosted/pub.dev/firebase_storage_platform_interface-5.2.5/lib/ firebase_storage_web 3.4 -file:///C:/Users/ASUS/AppData/Local/Pub/Cache/hosted/pub.dev/firebase_storage_web-3.10.11/ -file:///C:/Users/ASUS/AppData/Local/Pub/Cache/hosted/pub.dev/firebase_storage_web-3.10.11/lib/ +file:///C:/Users/ASUS/AppData/Local/Pub/Cache/hosted/pub.dev/firebase_storage_web-3.10.12/ +file:///C:/Users/ASUS/AppData/Local/Pub/Cache/hosted/pub.dev/firebase_storage_web-3.10.12/lib/ flutter_picker 2.12 file:///C:/Users/ASUS/AppData/Local/Pub/Cache/hosted/pub.dev/flutter_picker-2.1.0/ file:///C:/Users/ASUS/AppData/Local/Pub/Cache/hosted/pub.dev/flutter_picker-2.1.0/lib/ +flutter_plugin_android_lifecycle +3.5 +file:///C:/Users/ASUS/AppData/Local/Pub/Cache/hosted/pub.dev/flutter_plugin_android_lifecycle-2.0.26/ +file:///C:/Users/ASUS/AppData/Local/Pub/Cache/hosted/pub.dev/flutter_plugin_android_lifecycle-2.0.26/lib/ flutter_screenutil 2.17 file:///C:/Users/ASUS/AppData/Local/Pub/Cache/hosted/pub.dev/flutter_screenutil-5.9.3/ @@ -132,8 +152,8 @@ file:///C:/Users/ASUS/AppData/Local/Pub/Cache/hosted/pub.dev/flutter_switch-0.3. file:///C:/Users/ASUS/AppData/Local/Pub/Cache/hosted/pub.dev/flutter_switch-0.3.2/lib/ get 2.15 -file:///C:/Users/ASUS/AppData/Local/Pub/Cache/hosted/pub.dev/get-4.6.6/ -file:///C:/Users/ASUS/AppData/Local/Pub/Cache/hosted/pub.dev/get-4.6.6/lib/ +file:///C:/Users/ASUS/AppData/Local/Pub/Cache/hosted/pub.dev/get-4.7.2/ +file:///C:/Users/ASUS/AppData/Local/Pub/Cache/hosted/pub.dev/get-4.7.2/lib/ google_fonts 2.14 file:///C:/Users/ASUS/AppData/Local/Pub/Cache/hosted/pub.dev/google_fonts-6.2.1/ @@ -210,6 +230,30 @@ path_provider_windows 3.2 file:///C:/Users/ASUS/AppData/Local/Pub/Cache/hosted/pub.dev/path_provider_windows-2.3.0/ file:///C:/Users/ASUS/AppData/Local/Pub/Cache/hosted/pub.dev/path_provider_windows-2.3.0/lib/ +permission_handler +3.5 +file:///C:/Users/ASUS/AppData/Local/Pub/Cache/hosted/pub.dev/permission_handler-11.4.0/ +file:///C:/Users/ASUS/AppData/Local/Pub/Cache/hosted/pub.dev/permission_handler-11.4.0/lib/ +permission_handler_android +3.5 +file:///C:/Users/ASUS/AppData/Local/Pub/Cache/hosted/pub.dev/permission_handler_android-12.1.0/ +file:///C:/Users/ASUS/AppData/Local/Pub/Cache/hosted/pub.dev/permission_handler_android-12.1.0/lib/ +permission_handler_apple +2.15 +file:///C:/Users/ASUS/AppData/Local/Pub/Cache/hosted/pub.dev/permission_handler_apple-9.4.6/ +file:///C:/Users/ASUS/AppData/Local/Pub/Cache/hosted/pub.dev/permission_handler_apple-9.4.6/lib/ +permission_handler_html +3.3 +file:///C:/Users/ASUS/AppData/Local/Pub/Cache/hosted/pub.dev/permission_handler_html-0.1.3+5/ +file:///C:/Users/ASUS/AppData/Local/Pub/Cache/hosted/pub.dev/permission_handler_html-0.1.3+5/lib/ +permission_handler_platform_interface +3.5 +file:///C:/Users/ASUS/AppData/Local/Pub/Cache/hosted/pub.dev/permission_handler_platform_interface-4.3.0/ +file:///C:/Users/ASUS/AppData/Local/Pub/Cache/hosted/pub.dev/permission_handler_platform_interface-4.3.0/lib/ +permission_handler_windows +2.12 +file:///C:/Users/ASUS/AppData/Local/Pub/Cache/hosted/pub.dev/permission_handler_windows-0.2.1/ +file:///C:/Users/ASUS/AppData/Local/Pub/Cache/hosted/pub.dev/permission_handler_windows-0.2.1/lib/ petitparser 3.2 file:///C:/Users/ASUS/AppData/Local/Pub/Cache/hosted/pub.dev/petitparser-6.0.2/ @@ -228,12 +272,12 @@ file:///C:/Users/ASUS/AppData/Local/Pub/Cache/hosted/pub.dev/qr-3.0.2/ file:///C:/Users/ASUS/AppData/Local/Pub/Cache/hosted/pub.dev/qr-3.0.2/lib/ shared_preferences 3.5 -file:///C:/Users/ASUS/AppData/Local/Pub/Cache/hosted/pub.dev/shared_preferences-2.5.2/ -file:///C:/Users/ASUS/AppData/Local/Pub/Cache/hosted/pub.dev/shared_preferences-2.5.2/lib/ +file:///C:/Users/ASUS/AppData/Local/Pub/Cache/hosted/pub.dev/shared_preferences-2.5.3/ +file:///C:/Users/ASUS/AppData/Local/Pub/Cache/hosted/pub.dev/shared_preferences-2.5.3/lib/ shared_preferences_android 3.5 -file:///C:/Users/ASUS/AppData/Local/Pub/Cache/hosted/pub.dev/shared_preferences_android-2.4.6/ -file:///C:/Users/ASUS/AppData/Local/Pub/Cache/hosted/pub.dev/shared_preferences_android-2.4.6/lib/ +file:///C:/Users/ASUS/AppData/Local/Pub/Cache/hosted/pub.dev/shared_preferences_android-2.4.7/ +file:///C:/Users/ASUS/AppData/Local/Pub/Cache/hosted/pub.dev/shared_preferences_android-2.4.7/lib/ shared_preferences_foundation 3.4 file:///C:/Users/ASUS/AppData/Local/Pub/Cache/hosted/pub.dev/shared_preferences_foundation-2.5.4/ @@ -308,8 +352,16 @@ file:///C:/Users/ASUS/AppData/Local/Pub/Cache/hosted/pub.dev/vm_service-14.2.4/ file:///C:/Users/ASUS/AppData/Local/Pub/Cache/hosted/pub.dev/vm_service-14.2.4/lib/ web 3.4 -file:///C:/Users/ASUS/AppData/Local/Pub/Cache/hosted/pub.dev/web-1.1.0/ -file:///C:/Users/ASUS/AppData/Local/Pub/Cache/hosted/pub.dev/web-1.1.0/lib/ +file:///C:/Users/ASUS/AppData/Local/Pub/Cache/hosted/pub.dev/web-1.1.1/ +file:///C:/Users/ASUS/AppData/Local/Pub/Cache/hosted/pub.dev/web-1.1.1/lib/ +win32 +3.5 +file:///C:/Users/ASUS/AppData/Local/Pub/Cache/hosted/pub.dev/win32-5.10.1/ +file:///C:/Users/ASUS/AppData/Local/Pub/Cache/hosted/pub.dev/win32-5.10.1/lib/ +win32_registry +3.4 +file:///C:/Users/ASUS/AppData/Local/Pub/Cache/hosted/pub.dev/win32_registry-1.1.5/ +file:///C:/Users/ASUS/AppData/Local/Pub/Cache/hosted/pub.dev/win32_registry-1.1.5/lib/ xdg_directories 3.3 file:///C:/Users/ASUS/AppData/Local/Pub/Cache/hosted/pub.dev/xdg_directories-1.1.0/ diff --git a/android/app/build.gradle b/android/app/build.gradle index 31b48fc..4c6c31b 100644 --- a/android/app/build.gradle +++ b/android/app/build.gradle @@ -25,7 +25,7 @@ if (flutterVersionName == null) { android { namespace = "com.example.e_porter" - compileSdk = flutter.compileSdkVersion + compileSdk = 35 // flutter.compileSdkVersion ndkVersion = "25.1.8937393" compileOptions { diff --git a/android/app/src/main/AndroidManifest.xml b/android/app/src/main/AndroidManifest.xml index 21a975b..4bc3add 100644 --- a/android/app/src/main/AndroidManifest.xml +++ b/android/app/src/main/AndroidManifest.xml @@ -1,4 +1,17 @@ + + + + + + + + + diff --git a/lib/_core/component/icons/icons_library.dart b/lib/_core/component/icons/icons_library.dart index cb7ba16..8079369 100644 --- a/lib/_core/component/icons/icons_library.dart +++ b/lib/_core/component/icons/icons_library.dart @@ -51,6 +51,7 @@ class CustomeIcons { static SvgPicture AddUserFemaleOutline({double? size, Color? color}) => getIcon('ic_add_user_female', color: color); static SvgPicture LogoutOutline({double? size, Color? color}) => getIcon('ic_logout', color: color); static SvgPicture RemoveOutline({double? size, Color? color}) => getIcon('ic_remove', color: color); + static SvgPicture UploadOutline({double? size, Color? color}) => getIcon('ic_upload', color: color); static SvgPicture FlightSeatFilled({double? size, Color? color}) => getIcon('ic_flight_seat_filled', color: color); static SvgPicture PlaneRightFilled({double? size, Color? color}) => getIcon('ic_plane_filled', color: color); diff --git a/lib/_core/service/permission_service.dart b/lib/_core/service/permission_service.dart new file mode 100644 index 0000000..cf63dd4 --- /dev/null +++ b/lib/_core/service/permission_service.dart @@ -0,0 +1,70 @@ +import 'dart:developer'; +import 'dart:io'; + +import 'package:device_info_plus/device_info_plus.dart'; +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; +import 'package:permission_handler/permission_handler.dart'; + +class PermissionHelper { + static Future requestStoragePermission() async { + try { + PermissionStatus status; + + if (Platform.isAndroid) { + final androidInfo = await DeviceInfoPlugin().androidInfo; + + if (androidInfo.version.sdkInt >= 30) { + status = await Permission.manageExternalStorage.status; + if (status.isDenied || status.isRestricted || status.isLimited) { + status = await Permission.manageExternalStorage.request(); + } + } else { + status = await Permission.storage.status; + if (status.isDenied || status.isRestricted || status.isLimited) { + status = await Permission.storage.request(); + } + } + } else { + status = await Permission.storage.status; + if (status.isDenied || status.isRestricted || status.isLimited) { + status = await Permission.storage.request(); + } + } + + log('Final storage permission status: $status'); + + if (status.isGranted) { + return true; // Permission granted + } else if (status.isPermanentlyDenied) { + Get.snackbar( + 'Permission Denied', + 'Storage permission is required to download files. Please enable it in the settings.', + mainButton: TextButton( + onPressed: () async { + bool opened = await openAppSettings(); + if (!opened) { + Get.snackbar( + 'Settings Unavailable', + 'Could not open settings. Please enable the permission manually.', + snackPosition: SnackPosition.TOP, + ); + } + }, + child: Text('Open Settings'), + ), + snackPosition: SnackPosition.TOP, + ); + } else { + Get.snackbar( + 'Permission Denied', + 'Storage permission is required to download files.', + snackPosition: SnackPosition.TOP, + ); + } + } catch (e) { + log('Error checking permissions: $e'); + } + return false; + } +} diff --git a/lib/domain/models/upload_file_model.dart b/lib/domain/models/upload_file_model.dart new file mode 100644 index 0000000..0cca461 --- /dev/null +++ b/lib/domain/models/upload_file_model.dart @@ -0,0 +1,25 @@ +class UploadFileModel { + final String fileName; + final String filePath; + final int fileSize; + double progress; + String remainingTime; + FileUploadStatus status; + + UploadFileModel({ + required this.fileName, + required this.filePath, + required this.fileSize, + required this.progress, + required this.remainingTime, + required this.status, + }); +} + +// Status enum for file upload +enum FileUploadStatus { + pending, + uploading, + completed, + failed, +} \ No newline at end of file diff --git a/lib/presentation/screens/home/pages/payment_screen.dart b/lib/presentation/screens/home/pages/payment_screen.dart index da04034..e581780 100644 --- a/lib/presentation/screens/home/pages/payment_screen.dart +++ b/lib/presentation/screens/home/pages/payment_screen.dart @@ -6,9 +6,14 @@ import 'package:flutter/material.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:flutter_svg/flutter_svg.dart'; import 'package:get/get.dart'; -import 'package:zoom_tap_animation/zoom_tap_animation.dart'; - +import 'package:intl/intl.dart'; import '../../../../_core/component/button/button_fill.dart'; +import '../../../../_core/service/logger_service.dart'; +import '../../../../domain/models/porter_service_model.dart'; +import '../../../../domain/models/ticket_model.dart'; +import '../../../../domain/models/user_entity.dart'; +import '../../../controllers/ticket_controller.dart'; +import '../../routes/app_rountes.dart'; class PaymentScreen extends StatefulWidget { const PaymentScreen({super.key}); @@ -18,6 +23,55 @@ class PaymentScreen extends StatefulWidget { } class _PaymentScreenState extends State { + late final String ticketId; + late final String flightId; + late String? ticketDate; + late final int passenger; + late final List selectedPassengers; + late List numberSeat; + late List selectedServiceLabels; + late Map selectedPorterServices; + late double totalPrice; + late double grandTotal; + late double totalAll; + late String expiryTime; + + final TicketController ticketController = Get.find(); + FlightModel? flightData; + String? departureTime; + String? arrivalTime; + + @override + void initState() { + super.initState(); + final args = Get.arguments as Map; + ticketId = args['ticketId'] ?? ''; + flightId = args['flightId'] ?? ''; + ticketDate = args['date']; + passenger = args['passenger'] ?? 0; + selectedPassengers = args['selectedPassenger'] ?? []; + numberSeat = args['numberSeat'] ?? ''; + totalPrice = args['totalPrice'] ?? 0.0; + grandTotal = args['grandTotal'] ?? 0.0; + totalAll = args['totalAll'] ?? 0.0; + selectedServiceLabels = args['selectedServiceLabels'] ?? []; + selectedPorterServices = args['selectedPorterServices'] ?? {}; + expiryTime = args['expiryTime'] ?? ''; + + fetchDataFlight(); + } + + Future fetchDataFlight() async { + try { + FlightModel flight = await ticketController.getFlightById(ticketId: ticketId, flightId: flightId); + setState(() { + flightData = flight; + }); + } catch (e) { + logger.e('Terjadi kesalahan: $e'); + } + } + @override Widget build(BuildContext context) { return Scaffold( @@ -42,14 +96,21 @@ class _PaymentScreenState extends State { children: [ TypographyStyles.h5("E-Porter", color: GrayColors.gray800), SizedBox(height: 10.h), - TypographyStyles.body("Citilink (103)", color: GrayColors.gray800, fontWeight: FontWeight.w400), + TypographyStyles.body( + "${flightData?.airLines} (${flightData?.code})", + color: GrayColors.gray800, + fontWeight: FontWeight.w400, + ), SizedBox(height: 16.h), - TypographyStyles.h5("Rp 2.460.000", color: GrayColors.gray800), + TypographyStyles.h5( + "Rp ${NumberFormat.decimalPattern('id_ID').format(totalAll)}", + color: GrayColors.gray800, + ), SizedBox(height: 32.h), SvgPicture.asset('assets/images/qris.svg'), SizedBox(height: 20.h), TypographyStyles.small( - "Berlaku hingga : 28 Januari 2025, 16:40", + "Berlaku hingga : $expiryTime", color: GrayColors.gray600, fontWeight: FontWeight.w400, ) @@ -60,14 +121,12 @@ class _PaymentScreenState extends State { ), ), bottomNavigationBar: CustomeShadowCotainner( - child: ZoomTapAnimation( - child: ButtonFill( - text: 'Lanjutkan', - textColor: Colors.white, - onTap: () { - // Get.toNamed(Routes.TICKETBOOKINGSTEP2); - }, - ), + child: ButtonFill( + text: 'Lanjutkan', + textColor: Colors.white, + onTap: () { + Get.toNamed(Routes.UPLOADFILE); + }, ), ), ); diff --git a/lib/presentation/screens/home/pages/ticket_booking_step4_screen.dart b/lib/presentation/screens/home/pages/ticket_booking_step4_screen.dart index 6107be3..4d08ef3 100644 --- a/lib/presentation/screens/home/pages/ticket_booking_step4_screen.dart +++ b/lib/presentation/screens/home/pages/ticket_booking_step4_screen.dart @@ -1,3 +1,5 @@ +import 'dart:developer'; + import 'package:e_porter/_core/component/card/custome_shadow_cotainner.dart'; import 'package:e_porter/_core/constants/colors.dart'; import 'package:e_porter/_core/constants/typography.dart'; @@ -217,6 +219,10 @@ class _TicketBookingStep4ScreenState extends State { labelButton: "Buat Pesanan", iconButton: CustomeIcons.ProtectOutline(color: Colors.white), onTap: () { + final DateTime currentTime = DateTime.now(); + final DateTime expiryTime = currentTime.add(Duration(hours: 1)); + final String formattedExpiryTime = + "${DateFormat('dd MMMM yyyy', 'en_US').format(expiryTime)}, ${DateFormat.Hm().format(expiryTime)}"; final argument = { 'ticketId': ticketId, 'flightId': flightId, @@ -228,6 +234,8 @@ class _TicketBookingStep4ScreenState extends State { 'grandTotal': grandTotal, 'selectedServiceLabels': selectedServiceLabels, 'selectedPorterServices': selectedPorterServices, + 'totalAll': totalAll(), + 'expiryTime': formattedExpiryTime, }; Get.toNamed(Routes.PAYMENT, arguments: argument); }, @@ -293,7 +301,7 @@ class _TicketBookingStep4ScreenState extends State { width: 40.w, height: 26.h, errorBuilder: (context, error, stackTrace) { - print("Error loading image: $error"); + log("Error loading image: $error"); return Container( width: 40.w, height: 10.h, diff --git a/lib/presentation/screens/home/pages/upload_file_screen.dart b/lib/presentation/screens/home/pages/upload_file_screen.dart new file mode 100644 index 0000000..fafb671 --- /dev/null +++ b/lib/presentation/screens/home/pages/upload_file_screen.dart @@ -0,0 +1,379 @@ +import 'package:e_porter/_core/constants/colors.dart'; +import 'package:e_porter/_core/constants/typography.dart'; +import 'package:e_porter/_core/service/permission_service.dart'; +import 'package:file_picker/file_picker.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_screenutil/flutter_screenutil.dart'; +import 'package:flutter_svg/svg.dart'; +import 'package:get/get.dart'; +import 'package:zoom_tap_animation/zoom_tap_animation.dart'; + +import '../../../../_core/component/appbar/appbar_component.dart'; +import '../../../../_core/component/button/button_fill.dart'; +import '../../../../_core/component/card/custome_shadow_cotainner.dart'; +import '../../../../domain/models/upload_file_model.dart'; + +class UploadFileScreen extends StatefulWidget { + const UploadFileScreen({super.key}); + + @override + State createState() => _UploadFileScreenState(); +} + +class _UploadFileScreenState extends State { + final List uploadedFiles = []; + bool isUploading = false; + + @override + Widget build(BuildContext context) { + return Scaffold( + backgroundColor: GrayColors.gray50, + appBar: DefaultAppbarComponent( + title: 'Upload Bukti Pembayaran', + textColor: Colors.white, + backgroundColors: PrimaryColors.primary800, + onTab: () { + Get.back(); + }, + ), + body: SafeArea( + child: Padding( + padding: EdgeInsets.symmetric(horizontal: 16.w, vertical: 20.h), + child: SingleChildScrollView( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Container( + width: double.infinity, + padding: EdgeInsets.symmetric(horizontal: 16.w, vertical: 16.h), + decoration: BoxDecoration( + color: PrimaryColors.primary50, + borderRadius: BorderRadius.circular(10.r), + border: Border.all(width: 1.w, color: PrimaryColors.primary800), + ), + child: Column( + children: [ + SvgPicture.asset('assets/icons/ic_upload.svg', width: 32.w, height: 32.h), + SizedBox(height: 8.h), + TypographyStyles.body('Upload Bukti Pembayaran disini', color: GrayColors.gray800), + SizedBox(height: 16.h), + ZoomTapAnimation( + child: GestureDetector( + onTap: () => _pickFile(), + child: Container( + padding: EdgeInsets.symmetric(horizontal: 16.w, vertical: 10.h), + decoration: BoxDecoration( + color: GrayColors.gray300, + borderRadius: BorderRadius.circular(8.r), + ), + child: TypographyStyles.caption('Pilih File', color: GrayColors.gray800), + ), + ), + ) + ], + ), + ), + SizedBox(height: 10.h), + TypographyStyles.small( + 'Silahkan upload bukti pembayaran anda disini', + color: GrayColors.gray500, + fontWeight: FontWeight.w400, + ), + SizedBox(height: 32.h), + TypographyStyles.body('Upload File', color: GrayColors.gray800), + SizedBox(height: 16.h), + Column( + children: uploadedFiles.isEmpty + ? [_buildEmptyState()] + : uploadedFiles.map((file) => _buildFileItem(file)).toList(), + ), + ], + ), + ), + ), + ), + bottomNavigationBar: CustomeShadowCotainner( + child: ButtonFill( + text: 'Upload', + textColor: Colors.white, + onTap: () { + if (uploadedFiles.isNotEmpty) { + _submitFiles(); + } else { + Get.snackbar( + 'Peringatan', + 'Silahkan pilih file terlebih dahulu', + backgroundColor: Colors.red, + colorText: Colors.white, + ); + } + }, + ), + ), + ); + } + + Widget _buildEmptyState() { + return Container( + height: 100.h, + width: double.infinity, + alignment: Alignment.center, + child: TypographyStyles.caption( + 'Belum ada file yang dipilih', + color: GrayColors.gray500, + ), + ); + } + + Widget _buildFileItem(UploadFileModel file) { + IconData fileIcon; + + if (file.fileName.toLowerCase().endsWith('.zip')) { + fileIcon = Icons.folder_zip_outlined; + } else if (file.fileName.toLowerCase().endsWith('.jpg') || + file.fileName.toLowerCase().endsWith('.jpeg') || + file.fileName.toLowerCase().endsWith('.png')) { + fileIcon = Icons.image_outlined; + } else if (file.fileName.toLowerCase().endsWith('.mp4') || file.fileName.toLowerCase().endsWith('.mov')) { + fileIcon = Icons.video_file_outlined; + } else { + fileIcon = Icons.insert_drive_file_outlined; + } + + return Container( + margin: EdgeInsets.only(bottom: 12.h), + padding: EdgeInsets.all(12.r), + decoration: BoxDecoration( + color: Colors.white, + borderRadius: BorderRadius.circular(8.r), + boxShadow: [ + BoxShadow( + color: Colors.black.withOpacity(0.05), + blurRadius: 4.r, + offset: Offset(0, 2), + ), + ], + ), + child: Column( + children: [ + Row( + children: [ + Icon(fileIcon, size: 24.r, color: GrayColors.gray700), + SizedBox(width: 12.w), + Expanded( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + TypographyStyles.small(file.fileName, color: GrayColors.gray800, fontWeight: FontWeight.w500), + SizedBox(height: 4.h), + Row( + children: [ + TypographyStyles.caption( + '${(file.fileSize / (1024 * 1024)).toStringAsFixed(1)} mb', + color: file.status == FileUploadStatus.failed ? Colors.red : GrayColors.gray600, + fontWeight: FontWeight.w400, + ), + if (file.status == FileUploadStatus.uploading) + Padding( + padding: EdgeInsets.only(left: 8.w), + child: TypographyStyles.caption( + '| ${file.progress}% - ${file.remainingTime} sec left', + color: GrayColors.gray600, + fontWeight: FontWeight.w400, + ), + ), + if (file.status == FileUploadStatus.failed) + Padding( + padding: EdgeInsets.only(left: 8.w), + child: TypographyStyles.caption( + 'Upload failed', + color: Colors.red, + fontWeight: FontWeight.w400, + ), + ), + ], + ), + ], + ), + ), + Row( + children: [ + if (file.status == FileUploadStatus.failed) + IconButton( + icon: Icon(Icons.refresh, size: 20.r, color: GrayColors.gray600), + onPressed: () => _retryUpload(file), + ), + IconButton( + icon: Icon(Icons.delete_outline, size: 20.r, color: GrayColors.gray600), + onPressed: () => _removeFile(file), + ), + ], + ), + ], + ), + if (file.status == FileUploadStatus.uploading) ...[ + SizedBox(height: 8.h), + LinearProgressIndicator( + value: file.progress / 100, + backgroundColor: GrayColors.gray200, + valueColor: AlwaysStoppedAnimation(PrimaryColors.primary600), + ), + ], + ], + ), + ); + } + + Future _pickFile() async { + bool permissionGranted = await PermissionHelper.requestStoragePermission(); + if (!permissionGranted) { + Get.snackbar( + 'Permission Denied', + 'Storage permission is required to select files.', + backgroundColor: Colors.red, + colorText: Colors.white, + ); + return; + } + + try { + FilePickerResult? result = await FilePicker.platform.pickFiles( + type: FileType.custom, + allowedExtensions: ['jpg', 'jpeg', 'png', 'pdf', 'zip', 'mp4'], + ); + + if (result != null) { + final file = result.files.first; + final newFile = UploadFileModel( + fileName: file.name, + filePath: file.path!, + fileSize: file.size, + progress: 0, + remainingTime: '0', + status: FileUploadStatus.pending, + ); + + setState(() { + uploadedFiles.add(newFile); + }); + + // Simulasikan proses loading lokal + _simulateLocalLoading(newFile); + } + } catch (e) { + print('Error picking file: $e'); + Get.snackbar( + 'Error', + 'Terjadi kesalahan saat memilih file', + backgroundColor: Colors.red, + colorText: Colors.white, + ); + } +} + + + void _simulateLocalLoading(UploadFileModel file) { + setState(() { + file.status = FileUploadStatus.uploading; + }); + + // Simulate progressing upload - in a real app this would be actual file reading/processing + int progress = 0; + Future.doWhile(() async { + if (progress >= 100) return false; + + await Future.delayed(Duration(milliseconds: 100)); + progress += 5; + + if (mounted) { + setState(() { + file.progress = progress.toDouble(); + file.remainingTime = ((100 - progress) ~/ 10).toString(); + }); + } + + return progress < 100 && file.status == FileUploadStatus.uploading; + }).then((_) { + if (mounted && file.status == FileUploadStatus.uploading) { + setState(() { + // Simulate some files failing to upload for demonstration + if (file.fileName.contains('Icon-Set')) { + file.status = FileUploadStatus.failed; + } else { + file.status = FileUploadStatus.completed; + } + }); + } + }); + } + + void _retryUpload(UploadFileModel file) { + setState(() { + file.progress = 0; + file.remainingTime = '0'; + }); + _simulateLocalLoading(file); + } + + void _removeFile(UploadFileModel file) { + setState(() { + uploadedFiles.remove(file); + }); + } + + void _submitFiles() { + // Check if all files are uploaded successfully + bool allCompleted = uploadedFiles.every((file) => file.status == FileUploadStatus.completed); + + if (!allCompleted) { + Get.dialog( + AlertDialog( + title: Text('Peringatan'), + content: Text('Beberapa file belum selesai diupload. Apakah Anda ingin melanjutkan?'), + actions: [ + TextButton( + onPressed: () => Get.back(), + child: Text('Batal'), + ), + TextButton( + onPressed: () { + Get.back(); + _uploadToServer(); + }, + child: Text('Lanjutkan'), + ), + ], + ), + ); + } else { + _uploadToServer(); + } + } + + void _uploadToServer() { + // Simulate uploading to server + Get.snackbar( + 'Info', + 'Mengupload bukti pembayaran...', + backgroundColor: PrimaryColors.primary600, + colorText: Colors.white, + ); + + // Here you would actually send the files to your server + // For now, let's just simulate a successful upload + Future.delayed(Duration(seconds: 2), () { + Get.snackbar( + 'Sukses', + 'Bukti pembayaran berhasil diupload', + backgroundColor: Colors.green, + colorText: Colors.white, + ); + + // Navigate back or to a success screen + Future.delayed(Duration(seconds: 1), () { + // Get.offNamed(Routes.SUCCESS_SCREEN); + Get.back(); + }); + }); + } +} diff --git a/lib/presentation/screens/routes/app_rountes.dart b/lib/presentation/screens/routes/app_rountes.dart index f154988..808227a 100644 --- a/lib/presentation/screens/routes/app_rountes.dart +++ b/lib/presentation/screens/routes/app_rountes.dart @@ -22,6 +22,7 @@ import 'package:e_porter/presentation/screens/home/pages/ticket_booking_step1_sc import 'package:e_porter/presentation/screens/home/pages/ticket_booking_step2_screen.dart'; import 'package:e_porter/presentation/screens/home/pages/ticket_booking_step3_screen.dart'; import 'package:e_porter/presentation/screens/home/pages/ticket_booking_step4_screen.dart'; +import 'package:e_porter/presentation/screens/home/pages/upload_file_screen.dart'; import 'package:e_porter/presentation/screens/navigation/main_navigation.dart'; import 'package:e_porter/presentation/screens/onboarding/onboarding_screen.dart'; import 'package:e_porter/presentation/screens/profile/pages/profile_screen.dart'; @@ -120,6 +121,10 @@ class AppRoutes { name: Routes.PAYMENT, page: () => PaymentScreen(), ), + GetPage( + name: Routes.UPLOADFILE, + page: () => UploadFileScreen(), + ), GetPage( name: Routes.TRANSACTIONHISTORY, page: () => transactionHistory(), @@ -161,6 +166,7 @@ class Routes { static const TICKETBOOKINGSTEP4 = '/ticket_booking_step4'; static const CHOOSECHAIR = '/choose_chair'; static const PAYMENT = '/payment'; + static const UPLOADFILE = '/upload_file'; static const TRANSACTIONHISTORY = '/transaction_history'; static const DETAILTICKET = '/detail_ticket'; static const PRINTBOARDINGPASS = '/print_boarding_pass'; diff --git a/macos/Flutter/GeneratedPluginRegistrant.swift b/macos/Flutter/GeneratedPluginRegistrant.swift index 623151b..3a00b9d 100644 --- a/macos/Flutter/GeneratedPluginRegistrant.swift +++ b/macos/Flutter/GeneratedPluginRegistrant.swift @@ -6,6 +6,8 @@ import FlutterMacOS import Foundation import cloud_firestore +import device_info_plus +import file_picker import firebase_auth import firebase_core import firebase_storage @@ -14,6 +16,8 @@ import shared_preferences_foundation func RegisterGeneratedPlugins(registry: FlutterPluginRegistry) { FLTFirebaseFirestorePlugin.register(with: registry.registrar(forPlugin: "FLTFirebaseFirestorePlugin")) + DeviceInfoPlusMacosPlugin.register(with: registry.registrar(forPlugin: "DeviceInfoPlusMacosPlugin")) + FilePickerPlugin.register(with: registry.registrar(forPlugin: "FilePickerPlugin")) FLTFirebaseAuthPlugin.register(with: registry.registrar(forPlugin: "FLTFirebaseAuthPlugin")) FLTFirebaseCorePlugin.register(with: registry.registrar(forPlugin: "FLTFirebaseCorePlugin")) FLTFirebaseStoragePlugin.register(with: registry.registrar(forPlugin: "FLTFirebaseStoragePlugin")) diff --git a/pubspec.lock b/pubspec.lock index 164e04e..b45003c 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -5,18 +5,18 @@ packages: dependency: transitive description: name: _flutterfire_internals - sha256: "7fd72d77a7487c26faab1d274af23fb008763ddc10800261abbfb2c067f183d5" + sha256: de9ecbb3ddafd446095f7e833c853aff2fa1682b017921fe63a833f9d6f0e422 url: "https://pub.dev" source: hosted - version: "1.3.53" + version: "1.3.54" args: dependency: transitive description: name: args - sha256: bf9f5caeea8d8fe6721a9c358dd8a5c1947b27f1cfaa18b39c301273594919e6 + sha256: d0481093c50b1da8910eb0bb301626d4d8eb7284aa739614d2b394ee09e3ea04 url: "https://pub.dev" source: hosted - version: "2.6.0" + version: "2.7.0" async: dependency: transitive description: @@ -77,26 +77,26 @@ packages: dependency: "direct main" description: name: cloud_firestore - sha256: "8dfe49146560af035314477995bdfb4a7104f33cb7f881748572fbda38ecfa55" + sha256: "89a5e32716794b6a8d0ec1b5dfda988194e92daedaa3f3bed66fa0d0a595252e" url: "https://pub.dev" source: hosted - version: "5.6.4" + version: "5.6.6" cloud_firestore_platform_interface: dependency: transitive description: name: cloud_firestore_platform_interface - sha256: dc0bcc3239a4feaa4b7b184dc4b689bc97e6cea1a8320ee0d7ee64b3607858ea + sha256: "9f012844eb59be6827ed97415875c5a29ccacd28bc79bf85b4680738251a33df" url: "https://pub.dev" source: hosted - version: "6.6.4" + version: "6.6.6" cloud_firestore_web: dependency: transitive description: name: cloud_firestore_web - sha256: "5091ed6771c886c9a93b1ec1ffa61770056210f1a3312095a73a5a4bab0c6a9f" + sha256: b8b754269be0e907acd9ff63ad60f66b84c78d330ca1d7e474f86c9527ddc803 url: "https://pub.dev" source: hosted - version: "4.4.4" + version: "4.4.6" collection: dependency: transitive description: @@ -105,6 +105,14 @@ packages: url: "https://pub.dev" source: hosted version: "1.18.0" + cross_file: + dependency: transitive + description: + name: cross_file + sha256: "7caf6a750a0c04effbb52a676dce9a4a592e10ad35c34d6d2d0e4811160d5670" + url: "https://pub.dev" + source: hosted + version: "0.3.4+2" crypto: dependency: transitive description: @@ -121,6 +129,22 @@ packages: url: "https://pub.dev" source: hosted version: "1.0.8" + device_info_plus: + dependency: "direct main" + description: + name: device_info_plus + sha256: "72d146c6d7098689ff5c5f66bcf593ac11efc530095385356e131070333e64da" + url: "https://pub.dev" + source: hosted + version: "11.3.0" + device_info_plus_platform_interface: + dependency: transitive + description: + name: device_info_plus_platform_interface + sha256: "0b04e02b30791224b31969eb1b50d723498f402971bff3630bca2ba839bd1ed2" + url: "https://pub.dev" + source: hosted + version: "7.0.2" dotted_dashed_line: dependency: "direct main" description: @@ -161,38 +185,46 @@ packages: url: "https://pub.dev" source: hosted version: "7.0.1" + file_picker: + dependency: "direct main" + description: + name: file_picker + sha256: "36a1652d99cb6bf8ccc8b9f43aded1fd60b234d23ce78af422c07f950a436ef7" + url: "https://pub.dev" + source: hosted + version: "10.0.0" firebase_auth: dependency: "direct main" description: name: firebase_auth - sha256: "91587615d7d9165c65a030426e3cf40bbec37c486f52ff654af17aba5be3d208" + sha256: "54c62b2d187709114dd09ce658a8803ee91f9119b0e0d3fc2245130ad9bff9ad" url: "https://pub.dev" source: hosted - version: "5.5.1" + version: "5.5.2" firebase_auth_platform_interface: dependency: transitive description: name: firebase_auth_platform_interface - sha256: "1dcf1dbdd90fe97fa37ab3631b561bf584adb88f6be0b0dd915fff799ad53192" + sha256: "5402d13f4bb7f29f2fb819f3b6b5a5a56c9f714aef2276546d397e25ac1b6b8e" url: "https://pub.dev" source: hosted - version: "7.6.1" + version: "7.6.2" firebase_auth_web: dependency: transitive description: name: firebase_auth_web - sha256: "3774cb13547e28b180fed2a5e696b4b36f97f4b1fadc7b04a0200e5009344d98" + sha256: "2be496911f0807895d5fe8067b70b7d758142dd7fb26485cbe23e525e2547764" url: "https://pub.dev" source: hosted - version: "5.14.1" + version: "5.14.2" firebase_core: dependency: "direct main" description: name: firebase_core - sha256: f4d8f49574a4e396f34567f3eec4d38ab9c3910818dec22ca42b2a467c685d8b + sha256: "017d17d9915670e6117497e640b2859e0b868026ea36bf3a57feb28c3b97debe" url: "https://pub.dev" source: hosted - version: "3.12.1" + version: "3.13.0" firebase_core_platform_interface: dependency: transitive description: @@ -205,34 +237,34 @@ packages: dependency: transitive description: name: firebase_core_web - sha256: faa5a76f6380a9b90b53bc3bdcb85bc7926a382e0709b9b5edac9f7746651493 + sha256: "129a34d1e0fb62e2b488d988a1fc26cc15636357e50944ffee2862efe8929b23" url: "https://pub.dev" source: hosted - version: "2.21.1" + version: "2.22.0" firebase_storage: dependency: "direct main" description: name: firebase_storage - sha256: "2274bb277d0d56d4a106fd89bad5e8f7c005bae77dc3df5abd36101957010840" + sha256: b66435730252985c49aabe83e0490bcfab2e7b3f2192bf421ca596fa490de14a url: "https://pub.dev" source: hosted - version: "12.4.4" + version: "12.4.5" firebase_storage_platform_interface: dependency: transitive description: name: firebase_storage_platform_interface - sha256: "36ed6ebc2453a500c6d1e63c8126459056a70a798d53636242b0325951814cf5" + sha256: "08d32cae58200c34f504098d106952213f2e4c32db111ae7757a86887428ab81" url: "https://pub.dev" source: hosted - version: "5.2.4" + version: "5.2.5" firebase_storage_web: dependency: transitive description: name: firebase_storage_web - sha256: e169fc825cbd91c70d73f75b7e8be9ada272b4297184f779ca124b42945828fe + sha256: d6aee6867f8c369a88484367a8b1f0f6d0f022b4ff2622b51e32dfeef839f9d4 url: "https://pub.dev" source: hosted - version: "3.10.11" + version: "3.10.12" flutter: dependency: "direct main" description: flutter @@ -246,6 +278,14 @@ packages: url: "https://pub.dev" source: hosted version: "2.1.0" + flutter_plugin_android_lifecycle: + dependency: transitive + description: + name: flutter_plugin_android_lifecycle + sha256: "1c2b787f99bdca1f3718543f81d38aa1b124817dfeb9fb196201bea85b6134bf" + url: "https://pub.dev" + source: hosted + version: "2.0.26" flutter_screenutil: dependency: "direct main" description: @@ -284,10 +324,10 @@ packages: dependency: "direct main" description: name: get - sha256: e4e7335ede17452b391ed3b2ede016545706c01a02292a6c97619705e7d2a85e + sha256: c79eeb4339f1f3deffd9ec912f8a923834bec55f7b49c9e882b8fef2c139d425 url: "https://pub.dev" source: hosted - version: "4.6.6" + version: "4.7.2" google_fonts: dependency: "direct main" description: @@ -377,7 +417,7 @@ packages: source: hosted version: "1.15.0" path: - dependency: transitive + dependency: "direct main" description: name: path sha256: "087ce49c3f0dc39180befefc60fdb4acd8f8620e5682fe2476afd0b3688bb4af" @@ -440,6 +480,54 @@ packages: url: "https://pub.dev" source: hosted version: "2.3.0" + permission_handler: + dependency: "direct main" + description: + name: permission_handler + sha256: "59adad729136f01ea9e35a48f5d1395e25cba6cea552249ddbe9cf950f5d7849" + url: "https://pub.dev" + source: hosted + version: "11.4.0" + permission_handler_android: + dependency: transitive + description: + name: permission_handler_android + sha256: d3971dcdd76182a0c198c096b5db2f0884b0d4196723d21a866fc4cdea057ebc + url: "https://pub.dev" + source: hosted + version: "12.1.0" + permission_handler_apple: + dependency: transitive + description: + name: permission_handler_apple + sha256: f84a188e79a35c687c132a0a0556c254747a08561e99ab933f12f6ca71ef3c98 + url: "https://pub.dev" + source: hosted + version: "9.4.6" + permission_handler_html: + dependency: transitive + description: + name: permission_handler_html + sha256: "38f000e83355abb3392140f6bc3030660cfaef189e1f87824facb76300b4ff24" + url: "https://pub.dev" + source: hosted + version: "0.1.3+5" + permission_handler_platform_interface: + dependency: transitive + description: + name: permission_handler_platform_interface + sha256: eb99b295153abce5d683cac8c02e22faab63e50679b937fa1bf67d58bb282878 + url: "https://pub.dev" + source: hosted + version: "4.3.0" + permission_handler_windows: + dependency: transitive + description: + name: permission_handler_windows + sha256: "1a790728016f79a41216d88672dbc5df30e686e811ad4e698bfc51f76ad91f1e" + url: "https://pub.dev" + source: hosted + version: "0.2.1" petitparser: dependency: transitive description: @@ -476,18 +564,18 @@ packages: dependency: "direct main" description: name: shared_preferences - sha256: "846849e3e9b68f3ef4b60c60cf4b3e02e9321bc7f4d8c4692cf87ffa82fc8a3a" + sha256: "6e8bf70b7fef813df4e9a36f658ac46d107db4b4cfe1048b477d4e453a8159f5" url: "https://pub.dev" source: hosted - version: "2.5.2" + version: "2.5.3" shared_preferences_android: dependency: transitive description: name: shared_preferences_android - sha256: a768fc8ede5f0c8e6150476e14f38e2417c0864ca36bb4582be8e21925a03c22 + sha256: "9f9f3d372d4304723e6136663bb291c0b93f5e4c8a4a6314347f481a33bda2b1" url: "https://pub.dev" source: hosted - version: "2.4.6" + version: "2.4.7" shared_preferences_foundation: dependency: transitive description: @@ -641,10 +729,26 @@ packages: dependency: transitive description: name: web - sha256: cd3543bd5798f6ad290ea73d210f423502e71900302dde696f8bff84bf89a1cb + sha256: "868d88a33d8a87b18ffc05f9f030ba328ffefba92d6c127917a2ba740f9cfe4a" url: "https://pub.dev" source: hosted - version: "1.1.0" + version: "1.1.1" + win32: + dependency: transitive + description: + name: win32 + sha256: daf97c9d80197ed7b619040e86c8ab9a9dad285e7671ee7390f9180cc828a51e + url: "https://pub.dev" + source: hosted + version: "5.10.1" + win32_registry: + dependency: transitive + description: + name: win32_registry + sha256: "21ec76dfc731550fd3e2ce7a33a9ea90b828fdf19a5c3bcf556fa992cfa99852" + url: "https://pub.dev" + source: hosted + version: "1.1.5" xdg_directories: dependency: transitive description: diff --git a/pubspec.yaml b/pubspec.yaml index 40f697f..b31c926 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -53,6 +53,10 @@ dependencies: google_fonts: ^6.2.1 dotted_dashed_line: ^0.0.3 barcode_widget: ^2.0.4 + file_picker: ^10.0.0 + path: ^1.9.0 + permission_handler: ^11.4.0 + device_info_plus: ^11.3.0 # pin_code_fields: ^8.0.1 # dio: ^5.8.0+1 diff --git a/windows/flutter/generated_plugin_registrant.cc b/windows/flutter/generated_plugin_registrant.cc index ff5147a..124f904 100644 --- a/windows/flutter/generated_plugin_registrant.cc +++ b/windows/flutter/generated_plugin_registrant.cc @@ -10,6 +10,7 @@ #include #include #include +#include void RegisterPlugins(flutter::PluginRegistry* registry) { CloudFirestorePluginCApiRegisterWithRegistrar( @@ -20,4 +21,6 @@ void RegisterPlugins(flutter::PluginRegistry* registry) { registry->GetRegistrarForPlugin("FirebaseCorePluginCApi")); FirebaseStoragePluginCApiRegisterWithRegistrar( registry->GetRegistrarForPlugin("FirebaseStoragePluginCApi")); + PermissionHandlerWindowsPluginRegisterWithRegistrar( + registry->GetRegistrarForPlugin("PermissionHandlerWindowsPlugin")); } diff --git a/windows/flutter/generated_plugins.cmake b/windows/flutter/generated_plugins.cmake index fb0d4f3..aa86fdf 100644 --- a/windows/flutter/generated_plugins.cmake +++ b/windows/flutter/generated_plugins.cmake @@ -7,6 +7,7 @@ list(APPEND FLUTTER_PLUGIN_LIST firebase_auth firebase_core firebase_storage + permission_handler_windows ) list(APPEND FLUTTER_FFI_PLUGIN_LIST