diff --git a/assets/i18n/en-US.json b/assets/i18n/en-US.json index f4c6917b..ad651639 100644 --- a/assets/i18n/en-US.json +++ b/assets/i18n/en-US.json @@ -473,6 +473,7 @@ "settingsKeyboardShortcutSettings": "Settings", "settingsKeyboardShortcutNewMessage": "New Message", "settingsKeyboardShortcutCloseDialog": "Close Dialog", + "settingsMessageDisplayStyle": "Message Display Style", "close": "Close", "drafts": "Drafts", "noDrafts": "No drafts yet", diff --git a/lib/pods/config.dart b/lib/pods/config.dart index 0c6eb49a..37a8891e 100644 --- a/lib/pods/config.dart +++ b/lib/pods/config.dart @@ -26,6 +26,7 @@ const kAppAprilFoolFeatures = 'app_april_fool_features'; const kAppWindowSize = 'app_window_size'; const kAppEnterToSend = 'app_enter_to_send'; const kAppDefaultPoolId = 'app_default_pool_id'; +const kAppMessageDisplayStyle = 'app_message_display_style'; const kFeaturedPostsCollapsedId = 'featured_posts_collapsed_id'; // Key for storing the ID of the collapsed featured post @@ -67,6 +68,7 @@ sealed class AppSettings with _$AppSettings { required int? appColorScheme, // The color stored via the int type required Size? windowSize, // The window size for desktop platforms required String? defaultPoolId, + required String messageDisplayStyle, }) = _AppSettings; } @@ -87,6 +89,7 @@ class AppSettingsNotifier extends _$AppSettingsNotifier { appColorScheme: prefs.getInt(kAppColorSchemeStoreKey), windowSize: _getWindowSizeFromPrefs(prefs), defaultPoolId: prefs.getString(kAppDefaultPoolId), + messageDisplayStyle: prefs.getString(kAppMessageDisplayStyle) ?? 'bubble', ); } @@ -106,6 +109,7 @@ class AppSettingsNotifier extends _$AppSettingsNotifier { } return null; } + void setDefaultPoolId(String? value) { final prefs = ref.read(sharedPreferencesProvider); if (value != null) { @@ -122,7 +126,7 @@ class AppSettingsNotifier extends _$AppSettingsNotifier { state = state.copyWith(autoTranslate: value); } - void setDataSavingMode(bool value){ + void setDataSavingMode(bool value) { final prefs = ref.read(sharedPreferencesProvider); prefs.setBool(kAppDataSavingMode, value); state = state.copyWith(dataSavingMode: value); @@ -186,6 +190,12 @@ class AppSettingsNotifier extends _$AppSettingsNotifier { Size? getWindowSize() { return state.windowSize; } + + void setMessageDisplayStyle(String value) { + final prefs = ref.read(sharedPreferencesProvider); + prefs.setString(kAppMessageDisplayStyle, value); + state = state.copyWith(messageDisplayStyle: value); + } } final updateInfoProvider = diff --git a/lib/pods/config.freezed.dart b/lib/pods/config.freezed.dart index 95dd93a9..0d1302ea 100644 --- a/lib/pods/config.freezed.dart +++ b/lib/pods/config.freezed.dart @@ -16,7 +16,7 @@ mixin _$AppSettings { bool get autoTranslate; bool get dataSavingMode; bool get soundEffects; bool get aprilFoolFeatures; bool get enterToSend; bool get appBarTransparent; bool get showBackgroundImage; String? get customFonts; int? get appColorScheme;// The color stored via the int type Size? get windowSize;// The window size for desktop platforms - String? get defaultPoolId; + String? get defaultPoolId; String get messageDisplayStyle; /// Create a copy of AppSettings /// with the given fields replaced by the non-null parameter values. @JsonKey(includeFromJson: false, includeToJson: false) @@ -27,16 +27,16 @@ $AppSettingsCopyWith get copyWith => _$AppSettingsCopyWithImpl Object.hash(runtimeType,autoTranslate,dataSavingMode,soundEffects,aprilFoolFeatures,enterToSend,appBarTransparent,showBackgroundImage,customFonts,appColorScheme,windowSize,defaultPoolId); +int get hashCode => Object.hash(runtimeType,autoTranslate,dataSavingMode,soundEffects,aprilFoolFeatures,enterToSend,appBarTransparent,showBackgroundImage,customFonts,appColorScheme,windowSize,defaultPoolId,messageDisplayStyle); @override String toString() { - return 'AppSettings(autoTranslate: $autoTranslate, dataSavingMode: $dataSavingMode, soundEffects: $soundEffects, aprilFoolFeatures: $aprilFoolFeatures, enterToSend: $enterToSend, appBarTransparent: $appBarTransparent, showBackgroundImage: $showBackgroundImage, customFonts: $customFonts, appColorScheme: $appColorScheme, windowSize: $windowSize, defaultPoolId: $defaultPoolId)'; + return 'AppSettings(autoTranslate: $autoTranslate, dataSavingMode: $dataSavingMode, soundEffects: $soundEffects, aprilFoolFeatures: $aprilFoolFeatures, enterToSend: $enterToSend, appBarTransparent: $appBarTransparent, showBackgroundImage: $showBackgroundImage, customFonts: $customFonts, appColorScheme: $appColorScheme, windowSize: $windowSize, defaultPoolId: $defaultPoolId, messageDisplayStyle: $messageDisplayStyle)'; } @@ -47,7 +47,7 @@ abstract mixin class $AppSettingsCopyWith<$Res> { factory $AppSettingsCopyWith(AppSettings value, $Res Function(AppSettings) _then) = _$AppSettingsCopyWithImpl; @useResult $Res call({ - bool autoTranslate, bool dataSavingMode, bool soundEffects, bool aprilFoolFeatures, bool enterToSend, bool appBarTransparent, bool showBackgroundImage, String? customFonts, int? appColorScheme, Size? windowSize, String? defaultPoolId + bool autoTranslate, bool dataSavingMode, bool soundEffects, bool aprilFoolFeatures, bool enterToSend, bool appBarTransparent, bool showBackgroundImage, String? customFonts, int? appColorScheme, Size? windowSize, String? defaultPoolId, String messageDisplayStyle }); @@ -64,7 +64,7 @@ class _$AppSettingsCopyWithImpl<$Res> /// Create a copy of AppSettings /// with the given fields replaced by the non-null parameter values. -@pragma('vm:prefer-inline') @override $Res call({Object? autoTranslate = null,Object? dataSavingMode = null,Object? soundEffects = null,Object? aprilFoolFeatures = null,Object? enterToSend = null,Object? appBarTransparent = null,Object? showBackgroundImage = null,Object? customFonts = freezed,Object? appColorScheme = freezed,Object? windowSize = freezed,Object? defaultPoolId = freezed,}) { +@pragma('vm:prefer-inline') @override $Res call({Object? autoTranslate = null,Object? dataSavingMode = null,Object? soundEffects = null,Object? aprilFoolFeatures = null,Object? enterToSend = null,Object? appBarTransparent = null,Object? showBackgroundImage = null,Object? customFonts = freezed,Object? appColorScheme = freezed,Object? windowSize = freezed,Object? defaultPoolId = freezed,Object? messageDisplayStyle = null,}) { return _then(_self.copyWith( autoTranslate: null == autoTranslate ? _self.autoTranslate : autoTranslate // ignore: cast_nullable_to_non_nullable as bool,dataSavingMode: null == dataSavingMode ? _self.dataSavingMode : dataSavingMode // ignore: cast_nullable_to_non_nullable @@ -77,7 +77,8 @@ as bool,customFonts: freezed == customFonts ? _self.customFonts : customFonts // as String?,appColorScheme: freezed == appColorScheme ? _self.appColorScheme : appColorScheme // ignore: cast_nullable_to_non_nullable as int?,windowSize: freezed == windowSize ? _self.windowSize : windowSize // ignore: cast_nullable_to_non_nullable as Size?,defaultPoolId: freezed == defaultPoolId ? _self.defaultPoolId : defaultPoolId // ignore: cast_nullable_to_non_nullable -as String?, +as String?,messageDisplayStyle: null == messageDisplayStyle ? _self.messageDisplayStyle : messageDisplayStyle // ignore: cast_nullable_to_non_nullable +as String, )); } @@ -159,10 +160,10 @@ return $default(_that);case _: /// } /// ``` -@optionalTypeArgs TResult maybeWhen(TResult Function( bool autoTranslate, bool dataSavingMode, bool soundEffects, bool aprilFoolFeatures, bool enterToSend, bool appBarTransparent, bool showBackgroundImage, String? customFonts, int? appColorScheme, Size? windowSize, String? defaultPoolId)? $default,{required TResult orElse(),}) {final _that = this; +@optionalTypeArgs TResult maybeWhen(TResult Function( bool autoTranslate, bool dataSavingMode, bool soundEffects, bool aprilFoolFeatures, bool enterToSend, bool appBarTransparent, bool showBackgroundImage, String? customFonts, int? appColorScheme, Size? windowSize, String? defaultPoolId, String messageDisplayStyle)? $default,{required TResult orElse(),}) {final _that = this; switch (_that) { case _AppSettings() when $default != null: -return $default(_that.autoTranslate,_that.dataSavingMode,_that.soundEffects,_that.aprilFoolFeatures,_that.enterToSend,_that.appBarTransparent,_that.showBackgroundImage,_that.customFonts,_that.appColorScheme,_that.windowSize,_that.defaultPoolId);case _: +return $default(_that.autoTranslate,_that.dataSavingMode,_that.soundEffects,_that.aprilFoolFeatures,_that.enterToSend,_that.appBarTransparent,_that.showBackgroundImage,_that.customFonts,_that.appColorScheme,_that.windowSize,_that.defaultPoolId,_that.messageDisplayStyle);case _: return orElse(); } @@ -180,10 +181,10 @@ return $default(_that.autoTranslate,_that.dataSavingMode,_that.soundEffects,_tha /// } /// ``` -@optionalTypeArgs TResult when(TResult Function( bool autoTranslate, bool dataSavingMode, bool soundEffects, bool aprilFoolFeatures, bool enterToSend, bool appBarTransparent, bool showBackgroundImage, String? customFonts, int? appColorScheme, Size? windowSize, String? defaultPoolId) $default,) {final _that = this; +@optionalTypeArgs TResult when(TResult Function( bool autoTranslate, bool dataSavingMode, bool soundEffects, bool aprilFoolFeatures, bool enterToSend, bool appBarTransparent, bool showBackgroundImage, String? customFonts, int? appColorScheme, Size? windowSize, String? defaultPoolId, String messageDisplayStyle) $default,) {final _that = this; switch (_that) { case _AppSettings(): -return $default(_that.autoTranslate,_that.dataSavingMode,_that.soundEffects,_that.aprilFoolFeatures,_that.enterToSend,_that.appBarTransparent,_that.showBackgroundImage,_that.customFonts,_that.appColorScheme,_that.windowSize,_that.defaultPoolId);} +return $default(_that.autoTranslate,_that.dataSavingMode,_that.soundEffects,_that.aprilFoolFeatures,_that.enterToSend,_that.appBarTransparent,_that.showBackgroundImage,_that.customFonts,_that.appColorScheme,_that.windowSize,_that.defaultPoolId,_that.messageDisplayStyle);} } /// A variant of `when` that fallback to returning `null` /// @@ -197,10 +198,10 @@ return $default(_that.autoTranslate,_that.dataSavingMode,_that.soundEffects,_tha /// } /// ``` -@optionalTypeArgs TResult? whenOrNull(TResult? Function( bool autoTranslate, bool dataSavingMode, bool soundEffects, bool aprilFoolFeatures, bool enterToSend, bool appBarTransparent, bool showBackgroundImage, String? customFonts, int? appColorScheme, Size? windowSize, String? defaultPoolId)? $default,) {final _that = this; +@optionalTypeArgs TResult? whenOrNull(TResult? Function( bool autoTranslate, bool dataSavingMode, bool soundEffects, bool aprilFoolFeatures, bool enterToSend, bool appBarTransparent, bool showBackgroundImage, String? customFonts, int? appColorScheme, Size? windowSize, String? defaultPoolId, String messageDisplayStyle)? $default,) {final _that = this; switch (_that) { case _AppSettings() when $default != null: -return $default(_that.autoTranslate,_that.dataSavingMode,_that.soundEffects,_that.aprilFoolFeatures,_that.enterToSend,_that.appBarTransparent,_that.showBackgroundImage,_that.customFonts,_that.appColorScheme,_that.windowSize,_that.defaultPoolId);case _: +return $default(_that.autoTranslate,_that.dataSavingMode,_that.soundEffects,_that.aprilFoolFeatures,_that.enterToSend,_that.appBarTransparent,_that.showBackgroundImage,_that.customFonts,_that.appColorScheme,_that.windowSize,_that.defaultPoolId,_that.messageDisplayStyle);case _: return null; } @@ -212,7 +213,7 @@ return $default(_that.autoTranslate,_that.dataSavingMode,_that.soundEffects,_tha class _AppSettings implements AppSettings { - const _AppSettings({required this.autoTranslate, required this.dataSavingMode, required this.soundEffects, required this.aprilFoolFeatures, required this.enterToSend, required this.appBarTransparent, required this.showBackgroundImage, required this.customFonts, required this.appColorScheme, required this.windowSize, required this.defaultPoolId}); + const _AppSettings({required this.autoTranslate, required this.dataSavingMode, required this.soundEffects, required this.aprilFoolFeatures, required this.enterToSend, required this.appBarTransparent, required this.showBackgroundImage, required this.customFonts, required this.appColorScheme, required this.windowSize, required this.defaultPoolId, required this.messageDisplayStyle}); @override final bool autoTranslate; @@ -228,6 +229,7 @@ class _AppSettings implements AppSettings { @override final Size? windowSize; // The window size for desktop platforms @override final String? defaultPoolId; +@override final String messageDisplayStyle; /// Create a copy of AppSettings /// with the given fields replaced by the non-null parameter values. @@ -239,16 +241,16 @@ _$AppSettingsCopyWith<_AppSettings> get copyWith => __$AppSettingsCopyWithImpl<_ @override bool operator ==(Object other) { - return identical(this, other) || (other.runtimeType == runtimeType&&other is _AppSettings&&(identical(other.autoTranslate, autoTranslate) || other.autoTranslate == autoTranslate)&&(identical(other.dataSavingMode, dataSavingMode) || other.dataSavingMode == dataSavingMode)&&(identical(other.soundEffects, soundEffects) || other.soundEffects == soundEffects)&&(identical(other.aprilFoolFeatures, aprilFoolFeatures) || other.aprilFoolFeatures == aprilFoolFeatures)&&(identical(other.enterToSend, enterToSend) || other.enterToSend == enterToSend)&&(identical(other.appBarTransparent, appBarTransparent) || other.appBarTransparent == appBarTransparent)&&(identical(other.showBackgroundImage, showBackgroundImage) || other.showBackgroundImage == showBackgroundImage)&&(identical(other.customFonts, customFonts) || other.customFonts == customFonts)&&(identical(other.appColorScheme, appColorScheme) || other.appColorScheme == appColorScheme)&&(identical(other.windowSize, windowSize) || other.windowSize == windowSize)&&(identical(other.defaultPoolId, defaultPoolId) || other.defaultPoolId == defaultPoolId)); + return identical(this, other) || (other.runtimeType == runtimeType&&other is _AppSettings&&(identical(other.autoTranslate, autoTranslate) || other.autoTranslate == autoTranslate)&&(identical(other.dataSavingMode, dataSavingMode) || other.dataSavingMode == dataSavingMode)&&(identical(other.soundEffects, soundEffects) || other.soundEffects == soundEffects)&&(identical(other.aprilFoolFeatures, aprilFoolFeatures) || other.aprilFoolFeatures == aprilFoolFeatures)&&(identical(other.enterToSend, enterToSend) || other.enterToSend == enterToSend)&&(identical(other.appBarTransparent, appBarTransparent) || other.appBarTransparent == appBarTransparent)&&(identical(other.showBackgroundImage, showBackgroundImage) || other.showBackgroundImage == showBackgroundImage)&&(identical(other.customFonts, customFonts) || other.customFonts == customFonts)&&(identical(other.appColorScheme, appColorScheme) || other.appColorScheme == appColorScheme)&&(identical(other.windowSize, windowSize) || other.windowSize == windowSize)&&(identical(other.defaultPoolId, defaultPoolId) || other.defaultPoolId == defaultPoolId)&&(identical(other.messageDisplayStyle, messageDisplayStyle) || other.messageDisplayStyle == messageDisplayStyle)); } @override -int get hashCode => Object.hash(runtimeType,autoTranslate,dataSavingMode,soundEffects,aprilFoolFeatures,enterToSend,appBarTransparent,showBackgroundImage,customFonts,appColorScheme,windowSize,defaultPoolId); +int get hashCode => Object.hash(runtimeType,autoTranslate,dataSavingMode,soundEffects,aprilFoolFeatures,enterToSend,appBarTransparent,showBackgroundImage,customFonts,appColorScheme,windowSize,defaultPoolId,messageDisplayStyle); @override String toString() { - return 'AppSettings(autoTranslate: $autoTranslate, dataSavingMode: $dataSavingMode, soundEffects: $soundEffects, aprilFoolFeatures: $aprilFoolFeatures, enterToSend: $enterToSend, appBarTransparent: $appBarTransparent, showBackgroundImage: $showBackgroundImage, customFonts: $customFonts, appColorScheme: $appColorScheme, windowSize: $windowSize, defaultPoolId: $defaultPoolId)'; + return 'AppSettings(autoTranslate: $autoTranslate, dataSavingMode: $dataSavingMode, soundEffects: $soundEffects, aprilFoolFeatures: $aprilFoolFeatures, enterToSend: $enterToSend, appBarTransparent: $appBarTransparent, showBackgroundImage: $showBackgroundImage, customFonts: $customFonts, appColorScheme: $appColorScheme, windowSize: $windowSize, defaultPoolId: $defaultPoolId, messageDisplayStyle: $messageDisplayStyle)'; } @@ -259,7 +261,7 @@ abstract mixin class _$AppSettingsCopyWith<$Res> implements $AppSettingsCopyWith factory _$AppSettingsCopyWith(_AppSettings value, $Res Function(_AppSettings) _then) = __$AppSettingsCopyWithImpl; @override @useResult $Res call({ - bool autoTranslate, bool dataSavingMode, bool soundEffects, bool aprilFoolFeatures, bool enterToSend, bool appBarTransparent, bool showBackgroundImage, String? customFonts, int? appColorScheme, Size? windowSize, String? defaultPoolId + bool autoTranslate, bool dataSavingMode, bool soundEffects, bool aprilFoolFeatures, bool enterToSend, bool appBarTransparent, bool showBackgroundImage, String? customFonts, int? appColorScheme, Size? windowSize, String? defaultPoolId, String messageDisplayStyle }); @@ -276,7 +278,7 @@ class __$AppSettingsCopyWithImpl<$Res> /// Create a copy of AppSettings /// with the given fields replaced by the non-null parameter values. -@override @pragma('vm:prefer-inline') $Res call({Object? autoTranslate = null,Object? dataSavingMode = null,Object? soundEffects = null,Object? aprilFoolFeatures = null,Object? enterToSend = null,Object? appBarTransparent = null,Object? showBackgroundImage = null,Object? customFonts = freezed,Object? appColorScheme = freezed,Object? windowSize = freezed,Object? defaultPoolId = freezed,}) { +@override @pragma('vm:prefer-inline') $Res call({Object? autoTranslate = null,Object? dataSavingMode = null,Object? soundEffects = null,Object? aprilFoolFeatures = null,Object? enterToSend = null,Object? appBarTransparent = null,Object? showBackgroundImage = null,Object? customFonts = freezed,Object? appColorScheme = freezed,Object? windowSize = freezed,Object? defaultPoolId = freezed,Object? messageDisplayStyle = null,}) { return _then(_AppSettings( autoTranslate: null == autoTranslate ? _self.autoTranslate : autoTranslate // ignore: cast_nullable_to_non_nullable as bool,dataSavingMode: null == dataSavingMode ? _self.dataSavingMode : dataSavingMode // ignore: cast_nullable_to_non_nullable @@ -289,7 +291,8 @@ as bool,customFonts: freezed == customFonts ? _self.customFonts : customFonts // as String?,appColorScheme: freezed == appColorScheme ? _self.appColorScheme : appColorScheme // ignore: cast_nullable_to_non_nullable as int?,windowSize: freezed == windowSize ? _self.windowSize : windowSize // ignore: cast_nullable_to_non_nullable as Size?,defaultPoolId: freezed == defaultPoolId ? _self.defaultPoolId : defaultPoolId // ignore: cast_nullable_to_non_nullable -as String?, +as String?,messageDisplayStyle: null == messageDisplayStyle ? _self.messageDisplayStyle : messageDisplayStyle // ignore: cast_nullable_to_non_nullable +as String, )); } diff --git a/lib/pods/config.g.dart b/lib/pods/config.g.dart index 7af42646..ced681e7 100644 --- a/lib/pods/config.g.dart +++ b/lib/pods/config.g.dart @@ -7,7 +7,7 @@ part of 'config.dart'; // ************************************************************************** String _$appSettingsNotifierHash() => - r'a623ad859b71f42d0527b7f8b75bd37a6fd5d5c7'; + r'9f0979f18b107e61185391e7c39bd81ac4b8ca50'; /// See also [AppSettingsNotifier]. @ProviderFor(AppSettingsNotifier) diff --git a/lib/screens/settings.dart b/lib/screens/settings.dart index 272babd9..adea5348 100644 --- a/lib/screens/settings.dart +++ b/lib/screens/settings.dart @@ -12,6 +12,7 @@ import 'package:flutter_hooks/flutter_hooks.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart'; import 'package:image_picker/image_picker.dart'; import 'package:island/pods/network.dart'; +import 'package:island/pods/userinfo.dart'; import 'package:island/services/color_extraction.dart'; import 'package:island/services/responsive.dart'; import 'package:island/widgets/alert.dart'; @@ -35,7 +36,8 @@ class SettingsScreen extends HookConsumerWidget { final isDesktop = !kIsWeb && (Platform.isWindows || Platform.isMacOS || Platform.isLinux); final isWide = isWideScreen(context); - final poolsAsync = ref.watch(poolsProvider); + final pools = ref.watch(poolsProvider); + final user = ref.watch(userInfoProvider); final docBasepath = useState(null); useEffect(() { @@ -129,6 +131,48 @@ class SettingsScreen extends HookConsumerWidget { ), ), + // Message display style settings + ListTile( + minLeadingWidth: 48, + title: Text('settingsMessageDisplayStyle').tr(), + contentPadding: const EdgeInsets.only(left: 24, right: 17), + leading: const Icon(Symbols.chat), + trailing: DropdownButtonHideUnderline( + child: DropdownButton2( + isExpanded: true, + items: [ + DropdownMenuItem( + value: 'bubble', + child: Text('Bubble').fontSize(14), + ), + DropdownMenuItem( + value: 'discord', + child: Text('Discord').fontSize(14), + ), + DropdownMenuItem( + value: 'irc', + child: Text('IRC').fontSize(14), + ), + ], + value: settings.messageDisplayStyle, + onChanged: (String? value) { + if (value != null) { + ref + .read(appSettingsNotifierProvider.notifier) + .setMessageDisplayStyle(value); + showSnackBar('settingsApplied'.tr()); + } + }, + buttonStyleData: const ButtonStyleData( + padding: EdgeInsets.symmetric(horizontal: 16, vertical: 5), + height: 40, + width: 140, + ), + menuItemStyleData: const MenuItemStyleData(height: 40), + ), + ), + ), + // Color scheme settings ListTile( minLeadingWidth: 48, @@ -370,65 +414,67 @@ class SettingsScreen extends HookConsumerWidget { ), ), - poolsAsync.when( - data: (pools) { - final validPools = pools.filterValid(); - final currentPoolId = resolveDefaultPoolId(ref, pools); + if (user.value != null) + pools.when( + data: (data) { + final validPools = data.filterValid(); + final currentPoolId = resolveDefaultPoolId(ref, data); - return ListTile( - isThreeLine: true, - minLeadingWidth: 48, - title: Text('settingsDefaultPool').tr(), - contentPadding: const EdgeInsets.only(left: 24, right: 17), - leading: const Icon(Symbols.cloud), - subtitle: Text( - validPools - .firstWhereOrNull((p) => p.id == currentPoolId) - ?.description ?? - 'settingsDefaultPoolHelper'.tr(), - style: Theme.of(context).textTheme.bodySmall, - ), - trailing: DropdownButtonHideUnderline( - child: DropdownButton2( - isExpanded: true, - items: - validPools.map((p) { - return DropdownMenuItem( - value: p.id, - child: Text(p.name).fontSize(14), - ); - }).toList(), - value: currentPoolId, - onChanged: (value) { - ref - .read(appSettingsNotifierProvider.notifier) - .setDefaultPoolId(value); - showSnackBar('settingsApplied'.tr()); - }, - buttonStyleData: const ButtonStyleData( - padding: EdgeInsets.symmetric(horizontal: 16, vertical: 5), - height: 40, - width: 220, - ), - menuItemStyleData: const MenuItemStyleData(height: 40), - ), - ), - ); - }, - loading: - () => const ListTile( - minLeadingWidth: 48, - title: Text('Loading pools...'), - leading: CircularProgressIndicator(), - ), - error: - (err, st) => ListTile( + return ListTile( + isThreeLine: true, minLeadingWidth: 48, title: Text('settingsDefaultPool').tr(), - subtitle: Text('Error: $err'), - leading: const Icon(Icons.error, color: Colors.red), - ), - ), + contentPadding: const EdgeInsets.only(left: 24, right: 17), + leading: const Icon(Symbols.cloud), + subtitle: Text( + 'settingsDefaultPoolHelper'.tr(), + style: Theme.of(context).textTheme.bodySmall, + ), + trailing: DropdownButtonHideUnderline( + child: DropdownButton2( + isExpanded: true, + items: + validPools.map((p) { + return DropdownMenuItem( + value: p.id, + child: Text( + p.name, + maxLines: 1, + overflow: TextOverflow.ellipsis, + ).fontSize(14), + ); + }).toList(), + value: currentPoolId, + onChanged: (value) { + ref + .read(appSettingsNotifierProvider.notifier) + .setDefaultPoolId(value); + showSnackBar('settingsApplied'.tr()); + }, + buttonStyleData: const ButtonStyleData( + padding: EdgeInsets.symmetric(horizontal: 16, vertical: 5), + height: 40, + width: 120, + ), + menuItemStyleData: const MenuItemStyleData(height: 40), + ), + ), + ); + }, + loading: + () => const ListTile( + minLeadingWidth: 48, + title: Text('Loading pools...'), + leading: CircularProgressIndicator(), + ), + error: + (err, st) => ListTile( + minLeadingWidth: 48, + title: Text('settingsDefaultPool').tr(), + subtitle: Text('Error: $err'), + leading: const Icon(Icons.error, color: Colors.red), + ), + ), ]; final behaviorSettings = [ diff --git a/lib/widgets/chat/message_item.dart b/lib/widgets/chat/message_item.dart index db473cf1..bdd2500d 100644 --- a/lib/widgets/chat/message_item.dart +++ b/lib/widgets/chat/message_item.dart @@ -13,6 +13,7 @@ import 'package:island/database/message.dart'; import 'package:island/models/embed.dart'; import 'package:island/pods/messages_notifier.dart'; import 'package:island/pods/translate.dart'; +import 'package:island/pods/config.dart'; import 'package:island/screens/chat/room.dart'; import 'package:island/utils/mapping.dart'; import 'package:island/widgets/account/account_pfc.dart'; @@ -28,8 +29,6 @@ import 'package:material_symbols_icons/material_symbols_icons.dart'; import 'package:styled_widget/styled_widget.dart'; import 'package:island/widgets/content/sheet.dart'; -const kChatMessageStyle = 'discord'; - class MessageItemAction { static const String edit = "edit"; static const String delete = "delete"; @@ -58,6 +57,7 @@ class MessageItem extends HookConsumerWidget { @override Widget build(BuildContext context, WidgetRef ref) { final remoteMessage = message.toRemoteMessage(); + final settings = ref.watch(appSettingsNotifierProvider); final isMobile = !kIsWeb && (Platform.isAndroid || Platform.isIOS); @@ -184,7 +184,7 @@ class MessageItem extends HookConsumerWidget { return GestureDetector( onLongPress: showActionMenu, onSecondaryTap: showActionMenu, - child: switch (kChatMessageStyle) { + child: switch (settings.messageDisplayStyle) { 'irc' => MessageItemDisplayIRC( message: message, isCurrentUser: isCurrentUser, diff --git a/lib/widgets/chat/message_sender_info.dart b/lib/widgets/chat/message_sender_info.dart index 4456a6f0..30272c99 100644 --- a/lib/widgets/chat/message_sender_info.dart +++ b/lib/widgets/chat/message_sender_info.dart @@ -66,14 +66,13 @@ class MessageSenderInfo extends StatelessWidget { return Row( spacing: 8, children: [ - if (!showAvatar) - AccountPfcGestureDetector( - uname: sender.account.name, - child: ProfilePictureWidget( - fileId: sender.account.profile.picture?.id, - radius: 14, - ), + AccountPfcGestureDetector( + uname: sender.account.name, + child: ProfilePictureWidget( + fileId: sender.account.profile.picture?.id, + radius: 14, ), + ), Expanded( child: Column( crossAxisAlignment: CrossAxisAlignment.start,