diff --git a/packages/uni_app/lib/controller/feature_flags/feature_flag_controller.dart b/packages/uni_app/lib/controller/feature_flags/feature_flag_controller.dart new file mode 100644 index 000000000..1e6f172af --- /dev/null +++ b/packages/uni_app/lib/controller/feature_flags/feature_flag_controller.dart @@ -0,0 +1,117 @@ +import 'package:flutter/material.dart'; +import 'package:uni/controller/feature_flags/feature_flag_info.dart'; +import 'package:uni/controller/feature_flags/feature_flag_state_controller.dart'; +import 'package:uni/model/feature_flags/feature_flag.dart'; +import 'package:uni/model/feature_flags/feature_flag_group.dart'; +import 'package:uni/model/feature_flags/generic_feature_flag.dart'; + +class FeatureFlagController extends ChangeNotifier { + FeatureFlagController({ + required FeatureFlagStateController stateController, + required List featureFlagInfos, + }) : this._( + parsedFeatureFlags: + _parseFeatureFlagTable(stateController, featureFlagInfos), + ); + + FeatureFlagController._({ + required ( + List, + Map + ) parsedFeatureFlags, + }) : _featureFlags = parsedFeatureFlags.$1, + _featureFlagsMap = parsedFeatureFlags.$2; + + final List _featureFlags; // To preserve order + final Map _featureFlagsMap; // For fast lookup + + static (List, Map) + _parseFeatureFlagTable( + FeatureFlagStateController stateController, + List featureFlagInfos, + ) { + final featureFlags = []; + final featureFlagsMap = {}; + + for (final featureFlagInfo in featureFlagInfos) { + final featureFlag = featureFlagInfo is FeatureFlagInfo + ? _createFeatureFlag(stateController, featureFlagInfo) + : _createFeatureFlagGroup( + stateController, + featureFlagInfo as FeatureFlagGroupInfo, + ); + + featureFlags.add(featureFlag); + featureFlagsMap[featureFlag.code] = featureFlag; + + if (featureFlag is FeatureFlagGroup) { + for (final subFeatureFlag in featureFlag.getFeatureFlags()) { + featureFlagsMap[subFeatureFlag.code] = subFeatureFlag; + } + } + } + + return (featureFlags, featureFlagsMap); + } + + static bool _isEnabled( + FeatureFlagStateController stateController, + String code, + ) { + return stateController.isEnabled(code); + } + + static Future _saveEnabled( + FeatureFlagStateController stateController, + String code, { + required bool enabled, + }) async { + await stateController.saveEnabled(code, enabled: enabled); + } + + static FeatureFlag _createFeatureFlag( + FeatureFlagStateController stateController, + FeatureFlagInfo featureFlagInfo, + ) { + final code = featureFlagInfo.code; + final getName = featureFlagInfo.getName; + + return FeatureFlag( + code: code, + getName: getName, + isEnabled: () => _isEnabled(stateController, code), + saveEnabled: ({required enabled}) => + _saveEnabled(stateController, code, enabled: enabled), + ); + } + + static GenericFeatureFlag _createFeatureFlagGroup( + FeatureFlagStateController stateController, + FeatureFlagGroupInfo featureFlagGroupInfo, + ) { + final code = featureFlagGroupInfo.code; + final getName = featureFlagGroupInfo.getName; + final featureFlags = featureFlagGroupInfo.featureFlags + .map((info) => _createFeatureFlag(stateController, info)) + .toList(); + + final featureFlagGroup = FeatureFlagGroup( + code: code, + getName: getName, + isEnabled: () => _isEnabled(stateController, code), + saveEnabled: ({required enabled}) => + _saveEnabled(stateController, code, enabled: enabled), + featureFlags: featureFlags, + ); + + return featureFlagGroup; + } + + GenericFeatureFlag? getFeatureFlag(String code) { + return _featureFlagsMap[code]; + } + + List getFeatureFlags() { + return _featureFlags; + } +} diff --git a/packages/uni_app/lib/controller/feature_flags/feature_flag_info.dart b/packages/uni_app/lib/controller/feature_flags/feature_flag_info.dart new file mode 100644 index 000000000..f4c36a74a --- /dev/null +++ b/packages/uni_app/lib/controller/feature_flags/feature_flag_info.dart @@ -0,0 +1,28 @@ +import 'package:flutter/material.dart'; + +abstract class GenericFeatureFlagInfo { + const GenericFeatureFlagInfo({ + required this.code, + required this.getName, + }); + + final String code; + final String Function(BuildContext) getName; +} + +class FeatureFlagInfo extends GenericFeatureFlagInfo { + const FeatureFlagInfo({ + required super.code, + required super.getName, + }); +} + +class FeatureFlagGroupInfo extends GenericFeatureFlagInfo { + const FeatureFlagGroupInfo({ + required super.code, + required super.getName, + required this.featureFlags, + }); + + final List featureFlags; +} diff --git a/packages/uni_app/lib/controller/feature_flags/feature_flag_state_controller.dart b/packages/uni_app/lib/controller/feature_flags/feature_flag_state_controller.dart new file mode 100644 index 000000000..d7fec75ec --- /dev/null +++ b/packages/uni_app/lib/controller/feature_flags/feature_flag_state_controller.dart @@ -0,0 +1,18 @@ +import 'package:shared_preferences/shared_preferences.dart'; + +class FeatureFlagStateController { + FeatureFlagStateController(this.preferences); + + final SharedPreferences preferences; + static const _flagPrefix = '__feature_flag__'; + + String _getKey(String code) => '$_flagPrefix$code'; + + bool isEnabled(String code) { + return preferences.getBool(_getKey(code)) ?? false; + } + + Future saveEnabled(String code, {required bool enabled}) { + return preferences.setBool(_getKey(code), enabled); + } +} diff --git a/packages/uni_app/lib/controller/feature_flags/feature_flag_table.dart b/packages/uni_app/lib/controller/feature_flags/feature_flag_table.dart new file mode 100644 index 000000000..036495f42 --- /dev/null +++ b/packages/uni_app/lib/controller/feature_flags/feature_flag_table.dart @@ -0,0 +1,23 @@ +import 'package:uni/controller/feature_flags/feature_flag_info.dart'; +import 'package:uni/generated/l10n.dart'; + +List featureFlagTable = [ + FeatureFlagInfo( + code: 'library_modules', + getName: (context) => S.of(context).library_modules, + ), + FeatureFlagGroupInfo( + code: 'library', + getName: (context) => S.of(context).library_modules, + featureFlags: [ + FeatureFlagInfo( + code: 'library_occupation', + getName: (context) => S.of(context).library_modules, + ), + FeatureFlagInfo( + code: 'library_floors', + getName: (context) => S.of(context).library_modules, + ), + ], + ), +]; diff --git a/packages/uni_app/lib/generated/intl/messages_en.dart b/packages/uni_app/lib/generated/intl/messages_en.dart index 29743e6aa..9249703f3 100644 --- a/packages/uni_app/lib/generated/intl/messages_en.dart +++ b/packages/uni_app/lib/generated/intl/messages_en.dart @@ -133,6 +133,8 @@ class MessageLookup extends MessageLookupByLibrary { "fail_to_authenticate": MessageLookupByLibrary.simpleMessage("Failed to authenticate"), "failed_login": MessageLookupByLibrary.simpleMessage("Login failed"), + "feature_flags": + MessageLookupByLibrary.simpleMessage("Experimental features"), "fee_date": MessageLookupByLibrary.simpleMessage("Deadline for next fee:"), "fee_notification": @@ -159,6 +161,8 @@ class MessageLookup extends MessageLookupByLibrary { "language": MessageLookupByLibrary.simpleMessage("Language"), "last_refresh_time": m0, "last_timestamp": m1, + "library_modules": + MessageLookupByLibrary.simpleMessage("Library modules"), "library_occupation": MessageLookupByLibrary.simpleMessage("Library Occupation"), "load_error": MessageLookupByLibrary.simpleMessage( diff --git a/packages/uni_app/lib/generated/intl/messages_pt_PT.dart b/packages/uni_app/lib/generated/intl/messages_pt_PT.dart index 1aca84f19..ce945816c 100644 --- a/packages/uni_app/lib/generated/intl/messages_pt_PT.dart +++ b/packages/uni_app/lib/generated/intl/messages_pt_PT.dart @@ -132,6 +132,8 @@ class MessageLookup extends MessageLookupByLibrary { "fail_to_authenticate": MessageLookupByLibrary.simpleMessage("Falha ao autenticar"), "failed_login": MessageLookupByLibrary.simpleMessage("O login falhou"), + "feature_flags": + MessageLookupByLibrary.simpleMessage("Features experimentais"), "fee_date": MessageLookupByLibrary.simpleMessage( "Data limite próxima prestação:"), "fee_notification": @@ -158,6 +160,8 @@ class MessageLookup extends MessageLookupByLibrary { "language": MessageLookupByLibrary.simpleMessage("Idioma"), "last_refresh_time": m0, "last_timestamp": m1, + "library_modules": + MessageLookupByLibrary.simpleMessage("Módulos da biblioteca"), "library_occupation": MessageLookupByLibrary.simpleMessage("Ocupação da Biblioteca"), "load_error": MessageLookupByLibrary.simpleMessage( diff --git a/packages/uni_app/lib/generated/l10n.dart b/packages/uni_app/lib/generated/l10n.dart index ee888da7f..adc2a37b4 100644 --- a/packages/uni_app/lib/generated/l10n.dart +++ b/packages/uni_app/lib/generated/l10n.dart @@ -1737,6 +1737,26 @@ class S { args: [], ); } + + /// `Experimental features` + String get feature_flags { + return Intl.message( + 'Experimental features', + name: 'feature_flags', + desc: '', + args: [], + ); + } + + /// `Library modules` + String get library_modules { + return Intl.message( + 'Library modules', + name: 'library_modules', + desc: '', + args: [], + ); + } } class AppLocalizationDelegate extends LocalizationsDelegate { diff --git a/packages/uni_app/lib/l10n/intl_en.arb b/packages/uni_app/lib/l10n/intl_en.arb index c0cb3ad19..1217790cc 100644 --- a/packages/uni_app/lib/l10n/intl_en.arb +++ b/packages/uni_app/lib/l10n/intl_en.arb @@ -341,5 +341,9 @@ "wrong_credentials_exception": "Invalid credentials", "@wrong_credentials_exception": {}, "internet_status_exception": "Check your internet connection", - "@internet_status_exception": {} + "@internet_status_exception": {}, + "feature_flags": "Experimental features", + "@feature_flags": {}, + "library_modules": "Library modules", + "@library_modules": {} } diff --git a/packages/uni_app/lib/l10n/intl_pt_PT.arb b/packages/uni_app/lib/l10n/intl_pt_PT.arb index 50eb23e8b..a4d92fcf1 100644 --- a/packages/uni_app/lib/l10n/intl_pt_PT.arb +++ b/packages/uni_app/lib/l10n/intl_pt_PT.arb @@ -341,5 +341,9 @@ "wrong_credentials_exception": "Credenciais inválidas", "@wrong_credentials_exception": {}, "internet_status_exception": "Verifique sua conexão com a internet", - "@internet_status_exception": {} + "@internet_status_exception": {}, + "feature_flags": "Features experimentais", + "@feature_flags": {}, + "library_modules": "Módulos da biblioteca", + "@library_modules": {} } diff --git a/packages/uni_app/lib/main.dart b/packages/uni_app/lib/main.dart index 8ab6fe912..5203a3e5e 100644 --- a/packages/uni_app/lib/main.dart +++ b/packages/uni_app/lib/main.dart @@ -14,6 +14,9 @@ import 'package:shared_preferences/shared_preferences.dart'; import 'package:ua_client_hints/ua_client_hints.dart'; import 'package:uni/controller/background_workers/background_callback.dart'; import 'package:uni/controller/cleanup.dart'; +import 'package:uni/controller/feature_flags/feature_flag_controller.dart'; +import 'package:uni/controller/feature_flags/feature_flag_state_controller.dart'; +import 'package:uni/controller/feature_flags/feature_flag_table.dart'; import 'package:uni/controller/fetchers/terms_and_conditions_fetcher.dart'; import 'package:uni/controller/local_storage/preferences_controller.dart'; import 'package:uni/generated/l10n.dart'; @@ -127,6 +130,11 @@ Future main() async { final route = await firstRoute(); + final featureFlagController = FeatureFlagController( + stateController: FeatureFlagStateController(PreferencesController.prefs), + featureFlagInfos: featureFlagTable, + ); + await SentryFlutter.init( (options) { options.dsn = @@ -177,6 +185,9 @@ Future main() async { ChangeNotifierProvider( create: (_) => ThemeNotifier(savedTheme), ), + ChangeNotifierProvider( + create: (_) => featureFlagController, + ), ], child: Application(route), ), diff --git a/packages/uni_app/lib/model/feature_flags/feature_flag.dart b/packages/uni_app/lib/model/feature_flags/feature_flag.dart new file mode 100644 index 000000000..a4ebde068 --- /dev/null +++ b/packages/uni_app/lib/model/feature_flags/feature_flag.dart @@ -0,0 +1,29 @@ +import 'package:flutter/material.dart'; +import 'package:uni/model/feature_flags/generic_feature_flag.dart'; + +class FeatureFlag extends GenericFeatureFlag { + FeatureFlag({ + required this.code, + required String Function(BuildContext) getName, + required bool Function() isEnabled, + required Future Function({required bool enabled}) saveEnabled, + }) : _getName = getName, + _isEnabled = isEnabled, + _saveEnabled = saveEnabled; + + @override + final String code; + final String Function(BuildContext) _getName; + final bool Function() _isEnabled; + final Future Function({required bool enabled}) _saveEnabled; + + @override + String getName(BuildContext context) => _getName(context); + + @override + bool isEnabled() => _isEnabled(); + + @override + Future setEnabled({required bool enabled}) => + _saveEnabled(enabled: enabled); +} diff --git a/packages/uni_app/lib/model/feature_flags/feature_flag_group.dart b/packages/uni_app/lib/model/feature_flags/feature_flag_group.dart new file mode 100644 index 000000000..f53310860 --- /dev/null +++ b/packages/uni_app/lib/model/feature_flags/feature_flag_group.dart @@ -0,0 +1,42 @@ +import 'package:flutter/material.dart'; +import 'package:uni/model/feature_flags/feature_flag.dart'; +import 'package:uni/model/feature_flags/generic_feature_flag.dart'; + +class FeatureFlagGroup extends GenericFeatureFlag { + FeatureFlagGroup({ + required this.code, + required String Function(BuildContext) getName, + required bool Function() isEnabled, + required Future Function({required bool enabled}) saveEnabled, + required List featureFlags, + }) : _getName = getName, + _isEnabled = isEnabled, + _saveEnabled = saveEnabled, + _featureFlags = featureFlags; + + @override + final String code; + final String Function(BuildContext) _getName; + final bool Function() _isEnabled; + final Future Function({required bool enabled}) _saveEnabled; + final List _featureFlags; + + @override + String getName(BuildContext context) => _getName(context); + + @override + bool isEnabled() => _isEnabled(); + + @override + Future setEnabled({required bool enabled}) async { + await _saveEnabled(enabled: enabled); + + for (final featureFlag in _featureFlags) { + await featureFlag.setEnabled(enabled: enabled); + } + } + + List getFeatureFlags() { + return _featureFlags; + } +} diff --git a/packages/uni_app/lib/model/feature_flags/generic_feature_flag.dart b/packages/uni_app/lib/model/feature_flags/generic_feature_flag.dart new file mode 100644 index 000000000..c402d631d --- /dev/null +++ b/packages/uni_app/lib/model/feature_flags/generic_feature_flag.dart @@ -0,0 +1,8 @@ +import 'package:flutter/material.dart'; + +abstract class GenericFeatureFlag { + String get code; + String getName(BuildContext context); + bool isEnabled(); + Future setEnabled({required bool enabled}); +} diff --git a/packages/uni_app/lib/view/common_widgets/experimental_feature_wrapper.dart b/packages/uni_app/lib/view/common_widgets/experimental_feature_wrapper.dart new file mode 100644 index 000000000..44145a855 --- /dev/null +++ b/packages/uni_app/lib/view/common_widgets/experimental_feature_wrapper.dart @@ -0,0 +1,24 @@ +import 'package:flutter/cupertino.dart'; +import 'package:uni/model/feature_flags/generic_feature_flag.dart'; + +class ExperimentalFeatureWrapper extends StatelessWidget { + const ExperimentalFeatureWrapper({ + required this.featureFlag, + required this.onEnabled, + this.onDisabled = _defaultOnDisabled, + super.key, + }); + + final GenericFeatureFlag featureFlag; + final Widget Function(BuildContext) onEnabled; + final Widget Function(BuildContext) onDisabled; + + static Widget _defaultOnDisabled(BuildContext context) { + return Container(); + } + + @override + Widget build(BuildContext context) { + return featureFlag.isEnabled() ? onEnabled(context) : onDisabled(context); + } +} diff --git a/packages/uni_app/lib/view/library/library.dart b/packages/uni_app/lib/view/library/library.dart index a86bc19c0..f69be90ff 100644 --- a/packages/uni_app/lib/view/library/library.dart +++ b/packages/uni_app/lib/view/library/library.dart @@ -1,10 +1,12 @@ import 'package:flutter/material.dart'; import 'package:percent_indicator/linear_percent_indicator.dart'; import 'package:provider/provider.dart'; +import 'package:uni/controller/feature_flags/feature_flag_controller.dart'; import 'package:uni/generated/l10n.dart'; import 'package:uni/model/entities/library_occupation.dart'; import 'package:uni/model/providers/lazy/library_occupation_provider.dart'; import 'package:uni/utils/navigation_items.dart'; +import 'package:uni/view/common_widgets/experimental_feature_wrapper.dart'; import 'package:uni/view/common_widgets/page_title.dart'; import 'package:uni/view/common_widgets/pages_layouts/secondary/secondary.dart'; import 'package:uni/view/lazy_consumer.dart'; @@ -20,23 +22,38 @@ class LibraryPage extends StatefulWidget { class LibraryPageState extends SecondaryPageViewState { @override Widget getBody(BuildContext context) { - return ListView( - shrinkWrap: true, - children: [ - LibraryOccupationCard(), - PageTitle(name: S.of(context).floors), - LazyConsumer( - builder: getFloorRows, - hasContent: (occupation) => occupation.floors.isNotEmpty, - onNullContent: Center( - child: Text( - S.of(context).no_library_info, - style: const TextStyle(fontSize: 18), + return ExperimentalFeatureWrapper( + featureFlag: Provider.of(context) + .getFeatureFlag('library')!, + onEnabled: (context) { + return ListView( + shrinkWrap: true, + children: [ + ExperimentalFeatureWrapper( + featureFlag: Provider.of(context) + .getFeatureFlag('library_occupation')!, + onEnabled: (_) => LibraryOccupationCard(), ), - ), - contentLoadingWidget: const CircularProgressIndicator(), - ), - ], + PageTitle(name: S.of(context).floors), + ExperimentalFeatureWrapper( + featureFlag: Provider.of(context) + .getFeatureFlag('library_floors')!, + onEnabled: (_) => + LazyConsumer( + builder: getFloorRows, + hasContent: (occupation) => occupation.floors.isNotEmpty, + onNullContent: Center( + child: Text( + S.of(context).no_library_info, + style: const TextStyle(fontSize: 18), + ), + ), + contentLoadingWidget: const CircularProgressIndicator(), + ), + ), + ], + ); + }, ); } diff --git a/packages/uni_app/lib/view/settings/settings.dart b/packages/uni_app/lib/view/settings/settings.dart index 169d70b8e..2be53fd7a 100644 --- a/packages/uni_app/lib/view/settings/settings.dart +++ b/packages/uni_app/lib/view/settings/settings.dart @@ -3,6 +3,7 @@ import 'package:uni/controller/networking/network_router.dart'; import 'package:uni/generated/l10n.dart'; import 'package:uni/utils/navigation_items.dart'; import 'package:uni/view/common_widgets/pages_layouts/secondary/secondary.dart'; +import 'package:uni/view/settings/widgets/feature_flags/feature_flags_dialog.dart'; import 'package:uni/view/settings/widgets/locale_switch_button.dart'; import 'package:uni/view/settings/widgets/notifications_dialog.dart'; import 'package:uni/view/settings/widgets/theme_switch_button.dart'; @@ -60,6 +61,14 @@ class SettingsPageState extends SecondaryPageViewState { ); }, ), + ListTile( + title: Text(S.of(context).feature_flags), + trailing: const Icon(Icons.arrow_forward_ios), + onTap: () => showDialog( + context: context, + builder: (context) => const FeatureFlagsDialog(), + ), + ), ListTile( title: Text(S.of(context).about), trailing: const Icon(Icons.arrow_forward_ios), diff --git a/packages/uni_app/lib/view/settings/widgets/feature_flags/feature_flags_dialog.dart b/packages/uni_app/lib/view/settings/widgets/feature_flags/feature_flags_dialog.dart new file mode 100644 index 000000000..c1d0afe19 --- /dev/null +++ b/packages/uni_app/lib/view/settings/widgets/feature_flags/feature_flags_dialog.dart @@ -0,0 +1,24 @@ +import 'package:flutter/material.dart'; +import 'package:provider/provider.dart'; +import 'package:uni/controller/feature_flags/feature_flag_controller.dart'; + +import 'package:uni/generated/l10n.dart'; +import 'package:uni/view/settings/widgets/feature_flags/feature_switch_tile.dart'; + +class FeatureFlagsDialog extends StatelessWidget { + const FeatureFlagsDialog({super.key}); + + @override + Widget build(BuildContext context) { + return AlertDialog( + title: Text(S.of(context).feature_flags), + content: Column( + mainAxisSize: MainAxisSize.min, + children: Provider.of(context) + .getFeatureFlags() + .map((featureFlag) => FeatureSwitchTile(featureFlag: featureFlag)) + .toList(), + ), + ); + } +} diff --git a/packages/uni_app/lib/view/settings/widgets/feature_flags/feature_switch_tile.dart b/packages/uni_app/lib/view/settings/widgets/feature_flags/feature_switch_tile.dart new file mode 100644 index 000000000..dc84c0972 --- /dev/null +++ b/packages/uni_app/lib/view/settings/widgets/feature_flags/feature_switch_tile.dart @@ -0,0 +1,64 @@ +import 'package:flutter/material.dart'; +import 'package:uni/model/feature_flags/feature_flag.dart'; +import 'package:uni/model/feature_flags/feature_flag_group.dart'; +import 'package:uni/model/feature_flags/generic_feature_flag.dart'; + +class FeatureSwitchTile extends StatefulWidget { + const FeatureSwitchTile({ + required this.featureFlag, + super.key, + }); + + final GenericFeatureFlag featureFlag; + + @override + FeatureSwitchTileState createState() => FeatureSwitchTileState(); +} + +class FeatureSwitchTileState extends State { + void refresh() { + setState(() {}); + } + + Future _onChanged(bool value) async { + await widget.featureFlag.setEnabled(enabled: value); + refresh(); + } + + @override + Widget build(BuildContext context) { + return widget.featureFlag is FeatureFlag + ? ListTile( + title: Text(widget.featureFlag.getName(context)), + trailing: Switch.adaptive( + value: widget.featureFlag.isEnabled(), + onChanged: _onChanged, + ), + ) + : Column( + children: [ + ListTile( + title: Text( + widget.featureFlag.getName(context), + ), + trailing: Switch.adaptive( + value: widget.featureFlag.isEnabled(), + onChanged: _onChanged, + ), + ), + Padding( + padding: const EdgeInsets.only(left: 24), + child: Column( + children: (widget.featureFlag as FeatureFlagGroup) + .getFeatureFlags() + .map( + (featureFlag) => + FeatureSwitchTile(featureFlag: featureFlag), + ) + .toList(), + ), + ), + ], + ); + } +} diff --git a/packages/uni_app/lib/view/settings/widgets/generic_switch.dart b/packages/uni_app/lib/view/settings/widgets/generic_switch.dart new file mode 100644 index 000000000..f49433d7a --- /dev/null +++ b/packages/uni_app/lib/view/settings/widgets/generic_switch.dart @@ -0,0 +1,37 @@ +import 'package:flutter/material.dart'; + +abstract class GenericSwitch extends StatefulWidget { + const GenericSwitch({super.key}); + + @override + GenericSwitchState createState(); +} + +abstract class GenericSwitchState extends State { + GenericSwitchState(); + + @override + void initState() { + super.initState(); + value = initializeValue(); + } + + late bool value; + bool initializeValue(); + Future storeValue({required bool value}); + + Future changeValue({required bool value}) async { + await storeValue(value: value); + setState(() { + this.value = value; + }); + } + + @override + Widget build(BuildContext context) { + return Switch.adaptive( + value: value, + onChanged: (value) => changeValue(value: value), + ); + } +} diff --git a/packages/uni_app/pubspec.lock b/packages/uni_app/pubspec.lock index 594e9a6b4..80faa68a3 100644 --- a/packages/uni_app/pubspec.lock +++ b/packages/uni_app/pubspec.lock @@ -5,15 +5,10 @@ packages: dependency: transitive description: name: _fe_analyzer_shared - sha256: f256b0c0ba6c7577c15e2e4e114755640a875e885099367bf6e012b19314c834 + sha256: "0b2f2bd91ba804e53a61d757b986f89f1f9eaed5b11e4b2f5a2468d86d6c9fc7" url: "https://pub.dev" source: hosted - version: "72.0.0" - _macros: - dependency: transitive - description: dart - source: sdk - version: "0.3.2" + version: "67.0.0" add_2_calendar: dependency: "direct main" description: @@ -26,10 +21,10 @@ packages: dependency: transitive description: name: analyzer - sha256: b652861553cd3990d8ed361f7979dc6d7053a9ac8843fa73820ab68ce5410139 + sha256: "37577842a27e4338429a1cbc32679d508836510b056f1eedf0c8d20e39c1383d" url: "https://pub.dev" source: hosted - version: "6.7.0" + version: "6.4.1" analyzer_plugin: dependency: transitive description: @@ -146,18 +141,18 @@ packages: dependency: "direct dev" description: name: build_runner - sha256: "028819cfb90051c6b5440c7e574d1896f8037e3c96cf17aaeb054c9311cfbf4d" + sha256: "644dc98a0f179b872f612d3eb627924b578897c629788e858157fa5e704ca0c7" url: "https://pub.dev" source: hosted - version: "2.4.13" + version: "2.4.11" build_runner_core: dependency: transitive description: name: build_runner_core - sha256: f8126682b87a7282a339b871298cc12009cb67109cfa1614d6436fb0289193e0 + sha256: e3c79f69a64bdfcd8a776a3c28db4eb6e3fb5356d013ae5eb2e52007706d5dbe url: "https://pub.dev" source: hosted - version: "7.3.2" + version: "7.3.1" built_collection: dependency: transitive description: @@ -330,34 +325,34 @@ packages: dependency: "direct dev" description: name: custom_lint - sha256: "832fcdc676171205201c9cffafd6b5add19393962f6598af8472b48b413026e6" + sha256: "7c0aec12df22f9082146c354692056677f1e70bc43471644d1fdb36c6fdda799" url: "https://pub.dev" source: hosted - version: "0.6.8" + version: "0.6.4" custom_lint_builder: dependency: transitive description: name: custom_lint_builder - sha256: c3d82779026f91b8e00c9ac18934595cbc9b490094ea682052beeafdb2bd50ac + sha256: d7dc41e709dde223806660268678be7993559e523eb3164e2a1425fd6f7615a9 url: "https://pub.dev" source: hosted - version: "0.6.8" + version: "0.6.4" custom_lint_core: dependency: transitive description: name: custom_lint_core - sha256: "4ddbbdaa774265de44c97054dcec058a83d9081d071785ece601e348c18c267d" + sha256: a85e8f78f4c52f6c63cdaf8c872eb573db0231dcdf3c3a5906d493c1f8bc20e6 url: "https://pub.dev" source: hosted - version: "0.6.5" + version: "0.6.3" dart_style: dependency: transitive description: name: dart_style - sha256: "7856d364b589d1f08986e140938578ed36ed948581fbc3bc9aef1805039ac5ab" + sha256: "99e066ce75c89d6b29903d788a7bb9369cf754f7b24bf70bf4b6d6d6b26853b9" url: "https://pub.dev" source: hosted - version: "2.3.7" + version: "2.3.6" dbus: dependency: transitive description: @@ -366,22 +361,6 @@ packages: url: "https://pub.dev" source: hosted version: "0.7.10" - device_info_plus: - dependency: transitive - description: - name: device_info_plus - sha256: a7fd703482b391a87d60b6061d04dfdeab07826b96f9abd8f5ed98068acc0074 - url: "https://pub.dev" - source: hosted - version: "10.1.2" - device_info_plus_platform_interface: - dependency: transitive - description: - name: device_info_plus_platform_interface - sha256: "282d3cf731045a2feb66abfe61bbc40870ae50a3ed10a4d3d217556c35c8c2ba" - url: "https://pub.dev" - source: hosted - version: "7.0.1" diacritic: dependency: "direct main" description: @@ -442,10 +421,10 @@ packages: dependency: transitive description: name: file - sha256: a3b4f84adafef897088c160faf7dfffb7696046cb13ae90b508c2cbc95d3b8d4 + sha256: "5fc22d7c25582e38ad9a8515372cd9a93834027aacf1801cf01164dac0ffa08c" url: "https://pub.dev" source: hosted - version: "7.0.1" + version: "7.0.0" fixnum: dependency: transitive description: @@ -487,10 +466,10 @@ packages: dependency: "direct main" description: name: flutter_local_notifications - sha256: "49eeef364fddb71515bc78d5a8c51435a68bccd6e4d68e25a942c5e47761ae71" + sha256: "401643a6ea9d8451365f2ec11145335bf130560cfde367bdf8f0be6d60f89479" url: "https://pub.dev" source: hosted - version: "17.2.3" + version: "15.1.3" flutter_local_notifications_linux: dependency: transitive description: @@ -782,10 +761,10 @@ packages: dependency: "direct dev" description: name: leancode_lint - sha256: "6e6500dac54ea3d0ad01f6e851a09b815f3d75f7e87bb9ab589d1fd19dd826f1" + sha256: "85b7c09c806400083faa37304c701fd1bd5dbcb826882438dd50f0e465f30fd8" url: "https://pub.dev" source: hosted - version: "14.1.0" + version: "13.0.0" lists: dependency: transitive description: @@ -810,14 +789,6 @@ packages: url: "https://pub.dev" source: hosted version: "1.2.0" - macros: - dependency: transitive - description: - name: macros - sha256: "0acaed5d6b7eab89f63350bccd82119e6c602df0f391260d0e32b5e23db79536" - url: "https://pub.dev" - source: hosted - version: "0.1.2-main.4" markdown: dependency: transitive description: @@ -870,10 +841,10 @@ packages: dependency: transitive description: name: mime - sha256: "41a20518f0cb1256669420fdba0cd90d21561e560ac240f26ef8322e45bb7ed6" + sha256: "801fd0b26f14a4a58ccb09d5892c3fbdeff209594300a542492cf13fba9d247a" url: "https://pub.dev" source: hosted - version: "2.0.0" + version: "1.0.6" mockito: dependency: "direct dev" description: @@ -931,14 +902,6 @@ packages: url: "https://pub.dev" source: hosted version: "0.4.8" - os_detect: - dependency: transitive - description: - name: os_detect - sha256: faf3bcf39515e64da8ff76b2f2805b20a6ff47ae515393e535f8579ff91d6b7f - url: "https://pub.dev" - source: hosted - version: "2.0.1" package_config: dependency: transitive description: @@ -951,10 +914,10 @@ packages: dependency: transitive description: name: package_info_plus - sha256: "894f37107424311bdae3e476552229476777b8752c5a2a2369c0cb9a2d5442ef" + sha256: a75164ade98cb7d24cfd0a13c6408927c6b217fa60dee5a7ff5c116a58f28918 url: "https://pub.dev" source: hosted - version: "8.0.3" + version: "8.0.2" package_info_plus_platform_interface: dependency: transitive description: @@ -991,10 +954,10 @@ packages: dependency: transitive description: name: path_provider_android - sha256: c464428172cb986b758c6d1724c603097febb8fb855aa265aeecc9280c294d4a + sha256: "6f01f8e37ec30b07bc424b4deabac37cacb1bc7e2e515ad74486039918a37eb7" url: "https://pub.dev" source: hosted - version: "2.2.12" + version: "2.2.10" path_provider_foundation: dependency: transitive description: @@ -1143,7 +1106,7 @@ packages: dependency: transitive description: name: rxdart - sha256: "5c3004a4a8dbb94bd4bf5412a4def4acdaa12e12f269737a5751369e12d1a962" + sha256: "0c7c0cedd93788d996e33041ffecda924cc54389199cde4e6a34b440f50044cb" url: "https://pub.dev" source: hosted version: "0.28.0" @@ -1159,18 +1122,18 @@ packages: dependency: transitive description: name: sentry - sha256: "033287044a6644a93498969449d57c37907e56f5cedb17b88a3ff20a882261dd" + sha256: "57514bc72d441ffdc463f498d6886aa586a2494fa467a1eb9d649c28010d7ee3" url: "https://pub.dev" source: hosted - version: "8.9.0" + version: "7.20.2" sentry_flutter: dependency: "direct main" description: name: sentry_flutter - sha256: "3780b5a0bb6afd476857cfbc6c7444d969c29a4d9bd1aa5b6960aa76c65b737a" + sha256: "9723d58470ca43a360681ddd26abb71ca7b815f706bc8d3747afd054cf639ded" url: "https://pub.dev" source: hosted - version: "8.9.0" + version: "7.20.2" shared_preferences: dependency: "direct main" description: @@ -1183,18 +1146,18 @@ packages: dependency: transitive description: name: shared_preferences_android - sha256: "3b9febd815c9ca29c9e3520d50ec32f49157711e143b7a4ca039eb87e8ade5ab" + sha256: "480ba4345773f56acda9abf5f50bd966f581dac5d514e5fc4a18c62976bbba7e" url: "https://pub.dev" source: hosted - version: "2.3.3" + version: "2.3.2" shared_preferences_foundation: dependency: transitive description: name: shared_preferences_foundation - sha256: "07e050c7cd39bad516f8d64c455f04508d09df104be326d8c02551590a0d513d" + sha256: c4b35f6cb8f63c147312c054ce7c2254c8066745125264f0c88739c417fc9d9f url: "https://pub.dev" source: hosted - version: "2.5.3" + version: "2.5.2" shared_preferences_linux: dependency: transitive description: @@ -1255,10 +1218,10 @@ packages: dependency: transitive description: name: shelf_web_socket - sha256: "073c147238594ecd0d193f3456a5fe91c4b0abbcc68bf5cd95b36c4e194ac611" + sha256: "9ca081be41c60190ebcb4766b2486a7d50261db7bd0f5d9615f2d653637a84c1" url: "https://pub.dev" source: hosted - version: "2.0.0" + version: "1.0.4" shimmer: dependency: "direct main" description: @@ -1324,50 +1287,26 @@ packages: dependency: "direct main" description: name: sqflite - sha256: "79a297dc3cc137e758c6a4baf83342b039e5a6d2436fcdf3f96a00adaaf2ad62" - url: "https://pub.dev" - source: hosted - version: "2.4.0" - sqflite_android: - dependency: transitive - description: - name: sqflite_android - sha256: "78f489aab276260cdd26676d2169446c7ecd3484bbd5fead4ca14f3ed4dd9ee3" + sha256: a43e5a27235518c03ca238e7b4732cf35eabe863a369ceba6cbefa537a66f16d url: "https://pub.dev" source: hosted - version: "2.4.0" + version: "2.3.3+1" sqflite_common: dependency: transitive description: name: sqflite_common - sha256: "4468b24876d673418a7b7147e5a08a715b4998a7ae69227acafaab762e0e5490" + sha256: "3da423ce7baf868be70e2c0976c28a1bb2f73644268b7ffa7d2e08eab71f16a4" url: "https://pub.dev" source: hosted - version: "2.5.4+5" + version: "2.5.4" sqflite_common_ffi: dependency: "direct dev" description: name: sqflite_common_ffi - sha256: a6057d4c87e9260ba1ec436ebac24760a110589b9c0a859e128842eb69a7ef04 - url: "https://pub.dev" - source: hosted - version: "2.3.3+1" - sqflite_darwin: - dependency: transitive - description: - name: sqflite_darwin - sha256: "769733dddf94622d5541c73e4ddc6aa7b252d865285914b6fcd54a63c4b4f027" - url: "https://pub.dev" - source: hosted - version: "2.4.1-1" - sqflite_platform_interface: - dependency: transitive - description: - name: sqflite_platform_interface - sha256: "8dd4515c7bdcae0a785b0062859336de775e8c65db81ae33dd5445f35be61920" + sha256: "4d6137c29e930d6e4a8ff373989dd9de7bac12e3bc87bce950f6e844e8ad3bb5" url: "https://pub.dev" source: hosted - version: "2.4.0" + version: "2.3.3" sqlite3: dependency: transitive description: @@ -1412,10 +1351,10 @@ packages: dependency: "direct main" description: name: synchronized - sha256: "69fe30f3a8b04a0be0c15ae6490fc859a78ef4c43ae2dd5e8a623d45bfcf9225" + sha256: "539ef412b170d65ecdafd780f924e5be3f60032a1128df156adad6c5b373d558" url: "https://pub.dev" source: hosted - version: "3.3.0+3" + version: "3.1.0+1" term_glyph: dependency: transitive description: @@ -1539,18 +1478,18 @@ packages: dependency: "direct main" description: name: url_launcher - sha256: "9d06212b1362abc2f0f0d78e6f09f726608c74e3b9462e8368bb03314aa8d603" + sha256: "21b704ce5fa560ea9f3b525b43601c678728ba46725bab9b01187b4831377ed3" url: "https://pub.dev" source: hosted - version: "6.3.1" + version: "6.3.0" url_launcher_android: dependency: transitive description: name: url_launcher_android - sha256: "8fc3bae0b68c02c47c5c86fa8bfa74471d42687b0eded01b78de87872db745e2" + sha256: f0c73347dfcfa5b3db8bc06e1502668265d39c08f310c29bff4e28eea9699f79 url: "https://pub.dev" source: hosted - version: "6.3.12" + version: "6.3.9" url_launcher_ios: dependency: transitive description: @@ -1639,14 +1578,6 @@ packages: url: "https://pub.dev" source: hosted version: "2.1.4" - version: - dependency: transitive - description: - name: version - sha256: "3d4140128e6ea10d83da32fef2fa4003fccbf6852217bb854845802f04191f94" - url: "https://pub.dev" - source: hosted - version: "3.0.2" very_good_analysis: dependency: "direct dev" description: @@ -1679,22 +1610,14 @@ packages: url: "https://pub.dev" source: hosted version: "1.1.0" - web_socket: - dependency: transitive - description: - name: web_socket - sha256: "3c12d96c0c9a4eec095246debcea7b86c0324f22df69893d538fcc6f1b8cce83" - url: "https://pub.dev" - source: hosted - version: "0.1.6" web_socket_channel: dependency: transitive description: name: web_socket_channel - sha256: "9f187088ed104edd8662ca07af4b124465893caf063ba29758f97af57e61da8f" + sha256: d88238e5eac9a42bb43ca4e721edba3c08c6354d4a53063afaa568516217621b url: "https://pub.dev" source: hosted - version: "3.0.1" + version: "2.4.0" webkit_inspection_protocol: dependency: transitive description: @@ -1707,18 +1630,10 @@ packages: dependency: transitive description: name: win32 - sha256: "4d45dc9069dba4619dc0ebd93c7cec5e66d8482cb625a370ac806dcc8165f2ec" - url: "https://pub.dev" - source: hosted - version: "5.5.5" - win32_registry: - dependency: transitive - description: - name: win32_registry - sha256: "21ec76dfc731550fd3e2ce7a33a9ea90b828fdf19a5c3bcf556fa992cfa99852" + sha256: "68d1e89a91ed61ad9c370f9f8b6effed9ae5e0ede22a270bdfa6daf79fc2290a" url: "https://pub.dev" source: hosted - version: "1.1.5" + version: "5.5.4" wkt_parser: dependency: transitive description: @@ -1747,10 +1662,10 @@ packages: dependency: transitive description: name: xdg_directories - sha256: "7a3f37b05d989967cdddcbb571f1ea834867ae2faa29725fd085180e0883aa15" + sha256: faea9dee56b520b55a566385b84f2e8de55e7496104adada9962e0bd11bcff1d url: "https://pub.dev" source: hosted - version: "1.1.0" + version: "1.0.4" xml: dependency: transitive description: @@ -1768,5 +1683,5 @@ packages: source: hosted version: "3.1.2" sdks: - dart: ">=3.5.0 <4.0.0" - flutter: ">=3.24.3" + dart: ">=3.4.0 <4.0.0" + flutter: ">=3.22.0" diff --git a/packages/uni_app/windows/flutter/generated_plugins.cmake b/packages/uni_app/windows/flutter/generated_plugins.cmake index 5261a5887..a9445985d 100644 --- a/packages/uni_app/windows/flutter/generated_plugins.cmake +++ b/packages/uni_app/windows/flutter/generated_plugins.cmake @@ -7,11 +7,11 @@ list(APPEND FLUTTER_PLUGIN_LIST battery_plus connectivity_plus flutter_secure_storage_windows + sentry_flutter url_launcher_windows ) list(APPEND FLUTTER_FFI_PLUGIN_LIST - sentry_flutter ) set(PLUGIN_BUNDLED_LIBRARIES)