diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000..dcdf186 --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,5 @@ +{ + "cSpell.words": [ + "annvisery" + ] +} \ No newline at end of file diff --git a/assets/locales/en_us.json b/assets/locales/en_us.json index 7714c16..49894c1 100644 --- a/assets/locales/en_us.json +++ b/assets/locales/en_us.json @@ -366,6 +366,7 @@ "bsPreparingData": "Preparing User Data", "bsRegisteringPushNotify": "Enabling Push Notifications", "bsDismissibleErrorHint": "Click anywhere to ignore this error", + "bsContinuable": "Click anywhere to continue", "postShareContent": "@content\n\n@username on the Solar Network\nCheck it out: @link", "postShareSubject": "@title by @username on Solar Network", "themeColor": "Global Theme Color", @@ -490,5 +491,7 @@ "shotOn": "Shot on @device", "unread": "Unread", "searchTook": "Took @time", - "searchResult": "@count Matches" + "searchResult": "@count Matches", + "happyBirthday": "Happy birthday @name!", + "happyBirthdayDesc": "Today is your @count birthday" } diff --git a/assets/locales/zh_cn.json b/assets/locales/zh_cn.json index 623ca40..407d461 100644 --- a/assets/locales/zh_cn.json +++ b/assets/locales/zh_cn.json @@ -362,6 +362,7 @@ "bsPreparingData": "正在准备用户资料", "bsRegisteringPushNotify": "正在启用推送通知", "bsDismissibleErrorHint": "点击任意地方忽略此错误", + "bsContinuable": "点击任意处继续", "postShareContent": "@content\n\n@username 在 Solar Network\n原帖地址:@link", "postShareSubject": "@username 在 Solar Network 发表的 @title", "themeColor": "全局主题色", @@ -486,5 +487,7 @@ "shotOn": "由 @device 拍摄", "unread": "未读", "searchTook": "耗时 @time", - "searchResult": "匹配到 @count 条结果" + "searchResult": "匹配到 @count 条结果", + "happyBirthday": "生日快乐,@name!", + "happyBirthdayDesc": "今天是你的第 @count 个生日" } diff --git a/ios/Podfile.lock b/ios/Podfile.lock index aa157a1..bce64b1 100644 --- a/ios/Podfile.lock +++ b/ios/Podfile.lock @@ -462,8 +462,8 @@ EXTERNAL SOURCES: :path: ".symlinks/plugins/wakelock_plus/ios" SPEC CHECKSUMS: - connectivity_plus: ddd7f30999e1faaef5967c23d5b6d503d10434db - device_info_plus: 97af1d7e84681a90d0693e63169a5d50e0839a0d + connectivity_plus: 4c41c08fc6d7c91f63bc7aec70ffe3730b04f563 + device_info_plus: bf2e3232933866d73fe290f2942f2156cdd10342 DKImagePickerController: 946cec48c7873164274ecc4624d19e3da4c1ef3c DKPhotoGallery: b3834fecb755ee09a593d7c9e389d8b5d6deed60 file_picker: 09aa5ec1ab24135ccd7a1621c46c84134bfd6655 @@ -508,7 +508,7 @@ SPEC CHECKSUMS: media_kit_native_event_loop: e6b2ab20cf0746eb1c33be961fcf79667304fa2a media_kit_video: 5da63f157170e5bf303bf85453b7ef6971218a2e nanopb: fad817b59e0457d11a5dfbde799381cd727c1275 - package_info_plus: 58f0028419748fad15bf008b270aaa8e54380b1c + package_info_plus: c0502532a26c7662a62a356cebe2692ec5fe4ec4 pasteboard: 982969ebaa7c78af3e6cc7761e8f5e77565d9ce0 path_provider_foundation: 2b6b4c569c0fb62ec74538f866245ac84301af46 permission_handler_apple: 9878588469a2b0d0fc1e048d9f43605f92e6cec2 @@ -519,7 +519,7 @@ SPEC CHECKSUMS: SAMKeychain: 483e1c9f32984d50ca961e26818a534283b4cd5c screen_brightness_ios: 715ca807df953bf676d339f11464e438143ee625 SDWebImage: 8a6b7b160b4d710e2a22b6900e25301075c34cb3 - share_plus: 8875f4f2500512ea181eef553c3e27dba5135aad + share_plus: 8b6f8b3447e494cca5317c8c3073de39b3600d1f shared_preferences_foundation: fcdcbc04712aee1108ac7fda236f363274528f78 sqflite_darwin: a553b1fd6fe66f53bbb0fe5b4f5bab93f08d7a13 sqlite3: 0bb0e6389d824e40296f531b858a2a0b71c0d2fb diff --git a/lib/bootstrapper.dart b/lib/bootstrapper.dart index ace7c22..bd3ede8 100644 --- a/lib/bootstrapper.dart +++ b/lib/bootstrapper.dart @@ -1,6 +1,7 @@ import 'dart:async'; import 'dart:developer'; +import 'package:confetti/confetti.dart'; import 'package:flutter/material.dart'; import 'package:gap/gap.dart'; import 'package:get/get.dart'; @@ -10,6 +11,7 @@ import 'package:provider/provider.dart'; import 'package:shared_preferences/shared_preferences.dart'; import 'package:solian/exceptions/request.dart'; import 'package:solian/exts.dart'; +import 'package:solian/models/account.dart'; import 'package:solian/platform.dart'; import 'package:solian/providers/auth.dart'; import 'package:solian/providers/content/realm.dart'; @@ -23,6 +25,11 @@ import 'package:solian/widgets/sized_container.dart'; import 'package:flutter_app_update/flutter_app_update.dart'; import 'package:version/version.dart'; +enum BootstrapperSpecialState { + userBirthday, + appAnniversary, +} + class BootstrapperShell extends StatefulWidget { final Widget child; @@ -43,6 +50,9 @@ class _BootstrapperShellState extends State { int _periodCursor = 0; + // Special state is some special event triggered after bootstrapping + BootstrapperSpecialState? _specialState; + final Completer _bootCompleter = Completer(); void _requestRating() async { @@ -206,6 +216,19 @@ class _BootstrapperShellState extends State { if (auth.isAuthorized.isTrue) Get.find().refreshAvailableRealms(), ]); + + if (auth.isAuthorized.isTrue && auth.userProfile.value != null) { + final account = Account.fromJson(auth.userProfile.value!); + if (account.profile?.birthday != null) { + final birthDate = account.profile!.birthday!.toLocal(); + final isBirthday = birthDate.day == DateTime.now().day; + if (isBirthday) { + setState( + () => _specialState = BootstrapperSpecialState.userBirthday, + ); + } + } + } } catch (e) { context.showErrorDialog(e); } @@ -355,8 +378,142 @@ class _BootstrapperShellState extends State { } }, ); + } else if (_specialState != null) { + return GestureDetector( + child: RootContainer( + child: switch (_specialState) { + BootstrapperSpecialState.appAnniversary => const Placeholder(), + _ => _BirthdaySpecialScreen(), + }, + ), + onTap: () { + setState(() => _specialState = null); + }, + ); } return widget.child; } } + +class _BirthdaySpecialScreen extends StatefulWidget { + const _BirthdaySpecialScreen(); + + @override + State<_BirthdaySpecialScreen> createState() => _BirthdaySpecialScreenState(); +} + +class _BirthdaySpecialScreenState extends State<_BirthdaySpecialScreen> { + late final ConfettiController _confettiController = + ConfettiController(duration: const Duration(seconds: 10)); + + @override + void initState() { + _confettiController.play(); + super.initState(); + } + + @override + void dispose() { + _confettiController.dispose(); + super.dispose(); + } + + Color get _unFocusColor => + Theme.of(context).colorScheme.onSurface.withOpacity(0.75); + + String _toOrdinal(int num) { + if (num >= 11 && num <= 13) { + return '${num}th'; + } + + switch (num % 10) { + case 1: + return '${num}st'; + case 2: + return '${num}nd'; + case 3: + return '${num}rd'; + default: + return '${num}th'; + } + } + + @override + Widget build(BuildContext context) { + final AuthProvider auth = Get.find(); + final account = Account.fromJson(auth.userProfile.value!); + + final birthDate = account.profile!.birthday!.toLocal(); + final birthdayCount = DateTime.now().difference(birthDate).inDays ~/ 365; + + return Stack( + children: [ + Align( + alignment: Alignment.center, + child: ConfettiWidget( + confettiController: _confettiController, + blastDirectionality: BlastDirectionality.explosive, + shouldLoop: true, + colors: const [ + Colors.green, + Colors.blue, + Colors.pink, + Colors.orange, + Colors.purple + ], + maxBlastForce: 30, + minBlastForce: 15, + emissionFrequency: 0.05, + numberOfParticles: 20, + gravity: 0.2, + ), + ), + Align( + child: CenteredContainer( + maxWidth: 320, + child: Column( + crossAxisAlignment: CrossAxisAlignment.center, + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Text( + '🎂', + style: TextStyle(fontSize: 60), + ), + const Gap(8), + Text( + 'happyBirthday'.trParams({ + 'name': account.profile?.firstName != null + ? [ + account.profile?.firstName, + account.profile?.lastName + ].join(' ') + : '@${account.name}', + }), + textAlign: TextAlign.center, + style: Theme.of(context).textTheme.titleLarge, + ), + Text( + 'happyBirthdayDesc'.trParams({ + 'count': _toOrdinal(birthdayCount), + }), + textAlign: TextAlign.center, + style: Theme.of(context).textTheme.bodyMedium, + ), + const Gap(8), + Text( + 'bsContinuable'.tr, + textAlign: TextAlign.center, + style: TextStyle( + fontSize: 13, + color: _unFocusColor, + ), + ).paddingOnly(bottom: 5), + ], + ), + ), + ), + ], + ); + } +} diff --git a/lib/providers/database/database.g.dart b/lib/providers/database/database.g.dart index 9b4c0db..0b5d6f3 100644 --- a/lib/providers/database/database.g.dart +++ b/lib/providers/database/database.g.dart @@ -299,53 +299,71 @@ typedef $$LocalMessageEventTableTableUpdateCompanionBuilder }); class $$LocalMessageEventTableTableFilterComposer - extends FilterComposer<_$AppDatabase, $LocalMessageEventTableTable> { - $$LocalMessageEventTableTableFilterComposer(super.$state); - ColumnFilters get id => $state.composableBuilder( - column: $state.table.id, - builder: (column, joinBuilders) => - ColumnFilters(column, joinBuilders: joinBuilders)); + extends Composer<_$AppDatabase, $LocalMessageEventTableTable> { + $$LocalMessageEventTableTableFilterComposer({ + required super.$db, + required super.$table, + super.joinBuilder, + super.$addJoinBuilderToRootComposer, + super.$removeJoinBuilderFromRootComposer, + }); + ColumnFilters get id => $composableBuilder( + column: $table.id, builder: (column) => ColumnFilters(column)); - ColumnFilters get channelId => $state.composableBuilder( - column: $state.table.channelId, - builder: (column, joinBuilders) => - ColumnFilters(column, joinBuilders: joinBuilders)); + ColumnFilters get channelId => $composableBuilder( + column: $table.channelId, builder: (column) => ColumnFilters(column)); ColumnWithTypeConverterFilters get data => - $state.composableBuilder( - column: $state.table.data, - builder: (column, joinBuilders) => ColumnWithTypeConverterFilters( - column, - joinBuilders: joinBuilders)); + $composableBuilder( + column: $table.data, + builder: (column) => ColumnWithTypeConverterFilters(column)); - ColumnFilters get createdAt => $state.composableBuilder( - column: $state.table.createdAt, - builder: (column, joinBuilders) => - ColumnFilters(column, joinBuilders: joinBuilders)); + ColumnFilters get createdAt => $composableBuilder( + column: $table.createdAt, builder: (column) => ColumnFilters(column)); } class $$LocalMessageEventTableTableOrderingComposer - extends OrderingComposer<_$AppDatabase, $LocalMessageEventTableTable> { - $$LocalMessageEventTableTableOrderingComposer(super.$state); - ColumnOrderings get id => $state.composableBuilder( - column: $state.table.id, - builder: (column, joinBuilders) => - ColumnOrderings(column, joinBuilders: joinBuilders)); + extends Composer<_$AppDatabase, $LocalMessageEventTableTable> { + $$LocalMessageEventTableTableOrderingComposer({ + required super.$db, + required super.$table, + super.joinBuilder, + super.$addJoinBuilderToRootComposer, + super.$removeJoinBuilderFromRootComposer, + }); + ColumnOrderings get id => $composableBuilder( + column: $table.id, builder: (column) => ColumnOrderings(column)); - ColumnOrderings get channelId => $state.composableBuilder( - column: $state.table.channelId, - builder: (column, joinBuilders) => - ColumnOrderings(column, joinBuilders: joinBuilders)); + ColumnOrderings get channelId => $composableBuilder( + column: $table.channelId, builder: (column) => ColumnOrderings(column)); - ColumnOrderings get data => $state.composableBuilder( - column: $state.table.data, - builder: (column, joinBuilders) => - ColumnOrderings(column, joinBuilders: joinBuilders)); + ColumnOrderings get data => $composableBuilder( + column: $table.data, builder: (column) => ColumnOrderings(column)); - ColumnOrderings get createdAt => $state.composableBuilder( - column: $state.table.createdAt, - builder: (column, joinBuilders) => - ColumnOrderings(column, joinBuilders: joinBuilders)); + ColumnOrderings get createdAt => $composableBuilder( + column: $table.createdAt, builder: (column) => ColumnOrderings(column)); +} + +class $$LocalMessageEventTableTableAnnotationComposer + extends Composer<_$AppDatabase, $LocalMessageEventTableTable> { + $$LocalMessageEventTableTableAnnotationComposer({ + required super.$db, + required super.$table, + super.joinBuilder, + super.$addJoinBuilderToRootComposer, + super.$removeJoinBuilderFromRootComposer, + }); + GeneratedColumn get id => + $composableBuilder(column: $table.id, builder: (column) => column); + + GeneratedColumn get channelId => + $composableBuilder(column: $table.channelId, builder: (column) => column); + + GeneratedColumnWithTypeConverter get data => + $composableBuilder(column: $table.data, builder: (column) => column); + + GeneratedColumn get createdAt => + $composableBuilder(column: $table.createdAt, builder: (column) => column); } class $$LocalMessageEventTableTableTableManager extends RootTableManager< @@ -354,6 +372,7 @@ class $$LocalMessageEventTableTableTableManager extends RootTableManager< LocalMessageEventTableData, $$LocalMessageEventTableTableFilterComposer, $$LocalMessageEventTableTableOrderingComposer, + $$LocalMessageEventTableTableAnnotationComposer, $$LocalMessageEventTableTableCreateCompanionBuilder, $$LocalMessageEventTableTableUpdateCompanionBuilder, ( @@ -368,10 +387,15 @@ class $$LocalMessageEventTableTableTableManager extends RootTableManager< : super(TableManagerState( db: db, table: table, - filteringComposer: $$LocalMessageEventTableTableFilterComposer( - ComposerState(db, table)), - orderingComposer: $$LocalMessageEventTableTableOrderingComposer( - ComposerState(db, table)), + createFilteringComposer: () => + $$LocalMessageEventTableTableFilterComposer( + $db: db, $table: table), + createOrderingComposer: () => + $$LocalMessageEventTableTableOrderingComposer( + $db: db, $table: table), + createComputedFieldComposer: () => + $$LocalMessageEventTableTableAnnotationComposer( + $db: db, $table: table), updateCompanionCallback: ({ Value id = const Value.absent(), Value channelId = const Value.absent(), @@ -410,6 +434,7 @@ typedef $$LocalMessageEventTableTableProcessedTableManager LocalMessageEventTableData, $$LocalMessageEventTableTableFilterComposer, $$LocalMessageEventTableTableOrderingComposer, + $$LocalMessageEventTableTableAnnotationComposer, $$LocalMessageEventTableTableCreateCompanionBuilder, $$LocalMessageEventTableTableUpdateCompanionBuilder, ( diff --git a/macos/Podfile.lock b/macos/Podfile.lock index 07b68bf..e945f6b 100644 --- a/macos/Podfile.lock +++ b/macos/Podfile.lock @@ -351,9 +351,9 @@ EXTERNAL SOURCES: :path: Flutter/ephemeral/.symlinks/plugins/wakelock_plus/macos SPEC CHECKSUMS: - connectivity_plus: ddd7f30999e1faaef5967c23d5b6d503d10434db + connectivity_plus: 4c41c08fc6d7c91f63bc7aec70ffe3730b04f563 desktop_drop: 69eeff437544aa619c8db7f4481b3a65f7696898 - device_info_plus: f1aae8670672f75c4c8850ecbe0b2ddef62b0a22 + device_info_plus: 74e614483d05c89290d30a4c8feae15d555f7427 file_saver: 44e6fbf666677faf097302460e214e977fdd977b file_selector_macos: cc3858c981fe6889f364731200d6232dac1d812d Firebase: 98e6bf5278170668a7983e12971a66b2cd57fc8c @@ -386,7 +386,7 @@ SPEC CHECKSUMS: media_kit_native_event_loop: 81fd5b45192b72f8b5b69eaf5b540f45777eb8d5 media_kit_video: c75b07f14d59706c775778e4dd47dd027de8d1e5 nanopb: fad817b59e0457d11a5dfbde799381cd727c1275 - package_info_plus: d2f71247aab4b6521434f887276093acc70d214c + package_info_plus: f5790acc797bf17c3e959e9d6cf162cc68ff7523 pasteboard: 9b69dba6fedbb04866be632205d532fe2f6b1d99 path_provider_foundation: 2b6b4c569c0fb62ec74538f866245ac84301af46 PromisesObjC: f5707f49cb48b9636751c5b2e7d227e43fba9f47 @@ -394,7 +394,7 @@ SPEC CHECKSUMS: protocol_handler_macos: d10a6c01d6373389ffd2278013ab4c47ed6d6daa SAMKeychain: 483e1c9f32984d50ca961e26818a534283b4cd5c screen_brightness_macos: 2d6d3af2165592d9a55ffcd95b7550970e41ebda - share_plus: a182a58e04e51647c0481aadabbc4de44b3a2bce + share_plus: fd717ef89a2801d3491e737630112b80c310640e shared_preferences_foundation: fcdcbc04712aee1108ac7fda236f363274528f78 sqflite_darwin: a553b1fd6fe66f53bbb0fe5b4f5bab93f08d7a13 sqlite3: 0bb0e6389d824e40296f531b858a2a0b71c0d2fb diff --git a/pubspec.lock b/pubspec.lock index 5286f65..7709d69 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -254,14 +254,22 @@ packages: url: "https://pub.dev" source: hosted version: "1.18.0" + confetti: + dependency: "direct main" + description: + name: confetti + sha256: "79376a99648efbc3f23582f5784ced0fe239922bd1a0fb41f582051eba750751" + url: "https://pub.dev" + source: hosted + version: "0.8.0" connectivity_plus: dependency: transitive description: name: connectivity_plus - sha256: "2056db5241f96cdc0126bd94459fc4cdc13876753768fc7a31c425e50a7177d0" + sha256: "876849631b0c7dc20f8b471a2a03142841b482438e3b707955464f5ffca3e4c3" url: "https://pub.dev" source: hosted - version: "6.0.5" + version: "6.1.0" connectivity_plus_platform_interface: dependency: transitive description: @@ -274,10 +282,10 @@ packages: dependency: transitive description: name: convert - sha256: "0f08b14755d163f6e2134cb58222dd25ea2a2ee8a195e53983d57c075324d592" + sha256: b30acd5944035672bc15c6b7a8b47d773e41e2f17de064350988c5d02adb1c68 url: "https://pub.dev" source: hosted - version: "3.1.1" + version: "3.1.2" cross_file: dependency: "direct main" description: @@ -290,10 +298,10 @@ packages: dependency: "direct main" description: name: crypto - sha256: ec30d999af904f33454ba22ed9a86162b35e52b44ac4807d1d93c288041d7d27 + sha256: "1e445881f28f22d6140f181e07737b22f1e099a5e1ff94b0af2f9e4a463f4855" url: "https://pub.dev" source: hosted - version: "3.0.5" + version: "3.0.6" csslib: dependency: transitive description: @@ -338,10 +346,10 @@ packages: dependency: "direct main" description: name: device_info_plus - sha256: db03b2d2a3fa466a4627709e1db58692c3f7f658e36a5942d342d86efedc4091 + sha256: c4af09051b4f0508f6c1dc0a5c085bf014d5c9a4a0678ce1799c2b4d716387a0 url: "https://pub.dev" source: hosted - version: "11.0.0" + version: "11.1.0" device_info_plus_platform_interface: dependency: transitive description: @@ -378,26 +386,26 @@ packages: dependency: "direct main" description: name: drift - sha256: d6ff1ec6a0f3fa097dda6b776cf601f1f3d88b53b287288e09c1306f394fb1b3 + sha256: df027d168a2985a2e9da900adeba2ab0136f0d84436592cf3cd5135f82c8579c url: "https://pub.dev" source: hosted - version: "2.20.3" + version: "2.21.0" drift_dev: dependency: "direct dev" description: name: drift_dev - sha256: "3ee987578ca2281b5ff91eadd757cd6dd36001458d6e33784f990d67ff38f756" + sha256: "27bab15e7869b69259663590381180117873b9b273a1ea9ebb21bb73133d1233" url: "https://pub.dev" source: hosted - version: "2.20.3" + version: "2.21.0" drift_flutter: dependency: "direct main" description: name: drift_flutter - sha256: c670c947fe17ad149678a43fdbbfdb69321f0c83d315043e34e8ad2729e11f49 + sha256: fec503e9d408f36bb345f9f6d24bc9d62b7b5f970db49760253d9e8d3acd48d5 url: "https://pub.dev" source: hosted - version: "0.2.0" + version: "0.2.1" dropdown_button2: dependency: "direct main" description: @@ -618,10 +626,10 @@ packages: dependency: transitive description: name: fixnum - sha256: "25517a4deb0c03aa0f32fd12db525856438902d9c16536311e76cdc57b31d7d1" + sha256: b6dc7065e46c974bc7c5f143080a6764ec7a4be6da1285ececdc37be96de53be url: "https://pub.dev" source: hosted - version: "1.1.0" + version: "1.1.1" fl_chart: dependency: "direct main" description: @@ -1049,10 +1057,10 @@ packages: dependency: transitive description: name: image - sha256: "2237616a36c0d69aef7549ab439b833fb7f9fb9fc861af2cc9ac3eedddd69ca8" + sha256: f31d52537dc417fdcde36088fdf11d191026fd5e4fae742491ebd40e5a8bea7d url: "https://pub.dev" source: hosted - version: "4.2.0" + version: "4.3.0" image_cropper: dependency: "direct main" description: @@ -1089,26 +1097,26 @@ packages: dependency: transitive description: name: image_picker_android - sha256: d3e5e00fdfeca8fd4ffb3227001264d449cc8950414c2ff70b0e06b9c628e643 + sha256: d34e0d9e024e81321b2aeed7b202ec6181cc282e6a1c0c0b4e6ad07ef1065d82 url: "https://pub.dev" source: hosted - version: "0.8.12+15" + version: "0.8.12+16" image_picker_for_web: dependency: transitive description: name: image_picker_for_web - sha256: "65d94623e15372c5c51bebbcb820848d7bcb323836e12dfdba60b5d3a8b39e50" + sha256: "717eb042ab08c40767684327be06a5d8dbb341fe791d514e4b92c7bbe1b7bb83" url: "https://pub.dev" source: hosted - version: "3.0.5" + version: "3.0.6" image_picker_ios: dependency: transitive description: name: image_picker_ios - sha256: "6703696ad49f5c3c8356d576d7ace84d1faf459afb07accbb0fae780753ff447" + sha256: "4f0568120c6fcc0aaa04511cb9f9f4d29fc3d0139884b1d06be88dcec7641d6b" url: "https://pub.dev" source: hosted - version: "0.8.12" + version: "0.8.12+1" image_picker_linux: dependency: transitive description: @@ -1249,10 +1257,10 @@ packages: dependency: transitive description: name: logging - sha256: "623a88c9594aa774443aa3eb2d41807a48486b5613e67599fb4c41c0ad47c340" + sha256: c8245ada5f1717ed44271ed1c26b8ce85ca3228fd2ffdb75468ab01979309d61 url: "https://pub.dev" source: hosted - version: "1.2.0" + version: "1.3.0" macos_window_utils: dependency: transitive description: @@ -1393,10 +1401,10 @@ packages: dependency: transitive description: name: mime - sha256: "801fd0b26f14a4a58ccb09d5892c3fbdeff209594300a542492cf13fba9d247a" + sha256: "41a20518f0cb1256669420fdba0cd90d21561e560ac240f26ef8322e45bb7ed6" url: "https://pub.dev" source: hosted - version: "1.0.6" + version: "2.0.0" nested: dependency: transitive description: @@ -1433,10 +1441,10 @@ packages: dependency: "direct main" description: name: package_info_plus - sha256: "894f37107424311bdae3e476552229476777b8752c5a2a2369c0cb9a2d5442ef" + sha256: df3eb3e0aed5c1107bb0fdb80a8e82e778114958b1c5ac5644fb1ac9cae8a998 url: "https://pub.dev" source: hosted - version: "8.0.3" + version: "8.1.0" package_info_plus_platform_interface: dependency: transitive description: @@ -1529,10 +1537,10 @@ packages: dependency: transitive description: name: permission_handler_android - sha256: "76e4ab092c1b240d31177bb64d2b0bea43f43d0e23541ec866151b9f7b2490fa" + sha256: "71bbecfee799e65aff7c744761a57e817e73b738fedf62ab7afd5593da21f9f1" url: "https://pub.dev" source: hosted - version: "12.0.12" + version: "12.0.13" permission_handler_apple: dependency: transitive description: @@ -1577,10 +1585,10 @@ packages: dependency: transitive description: name: platform - sha256: "9b71283fc13df574056616011fb138fd3b793ea47cc509c189a6c3fa5f8a1a65" + sha256: "5d6b1b0036a5f331ebc77c850ebc8506cbc1e9416c27e59b439f917a902a4984" url: "https://pub.dev" source: hosted - version: "3.1.5" + version: "3.1.6" platform_detect: dependency: transitive description: @@ -1825,10 +1833,10 @@ packages: dependency: "direct main" description: name: share_plus - sha256: fec12c3c39f01e4df1ec6ad92b6e85503c5ca64ffd6e28d18c9ffe53fcc4cb11 + sha256: "334fcdf0ef9c0df0e3b428faebcac9568f35c747d59831474b2fc56e156d244e" url: "https://pub.dev" source: hosted - version: "10.0.3" + version: "10.1.0" share_plus_platform_interface: dependency: transitive description: @@ -2014,10 +2022,10 @@ packages: dependency: transitive description: name: sqlparser - sha256: "852cf80f9e974ac8e1b613758a8aa640215f7701352b66a7f468e95711eb570b" + sha256: c5f63dff8677407ddcddfa4744c176ea6dc44286c47ba9e69e76d8071398034d url: "https://pub.dev" source: hosted - version: "0.38.1" + version: "0.39.1" stack_trace: dependency: transitive description: @@ -2118,10 +2126,10 @@ packages: dependency: transitive description: name: typed_data - sha256: facc8d6582f16042dd49f2463ff1bd6e2c9ef9f3d5da3d9b087e244a7b564b3c + sha256: f9049c039ebfeb4cf7a7104a675823cd72dba8297f264b6637062516699fa006 url: "https://pub.dev" source: hosted - version: "1.3.2" + version: "1.4.0" universal_io: dependency: transitive description: diff --git a/pubspec.yaml b/pubspec.yaml index 9bacf5f..dc0baa5 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -90,6 +90,7 @@ dependencies: flutter_resizable_container: ^3.0.0 file_saver: ^0.2.14 marquee: ^2.3.0 + confetti: ^0.8.0 dev_dependencies: flutter_test: