add "discuss" button

This commit is contained in:
OfficialDakari 2025-10-25 19:15:36 +05:00
parent 251ca9893d
commit 9d8f1e3656
57 changed files with 226 additions and 23 deletions

View File

@ -16,6 +16,7 @@
"vote": "Vote", "vote": "Vote",
"changeVote": "Re-vote", "changeVote": "Re-vote",
"choicesSelected": "{selected} of {max} selected", "choicesSelected": "{selected} of {max} selected",
"discuss": "Discuss",
"@choicesSelected": { "@choicesSelected": {
"type": "String", "type": "String",
"placeholders": { "placeholders": {

View File

@ -16,6 +16,7 @@
"vote": "Голосовать", "vote": "Голосовать",
"changeVote": "Изменить ответ", "changeVote": "Изменить ответ",
"choicesSelected": "Выбрано {selected} из {max}", "choicesSelected": "Выбрано {selected} из {max}",
"discuss": "Обсудить",
"@choicesSelected": { "@choicesSelected": {
"type": "String", "type": "String",
"placeholders": { "placeholders": {

View File

@ -283,6 +283,12 @@ abstract class L10n {
/// **'{selected} of {max} selected'** /// **'{selected} of {max} selected'**
String choicesSelected(int selected, int max); String choicesSelected(int selected, int max);
/// No description provided for @discuss.
///
/// In en, this message translates to:
/// **'Discuss'**
String get discuss;
/// No description provided for @pollType. /// No description provided for @pollType.
/// ///
/// In en, this message translates to: /// In en, this message translates to:

View File

@ -56,6 +56,9 @@ class L10nAr extends L10n {
return '$selected of $max selected'; return '$selected of $max selected';
} }
@override
String get discuss => 'Discuss';
@override @override
String get pollType => 'Poll type'; String get pollType => 'Poll type';

View File

@ -56,6 +56,9 @@ class L10nBe extends L10n {
return '$selected of $max selected'; return '$selected of $max selected';
} }
@override
String get discuss => 'Discuss';
@override @override
String get pollType => 'Poll type'; String get pollType => 'Poll type';

View File

@ -56,6 +56,9 @@ class L10nBn extends L10n {
return '$selected of $max selected'; return '$selected of $max selected';
} }
@override
String get discuss => 'Discuss';
@override @override
String get pollType => 'Poll type'; String get pollType => 'Poll type';

View File

@ -56,6 +56,9 @@ class L10nBo extends L10n {
return '$selected of $max selected'; return '$selected of $max selected';
} }
@override
String get discuss => 'Discuss';
@override @override
String get pollType => 'Poll type'; String get pollType => 'Poll type';

View File

@ -56,6 +56,9 @@ class L10nCa extends L10n {
return '$selected of $max selected'; return '$selected of $max selected';
} }
@override
String get discuss => 'Discuss';
@override @override
String get pollType => 'Poll type'; String get pollType => 'Poll type';

View File

@ -56,6 +56,9 @@ class L10nCs extends L10n {
return '$selected of $max selected'; return '$selected of $max selected';
} }
@override
String get discuss => 'Discuss';
@override @override
String get pollType => 'Poll type'; String get pollType => 'Poll type';

View File

@ -56,6 +56,9 @@ class L10nDe extends L10n {
return '$selected of $max selected'; return '$selected of $max selected';
} }
@override
String get discuss => 'Discuss';
@override @override
String get pollType => 'Poll type'; String get pollType => 'Poll type';

View File

@ -56,6 +56,9 @@ class L10nEl extends L10n {
return '$selected of $max selected'; return '$selected of $max selected';
} }
@override
String get discuss => 'Discuss';
@override @override
String get pollType => 'Poll type'; String get pollType => 'Poll type';

View File

@ -56,6 +56,9 @@ class L10nEn extends L10n {
return '$selected of $max selected'; return '$selected of $max selected';
} }
@override
String get discuss => 'Discuss';
@override @override
String get pollType => 'Poll type'; String get pollType => 'Poll type';

View File

@ -56,6 +56,9 @@ class L10nEo extends L10n {
return '$selected of $max selected'; return '$selected of $max selected';
} }
@override
String get discuss => 'Discuss';
@override @override
String get pollType => 'Poll type'; String get pollType => 'Poll type';

View File

@ -56,6 +56,9 @@ class L10nEs extends L10n {
return '$selected of $max selected'; return '$selected of $max selected';
} }
@override
String get discuss => 'Discuss';
@override @override
String get pollType => 'Poll type'; String get pollType => 'Poll type';

View File

@ -56,6 +56,9 @@ class L10nEt extends L10n {
return '$selected of $max selected'; return '$selected of $max selected';
} }
@override
String get discuss => 'Discuss';
@override @override
String get pollType => 'Poll type'; String get pollType => 'Poll type';

View File

@ -56,6 +56,9 @@ class L10nEu extends L10n {
return '$selected of $max selected'; return '$selected of $max selected';
} }
@override
String get discuss => 'Discuss';
@override @override
String get pollType => 'Poll type'; String get pollType => 'Poll type';

View File

@ -56,6 +56,9 @@ class L10nFa extends L10n {
return '$selected of $max selected'; return '$selected of $max selected';
} }
@override
String get discuss => 'Discuss';
@override @override
String get pollType => 'Poll type'; String get pollType => 'Poll type';

View File

@ -56,6 +56,9 @@ class L10nFi extends L10n {
return '$selected of $max selected'; return '$selected of $max selected';
} }
@override
String get discuss => 'Discuss';
@override @override
String get pollType => 'Poll type'; String get pollType => 'Poll type';

View File

@ -56,6 +56,9 @@ class L10nFil extends L10n {
return '$selected of $max selected'; return '$selected of $max selected';
} }
@override
String get discuss => 'Discuss';
@override @override
String get pollType => 'Poll type'; String get pollType => 'Poll type';

View File

@ -56,6 +56,9 @@ class L10nFr extends L10n {
return '$selected of $max selected'; return '$selected of $max selected';
} }
@override
String get discuss => 'Discuss';
@override @override
String get pollType => 'Poll type'; String get pollType => 'Poll type';

View File

@ -56,6 +56,9 @@ class L10nGa extends L10n {
return '$selected of $max selected'; return '$selected of $max selected';
} }
@override
String get discuss => 'Discuss';
@override @override
String get pollType => 'Poll type'; String get pollType => 'Poll type';

View File

@ -56,6 +56,9 @@ class L10nGl extends L10n {
return '$selected of $max selected'; return '$selected of $max selected';
} }
@override
String get discuss => 'Discuss';
@override @override
String get pollType => 'Poll type'; String get pollType => 'Poll type';

View File

@ -56,6 +56,9 @@ class L10nHe extends L10n {
return '$selected of $max selected'; return '$selected of $max selected';
} }
@override
String get discuss => 'Discuss';
@override @override
String get pollType => 'Poll type'; String get pollType => 'Poll type';

View File

@ -56,6 +56,9 @@ class L10nHi extends L10n {
return '$selected of $max selected'; return '$selected of $max selected';
} }
@override
String get discuss => 'Discuss';
@override @override
String get pollType => 'Poll type'; String get pollType => 'Poll type';

View File

@ -56,6 +56,9 @@ class L10nHr extends L10n {
return '$selected of $max selected'; return '$selected of $max selected';
} }
@override
String get discuss => 'Discuss';
@override @override
String get pollType => 'Poll type'; String get pollType => 'Poll type';

View File

@ -56,6 +56,9 @@ class L10nHu extends L10n {
return '$selected of $max selected'; return '$selected of $max selected';
} }
@override
String get discuss => 'Discuss';
@override @override
String get pollType => 'Poll type'; String get pollType => 'Poll type';

View File

@ -56,6 +56,9 @@ class L10nIa extends L10n {
return '$selected of $max selected'; return '$selected of $max selected';
} }
@override
String get discuss => 'Discuss';
@override @override
String get pollType => 'Poll type'; String get pollType => 'Poll type';

View File

@ -56,6 +56,9 @@ class L10nId extends L10n {
return '$selected of $max selected'; return '$selected of $max selected';
} }
@override
String get discuss => 'Discuss';
@override @override
String get pollType => 'Poll type'; String get pollType => 'Poll type';

View File

@ -56,6 +56,9 @@ class L10nIe extends L10n {
return '$selected of $max selected'; return '$selected of $max selected';
} }
@override
String get discuss => 'Discuss';
@override @override
String get pollType => 'Poll type'; String get pollType => 'Poll type';

View File

@ -56,6 +56,9 @@ class L10nIt extends L10n {
return '$selected of $max selected'; return '$selected of $max selected';
} }
@override
String get discuss => 'Discuss';
@override @override
String get pollType => 'Poll type'; String get pollType => 'Poll type';

View File

@ -56,6 +56,9 @@ class L10nJa extends L10n {
return '$selected of $max selected'; return '$selected of $max selected';
} }
@override
String get discuss => 'Discuss';
@override @override
String get pollType => 'Poll type'; String get pollType => 'Poll type';

View File

@ -56,6 +56,9 @@ class L10nKa extends L10n {
return '$selected of $max selected'; return '$selected of $max selected';
} }
@override
String get discuss => 'Discuss';
@override @override
String get pollType => 'Poll type'; String get pollType => 'Poll type';

View File

@ -56,6 +56,9 @@ class L10nKo extends L10n {
return '$selected of $max selected'; return '$selected of $max selected';
} }
@override
String get discuss => 'Discuss';
@override @override
String get pollType => 'Poll type'; String get pollType => 'Poll type';

View File

@ -56,6 +56,9 @@ class L10nLt extends L10n {
return '$selected of $max selected'; return '$selected of $max selected';
} }
@override
String get discuss => 'Discuss';
@override @override
String get pollType => 'Poll type'; String get pollType => 'Poll type';

View File

@ -56,6 +56,9 @@ class L10nLv extends L10n {
return '$selected of $max selected'; return '$selected of $max selected';
} }
@override
String get discuss => 'Discuss';
@override @override
String get pollType => 'Poll type'; String get pollType => 'Poll type';

View File

@ -56,6 +56,9 @@ class L10nNb extends L10n {
return '$selected of $max selected'; return '$selected of $max selected';
} }
@override
String get discuss => 'Discuss';
@override @override
String get pollType => 'Poll type'; String get pollType => 'Poll type';

View File

@ -56,6 +56,9 @@ class L10nNl extends L10n {
return '$selected of $max selected'; return '$selected of $max selected';
} }
@override
String get discuss => 'Discuss';
@override @override
String get pollType => 'Poll type'; String get pollType => 'Poll type';

View File

@ -56,6 +56,9 @@ class L10nPl extends L10n {
return '$selected of $max selected'; return '$selected of $max selected';
} }
@override
String get discuss => 'Discuss';
@override @override
String get pollType => 'Poll type'; String get pollType => 'Poll type';

View File

@ -56,6 +56,9 @@ class L10nPt extends L10n {
return '$selected of $max selected'; return '$selected of $max selected';
} }
@override
String get discuss => 'Discuss';
@override @override
String get pollType => 'Poll type'; String get pollType => 'Poll type';

View File

@ -56,6 +56,9 @@ class L10nRo extends L10n {
return '$selected of $max selected'; return '$selected of $max selected';
} }
@override
String get discuss => 'Discuss';
@override @override
String get pollType => 'Poll type'; String get pollType => 'Poll type';

View File

@ -56,6 +56,9 @@ class L10nRu extends L10n {
return 'Выбрано $selected из $max'; return 'Выбрано $selected из $max';
} }
@override
String get discuss => 'Обсудить';
@override @override
String get pollType => 'Тип опроса'; String get pollType => 'Тип опроса';

View File

@ -56,6 +56,9 @@ class L10nSk extends L10n {
return '$selected of $max selected'; return '$selected of $max selected';
} }
@override
String get discuss => 'Discuss';
@override @override
String get pollType => 'Poll type'; String get pollType => 'Poll type';

View File

@ -56,6 +56,9 @@ class L10nSl extends L10n {
return '$selected of $max selected'; return '$selected of $max selected';
} }
@override
String get discuss => 'Discuss';
@override @override
String get pollType => 'Poll type'; String get pollType => 'Poll type';

View File

@ -56,6 +56,9 @@ class L10nSr extends L10n {
return '$selected of $max selected'; return '$selected of $max selected';
} }
@override
String get discuss => 'Discuss';
@override @override
String get pollType => 'Poll type'; String get pollType => 'Poll type';

View File

@ -56,6 +56,9 @@ class L10nSv extends L10n {
return '$selected of $max selected'; return '$selected of $max selected';
} }
@override
String get discuss => 'Discuss';
@override @override
String get pollType => 'Poll type'; String get pollType => 'Poll type';

View File

@ -56,6 +56,9 @@ class L10nTa extends L10n {
return '$selected of $max selected'; return '$selected of $max selected';
} }
@override
String get discuss => 'Discuss';
@override @override
String get pollType => 'Poll type'; String get pollType => 'Poll type';

View File

@ -56,6 +56,9 @@ class L10nTe extends L10n {
return '$selected of $max selected'; return '$selected of $max selected';
} }
@override
String get discuss => 'Discuss';
@override @override
String get pollType => 'Poll type'; String get pollType => 'Poll type';

View File

@ -56,6 +56,9 @@ class L10nTh extends L10n {
return '$selected of $max selected'; return '$selected of $max selected';
} }
@override
String get discuss => 'Discuss';
@override @override
String get pollType => 'Poll type'; String get pollType => 'Poll type';

View File

@ -56,6 +56,9 @@ class L10nTr extends L10n {
return '$selected of $max selected'; return '$selected of $max selected';
} }
@override
String get discuss => 'Discuss';
@override @override
String get pollType => 'Poll type'; String get pollType => 'Poll type';

View File

@ -56,6 +56,9 @@ class L10nUk extends L10n {
return '$selected of $max selected'; return '$selected of $max selected';
} }
@override
String get discuss => 'Discuss';
@override @override
String get pollType => 'Poll type'; String get pollType => 'Poll type';

View File

@ -56,6 +56,9 @@ class L10nVi extends L10n {
return '$selected of $max selected'; return '$selected of $max selected';
} }
@override
String get discuss => 'Discuss';
@override @override
String get pollType => 'Poll type'; String get pollType => 'Poll type';

View File

@ -56,6 +56,9 @@ class L10nZh extends L10n {
return '$selected of $max selected'; return '$selected of $max selected';
} }
@override
String get discuss => 'Discuss';
@override @override
String get pollType => 'Poll type'; String get pollType => 'Poll type';

View File

@ -948,6 +948,22 @@ class ChatController extends State<ChatPageWithRoom>
} }
} }
void discussAction() async {
final event = selectedEvents.first;
if (!room.threads.containsKey(event.eventId)) {
room.threads[event.eventId] = Thread(
room: room,
rootEvent: event,
client: room.client,
currentUserParticipated: false,
count: 0,
);
}
context.go('/rooms/$roomId/${event.eventId}');
selectedEvents.clear();
}
void endPollAction() async { void endPollAction() async {
final event = selectedEvents.first; final event = selectedEvents.first;
final client = currentRoomBundle.firstWhere( final client = currentRoomBundle.firstWhere(

View File

@ -31,22 +31,40 @@ class ChatAppBarTitle extends StatelessWidget {
hoverColor: Colors.transparent, hoverColor: Colors.transparent,
splashColor: Colors.transparent, splashColor: Colors.transparent,
highlightColor: Colors.transparent, highlightColor: Colors.transparent,
onTap: controller.isArchived onTap: () {
? null if (controller.thread != null) {
: () => FluffyThemes.isThreeColumnMode(context) if (context.canPop()) {
? controller.toggleDisplayChatDetailsColumn() context.pop();
: context.go('/rooms/${room.id}/details'), } else {
context.go('/rooms/${room.id}');
}
return;
}
if (!controller.isArchived) {
if (FluffyThemes.isThreeColumnMode(context)) {
controller.toggleDisplayChatDetailsColumn();
} else {
context.go('/rooms/${room.id}/details');
}
}
},
child: Row( child: Row(
children: [ children: [
Hero( Hero(
tag: 'content_banner', tag: 'content_banner',
child: Avatar( child: controller.thread == null
mxContent: room.avatar, ? Avatar(
name: room.getLocalizedDisplayname( mxContent: room.avatar,
MatrixLocals(L10n.of(context)), name: room.getLocalizedDisplayname(
), MatrixLocals(L10n.of(context)),
size: 32, ),
), size: 32,
)
: Icon(
Icons.chat_bubble_outline,
color: Colors.grey[200],
size: 20,
),
), ),
const SizedBox(width: 12), const SizedBox(width: 12),
Expanded( Expanded(
@ -54,7 +72,10 @@ class ChatAppBarTitle extends StatelessWidget {
crossAxisAlignment: CrossAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start,
children: [ children: [
Text( Text(
room.getLocalizedDisplayname(MatrixLocals(L10n.of(context))), controller.thread == null
? room.getLocalizedDisplayname(
MatrixLocals(L10n.of(context)))
: '${controller.thread!.rootEvent.senderFromMemoryOrFallback.displayName ?? controller.thread!.rootEvent.senderId}: ${controller.thread!.rootEvent.text}',
maxLines: 1, maxLines: 1,
overflow: TextOverflow.ellipsis, overflow: TextOverflow.ellipsis,
style: const TextStyle( style: const TextStyle(

View File

@ -48,12 +48,20 @@ class ChatView extends StatelessWidget {
tooltip: L10n.of(context).copy, tooltip: L10n.of(context).copy,
onPressed: controller.copyEventsAction, onPressed: controller.copyEventsAction,
), ),
if (controller.selectedEvents.length == 1 && controller.selectedEvents.single.content['xyz.extera.translated'] == null) if (controller.selectedEvents.length == 1)
IconButton( IconButton(
icon: const Icon(Icons.translate_outlined), onPressed: controller.discussAction,
tooltip: L10n.of(context).translateMessage, icon: const Icon(Icons.chat_bubble_outline),
onPressed: controller.translateEventAction, tooltip: L10n.of(context).discuss,
), ),
if (controller.selectedEvents.length == 1 &&
controller.selectedEvents.single.content['xyz.extera.translated'] ==
null)
IconButton(
icon: const Icon(Icons.translate_outlined),
tooltip: L10n.of(context).translateMessage,
onPressed: controller.translateEventAction,
),
if (controller.canSaveSelectedEvent) if (controller.canSaveSelectedEvent)
// Use builder context to correctly position the share dialog on iPad // Use builder context to correctly position the share dialog on iPad
Builder( Builder(
@ -118,8 +126,10 @@ class ChatView extends StatelessWidget {
Text(L10n.of(context).recoverMessage), Text(L10n.of(context).recoverMessage),
]), ]),
), ),
if (controller.selectedEvents.single.type == 'org.matrix.msc3381.poll.start' && controller.selectedEvents.single.senderId == Matrix.of(context).client.userID) if (controller.selectedEvents.single.type ==
'org.matrix.msc3381.poll.start' &&
controller.selectedEvents.single.senderId ==
Matrix.of(context).client.userID)
PopupMenuItem( PopupMenuItem(
value: _EventContextAction.endPoll, value: _EventContextAction.endPoll,
child: Row( child: Row(

View File

@ -3,7 +3,6 @@ import 'dart:ui' as ui;
import 'package:emoji_picker_flutter/emoji_picker_flutter.dart'; import 'package:emoji_picker_flutter/emoji_picker_flutter.dart';
import 'package:extera_next/utils/adaptive_bottom_sheet.dart'; import 'package:extera_next/utils/adaptive_bottom_sheet.dart';
import 'package:extera_next/utils/poll_events.dart'; import 'package:extera_next/utils/poll_events.dart';
import 'package:extera_next/widgets/mxc_image.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter/services.dart'; import 'package:flutter/services.dart';
@ -733,7 +732,8 @@ class Message extends StatelessWidget {
const SizedBox(width: 6), const SizedBox(width: 6),
thread!.lastEvent != null thread!.lastEvent != null
? Text( ? Text(
thread!.lastEvent!.text) thread!.lastEvent!.text,
)
: const Text('Thread'), : const Text('Thread'),
], ],
), ),

View File

@ -3,6 +3,7 @@ import 'package:extera_next/pages/chat/chat.dart';
import 'package:extera_next/widgets/matrix.dart'; import 'package:extera_next/widgets/matrix.dart';
import 'package:extera_next/widgets/share_scaffold_dialog.dart'; import 'package:extera_next/widgets/share_scaffold_dialog.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:matrix/matrix.dart';
class ThreadPage extends StatelessWidget { class ThreadPage extends StatelessWidget {
final String roomId; final String roomId;