Skip to content
This repository was archived by the owner on May 19, 2026. It is now read-only.
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
28 changes: 21 additions & 7 deletions lib/config/themes.dart
Original file line number Diff line number Diff line change
Expand Up @@ -117,13 +117,27 @@ abstract class FluffyThemes {
color: colorScheme.primary,
refreshBackgroundColor: colorScheme.primaryContainer,
),
snackBarTheme: isColumnMode
? const SnackBarThemeData(
showCloseIcon: true,
behavior: SnackBarBehavior.floating,
width: FluffyThemes.columnWidth * 1.5,
)
: const SnackBarThemeData(behavior: SnackBarBehavior.floating),
snackBarTheme: SnackBarThemeData(
behavior: SnackBarBehavior.floating,
showCloseIcon: true,
closeIconColor: colorScheme.onSurfaceVariant,
backgroundColor: colorScheme.surfaceContainerLowest,
contentTextStyle: TextStyle(
color: colorScheme.onSurface,
fontSize: 14,
fontWeight: FontWeight.w500,
),
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(16),
side: BorderSide(
color: colorScheme.outlineVariant.withAlpha(40),
width: 1,
),
),
elevation: 2,
width: isColumnMode ? FluffyThemes.columnWidth * 1.5 : null,
insetPadding: const EdgeInsets.fromLTRB(16, 0, 16, 16),
),
elevatedButtonTheme: ElevatedButtonThemeData(
style: ElevatedButton.styleFrom(
backgroundColor: colorScheme.secondaryContainer,
Expand Down
38 changes: 16 additions & 22 deletions lib/pages/chat/chat.dart
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,7 @@ import 'package:fluffychat/widgets/adaptive_dialogs/show_text_input_dialog.dart'
import 'package:fluffychat/widgets/future_loading_dialog.dart';
import 'package:fluffychat/widgets/matrix.dart';
import 'package:fluffychat/widgets/share_scaffold_dialog.dart';
import 'package:fluffychat/widgets/uchar_snack_bar.dart';
import '../../utils/account_bundles.dart';
import '../../utils/localized_exception_extension.dart';
import '../../utils/element_call/call_service.dart';
Expand Down Expand Up @@ -342,17 +343,9 @@ class ChatController extends State<ChatPageWithRoom>
final shareItems = widget.shareItems;
if (shareItems == null || shareItems.isEmpty) return;
if (!room.otherPartyCanReceiveMessages) {
final theme = Theme.of(context);
ScaffoldMessenger.of(context).showSnackBar(
SnackBar(
backgroundColor: theme.colorScheme.errorContainer,
closeIconColor: theme.colorScheme.onErrorContainer,
content: Text(
L10n.of(context).otherPartyNotLoggedIn,
style: TextStyle(color: theme.colorScheme.onErrorContainer),
),
showCloseIcon: true,
),
ScaffoldMessenger.of(context).showUcharSnackBar(
message: L10n.of(context).otherPartyNotLoggedIn,
type: UcharNotificationType.error,
);
return;
}
Expand Down Expand Up @@ -872,8 +865,9 @@ class ChatController extends State<ChatPageWithRoom>
);
} catch (e) {
if (!mounted) return;
scaffoldMessenger.showSnackBar(
SnackBar(content: Text((e as Object).toLocalizedString(context))),
scaffoldMessenger.showUcharSnackBar(
message: (e as Object).toLocalizedString(context),
type: UcharNotificationType.error,
);
return;
}
Expand Down Expand Up @@ -977,8 +971,9 @@ class ChatController extends State<ChatPageWithRoom>
showEmojiPicker = false;
selectedEvents.clear();
});
scaffoldMessenger.showSnackBar(
SnackBar(content: Text(l10n.contentHasBeenReported)),
scaffoldMessenger.showUcharSnackBar(
message: l10n.contentHasBeenReported,
type: UcharNotificationType.success,
);
}

Expand Down Expand Up @@ -1510,8 +1505,9 @@ class ChatController extends State<ChatPageWithRoom>
// Check if user has permission to join/start calls
if (!CallService.canJoinCall(room)) {
if (context.mounted) {
ScaffoldMessenger.of(context).showSnackBar(
SnackBar(content: Text(L10n.of(context).noCallPermission)),
ScaffoldMessenger.of(context).showUcharSnackBar(
message: L10n.of(context).noCallPermission,
type: UcharNotificationType.warning,
);
}
return;
Expand All @@ -1523,12 +1519,10 @@ class ChatController extends State<ChatPageWithRoom>

if (!cameraStatus.isGranted || !micStatus.isGranted) {
if (context.mounted) {
ScaffoldMessenger.of(context).showSnackBar(
const SnackBar(
content: Text(
ScaffoldMessenger.of(context).showUcharSnackBar(
message:
'Camera and microphone permissions are required for calls',
),
),
type: UcharNotificationType.warning,
);
}
return;
Expand Down
31 changes: 11 additions & 20 deletions lib/pages/chat_list/chat_list.dart
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,7 @@ import '../../../utils/account_bundles.dart';
import '../../config/setting_keys.dart';
import '../../utils/url_launcher.dart';
import '../../widgets/matrix.dart';
import '../../widgets/uchar_snack_bar.dart';

enum PopupMenuAction {
settings,
Expand Down Expand Up @@ -956,27 +957,17 @@ class ChatListController extends State<ChatList>
(device) => !device.verified && !device.blocked,
) ??
false) {
final messenger = ScaffoldMessenger.of(context);
late final ScaffoldFeatureController controller;
final theme = Theme.of(context);
controller = ScaffoldMessenger.of(context).showSnackBar(
SnackBar(
duration: const Duration(seconds: 15),
showCloseIcon: true,
backgroundColor: theme.colorScheme.errorContainer,
closeIconColor: theme.colorScheme.onErrorContainer,
content: Text(
L10n.of(context).oneOfYourDevicesIsNotVerified,
style: TextStyle(color: theme.colorScheme.onErrorContainer),
),
action: SnackBarAction(
onPressed: () {
controller.close();
router.go('/rooms/settings/devices');
},
textColor: theme.colorScheme.onErrorContainer,
label: L10n.of(context).settings,
),
),
controller = messenger.showUcharSnackBar(
message: L10n.of(context).oneOfYourDevicesIsNotVerified,
type: UcharNotificationType.error,
actionLabel: L10n.of(context).settings,
onAction: () {
controller.close();
router.go('/rooms/settings/devices');
},
duration: const Duration(seconds: 15),
);
}
}
Expand Down
6 changes: 4 additions & 2 deletions lib/utils/fluffy_share.dart
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
import 'package:fluffychat/l10n/l10n.dart';
import 'package:fluffychat/utils/platform_infos.dart';
import 'package:fluffychat/widgets/uchar_snack_bar.dart';
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:share_plus/share_plus.dart';
Expand All @@ -26,8 +27,9 @@ abstract class FluffyShare {
}
await Clipboard.setData(ClipboardData(text: text));
if (!PlatformInfos.isMobile) {
scaffoldMessenger.showSnackBar(
SnackBar(showCloseIcon: true, content: Text(l10n.copiedToClipboard)),
scaffoldMessenger.showUcharSnackBar(
message: l10n.copiedToClipboard,
type: UcharNotificationType.success,
);
}
return;
Expand Down
17 changes: 7 additions & 10 deletions lib/utils/show_update_snackbar.dart
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
import 'package:fluffychat/config/app_config.dart';
import 'package:fluffychat/l10n/l10n.dart';
import 'package:fluffychat/utils/platform_infos.dart';
import 'package:fluffychat/widgets/uchar_snack_bar.dart';
import 'package:flutter/material.dart';
import 'package:shared_preferences/shared_preferences.dart';
import 'package:url_launcher/url_launcher_string.dart';
Expand All @@ -17,16 +18,12 @@ abstract class UpdateNotifier {

if (currentVersion != storedVersion) {
if (storedVersion != null) {
scaffoldMessenger.showSnackBar(
SnackBar(
duration: const Duration(seconds: 30),
showCloseIcon: true,
content: Text(l10n.updateInstalled(currentVersion)),
action: SnackBarAction(
label: l10n.changelog,
onPressed: () => launchUrlString(AppConfig.changelogUrl),
),
),
scaffoldMessenger.showUcharSnackBar(
message: l10n.updateInstalled(currentVersion),
type: UcharNotificationType.success,
actionLabel: l10n.changelog,
onAction: () => launchUrlString(AppConfig.changelogUrl),
duration: const Duration(seconds: 30),
);
}
await store.setString(versionStoreKey, currentVersion);
Expand Down
12 changes: 7 additions & 5 deletions lib/utils/url_launcher.dart
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ import 'package:fluffychat/widgets/adaptive_dialogs/show_ok_cancel_alert_dialog.
import 'package:fluffychat/widgets/adaptive_dialogs/user_dialog.dart';
import 'package:fluffychat/widgets/future_loading_dialog.dart';
import 'package:fluffychat/widgets/matrix.dart';
import 'package:fluffychat/widgets/uchar_snack_bar.dart';
import 'package:flutter/material.dart';
import 'package:go_router/go_router.dart';
import 'package:matrix/matrix.dart';
Expand Down Expand Up @@ -37,9 +38,9 @@ class UrlLauncher {
}
final uri = Uri.tryParse(url!);
if (uri == null) {
// we can't open this thing
scaffoldMessenger.showSnackBar(
SnackBar(content: Text(l10n.cantOpenUri(url!))),
scaffoldMessenger.showUcharSnackBar(
message: l10n.cantOpenUri(url!),
type: UcharNotificationType.error,
);
return;
}
Expand Down Expand Up @@ -92,8 +93,9 @@ class UrlLauncher {
return;
}
if (uri.host.isEmpty) {
scaffoldMessenger.showSnackBar(
SnackBar(content: Text(l10n.cantOpenUri(url!))),
scaffoldMessenger.showUcharSnackBar(
message: l10n.cantOpenUri(url!),
type: UcharNotificationType.error,
);
return;
}
Expand Down
26 changes: 13 additions & 13 deletions lib/widgets/layouts/empty_page.dart
Original file line number Diff line number Diff line change
@@ -1,30 +1,30 @@
import 'dart:math';

import 'package:flutter/material.dart';

class EmptyPage extends StatelessWidget {
static const double _width = 400;
const EmptyPage({super.key});
@override
Widget build(BuildContext context) {
final width = min(MediaQuery.sizeOf(context).width, EmptyPage._width) / 2;
final theme = Theme.of(context);
return Scaffold(
// Add invisible appbar to make status bar on Android tablets bright.
appBar: AppBar(
automaticallyImplyLeading: false,
elevation: 0,
backgroundColor: Colors.transparent,
),
extendBodyBehindAppBar: true,
body: Container(
alignment: Alignment.center,
child: Image.asset(
'assets/logo_transparent.png',
color: theme.colorScheme.surfaceContainerHigh,
width: width,
height: width,
filterQuality: FilterQuality.medium,
body: Center(
child: Container(
padding: const EdgeInsets.symmetric(horizontal: 10, vertical: 1),
decoration: BoxDecoration(
color: theme.colorScheme.surfaceContainerHigh,
borderRadius: BorderRadius.circular(24),
),
child: Text(
'Select a chat to start messaging',
style: theme.textTheme.titleSmall?.copyWith(
color: theme.colorScheme.onSurfaceVariant,
),
),
),
),
);
Expand Down
Loading
Loading