Merge pull request #643 from pangeachat/merge-in-dev-changes

Merge in dev changes
pull/1384/head
ggurdin 1 year ago committed by GitHub
commit ccae4c8704
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194

@ -4,12 +4,14 @@ import 'dart:developer';
import 'package:fluffychat/pangea/choreographer/controllers/choreographer.dart'; import 'package:fluffychat/pangea/choreographer/controllers/choreographer.dart';
import 'package:fluffychat/pangea/choreographer/controllers/error_service.dart'; import 'package:fluffychat/pangea/choreographer/controllers/error_service.dart';
import 'package:fluffychat/pangea/choreographer/controllers/span_data_controller.dart'; import 'package:fluffychat/pangea/choreographer/controllers/span_data_controller.dart';
import 'package:fluffychat/pangea/matrix_event_wrappers/pangea_message_event.dart';
import 'package:fluffychat/pangea/models/igc_text_data_model.dart'; import 'package:fluffychat/pangea/models/igc_text_data_model.dart';
import 'package:fluffychat/pangea/models/pangea_match_model.dart'; import 'package:fluffychat/pangea/models/pangea_match_model.dart';
import 'package:fluffychat/pangea/repo/igc_repo.dart'; import 'package:fluffychat/pangea/repo/igc_repo.dart';
import 'package:fluffychat/pangea/widgets/igc/span_card.dart'; import 'package:fluffychat/pangea/widgets/igc/span_card.dart';
import 'package:flutter/foundation.dart'; import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:matrix/matrix.dart';
import '../../models/span_card_model.dart'; import '../../models/span_card_model.dart';
import '../../utils/error_handler.dart'; import '../../utils/error_handler.dart';
@ -43,6 +45,7 @@ class IgcController {
userL2: choreographer.l2LangCode!, userL2: choreographer.l2LangCode!,
enableIGC: choreographer.igcEnabled && !onlyTokensAndLanguageDetection, enableIGC: choreographer.igcEnabled && !onlyTokensAndLanguageDetection,
enableIT: choreographer.itEnabled && !onlyTokensAndLanguageDetection, enableIT: choreographer.itEnabled && !onlyTokensAndLanguageDetection,
prevMessages: prevMessages(),
); );
final IGCTextData igcTextDataResponse = await IgcRepo.getIGC( final IGCTextData igcTextDataResponse = await IgcRepo.getIGC(
@ -125,6 +128,49 @@ class IgcController {
); );
} }
/// Get the content of previous text and audio messages in chat.
/// Passed to IGC request to add context.
List<PreviousMessage> prevMessages({int numMessages = 5}) {
final List<Event> events = choreographer.chatController.visibleEvents
.where(
(e) =>
e.type == EventTypes.Message &&
(e.messageType == MessageTypes.Text ||
e.messageType == MessageTypes.Audio),
)
.toList();
final List<PreviousMessage> messages = [];
for (final Event event in events) {
final String? content = event.messageType == MessageTypes.Text
? event.content.toString()
: PangeaMessageEvent(
event: event,
timeline: choreographer.chatController.timeline!,
ownMessage: event.senderId ==
choreographer.pangeaController.matrixState.client.userID,
)
.getSpeechToTextLocal(
choreographer.l1LangCode,
choreographer.l2LangCode,
)
?.transcript
.text;
if (content == null) continue;
messages.add(
PreviousMessage(
content: content,
sender: event.senderId,
timestamp: event.originServerTs,
),
);
if (messages.length >= numMessages) {
return messages;
}
}
return messages;
}
bool get hasRelevantIGCTextData { bool get hasRelevantIGCTextData {
if (igcTextData == null) return false; if (igcTextData == null) return false;

@ -69,6 +69,10 @@ class ModelKey {
static const String permissions = "permissions"; static const String permissions = "permissions";
static const String enableIGC = "enable_igc"; static const String enableIGC = "enable_igc";
static const String enableIT = "enable_it"; static const String enableIT = "enable_it";
static const String prevMessages = "prev_messages";
static const String prevContent = "prev_content";
static const String prevSender = "prev_sender";
static const String prevTimestamp = "prev_timestamp";
static const String originalSent = "original_sent"; static const String originalSent = "original_sent";
static const String originalWritten = "original_written"; static const String originalWritten = "original_written";

@ -269,6 +269,21 @@ class PangeaMessageEvent {
null; null;
}).toSet(); }).toSet();
SpeechToTextModel? getSpeechToTextLocal(
String? l1Code,
String? l2Code,
) {
if (l1Code == null || l2Code == null) {
return null;
}
return representations
.firstWhereOrNull(
(element) => element.content.speechToText != null,
)
?.content
.speechToText;
}
Future<SpeechToTextModel?> getSpeechToText( Future<SpeechToTextModel?> getSpeechToText(
String l1Code, String l1Code,
String l2Code, String l2Code,

@ -94,12 +94,42 @@ class IgcRepo {
} }
} }
/// Previous text/audio message sent in chat
/// Contain message content, sender, and timestamp
class PreviousMessage {
String content;
String sender;
DateTime timestamp;
PreviousMessage({
required this.content,
required this.sender,
required this.timestamp,
});
factory PreviousMessage.fromJson(Map<String, dynamic> json) =>
PreviousMessage(
content: json[ModelKey.prevContent] ?? "",
sender: json[ModelKey.prevSender] ?? "",
timestamp: json[ModelKey.prevTimestamp] == null
? DateTime.now()
: DateTime.parse(json[ModelKey.prevTimestamp]),
);
Map<String, dynamic> toJson() => {
ModelKey.prevContent: content,
ModelKey.prevSender: sender,
ModelKey.prevTimestamp: timestamp.toIso8601String(),
};
}
class IGCRequestBody { class IGCRequestBody {
String fullText; String fullText;
String userL1; String userL1;
String userL2; String userL2;
bool enableIT; bool enableIT;
bool enableIGC; bool enableIGC;
List<PreviousMessage> prevMessages;
IGCRequestBody({ IGCRequestBody({
required this.fullText, required this.fullText,
@ -107,6 +137,7 @@ class IGCRequestBody {
required this.userL2, required this.userL2,
required this.enableIGC, required this.enableIGC,
required this.enableIT, required this.enableIT,
required this.prevMessages,
}); });
Map<String, dynamic> toJson() => { Map<String, dynamic> toJson() => {
@ -115,5 +146,7 @@ class IGCRequestBody {
ModelKey.userL2: userL2, ModelKey.userL2: userL2,
"enable_it": enableIT, "enable_it": enableIT,
"enable_igc": enableIGC, "enable_igc": enableIGC,
ModelKey.prevMessages:
jsonEncode(prevMessages.map((x) => x.toJson()).toList()),
}; };
} }

@ -59,8 +59,12 @@ class ToolbarDisplayController {
} }
void showToolbar(BuildContext context, {MessageMode? mode}) { void showToolbar(BuildContext context, {MessageMode? mode}) {
// Close keyboard, if open // Don't show toolbar if keyboard open
FocusManager.instance.primaryFocus?.unfocus(); if (controller.inputFocus.hasFocus) {
FocusManager.instance.primaryFocus?.unfocus();
return;
}
bool toolbarUp = true; bool toolbarUp = true;
if (highlighted) return; if (highlighted) return;
if (controller.selectMode) { if (controller.selectMode) {
@ -86,13 +90,12 @@ class ToolbarDisplayController {
if (targetOffset.dy < 320) { if (targetOffset.dy < 320) {
final spaceBeneath = MediaQuery.of(context).size.height - final spaceBeneath = MediaQuery.of(context).size.height -
(targetOffset.dy + transformTargetSize.height); (targetOffset.dy + transformTargetSize.height);
// If toolbar is open, opening toolbar beneath without scrolling can cause issues if (spaceBeneath >= 320) {
// if (spaceBeneath >= 320) { toolbarUp = false;
// toolbarUp = false; }
// }
// See if it's possible to scroll up to make space // See if it's possible to scroll up to make space
if (controller.scrollController.offset - targetOffset.dy + 320 >= else if (controller.scrollController.offset - targetOffset.dy + 320 >=
controller.scrollController.position.minScrollExtent && controller.scrollController.position.minScrollExtent &&
controller.scrollController.offset - targetOffset.dy + 320 <= controller.scrollController.offset - targetOffset.dy + 320 <=
controller.scrollController.position.maxScrollExtent) { controller.scrollController.position.maxScrollExtent) {

Loading…
Cancel
Save