chore: pass lemma meaning results to emoji picket instead of re-fetching, return STT langcode for audio messages (#3507)

This commit is contained in:
ggurdin 2025-07-21 12:18:39 -04:00 committed by GitHub
parent 473ca66f48
commit a98aeed5ed
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
3 changed files with 27 additions and 59 deletions

View file

@ -675,6 +675,12 @@ class PangeaMessageEvent {
messageDisplayLangCode.split("-")[0] == l2Code?.split("-")[0];
String get messageDisplayLangCode {
if (isAudioMessage) {
final stt = getSpeechToTextLocal();
if (stt == null) return LanguageKeys.unknownLanguage;
return stt.langCode;
}
final bool immersionMode = MatrixState
.pangeaController.permissionsController
.isToolEnabled(ToolSetting.immersionMode, room);

View file

@ -4,51 +4,28 @@ import 'package:collection/collection.dart';
import 'package:matrix/matrix.dart';
import 'package:fluffychat/pages/chat/chat.dart';
import 'package:fluffychat/pangea/common/utils/error_handler.dart';
import 'package:fluffychat/pangea/constructs/construct_identifier.dart';
import 'package:fluffychat/pangea/toolbar/reading_assistance_input_row/lemma_emoji_choice_item.dart';
import 'package:fluffychat/widgets/future_loading_dialog.dart';
import 'package:fluffychat/widgets/matrix.dart';
class LemmaReactionPicker extends StatefulWidget {
final ConstructIdentifier cId;
class LemmaReactionPicker extends StatelessWidget {
final List<String> emojis;
final bool loading;
final Event event;
final ChatController controller;
final double? iconSize;
const LemmaReactionPicker({
super.key,
required this.cId,
required this.emojis,
required this.loading,
required this.event,
required this.controller,
this.iconSize,
});
@override
LemmaReactionPickerState createState() => LemmaReactionPickerState();
}
class LemmaReactionPickerState extends State<LemmaReactionPicker> {
List<String> displayEmoji = [];
bool loading = true;
@override
void initState() {
super.initState();
_refresh();
}
@override
void didUpdateWidget(LemmaReactionPicker oldWidget) {
super.didUpdateWidget(oldWidget);
if (oldWidget.cId != widget.cId) {
_refresh();
}
}
void setEmoji(String emoji) {
final allReactionEvents = widget.event.aggregatedEvents(
widget.controller.timeline!,
void setEmoji(String emoji, BuildContext context) {
final allReactionEvents = event.aggregatedEvents(
controller.timeline!,
RelationshipTypes.reaction,
);
@ -65,29 +42,13 @@ class LemmaReactionPickerState extends State<LemmaReactionPicker> {
future: () => reactionEvent.redactEvent(),
);
} else {
widget.controller.room.sendReaction(
widget.event.eventId,
controller.room.sendReaction(
event.eventId,
emoji,
);
}
}
Future<void> _refresh() async {
setState(() {
loading = true;
displayEmoji = [];
});
try {
final info = await widget.cId.getLemmaInfo();
displayEmoji = info.emoji;
} catch (e, s) {
ErrorHandler.logError(data: widget.cId.toJson(), e: e, s: s);
} finally {
if (mounted) setState(() => loading = false);
}
}
@override
Widget build(BuildContext context) {
return Container(
@ -96,19 +57,19 @@ class LemmaReactionPickerState extends State<LemmaReactionPicker> {
child: Row(
mainAxisAlignment: MainAxisAlignment.center,
spacing: 4.0,
children: loading == false
? displayEmoji
children: loading
? [1, 2, 3, 4, 5]
.map(
(e) => const LemmaEmojiChoicePlaceholder(),
)
.toList()
: emojis
.map(
(emoji) => LemmaEmojiChoiceItem(
content: emoji,
onTap: () => setEmoji(emoji),
onTap: () => setEmoji(emoji, context),
),
)
.toList()
: [1, 2, 3, 4, 5]
.map(
(e) => const LemmaEmojiChoicePlaceholder(),
)
.toList(),
),
);

View file

@ -208,7 +208,8 @@ class WordZoomWidget extends StatelessWidget {
iconSize: 24.0,
),
LemmaReactionPicker(
cId: _selectedToken.vocabConstructID,
emojis: controller.lemmaInfo?.emoji ?? [],
loading: controller.isLoading,
event: messageEvent.event,
controller: overlayController.widget.chatController,
),