master #369

Closed
Haroon6138 wants to merge 9 commits from master into Main_App_Replacement

@ -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
}
[]

@ -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";

@ -608,7 +608,6 @@ class PushNotificationHandler {
// Permission.audio,
// Permission.microphone,
].request();
log("=-=-=-=-=-=-=-=-=-=-");
log(statuses[Permission.notification].toString());
}
} catch (_) {

@ -47,7 +47,7 @@ class FamilyFileRequest {
"SharedPatientIdentificationID": sharedPatientIdentificationId,
"SearchType": searchType,
"SharedPatientMobileNumber": sharedPatientMobileNumber,
"zipCode": zipCode,
"ZipCode": zipCode,
"isRegister": isRegister,
"PatientStatus": patientStatus,
"isDentalAllowedBackend": isDentalAllowedBackend,

@ -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<OccasionConfigModel> listFromJson(List<dynamic> jsonList) {
return jsonList.map((e) => OccasionConfigModel.fromJson(e as Map<String, dynamic>)).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<OccasionConfigModel> 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,
};
}

@ -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<void> refresh() async {
try {
await _remoteConfigService.fetchAndActivate();
final rawJson = _remoteConfigService.occasionConfigRawJson;
_config = OccasionConfigModel.fromJson(json.decode(rawJson) as Map<String, dynamic>);
final configs = OccasionConfigModel.listFromJson(json.decode(rawJson) as List<dynamic>);
_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<String, dynamic>);
final configs = OccasionConfigModel.listFromJson(json.decode(cachedJson) as List<dynamic>);
_config = OccasionConfigModel.resolveActive(configs, _now);
} catch (ex) {
_loggerService.logError('OccasionThemeViewModel._restoreCachedConfig error: $ex');
_config = OccasionConfigModel.disabled();

@ -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<void> _firebaseMessagingBackgroundHandler(RemoteMessage message) async {
await Firebase.initializeApp(options: DefaultFirebaseOptions.currentPlatform);
@ -144,7 +143,11 @@ Future<void> callInitializations() async {
// Initialize Security Service early to catch threats before app logic runs
if (kReleaseMode) {
await getIt.get<SecurityService>().initialize();
try {
await getIt.get<SecurityService>().initialize();
} catch (e) {
getIt.get<LoggerService>().logError('SecurityService.initialize failed, continuing app startup: $e');
}
}
// Set up critical threat callback to navigate to unsafe device page
@ -177,6 +180,8 @@ Future<void> 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>();
OccasionThemeViewModel.debugNowOverride = DateTime.now();
// OccasionThemeViewModel.debugNowOverride = DateTime.parse('2027-03-09T00:00:00Z');
unawaited(occasionThemeViewModel.initialize());
}

@ -858,7 +858,7 @@ class _AppointmentPaymentPageState extends State<AppointmentPaymentPage> {
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<AppointmentPaymentPage> {
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 {

@ -781,7 +781,7 @@ class _ImmediateLiveCarePaymentPageState extends State<ImmediateLiveCarePaymentP
print("onBrowserLoadStart");
print(url);
if (selectedPaymentMethod == "TAMARA") {
if (selectedPaymentMethod.toLowerCase() == "tamara") {
if (Platform.isAndroid) {
Uri uri = new Uri.dataFromString(url);
tamaraPaymentStatus = uri.queryParameters['status'] ?? "";
@ -821,7 +821,7 @@ class _ImmediateLiveCarePaymentPageState extends State<ImmediateLiveCarePaymentP
void checkPaymentStatus() async {
LoaderBottomSheet.showLoader(loadingText: LocaleKeys.checkingPaymentStatusPleaseWait.tr());
if (selectedPaymentMethod == "TAMARA") {
if (selectedPaymentMethod.toLowerCase() == "tamara") {
await payfortViewModel.checkTamaraPaymentStatus(
transactionID: transID,
onSuccess: (apiResponse) async {

@ -228,6 +228,7 @@ class _LandingPageState extends State<LandingPage> {
// inline with the rest of the content.
final hasStickyBanner = context.watch<OccasionThemeViewModel>().headerImage?.isNotEmpty ?? false;
log("hasStickyBanner: $hasStickyBanner");
return Stack(
children: [
// Renders nothing unless a remote-config occasion theme (e.g.

@ -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);
}
}

@ -16,8 +16,9 @@ abstract class RemoteConfigService {
/// minimum fetch interval) and activates them.
Future<bool> 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 = '[]';
}

@ -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);

@ -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"

Loading…
Cancel
Save