Improve chat message modal behavior

Modal is now summoned by long-pressing the username.

Message is now copied by long-pressing  the message.
This commit is contained in:
Tommy Chow 2022-07-28 19:51:04 -04:00
parent 1e557e0001
commit 2e52bbebda
2 changed files with 48 additions and 35 deletions

View file

@ -112,6 +112,7 @@ class IRCMessage {
required double emoteScale,
required bool isLightTheme,
required bool launchExternal,
required void Function()? onLongPressName,
bool showMessage = true,
bool useZeroWidth = false,
bool useReadableColors = false,
@ -289,11 +290,16 @@ class IRCMessage {
// debugPrint('NEW - NAME: ${tags['display-name']!}, HUE: ${hsl.hue}, SATURATION: ${hsl.saturation}, LIGHNTESS: ${hsl.lightness}');
span.add(
TextSpan(
text: tags['display-name']!,
style: TextStyle(
color: color,
fontWeight: FontWeight.bold,
WidgetSpan(
child: InkWell(
onLongPress: onLongPressName,
child: Text(
tags['display-name']!,
style: TextStyle(
color: color,
fontWeight: FontWeight.bold,
),
),
),
),
);

View file

@ -20,6 +20,39 @@ class ChatMessage extends StatelessWidget {
@override
Widget build(BuildContext context) {
void onLongPressName() {
if (isModal) return;
if (ircMessage.user == null && ircMessage.user == chatStore.auth.user.details?.login) return;
HapticFeedback.lightImpact();
showModalBottomSheet(
backgroundColor: Colors.transparent,
isScrollControlled: true,
context: context,
builder: (context) => ChatUserModal(
chatStore: chatStore,
username: ircMessage.user!,
userId: ircMessage.tags['user-id']!,
displayName: ircMessage.tags['display-name']!,
),
);
}
void onLongPressMessage() {
HapticFeedback.lightImpact();
Clipboard.setData(ClipboardData(text: ircMessage.message));
ScaffoldMessenger.of(context).showSnackBar(
const SnackBar(
content: AlertMessage(message: 'Message copied to clipboard'),
behavior: SnackBarBehavior.floating,
),
);
}
return Observer(
builder: (context) {
Color? color;
@ -33,6 +66,7 @@ class ChatMessage extends StatelessWidget {
renderMessage = Text.rich(
TextSpan(
children: ircMessage.generateSpan(
onLongPressName: onLongPressName,
style: DefaultTextStyle.of(context).style,
assetsStore: chatStore.assetsStore,
emoteScale: chatStore.settings.emoteScale,
@ -58,6 +92,7 @@ class ChatMessage extends StatelessWidget {
Text.rich(
TextSpan(
children: ircMessage.generateSpan(
onLongPressName: onLongPressName,
style: DefaultTextStyle.of(context).style,
assetsStore: chatStore.assetsStore,
emoteScale: chatStore.settings.emoteScale,
@ -125,6 +160,7 @@ class ChatMessage extends StatelessWidget {
Text.rich(
TextSpan(
children: ircMessage.generateSpan(
onLongPressName: onLongPressName,
style: DefaultTextStyle.of(context).style,
assetsStore: chatStore.assetsStore,
emoteScale: chatStore.settings.emoteScale,
@ -171,36 +207,7 @@ class ChatMessage extends StatelessWidget {
FocusScope.of(context).unfocus();
if (chatStore.assetsStore.showEmoteMenu) chatStore.assetsStore.showEmoteMenu = false;
},
onLongPress: isModal
? () {
HapticFeedback.lightImpact();
Clipboard.setData(ClipboardData(text: ircMessage.message));
ScaffoldMessenger.of(context).showSnackBar(
const SnackBar(
content: AlertMessage(message: 'Message copied to clipboard'),
behavior: SnackBarBehavior.floating,
),
);
}
: ircMessage.user != null && ircMessage.user != chatStore.auth.user.details?.login
? () {
HapticFeedback.lightImpact();
showModalBottomSheet(
backgroundColor: Colors.transparent,
isScrollControlled: true,
context: context,
builder: (context) => ChatUserModal(
chatStore: chatStore,
username: ircMessage.user!,
userId: ircMessage.tags['user-id']!,
displayName: ircMessage.tags['display-name']!,
),
);
}
: null,
onLongPress: onLongPressMessage,
child: coloredMessage,
);
},