From 7827a9e932ddcd5b9d57f13bbc4266dde7597714 Mon Sep 17 00:00:00 2001 From: danemadsen Date: Fri, 9 Aug 2024 12:08:59 +1000 Subject: [PATCH] user refactor --- lib/classes/providers/app_data.dart | 18 ++---------------- lib/classes/providers/user.dart | 10 +++------- lib/main.dart | 10 ++++++++-- lib/ui/desktop/buttons/user_button.dart | 10 +++++----- lib/ui/mobile/dialogs/user_image_dialog.dart | 8 ++++---- lib/ui/mobile/dialogs/user_name_dialog.dart | 9 +++++---- lib/ui/mobile/tiles/user_tile.dart | 11 ++++++----- lib/ui/shared/chat_widgets/chat_body.dart | 7 ++++--- lib/ui/shared/chat_widgets/chat_message.dart | 6 +++--- 9 files changed, 40 insertions(+), 49 deletions(-) diff --git a/lib/classes/providers/app_data.dart b/lib/classes/providers/app_data.dart index 99127223..71a19d98 100644 --- a/lib/classes/providers/app_data.dart +++ b/lib/classes/providers/app_data.dart @@ -3,14 +3,13 @@ import 'dart:convert'; import 'package:flutter/material.dart'; import 'package:maid/classes/providers/character.dart'; import 'package:maid/classes/providers/session.dart'; -import 'package:maid/classes/providers/user.dart'; import 'package:provider/provider.dart'; import 'package:shared_preferences/shared_preferences.dart'; class AppData extends ChangeNotifier { static AppData of(BuildContext context) => Provider.of(context, listen: false); - AppData(this._sessions, this._characters, this._currentSession, this._currentCharacter, this._user) { + AppData(this._sessions, this._characters, this._currentSession, this._currentCharacter) { _currentSession.addListener(notify); _currentCharacter.addListener(notify); } @@ -19,8 +18,6 @@ class AppData extends ChangeNotifier { final List _characters; Session _currentSession; Character _currentCharacter; - - User _user; List get sessions { _sessions.removeWhere((element) => element == _currentSession); @@ -38,8 +35,6 @@ class AppData extends ChangeNotifier { Character get currentCharacter => _currentCharacter; - User get user => _user; - set currentSession(Session session) { if (!currentSession.chat.tail.finalised) return; @@ -62,11 +57,6 @@ class AppData extends ChangeNotifier { save().then((value) => notifyListeners()); } - set user(User user) { - _user = user; - notifyListeners(); - } - static Future get last async { final prefs = await SharedPreferences.getInstance(); @@ -86,14 +76,12 @@ class AppData extends ChangeNotifier { final session = await Session.last; final character = await Character.last; - final user = await User.last; return AppData( sessions, characters, session, - character, - user + character ); } @@ -111,7 +99,6 @@ class AppData extends ChangeNotifier { prefs.setString("characters", json.encode(characterMaps)), _currentSession.save(), _currentCharacter.save(), - _user.save() ]; await Future.wait(futures); @@ -182,7 +169,6 @@ class AppData extends ChangeNotifier { clearCharacters(); _currentCharacter = Character(notify); _currentSession = Session(notify, 0); - _user = User(notify); notifyListeners(); } diff --git a/lib/classes/providers/user.dart b/lib/classes/providers/user.dart index 22334c5d..88cba926 100644 --- a/lib/classes/providers/user.dart +++ b/lib/classes/providers/user.dart @@ -3,9 +3,9 @@ import 'dart:io'; import 'package:file_picker/file_picker.dart'; import 'package:flutter/material.dart'; -import 'package:maid/classes/providers/app_data.dart'; import 'package:maid/classes/static/logger.dart'; import 'package:maid/classes/static/utilities.dart'; +import 'package:provider/provider.dart'; import 'package:shared_preferences/shared_preferences.dart'; class User extends ChangeNotifier { @@ -19,13 +19,9 @@ class User extends ChangeNotifier { File? _profile; String _name = "User"; - static User of(BuildContext context) => AppData.of(context).user; - - User(VoidCallback? listener) { - if (listener != null) { - addListener(listener); - } + static User of(BuildContext context, { bool listen = false }) => Provider.of(context, listen: listen); + User() { reset(); } diff --git a/lib/main.dart b/lib/main.dart index eb367856..2e3c3079 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -4,6 +4,7 @@ import 'package:maid/classes/providers/app_data.dart'; import 'package:maid/classes/providers/app_preferences.dart'; import 'package:maid/classes/providers/artificial_intelligence.dart'; import 'package:maid/classes/providers/huggingface_selection.dart'; +import 'package:maid/classes/providers/user.dart'; import 'package:maid/ui/desktop/app.dart'; import 'package:maid/ui/mobile/app.dart'; import 'package:provider/provider.dart'; @@ -16,12 +17,14 @@ void main() async { AppPreferences appPreferences = await AppPreferences.last; AppData appData = await AppData.last; ArtificialIntelligence ai = await ArtificialIntelligence.last; + User user = await User.last; runApp( MaidApp( appPreferences: appPreferences, appData: appData, - ai: ai + ai: ai, + user: user ) ); } @@ -30,12 +33,14 @@ class MaidApp extends StatelessWidget { final AppPreferences appPreferences; final AppData appData; final ArtificialIntelligence ai; + final User user; const MaidApp({ super.key, required this.appPreferences, required this.appData, - required this.ai, + required this.ai, + required this.user, }); @override @@ -45,6 +50,7 @@ class MaidApp extends StatelessWidget { ChangeNotifierProvider(create: (context) => appPreferences), ChangeNotifierProvider(create: (context) => appData), ChangeNotifierProvider(create: (context) => ai), + ChangeNotifierProvider(create: (context) => user), ChangeNotifierProvider(create: (context) => HuggingfaceSelection()) ], child: Selector( diff --git a/lib/ui/desktop/buttons/user_button.dart b/lib/ui/desktop/buttons/user_button.dart index cdd3bd8a..86009f63 100644 --- a/lib/ui/desktop/buttons/user_button.dart +++ b/lib/ui/desktop/buttons/user_button.dart @@ -1,6 +1,6 @@ import 'package:flutter/material.dart'; -import 'package:maid/classes/providers/app_data.dart'; import 'package:maid/classes/providers/desktop_navigator.dart'; +import 'package:maid/classes/providers/user.dart'; import 'package:maid/ui/shared/utilities/future_avatar.dart'; import 'package:provider/provider.dart'; @@ -9,15 +9,15 @@ class UserButton extends StatelessWidget { @override Widget build(BuildContext context) { - return Consumer( + return Consumer( builder: userBuilder, ); } - Widget userBuilder(BuildContext context, AppData appData, Widget? child) { + Widget userBuilder(BuildContext context, User user, Widget? child) { return FutureAvatar( - key: appData.user.key, - image: appData.user.profile, + key: user.key, + image: user.profile, radius: 16, onPressed: () { DesktopNavigator.of(context).navigateSettingsPanel("/user-settings"); diff --git a/lib/ui/mobile/dialogs/user_image_dialog.dart b/lib/ui/mobile/dialogs/user_image_dialog.dart index fc1f49d1..55047086 100644 --- a/lib/ui/mobile/dialogs/user_image_dialog.dart +++ b/lib/ui/mobile/dialogs/user_image_dialog.dart @@ -10,21 +10,21 @@ class UserImageDialog extends StatelessWidget { @override Widget build(BuildContext context) { - return Consumer( + return Consumer( builder: dialogBuilder, ); } - Widget dialogBuilder(BuildContext context, AppData appData, Widget? child) { + Widget dialogBuilder(BuildContext context, User user, Widget? child) { return AlertDialog( title: const Text( "Change Profile Picture", textAlign: TextAlign.center, ), - content: buildContent(context, appData.user), + content: buildContent(context, user), actions: [ FilledButton( - onPressed: appData.user.loadImage, + onPressed: user.loadImage, child: const Text( "Load Custom" ), diff --git a/lib/ui/mobile/dialogs/user_name_dialog.dart b/lib/ui/mobile/dialogs/user_name_dialog.dart index 9bfd8fde..21855a4d 100644 --- a/lib/ui/mobile/dialogs/user_name_dialog.dart +++ b/lib/ui/mobile/dialogs/user_name_dialog.dart @@ -1,5 +1,6 @@ import 'package:flutter/material.dart'; import 'package:maid/classes/providers/app_data.dart'; +import 'package:maid/classes/providers/user.dart'; import 'package:provider/provider.dart'; class UserNameDialog extends StatelessWidget { @@ -7,13 +8,13 @@ class UserNameDialog extends StatelessWidget { @override Widget build(BuildContext context) { - return Consumer( + return Consumer( builder: dialogBuilder, ); } - Widget dialogBuilder(BuildContext context, AppData appData, Widget? child) { - final controller = TextEditingController(text: appData.user.name); + Widget dialogBuilder(BuildContext context, User user, Widget? child) { + final controller = TextEditingController(text: user.name); return AlertDialog( title: const Text( @@ -35,7 +36,7 @@ class UserNameDialog extends StatelessWidget { ), FilledButton( onPressed: () { - appData.user.name = controller.text; + user.name = controller.text; Navigator.of(context).pop(); }, child: const Text( diff --git a/lib/ui/mobile/tiles/user_tile.dart b/lib/ui/mobile/tiles/user_tile.dart index 36330473..24ae4bbf 100644 --- a/lib/ui/mobile/tiles/user_tile.dart +++ b/lib/ui/mobile/tiles/user_tile.dart @@ -1,5 +1,6 @@ import 'package:flutter/material.dart'; import 'package:maid/classes/providers/app_data.dart'; +import 'package:maid/classes/providers/user.dart'; import 'package:maid/ui/mobile/dialogs/user_name_dialog.dart'; import 'package:maid/ui/mobile/dialogs/user_image_dialog.dart'; import 'package:maid/ui/shared/utilities/future_avatar.dart'; @@ -15,23 +16,23 @@ class UserTile extends StatefulWidget { class _UserTileState extends State { @override Widget build(BuildContext context) { - return Consumer( + return Consumer( builder: listTileBuilder, ); } - Widget listTileBuilder(BuildContext context, AppData appData, Widget? child) { + Widget listTileBuilder(BuildContext context, User user, Widget? child) { return ListTile( title: Text( - appData.user.name, + user.name, style: TextStyle( color: Theme.of(context).colorScheme.onPrimary, fontSize: 20, ), ), leading: FutureAvatar( - key: appData.user.key, - image: appData.user.profile, + key: user.key, + image: user.profile, radius: 20, ), trailing: PopupMenuButton( diff --git a/lib/ui/shared/chat_widgets/chat_body.dart b/lib/ui/shared/chat_widgets/chat_body.dart index ba38aebe..541ca5b1 100644 --- a/lib/ui/shared/chat_widgets/chat_body.dart +++ b/lib/ui/shared/chat_widgets/chat_body.dart @@ -2,6 +2,7 @@ import 'dart:math'; import 'package:flutter/material.dart'; import 'package:maid/classes/chat_node.dart'; +import 'package:maid/classes/providers/user.dart'; import 'package:maid/enumerators/chat_role.dart'; import 'package:maid/classes/providers/app_data.dart'; import 'package:maid/classes/static/utilities.dart'; @@ -35,8 +36,8 @@ class ChatBody extends StatelessWidget { } Widget _buildChat() { - return Consumer( - builder: (context, appData, child) { + return Consumer2( + builder: (context, appData, user, child) { final session = appData.currentSession; final character = appData.currentCharacter; @@ -52,7 +53,7 @@ class ChatBody extends StatelessWidget { if (character.greetings[index].isNotEmpty) { final message = ChatNode( role: ChatRole.assistant, - content: Utilities.formatPlaceholders(character.greetings[index], appData.user.name, character.name), + content: Utilities.formatPlaceholders(character.greetings[index], user.name, character.name), finalised: true ); diff --git a/lib/ui/shared/chat_widgets/chat_message.dart b/lib/ui/shared/chat_widgets/chat_message.dart index 2f2a5792..d8a4e659 100644 --- a/lib/ui/shared/chat_widgets/chat_message.dart +++ b/lib/ui/shared/chat_widgets/chat_message.dart @@ -3,6 +3,7 @@ import 'dart:math'; import 'package:flutter/material.dart'; import 'package:babylon_tts/babylon_tts.dart'; import 'package:maid/classes/providers/large_language_model.dart'; +import 'package:maid/classes/providers/user.dart'; import 'package:maid/enumerators/chat_role.dart'; import 'package:maid/classes/providers/app_data.dart'; import 'package:maid/classes/providers/session.dart'; @@ -32,9 +33,8 @@ class _ChatMessageWidgetState extends State with SingleTicker @override Widget build(BuildContext context) { - return Consumer( - builder: (context, appData, child) { - final user = appData.user; + return Consumer2( + builder: (context, appData, user, child) { final session = appData.currentSession; final character = appData.currentCharacter;