Merge branch 'main' into public-space-refinement
commit
8c433245a1
@ -1,42 +0,0 @@
|
||||
import 'dart:developer';
|
||||
|
||||
import 'package:flutter/foundation.dart';
|
||||
|
||||
import 'package:matrix/matrix.dart';
|
||||
|
||||
import 'package:fluffychat/pangea/common/utils/error_handler.dart';
|
||||
import 'package:fluffychat/pangea/events/extensions/pangea_event_extension.dart';
|
||||
import 'package:fluffychat/pangea/events/models/tokens_event_content_model.dart';
|
||||
import '../constants/pangea_event_types.dart';
|
||||
|
||||
class TokensEvent {
|
||||
Event event;
|
||||
PangeaMessageTokens? _content;
|
||||
|
||||
TokensEvent({required this.event}) {
|
||||
if (event.type != PangeaEventTypes.tokens) {
|
||||
throw Exception(
|
||||
"${event.type} should not be used to make a TokensEvent",
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
PangeaMessageTokens? get _pangeaMessageTokens {
|
||||
try {
|
||||
_content ??= event.getPangeaContent<PangeaMessageTokens>();
|
||||
return _content!;
|
||||
} catch (err, s) {
|
||||
debugger(when: kDebugMode);
|
||||
ErrorHandler.logError(
|
||||
e: err,
|
||||
s: s,
|
||||
data: {
|
||||
"event": event.toJson(),
|
||||
},
|
||||
);
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
PangeaMessageTokens? get tokens => _pangeaMessageTokens;
|
||||
}
|
||||
@ -0,0 +1,23 @@
|
||||
class SttTranslationModel {
|
||||
final String translation;
|
||||
final String langCode;
|
||||
|
||||
SttTranslationModel({
|
||||
required this.translation,
|
||||
required this.langCode,
|
||||
});
|
||||
|
||||
factory SttTranslationModel.fromJson(Map<String, dynamic> json) {
|
||||
return SttTranslationModel(
|
||||
translation: json['translation'] as String,
|
||||
langCode: json['lang_code'] as String,
|
||||
);
|
||||
}
|
||||
|
||||
Map<String, dynamic> toJson() {
|
||||
return {
|
||||
'translation': translation,
|
||||
'lang_code': langCode,
|
||||
};
|
||||
}
|
||||
}
|
||||
@ -1,119 +0,0 @@
|
||||
import 'dart:developer';
|
||||
|
||||
import 'package:flutter/foundation.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
|
||||
import 'package:fluffychat/config/app_config.dart';
|
||||
import 'package:fluffychat/l10n/l10n.dart';
|
||||
import 'package:fluffychat/pangea/common/utils/error_handler.dart';
|
||||
import 'package:fluffychat/pangea/events/event_wrappers/pangea_message_event.dart';
|
||||
import 'package:fluffychat/pangea/toolbar/models/speech_to_text_models.dart';
|
||||
import 'package:fluffychat/widgets/matrix.dart';
|
||||
|
||||
class MessageSpeechToTextCard extends StatefulWidget {
|
||||
final PangeaMessageEvent messageEvent;
|
||||
final Color textColor;
|
||||
|
||||
const MessageSpeechToTextCard({
|
||||
super.key,
|
||||
required this.messageEvent,
|
||||
required this.textColor,
|
||||
});
|
||||
|
||||
@override
|
||||
MessageSpeechToTextCardState createState() => MessageSpeechToTextCardState();
|
||||
}
|
||||
|
||||
class MessageSpeechToTextCardState extends State<MessageSpeechToTextCard> {
|
||||
SpeechToTextModel? _speechToTextResponse;
|
||||
|
||||
bool _fetchingTranscription = true;
|
||||
Object? error;
|
||||
|
||||
String? get l1Code =>
|
||||
MatrixState.pangeaController.languageController.activeL1Code();
|
||||
String? get l2Code =>
|
||||
MatrixState.pangeaController.languageController.activeL2Code();
|
||||
|
||||
@override
|
||||
void initState() {
|
||||
super.initState();
|
||||
_fetchTranscription();
|
||||
}
|
||||
|
||||
// look for transcription in message event
|
||||
// if not found, call API to transcribe audio
|
||||
Future<void> _fetchTranscription() async {
|
||||
try {
|
||||
if (l1Code == null || l2Code == null) {
|
||||
throw Exception('Language selection not found');
|
||||
}
|
||||
|
||||
_speechToTextResponse ??= await widget.messageEvent.getSpeechToText(
|
||||
l1Code!,
|
||||
l2Code!,
|
||||
);
|
||||
} catch (e, s) {
|
||||
debugger(when: kDebugMode);
|
||||
error = e;
|
||||
ErrorHandler.logError(
|
||||
e: e,
|
||||
s: s,
|
||||
data: widget.messageEvent.event.content,
|
||||
);
|
||||
} finally {
|
||||
if (mounted) {
|
||||
setState(() => _fetchingTranscription = false);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
if (_fetchingTranscription) {
|
||||
return const LinearProgressIndicator();
|
||||
}
|
||||
|
||||
// // done fetching but not results means some kind of error
|
||||
if (_speechToTextResponse == null || error != null) {
|
||||
return Row(
|
||||
spacing: 8.0,
|
||||
children: [
|
||||
Flexible(
|
||||
child: RichText(
|
||||
text: TextSpan(
|
||||
style: AppConfig.messageTextStyle(
|
||||
widget.messageEvent.event,
|
||||
widget.textColor,
|
||||
),
|
||||
children: [
|
||||
WidgetSpan(
|
||||
alignment: PlaceholderAlignment.middle,
|
||||
child: Icon(
|
||||
Icons.error,
|
||||
color: Theme.of(context).colorScheme.error,
|
||||
),
|
||||
),
|
||||
const TextSpan(text: " "),
|
||||
TextSpan(
|
||||
text: L10n.of(context).oopsSomethingWentWrong,
|
||||
),
|
||||
],
|
||||
),
|
||||
),
|
||||
),
|
||||
],
|
||||
);
|
||||
}
|
||||
|
||||
return Text(
|
||||
"${_speechToTextResponse?.transcript.text}",
|
||||
style: AppConfig.messageTextStyle(
|
||||
widget.messageEvent.event,
|
||||
widget.textColor,
|
||||
).copyWith(
|
||||
fontStyle: FontStyle.italic,
|
||||
),
|
||||
);
|
||||
}
|
||||
}
|
||||
Loading…
Reference in New Issue