offline features inital

feature/passo/PASSO-#1-Sync-data-from-device-to-postgre-and-vice-versa
PGAN-MIS 2023-10-06 12:43:37 +08:00
parent 65794bf922
commit f9fd714fa6
25 changed files with 973 additions and 243 deletions

Binary file not shown.

After

Width:  |  Height:  |  Size: 265 KiB

View File

@ -8,6 +8,8 @@ import 'package:unit2/model/login_data/user_info/assigned_area.dart';
import 'package:unit2/model/login_data/user_info/role.dart'; import 'package:unit2/model/login_data/user_info/role.dart';
import 'package:unit2/model/login_data/user_info/user_data.dart'; import 'package:unit2/model/login_data/user_info/user_data.dart';
import 'package:unit2/model/login_data/version_info.dart'; import 'package:unit2/model/login_data/version_info.dart';
import 'package:unit2/model/offline/offlane_modules.dart';
import 'package:unit2/model/offline/offline_profile.dart';
import 'package:unit2/screens/unit2/login/functions/get_app_version.dart'; import 'package:unit2/screens/unit2/login/functions/get_app_version.dart';
import 'package:unit2/sevices/login_service/auth_service.dart'; import 'package:unit2/sevices/login_service/auth_service.dart';
import 'package:unit2/utils/global.dart'; import 'package:unit2/utils/global.dart';
@ -15,6 +17,7 @@ import '../../utils/scanner.dart';
import '../../utils/text_container.dart'; import '../../utils/text_container.dart';
part 'user_event.dart'; part 'user_event.dart';
part 'user_state.dart'; part 'user_state.dart';
class UserBloc extends Bloc<UserEvent, UserState> { class UserBloc extends Bloc<UserEvent, UserState> {
UserData? _userData; UserData? _userData;
VersionInfo? _versionInfo; VersionInfo? _versionInfo;
@ -40,13 +43,13 @@ class UserBloc extends Bloc<UserEvent, UserState> {
final String? saved = CREDENTIALS?.get('saved'); final String? saved = CREDENTIALS?.get('saved');
username = CREDENTIALS?.get('username'); username = CREDENTIALS?.get('username');
password = CREDENTIALS?.get('password'); password = CREDENTIALS?.get('password');
if(apkVersion != _versionInfo!.id ){ if (apkVersion != _versionInfo!.id) {
emit(VersionLoaded( emit(VersionLoaded(
versionInfo: _versionInfo, versionInfo: _versionInfo,
apkVersion: _apkVersion, apkVersion: _apkVersion,
username: event.username, username: event.username,
password: event.password)); password: event.password));
}else if (saved != null) { } else if (saved != null) {
save = true; save = true;
add(UserLogin(username: username, password: password)); add(UserLogin(username: username, password: password));
} else { } else {
@ -57,10 +60,15 @@ class UserBloc extends Bloc<UserEvent, UserState> {
password: event.password)); password: event.password));
} }
} catch (e) { } catch (e) {
bool? offlineAvalable = await OFFLINE!.get('offline');
if (offlineAvalable == true) {
emit(ErrorWithOfflineMode());
} else {
emit(UserError( emit(UserError(
message: e.toString(), message: e.toString(),
)); ));
} }
}
}); });
////Loading the current version of the app ////Loading the current version of the app
on<LoadVersion>((event, emit) { on<LoadVersion>((event, emit) {
@ -76,6 +84,8 @@ class UserBloc extends Bloc<UserEvent, UserState> {
on<UserLogin>((event, emit) async { on<UserLogin>((event, emit) async {
username = event.username; username = event.username;
password = event.password; password = event.password;
bool? availableOffline;
List<OfflineModules> offlineCards = [];
try { try {
Map<dynamic, dynamic> response = await AuthService.instance Map<dynamic, dynamic> response = await AuthService.instance
.webLogin(username: event.username, password: event.password); .webLogin(username: event.username, password: event.password);
@ -85,7 +95,8 @@ class UserBloc extends Bloc<UserEvent, UserState> {
if (userData.user?.login?.user?.roles != null && if (userData.user?.login?.user?.roles != null &&
userData.user!.login!.user!.roles!.isNotEmpty) { userData.user!.login!.user!.roles!.isNotEmpty) {
userData.user!.login!.user!.roles!.forEach((element) { userData.user!.login!.user!.roles!.forEach((element) {
if (element!.name!.toLowerCase() == 'establishment point-person') { if (element!.name!.toLowerCase() ==
'establishment point-person') {
estPointPerson = element; estPointPerson = element;
} }
}); });
@ -96,7 +107,50 @@ class UserBloc extends Bloc<UserEvent, UserState> {
}); });
} }
} }
////Check offline availabilty
for (var role in userData.user!.login!.user!.roles!) {
if (role!.name!.toLowerCase() == 'field surveyor') {
availableOffline = true;
OfflineModules newOfflineModule = OfflineModules(
moduleName: role.modules!.first!.name!,
object: role.modules!.first!.objects!.first!,
roleName: role.name!,
roleId: role.id!);
offlineCards.add(newOfflineModule);
OfflineProfile offlineProfile = OfflineProfile(
webuserId: userData.employeeInfo?.profile?.webuserId,
id: userData.employeeInfo?.profile?.id,
lastName: userData.employeeInfo?.profile?.lastName,
firstName: userData.employeeInfo?.profile?.lastName,
middleName: userData.employeeInfo?.profile?.middleName,
nameExtension: userData.employeeInfo?.profile?.nameExtension,
sex: userData.employeeInfo?.profile?.sex,
birthdate: userData.employeeInfo?.profile?.birthdate,
civilStatus: civilStatus,
bloodType: bloodType,
heightM: userData.employeeInfo?.profile?.heightM,
weightKg: userData.employeeInfo?.profile?.weightKg,
photoPath: userData.employeeInfo?.profile?.photoPath,
esigPath: userData.employeeInfo?.profile?.esigPath,
maidenName: userData.employeeInfo?.profile?.maidenName,
deceased: userData.employeeInfo?.profile?.deceased,
uuidQrcode: userData.employeeInfo?.profile?.uuidQrcode,
titlePrefix: userData.employeeInfo?.profile?.titlePrefix,
titleSuffix: userData.employeeInfo?.profile?.titleSuffix,
showTitleId: userData.employeeInfo?.profile?.showTitleId,
ethnicity: userData.employeeInfo?.profile?.ethnicity,
disability: userData.employeeInfo?.profile?.disability,
gender: userData.employeeInfo?.profile?.gender,
religion: userData.employeeInfo?.profile?.religion,
ip: userData.employeeInfo?.profile?.ip);
await OFFLINE!.put("offline_profile", offlineProfile);
break;
}
}
await OFFLINE!.put('modules', offlineCards);
await OFFLINE!.put('offline', availableOffline);
globalOfflineAvailable = availableOffline;
emit(UserLoggedIn( emit(UserLoggedIn(
estPersonAssignedArea: establishmentPointPersonAssignedAreas, estPersonAssignedArea: establishmentPointPersonAssignedAreas,
userData: userData, userData: userData,
@ -111,14 +165,13 @@ class UserBloc extends Bloc<UserEvent, UserState> {
message: response['message'], message: response['message'],
savedCredentials: save)); savedCredentials: save));
} }
} } on TimeoutException catch (_) {
on TimeoutException catch (_) {
emit(InternetTimeout(message: timeoutError)); emit(InternetTimeout(message: timeoutError));
} on SocketException catch (_) { } on SocketException catch (_) {
emit(InternetTimeout(message: timeoutError)); emit(InternetTimeout(message: timeoutError));
} on Error catch (e) { } on Error catch (e) {
emit(LoginErrorState(message: e.toString())); emit(LoginErrorState(message: e.toString()));
}catch(e){ } catch (e) {
emit(LoginErrorState(message: e.toString())); emit(LoginErrorState(message: e.toString()));
} }
}); });

View File

@ -71,3 +71,7 @@ class LoginErrorState extends UserState{
final String message; final String message;
LoginErrorState({required this.message}); LoginErrorState({required this.message});
} }
class ErrorWithOfflineMode extends UserState{
}

View File

@ -4,6 +4,10 @@ import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:hive_flutter/hive_flutter.dart'; import 'package:hive_flutter/hive_flutter.dart';
import 'package:unit2/bloc/profile/profile_bloc.dart'; import 'package:unit2/bloc/profile/profile_bloc.dart';
import 'package:unit2/bloc/user/user_bloc.dart'; import 'package:unit2/bloc/user/user_bloc.dart';
import 'package:unit2/model/login_data/user_info/module.dart';
import 'package:unit2/model/login_data/user_info/module_object.dart';
import 'package:unit2/model/offline/offlane_modules.dart';
import 'package:unit2/model/offline/offline_profile.dart';
import 'package:unit2/utils/app_router.dart'; import 'package:unit2/utils/app_router.dart';
import 'package:unit2/utils/global_context.dart'; import 'package:unit2/utils/global_context.dart';
import 'package:path_provider/path_provider.dart' as path_provider; import 'package:path_provider/path_provider.dart' as path_provider;
@ -12,9 +16,16 @@ import './utils/global.dart';
Future main() async { Future main() async {
WidgetsFlutterBinding.ensureInitialized(); WidgetsFlutterBinding.ensureInitialized();
var appDirectory = await path_provider.getApplicationDocumentsDirectory(); var appDirectory = await path_provider.getApplicationDocumentsDirectory();
await Hive.initFlutter(appDirectory.path); await Hive.initFlutter(appDirectory.path);
Hive.registerAdapter<OfflineProfile>(OfflineProfileAdapter());
Hive.registerAdapter<Module>(ModuleAdapter());
Hive.registerAdapter<ModuleObject>(ModuleObjectAdapter());
Hive.registerAdapter<OfflineModules>(OfflineModulesAdapter());
CREDENTIALS = await Hive.openBox<dynamic>('credentials'); CREDENTIALS = await Hive.openBox<dynamic>('credentials');
SOS = await Hive.openBox<dynamic>('soscontacts'); SOS = await Hive.openBox<dynamic>('soscontacts');
OFFLINE = await Hive.openBox<dynamic>('offline');
SystemChrome.setPreferredOrientations([DeviceOrientation.portraitUp]) SystemChrome.setPreferredOrientations([DeviceOrientation.portraitUp])
.then((_) { .then((_) {
runApp(MyApp()); runApp(MyApp());

View File

@ -1,4 +1,8 @@
class Module { import 'package:hive/hive.dart';
import 'package:unit2/model/login_data/user_info/module_object.dart';
part 'module.g.dart';
@HiveType(typeId: 1)
class Module extends HiveObject {
Module({ Module({
this.id, this.id,
this.icon, this.icon,
@ -6,11 +10,15 @@ class Module {
this.slug, this.slug,
this.objects, this.objects,
}); });
@HiveField(0)
int? id; int? id;
@HiveField(1)
String? icon; String? icon;
@HiveField(2)
String? name; String? name;
@HiveField(3)
String? slug; String? slug;
@HiveField(4)
List<ModuleObject?>? objects; List<ModuleObject?>? objects;
factory Module.fromJson(Map<String, dynamic> json) => Module( factory Module.fromJson(Map<String, dynamic> json) => Module(
@ -35,34 +43,3 @@ class Module {
}; };
} }
class ModuleObject {
ModuleObject({
this.id,
this.name,
this.slug,
this.operations,
});
int? id;
String? name;
String? slug;
List<String?>? operations;
factory ModuleObject.fromJson(Map<String, dynamic> json) => ModuleObject(
id: json["id"],
name: json["name"],
slug: json["slug"],
operations: json["operations"] == null
? []
: List<String?>.from(json["operations"]!.map((x) => x)),
);
Map<String, dynamic> toJson() => {
"id": id,
"name": name,
"slug": slug,
"operations": operations == null
? []
: List<dynamic>.from(operations!.map((x) => x)),
};
}

View File

@ -0,0 +1,53 @@
// GENERATED CODE - DO NOT MODIFY BY HAND
part of 'module.dart';
// **************************************************************************
// TypeAdapterGenerator
// **************************************************************************
class ModuleAdapter extends TypeAdapter<Module> {
@override
final int typeId = 1;
@override
Module read(BinaryReader reader) {
final numOfFields = reader.readByte();
final fields = <int, dynamic>{
for (int i = 0; i < numOfFields; i++) reader.readByte(): reader.read(),
};
return Module(
id: fields[0] as int?,
icon: fields[1] as String?,
name: fields[2] as String?,
slug: fields[3] as String?,
objects: (fields[4] as List?)?.cast<ModuleObject?>(),
);
}
@override
void write(BinaryWriter writer, Module obj) {
writer
..writeByte(5)
..writeByte(0)
..write(obj.id)
..writeByte(1)
..write(obj.icon)
..writeByte(2)
..write(obj.name)
..writeByte(3)
..write(obj.slug)
..writeByte(4)
..write(obj.objects);
}
@override
int get hashCode => typeId.hashCode;
@override
bool operator ==(Object other) =>
identical(this, other) ||
other is ModuleAdapter &&
runtimeType == other.runtimeType &&
typeId == other.typeId;
}

View File

@ -0,0 +1,37 @@
import 'package:hive/hive.dart';
part 'module_object.g.dart';
@HiveType(typeId: 2)
class ModuleObject extends HiveObject {
ModuleObject({
this.id,
this.name,
this.slug,
this.operations,
});
@HiveField(0)
int? id;
@HiveField(1)
String? name;
@HiveField(2)
String? slug;
@HiveField(3)
List<String?>? operations;
factory ModuleObject.fromJson(Map<String, dynamic> json) => ModuleObject(
id: json["id"],
name: json["name"],
slug: json["slug"],
operations: json["operations"] == null
? []
: List<String?>.from(json["operations"]!.map((x) => x)),
);
Map<String, dynamic> toJson() => {
"id": id,
"name": name,
"slug": slug,
"operations": operations == null
? []
: List<dynamic>.from(operations!.map((x) => x)),
};
}

View File

@ -0,0 +1,50 @@
// GENERATED CODE - DO NOT MODIFY BY HAND
part of 'module_object.dart';
// **************************************************************************
// TypeAdapterGenerator
// **************************************************************************
class ModuleObjectAdapter extends TypeAdapter<ModuleObject> {
@override
final int typeId = 2;
@override
ModuleObject read(BinaryReader reader) {
final numOfFields = reader.readByte();
final fields = <int, dynamic>{
for (int i = 0; i < numOfFields; i++) reader.readByte(): reader.read(),
};
return ModuleObject(
id: fields[0] as int?,
name: fields[1] as String?,
slug: fields[2] as String?,
operations: (fields[3] as List?)?.cast<String?>(),
);
}
@override
void write(BinaryWriter writer, ModuleObject obj) {
writer
..writeByte(4)
..writeByte(0)
..write(obj.id)
..writeByte(1)
..write(obj.name)
..writeByte(2)
..write(obj.slug)
..writeByte(3)
..write(obj.operations);
}
@override
int get hashCode => typeId.hashCode;
@override
bool operator ==(Object other) =>
identical(this, other) ||
other is ModuleObjectAdapter &&
runtimeType == other.runtimeType &&
typeId == other.typeId;
}

View File

@ -0,0 +1,18 @@
import 'package:hive/hive.dart';
import 'package:unit2/model/login_data/user_info/module.dart';
import '../login_data/user_info/module_object.dart';
part 'offlane_modules.g.dart';
@HiveType(typeId: 4)
class OfflineModules {
@HiveField(0)
final String roleName;
@HiveField(1)
final String moduleName;
@HiveField(2)
final ModuleObject object;
@HiveField(3)
final int roleId;
const OfflineModules(
{required this.moduleName, required this.object, required this.roleName,required this.roleId});
}

View File

@ -0,0 +1,50 @@
// GENERATED CODE - DO NOT MODIFY BY HAND
part of 'offlane_modules.dart';
// **************************************************************************
// TypeAdapterGenerator
// **************************************************************************
class OfflineModulesAdapter extends TypeAdapter<OfflineModules> {
@override
final int typeId = 4;
@override
OfflineModules read(BinaryReader reader) {
final numOfFields = reader.readByte();
final fields = <int, dynamic>{
for (int i = 0; i < numOfFields; i++) reader.readByte(): reader.read(),
};
return OfflineModules(
moduleName: fields[1] as String,
object: fields[2] as ModuleObject,
roleName: fields[0] as String,
roleId: fields[3] as int,
);
}
@override
void write(BinaryWriter writer, OfflineModules obj) {
writer
..writeByte(4)
..writeByte(0)
..write(obj.roleName)
..writeByte(1)
..write(obj.moduleName)
..writeByte(2)
..write(obj.object)
..writeByte(3)
..write(obj.roleId);
}
@override
int get hashCode => typeId.hashCode;
@override
bool operator ==(Object other) =>
identical(this, other) ||
other is OfflineModulesAdapter &&
runtimeType == other.runtimeType &&
typeId == other.typeId;
}

View File

@ -0,0 +1,145 @@
import 'package:hive/hive.dart';
import 'dart:convert';
import 'package:unit2/model/profile/family_backround.dart';
part 'offline_profile.g.dart';
OfflineProfile primaryInformationFromJson(String str) => OfflineProfile.fromJson(json.decode(str));
String primaryInformationToJson(OfflineProfile data) => json.encode(data.toJson());
@HiveType(typeId: 0)
class OfflineProfile extends HiveObject {
@HiveField(0)
int? webuserId;
@HiveField(1)
int? id;
@HiveField(2)
String? lastName;
@HiveField(3)
String? firstName;
@HiveField(4)
String? middleName;
@HiveField(5)
String? nameExtension;
@HiveField(6)
String? sex;
@HiveField(7)
DateTime? birthdate;
@HiveField(8)
String? civilStatus;
@HiveField(9)
String? bloodType;
@HiveField(10)
double? heightM;
@HiveField(11)
double? weightKg;
@HiveField(12)
String? photoPath;
@HiveField(13)
String? esigPath;
@HiveField(14)
MaidenName? maidenName;
@HiveField(15)
bool? deceased;
@HiveField(16)
String? uuidQrcode;
@HiveField(17)
String? titlePrefix;
@HiveField(18)
String? titleSuffix;
@HiveField(19)
bool? showTitleId;
@HiveField(20)
String? ethnicity;
@HiveField(21)
String? disability;
@HiveField(22)
String? gender;
@HiveField(23)
String? religion;
@HiveField(24)
String? ip;
OfflineProfile({
required this.webuserId,
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.uuidQrcode,
required this.titlePrefix,
required this.titleSuffix,
required this.showTitleId,
required this.ethnicity,
required this.disability,
required this.gender,
required this.religion,
required this.ip,
});
factory OfflineProfile.fromJson(Map<String, dynamic> json) => OfflineProfile(
webuserId: null,
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"]?.toDouble(),
photoPath: json["photo_path"],
esigPath: json["esig_path"],
maidenName: json["maiden_name"]==null?null:MaidenName.fromJson(json["maiden_name"]),
deceased: json["deceased"],
uuidQrcode: json["uuid_qrcode"],
titlePrefix: json["title_prefix"],
titleSuffix: json["title_suffix"],
showTitleId: json["show_title_id"],
ethnicity: json["ethnicity"]== null?null:json["ethnicity"]['name'],
disability: json["disability"] == null?null:json['disability']['name'],
gender: json["gender"] == null?null:json['gender']['name'],
religion: json["religion"] == null?null:json['religion']['name'],
ip: json["ip"]==null?null:json['ip']['name'],
);
Map<String, dynamic> 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,
"uuid_qrcode": uuidQrcode,
"title_prefix": titlePrefix,
"title_suffix": titleSuffix,
"show_title_id": showTitleId,
"ethnicity": ethnicity,
"disability": disability,
"gender": gender,
"religion": religion,
"ip": ip,
};
}

View File

@ -0,0 +1,113 @@
// GENERATED CODE - DO NOT MODIFY BY HAND
part of 'offline_profile.dart';
// **************************************************************************
// TypeAdapterGenerator
// **************************************************************************
class OfflineProfileAdapter extends TypeAdapter<OfflineProfile> {
@override
final int typeId = 0;
@override
OfflineProfile read(BinaryReader reader) {
final numOfFields = reader.readByte();
final fields = <int, dynamic>{
for (int i = 0; i < numOfFields; i++) reader.readByte(): reader.read(),
};
return OfflineProfile(
webuserId: fields[0] as int?,
id: fields[1] as int?,
lastName: fields[2] as String?,
firstName: fields[3] as String?,
middleName: fields[4] as String?,
nameExtension: fields[5] as String?,
sex: fields[6] as String?,
birthdate: fields[7] as DateTime?,
civilStatus: fields[8] as String?,
bloodType: fields[9] as String?,
heightM: fields[10] as double?,
weightKg: fields[11] as double?,
photoPath: fields[12] as String?,
esigPath: fields[13] as String?,
maidenName: fields[14] as MaidenName?,
deceased: fields[15] as bool?,
uuidQrcode: fields[16] as String?,
titlePrefix: fields[17] as String?,
titleSuffix: fields[18] as String?,
showTitleId: fields[19] as bool?,
ethnicity: fields[20] as String?,
disability: fields[21] as String?,
gender: fields[22] as String?,
religion: fields[23] as String?,
ip: fields[24] as String?,
);
}
@override
void write(BinaryWriter writer, OfflineProfile obj) {
writer
..writeByte(25)
..writeByte(0)
..write(obj.webuserId)
..writeByte(1)
..write(obj.id)
..writeByte(2)
..write(obj.lastName)
..writeByte(3)
..write(obj.firstName)
..writeByte(4)
..write(obj.middleName)
..writeByte(5)
..write(obj.nameExtension)
..writeByte(6)
..write(obj.sex)
..writeByte(7)
..write(obj.birthdate)
..writeByte(8)
..write(obj.civilStatus)
..writeByte(9)
..write(obj.bloodType)
..writeByte(10)
..write(obj.heightM)
..writeByte(11)
..write(obj.weightKg)
..writeByte(12)
..write(obj.photoPath)
..writeByte(13)
..write(obj.esigPath)
..writeByte(14)
..write(obj.maidenName)
..writeByte(15)
..write(obj.deceased)
..writeByte(16)
..write(obj.uuidQrcode)
..writeByte(17)
..write(obj.titlePrefix)
..writeByte(18)
..write(obj.titleSuffix)
..writeByte(19)
..write(obj.showTitleId)
..writeByte(20)
..write(obj.ethnicity)
..writeByte(21)
..write(obj.disability)
..writeByte(22)
..write(obj.gender)
..writeByte(23)
..write(obj.religion)
..writeByte(24)
..write(obj.ip);
}
@override
int get hashCode => typeId.hashCode;
@override
bool operator ==(Object other) =>
identical(this, other) ||
other is OfflineProfileAdapter &&
runtimeType == other.runtimeType &&
typeId == other.typeId;
}

View File

@ -0,0 +1,43 @@
import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:flutter_zoom_drawer/flutter_zoom_drawer.dart';
import 'package:unit2/model/offline/offlane_modules.dart';
import 'package:unit2/screens/offline/homepage/menu_screen.dart';
import 'package:unit2/screens/offline/homepage/module_screen.dart';
import 'package:unit2/utils/global.dart';
import '../../../../bloc/user/user_bloc.dart';
import '../../../../widgets/splash_screen.dart';
class OfflineDrawerScreen extends StatefulWidget {
final List<OfflineModules> modules;
const OfflineDrawerScreen({Key? key ,required this.modules}) : super(key: key,);
@override
State<OfflineDrawerScreen> createState() => _OfflineDrawerScreenState();
}
class _OfflineDrawerScreenState extends State<OfflineDrawerScreen> {
final zoomDrawerController = ZoomDrawerController();
@override
@override
Widget build(BuildContext context) {
return ZoomDrawer(
controller: zoomDrawerController,
menuScreen: const OfflineMenuScreen(),
mainScreen: SizedBox(
height: MediaQuery.of(context).size.height,
child: OfflineModuleScreen(modules: widget.modules,)),
style: DrawerStyle.defaultStyle,
borderRadius: 24.0,
showShadow: false,
angle: -0.0,
slideWidth: MediaQuery.of(context).size.width * .90,
openCurve: Curves.fastOutSlowIn,
closeCurve: Curves.easeOut,
menuBackgroundColor: Colors.grey,
);
}
}

View File

@ -0,0 +1,69 @@
import 'package:flutter/material.dart';
import 'package:unit2/theme-data.dart/colors.dart';
import '../../../../utils/global.dart';
class OfflineMenuScreen extends StatefulWidget {
const OfflineMenuScreen({super.key});
@override
State<OfflineMenuScreen> createState() => _OfflineMenuScreenState();
}
class _OfflineMenuScreenState extends State<OfflineMenuScreen> {
@override
Widget build(BuildContext context) {
return Drawer(
child: SizedBox(
height: screenHeight,
child: Column(
mainAxisSize: MainAxisSize.max,
children: [
Column(
children: <Widget>[
UserAccountsDrawerHeader(
currentAccountPictureSize: const Size.square(90),
decoration: const BoxDecoration(
color: primary,
image: DecorationImage(
image: AssetImage('assets/pngs/bg.png'),
fit: BoxFit.cover)),
accountName: null,
accountEmail: null,
currentAccountPicture: CircleAvatar(
radius: 100,
backgroundColor: fifth,
child: CircleAvatar(
radius: 100,
backgroundColor: third,
child: Image.asset(
'assets/pngs/capitol.png',
)),
),
),
ListTile(
dense: true,
leading: const Icon(
Icons.exit_to_app,
color: primary,
),
title: const Text(
"Exit Offline Mode",
style: TextStyle(color: Colors.black),
),
onTap: () async {
Navigator.pushReplacementNamed(context, '/');
},
)
],
),
const Expanded(child: SizedBox()),
const Divider(),
const SizedBox(
height: 10,
),
],
),
),
);
}
}

View File

@ -0,0 +1,51 @@
import 'package:flutter/material.dart';
import 'package:flutter_zoom_drawer/flutter_zoom_drawer.dart';
import 'package:fluttericon/font_awesome5_icons.dart';
import 'package:unit2/model/offline/offlane_modules.dart';
import 'package:unit2/screens/passo/passo_dashboard.dart';
import 'package:unit2/screens/unit2/homepage.dart/components/dashboard/shared_card_label.dart';
import 'package:unit2/theme-data.dart/colors.dart';
class OfflineModuleScreen extends StatelessWidget {
final List<OfflineModules> modules;
const OfflineModuleScreen({super.key, required this.modules});
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
backgroundColor: primary,
title: const Text("Offline Mode"),
centerTitle: true,
leading: IconButton(
onPressed: () {
ZoomDrawer.of(context)!.toggle();
},
icon: const Icon(
Icons.menu,
color: Colors.white,
),
),
),
body: Padding(
padding: const EdgeInsets.all(24),
child: GridView.count(
shrinkWrap: true,
crossAxisCount: 4,
crossAxisSpacing: 8,
mainAxisSpacing: 10,
physics: const BouncingScrollPhysics(),
padding: const EdgeInsets.symmetric(vertical: 5, horizontal: 5),
children: modules
.map((e) => CardLabel(
icon: FontAwesome5.eye,
title: "Field Surveyor",
ontap: () {
Navigator.push(context, MaterialPageRoute(builder: ((context) {
return PassoDashBoard();
})));
}))
.toList()),
));
}
}

View File

@ -8,6 +8,7 @@ import 'package:intl/intl.dart';
import 'package:qr_flutter/qr_flutter.dart'; import 'package:qr_flutter/qr_flutter.dart';
import 'package:unit2/model/login_data/user_info/user_data.dart'; import 'package:unit2/model/login_data/user_info/user_data.dart';
import 'package:unit2/screens/unit2/basic-info/components/qr_image.dart'; import 'package:unit2/screens/unit2/basic-info/components/qr_image.dart';
import 'package:unit2/theme-data.dart/btn-style.dart'; import 'package:unit2/theme-data.dart/btn-style.dart';
import 'package:unit2/utils/global.dart'; import 'package:unit2/utils/global.dart';
import 'package:unit2/utils/text_container.dart'; import 'package:unit2/utils/text_container.dart';
@ -181,7 +182,7 @@ class BuildInformation extends StatelessWidget {
return QRFullScreenImage(uuid: uuid); return QRFullScreenImage(uuid: uuid);
})); }));
}, },
child: QrImage( child: QrImageView(
data: uuid!, data: uuid!,
size: blockSizeVertical * 24, size: blockSizeVertical * 24,
), ),

View File

@ -1,6 +1,4 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter/src/widgets/framework.dart';
import 'package:flutter/src/widgets/placeholder.dart';
import 'package:qr_flutter/qr_flutter.dart'; import 'package:qr_flutter/qr_flutter.dart';
import 'package:unit2/theme-data.dart/colors.dart'; import 'package:unit2/theme-data.dart/colors.dart';
import 'package:unit2/utils/global.dart'; import 'package:unit2/utils/global.dart';
@ -16,7 +14,7 @@ class QRFullScreenImage extends StatelessWidget {
centerTitle: true, centerTitle: true,
backgroundColor: primary,title: const Text("Profile QR Code"),), backgroundColor: primary,title: const Text("Profile QR Code"),),
body: Center( body: Center(
child: QrImage( child: QrImageView(
data: uuid, data: uuid,
size: blockSizeVertical * 50 size: blockSizeVertical * 50
), ),

View File

@ -14,7 +14,10 @@ class DrawerScreen extends StatefulWidget {
} }
class _DrawerScreenState extends State<DrawerScreen> { class _DrawerScreenState extends State<DrawerScreen> {
final zoomDrawerController = ZoomDrawerController(); final zoomDrawerController = ZoomDrawerController();
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
return BlocBuilder<UserBloc, UserState>( return BlocBuilder<UserBloc, UserState>(
@ -38,7 +41,7 @@ class _DrawerScreenState extends State<DrawerScreen> {
menuBackgroundColor: Colors.grey, menuBackgroundColor: Colors.grey,
); );
} }
return const UniTSplashScreen(); return Container();
}, },
); );
} }

View File

@ -1,7 +1,12 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:unit2/model/offline/offlane_modules.dart';
import 'package:unit2/screens/offline/homepage/drawer.dart';
import 'package:unit2/screens/offline/homepage/menu_screen.dart';
import 'package:unit2/screens/unit2/homepage.dart/components/drawer-screen.dart';
import 'package:unit2/theme-data.dart/colors.dart'; import 'package:unit2/theme-data.dart/colors.dart';
import 'package:fluttericon/web_symbols_icons.dart'; import 'package:fluttericon/web_symbols_icons.dart';
import 'package:fluttericon/font_awesome5_icons.dart'; import 'package:fluttericon/font_awesome5_icons.dart';
import 'package:unit2/utils/global_context.dart';
import '../../../../model/login_data/user_info/user_data.dart'; import '../../../../model/login_data/user_info/user_data.dart';
import 'menu.dart'; import 'menu.dart';
import '../../../../utils/global.dart'; import '../../../../utils/global.dart';
@ -17,10 +22,6 @@ class MenuScreen extends StatefulWidget {
class _MenuScreenState extends State<MenuScreen> { class _MenuScreenState extends State<MenuScreen> {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
final String firstName =globalFistname??
widget.userData!.employeeInfo!.profile!.firstName!.toUpperCase();
final String lastname = globalLastname??
widget.userData!.employeeInfo!.profile!.lastName!.toUpperCase();
return Drawer( return Drawer(
child: SizedBox( child: SizedBox(
height: screenHeight, height: screenHeight,
@ -28,49 +29,69 @@ class _MenuScreenState extends State<MenuScreen> {
mainAxisSize: MainAxisSize.max, mainAxisSize: MainAxisSize.max,
children: [ children: [
Column( Column(
// ignore: prefer_const_literals_to_create_immutables
children: <Widget>[ children: <Widget>[
UserAccountsDrawerHeader( UserAccountsDrawerHeader(
currentAccountPictureSize: const Size.square(90),
decoration: const BoxDecoration( decoration: const BoxDecoration(
color: primary, color: primary,
image: DecorationImage( image: DecorationImage(
image: AssetImage('assets/pngs/bg.png'), image: AssetImage('assets/pngs/bg.png'),
fit: BoxFit.cover)), fit: BoxFit.cover)),
accountName: Text("$firstName $lastname"), accountName: null,
accountEmail: null, accountEmail: null,
currentAccountPicture: CircleAvatar( currentAccountPicture: CircleAvatar(
radius: 40, radius: 100,
backgroundColor: fifth, backgroundColor: fifth,
child: CircleAvatar( child: CircleAvatar(
radius: 33, radius: 100,
backgroundColor: third, backgroundColor: third,
child: //Icon(Icons.person, size: 40, color: fifth), child: Image.asset(
Text( 'assets/pngs/capitol.png',
firstName[0].toUpperCase(), )),
style: const TextStyle(fontSize: 45.0, color: fifth),
),
),
), ),
), ),
getTile(FontAwesome5.user, "Basic Info", '/basic-info', context, getTile(FontAwesome5.user, "Basic Info", '/basic-info', context,
widget.userData!), widget.userData!),
const Divider(), const Divider(),
getTile(FontAwesome5.user_circle, "Profile", getTile(FontAwesome5.user_circle, "Profile", '/profile',
'/profile', context, widget.userData!),
const Divider(),
getTile(FontAwesome5.life_ring, "Request SOS", '/sos',
context, widget.userData!), context, widget.userData!),
const Divider(),
getTile(FontAwesome5.life_ring, "Request SOS", '/sos', context,
widget.userData!),
const Divider(),
SizedBox(
child: globalOfflineAvailable == true
? ListTile(
dense: true,
leading: const Icon(
Icons.exit_to_app,
color: primary,
),
title: const Text(
"Offline Mode",
style: TextStyle(color: Colors.black),
),
onTap: () async {
List<OfflineModules> modules = await OFFLINE!.get('modules');
Navigator.pushReplacement(NavigationService.navigatorKey.currentState!.context,
MaterialPageRoute(builder: ((context) {
return OfflineDrawerScreen(modules: modules,);
})));
},
)
: Container())
], ],
), ),
const Expanded(child: SizedBox()), const Expanded(child: SizedBox()),
const Divider(), const Divider(),
Align( Align(
alignment: FractionalOffset.bottomLeft, alignment: FractionalOffset.bottomLeft,
child: getTile(WebSymbols.logout, "Logout", '/', context, child: getTile(
widget.userData!), WebSymbols.logout, "Logout", '/', context, widget.userData!),
),
const SizedBox(
height: 10,
), ),
const SizedBox(height: 10,),
], ],
), ),
), ),

View File

@ -1,6 +1,7 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:flutter_zoom_drawer/flutter_zoom_drawer.dart'; import 'package:flutter_zoom_drawer/flutter_zoom_drawer.dart';
import 'package:unit2/model/login_data/user_info/module_object.dart';
import 'package:unit2/screens/unit2/homepage.dart/components/dashboard/dashboard.dart'; import 'package:unit2/screens/unit2/homepage.dart/components/dashboard/dashboard.dart';
import 'package:unit2/theme-data.dart/colors.dart'; import 'package:unit2/theme-data.dart/colors.dart';
import 'package:unit2/utils/text_container.dart'; import 'package:unit2/utils/text_container.dart';

View File

@ -7,6 +7,8 @@ import 'package:fluttericon/font_awesome5_icons.dart';
import 'package:fluttertoast/fluttertoast.dart'; import 'package:fluttertoast/fluttertoast.dart';
import 'package:form_builder_validators/form_builder_validators.dart'; import 'package:form_builder_validators/form_builder_validators.dart';
import 'package:flutter_progress_hud/flutter_progress_hud.dart'; import 'package:flutter_progress_hud/flutter_progress_hud.dart';
import 'package:unit2/model/offline/offlane_modules.dart';
import 'package:unit2/screens/offline/homepage/drawer.dart';
import 'package:unit2/screens/unit2/login/components/update_required.dart'; import 'package:unit2/screens/unit2/login/components/update_required.dart';
import 'package:unit2/screens/unit2/login/qr_login.dart'; import 'package:unit2/screens/unit2/login/qr_login.dart';
import 'package:unit2/utils/alerts.dart'; import 'package:unit2/utils/alerts.dart';
@ -42,11 +44,14 @@ class _UniT2LoginState extends State<UniT2Login> {
return WillPopScope( return WillPopScope(
onWillPop: () { onWillPop: () {
DateTime now = DateTime.now(); DateTime now = DateTime.now();
if (ctime == null || now.difference(ctime!) > const Duration(seconds: 2)) { if (ctime == null ||
now.difference(ctime!) > const Duration(seconds: 2)) {
ctime = now; ctime = now;
ScaffoldMessenger.of(context).showSnackBar( ScaffoldMessenger.of(context).showSnackBar(const SnackBar(
const SnackBar(content: Text('Press Again to Exit',textAlign: TextAlign.center,)) content: Text(
); 'Press Again to Exit',
textAlign: TextAlign.center,
)));
return Future.value(false); return Future.value(false);
} }
@ -373,6 +378,47 @@ class _UniT2LoginState extends State<UniT2Login> {
}, },
); );
} }
if (state is ErrorWithOfflineMode) {
return Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
SomethingWentWrong(
message: onError,
onpressed: () {
BlocProvider.of<UserBloc>(
NavigationService.navigatorKey.currentContext!)
.add(LoadVersion(
username: username, password: password));
return MaterialPageRoute(builder: (_) {
return const UniT2Login();
});
},
),
const SizedBox(
height: 14,
),
SizedBox(
width: 200,
height: 50,
child: ElevatedButton.icon(
icon: const Icon(Icons.signal_cellular_alt),
style: mainBtnStyle(second, Colors.transparent, primary),
onPressed: () async {
List<OfflineModules> offlinemodules = await OFFLINE!.get('modules');
Navigator.pushReplacement(
NavigationService
.navigatorKey.currentState!.context,
MaterialPageRoute(builder: ((context) {
return OfflineDrawerScreen(
modules: offlinemodules,
);
})));
},
label: const Text("Offline Mode")),
)
],
);
}
if (state is InternetTimeout) { if (state is InternetTimeout) {
return const TimeOutError(); return const TimeOutError();
} }

View File

@ -92,6 +92,7 @@ class AppRouter {
child: const RBACScreen(), child: const RBACScreen(),
); );
}); });
default: default:
return MaterialPageRoute(builder: (context) { return MaterialPageRoute(builder: (context) {
return Container(); return Container();

View File

@ -1,4 +1,5 @@
import 'package:hive/hive.dart'; import 'package:hive/hive.dart';
import 'package:unit2/model/offline/offline_profile.dart';
import '../model/profile/basic_information/primary-information.dart'; import '../model/profile/basic_information/primary-information.dart';
@ -12,25 +13,16 @@ double safeBlockHorizontal = 0;
double safeBlockVertical = 0; double safeBlockVertical = 0;
const xClientKey = "unitK3CQaXiWlPReDsBzmmwBZPd9Re1z"; const xClientKey = "unitK3CQaXiWlPReDsBzmmwBZPd9Re1z";
const xClientSecret = "unitcYqAN7GGalyz"; const xClientSecret = "unitcYqAN7GGalyz";
String? globalFistname; String? globalFistname;
String? globalLastname; String? globalLastname;
String? globalMiddleName; String? globalMiddleName;
DateTime? globalBday; DateTime? globalBday;
String? globalSex; String? globalSex;
Profile? globalCurrentProfile; Profile? globalCurrentProfile;
///offline data
bool? globalOfflineAvailable;
const String urlDownloadArmeabiv7aAPK = OfflineProfile? globalOfflineProfile;
"https://agusandelnorte.gov.ph/media/public/transparency/downloadables/UniT-App/v1.0.1/beta/unit_app_v1_0_1_beta_armeabi-v7a-release.apk?download";
const String urlDownloadX8664APK =
"https://agusandelnorte.gov.ph/media/public/transparency/downloadables/UniT-App/v1.0.1/beta/unit_app_v1_0_1_beta_x86_64-release.apk?download";
const String urlDownloadarm64v8aAPK =
"https://agusandelnorte.gov.ph/media/public/transparency/downloadables/UniT-App/v1.0.1/beta/unit_app_v1_0_1_beta_arm64-v8a-release.apk?download";
//// hive boxes //// hive boxes
Box? CREDENTIALS; Box? CREDENTIALS;
Box? SOS; Box? SOS;
Box? OFFLINE;

View File

@ -36,6 +36,7 @@ class SomethingWentWrong extends StatelessWidget {
height: 20, height: 20,
), ),
SizedBox( SizedBox(
width: 200,
height: 50, height: 50,
child: ElevatedButton.icon( child: ElevatedButton.icon(
style: mainBtnStyle( style: mainBtnStyle(

View File

@ -5,18 +5,18 @@ packages:
dependency: transitive dependency: transitive
description: description:
name: _fe_analyzer_shared name: _fe_analyzer_shared
sha256: "4897882604d919befd350648c7f91926a9d5de99e67b455bf0917cc2362f4bb8" sha256: eb376e9acf6938204f90eb3b1f00b578640d3188b4c8a8ec054f9f479af8d051
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "47.0.0" version: "64.0.0"
analyzer: analyzer:
dependency: transitive dependency: transitive
description: description:
name: analyzer name: analyzer
sha256: "690e335554a8385bc9d787117d9eb52c0c03ee207a607e593de3c9d71b1cfe80" sha256: "69f54f967773f6c26c7dcb13e93d7ccee8b17a641689da39e878d5cf13b06893"
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "4.7.0" version: "6.2.0"
animate_do: animate_do:
dependency: "direct main" dependency: "direct main"
description: description:
@ -37,10 +37,10 @@ packages:
dependency: transitive dependency: transitive
description: description:
name: archive name: archive
sha256: "0c8368c9b3f0abbc193b9d6133649a614204b528982bebc7026372d61677ce3a" sha256: "06a96f1249f38a00435b3b0c9a3246d934d7dbc8183fc7c9e56989860edb99d4"
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "3.3.7" version: "3.4.4"
args: args:
dependency: transitive dependency: transitive
description: description:
@ -77,58 +77,58 @@ packages:
dependency: "direct main" dependency: "direct main"
description: description:
name: audioplayers name: audioplayers
sha256: "8e94499b5c123df14cf17c16639de5ff3373e57e537f727e367487fbb7491363" sha256: d9f6ca8e9b3e5af5e73d4c814404566f72698ee7ba35487bdf2baa6749e7503f
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "5.1.0" version: "5.2.0"
audioplayers_android: audioplayers_android:
dependency: transitive dependency: transitive
description: description:
name: audioplayers_android name: audioplayers_android
sha256: "1c12b60cc10a3b8617ca3f88b927e7e03768f470d9b4f747efd3d58a8a07ee1b" sha256: fb01b9481f431fe04ac60f1f97ce8158383f2dc754558820592f795d81ca9d53
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "4.0.1" version: "4.0.2"
audioplayers_darwin: audioplayers_darwin:
dependency: transitive dependency: transitive
description: description:
name: audioplayers_darwin name: audioplayers_darwin
sha256: "2fb6133ffcf28fb3f9d3e11f8a3ef190e5fedb2b7b95ea865b56a21d1163e670" sha256: "3034e99a6df8d101da0f5082dcca0a2a99db62ab1d4ddb3277bed3f6f81afe08"
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "5.0.1" version: "5.0.2"
audioplayers_linux: audioplayers_linux:
dependency: transitive dependency: transitive
description: description:
name: audioplayers_linux name: audioplayers_linux
sha256: cca3f272c7186dd2e0025b8864e1413ac5e081d74b17e28b02ceb2df4c110235 sha256: "60787e73fefc4d2e0b9c02c69885402177e818e4e27ef087074cf27c02246c9e"
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "3.0.0" version: "3.1.0"
audioplayers_platform_interface: audioplayers_platform_interface:
dependency: transitive dependency: transitive
description: description:
name: audioplayers_platform_interface name: audioplayers_platform_interface
sha256: "47eae55e99ced11589998cf27e4eaabf5b475a7bd8bea7516ee6c2536a2e1abf" sha256: "365c547f1bb9e77d94dd1687903a668d8f7ac3409e48e6e6a3668a1ac2982adb"
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "6.0.0" version: "6.1.0"
audioplayers_web: audioplayers_web:
dependency: transitive dependency: transitive
description: description:
name: audioplayers_web name: audioplayers_web
sha256: "9f155590c6ba9ba469df637f4729264e4234dc3941ece4690dad63ffac19b5af" sha256: "22cd0173e54d92bd9b2c80b1204eb1eb159ece87475ab58c9788a70ec43c2a62"
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "4.0.0" version: "4.1.0"
audioplayers_windows: audioplayers_windows:
dependency: transitive dependency: transitive
description: description:
name: audioplayers_windows name: audioplayers_windows
sha256: "8813b712ba919bb324bde5e3ba97edc81bface945953a54a3dea70b5608bcc70" sha256: "9536812c9103563644ada2ef45ae523806b0745f7a78e89d1b5fb1951de90e1a"
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "3.0.0" version: "3.1.0"
auto_size_text: auto_size_text:
dependency: "direct main" dependency: "direct main"
description: description:
@ -197,10 +197,10 @@ packages:
dependency: transitive dependency: transitive
description: description:
name: build name: build
sha256: "3fbda25365741f8251b39f3917fb3c8e286a96fd068a5a242e11c2012d495777" sha256: "80184af8b6cb3e5c1c4ec6d8544d27711700bc3e6d2efad04238c7b5290889f0"
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "2.3.1" version: "2.4.1"
build_config: build_config:
dependency: transitive dependency: transitive
description: description:
@ -213,34 +213,34 @@ packages:
dependency: transitive dependency: transitive
description: description:
name: build_daemon name: build_daemon
sha256: "757153e5d9cd88253cb13f28c2fb55a537dc31fefd98137549895b5beb7c6169" sha256: "5f02d73eb2ba16483e693f80bee4f088563a820e47d1027d4cdfe62b5bb43e65"
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "3.1.1" version: "4.0.0"
build_resolvers: build_resolvers:
dependency: transitive dependency: transitive
description: description:
name: build_resolvers name: build_resolvers
sha256: "687cf90a3951affac1bd5f9ecb5e3e90b60487f3d9cdc359bb310f8876bb02a6" sha256: "64e12b0521812d1684b1917bc80945625391cb9bdd4312536b1d69dcb6133ed8"
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "2.0.10" version: "2.4.1"
build_runner: build_runner:
dependency: "direct dev" dependency: "direct dev"
description: description:
name: build_runner name: build_runner
sha256: b0a8a7b8a76c493e85f1b84bffa0588859a06197863dba8c9036b15581fd9727 sha256: "10c6bcdbf9d049a0b666702cf1cee4ddfdc38f02a19d35ae392863b47519848b"
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "2.3.3" version: "2.4.6"
build_runner_core: build_runner_core:
dependency: transitive dependency: transitive
description: description:
name: build_runner_core name: build_runner_core
sha256: "0671ad4162ed510b70d0eb4ad6354c249f8429cab4ae7a4cec86bbc2886eb76e" sha256: c9e32d21dd6626b5c163d48b037ce906bbe428bc23ab77bcd77bb21e593b6185
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "7.2.7+1" version: "7.2.11"
built_collection: built_collection:
dependency: transitive dependency: transitive
description: description:
@ -253,34 +253,34 @@ packages:
dependency: transitive dependency: transitive
description: description:
name: built_value name: built_value
sha256: ff627b645b28fb8bdb69e645f910c2458fd6b65f6585c3a53e0626024897dedf sha256: a8de5955205b4d1dbbbc267daddf2178bd737e4bab8987c04a500478c9651e74
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "8.6.2" version: "8.6.3"
cached_network_image: cached_network_image:
dependency: "direct main" dependency: "direct main"
description: description:
name: cached_network_image name: cached_network_image
sha256: fd3d0dc1d451f9a252b32d95d3f0c3c487bc41a75eba2e6097cb0b9c71491b15 sha256: f98972704692ba679db144261172a8e20feb145636c617af0eb4022132a6797f
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "3.2.3" version: "3.3.0"
cached_network_image_platform_interface: cached_network_image_platform_interface:
dependency: transitive dependency: transitive
description: description:
name: cached_network_image_platform_interface name: cached_network_image_platform_interface
sha256: bb2b8403b4ccdc60ef5f25c70dead1f3d32d24b9d6117cfc087f496b178594a7 sha256: "56aa42a7a01e3c9db8456d9f3f999931f1e05535b5a424271e9a38cabf066613"
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "2.0.0" version: "3.0.0"
cached_network_image_web: cached_network_image_web:
dependency: transitive dependency: transitive
description: description:
name: cached_network_image_web name: cached_network_image_web
sha256: b8eb814ebfcb4dea049680f8c1ffb2df399e4d03bf7a352c775e26fa06e02fa0 sha256: "759b9a9f8f6ccbb66c185df805fac107f05730b1dab9c64626d1008cca532257"
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "1.0.2" version: "1.1.0"
characters: characters:
dependency: transitive dependency: transitive
description: description:
@ -309,10 +309,10 @@ packages:
dependency: transitive dependency: transitive
description: description:
name: code_builder name: code_builder
sha256: "315a598c7fbe77f22de1c9da7cfd6fd21816312f16ffa124453b4fc679e540f1" sha256: "1be9be30396d7e4c0db42c35ea6ccd7cc6a1e19916b5dc64d6ac216b5544d677"
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "4.6.0" version: "4.7.0"
collection: collection:
dependency: transitive dependency: transitive
description: description:
@ -365,10 +365,10 @@ packages:
dependency: transitive dependency: transitive
description: description:
name: dart_style name: dart_style
sha256: "7a03456c3490394c8e7665890333e91ae8a49be43542b616e414449ac358acd4" sha256: abd7625e16f51f554ea244d090292945ec4d4be7bfbaf2ec8cccea568919d334
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "2.2.4" version: "2.3.3"
date_time_picker: date_time_picker:
dependency: "direct main" dependency: "direct main"
description: description:
@ -461,10 +461,10 @@ packages:
dependency: transitive dependency: transitive
description: description:
name: ffi name: ffi
sha256: ed5337a5660c506388a9f012be0288fb38b49020ce2b45fe1f8b8323fe429f99 sha256: "7bf0adc28a23d395f19f3f1eb21dd7cfd1dd9f8e1c50051c069122e6853bc878"
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "2.0.2" version: "2.1.0"
file: file:
dependency: transitive dependency: transitive
description: description:
@ -526,14 +526,6 @@ packages:
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "8.1.3" version: "8.1.3"
flutter_blurhash:
dependency: transitive
description:
name: flutter_blurhash
sha256: "05001537bd3fac7644fa6558b09ec8c0a3f2eba78c0765f88912882b1331a5c6"
url: "https://pub.dev"
source: hosted
version: "0.7.0"
flutter_cache_manager: flutter_cache_manager:
dependency: transitive dependency: transitive
description: description:
@ -777,10 +769,10 @@ packages:
dependency: transitive dependency: transitive
description: description:
name: image name: image
sha256: a72242c9a0ffb65d03de1b7113bc4e189686fc07c7147b8b41811d0dd0e0d9bf sha256: "028f61960d56f26414eb616b48b04eb37d700cbe477b7fb09bf1d7ce57fd9271"
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "4.0.17" version: "4.1.3"
intl: intl:
dependency: "direct main" dependency: "direct main"
description: description:
@ -801,10 +793,10 @@ packages:
dependency: transitive dependency: transitive
description: description:
name: js name: js
sha256: "5528c2f391ededb7775ec1daa69e65a2d61276f7552de2b5f7b8d34ee9fd4ab7" sha256: f2c445dce49627136094980615a031419f7f3eb393237e4ecd97ac15dea343f3
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "0.6.5" version: "0.6.7"
json_annotation: json_annotation:
dependency: transitive dependency: transitive
description: description:
@ -817,10 +809,10 @@ packages:
dependency: transitive dependency: transitive
description: description:
name: lints name: lints
sha256: "5e4a9cd06d447758280a8ac2405101e0e2094d2a1dbdd3756aec3fe7775ba593" sha256: "0a217c6c989d21039f1498c3ed9f3ed71b354e69873f13a8dfc3c9fe76f1b452"
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "2.0.1" version: "2.1.1"
location: location:
dependency: "direct main" dependency: "direct main"
description: description:
@ -953,10 +945,10 @@ packages:
dependency: transitive dependency: transitive
description: description:
name: octo_image name: octo_image
sha256: "107f3ed1330006a3bea63615e81cf637433f5135a52466c7caa0e7152bca9143" sha256: "45b40f99622f11901238e18d48f5f12ea36426d8eced9f4cbf58479c7aa2430d"
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "1.0.2" version: "2.0.0"
package_config: package_config:
dependency: transitive dependency: transitive
description: description:
@ -1057,10 +1049,10 @@ packages:
dependency: transitive dependency: transitive
description: description:
name: permission_handler_android name: permission_handler_android
sha256: f2543a236584a5e8be79076f858022f100ce690e31530e6fa4c32ac94f276d3a sha256: ace7d15a3d1a4a0b91c041d01e5405df221edb9de9116525efc773c74e6fc790
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "11.0.3" version: "11.0.5"
permission_handler_apple: permission_handler_apple:
dependency: transitive dependency: transitive
description: description:
@ -1209,18 +1201,18 @@ packages:
dependency: transitive dependency: transitive
description: description:
name: qr name: qr
sha256: "5c4208b4dc0d55c3184d10d83ee0ded6212dc2b5e2ba17c5a0c0aab279128d21" sha256: "64957a3930367bf97cc211a5af99551d630f2f4625e38af10edd6b19131b64b3"
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "2.1.0" version: "3.0.1"
qr_flutter: qr_flutter:
dependency: "direct main" dependency: "direct main"
description: description:
name: qr_flutter name: qr_flutter
sha256: c5c121c54cb6dd837b9b9d57eb7bc7ec6df4aee741032060c8833a678c80b87e sha256: "5095f0fc6e3f71d08adef8feccc8cea4f12eec18a2e31c2e8d82cb6019f4b097"
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "4.0.0" version: "4.1.0"
rive: rive:
dependency: transitive dependency: transitive
description: description:
@ -1390,18 +1382,18 @@ packages:
dependency: transitive dependency: transitive
description: description:
name: source_gen name: source_gen
sha256: "2d79738b6bbf38a43920e2b8d189e9a3ce6cc201f4b8fc76be5e4fe377b1c38d" sha256: fc0da689e5302edb6177fdd964efcb7f58912f43c28c2047a808f5bfff643d16
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "1.2.6" version: "1.4.0"
source_helper: source_helper:
dependency: transitive dependency: transitive
description: description:
name: source_helper name: source_helper
sha256: "3b67aade1d52416149c633ba1bb36df44d97c6b51830c2198e934e3fca87ca1f" sha256: "6adebc0006c37dd63fe05bca0a929b99f06402fc95aa35bf36d67f5c06de01fd"
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "1.3.3" version: "1.3.4"
source_span: source_span:
dependency: transitive dependency: transitive
description: description:
@ -1414,18 +1406,18 @@ packages:
dependency: transitive dependency: transitive
description: description:
name: sqflite name: sqflite
sha256: b4d6710e1200e96845747e37338ea8a819a12b51689a3bcf31eff0003b37a0b9 sha256: "591f1602816e9c31377d5f008c2d9ef7b8aca8941c3f89cc5fd9d84da0c38a9a"
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "2.2.8+4" version: "2.3.0"
sqflite_common: sqflite_common:
dependency: transitive dependency: transitive
description: description:
name: sqflite_common name: sqflite_common
sha256: "8f7603f3f8f126740bc55c4ca2d1027aab4b74a1267a3e31ce51fe40e3b65b8f" sha256: "1b92f368f44b0dee2425bb861cfa17b6f6cf3961f762ff6f941d20b33355660a"
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "2.4.5+1" version: "2.5.0"
stack_trace: stack_trace:
dependency: transitive dependency: transitive
description: description:
@ -1470,66 +1462,66 @@ packages:
dependency: transitive dependency: transitive
description: description:
name: syncfusion_flutter_core name: syncfusion_flutter_core
sha256: aea119c8117953fa5decf4a313b431e556b0959cd35ff88f8fbdc0eda9bedb06 sha256: "295954bc4bda923c88f361da35611801b56f4258179aa355730b236e4ae3ec60"
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "23.1.36" version: "23.1.38"
syncfusion_flutter_pdf: syncfusion_flutter_pdf:
dependency: transitive dependency: transitive
description: description:
name: syncfusion_flutter_pdf name: syncfusion_flutter_pdf
sha256: "76a50a1d580714c078e2827adbd8b00d5f5c606879d07c44c5d99f0e864edda1" sha256: "567d42bd3421f1d3691c5c40741cc921e12b5fc4cc665be170716cca1c1ab824"
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "23.1.36" version: "23.1.38"
syncfusion_flutter_pdfviewer: syncfusion_flutter_pdfviewer:
dependency: "direct main" dependency: "direct main"
description: description:
name: syncfusion_flutter_pdfviewer name: syncfusion_flutter_pdfviewer
sha256: e5eaabd0a31fff16caead0d6d66d4c9946de7e46c89da7736de23cd4b2e6f676 sha256: f3ae48a1b9d0c2a153be292751f84d3ff4f09a33ab38bc7d934340cb656c4e0c
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "23.1.36" version: "23.1.38"
syncfusion_flutter_signaturepad: syncfusion_flutter_signaturepad:
dependency: transitive dependency: transitive
description: description:
name: syncfusion_flutter_signaturepad name: syncfusion_flutter_signaturepad
sha256: ea6b218d127e0315b3309ee072a1d304c76aa7c497a196b3474f9c6b38c01f82 sha256: f61d7fb1c8776f8acfb6dba48c9dd770e41a41759011729770a20671ee1e79ee
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "23.1.36" version: "23.1.38"
syncfusion_pdfviewer_macos: syncfusion_pdfviewer_macos:
dependency: transitive dependency: transitive
description: description:
name: syncfusion_pdfviewer_macos name: syncfusion_pdfviewer_macos
sha256: "6f928bee1f786b8d1939d3c4142c5cc2de2c13d19262d302878935a2bc33850c" sha256: "083f31cea51c8ca1fe98ee8381e48117a892936ad480b5a1787ef9af4a14eac9"
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "23.1.36" version: "23.1.38"
syncfusion_pdfviewer_platform_interface: syncfusion_pdfviewer_platform_interface:
dependency: transitive dependency: transitive
description: description:
name: syncfusion_pdfviewer_platform_interface name: syncfusion_pdfviewer_platform_interface
sha256: "0251864fb82e2bd92a1b17e8562fe342e78cd530e26b0d2f54e94a441ccb4584" sha256: acd26577d5b14b230521fc362e9acd0c1a9c8b1a60de89294689772819be5d9d
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "23.1.36" version: "23.1.38"
syncfusion_pdfviewer_web: syncfusion_pdfviewer_web:
dependency: transitive dependency: transitive
description: description:
name: syncfusion_pdfviewer_web name: syncfusion_pdfviewer_web
sha256: eb224f52e86326dbf08ea12978c3db0b4e376866a84d4fcb131fc06ec93cbe20 sha256: "255ead74a256d7fdcee8b7eb48530beaa6373ef65cdb5db592b59e187fb505f2"
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "23.1.36" version: "23.1.38"
syncfusion_pdfviewer_windows: syncfusion_pdfviewer_windows:
dependency: transitive dependency: transitive
description: description:
name: syncfusion_pdfviewer_windows name: syncfusion_pdfviewer_windows
sha256: aca74797a97512f4d3ca2be0ed49193fae7e5fd29a9b1b1139429d39c9216bf9 sha256: "5778d9005cd3d81d8a0324dba9676f33bb58ce1062b7ca726d1423b245197511"
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "23.1.36" version: "23.1.38"
synchronized: synchronized:
dependency: transitive dependency: transitive
description: description:
@ -1638,10 +1630,10 @@ packages:
dependency: transitive dependency: transitive
description: description:
name: url_launcher_web name: url_launcher_web
sha256: ba140138558fcc3eead51a1c42e92a9fb074a1b1149ed3c73e66035b2ccd94f2 sha256: "2942294a500b4fa0b918685aff406773ba0a4cd34b7f42198742a94083020ce5"
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "2.0.19" version: "2.0.20"
url_launcher_windows: url_launcher_windows:
dependency: transitive dependency: transitive
description: description:
@ -1694,10 +1686,10 @@ packages:
dependency: transitive dependency: transitive
description: description:
name: watcher name: watcher
sha256: "6a7f46926b01ce81bfc339da6a7f20afbe7733eff9846f6d6a5466aa4c6667c0" sha256: "3d2ad6751b3c16cf07c7fca317a1413b3f26530319181b37e3b9039b84fc01d8"
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "1.0.2" version: "1.1.0"
web: web:
dependency: transitive dependency: transitive
description: description:
@ -1718,18 +1710,18 @@ packages:
dependency: transitive dependency: transitive
description: description:
name: win32 name: win32
sha256: f2add6fa510d3ae152903412227bda57d0d5a8da61d2c39c1fb022c9429a41c0 sha256: "350a11abd2d1d97e0cc7a28a81b781c08002aa2864d9e3f192ca0ffa18b06ed3"
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "5.0.6" version: "5.0.9"
win32_registry: win32_registry:
dependency: transitive dependency: transitive
description: description:
name: win32_registry name: win32_registry
sha256: e4506d60b7244251bc59df15656a3093501c37fb5af02105a944d73eb95be4c9 sha256: "41fd8a189940d8696b1b810efb9abcf60827b6cbfab90b0c43e8439e3a39d85a"
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "1.1.1" version: "1.1.2"
xdg_directories: xdg_directories:
dependency: transitive dependency: transitive
description: description:
@ -1756,4 +1748,4 @@ packages:
version: "3.1.2" version: "3.1.2"
sdks: sdks:
dart: ">=3.1.0 <4.0.0" dart: ">=3.1.0 <4.0.0"
flutter: ">=3.10.0" flutter: ">=3.13.0"