✨ Birthday celebration screen
This commit is contained in:
		
							
								
								
									
										5
									
								
								.vscode/settings.json
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										5
									
								
								.vscode/settings.json
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,5 @@ | ||||
| { | ||||
|     "cSpell.words": [ | ||||
|         "annvisery" | ||||
|     ] | ||||
| } | ||||
| @@ -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" | ||||
| } | ||||
|   | ||||
| @@ -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 个生日" | ||||
| } | ||||
|   | ||||
| @@ -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 | ||||
|   | ||||
| @@ -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<BootstrapperShell> { | ||||
|  | ||||
|   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<BootstrapperShell> { | ||||
|             if (auth.isAuthorized.isTrue) | ||||
|               Get.find<RealmProvider>().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<BootstrapperShell> { | ||||
|           } | ||||
|         }, | ||||
|       ); | ||||
|     } 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: <Widget>[ | ||||
|         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), | ||||
|               ], | ||||
|             ), | ||||
|           ), | ||||
|         ), | ||||
|       ], | ||||
|     ); | ||||
|   } | ||||
| } | ||||
|   | ||||
| @@ -299,53 +299,71 @@ typedef $$LocalMessageEventTableTableUpdateCompanionBuilder | ||||
| }); | ||||
|  | ||||
| class $$LocalMessageEventTableTableFilterComposer | ||||
|     extends FilterComposer<_$AppDatabase, $LocalMessageEventTableTable> { | ||||
|   $$LocalMessageEventTableTableFilterComposer(super.$state); | ||||
|   ColumnFilters<int> 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<int> get id => $composableBuilder( | ||||
|       column: $table.id, builder: (column) => ColumnFilters(column)); | ||||
|  | ||||
|   ColumnFilters<int> get channelId => $state.composableBuilder( | ||||
|       column: $state.table.channelId, | ||||
|       builder: (column, joinBuilders) => | ||||
|           ColumnFilters(column, joinBuilders: joinBuilders)); | ||||
|   ColumnFilters<int> get channelId => $composableBuilder( | ||||
|       column: $table.channelId, builder: (column) => ColumnFilters(column)); | ||||
|  | ||||
|   ColumnWithTypeConverterFilters<Event?, Event, String> get data => | ||||
|       $state.composableBuilder( | ||||
|           column: $state.table.data, | ||||
|           builder: (column, joinBuilders) => ColumnWithTypeConverterFilters( | ||||
|               column, | ||||
|               joinBuilders: joinBuilders)); | ||||
|       $composableBuilder( | ||||
|           column: $table.data, | ||||
|           builder: (column) => ColumnWithTypeConverterFilters(column)); | ||||
|  | ||||
|   ColumnFilters<DateTime> get createdAt => $state.composableBuilder( | ||||
|       column: $state.table.createdAt, | ||||
|       builder: (column, joinBuilders) => | ||||
|           ColumnFilters(column, joinBuilders: joinBuilders)); | ||||
|   ColumnFilters<DateTime> get createdAt => $composableBuilder( | ||||
|       column: $table.createdAt, builder: (column) => ColumnFilters(column)); | ||||
| } | ||||
|  | ||||
| class $$LocalMessageEventTableTableOrderingComposer | ||||
|     extends OrderingComposer<_$AppDatabase, $LocalMessageEventTableTable> { | ||||
|   $$LocalMessageEventTableTableOrderingComposer(super.$state); | ||||
|   ColumnOrderings<int> 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<int> get id => $composableBuilder( | ||||
|       column: $table.id, builder: (column) => ColumnOrderings(column)); | ||||
|  | ||||
|   ColumnOrderings<int> get channelId => $state.composableBuilder( | ||||
|       column: $state.table.channelId, | ||||
|       builder: (column, joinBuilders) => | ||||
|           ColumnOrderings(column, joinBuilders: joinBuilders)); | ||||
|   ColumnOrderings<int> get channelId => $composableBuilder( | ||||
|       column: $table.channelId, builder: (column) => ColumnOrderings(column)); | ||||
|  | ||||
|   ColumnOrderings<String> get data => $state.composableBuilder( | ||||
|       column: $state.table.data, | ||||
|       builder: (column, joinBuilders) => | ||||
|           ColumnOrderings(column, joinBuilders: joinBuilders)); | ||||
|   ColumnOrderings<String> get data => $composableBuilder( | ||||
|       column: $table.data, builder: (column) => ColumnOrderings(column)); | ||||
|  | ||||
|   ColumnOrderings<DateTime> get createdAt => $state.composableBuilder( | ||||
|       column: $state.table.createdAt, | ||||
|       builder: (column, joinBuilders) => | ||||
|           ColumnOrderings(column, joinBuilders: joinBuilders)); | ||||
|   ColumnOrderings<DateTime> 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<int> get id => | ||||
|       $composableBuilder(column: $table.id, builder: (column) => column); | ||||
|  | ||||
|   GeneratedColumn<int> get channelId => | ||||
|       $composableBuilder(column: $table.channelId, builder: (column) => column); | ||||
|  | ||||
|   GeneratedColumnWithTypeConverter<Event?, String> get data => | ||||
|       $composableBuilder(column: $table.data, builder: (column) => column); | ||||
|  | ||||
|   GeneratedColumn<DateTime> 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<int> id = const Value.absent(), | ||||
|             Value<int> channelId = const Value.absent(), | ||||
| @@ -410,6 +434,7 @@ typedef $$LocalMessageEventTableTableProcessedTableManager | ||||
|         LocalMessageEventTableData, | ||||
|         $$LocalMessageEventTableTableFilterComposer, | ||||
|         $$LocalMessageEventTableTableOrderingComposer, | ||||
|         $$LocalMessageEventTableTableAnnotationComposer, | ||||
|         $$LocalMessageEventTableTableCreateCompanionBuilder, | ||||
|         $$LocalMessageEventTableTableUpdateCompanionBuilder, | ||||
|         ( | ||||
|   | ||||
| @@ -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 | ||||
|   | ||||
							
								
								
									
										88
									
								
								pubspec.lock
									
									
									
									
									
								
							
							
						
						
									
										88
									
								
								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: | ||||
|   | ||||
| @@ -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: | ||||
|   | ||||
		Reference in New Issue
	
	Block a user