diff --git a/ios/Flutter/Debug.xcconfig b/ios/Flutter/Debug.xcconfig index 592ceee..ec97fc6 100644 --- a/ios/Flutter/Debug.xcconfig +++ b/ios/Flutter/Debug.xcconfig @@ -1 +1,2 @@ +#include? "Pods/Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig" #include "Generated.xcconfig" diff --git a/ios/Flutter/Release.xcconfig b/ios/Flutter/Release.xcconfig index 592ceee..c4855bf 100644 --- a/ios/Flutter/Release.xcconfig +++ b/ios/Flutter/Release.xcconfig @@ -1 +1,2 @@ +#include? "Pods/Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig" #include "Generated.xcconfig" diff --git a/ios/Podfile b/ios/Podfile new file mode 100644 index 0000000..88359b2 --- /dev/null +++ b/ios/Podfile @@ -0,0 +1,41 @@ +# Uncomment this line to define a global platform for your project +# platform :ios, '11.0' + +# CocoaPods analytics sends network stats synchronously affecting flutter build latency. +ENV['COCOAPODS_DISABLE_STATS'] = 'true' + +project 'Runner', { + 'Debug' => :debug, + 'Profile' => :release, + 'Release' => :release, +} + +def flutter_root + generated_xcode_build_settings_path = File.expand_path(File.join('..', 'Flutter', 'Generated.xcconfig'), __FILE__) + unless File.exist?(generated_xcode_build_settings_path) + raise "#{generated_xcode_build_settings_path} must exist. If you're running pod install manually, make sure flutter pub get is executed first" + end + + File.foreach(generated_xcode_build_settings_path) do |line| + matches = line.match(/FLUTTER_ROOT\=(.*)/) + return matches[1].strip if matches + end + raise "FLUTTER_ROOT not found in #{generated_xcode_build_settings_path}. Try deleting Generated.xcconfig, then run flutter pub get" +end + +require File.expand_path(File.join('packages', 'flutter_tools', 'bin', 'podhelper'), flutter_root) + +flutter_ios_podfile_setup + +target 'Runner' do + use_frameworks! + use_modular_headers! + + flutter_install_all_ios_pods File.dirname(File.realpath(__FILE__)) +end + +post_install do |installer| + installer.pods_project.targets.each do |target| + flutter_additional_ios_build_settings(target) + end +end diff --git a/ios/Podfile.lock b/ios/Podfile.lock new file mode 100644 index 0000000..8fa5b72 --- /dev/null +++ b/ios/Podfile.lock @@ -0,0 +1,87 @@ +PODS: + - barcode_scan2 (0.0.1): + - Flutter + - MTBBarcodeScanner + - SwiftProtobuf + - easy_app_installer (0.0.1): + - Flutter + - Flutter (1.0.0) + - fluttertoast (0.0.2): + - Flutter + - Toast + - FMDB (2.7.5): + - FMDB/standard (= 2.7.5) + - FMDB/standard (2.7.5) + - MTBBarcodeScanner (5.0.11) + - package_info_plus (0.4.5): + - Flutter + - path_provider_foundation (0.0.1): + - Flutter + - FlutterMacOS + - permission_handler_apple (9.0.4): + - Flutter + - shared_preferences_foundation (0.0.1): + - Flutter + - FlutterMacOS + - sqflite (0.0.2): + - Flutter + - FMDB (>= 2.7.5) + - SwiftProtobuf (1.20.3) + - Toast (4.0.0) + +DEPENDENCIES: + - barcode_scan2 (from `.symlinks/plugins/barcode_scan2/ios`) + - easy_app_installer (from `.symlinks/plugins/easy_app_installer/ios`) + - Flutter (from `Flutter`) + - fluttertoast (from `.symlinks/plugins/fluttertoast/ios`) + - package_info_plus (from `.symlinks/plugins/package_info_plus/ios`) + - path_provider_foundation (from `.symlinks/plugins/path_provider_foundation/ios`) + - permission_handler_apple (from `.symlinks/plugins/permission_handler_apple/ios`) + - shared_preferences_foundation (from `.symlinks/plugins/shared_preferences_foundation/ios`) + - sqflite (from `.symlinks/plugins/sqflite/ios`) + +SPEC REPOS: + trunk: + - FMDB + - MTBBarcodeScanner + - SwiftProtobuf + - Toast + +EXTERNAL SOURCES: + barcode_scan2: + :path: ".symlinks/plugins/barcode_scan2/ios" + easy_app_installer: + :path: ".symlinks/plugins/easy_app_installer/ios" + Flutter: + :path: Flutter + fluttertoast: + :path: ".symlinks/plugins/fluttertoast/ios" + package_info_plus: + :path: ".symlinks/plugins/package_info_plus/ios" + path_provider_foundation: + :path: ".symlinks/plugins/path_provider_foundation/ios" + permission_handler_apple: + :path: ".symlinks/plugins/permission_handler_apple/ios" + shared_preferences_foundation: + :path: ".symlinks/plugins/shared_preferences_foundation/ios" + sqflite: + :path: ".symlinks/plugins/sqflite/ios" + +SPEC CHECKSUMS: + barcode_scan2: 0af2bb63c81b4565aab6cd78278e4c0fa136dbb0 + easy_app_installer: 29abe397da7d86721fee853281202f414373f45c + Flutter: f04841e97a9d0b0a8025694d0796dd46242b2854 + fluttertoast: eb263d302cc92e04176c053d2385237e9f43fad0 + FMDB: 2ce00b547f966261cd18927a3ddb07cb6f3db82a + MTBBarcodeScanner: f453b33c4b7dfe545d8c6484ed744d55671788cb + package_info_plus: 6c92f08e1f853dc01228d6f553146438dafcd14e + path_provider_foundation: 37748e03f12783f9de2cb2c4eadfaa25fe6d4852 + permission_handler_apple: 44366e37eaf29454a1e7b1b7d736c2cceaeb17ce + shared_preferences_foundation: 297b3ebca31b34ec92be11acd7fb0ba932c822ca + sqflite: 6d358c025f5b867b29ed92fc697fd34924e11904 + SwiftProtobuf: b02b5075dcf60c9f5f403000b3b0c202a11b6ae1 + Toast: 91b396c56ee72a5790816f40d3a94dd357abc196 + +PODFILE CHECKSUM: ef19549a9bc3046e7bb7d2fab4d021637c0c58a3 + +COCOAPODS: 1.11.3 diff --git a/ios/Runner.xcodeproj/project.pbxproj b/ios/Runner.xcodeproj/project.pbxproj index 65a38e0..c8b8a8f 100644 --- a/ios/Runner.xcodeproj/project.pbxproj +++ b/ios/Runner.xcodeproj/project.pbxproj @@ -3,11 +3,12 @@ archiveVersion = 1; classes = { }; - objectVersion = 50; + objectVersion = 54; objects = { /* Begin PBXBuildFile section */ 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */ = {isa = PBXBuildFile; fileRef = 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */; }; + 28FEB91C01FFFF1F3AF03958 /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 2946B4F99A9B9A85D9A4DC4F /* Pods_Runner.framework */; }; 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */ = {isa = PBXBuildFile; fileRef = 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */; }; 74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 74858FAE1ED2DC5600515810 /* AppDelegate.swift */; }; 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FA1CF9000F007C117D /* Main.storyboard */; }; @@ -31,7 +32,11 @@ /* Begin PBXFileReference section */ 1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GeneratedPluginRegistrant.h; sourceTree = ""; }; 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GeneratedPluginRegistrant.m; sourceTree = ""; }; + 24CA4A0209E683A311335098 /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = ""; }; + 2946B4F99A9B9A85D9A4DC4F /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = AppFrameworkInfo.plist; path = Flutter/AppFrameworkInfo.plist; sourceTree = ""; }; + 74181747FCF55E0339265087 /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = ""; }; + 7435055C04EA907D4DF9DEFB /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = ""; }; 74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Runner-Bridging-Header.h"; sourceTree = ""; }; 74858FAE1ED2DC5600515810 /* AppDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; 7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = Release.xcconfig; path = Flutter/Release.xcconfig; sourceTree = ""; }; @@ -49,12 +54,24 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( + 28FEB91C01FFFF1F3AF03958 /* Pods_Runner.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ + 53E3B75A4BA5D03DDDC74903 /* Pods */ = { + isa = PBXGroup; + children = ( + 74181747FCF55E0339265087 /* Pods-Runner.debug.xcconfig */, + 7435055C04EA907D4DF9DEFB /* Pods-Runner.release.xcconfig */, + 24CA4A0209E683A311335098 /* Pods-Runner.profile.xcconfig */, + ); + name = Pods; + path = Pods; + sourceTree = ""; + }; 9740EEB11CF90186004384FC /* Flutter */ = { isa = PBXGroup; children = ( @@ -72,6 +89,8 @@ 9740EEB11CF90186004384FC /* Flutter */, 97C146F01CF9000F007C117D /* Runner */, 97C146EF1CF9000F007C117D /* Products */, + 53E3B75A4BA5D03DDDC74903 /* Pods */, + B81885F5B040F93E6F30E902 /* Frameworks */, ); sourceTree = ""; }; @@ -98,6 +117,14 @@ path = Runner; sourceTree = ""; }; + B81885F5B040F93E6F30E902 /* Frameworks */ = { + isa = PBXGroup; + children = ( + 2946B4F99A9B9A85D9A4DC4F /* Pods_Runner.framework */, + ); + name = Frameworks; + sourceTree = ""; + }; /* End PBXGroup section */ /* Begin PBXNativeTarget section */ @@ -105,12 +132,14 @@ isa = PBXNativeTarget; buildConfigurationList = 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */; buildPhases = ( + 961512EDE7FE1573CFAF92FB /* [CP] Check Pods Manifest.lock */, 9740EEB61CF901F6004384FC /* Run Script */, 97C146EA1CF9000F007C117D /* Sources */, 97C146EB1CF9000F007C117D /* Frameworks */, 97C146EC1CF9000F007C117D /* Resources */, 9705A1C41CF9048500538489 /* Embed Frameworks */, 3B06AD1E1E4923F5004D2608 /* Thin Binary */, + CC94AAA4981E9E5E5B1BC9E4 /* [CP] Embed Pods Frameworks */, ); buildRules = ( ); @@ -171,6 +200,7 @@ /* Begin PBXShellScriptBuildPhase section */ 3B06AD1E1E4923F5004D2608 /* Thin Binary */ = { isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); @@ -183,8 +213,31 @@ shellPath = /bin/sh; shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" embed_and_thin"; }; + 961512EDE7FE1573CFAF92FB /* [CP] Check Pods Manifest.lock */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + ); + inputPaths = ( + "${PODS_PODFILE_DIR_PATH}/Podfile.lock", + "${PODS_ROOT}/Manifest.lock", + ); + name = "[CP] Check Pods Manifest.lock"; + outputFileListPaths = ( + ); + outputPaths = ( + "$(DERIVED_FILE_DIR)/Pods-Runner-checkManifestLockResult.txt", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; + showEnvVarsInLog = 0; + }; 9740EEB61CF901F6004384FC /* Run Script */ = { isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); @@ -197,6 +250,23 @@ shellPath = /bin/sh; shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" build"; }; + CC94AAA4981E9E5E5B1BC9E4 /* [CP] Embed Pods Frameworks */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-input-files.xcfilelist", + ); + name = "[CP] Embed Pods Frameworks"; + outputFileListPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-output-files.xcfilelist", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n"; + showEnvVarsInLog = 0; + }; /* End PBXShellScriptBuildPhase section */ /* Begin PBXSourcesBuildPhase section */ diff --git a/ios/Runner.xcworkspace/contents.xcworkspacedata b/ios/Runner.xcworkspace/contents.xcworkspacedata index 1d526a1..21a3cc1 100644 --- a/ios/Runner.xcworkspace/contents.xcworkspacedata +++ b/ios/Runner.xcworkspace/contents.xcworkspacedata @@ -4,4 +4,7 @@ + + diff --git a/lib/bloc/profile/profile_bloc.dart b/lib/bloc/profile/profile_bloc.dart new file mode 100644 index 0000000..f357ecc --- /dev/null +++ b/lib/bloc/profile/profile_bloc.dart @@ -0,0 +1,30 @@ +import 'package:bloc/bloc.dart'; +import 'package:equatable/equatable.dart'; +import 'package:unit2/model/profile/basic_info.dart'; +import 'package:unit2/model/profile/basic_information/primary-information.dart'; +import 'package:unit2/model/profile/profileInfomation.dart'; +import 'package:unit2/sevices/profile/profile_service.dart'; + +import '../../model/profile/basic_info.dart'; +import '../../model/profile/basic_info.dart'; + +part 'profile_event.dart'; +part 'profile_state.dart'; + +class ProfileBloc extends Bloc { + ProfileBloc() : super(ProfileInitial()) { + ProfileInformation? _profileInformation; + on((event, emit) async { + try { + emit(ProfileLoading()); + ProfileInformation? profileInformation = + await ProfileService.instance.getProfile(event.token, event.userID); + _profileInformation = profileInformation; + emit(ProfileLoaded( + profileInformation: _profileInformation!)); + } catch (e) { + emit(ProfileErrorState(mesage: e.toString())); + } + }); + } +} diff --git a/lib/bloc/profile/profile_event.dart b/lib/bloc/profile/profile_event.dart new file mode 100644 index 0000000..e978beb --- /dev/null +++ b/lib/bloc/profile/profile_event.dart @@ -0,0 +1,23 @@ +part of 'profile_bloc.dart'; + +abstract class ProfileEvent extends Equatable { + const ProfileEvent(); + + @override + List get props => []; +} + +class LoadProfile extends ProfileEvent{ +final String token; +final int userID; +const LoadProfile({required this.token, required this.userID}); + @override + List get props => [token,userID]; + +} + +class LoadProfileInformation extends ProfileEvent{ + @override + List get props => []; +} + diff --git a/lib/bloc/profile/profile_state.dart b/lib/bloc/profile/profile_state.dart new file mode 100644 index 0000000..ae753d5 --- /dev/null +++ b/lib/bloc/profile/profile_state.dart @@ -0,0 +1,29 @@ +part of 'profile_bloc.dart'; + +abstract class ProfileState extends Equatable { + const ProfileState(); + + @override + List get props => []; +} + +class ProfileInitial extends ProfileState {} + +class ProfileLoaded extends ProfileState{ + final ProfileInformation profileInformation; + const ProfileLoaded({required this.profileInformation}); + @override + List get props => [profileInformation]; +} + +class ProfileErrorState extends ProfileState{ + final String mesage; + const ProfileErrorState({required this.mesage}); + @override + List get props => [mesage]; +} + +class ProfileLoading extends ProfileState{ + +} + diff --git a/lib/bloc/bloc/user_bloc.dart b/lib/bloc/user/user_bloc.dart similarity index 100% rename from lib/bloc/bloc/user_bloc.dart rename to lib/bloc/user/user_bloc.dart diff --git a/lib/bloc/bloc/user_event.dart b/lib/bloc/user/user_event.dart similarity index 100% rename from lib/bloc/bloc/user_event.dart rename to lib/bloc/user/user_event.dart diff --git a/lib/bloc/bloc/user_state.dart b/lib/bloc/user/user_state.dart similarity index 100% rename from lib/bloc/bloc/user_state.dart rename to lib/bloc/user/user_state.dart diff --git a/lib/main.dart b/lib/main.dart index be88b93..d41d56d 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -3,7 +3,7 @@ import 'package:flutter/material.dart'; import 'package:device_preview/device_preview.dart'; import 'package:flutter/services.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; -import 'package:unit2/bloc/bloc/user_bloc.dart'; +import 'package:unit2/bloc/user/user_bloc.dart'; import 'package:unit2/utils/app_router.dart'; import 'package:unit2/utils/global_context.dart'; import 'package:unit2/utils/global_context.dart'; diff --git a/lib/model/profile/basic_info.dart b/lib/model/profile/basic_info.dart new file mode 100644 index 0000000..fda9bc1 --- /dev/null +++ b/lib/model/profile/basic_info.dart @@ -0,0 +1,9 @@ +import 'package:unit2/model/profile/basic_information/contact_information.dart'; +import 'package:unit2/model/profile/basic_information/primary-information.dart'; + +class BasicInfo{ + PrimaryInformation primaryInformation; + List contactInformation; + BasicInfo({required this.contactInformation, required this.primaryInformation}); + +} \ No newline at end of file diff --git a/lib/model/profile/basic_information/contact_information.dart b/lib/model/profile/basic_information/contact_information.dart new file mode 100644 index 0000000..e7f9d7a --- /dev/null +++ b/lib/model/profile/basic_information/contact_information.dart @@ -0,0 +1,180 @@ +// To parse this JSON data, do +// +// final contactInformation = contactInformationFromJson(jsonString); + + +class ContactInfo { + ContactInfo({ + required this.id, + required this.active, + required this.primary, + required this.numbermail, + required this.commService, + }); + + int? id; + bool? active; + bool? primary; + String? numbermail; + CommService? commService; + + factory ContactInfo.fromJson(Map json) => ContactInfo( + id: json["id"], + active: json["active"], + primary: json["primary"], + numbermail: json["numbermail"], + commService: json["comm_service"]==null?null: CommService.fromJson(json["comm_service"]), + ); + + Map toJson() => { + "id": id, + "active": active, + "primary": primary, + "numbermail": numbermail, + "comm_service": commService!.toJson(), + }; +} + +class CommService { + CommService({ + required this.id, + required this.serviceType, + required this.serviceProvider, + }); + + int? id; + ServiceType? serviceType; + ServiceProvider? serviceProvider; + + factory CommService.fromJson(Map json) => CommService( + id: json["id"], + serviceType: ServiceType.fromJson(json["service_type"]), + serviceProvider: ServiceProvider.fromJson(json["service_provider"]), + ); + + Map toJson() => { + "id": id, + "service_type": serviceType!.toJson(), + "service_provider": serviceProvider!.toJson(), + }; +} + +class ServiceProvider { + ServiceProvider({ + required this.id, + required this.alias, + required this.agency, + }); + + int? id; + String? alias; + Agency? agency; + + factory ServiceProvider.fromJson(Map json) => ServiceProvider( + id: json["id"], + alias: json["alias"], + agency: Agency.fromJson(json["agency"]), + ); + + Map toJson() => { + "id": id, + "alias": alias, + "agency": agency!.toJson(), + }; +} + +class Agency { + Agency({ + required this.id, + required this.name, + required this.category, + required this.privateEntity, + }); + + int? id; + String? name; + Category? category; + bool? privateEntity; + + factory Agency.fromJson(Map json) => Agency( + id: json["id"], + name: json["name"], + category: Category.fromJson(json["category"]), + privateEntity: json["private_entity"], + ); + + Map toJson() => { + "id": id, + "name": name, + "category": category!.toJson(), + "private_entity": privateEntity, + }; +} + +class Category { + Category({ + required this.id, + required this.name, + required this.industryClass, + }); + + int? id; + String? name; + IndustryClass? industryClass; + + factory Category.fromJson(Map json) => Category( + id: json["id"], + name: json["name"], + industryClass: IndustryClass.fromJson(json["industry_class"]), + ); + + Map toJson() => { + "id": id, + "name": name, + "industry_class": industryClass!.toJson(), + }; +} + +class IndustryClass { + IndustryClass({ + required this.id, + required this.name, + this.description, + }); + + int? id; + String? name; + String? description; + + factory IndustryClass.fromJson(Map json) => IndustryClass( + id: json["id"], + name: json["name"], + description: json["description"], + ); + + Map toJson() => { + "id": id, + "name": name, + "description": description, + }; +} + +class ServiceType { + ServiceType({ + required this.id, + required this.name, + }); + + int? id; + String? name; + + factory ServiceType.fromJson(Map json) => ServiceType( + id: json["id"], + name: json["name"], + ); + + Map toJson() => { + "id": id, + "name": name, + }; +} diff --git a/lib/model/profile/basic_information/primary-information.dart b/lib/model/profile/basic_information/primary-information.dart new file mode 100644 index 0000000..adb26f8 --- /dev/null +++ b/lib/model/profile/basic_information/primary-information.dart @@ -0,0 +1,95 @@ +import 'dart:convert'; + +class PrimaryInformation { + PrimaryInformation({ + required this.id, + required this.lastName, + required this.firstName, + required this.middleName, + required this.nameExtension, + required this.sex, + required this.birthdate, + required this.civilStatus, + required this.bloodType, + required this.heightM, + required this.weightKg, + required this.photoPath, + required this.esigPath, + required this.maidenName, + required this.deceased, + required this.gender, + required this.uuidQrcode, + required this.titlePrefix, + required this.titleSuffix, + required this.showTitleId, + }); + + int? id; + String? lastName; + String? firstName; + String? middleName; + String? nameExtension; + String? sex; + DateTime? birthdate; + String? civilStatus; + String? bloodType; + double? heightM; + double? weightKg; + String? photoPath; + String? esigPath; + String? maidenName; + bool? deceased; + String? gender; + String? uuidQrcode; + String? titlePrefix; + String? titleSuffix; + bool? showTitleId; + + factory PrimaryInformation.fromJson(Map json) => + PrimaryInformation( + id: json["id"], + lastName: json["last_name"], + firstName: json["first_name"], + middleName: json["middle_name"], + nameExtension: json["name_extension"], + sex: json["sex"], + birthdate: json['birthdate']==null?null:DateTime.parse(json["birthdate"]), + civilStatus: json["civil_status"], + bloodType: json["blood_type"], + heightM: json["height_m"]?.toDouble(), + weightKg: json["weight_kg"], + photoPath: json["photo_path"], + esigPath: json["esig_path"], + maidenName: json["maiden_name"], + deceased: json["deceased"], + gender: json["gender"], + uuidQrcode: json["uuid_qrcode"], + titlePrefix: json["title_prefix"], + titleSuffix: json["title_suffix"], + showTitleId: json["show_title_id"], + ); + + Map toJson() => { + "id": id, + "last_name": lastName, + "first_name": firstName, + "middle_name": middleName, + "name_extension": nameExtension, + "sex": sex, + "birthdate": + "${birthdate!.year.toString().padLeft(4, '0')}-${birthdate!.month.toString().padLeft(2, '0')}-${birthdate!.day.toString().padLeft(2, '0')}", + "civil_status": civilStatus, + "blood_type": bloodType, + "height_m": heightM, + "weight_kg": weightKg, + "photo_path": photoPath, + "esig_path": esigPath, + "maiden_name": maidenName, + "deceased": deceased, + "gender": gender, + "uuid_qrcode": uuidQrcode, + "title_prefix": titlePrefix, + "title_suffix": titleSuffix, + "show_title_id": showTitleId, + }; +} diff --git a/lib/model/profile/profileInfomation.dart b/lib/model/profile/profileInfomation.dart new file mode 100644 index 0000000..891b522 --- /dev/null +++ b/lib/model/profile/profileInfomation.dart @@ -0,0 +1,7 @@ +import 'package:unit2/model/profile/basic_info.dart'; +import 'package:unit2/model/profile/basic_information/primary-information.dart'; + +class ProfileInformation{ + BasicInfo basicInfo; + ProfileInformation({required this.basicInfo}); +} \ No newline at end of file diff --git a/lib/screens/profile/components/basic_information/contact_information.dart b/lib/screens/profile/components/basic_information/contact_information.dart new file mode 100644 index 0000000..9fa40aa --- /dev/null +++ b/lib/screens/profile/components/basic_information/contact_information.dart @@ -0,0 +1,80 @@ +import 'package:flutter/material.dart'; +import 'package:flutter/src/widgets/framework.dart'; +import 'package:flutter/src/widgets/placeholder.dart'; +import 'package:unit2/model/profile/basic_information/contact_information.dart'; +import 'package:unit2/theme-data.dart/colors.dart'; + +class ContactInformation extends StatefulWidget { + final List contacts; + const ContactInformation({super.key, required this.contacts}); + + @override + State createState() => _ContactInformationState(); +} + +class _ContactInformationState extends State { + @override + Widget build(BuildContext context) { + return SafeArea( + child: Scaffold( + appBar: AppBar( + title: const Text("Contact Information"), + centerTitle: true, + backgroundColor: primary, + ), + body: ListView.builder( + itemCount: widget.contacts.length, + itemBuilder: (BuildContext context, int index) { + return Container( + child: Column( + mainAxisAlignment: MainAxisAlignment.start, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Container( + decoration: BoxDecoration( + color: Colors.grey[200], + borderRadius: const BorderRadius.all(Radius.circular(12))), + padding: const EdgeInsets.symmetric(horizontal: 12,vertical: 8), + child: Row( + children: [ + Expanded( + child: Column( + mainAxisAlignment: MainAxisAlignment.start, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text(widget.contacts[index].numbermail.toString(),style: Theme.of(context).textTheme.titleLarge,), + const SizedBox(height: 5,), + Row( + children: [ + Text(widget.contacts[index].commService! + .serviceProvider!.alias + .toString()), + const SizedBox(width: 15,), + widget.contacts[index].active==true? const Badge(backgroundColor: Colors.green, label: Text("Active",),):const SizedBox(), + const SizedBox(width: 8), + widget.contacts[index].primary==true? const Badge(backgroundColor: Colors.blue, label: Text("Primary"),):const SizedBox() + ], + ), + const SizedBox(height: 5,), + Text(widget.contacts[index].commService! + .serviceProvider!.agency!.name + .toString()), + + ]), + ), + IconButton(onPressed: (){}, icon: const Icon(Icons.more_vert)) + ], + ), + ), + const SizedBox(height: 5,), + + + + ], + ), + ); + }), + ), + ); + } +} diff --git a/lib/screens/profile/components/basic_information/primary_information.dart b/lib/screens/profile/components/basic_information/primary_information.dart new file mode 100644 index 0000000..f8243a0 --- /dev/null +++ b/lib/screens/profile/components/basic_information/primary_information.dart @@ -0,0 +1,163 @@ +import 'package:flutter/material.dart'; +import 'package:flutter/src/widgets/framework.dart'; +import 'package:flutter/src/widgets/placeholder.dart'; +import 'package:flutter_form_builder/flutter_form_builder.dart'; +import 'package:form_builder_validators/form_builder_validators.dart'; +import 'package:intl/intl.dart'; +import 'package:unit2/model/profile/basic_information/primary-information.dart'; +import 'package:unit2/theme-data.dart/colors.dart'; +import 'package:unit2/theme-data.dart/form-style.dart'; +import 'package:unit2/utils/global.dart'; + +class PrimaryInfo extends StatefulWidget { + final PrimaryInformation primaryInformation; + const PrimaryInfo({super.key, required this.primaryInformation}); + + @override + State createState() => _PrimaryInfoState(); +} + +class _PrimaryInfoState extends State { + @override + Widget build(BuildContext context) { + final _formKey = GlobalKey(); + bool enabled = false; + DateFormat dteFormat2 = DateFormat.yMMMMd('en_US'); + return SafeArea( + child: Scaffold( + appBar: AppBar( + title: const Text("Primary Information"), + centerTitle: true, + backgroundColor: primary, + ), + body: Container( + padding: const EdgeInsets.symmetric(vertical: 24, horizontal: 24), + child: FormBuilder( + child: Column( + children: [ + FormBuilderTextField( + enabled: enabled, + name: 'lastname', + initialValue: widget.primaryInformation.lastName!, + decoration: normalTextFieldStyle("Last name", ""), + + ), + const SizedBox(height: 15,), + FormBuilderTextField( + enabled: enabled, + name: 'firstname', + initialValue: widget.primaryInformation.firstName!, + decoration: normalTextFieldStyle("First name", ""), + ), + const SizedBox(height: 15,), + SizedBox( + width: screenWidth, + child: Row(children: [ + Flexible( + flex: 2, + child: FormBuilderTextField( + enabled: enabled, + name: 'middlename', + initialValue: widget.primaryInformation.middleName!, + decoration: normalTextFieldStyle("Middle name", ""), + ),), + const SizedBox(width: 10,), + Flexible( + flex: 1, + child: FormBuilderTextField( + enabled: enabled, + name: 'extension-name', + initialValue: widget.primaryInformation.nameExtension??='N/A', + decoration: normalTextFieldStyle("Name extension", ""), + ),) + ]), + + ), + const SizedBox(height: 15,), + SizedBox(width: screenWidth, + child: Row(children: [ + Flexible( + flex: 1, + child: FormBuilderTextField( + enabled: enabled, + name: 'bday', + initialValue: dteFormat2.format(widget.primaryInformation.birthdate!), + decoration: normalTextFieldStyle("Birth date", ""), + ),), + const SizedBox(width: 10,), + Flexible( + flex: 1, + child: FormBuilderTextField( + enabled: enabled, + name: 'sex', + initialValue: widget.primaryInformation.sex!, + decoration: normalTextFieldStyle("Sex", ""), + ),) + ]),), + const SizedBox(height: 15,), + SizedBox(width: screenWidth, + child: Row(children: [ + Flexible( + flex: 1, + child: FormBuilderTextField( + enabled: enabled, + name: 'bloodtype', + initialValue:widget.primaryInformation.bloodType!, + decoration: normalTextFieldStyle("Blood type", ""), + ),), + const SizedBox(width: 10,), + Flexible( + flex: 1, + child: FormBuilderTextField( + enabled: enabled, + name: 'civil-status', + initialValue: widget.primaryInformation.civilStatus!, + decoration: normalTextFieldStyle("Civil Status", ""), + ),), + const SizedBox(width: 10,), + Flexible( + flex: 1, + child: FormBuilderTextField( + enabled: enabled, + name: 'gender', + initialValue:widget.primaryInformation.gender??="N/A", + decoration: normalTextFieldStyle("Gender", ""), + ),), + ]),), + + const SizedBox(height: 15,), + SizedBox(width: screenWidth, + child: Row(children: [ + Flexible( + flex: 1, + child: FormBuilderTextField( + enabled: enabled, + name: 'height', + initialValue:widget.primaryInformation.heightM!.toString(), + decoration: normalTextFieldStyle("Height", ""), + ),), + const SizedBox(width: 10,), + Flexible( + flex: 1, + child: FormBuilderTextField( + enabled: enabled, + name: 'Weight', + initialValue: widget.primaryInformation.weightKg!.toString(), + decoration: normalTextFieldStyle("Weight", ""), + ),), + const SizedBox(width: 10,), + Flexible( + flex: 1, + child: FormBuilderTextField( + enabled: enabled, + name: 'prefix&suffix', + initialValue:"${widget.primaryInformation.titlePrefix??="NA"} | ${widget.primaryInformation.titleSuffix??="N/A"}", + decoration: normalTextFieldStyle("Title Prefix and Suffix", ""), + ),), + ]),), + ], + )), + )), + ); + } +} diff --git a/lib/screens/profile/components/loading_screen.dart b/lib/screens/profile/components/loading_screen.dart new file mode 100644 index 0000000..a84ebaf --- /dev/null +++ b/lib/screens/profile/components/loading_screen.dart @@ -0,0 +1,132 @@ +import 'package:expandable_group/expandable_group_widget.dart'; +import 'package:flutter/material.dart'; +import 'package:fluttericon/brandico_icons.dart'; +import 'package:fluttericon/elusive_icons.dart'; +import 'package:fluttericon/entypo_icons.dart'; +import 'package:fluttericon/font_awesome5_icons.dart'; +import 'package:fluttericon/modern_pictograms_icons.dart'; +import 'package:unit2/screens/profile/components/main_menu.dart'; +import 'package:unit2/screens/profile/components/submenu.dart'; + +import '../../../theme-data.dart/colors.dart'; + +class LoadingScreen extends StatelessWidget { + const LoadingScreen({super.key}); + + @override + Widget build(BuildContext context) { + return Container( + padding: const EdgeInsets.symmetric( + vertical: 12, horizontal: 12), + child: ListView( + children: [ + const Text( + "View and Update your Profile Information"), + ExpandableGroup( + collapsedIcon: + const Icon(Icons.keyboard_arrow_down), + expandedIcon: + const Icon(Icons.keyboard_arrow_up), + header: const ListTile( + leading: Icon( + Elusive.address_book, + color: primary, + ), + title: Text( + "Basic Information", + style: + TextStyle(fontWeight: FontWeight.bold), + ), + ), + items: [ + subMenu(Icons.person, "Primary",(){}), + subMenu(Icons.home, "Home Addresses",(){}), + subMenu( + Icons.contact_mail, "Identifications",(){}), + subMenu(Icons.contact_phone, "Contact Info",(){}), + subMenu(Icons.flag, "Citizenships",(){}), + ]), + const Divider(), + const MainMenu( + icon: Elusive.group, + title: "Family", + ), + const Divider(), + const MainMenu( + icon: FontAwesome5.graduation_cap, + title: "Education", + ), + const Divider(), + const MainMenu( + icon: Icons.stars, + title: "Eligibility", + ), + const Divider(), + const MainMenu( + icon: FontAwesome5.shopping_bag, + title: "Work History", + ), + const Divider(), + const MainMenu( + icon: FontAwesome5.walking, + title: "Voluntary Work & Civic Services", + ), + const Divider(), + const MainMenu( + icon: Elusive.lightbulb, + title: "Learning & Development", + ), + const Divider(), + const MainMenu( + icon: Brandico.codepen, + title: "Personal References", + ), + ExpandableGroup( + collapsedIcon: + const Icon(Icons.keyboard_arrow_down), + expandedIcon: + const Icon(Icons.keyboard_arrow_up), + header: const ListTile( + leading: Icon( + Icons.info, + color: primary, + ), + title: Text( + "Other Information", + style: + TextStyle(fontWeight: FontWeight.bold), + ), + ), + items: [ + subMenu( + Icons.fitness_center, "Skills & Hobbies",(){}), + subMenu(FontAwesome5.certificate, + "Organization Memberships",(){}), + subMenu(Entypo.doc_text, + "Non-Academic Recognitions",(){}), + ]), + ExpandableGroup( + collapsedIcon: + const Icon(Icons.keyboard_arrow_down), + expandedIcon: + const Icon(Icons.keyboard_arrow_up), + header: const ListTile( + leading: Icon( + FontAwesome5.laptop_house, + color: primary, + ), + title: Text( + "Assets", + style: + TextStyle(fontWeight: FontWeight.bold), + ), + ), + items: [ + subMenu(ModernPictograms.home, + "Real Property Tax",(){}), + ]), + ], + ), + ); + } +} \ No newline at end of file diff --git a/lib/screens/profile/components/submenu.dart b/lib/screens/profile/components/submenu.dart index 72fa2d2..c412a36 100644 --- a/lib/screens/profile/components/submenu.dart +++ b/lib/screens/profile/components/submenu.dart @@ -1,7 +1,7 @@ import 'package:flutter/material.dart'; import 'package:unit2/theme-data.dart/colors.dart'; -ListTile subMenu(IconData icon, String title) { +ListTile subMenu(IconData icon, String title,Function() onTap) { return ListTile( leading: Container( margin: const EdgeInsets.only(left: 20), @@ -15,5 +15,6 @@ ListTile subMenu(IconData icon, String title) { style: const TextStyle(), ), trailing: const Icon(Icons.keyboard_arrow_right), + onTap: onTap, ); } diff --git a/lib/screens/profile/profile.dart b/lib/screens/profile/profile.dart index 672d8c1..8e7b6f0 100644 --- a/lib/screens/profile/profile.dart +++ b/lib/screens/profile/profile.dart @@ -1,19 +1,18 @@ import 'package:expandable_group/expandable_group_widget.dart'; -import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; -import 'package:flutter/src/widgets/container.dart'; -import 'package:flutter/src/widgets/framework.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; +import 'package:flutter_progress_hud/flutter_progress_hud.dart'; import 'package:fluttericon/brandico_icons.dart'; import 'package:fluttericon/elusive_icons.dart'; import 'package:fluttericon/entypo_icons.dart'; import 'package:fluttericon/font_awesome5_icons.dart'; -import 'package:fluttericon/font_awesome_icons.dart'; import 'package:fluttericon/modern_pictograms_icons.dart'; -import 'package:fluttericon/typicons_icons.dart'; -import 'package:unit2/bloc/bloc/user_bloc.dart'; +import 'package:unit2/bloc/profile/profile_bloc.dart'; +import 'package:unit2/screens/profile/components/basic_information/contact_information.dart'; +import 'package:unit2/screens/profile/components/basic_information/primary_information.dart'; +import 'package:unit2/screens/profile/components/loading_screen.dart'; import 'package:unit2/theme-data.dart/colors.dart'; - +import '../../bloc/user/user_bloc.dart'; import 'components/main_menu.dart'; import 'components/submenu.dart'; @@ -34,121 +33,159 @@ class _ProfileInfoState extends State { centerTitle: true, title: const Text('Profile'), ), - body: BlocConsumer( - listener: (context, state) { - // TODO: implement listener - }, - builder: (context, state) { + body: ProgressHUD( + child: + BlocBuilder(builder: (context, state) { if (state is UserLoggedIn) { - return Container( - padding: const EdgeInsets.symmetric( - vertical: 12, horizontal: 12), - child: ListView( - children: [ - const Text("View and Update your Profile Information"), - ExpandableGroup( - collapsedIcon: - const Icon(Icons.keyboard_arrow_down), - expandedIcon: const Icon(Icons.keyboard_arrow_up), - header: const ListTile( - leading: Icon( - Elusive.address_book, - color: primary, + return BlocConsumer( + listener: (context, state) { + if (state is ProfileLoading) { + final progress = ProgressHUD.of(context); + progress?.showWithText( + 'Loading Profile', + ); + } + if (state is ProfileLoaded) { + final progress = ProgressHUD.of(context); + progress?.dismiss(); + } + }, + builder: (context, state) { + if (state is ProfileLoaded) { + + return Container( + padding: const EdgeInsets.symmetric( + vertical: 12, horizontal: 12), + child: ListView( + children: [ + const Text( + "View and Update your Profile Information"), + ExpandableGroup( + collapsedIcon: + const Icon(Icons.keyboard_arrow_down), + expandedIcon: + const Icon(Icons.keyboard_arrow_up), + header: const ListTile( + leading: Icon( + Elusive.address_book, + color: primary, + ), + title: Text( + "Basic Information", + style: TextStyle( + fontWeight: FontWeight.bold), + ), + ), + items: [ + subMenu(Icons.person, "Primary",(){ + Navigator.push(context,MaterialPageRoute(builder: (BuildContext context){ + return PrimaryInfo(primaryInformation: state.profileInformation.basicInfo.primaryInformation); + }) ); + }), + subMenu(Icons.home, "Home Addresses",(){}), + subMenu( + Icons.contact_mail, "Identifications",(){}), + subMenu( + Icons.contact_phone, "Contact Info",(){ + Navigator.push(context, MaterialPageRoute(builder: (BuildContext context){ + return ContactInformation(contacts: state.profileInformation.basicInfo.contactInformation,); + })); + }), + subMenu(Icons.flag, "Citizenships",(){}), + ]), + const Divider(), + const MainMenu( + icon: Elusive.group, + title: "Family", ), - title: Text( - "Basic Information", - style: TextStyle(fontWeight: FontWeight.bold), + const Divider(), + const MainMenu( + icon: FontAwesome5.graduation_cap, + title: "Education", ), - ), - items: [ - subMenu(Icons.person, "Primary"), - subMenu(Icons.home, "Home Addresses"), - subMenu(Icons.contact_mail, "Identifications"), - subMenu(Icons.contact_phone, "Contact Info"), - subMenu(Icons.flag, "Citizenships"), - ]), - const Divider(), - const MainMenu( - icon: Elusive.group, - title: "Family", - ), - const Divider(), - const MainMenu( - icon: FontAwesome5.graduation_cap, - title: "Education", - ), - const Divider(), - const MainMenu( - icon: Icons.stars, - title: "Eligibility", - ), - const Divider(), - const MainMenu( - icon: FontAwesome5.shopping_bag, - title: "Work History", - ), - const Divider(), - const MainMenu( - icon: FontAwesome5.walking, - title: "Voluntary Work & Civic Services", - ), - const Divider(), - const MainMenu( - icon: Elusive.lightbulb, - title: "Learning & Development", - ), - const Divider(), - const MainMenu( - icon: Brandico.codepen, - title: "Personal References", - ), - ExpandableGroup( - collapsedIcon: - const Icon(Icons.keyboard_arrow_down), - expandedIcon: const Icon(Icons.keyboard_arrow_up), - header: const ListTile( - leading: Icon( - Icons.info, - color: primary, + const Divider(), + const MainMenu( + icon: Icons.stars, + title: "Eligibility", ), - title: Text( - "Other Information", - style: TextStyle(fontWeight: FontWeight.bold), + const Divider(), + const MainMenu( + icon: FontAwesome5.shopping_bag, + title: "Work History", ), - ), - items: [ - subMenu(Icons.fitness_center, "Skills & Hobbies"), - subMenu(FontAwesome5.certificate, - "Organization Memberships"), - subMenu( - Entypo.doc_text, "Non-Academic Recognitions"), - ]), - ExpandableGroup( - collapsedIcon: - const Icon(Icons.keyboard_arrow_down), - expandedIcon: const Icon(Icons.keyboard_arrow_up), - header: const ListTile( - leading: Icon( - FontAwesome5.laptop_house, - color: primary, + const Divider(), + const MainMenu( + icon: FontAwesome5.walking, + title: "Voluntary Work & Civic Services", ), - title: Text( - "Assets", - style: TextStyle(fontWeight: FontWeight.bold), + const Divider(), + const MainMenu( + icon: Elusive.lightbulb, + title: "Learning & Development", ), - ), - items: [ - subMenu( - ModernPictograms.home, "Real Property Tax"), - ]), - ], - ), + const Divider(), + const MainMenu( + icon: Brandico.codepen, + title: "Personal References", + ), + ExpandableGroup( + collapsedIcon: + const Icon(Icons.keyboard_arrow_down), + expandedIcon: + const Icon(Icons.keyboard_arrow_up), + header: const ListTile( + leading: Icon( + Icons.info, + color: primary, + ), + title: Text( + "Other Information", + style: TextStyle( + fontWeight: FontWeight.bold), + ), + ), + items: [ + subMenu(Icons.fitness_center, + "Skills & Hobbies",(){}), + subMenu(FontAwesome5.certificate, + "Organization Memberships",(){}), + subMenu(Entypo.doc_text, + "Non-Academic Recognitions",(){}), + ]), + ExpandableGroup( + collapsedIcon: + const Icon(Icons.keyboard_arrow_down), + expandedIcon: + const Icon(Icons.keyboard_arrow_up), + header: const ListTile( + leading: Icon( + FontAwesome5.laptop_house, + color: primary, + ), + title: Text( + "Assets", + style: TextStyle( + fontWeight: FontWeight.bold), + ), + ), + items: [ + subMenu(ModernPictograms.home, + "Real Property Tax",(){}), + ]), + ], + ), + ); + } + if (state is ProfileLoading) { + return const LoadingScreen(); + } + + return Container(); + }, ); } - return const Center( - child: Text("default"), - ); - }, + return Container(); + }), ))); } } diff --git a/lib/screens/unit2/basic-info/basic-info.dart b/lib/screens/unit2/basic-info/basic-info.dart index 7374720..6459508 100644 --- a/lib/screens/unit2/basic-info/basic-info.dart +++ b/lib/screens/unit2/basic-info/basic-info.dart @@ -5,11 +5,11 @@ import 'package:flutter_svg/svg.dart'; import 'package:fluttericon/font_awesome5_icons.dart'; import 'package:intl/intl.dart'; import 'package:qr_flutter/qr_flutter.dart'; -import 'package:unit2/bloc/bloc/user_bloc.dart'; import 'package:unit2/model/login_data/user_info/user_data.dart'; import 'package:unit2/theme-data.dart/btn-style.dart'; import 'package:unit2/utils/global.dart'; import 'package:unit2/utils/text_container.dart'; +import '../../../bloc/user/user_bloc.dart'; import '../../../theme-data.dart/colors.dart'; import '../../../widgets/splash_screen.dart'; import './components/cover-image.dart'; diff --git a/lib/screens/unit2/homepage.dart/components/dashboard.dart b/lib/screens/unit2/homepage.dart/components/dashboard.dart index b1c591a..ecca003 100644 --- a/lib/screens/unit2/homepage.dart/components/dashboard.dart +++ b/lib/screens/unit2/homepage.dart/components/dashboard.dart @@ -1,7 +1,5 @@ import 'package:flutter/material.dart'; import 'package:unit2/screens/unit2/homepage.dart/module-screen.dart'; - -import 'package:unit2/test_data.dart'; import 'package:unit2/theme-data.dart/colors.dart'; class DashBoard extends StatelessWidget { @@ -62,7 +60,7 @@ class DashBoard extends StatelessWidget { textAlign: TextAlign.center, style: Theme.of(context) .textTheme - .button! + .labelLarge! .copyWith( fontSize: 11, fontWeight: FontWeight.bold), diff --git a/lib/screens/unit2/homepage.dart/components/drawer-screen.dart b/lib/screens/unit2/homepage.dart/components/drawer-screen.dart index c355f90..c1ba365 100644 --- a/lib/screens/unit2/homepage.dart/components/drawer-screen.dart +++ b/lib/screens/unit2/homepage.dart/components/drawer-screen.dart @@ -2,8 +2,8 @@ import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:flutter_zoom_drawer/config.dart'; import 'package:flutter_zoom_drawer/flutter_zoom_drawer.dart'; -import 'package:unit2/bloc/bloc/user_bloc.dart'; import 'package:unit2/theme-data.dart/colors.dart'; +import '../../../../bloc/user/user_bloc.dart'; import '../../../../widgets/splash_screen.dart'; import 'menu-screen.dart'; import '../module-screen.dart'; diff --git a/lib/screens/unit2/homepage.dart/components/menu.dart b/lib/screens/unit2/homepage.dart/components/menu.dart index 5bf5982..b26cafe 100644 --- a/lib/screens/unit2/homepage.dart/components/menu.dart +++ b/lib/screens/unit2/homepage.dart/components/menu.dart @@ -1,4 +1,5 @@ import 'package:flutter/material.dart'; +import 'package:unit2/model/login_data/employee_info/employee_info.dart'; import 'package:unit2/model/login_data/user_info/user_data.dart'; import 'package:unit2/utils/alerts.dart'; import '../../../../theme-data.dart/colors.dart'; @@ -20,9 +21,19 @@ Widget getTile( confirmAlert(context, () { Navigator.pushReplacementNamed (context,"/"); }); - } else { + }if(title.toLowerCase() == 'profile'){ + ProfileArguments profileArguments = ProfileArguments(token: userData.user!.login!.token!, userID:userData.user!.login!.user!.profileId!); + Navigator.pushNamed(context, route,arguments: profileArguments); + } + else { Navigator.pushNamed(context, route); } }, ); } + +class ProfileArguments{ + final int userID; + final String token; + const ProfileArguments({required this.token, required this.userID}); +} diff --git a/lib/screens/unit2/homepage.dart/module-screen.dart b/lib/screens/unit2/homepage.dart/module-screen.dart index 5626247..e8aa371 100644 --- a/lib/screens/unit2/homepage.dart/module-screen.dart +++ b/lib/screens/unit2/homepage.dart/module-screen.dart @@ -7,8 +7,7 @@ import 'package:fluttericon/typicons_icons.dart'; import 'package:unit2/screens/unit2/homepage.dart/components/dashboard.dart'; import 'package:unit2/theme-data.dart/colors.dart'; import 'package:unit2/utils/text_container.dart'; - -import '../../../bloc/bloc/user_bloc.dart'; +import '../../../bloc/user/user_bloc.dart'; import '../../../model/login_data/user_info/role.dart'; import 'components/empty_module.dart'; @@ -21,8 +20,8 @@ class MainScreen extends StatefulWidget { class _MainScreenState extends State { List roles = [ - Module(name: 'UniT2 roles', roles: []), - Module(name: 'DocSms roles', roles: []) + Module(name: 'UniT2 module operations', roles: []), + Module(name: 'DocSms module operations', roles: []) ]; @override Widget build(BuildContext context) { diff --git a/lib/screens/unit2/login/components/update_required.dart b/lib/screens/unit2/login/components/update_required.dart index 593169e..a5ae6b0 100644 --- a/lib/screens/unit2/login/components/update_required.dart +++ b/lib/screens/unit2/login/components/update_required.dart @@ -9,10 +9,10 @@ import 'package:flutter_progress_hud/flutter_progress_hud.dart'; import 'package:flutter_svg/svg.dart'; import 'package:path_provider/path_provider.dart'; import 'package:permission_handler/permission_handler.dart'; -import 'package:unit2/bloc/bloc/user_bloc.dart'; import 'package:unit2/screens/unit2/login/components/showAlert.dart'; import 'package:unit2/theme-data.dart/btn-style.dart'; +import '../../../../bloc/user/user_bloc.dart'; import '../../../../theme-data.dart/colors.dart'; import '../../../../utils/cpu_architecture.dart'; import '../../../../utils/text_container.dart'; diff --git a/lib/screens/unit2/login/login.dart b/lib/screens/unit2/login/login.dart index bd2d590..ec4cb21 100644 --- a/lib/screens/unit2/login/login.dart +++ b/lib/screens/unit2/login/login.dart @@ -6,10 +6,10 @@ import 'package:flutter_form_builder/flutter_form_builder.dart'; import 'package:fluttericon/font_awesome5_icons.dart'; import 'package:form_builder_validators/form_builder_validators.dart'; import 'package:flutter_progress_hud/flutter_progress_hud.dart'; -import 'package:unit2/bloc/bloc/user_bloc.dart'; import 'package:unit2/screens/unit2/login/components/update_required.dart'; import 'package:unit2/utils/text_container.dart'; import 'package:unit2/widgets/error_state.dart'; +import '../../../bloc/user/user_bloc.dart'; import '../../../widgets/splash_screen.dart'; import '../../../widgets/wave.dart'; import '../../../utils/global.dart'; @@ -212,12 +212,15 @@ class _UniT2LoginState extends State { BlocProvider.of(context) .add(UserLogin( - username: _formKey - .currentState! - .value['username'], - password: _formKey - .currentState! - .value['password'])); + username: "rjvincentlopeplopez", + password: "shesthequ33n", + // username: _formKey + // .currentState! + // .value['username'], + // password: _formKey + // .currentState! + // .value['password']) + )); } }, ), diff --git a/lib/screens/unit2/login/qr_login.dart b/lib/screens/unit2/login/qr_login.dart index 9d2f70b..0a52f5c 100644 --- a/lib/screens/unit2/login/qr_login.dart +++ b/lib/screens/unit2/login/qr_login.dart @@ -10,8 +10,7 @@ import 'package:fluttericon/font_awesome5_icons.dart'; import 'package:unit2/theme-data.dart/btn-style.dart'; import 'package:unit2/widgets/error_state.dart'; import 'package:unit2/widgets/wave.dart'; - -import '../../../bloc/bloc/user_bloc.dart'; +import '../../../bloc/user/user_bloc.dart'; import '../../../theme-data.dart/colors.dart'; import '../../../theme-data.dart/form-style.dart'; import '../../../utils/global.dart'; diff --git a/lib/sevices/login_service/auth_service.dart b/lib/sevices/login_service/auth_service.dart index 82b47a5..885bd76 100644 --- a/lib/sevices/login_service/auth_service.dart +++ b/lib/sevices/login_service/auth_service.dart @@ -1,8 +1,6 @@ import 'dart:async'; import 'dart:convert'; import 'dart:io'; - -import 'package:flutter/material.dart'; import 'package:unit2/model/login_data/user_info/user_data.dart'; import 'package:unit2/model/login_data/version_info.dart'; import 'package:http/http.dart' as http; @@ -30,11 +28,7 @@ class AuthService { Map data = jsonDecode(response.body); versionInfo = VersionInfo.fromJson(data['data']); } - } on TimeoutException catch (_) { - throw (timeoutError); - } on SocketException catch (_) { - throw (timeoutError); - } catch (e) { + }catch (e) { throw (e.toString()); } return versionInfo; diff --git a/lib/sevices/profile/profile_service.dart b/lib/sevices/profile/profile_service.dart new file mode 100644 index 0000000..c502434 --- /dev/null +++ b/lib/sevices/profile/profile_service.dart @@ -0,0 +1,50 @@ +import 'dart:convert'; +import 'package:http/http.dart' as http; +import 'package:unit2/model/login_data/employee_info/employee_info.dart'; +import 'package:unit2/model/profile/basic_info.dart'; +import 'package:unit2/model/profile/basic_information/contact_information.dart'; +import 'package:unit2/model/profile/profileInfomation.dart'; +import 'package:unit2/utils/request.dart'; +import 'package:unit2/utils/urls.dart'; + +import '../../model/profile/basic_information/primary-information.dart'; + +class ProfileService { + static final ProfileService _instance = ProfileService(); + static ProfileService get instance => _instance; + + Future getProfile(String token, int id) async { + String url = Url.instance.profileInformation(); + String path = url + id.toString(); + ProfileInformation? _profileInformation; + ContactInfo contactInfo; + List contactInformation = []; + PrimaryInformation primaryInformation; + Map headers = { + 'Content-Type': 'application/json; charset=UTF-8', + 'Authorization': "Token $token" + }; + try{ + http.Response response = await Request.instance + .getRequest(path: path, param: {}, headers: headers); + if (response.statusCode == 200) { + Map data = jsonDecode(response.body); + // get primary information + primaryInformation = PrimaryInformation.fromJson( + data['data']['basic_information']['primary_information']); + // get all contacts + data['data']['basic_information']['contact_information'] + .forEach((var contact) { + contactInfo = ContactInfo.fromJson(contact['contact_info']); + contactInformation.add(contactInfo); + }); + BasicInfo basicInfo = BasicInfo(contactInformation: contactInformation, primaryInformation: primaryInformation); + ProfileInformation profileInformation = ProfileInformation(basicInfo: basicInfo); + _profileInformation = profileInformation; + } + }catch(e){ + throw(e.toString()); + } + return _profileInformation; + } +} diff --git a/lib/utils/app_router.dart b/lib/utils/app_router.dart index e6bc31b..16eea91 100644 --- a/lib/utils/app_router.dart +++ b/lib/utils/app_router.dart @@ -1,8 +1,10 @@ import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; -import 'package:unit2/bloc/bloc/user_bloc.dart'; +import 'package:unit2/bloc/profile/profile_bloc.dart'; +import 'package:unit2/screens/unit2/homepage.dart/components/menu.dart'; import 'package:unit2/screens/unit2/login/login.dart'; import 'package:unit2/utils/global_context.dart'; +import '../bloc/user/user_bloc.dart'; import '../screens/profile/profile.dart'; import '../screens/unit2/basic-info/basic-info.dart'; import '../screens/unit2/homepage.dart/components/drawer-screen.dart'; @@ -33,7 +35,11 @@ class AppRouter { }); case '/profile': return MaterialPageRoute(builder: (_) { - return const ProfileInfo(); + ProfileArguments arguments = routeSettings.arguments as ProfileArguments; + return BlocProvider( + create: (context) => ProfileBloc()..add(LoadProfile(token: arguments.token,userID: arguments.userID)), + child: const ProfileInfo(), + ); }); default: return MaterialPageRoute(builder: (context) { diff --git a/lib/utils/request.dart b/lib/utils/request.dart index d698418..7d5e215 100644 --- a/lib/utils/request.dart +++ b/lib/utils/request.dart @@ -19,7 +19,7 @@ class Request { Map? param}) async { Response response; try { - response = await get(Uri.https(host, path!, param), headers: headers) + response = await get(Uri.http(host, path!, param), headers: headers) .timeout(Duration(seconds: requestTimeout)); } on TimeoutException catch (_) { Fluttertoast.showToast( @@ -61,7 +61,8 @@ class Request { Map? param}) async { Response response; try { - response = await post(Uri.https(host, path!, param), headers: headers,body: jsonEncode(body)) + response = await post(Uri.http(host, path!, param), + headers: headers, body: jsonEncode(body)) .timeout(Duration(seconds: requestTimeout)); } on TimeoutException catch (_) { Fluttertoast.showToast( diff --git a/lib/utils/urls.dart b/lib/utils/urls.dart index 438d113..cee712a 100644 --- a/lib/utils/urls.dart +++ b/lib/utils/urls.dart @@ -1,19 +1,18 @@ -class Url{ +class Url { static final Url _instance = Url(); static Url get instance => _instance; - String host(){ - // return '192.168.10.219:3000'; - return 'agusandelnorte.gov.ph'; + String host() { + // return '192.168.10.221:3003'; + // return 'agusandelnorte.gov.ph'; + return 'devweb.agusandelnorte.gov.ph'; } - - String authentication(){ + String authentication() { return '/api/account/auth/login/'; } - - String apkUrl(){ - return ""; - } + String profileInformation(){ + return '/api/jobnet_app/profile/pds/'; + } } \ No newline at end of file diff --git a/macos/Flutter/Flutter-Debug.xcconfig b/macos/Flutter/Flutter-Debug.xcconfig index c2efd0b..4b81f9b 100644 --- a/macos/Flutter/Flutter-Debug.xcconfig +++ b/macos/Flutter/Flutter-Debug.xcconfig @@ -1 +1,2 @@ +#include? "Pods/Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig" #include "ephemeral/Flutter-Generated.xcconfig" diff --git a/macos/Flutter/Flutter-Release.xcconfig b/macos/Flutter/Flutter-Release.xcconfig index c2efd0b..5caa9d1 100644 --- a/macos/Flutter/Flutter-Release.xcconfig +++ b/macos/Flutter/Flutter-Release.xcconfig @@ -1 +1,2 @@ +#include? "Pods/Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig" #include "ephemeral/Flutter-Generated.xcconfig" diff --git a/macos/Flutter/GeneratedPluginRegistrant.swift b/macos/Flutter/GeneratedPluginRegistrant.swift index 46d0540..63c4df1 100644 --- a/macos/Flutter/GeneratedPluginRegistrant.swift +++ b/macos/Flutter/GeneratedPluginRegistrant.swift @@ -6,8 +6,8 @@ import FlutterMacOS import Foundation import package_info_plus -import path_provider_macos -import shared_preferences_macos +import path_provider_foundation +import shared_preferences_foundation import sqflite func RegisterGeneratedPlugins(registry: FlutterPluginRegistry) { diff --git a/macos/Podfile b/macos/Podfile new file mode 100644 index 0000000..049abe2 --- /dev/null +++ b/macos/Podfile @@ -0,0 +1,40 @@ +platform :osx, '10.14' + +# CocoaPods analytics sends network stats synchronously affecting flutter build latency. +ENV['COCOAPODS_DISABLE_STATS'] = 'true' + +project 'Runner', { + 'Debug' => :debug, + 'Profile' => :release, + 'Release' => :release, +} + +def flutter_root + generated_xcode_build_settings_path = File.expand_path(File.join('..', 'Flutter', 'ephemeral', 'Flutter-Generated.xcconfig'), __FILE__) + unless File.exist?(generated_xcode_build_settings_path) + raise "#{generated_xcode_build_settings_path} must exist. If you're running pod install manually, make sure \"flutter pub get\" is executed first" + end + + File.foreach(generated_xcode_build_settings_path) do |line| + matches = line.match(/FLUTTER_ROOT\=(.*)/) + return matches[1].strip if matches + end + raise "FLUTTER_ROOT not found in #{generated_xcode_build_settings_path}. Try deleting Flutter-Generated.xcconfig, then run \"flutter pub get\"" +end + +require File.expand_path(File.join('packages', 'flutter_tools', 'bin', 'podhelper'), flutter_root) + +flutter_macos_podfile_setup + +target 'Runner' do + use_frameworks! + use_modular_headers! + + flutter_install_all_macos_pods File.dirname(File.realpath(__FILE__)) +end + +post_install do |installer| + installer.pods_project.targets.each do |target| + flutter_additional_macos_build_settings(target) + end +end diff --git a/pubspec.lock b/pubspec.lock index 42cf4b1..388b681 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -5,224 +5,264 @@ packages: dependency: "direct main" description: name: animate_do - url: "https://pub.dartlang.org" + sha256: "9aeacc1a7238f971c039bdf45d13c628be554a242e0251c4ddda09d19a1a923f" + url: "https://pub.dev" source: hosted version: "3.0.2" archive: dependency: transitive description: name: archive - url: "https://pub.dartlang.org" + sha256: d6347d54a2d8028e0437e3c099f66fdb8ae02c4720c1e7534c9f24c10351f85d + url: "https://pub.dev" source: hosted - version: "3.3.5" + version: "3.3.6" async: dependency: transitive description: name: async - url: "https://pub.dartlang.org" + sha256: bfe67ef28df125b7dddcea62755991f807aa39a2492a23e1550161692950bbe0 + url: "https://pub.dev" source: hosted - version: "2.9.0" + version: "2.10.0" auto_size_text: dependency: "direct main" description: name: auto_size_text - url: "https://pub.dartlang.org" + sha256: "3f5261cd3fb5f2a9ab4e2fc3fba84fd9fcaac8821f20a1d4e71f557521b22599" + url: "https://pub.dev" source: hosted version: "3.0.0" awesome_dialog: dependency: "direct main" description: name: awesome_dialog - url: "https://pub.dartlang.org" + sha256: ac08268b991f228fc6b8880b68ec030d2941bcc8df8b6a6551fb79f2bd36b7da + url: "https://pub.dev" source: hosted version: "3.0.2" azlistview: dependency: "direct main" description: name: azlistview - url: "https://pub.dartlang.org" + sha256: "93e865f11777a271b439f0d6b00799c0797e9daeec2e082a2e01373809c4b90d" + url: "https://pub.dev" source: hosted version: "2.0.0" + badges: + dependency: "direct main" + description: + name: badges + sha256: "461031a60efbb95276f52107f63d5d45008b5ca1eb7f8ca440cadda9ec2143b0" + url: "https://pub.dev" + source: hosted + version: "3.0.2" barcode_scan2: dependency: "direct main" description: name: barcode_scan2 - url: "https://pub.dartlang.org" + sha256: f9af9252b8f3f5fa446f5456fd45f8871d09f883d8389a1d608b39231bfbc3fa + url: "https://pub.dev" source: hosted version: "4.2.3" bloc: dependency: transitive description: name: bloc - url: "https://pub.dartlang.org" + sha256: bd4f8027bfa60d96c8046dec5ce74c463b2c918dce1b0d36593575995344534a + url: "https://pub.dev" source: hosted version: "8.1.0" boolean_selector: dependency: transitive description: name: boolean_selector - url: "https://pub.dartlang.org" + sha256: "6cfb5af12253eaf2b368f07bacc5a80d1301a071c73360d746b7f2e32d762c66" + url: "https://pub.dev" source: hosted - version: "2.1.0" + version: "2.1.1" cached_network_image: dependency: "direct main" description: name: cached_network_image - url: "https://pub.dartlang.org" + sha256: fd3d0dc1d451f9a252b32d95d3f0c3c487bc41a75eba2e6097cb0b9c71491b15 + url: "https://pub.dev" source: hosted version: "3.2.3" cached_network_image_platform_interface: dependency: transitive description: name: cached_network_image_platform_interface - url: "https://pub.dartlang.org" + sha256: bb2b8403b4ccdc60ef5f25c70dead1f3d32d24b9d6117cfc087f496b178594a7 + url: "https://pub.dev" source: hosted version: "2.0.0" cached_network_image_web: dependency: transitive description: name: cached_network_image_web - url: "https://pub.dartlang.org" + sha256: b8eb814ebfcb4dea049680f8c1ffb2df399e4d03bf7a352c775e26fa06e02fa0 + url: "https://pub.dev" source: hosted version: "1.0.2" characters: dependency: transitive description: name: characters - url: "https://pub.dartlang.org" + sha256: e6a326c8af69605aec75ed6c187d06b349707a27fbff8222ca9cc2cff167975c + url: "https://pub.dev" source: hosted version: "1.2.1" clock: dependency: transitive description: name: clock - url: "https://pub.dartlang.org" + sha256: cb6d7f03e1de671e34607e909a7213e31d7752be4fb66a86d29fe1eb14bfb5cf + url: "https://pub.dev" source: hosted version: "1.1.1" collection: dependency: transitive description: name: collection - url: "https://pub.dartlang.org" + sha256: cfc915e6923fe5ce6e153b0723c753045de46de1b4d63771530504004a45fae0 + url: "https://pub.dev" source: hosted - version: "1.16.0" + version: "1.17.0" convert: dependency: transitive description: name: convert - url: "https://pub.dartlang.org" + sha256: "0f08b14755d163f6e2134cb58222dd25ea2a2ee8a195e53983d57c075324d592" + url: "https://pub.dev" source: hosted version: "3.1.1" convex_bottom_bar: dependency: "direct main" description: name: convex_bottom_bar - url: "https://pub.dartlang.org" + sha256: ebf0f3deb1e8e99374d844fee7485d2980ec502dedfaad395c12118477933aef + url: "https://pub.dev" source: hosted - version: "3.1.0+1" + version: "3.2.0" cool_alert: dependency: "direct main" description: name: cool_alert - url: "https://pub.dartlang.org" + sha256: "48a0b6c04914b6dc7e8d7eaccf2adf21bace6533a3eda0aeb412e0d7a03dc00a" + url: "https://pub.dev" source: hosted version: "1.1.0" crypto: dependency: transitive description: name: crypto - url: "https://pub.dartlang.org" + sha256: aa274aa7774f8964e4f4f38cc994db7b6158dd36e9187aaceaddc994b35c6c67 + url: "https://pub.dev" source: hosted version: "3.0.2" date_time_picker: dependency: "direct main" description: name: date_time_picker - url: "https://pub.dartlang.org" + sha256: "6923c568bcb67a66ab7e083708d0adbcae8214b41bb84d49febc17e89e06fc4a" + url: "https://pub.dev" source: hosted version: "2.1.0" device_frame: dependency: transitive description: name: device_frame - url: "https://pub.dartlang.org" + sha256: afe76182aec178d171953d9b4a50a43c57c7cf3c77d8b09a48bf30c8fa04dd9d + url: "https://pub.dev" source: hosted version: "1.1.0" device_preview: dependency: "direct main" description: name: device_preview - url: "https://pub.dartlang.org" + sha256: "2f097bf31b929e15e6756dbe0ec1bcb63952ab9ed51c25dc5a2c722d2b21fdaf" + url: "https://pub.dev" source: hosted version: "1.1.0" dio: dependency: "direct main" description: name: dio - url: "https://pub.dartlang.org" + sha256: "7d328c4d898a61efc3cd93655a0955858e29a0aa647f0f9e02d59b3bb275e2e8" + url: "https://pub.dev" source: hosted version: "4.0.6" easy_app_installer: dependency: "direct main" description: name: easy_app_installer - url: "https://pub.dartlang.org" + sha256: d7287bf247fe6bc85ad07dfb85804757a6dd2f47e61b0e7ce9195ec7f13e09eb + url: "https://pub.dev" source: hosted version: "1.0.0" equatable: dependency: "direct main" description: name: equatable - url: "https://pub.dartlang.org" + sha256: c2b87cb7756efdf69892005af546c56c0b5037f54d2a88269b4f347a505e3ca2 + url: "https://pub.dev" source: hosted version: "2.0.5" expandable_group: dependency: "direct main" description: name: expandable_group - url: "https://pub.dartlang.org" + sha256: "874f9c2daef8a21366fb1df85405f80ee8e8be6e3c2ced727c303641b33b9a95" + url: "https://pub.dev" source: hosted version: "0.0.8" fake_async: dependency: transitive description: name: fake_async - url: "https://pub.dartlang.org" + sha256: "511392330127add0b769b75a987850d136345d9227c6b94c96a04cf4a391bf78" + url: "https://pub.dev" source: hosted version: "1.3.1" ffi: dependency: transitive description: name: ffi - url: "https://pub.dartlang.org" + sha256: a38574032c5f1dd06c4aee541789906c12ccaab8ba01446e800d9c5b79c4a978 + url: "https://pub.dev" source: hosted version: "2.0.1" file: dependency: transitive description: name: file - url: "https://pub.dartlang.org" + sha256: "1b92bec4fc2a72f59a8e15af5f52cd441e4a7860b49499d69dfa817af20e925d" + url: "https://pub.dev" source: hosted version: "6.1.4" file_utils: dependency: transitive description: name: file_utils - url: "https://pub.dartlang.org" + sha256: d1e64389a22649095c8405c9e177272caf05139255931c9ff30d53b5c9bcaa34 + url: "https://pub.dev" source: hosted version: "1.0.1" fixnum: dependency: transitive description: name: fixnum - url: "https://pub.dartlang.org" + sha256: "25517a4deb0c03aa0f32fd12db525856438902d9c16536311e76cdc57b31d7d1" + url: "https://pub.dev" source: hosted - version: "1.0.1" + version: "1.1.0" flare_flutter: dependency: transitive description: name: flare_flutter - url: "https://pub.dartlang.org" + sha256: "99d63c60f00fac81249ce6410ee015d7b125c63d8278a30da81edf3317a1f6a0" + url: "https://pub.dev" source: hosted version: "3.0.2" flutter: @@ -234,42 +274,48 @@ packages: dependency: "direct main" description: name: flutter_bloc - url: "https://pub.dartlang.org" + sha256: "890c51c8007f0182360e523518a0c732efb89876cb4669307af7efada5b55557" + url: "https://pub.dev" source: hosted version: "8.1.1" flutter_blurhash: dependency: transitive description: name: flutter_blurhash - url: "https://pub.dartlang.org" + sha256: "05001537bd3fac7644fa6558b09ec8c0a3f2eba78c0765f88912882b1331a5c6" + url: "https://pub.dev" source: hosted version: "0.7.0" flutter_cache_manager: dependency: transitive description: name: flutter_cache_manager - url: "https://pub.dartlang.org" + sha256: "32cd900555219333326a2d0653aaaf8671264c29befa65bbd9856d204a4c9fb3" + url: "https://pub.dev" source: hosted version: "3.3.0" flutter_custom_clippers: dependency: "direct main" description: name: flutter_custom_clippers - url: "https://pub.dartlang.org" + sha256: "473e3daf61c2a6cee0ad137393259a25223239d519a131c7ec1cac04d06e5407" + url: "https://pub.dev" source: hosted version: "2.1.0" flutter_form_builder: dependency: "direct main" description: name: flutter_form_builder - url: "https://pub.dartlang.org" + sha256: "768b11307e71c60cb66351a87984815bd438b50aa58b5de02c9256a8f2964bee" + url: "https://pub.dev" source: hosted version: "7.7.0" flutter_lints: dependency: "direct dev" description: name: flutter_lints - url: "https://pub.dartlang.org" + sha256: aeb0b80a8b3709709c9cc496cdc027c5b3216796bc0af0ce1007eaf24464fd4c + url: "https://pub.dev" source: hosted version: "2.0.1" flutter_localizations: @@ -281,28 +327,32 @@ packages: dependency: transitive description: name: flutter_plugin_android_lifecycle - url: "https://pub.dartlang.org" + sha256: "60fc7b78455b94e6de2333d2f95196d32cf5c22f4b0b0520a628804cb463503b" + url: "https://pub.dev" source: hosted version: "2.0.7" flutter_progress_hud: dependency: "direct main" description: name: flutter_progress_hud - url: "https://pub.dartlang.org" + sha256: "19a4889460b7482c5026a936b768996dade4daad8570e8c0493e292d57121dbb" + url: "https://pub.dev" source: hosted version: "2.0.2" flutter_spinkit: dependency: "direct main" description: name: flutter_spinkit - url: "https://pub.dartlang.org" + sha256: "77a2117c0517ff909221f3160b8eb20052ab5216107581168af574ac1f05dff8" + url: "https://pub.dev" source: hosted version: "5.1.0" flutter_svg: dependency: "direct main" description: name: flutter_svg - url: "https://pub.dartlang.org" + sha256: "6ff9fa12892ae074092de2fa6a9938fb21dbabfdaa2ff57dc697ff912fc8d4b2" + url: "https://pub.dev" source: hosted version: "1.1.6" flutter_test: @@ -319,413 +369,456 @@ packages: dependency: "direct main" description: name: flutter_zoom_drawer - url: "https://pub.dartlang.org" + sha256: "93c4f2cfe1edfe2f9e48b94a7f9538520d2f2593e202b8e89c394b7d27137a8e" + url: "https://pub.dev" source: hosted version: "3.0.3" fluttericon: dependency: "direct main" description: name: fluttericon - url: "https://pub.dartlang.org" + sha256: "252fa8043826e93d972a602497a260cb3d62b5aea6d045793e4381590f2c1e99" + url: "https://pub.dev" source: hosted version: "2.0.0" fluttertoast: dependency: "direct main" description: name: fluttertoast - url: "https://pub.dartlang.org" + sha256: "7cc92eabe01e3f1babe1571c5560b135dfc762a34e41e9056881e2196b178ec1" + url: "https://pub.dev" source: hosted version: "8.1.2" form_builder_validators: dependency: "direct main" description: name: form_builder_validators - url: "https://pub.dartlang.org" + sha256: e4d54c0c513e3e36ae4e4905994873a0a907585407212effeef39a68e759670c + url: "https://pub.dev" source: hosted version: "8.4.0" freezed_annotation: dependency: transitive description: name: freezed_annotation - url: "https://pub.dartlang.org" + sha256: aeac15850ef1b38ee368d4c53ba9a847e900bb2c53a4db3f6881cbb3cb684338 + url: "https://pub.dev" source: hosted version: "2.2.0" globbing: dependency: transitive description: name: globbing - url: "https://pub.dartlang.org" + sha256: "4f89cfaf6fa74c9c1740a96259da06bd45411ede56744e28017cc534a12b6e2d" + url: "https://pub.dev" source: hosted version: "1.0.0" graphs: dependency: transitive description: name: graphs - url: "https://pub.dartlang.org" + sha256: f9e130f3259f52d26f0cfc0e964513796dafed572fa52e45d2f8d6ca14db39b2 + url: "https://pub.dev" source: hosted version: "2.2.0" http: dependency: transitive description: name: http - url: "https://pub.dartlang.org" + sha256: "6aa2946395183537c8b880962d935877325d6a09a2867c3970c05c0fed6ac482" + url: "https://pub.dev" source: hosted version: "0.13.5" http_parser: dependency: transitive description: name: http_parser - url: "https://pub.dartlang.org" + sha256: "2aa08ce0341cc9b354a498388e30986515406668dbcc4f7c950c3e715496693b" + url: "https://pub.dev" source: hosted version: "4.0.2" image: dependency: transitive description: name: image - url: "https://pub.dartlang.org" + sha256: "8e9d133755c3e84c73288363e6343157c383a0c6c56fc51afcc5d4d7180306d6" + url: "https://pub.dev" source: hosted version: "3.3.0" intl: dependency: "direct main" description: name: intl - url: "https://pub.dartlang.org" + sha256: "910f85bce16fb5c6f614e117efa303e85a1731bb0081edf3604a2ae6e9a3cc91" + url: "https://pub.dev" source: hosted version: "0.17.0" js: dependency: transitive description: name: js - url: "https://pub.dartlang.org" + sha256: "5528c2f391ededb7775ec1daa69e65a2d61276f7552de2b5f7b8d34ee9fd4ab7" + url: "https://pub.dev" source: hosted - version: "0.6.4" + version: "0.6.5" json_annotation: dependency: transitive description: name: json_annotation - url: "https://pub.dartlang.org" + sha256: c33da08e136c3df0190bd5bbe51ae1df4a7d96e7954d1d7249fea2968a72d317 + url: "https://pub.dev" source: hosted - version: "4.7.0" + version: "4.8.0" lints: dependency: transitive description: name: lints - url: "https://pub.dartlang.org" + sha256: "5e4a9cd06d447758280a8ac2405101e0e2094d2a1dbdd3756aec3fe7775ba593" + url: "https://pub.dev" source: hosted version: "2.0.1" lottie: dependency: transitive description: name: lottie - url: "https://pub.dartlang.org" + sha256: "893da7a0022ec2fcaa616f34529a081f617e86cc501105b856e5a3184c58c7c2" + url: "https://pub.dev" source: hosted version: "1.4.3" matcher: dependency: transitive description: name: matcher - url: "https://pub.dartlang.org" + sha256: "16db949ceee371e9b99d22f88fa3a73c4e59fd0afed0bd25fc336eb76c198b72" + url: "https://pub.dev" source: hosted - version: "0.12.12" + version: "0.12.13" material_color_utilities: dependency: transitive description: name: material_color_utilities - url: "https://pub.dartlang.org" + sha256: d92141dc6fe1dad30722f9aa826c7fbc896d021d792f80678280601aff8cf724 + url: "https://pub.dev" source: hosted - version: "0.1.5" + version: "0.2.0" meta: dependency: transitive description: name: meta - url: "https://pub.dartlang.org" + sha256: "6c268b42ed578a53088d834796959e4a1814b5e9e164f147f580a386e5decf42" + url: "https://pub.dev" source: hosted version: "1.8.0" nested: dependency: transitive description: name: nested - url: "https://pub.dartlang.org" + sha256: "03bac4c528c64c95c722ec99280375a6f2fc708eec17c7b3f07253b626cd2a20" + url: "https://pub.dev" source: hosted version: "1.0.0" octo_image: dependency: transitive description: name: octo_image - url: "https://pub.dartlang.org" + sha256: "107f3ed1330006a3bea63615e81cf637433f5135a52466c7caa0e7152bca9143" + url: "https://pub.dev" source: hosted version: "1.0.2" package_info_plus: dependency: "direct main" description: name: package_info_plus - url: "https://pub.dartlang.org" + sha256: f619162573096d428ccde2e33f92e05b5a179cd6f0e3120c1005f181bee8ed16 + url: "https://pub.dev" source: hosted version: "3.0.2" package_info_plus_platform_interface: dependency: transitive description: name: package_info_plus_platform_interface - url: "https://pub.dartlang.org" + sha256: "9bc8ba46813a4cc42c66ab781470711781940780fd8beddd0c3da62506d3a6c6" + url: "https://pub.dev" source: hosted version: "2.0.1" path: dependency: transitive description: name: path - url: "https://pub.dartlang.org" + sha256: db9d4f58c908a4ba5953fcee2ae317c94889433e5024c27ce74a37f94267945b + url: "https://pub.dev" source: hosted version: "1.8.2" path_drawing: dependency: transitive description: name: path_drawing - url: "https://pub.dartlang.org" + sha256: bbb1934c0cbb03091af082a6389ca2080345291ef07a5fa6d6e078ba8682f977 + url: "https://pub.dev" source: hosted version: "1.0.1" path_parsing: dependency: transitive description: name: path_parsing - url: "https://pub.dartlang.org" + sha256: e3e67b1629e6f7e8100b367d3db6ba6af4b1f0bb80f64db18ef1fbabd2fa9ccf + url: "https://pub.dev" source: hosted version: "1.0.1" path_provider: dependency: "direct main" description: name: path_provider - url: "https://pub.dartlang.org" + sha256: dcea5feb97d8abf90cab9e9030b497fb7c3cbf26b7a1fe9e3ef7dcb0a1ddec95 + url: "https://pub.dev" source: hosted - version: "2.0.11" + version: "2.0.12" path_provider_android: dependency: transitive description: name: path_provider_android - url: "https://pub.dartlang.org" + sha256: a776c088d671b27f6e3aa8881d64b87b3e80201c64e8869b811325de7a76c15e + url: "https://pub.dev" source: hosted version: "2.0.22" - path_provider_ios: + path_provider_foundation: dependency: transitive description: - name: path_provider_ios - url: "https://pub.dartlang.org" + name: path_provider_foundation + sha256: "62a68e7e1c6c459f9289859e2fae58290c981ce21d1697faf54910fe1faa4c74" + url: "https://pub.dev" source: hosted - version: "2.0.11" + version: "2.1.1" path_provider_linux: dependency: transitive description: name: path_provider_linux - url: "https://pub.dartlang.org" + sha256: ab0987bf95bc591da42dffb38c77398fc43309f0b9b894dcc5d6f40c4b26c379 + url: "https://pub.dev" source: hosted version: "2.1.7" - path_provider_macos: - dependency: transitive - description: - name: path_provider_macos - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.6" path_provider_platform_interface: dependency: transitive description: name: path_provider_platform_interface - url: "https://pub.dartlang.org" + sha256: f0abc8ebd7253741f05488b4813d936b4d07c6bae3e86148a09e342ee4b08e76 + url: "https://pub.dev" source: hosted version: "2.0.5" path_provider_windows: dependency: transitive description: name: path_provider_windows - url: "https://pub.dartlang.org" + sha256: bcabbe399d4042b8ee687e17548d5d3f527255253b4a639f5f8d2094a9c2b45c + url: "https://pub.dev" source: hosted version: "2.1.3" pedantic: dependency: transitive description: name: pedantic - url: "https://pub.dartlang.org" + sha256: "67fc27ed9639506c856c840ccce7594d0bdcd91bc8d53d6e52359449a1d50602" + url: "https://pub.dev" source: hosted version: "1.11.1" permission_handler: dependency: "direct main" description: name: permission_handler - url: "https://pub.dartlang.org" + sha256: "33c6a1253d1f95fd06fa74b65b7ba907ae9811f9d5c1d3150e51417d04b8d6a8" + url: "https://pub.dev" source: hosted version: "10.2.0" permission_handler_android: dependency: transitive description: name: permission_handler_android - url: "https://pub.dartlang.org" + sha256: "8028362b40c4a45298f1cbfccd227c8dd6caf0e27088a69f2ba2ab15464159e2" + url: "https://pub.dev" source: hosted version: "10.2.0" permission_handler_apple: dependency: transitive description: name: permission_handler_apple - url: "https://pub.dartlang.org" + sha256: "9c370ef6a18b1c4b2f7f35944d644a56aa23576f23abee654cf73968de93f163" + url: "https://pub.dev" source: hosted version: "9.0.7" permission_handler_platform_interface: dependency: transitive description: name: permission_handler_platform_interface - url: "https://pub.dartlang.org" + sha256: "68abbc472002b5e6dfce47fe9898c6b7d8328d58b5d2524f75e277c07a97eb84" + url: "https://pub.dev" source: hosted version: "3.9.0" permission_handler_windows: dependency: transitive description: name: permission_handler_windows - url: "https://pub.dartlang.org" + sha256: f67cab14b4328574938ecea2db3475dad7af7ead6afab6338772c5f88963e38b + url: "https://pub.dev" source: hosted version: "0.1.2" petitparser: dependency: transitive description: name: petitparser - url: "https://pub.dartlang.org" + sha256: "49392a45ced973e8d94a85fdb21293fbb40ba805fc49f2965101ae748a3683b4" + url: "https://pub.dev" source: hosted version: "5.1.0" platform: dependency: transitive description: name: platform - url: "https://pub.dartlang.org" + sha256: "4a451831508d7d6ca779f7ac6e212b4023dd5a7d08a27a63da33756410e32b76" + url: "https://pub.dev" source: hosted version: "3.1.0" plugin_platform_interface: dependency: transitive description: name: plugin_platform_interface - url: "https://pub.dartlang.org" + sha256: dbf0f707c78beedc9200146ad3cb0ab4d5da13c246336987be6940f026500d3a + url: "https://pub.dev" source: hosted version: "2.1.3" pointycastle: dependency: transitive description: name: pointycastle - url: "https://pub.dartlang.org" + sha256: db7306cf0249f838d1a24af52b5a5887c5bf7f31d8bb4e827d071dc0939ad346 + url: "https://pub.dev" source: hosted version: "3.6.2" process: dependency: transitive description: name: process - url: "https://pub.dartlang.org" + sha256: "53fd8db9cec1d37b0574e12f07520d582019cb6c44abf5479a01505099a34a09" + url: "https://pub.dev" source: hosted version: "4.2.4" protobuf: dependency: transitive description: name: protobuf - url: "https://pub.dartlang.org" + sha256: "01dd9bd0fa02548bf2ceee13545d4a0ec6046459d847b6b061d8a27237108a08" + url: "https://pub.dev" source: hosted version: "2.1.0" provider: dependency: transitive description: name: provider - url: "https://pub.dartlang.org" + sha256: cdbe7530b12ecd9eb455bdaa2fcb8d4dad22e80b8afb4798b41479d5ce26847f + url: "https://pub.dev" source: hosted version: "6.0.5" qr: dependency: transitive description: name: qr - url: "https://pub.dartlang.org" + sha256: "5c4208b4dc0d55c3184d10d83ee0ded6212dc2b5e2ba17c5a0c0aab279128d21" + url: "https://pub.dev" source: hosted version: "2.1.0" qr_flutter: dependency: "direct main" description: name: qr_flutter - url: "https://pub.dartlang.org" + sha256: c5c121c54cb6dd837b9b9d57eb7bc7ec6df4aee741032060c8833a678c80b87e + url: "https://pub.dev" source: hosted version: "4.0.0" rive: dependency: transitive description: name: rive - url: "https://pub.dartlang.org" + sha256: "22e3755b75f4ea4492d2fecf4fc2acf1c8d0073df39781d290a20cbfe74c3760" + url: "https://pub.dev" source: hosted version: "0.9.1" rxdart: dependency: transitive description: name: rxdart - url: "https://pub.dartlang.org" + sha256: "0c7c0cedd93788d996e33041ffecda924cc54389199cde4e6a34b440f50044cb" + url: "https://pub.dev" source: hosted version: "0.27.7" scrollable_positioned_list: dependency: transitive description: name: scrollable_positioned_list - url: "https://pub.dartlang.org" + sha256: "9566352ab9ba05794ee6c8864f154afba5d36c5637d0e3e32c615ba4ceb92772" + url: "https://pub.dev" source: hosted version: "0.2.3" shared_preferences: dependency: transitive description: name: shared_preferences - url: "https://pub.dartlang.org" + sha256: "5949029e70abe87f75cfe59d17bf5c397619c4b74a099b10116baeb34786fad9" + url: "https://pub.dev" source: hosted - version: "2.0.15" + version: "2.0.17" shared_preferences_android: dependency: transitive description: name: shared_preferences_android - url: "https://pub.dartlang.org" + sha256: "955e9736a12ba776bdd261cf030232b30eadfcd9c79b32a3250dd4a494e8c8f7" + url: "https://pub.dev" source: hosted - version: "2.0.14" - shared_preferences_ios: + version: "2.0.15" + shared_preferences_foundation: dependency: transitive description: - name: shared_preferences_ios - url: "https://pub.dartlang.org" + name: shared_preferences_foundation + sha256: "1ffa239043ab8baf881ec3094a3c767af9d10399b2839020b9e4d44c0bb23951" + url: "https://pub.dev" source: hosted - version: "2.1.1" + version: "2.1.2" shared_preferences_linux: dependency: transitive description: name: shared_preferences_linux - url: "https://pub.dartlang.org" + sha256: f8ea038aa6da37090093974ebdcf4397010605fd2ff65c37a66f9d28394cb874 + url: "https://pub.dev" source: hosted - version: "2.1.2" - shared_preferences_macos: - dependency: transitive - description: - name: shared_preferences_macos - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.5" + version: "2.1.3" shared_preferences_platform_interface: dependency: transitive description: name: shared_preferences_platform_interface - url: "https://pub.dartlang.org" + sha256: da9431745ede5ece47bc26d5d73a9d3c6936ef6945c101a5aca46f62e52c1cf3 + url: "https://pub.dev" source: hosted version: "2.1.0" shared_preferences_web: dependency: transitive description: name: shared_preferences_web - url: "https://pub.dartlang.org" + sha256: a4b5bc37fe1b368bbc81f953197d55e12f49d0296e7e412dfe2d2d77d6929958 + url: "https://pub.dev" source: hosted version: "2.0.4" shared_preferences_windows: dependency: transitive description: name: shared_preferences_windows - url: "https://pub.dartlang.org" + sha256: "5eaf05ae77658d3521d0e993ede1af962d4b326cd2153d312df716dc250f00c9" + url: "https://pub.dev" source: hosted - version: "2.1.2" + version: "2.1.3" signature: dependency: "direct main" description: name: signature - url: "https://pub.dartlang.org" + sha256: ad23383717dfa926204695ef6928ff513a77387be1b4a8c685099ce3ec35e5f8 + url: "https://pub.dev" source: hosted version: "5.3.0" sky_engine: @@ -737,121 +830,138 @@ packages: dependency: transitive description: name: source_span - url: "https://pub.dartlang.org" + sha256: dd904f795d4b4f3b870833847c461801f6750a9fa8e61ea5ac53f9422b31f250 + url: "https://pub.dev" source: hosted - version: "1.9.0" + version: "1.9.1" sqflite: dependency: transitive description: name: sqflite - url: "https://pub.dartlang.org" + sha256: "78324387dc81df14f78df06019175a86a2ee0437624166c382e145d0a7fd9a4f" + url: "https://pub.dev" source: hosted - version: "2.2.2" + version: "2.2.4+1" sqflite_common: dependency: transitive description: name: sqflite_common - url: "https://pub.dartlang.org" + sha256: bfd6973aaeeb93475bc0d875ac9aefddf7965ef22ce09790eb963992ffc5183f + url: "https://pub.dev" source: hosted - version: "2.4.0+2" + version: "2.4.2+2" stack_trace: dependency: transitive description: name: stack_trace - url: "https://pub.dartlang.org" + sha256: c3c7d8edb15bee7f0f74debd4b9c5f3c2ea86766fe4178eb2a18eb30a0bdaed5 + url: "https://pub.dev" source: hosted - version: "1.10.0" + version: "1.11.0" stream_channel: dependency: transitive description: name: stream_channel - url: "https://pub.dartlang.org" + sha256: "83615bee9045c1d322bbbd1ba209b7a749c2cbcdcb3fdd1df8eb488b3279c1c8" + url: "https://pub.dev" source: hosted - version: "2.1.0" + version: "2.1.1" string_scanner: dependency: transitive description: name: string_scanner - url: "https://pub.dartlang.org" + sha256: "556692adab6cfa87322a115640c11f13cb77b3f076ddcc5d6ae3c20242bedcde" + url: "https://pub.dev" source: hosted - version: "1.1.1" + version: "1.2.0" synchronized: dependency: transitive description: name: synchronized - url: "https://pub.dartlang.org" + sha256: "33b31b6beb98100bf9add464a36a8dd03eb10c7a8cf15aeec535e9b054aaf04b" + url: "https://pub.dev" source: hosted - version: "3.0.0+3" + version: "3.0.1" system_info2: dependency: "direct main" description: name: system_info2 - url: "https://pub.dartlang.org" + sha256: "90621f3ba586e1f268e38cc7951b172cd4d997e43dc1fbed12eb334c8a22a886" + url: "https://pub.dev" source: hosted version: "2.0.4" term_glyph: dependency: transitive description: name: term_glyph - url: "https://pub.dartlang.org" + sha256: a29248a84fbb7c79282b40b8c72a1209db169a2e0542bce341da992fe1bc7e84 + url: "https://pub.dev" source: hosted version: "1.2.1" test_api: dependency: transitive description: name: test_api - url: "https://pub.dartlang.org" + sha256: ad540f65f92caa91bf21dfc8ffb8c589d6e4dc0c2267818b4cc2792857706206 + url: "https://pub.dev" source: hosted - version: "0.4.12" + version: "0.4.16" toggle_switch: dependency: "direct main" description: name: toggle_switch - url: "https://pub.dartlang.org" + sha256: "82c778c4bfe93af154a41e346ccd1d5b0cb6a50f8f187941412edd0a9bbf51ee" + url: "https://pub.dev" source: hosted version: "2.0.1" typed_data: dependency: transitive description: name: typed_data - url: "https://pub.dartlang.org" + sha256: "26f87ade979c47a150c9eaab93ccd2bebe70a27dc0b4b29517f2904f04eb11a5" + url: "https://pub.dev" source: hosted version: "1.3.1" uuid: dependency: transitive description: name: uuid - url: "https://pub.dartlang.org" + sha256: "648e103079f7c64a36dc7d39369cabb358d377078a051d6ae2ad3aa539519313" + url: "https://pub.dev" source: hosted version: "3.0.7" vector_math: dependency: transitive description: name: vector_math - url: "https://pub.dartlang.org" + sha256: "80b3257d1492ce4d091729e3a67a60407d227c27241d6927be0130c98e741803" + url: "https://pub.dev" source: hosted - version: "2.1.2" + version: "2.1.4" win32: dependency: transitive description: name: win32 - url: "https://pub.dartlang.org" + sha256: c9ebe7ee4ab0c2194e65d3a07d8c54c5d00bb001b76081c4a04cdb8448b59e46 + url: "https://pub.dev" source: hosted version: "3.1.3" xdg_directories: dependency: transitive description: name: xdg_directories - url: "https://pub.dartlang.org" + sha256: bd512f03919aac5f1313eb8249f223bacf4927031bf60b02601f81f687689e86 + url: "https://pub.dev" source: hosted - version: "0.2.0+2" + version: "0.2.0+3" xml: dependency: transitive description: name: xml - url: "https://pub.dartlang.org" + sha256: "979ee37d622dec6365e2efa4d906c37470995871fe9ae080d967e192d88286b5" + url: "https://pub.dev" source: hosted - version: "6.1.0" + version: "6.2.2" sdks: - dart: ">=2.18.5 <3.0.0" + dart: ">=2.19.0 <4.0.0" flutter: ">=3.3.0" diff --git a/pubspec.yaml b/pubspec.yaml index f989e51..698736c 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -67,6 +67,7 @@ dependencies: cool_alert: ^1.1.0 permission_handler: ^10.2.0 expandable_group: ^0.0.8 + badges: ^3.0.2 dev_dependencies: flutter_test: