diff --git a/assets/json/default_occasion_config.json b/assets/json/default_occasion_config.json index 6b38a4cb..fe51488c 100644 --- a/assets/json/default_occasion_config.json +++ b/assets/json/default_occasion_config.json @@ -1,12 +1 @@ -{ - "key": "none", - "enabled": false, - "start_date": null, - "end_date": null, - "primary_color": null, - "secondary_color": null, - "background_opacity_image": null, - "background_image_opacity": 0.2, - "header_image": null -} - +[] diff --git a/lib/core/api_consts.dart b/lib/core/api_consts.dart index 3cac224b..72a97884 100644 --- a/lib/core/api_consts.dart +++ b/lib/core/api_consts.dart @@ -316,10 +316,8 @@ class ApiConsts { static String googleCloudStorageENTranslationFileBaseURL = "https://storage.googleapis.com/hmg-patientapp-translations"; // ************ static values for Api **************** - // static final double appVersionID = 21.9; - static final double appVersionID = 21.5; + static final double appVersionID = 21.6; - // static final double appVersionID = 50.7; static final int appChannelId = 3; static final String appIpAddress = "10.20.10.20"; static final String appGeneralId = "Cs2020@2016\$2958"; diff --git a/lib/core/utils/push_notification_handler.dart b/lib/core/utils/push_notification_handler.dart index 42d384c0..30e251e1 100644 --- a/lib/core/utils/push_notification_handler.dart +++ b/lib/core/utils/push_notification_handler.dart @@ -608,7 +608,6 @@ class PushNotificationHandler { // Permission.audio, // Permission.microphone, ].request(); - log("=-=-=-=-=-=-=-=-=-=-"); log(statuses[Permission.notification].toString()); } } catch (_) { diff --git a/lib/features/common/models/family_file_request.dart b/lib/features/common/models/family_file_request.dart index 047b9af0..e3802bd5 100644 --- a/lib/features/common/models/family_file_request.dart +++ b/lib/features/common/models/family_file_request.dart @@ -47,7 +47,7 @@ class FamilyFileRequest { "SharedPatientIdentificationID": sharedPatientIdentificationId, "SearchType": searchType, "SharedPatientMobileNumber": sharedPatientMobileNumber, - "zipCode": zipCode, + "ZipCode": zipCode, "isRegister": isRegister, "PatientStatus": patientStatus, "isDentalAllowedBackend": isDentalAllowedBackend, diff --git a/lib/features/occasion_theme/occasion_config_model.dart b/lib/features/occasion_theme/occasion_config_model.dart index bf9d713f..26ddf733 100644 --- a/lib/features/occasion_theme/occasion_config_model.dart +++ b/lib/features/occasion_theme/occasion_config_model.dart @@ -17,9 +17,12 @@ class OccasionConfigModel { /// default/current theme, regardless of any other field below. final bool enabled; - /// Optional activation window. When both are present, the theme is only - /// considered active if `DateTime.now()` falls within [startDate, endDate]. - /// When null, the [enabled] flag alone controls activation. + /// Activation window. Both must be present and `DateTime.now()` must fall + /// within [startDate, endDate] for this occasion to be eligible — a + /// missing date on either side makes the occasion inactive (dates are + /// mandatory, not an optional override of [enabled]). This lets several + /// occasions be scheduled in advance in the same list (see + /// [OccasionConfigModel.resolveActive]) without colliding. final DateTime? startDate; final DateTime? endDate; @@ -66,13 +69,9 @@ class OccasionConfigModel { return OccasionConfigModel( key: (json['key'] as String?) ?? 'none', enabled: (json['enabled'] as bool?) ?? false, + // enabled: true, startDate: _parseDate(json['start_date']), endDate: _parseDate(json['end_date']), - - // enabled: true, - // startDate: _parseDate("2026-09-30T00:00:00Z"), - // endDate: _parseDate("2026-10-07T00:00:00Z"), - primaryColorHex: json['primary_color'] as String?, backgroundOpacityImage: json['background_opacity_image'] as String?, backgroundImageOpacity: (json['background_image_opacity'] as num?)?.toDouble() ?? 1.0, @@ -80,6 +79,25 @@ class OccasionConfigModel { ); } + /// Parses the remote-config value as a JSON array of occasions — lets + /// several occasions be scheduled in advance (e.g. National Day, Founding + /// Day, Eid), each with its own non-overlapping [startDate]/[endDate] + /// window, all under the same `occasion_config` remote-config key. + static List listFromJson(List jsonList) { + return jsonList.map((e) => OccasionConfigModel.fromJson(e as Map)).toList(); + } + + /// Picks whichever scheduled occasion is enabled and whose + /// [startDate]/[endDate] window contains `now` — first match in list + /// order wins, so entries are expected not to overlap. Returns + /// [OccasionConfigModel.disabled] when nothing matches. + static OccasionConfigModel resolveActive(List configs, [DateTime? now]) { + for (final config in configs) { + if (config.enabled && config.isWithinActiveWindow(now)) return config; + } + return OccasionConfigModel.disabled(); + } + static DateTime? _parseDate(dynamic value) { if (value == null) return null; if (value is String && value.isNotEmpty) { @@ -89,11 +107,13 @@ class OccasionConfigModel { } /// Whether "now" falls inside the configured activation window. - /// If no window is configured, the [enabled] flag alone decides. + /// Both [startDate] and [endDate] are required — if either is missing, + /// this occasion is never considered active (see field doc above). bool isWithinActiveWindow([DateTime? now]) { + if (startDate == null || endDate == null) return false; final current = now ?? DateTime.now(); - if (startDate != null && current.isBefore(startDate!)) return false; - if (endDate != null && current.isAfter(endDate!)) return false; + if (current.isBefore(startDate!)) return false; + if (current.isAfter(endDate!)) return false; return true; } @@ -125,4 +145,3 @@ class OccasionConfigModel { 'header_image': headerImage, }; } - diff --git a/lib/features/occasion_theme/occasion_theme_view_model.dart b/lib/features/occasion_theme/occasion_theme_view_model.dart index 9dd22b09..73f94ec7 100644 --- a/lib/features/occasion_theme/occasion_theme_view_model.dart +++ b/lib/features/occasion_theme/occasion_theme_view_model.dart @@ -35,8 +35,17 @@ class OccasionThemeViewModel extends ChangeNotifier { OccasionConfigModel _config = OccasionConfigModel.disabled(); OccasionConfigModel get config => _config; + /// Testing-only override for "now" when resolving which scheduled + /// occasion is active — set this instead of changing the device clock to + /// preview each occasion in the list. Only ever takes effect in debug + /// builds (see [_now]); always ignored in profile/release, so it can + /// never leak into production even if accidentally left set. + static DateTime? debugNowOverride; + + DateTime? get _now => kDebugMode ? debugNowOverride : null; + /// True only when enabled AND (if a window is configured) within it. - bool get isOccasionActive => _config.enabled && _config.isWithinActiveWindow(); + bool get isOccasionActive => _config.enabled && _config.isWithinActiveWindow(_now); String? get backgroundOpacityImage => isOccasionActive ? _config.backgroundOpacityImage : null; @@ -66,14 +75,20 @@ class OccasionThemeViewModel extends ChangeNotifier { } } - /// Fetches the latest occasion config from Firebase Remote Config and - /// applies it. Safe to call again later (e.g. on app resume) to pick up - /// changes without requiring an app update. + /// Fetches the latest occasion schedule from Firebase Remote Config and + /// applies whichever entry is currently active. Safe to call again later + /// (e.g. on app resume) to pick up changes without requiring an app update. Future refresh() async { try { await _remoteConfigService.fetchAndActivate(); final rawJson = _remoteConfigService.occasionConfigRawJson; - _config = OccasionConfigModel.fromJson(json.decode(rawJson) as Map); + final configs = OccasionConfigModel.listFromJson(json.decode(rawJson) as List); + _config = OccasionConfigModel.resolveActive(configs, _now); + _loggerService.logInfo('OccasionThemeViewModel: chosen theme = "${_config.key}" (enabled=${_config.enabled}, active=$isOccasionActive)'); + _loggerService.logInfo('OccasionThemeViewModel: chosen theme object = ${_config.toJson()}'); + // Cache the full schedule (not just the resolved entry) so offline + // restore at next startup re-resolves against that day's date instead + // of replaying whichever occasion happened to be active last time. await _cacheService.saveString(key: _cachedConfigKey, value: rawJson); _applyToAppColors(); notifyListeners(); @@ -91,7 +106,8 @@ class OccasionThemeViewModel extends ChangeNotifier { _config = OccasionConfigModel.disabled(); return; } - _config = OccasionConfigModel.fromJson(json.decode(cachedJson) as Map); + final configs = OccasionConfigModel.listFromJson(json.decode(cachedJson) as List); + _config = OccasionConfigModel.resolveActive(configs, _now); } catch (ex) { _loggerService.logError('OccasionThemeViewModel._restoreCachedConfig error: $ex'); _config = OccasionConfigModel.disabled(); diff --git a/lib/main.dart b/lib/main.dart index 5e527909..47416b49 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -73,7 +73,6 @@ import 'core/utils/size_utils.dart'; import 'features/monthly_reports/terms_conditions_view_model.dart'; import 'firebase_options.dart'; - @pragma('vm:entry-point') Future _firebaseMessagingBackgroundHandler(RemoteMessage message) async { await Firebase.initializeApp(options: DefaultFirebaseOptions.currentPlatform); @@ -144,7 +143,11 @@ Future callInitializations() async { // Initialize Security Service early to catch threats before app logic runs if (kReleaseMode) { - await getIt.get().initialize(); + try { + await getIt.get().initialize(); + } catch (e) { + getIt.get().logError('SecurityService.initialize failed, continuing app startup: $e'); + } } // Set up critical threat callback to navigate to unsafe device page @@ -177,6 +180,8 @@ Future callInitializations() async { // disabled by default — the app looks exactly as it does today until // Remote Config enables an occasion (e.g. National Day) on the server side. final occasionThemeViewModel = getIt.get(); + OccasionThemeViewModel.debugNowOverride = DateTime.now(); + // OccasionThemeViewModel.debugNowOverride = DateTime.parse('2027-03-09T00:00:00Z'); unawaited(occasionThemeViewModel.initialize()); } diff --git a/lib/presentation/appointments/appointment_payment_page.dart b/lib/presentation/appointments/appointment_payment_page.dart index bef2df93..992f512e 100644 --- a/lib/presentation/appointments/appointment_payment_page.dart +++ b/lib/presentation/appointments/appointment_payment_page.dart @@ -858,7 +858,7 @@ class _AppointmentPaymentPageState extends State { print("onBrowserLoadStart"); print(url); - if (selectedPaymentMethod == "tamara") { + if (selectedPaymentMethod.toLowerCase() == "tamara") { if (Platform.isAndroid) { Uri uri = new Uri.dataFromString(url); tamaraPaymentStatus = uri.queryParameters['status']!; @@ -897,7 +897,7 @@ class _AppointmentPaymentPageState extends State { void checkPaymentStatus() async { LoaderBottomSheet.showLoader(loadingText: LocaleKeys.checkingPaymentStatusPleaseWait.tr(context: context)); - if (selectedPaymentMethod == "TAMARA") { + if (selectedPaymentMethod.toLowerCase() == "tamara") { await payfortViewModel.checkTamaraPaymentStatus( transactionID: transID, onSuccess: (apiResponse) async { diff --git a/lib/presentation/book_appointment/livecare/immediate_livecare_payment_page.dart b/lib/presentation/book_appointment/livecare/immediate_livecare_payment_page.dart index b205063c..b9df0744 100644 --- a/lib/presentation/book_appointment/livecare/immediate_livecare_payment_page.dart +++ b/lib/presentation/book_appointment/livecare/immediate_livecare_payment_page.dart @@ -781,7 +781,7 @@ class _ImmediateLiveCarePaymentPageState extends State { // inline with the rest of the content. final hasStickyBanner = context.watch().headerImage?.isNotEmpty ?? false; + log("hasStickyBanner: $hasStickyBanner"); return Stack( children: [ // Renders nothing unless a remote-config occasion theme (e.g. diff --git a/lib/services/logger_service.dart b/lib/services/logger_service.dart index 617539aa..d113f06d 100644 --- a/lib/services/logger_service.dart +++ b/lib/services/logger_service.dart @@ -1,3 +1,5 @@ +import 'dart:developer'; + import 'package:logger/logger.dart'; abstract class LoggerService { @@ -18,6 +20,6 @@ class LoggerServiceImp implements LoggerService { @override void logInfo(String message) { - logger.d(message); + log(message); } } diff --git a/lib/services/remote_config_service.dart b/lib/services/remote_config_service.dart index 568bd4e6..d39a7fbe 100644 --- a/lib/services/remote_config_service.dart +++ b/lib/services/remote_config_service.dart @@ -16,8 +16,9 @@ abstract class RemoteConfigService { /// minimum fetch interval) and activates them. Future fetchAndActivate(); - /// Raw JSON string currently held for the `occasion_config` key - /// (bundled default until the first successful fetch/activate). + /// Raw JSON array string currently held for the `occasion_config` key — + /// a list of scheduled occasions (bundled default `[]` until the first + /// successful fetch/activate). String get occasionConfigRawJson; } @@ -41,7 +42,9 @@ class RemoteConfigServiceImp implements RemoteConfigService { fetchTimeout: const Duration(seconds: 10), // In debug builds, always fetch fresh values so you can test // Remote Config changes instantly without waiting/throttling. - // Release builds keep a sane 1-hour minimum interval. + // Release/profile builds keep a 1-hour minimum interval — + // balances timely occasion-theme rollout against not hammering + // Remote Config across the whole user base. minimumFetchInterval: kDebugMode ? Duration.zero : const Duration(hours: 1), ), ); @@ -79,5 +82,7 @@ class RemoteConfigServiceImp implements RemoteConfigService { } } - static const String _fallbackDisabledJson = '{"key":"none","enabled":false}'; + /// Empty schedule — [OccasionConfigModel.resolveActive] treats this the + /// same as "no occasion currently active". + static const String _fallbackDisabledJson = '[]'; } diff --git a/lib/widgets/in_app_browser/InAppBrowser.dart b/lib/widgets/in_app_browser/InAppBrowser.dart index 5eaa313c..1d3b6fa4 100644 --- a/lib/widgets/in_app_browser/InAppBrowser.dart +++ b/lib/widgets/in_app_browser/InAppBrowser.dart @@ -314,6 +314,8 @@ class MyInAppBrowser extends InAppBrowser { if (isLiveCareAppo) { form = form.replaceFirst('IS_SCHEDULE_VALUE', "true"); + } else { + form = form.replaceFirst('IS_SCHEDULE_VALUE', "false"); } var bytes = utf8.encode(form); diff --git a/pubspec.lock b/pubspec.lock index 70ddfc04..f8789dac 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -5,10 +5,10 @@ packages: dependency: transitive description: name: _flutterfire_internals - sha256: ff0a84a2734d9e1089f8aedd5c0af0061b82fb94e95260d943404e0ef2134b11 + sha256: f6966125633a34f82d9be2ee895b755cff3554087b1d00a9eb884e5947f4bca9 url: "https://pub.dev" source: hosted - version: "1.3.59" + version: "1.3.77" adaptive_number: dependency: transitive description: @@ -117,10 +117,10 @@ packages: dependency: transitive description: name: characters - sha256: f71061c654a3380576a52b451dd5532377954cf9dbd272a78fc8479606670803 + sha256: faf38497bda5ead2a8c7615f4f7939df04333478bf32e4173fcb06d428b5716b url: "https://pub.dev" source: hosted - version: "1.4.0" + version: "1.4.1" chewie: dependency: transitive description: @@ -133,10 +133,10 @@ packages: dependency: "direct main" description: name: clarity_flutter - sha256: b3a114fec6e873caf03cd59a32953f8cb4b1693bd3b4f749ef3030fea027ebce + sha256: "4d46afd76c31d3876f23384d44d6f5728a556daff6cec8b2c98d251dac14899e" url: "https://pub.dev" source: hosted - version: "1.9.0" + version: "1.10.0" clock: dependency: transitive description: @@ -165,18 +165,18 @@ packages: dependency: "direct main" description: name: connectivity_plus - sha256: b5e72753cf63becce2c61fd04dfe0f1c430cc5278b53a1342dc5ad839eab29ec + sha256: "762c99f890ca8bf87f7337236f99edd42793843bc6c3631da294a76653a54bd0" url: "https://pub.dev" source: hosted - version: "6.1.5" + version: "7.3.1" connectivity_plus_platform_interface: dependency: transitive description: name: connectivity_plus_platform_interface - sha256: "42657c1715d48b167930d5f34d00222ac100475f73d10162ddf43e714932f204" + sha256: "3c09627c536d22fd24691a905cdd8b14520de69da52c7a97499c8be5284a32ed" url: "https://pub.dev" source: hosted - version: "2.0.1" + version: "2.1.0" convert: dependency: transitive description: @@ -402,114 +402,114 @@ packages: dependency: "direct main" description: name: firebase_analytics - sha256: "4f85b161772e1d54a66893ef131c0a44bd9e552efa78b33d5f4f60d2caa5c8a3" + sha256: b82d2cabf4905a465ac95937037cbab4f2ca80f559cb04abd3da3f2abb9960bb url: "https://pub.dev" source: hosted - version: "11.6.0" + version: "12.6.0" firebase_analytics_platform_interface: dependency: transitive description: name: firebase_analytics_platform_interface - sha256: a44b6d1155ed5cae7641e3de7163111cfd9f6f6c954ca916dc6a3bdfa86bf845 + sha256: "5c3ab4b681c837afd71f0abf77c7485f51c7b645d4ae77b96f9ed54779ff4126" url: "https://pub.dev" source: hosted - version: "4.4.3" + version: "6.0.7" firebase_analytics_web: dependency: transitive description: name: firebase_analytics_web - sha256: c7d1ed1f86ae64215757518af5576ff88341c8ce5741988c05cc3b2e07b0b273 + sha256: "09eb4d0ce4c9a16efbc277ac709a90eb197d5512592215a73c6a302ab1ab6c3a" url: "https://pub.dev" source: hosted - version: "0.5.10+16" + version: "0.6.1+13" firebase_core: dependency: "direct main" description: name: firebase_core - sha256: "7be63a3f841fc9663342f7f3a011a42aef6a61066943c90b1c434d79d5c995c5" + sha256: "5fbbaa2aeb08a52feee559f92a62f5a6b04c9bdff81c8f608636771cf0d7b680" url: "https://pub.dev" source: hosted - version: "3.15.2" + version: "4.15.0" firebase_core_platform_interface: dependency: transitive description: name: firebase_core_platform_interface - sha256: cccb4f572325dc14904c02fcc7db6323ad62ba02536833dddb5c02cac7341c64 + sha256: "9bfbc85faca09346471ac56fbcee00757ebcfd85887c6f602764eff0001902d8" url: "https://pub.dev" source: hosted - version: "6.0.2" + version: "8.1.1" firebase_core_web: dependency: transitive description: name: firebase_core_web - sha256: "0ed0dc292e8f9ac50992e2394e9d336a0275b6ae400d64163fdf0a8a8b556c37" + sha256: "8ed84f5001dbd7a0390e2818d46bc858ceebb970edededdfc8d6552c76fc2f6e" url: "https://pub.dev" source: hosted - version: "2.24.1" + version: "3.12.0" firebase_crashlytics: dependency: "direct main" description: name: firebase_crashlytics - sha256: "662ae6443da91bca1fb0be8aeeac026fa2975e8b7ddfca36e4d90ebafa35dde1" + sha256: f37fe0df162f08bd549114b784037c73a093c64d22625632f97dbbddf18669b9 url: "https://pub.dev" source: hosted - version: "4.3.10" + version: "5.4.0" firebase_crashlytics_platform_interface: dependency: transitive description: name: firebase_crashlytics_platform_interface - sha256: "7222a8a40077c79f6b8b3f3439241c9f2b34e9ddfde8381ffc512f7b2e61f7eb" + sha256: "8270dcdb1800db3e5f888ce30a2d5e8f92c379c461f022297c83b2c794aa1792" url: "https://pub.dev" source: hosted - version: "3.8.10" + version: "3.9.0" firebase_messaging: dependency: "direct main" description: name: firebase_messaging - sha256: "60be38574f8b5658e2f22b7e311ff2064bea835c248424a383783464e8e02fcc" + sha256: "47a8142a0b897783103b01018ad69f123b819b0120483847bde30d1b2fa89b36" url: "https://pub.dev" source: hosted - version: "15.2.10" + version: "16.7.0" firebase_messaging_platform_interface: dependency: transitive description: name: firebase_messaging_platform_interface - sha256: "685e1771b3d1f9c8502771ccc9f91485b376ffe16d553533f335b9183ea99754" + sha256: f9707e185b8ce1155d58e7e29348245072d99981f899fa8d3214abb2652c4ccb url: "https://pub.dev" source: hosted - version: "4.6.10" + version: "4.10.0" firebase_messaging_web: dependency: transitive description: name: firebase_messaging_web - sha256: "0d1be17bc89ed3ff5001789c92df678b2e963a51b6fa2bdb467532cc9dbed390" + sha256: "311b16c75fc645c7a70c9ade38908abb12310dfce449fc3d3cee1771f196351e" url: "https://pub.dev" source: hosted - version: "3.10.10" + version: "4.2.5" firebase_remote_config: dependency: "direct main" description: name: firebase_remote_config - sha256: e1635b1e8713f4a823920ec3a56a14034b90ce455d47746ab0da994857f370cf + sha256: fa518445638fa3903e359ac544bd3243e72ada025728c8dbfa4b28ae939e8b38 url: "https://pub.dev" source: hosted - version: "5.5.0" + version: "6.7.0" firebase_remote_config_platform_interface: dependency: transitive description: name: firebase_remote_config_platform_interface - sha256: ce836c5c62056edbe23ef501e6876691ee32476afd12fe95b76e57bba9d25485 + sha256: dc5a9713031f2ca744cb266d96a58609e929db19f3d91a1dd6bb8f8a0d77acad url: "https://pub.dev" source: hosted - version: "2.0.0" + version: "3.0.7" firebase_remote_config_web: dependency: transitive description: name: firebase_remote_config_web - sha256: "9dbd75024bfcd47c05046c95f9cf648a8fc862b096bcf8ea1e4b855d50ea19ad" + sha256: "500abf695c370c76a486ad7480a6df7caf55d2d35ccc5c66b9fc9c1c47f2bc14" url: "https://pub.dev" source: hosted - version: "1.8.9" + version: "1.10.14" fixnum: dependency: transitive description: @@ -534,10 +534,9 @@ packages: flutter_amazonpaymentservices: dependency: "direct main" description: - name: flutter_amazonpaymentservices - sha256: "23f45fd3b1e12a0933da3704d66cebd19c4c41e28a50d4fd458d3e3e6311f332" - url: "https://pub.dev" - source: hosted + path: "package/flutter_amazonpaymentservices" + relative: true + source: path version: "0.0.13" flutter_cache_manager: dependency: transitive @@ -821,10 +820,10 @@ packages: dependency: "direct main" description: name: flutter_zoom_videosdk - sha256: "87caad07b994f09b9d8c4b8054c0dff5659029abae38dd6ec223460c3f1bcb7d" + sha256: "46a4dea664b1c969099328a499c198a1755adf9ac333dea28bea5187910b3bf9" url: "https://pub.dev" source: hosted - version: "2.5.10" + version: "2.1.10" fluttertoast: dependency: "direct main" description: @@ -1301,26 +1300,26 @@ packages: dependency: "direct main" description: name: local_auth - sha256: "434d854cf478f17f12ab29a76a02b3067f86a63a6d6c4eb8fbfdcfe4879c1b7b" + sha256: ecf24edf2283c509ecd217e3595f6f71034b68888d28ad1dae6bfa0857b816ac url: "https://pub.dev" source: hosted - version: "2.3.0" + version: "3.0.2" local_auth_android: dependency: transitive description: name: local_auth_android - sha256: a0bdfcc0607050a26ef5b31d6b4b254581c3d3ce3c1816ab4d4f4a9173e84467 + sha256: "76c389998fe95cff4352644776ab5775f24ddd58f179dbf3df1b9c268cbbadc4" url: "https://pub.dev" source: hosted - version: "1.0.56" + version: "2.2.0" local_auth_darwin: dependency: transitive description: name: local_auth_darwin - sha256: "699873970067a40ef2f2c09b4c72eb1cfef64224ef041b3df9fdc5c4c1f91f49" + sha256: b1b2d938cc3511512e552d92e782e055b8dc29c83e21c59e6ecfc6bd79ab0744 url: "https://pub.dev" source: hosted - version: "1.6.1" + version: "2.0.4" local_auth_platform_interface: dependency: transitive description: @@ -1333,10 +1332,10 @@ packages: dependency: transitive description: name: local_auth_windows - sha256: bc4e66a29b0fdf751aafbec923b5bed7ad6ed3614875d8151afe2578520b2ab5 + sha256: d72b8a441e5e6a679902f87c51529fcce65f442d77598484cf35454c3d733eda url: "https://pub.dev" source: hosted - version: "1.0.11" + version: "2.0.2" location: dependency: "direct main" description: @@ -1405,26 +1404,26 @@ packages: dependency: transitive description: name: matcher - sha256: dc58c723c3c24bf8d3e2d3ad3f2f9d7bd9cf43ec6feaa64181775e60190153f2 + sha256: dc0b7dc7651697ea4ff3e69ef44b0407ea32c487a39fff6a4004fa585e901861 url: "https://pub.dev" source: hosted - version: "0.12.17" + version: "0.12.19" material_color_utilities: dependency: transitive description: name: material_color_utilities - sha256: f7142bb1154231d7ea5f96bc7bde4bda2a0945d2806bb11670e30b850d56bdec + sha256: "9c337007e82b1889149c82ed242ed1cb24a66044e30979c44912381e9be4c48b" url: "https://pub.dev" source: hosted - version: "0.11.1" + version: "0.13.0" meta: dependency: transitive description: name: meta - sha256: "23f08335362185a5ea2ad3a4e597f1375e78bce8a040df5c600c8d3552ef2394" + sha256: "1741988757a65eb6b36abe716829688cf01910bbf91c34354ff7ec1c3de2b349" url: "https://pub.dev" source: hosted - version: "1.17.0" + version: "1.18.0" mime: dependency: transitive description: @@ -1797,10 +1796,10 @@ packages: dependency: "direct main" description: name: shared_preferences - sha256: "2939ae520c9024cb197fc20dee269cd8cdbf564c8b5746374ec6cacdc5169e64" + sha256: "1e85e0dccf5b4a016077fea7dfbb4a7cb39c759ac1596fcf60c06deadb7da91f" url: "https://pub.dev" source: hosted - version: "2.5.4" + version: "2.5.6" shared_preferences_android: dependency: transitive description: @@ -2018,10 +2017,10 @@ packages: dependency: transitive description: name: test_api - sha256: ab2726c1a94d3176a45960b6234466ec367179b87dd74f1611adb1f3b5fb9d55 + sha256: "949a932224383300f01be9221c39180316445ecb8e7547f70a41a35bf421fb9e" url: "https://pub.dev" source: hosted - version: "0.7.7" + version: "0.7.11" time: dependency: transitive description: @@ -2303,5 +2302,5 @@ packages: source: hosted version: "1.2.0" sdks: - dart: ">=3.9.0 <4.0.0" - flutter: ">=3.35.0" + dart: ">=3.12.0 <4.0.0" + flutter: ">=3.44.0"