From 56aa6e9f7e369ed69a3dfb74f62a197f39e3bf6f Mon Sep 17 00:00:00 2001 From: otsmr Date: Tue, 21 Apr 2026 03:34:52 +0200 Subject: [PATCH] rewrite global user variable --- lib/app.dart | 8 +- lib/globals.dart | 13 +- lib/src/providers/settings.provider.dart | 5 +- lib/src/views/public_profile.view.dart | 7 +- .../settings/chat/chat_reactions.view.dart | 123 +++++++++--------- 5 files changed, 71 insertions(+), 85 deletions(-) diff --git a/lib/app.dart b/lib/app.dart index 4e4bb61b..b6f75f9f 100644 --- a/lib/app.dart +++ b/lib/app.dart @@ -176,12 +176,12 @@ class _AppMainWidgetState extends State { _isTwonlyLocked = false; }), ); - } else if (AppSession.currentUser.twonlySafeBackup == null && !_skipBackup) { + } else if (AppSession.currentUser.twonlySafeBackup == null && + !_skipBackup) { child = SetupBackupView( - callBack: () { + callBack: () => setState(() { _skipBackup = true; - setState(() {}); - }, + }), ); } else { child = HomeView( diff --git a/lib/globals.dart b/lib/globals.dart index c1a3c02b..e7708ea3 100644 --- a/lib/globals.dart +++ b/lib/globals.dart @@ -27,17 +27,9 @@ class AppState { } class AppGlobalKeys { - static final GlobalKey scaffoldMessengerKey = - GlobalKey(); + static final scaffoldMessengerKey = GlobalKey(); } -late ApiService apiService; - -// uses for background notification -late TwonlyDB twonlyDB; - -// Cached UserData in the memory. Every time the user data is changed the `updateUserdata` function is called, -// which will update this global variable. The variable is set in the main.dart and after the user has registered in the register.view.dart class AppSession { static late UserData currentUser; @@ -48,3 +40,6 @@ class AppSession { _userDataUpdateController.add(null); } } + +late ApiService apiService; +late TwonlyDB twonlyDB; diff --git a/lib/src/providers/settings.provider.dart b/lib/src/providers/settings.provider.dart index 840f2d66..d1b916dd 100644 --- a/lib/src/providers/settings.provider.dart +++ b/lib/src/providers/settings.provider.dart @@ -21,9 +21,6 @@ class SettingsChangeProvider with ChangeNotifier, DiagnosticableTreeMixin { notifyListeners(); - await updateUserdata((user) { - user.themeMode = newThemeMode; - return user; - }); + await updateUser((u) => u.themeMode = newThemeMode); } } diff --git a/lib/src/views/public_profile.view.dart b/lib/src/views/public_profile.view.dart index 091b672e..64b18477 100644 --- a/lib/src/views/public_profile.view.dart +++ b/lib/src/views/public_profile.view.dart @@ -34,8 +34,7 @@ class _PublicProfileViewState extends State { _qrCode = await getProfileQrCodeData(); _userAvatar = await getUserAvatar(); _publicKey = await getUserPublicKey(); - - setState(() {}); + if (mounted) setState(() {}); } @override @@ -126,7 +125,9 @@ class _PublicProfileViewState extends State { text: context.lang.shareYourProfile, subtitle: (_publicKey == null) ? null - : Text('https://me.twonly.eu/${AppSession.currentUser.username}'), + : Text( + 'https://me.twonly.eu/${AppSession.currentUser.username}', + ), onTap: () { final params = ShareParams( text: diff --git a/lib/src/views/settings/chat/chat_reactions.view.dart b/lib/src/views/settings/chat/chat_reactions.view.dart index a58778e9..171b7667 100644 --- a/lib/src/views/settings/chat/chat_reactions.view.dart +++ b/lib/src/views/settings/chat/chat_reactions.view.dart @@ -1,6 +1,5 @@ -import 'dart:async'; - import 'package:flutter/material.dart'; +import 'package:twonly/globals.dart'; import 'package:twonly/src/utils/misc.dart'; import 'package:twonly/src/utils/storage.dart'; import 'package:twonly/src/views/components/animate_icon.dart'; @@ -14,32 +13,30 @@ class ChatReactionSelectionView extends StatefulWidget { } class _ChatReactionSelectionView extends State { - List selectedEmojis = []; + List _selectedEmojis = []; + + List _emojisFromSession() { + final user = AppSession.currentUser; + if (user.preSelectedEmojies != null) { + return user.preSelectedEmojies!; + } + return EmojiAnimation.animatedIcons.keys.toList().sublist(0, 6); + } @override void initState() { super.initState(); - unawaited(initAsync()); - } - - Future initAsync() async { - final user = await getUser(); - if (user != null && user.preSelectedEmojies != null) { - selectedEmojis = user.preSelectedEmojies!; - } else { - selectedEmojis = EmojiAnimation.animatedIcons.keys.toList().sublist(0, 6); - } - setState(() {}); + _selectedEmojis = _emojisFromSession(); } Future _onEmojiSelected(String emoji) async { - if (selectedEmojis.contains(emoji)) { - selectedEmojis.remove(emoji); + if (_selectedEmojis.contains(emoji)) { + _selectedEmojis.remove(emoji); } else { - if (selectedEmojis.length < 12) { - selectedEmojis.add(emoji); + if (_selectedEmojis.length < 12) { + _selectedEmojis.add(emoji); await updateUser((user) { - user.preSelectedEmojies = selectedEmojis; + user.preSelectedEmojies = _selectedEmojis; }); } else { ScaffoldMessenger.of(context).showSnackBar( @@ -55,56 +52,52 @@ class _ChatReactionSelectionView extends State { @override Widget build(BuildContext context) { - return Scaffold( - appBar: AppBar( - title: const Text('Select Reactions'), - ), - body: GridView.builder( - gridDelegate: const SliverGridDelegateWithFixedCrossAxisCount( - crossAxisCount: 4, // Number of columns - ), - itemCount: EmojiAnimation.animatedIcons.keys.length, - itemBuilder: (context, index) { - final emoji = EmojiAnimation.animatedIcons.keys.elementAt(index); - return GestureDetector( - onTap: () async { - await _onEmojiSelected(emoji); - }, - child: Card( - color: selectedEmojis.contains(emoji) - ? context.color.primary.withAlpha(150) - : context.color.surface, - child: Center( - child: SizedBox( - width: 40, - height: 40, - child: EmojiAnimation( - emoji: emoji, - // repeat: selectedEmojis.contains(emoji), + return StreamBuilder( + stream: AppSession.onUserUpdated, + builder: (context, _) { + _selectedEmojis = _emojisFromSession(); + return Scaffold( + appBar: AppBar( + title: const Text('Select Reactions'), + ), + body: GridView.builder( + gridDelegate: const SliverGridDelegateWithFixedCrossAxisCount( + crossAxisCount: 4, + ), + itemCount: EmojiAnimation.animatedIcons.keys.length, + itemBuilder: (context, index) { + final emoji = EmojiAnimation.animatedIcons.keys.elementAt(index); + return GestureDetector( + onTap: () => _onEmojiSelected(emoji), + child: Card( + color: _selectedEmojis.contains(emoji) + ? context.color.primary.withAlpha(150) + : context.color.surface, + child: Center( + child: SizedBox( + width: 40, + height: 40, + child: EmojiAnimation(emoji: emoji), + ), ), ), + ); + }, + ), + floatingActionButton: Padding( + padding: const EdgeInsets.only(bottom: 30), + child: FloatingActionButton( + foregroundColor: Colors.white, + onPressed: () => updateUser( + (u) => u.preSelectedEmojies = EmojiAnimation.animatedIcons.keys + .toList() + .sublist(0, 6), ), + child: const Icon(Icons.settings_backup_restore_rounded), ), - ); - }, - ), - floatingActionButton: Padding( - padding: const EdgeInsets.only(bottom: 30), - child: FloatingActionButton( - foregroundColor: Colors.white, - onPressed: () async { - selectedEmojis = EmojiAnimation.animatedIcons.keys.toList().sublist( - 0, - 6, - ); - setState(() {}); - await updateUser((user) { - user.preSelectedEmojies = selectedEmojis; - }); - }, - child: const Icon(Icons.settings_backup_restore_rounded), - ), - ), + ), + ); + }, ); } }