Merge branch 'main' into find-people-default-avatars

This commit is contained in:
ggurdin 2025-06-26 11:53:52 -04:00
commit f75f09fa47
No known key found for this signature in database
GPG key ID: A01CB41737CBB478
11 changed files with 53 additions and 54 deletions

View file

@ -587,7 +587,6 @@ class ChatListController extends State<ChatList>
if (space != null) {
chatListHandleSpaceTap(
context,
this,
space,
);
}

View file

@ -3,9 +3,7 @@ import 'package:flutter/material.dart';
import 'package:go_router/go_router.dart';
import 'package:matrix/matrix.dart';
import 'package:fluffychat/config/themes.dart';
import 'package:fluffychat/l10n/l10n.dart';
import 'package:fluffychat/pages/chat_list/chat_list.dart';
import 'package:fluffychat/pangea/extensions/pangea_room_extension.dart';
import 'package:fluffychat/widgets/adaptive_dialogs/show_ok_cancel_alert_dialog.dart';
import 'package:fluffychat/widgets/future_loading_dialog.dart';
@ -23,7 +21,7 @@ Future<void> _showInviteDialog(Room room, BuildContext context) async {
cancelLabel: L10n.of(context).decline,
);
await showFutureLoadingDialog(
final resp = await showFutureLoadingDialog(
context: context,
future: () async {
if (acceptInvite == OkCancelResult.ok) {
@ -31,28 +29,24 @@ Future<void> _showInviteDialog(Room room, BuildContext context) async {
context.go(
room.isSpace ? "/rooms?spaceId=${room.id}" : "/rooms/${room.id}",
);
return;
return room.id;
}
await room.leave();
},
);
if (!resp.isError && resp.result is String) {
context.go("/rooms?spaceId=${resp.result}");
}
}
// ignore: curly_braces_in_flow_control_structures
void chatListHandleSpaceTap(
BuildContext context,
ChatListController controller,
Room space,
) {
void setActiveSpaceAndCloseChat() {
controller.setActiveSpace(space.id);
if (FluffyThemes.isColumnMode(context)) {
context.go('/rooms/${space.id}');
} else if (controller.activeChat != null &&
!space.isFirstOrSecondChild(controller.activeChat!)) {
context.go("/rooms");
}
context.go("/rooms?spaceId=${space.id}");
}
void autoJoin(Room space) {

View file

@ -146,7 +146,7 @@ class DeleteSpaceDialogState extends State<DeleteSpaceDialog> {
style: TextStyle(color: Theme.of(context).colorScheme.error),
),
),
Expanded(
Flexible(
child: SingleChildScrollView(
child: Builder(
builder: (context) {

View file

@ -396,7 +396,15 @@ class PangeaMessageEvent {
),
);
}
_representations!.add(sent);
// If originalSent has no tokens, there is not way to generate a tokens event
// and send it as a related event, since original sent has not eventID to set
// as parentEventId. In this case, it's better to generate a new representation
// with an eventID and send the related tokens event to that representation.
// This is a rare situation, and has only been seen with some bot messages.
if (sent.tokens != null) {
_representations!.add(sent);
}
} catch (err, s) {
ErrorHandler.logError(
m: "error parsing originalSent",

View file

@ -127,7 +127,6 @@ class SettingsLearningController extends State<SettingsLearning> {
context: context,
future: () async => pangeaController.userController.updateProfile(
(_) => _profile,
waitForDataInSync: true,
),
);
Navigator.of(context).pop();

View file

@ -80,17 +80,16 @@ class OnboardingController extends State<Onboarding> {
Future<void> startChatWithBot() async {
final resp = await showFutureLoadingDialog<String>(
context: context,
future: () => Matrix.of(context).client.createRoom(
invite: [BotName.byEnvironment],
isDirect: true,
preset: CreateRoomPreset.trustedPrivateChat,
initialState: [
BotOptionsModel(mode: BotMode.directChat).toStateEvent,
RoomDefaults.defaultPowerLevels(
Matrix.of(context).client.userID!,
),
],
future: () => Matrix.of(context).client.startDirectChat(
BotName.byEnvironment,
preset: CreateRoomPreset.trustedPrivateChat,
initialState: [
BotOptionsModel(mode: BotMode.directChat).toStateEvent,
RoomDefaults.defaultPowerLevels(
Matrix.of(context).client.userID!,
),
],
),
);
if (resp.isError) return;
context.go("/rooms/${resp.result}");

View file

@ -58,7 +58,7 @@ class SubscriptionController extends BaseController {
final bool hasSubscription =
currentSubscriptionInfo?.currentSubscriptionId != null;
return hasSubscription;
return hasSubscription || _userController.inTrialWindow();
}
bool _isInitializing = false;

View file

@ -18,8 +18,6 @@ import 'package:fluffychat/pangea/events/event_wrappers/pangea_message_event.dar
import 'package:fluffychat/pangea/events/event_wrappers/pangea_representation_event.dart';
import 'package:fluffychat/pangea/events/models/pangea_token_model.dart';
import 'package:fluffychat/pangea/events/models/pangea_token_text_model.dart';
import 'package:fluffychat/pangea/events/models/tokens_event_content_model.dart';
import 'package:fluffychat/pangea/extensions/pangea_room_extension.dart';
import 'package:fluffychat/pangea/lemmas/lemma_info_response.dart';
import 'package:fluffychat/pangea/practice_activities/activity_type_enum.dart';
import 'package:fluffychat/pangea/practice_activities/practice_activity_model.dart';
@ -135,7 +133,11 @@ class MessageOverlayController extends State<MessageSelectionOverlay>
RepresentationEvent? repEvent =
pangeaMessageEvent?.messageDisplayRepresentation;
repEvent ??= await _fetchNewRepEvent();
if (repEvent == null ||
(repEvent.event == null && repEvent.tokens == null)) {
repEvent = await _fetchNewRepEvent();
}
if (repEvent?.event != null) {
await repEvent!.sendTokensEvent(
@ -145,24 +147,6 @@ class MessageOverlayController extends State<MessageSelectionOverlay>
MatrixState.pangeaController.languageController.userL2!.langCode,
);
}
// If repEvent is originalSent but it's missing tokens, then fetch tokens.
// An edge case, but has happened with some bot message.
else if (repEvent != null &&
repEvent.tokens == null &&
repEvent.content.originalSent) {
final tokens = await repEvent.tokensGlobal(
pangeaMessageEvent!.senderId,
pangeaMessageEvent!.event.originServerTs,
);
await pangeaMessageEvent!.room.pangeaSendTextEvent(
pangeaMessageEvent!.messageDisplayText,
editEventId: pangeaMessageEvent!.eventId,
originalSent: pangeaMessageEvent!.originalSent?.content,
originalWritten: pangeaMessageEvent!.originalWritten?.content,
tokensSent: PangeaMessageTokens(tokens: tokens),
choreo: pangeaMessageEvent!.originalSent?.choreo,
);
}
// Get all the lemma infos
final messageVocabConstructIds = pangeaMessageEvent!

View file

@ -70,9 +70,11 @@ class OverlayCenterContent extends StatelessWidget {
MeasureRenderBox(
onChange: onChangeMessageSize,
child: OverlayMessage(
key: MatrixState.pAnyState
.layerLinkAndKey('overlay_message_${event.eventId}')
.key,
key: isTransitionAnimation
? MatrixState.pAnyState
.layerLinkAndKey('overlay_message_${event.eventId}')
.key
: null,
event,
pangeaMessageEvent: pangeaMessageEvent,
immersionMode: chatController.choreographer.immersionMode,

View file

@ -240,7 +240,7 @@ class SelectModeButtonsState extends State<SelectModeButtons> {
matrix?.audioPlayer?.dispose();
matrix?.audioPlayer = AudioPlayer();
matrix?.voiceMessageEventId.value =
widget.overlayController.pangeaMessageEvent?.eventId;
"${widget.overlayController.pangeaMessageEvent?.eventId}_button";
_onPlayerStateChanged =
matrix?.audioPlayer?.playerStateStream.listen((state) {

View file

@ -7,6 +7,7 @@ import 'package:fluffychat/config/app_config.dart';
import 'package:fluffychat/config/themes.dart';
import 'package:fluffychat/l10n/l10n.dart';
import 'package:fluffychat/pages/chat_list/navi_rail_item.dart';
import 'package:fluffychat/pangea/chat_list/utils/chat_list_handle_space_tap.dart';
import 'package:fluffychat/utils/matrix_sdk_extensions/matrix_locals.dart';
import 'package:fluffychat/utils/stream_extension.dart';
import 'package:fluffychat/widgets/avatar.dart';
@ -175,7 +176,20 @@ class SpacesNavigationRail extends StatelessWidget {
return NaviRailItem(
toolTip: displayname,
isSelected: activeSpaceId == space.id,
onTap: () => onGoToSpaceId(rootSpaces[i].id),
// #Pangea
// onTap: () => onGoToSpaceId(rootSpaces[i].id),
onTap: () {
final room = client.getRoomById(rootSpaces[i].id);
if (room != null) {
chatListHandleSpaceTap(
context,
room,
);
} else {
onGoToSpaceId(rootSpaces[i].id);
}
},
// Pangea#
unreadBadgeFilter: (room) =>
spaceChildrenIds.contains(room.id),
icon: Avatar(