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",
"changeVote": "Re-vote",
"choicesSelected": "{selected} of {max} selected",
"discuss": "Discuss",
"@choicesSelected": {
"type": "String",
"placeholders": {

View File

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

View File

@ -283,6 +283,12 @@ abstract class L10n {
/// **'{selected} of {max} selected'**
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.
///
/// In en, this message translates to:

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -56,6 +56,9 @@ class L10nZh extends L10n {
return '$selected of $max selected';
}
@override
String get discuss => 'Discuss';
@override
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 {
final event = selectedEvents.first;
final client = currentRoomBundle.firstWhere(

View File

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

View File

@ -48,12 +48,20 @@ class ChatView extends StatelessWidget {
tooltip: L10n.of(context).copy,
onPressed: controller.copyEventsAction,
),
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.selectedEvents.length == 1)
IconButton(
onPressed: controller.discussAction,
icon: const Icon(Icons.chat_bubble_outline),
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)
// Use builder context to correctly position the share dialog on iPad
Builder(
@ -118,8 +126,10 @@ class ChatView extends StatelessWidget {
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(
value: _EventContextAction.endPoll,
child: Row(

View File

@ -3,7 +3,6 @@ import 'dart:ui' as ui;
import 'package:emoji_picker_flutter/emoji_picker_flutter.dart';
import 'package:extera_next/utils/adaptive_bottom_sheet.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/services.dart';
@ -733,7 +732,8 @@ class Message extends StatelessWidget {
const SizedBox(width: 6),
thread!.lastEvent != null
? Text(
thread!.lastEvent!.text)
thread!.lastEvent!.text,
)
: 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/share_scaffold_dialog.dart';
import 'package:flutter/material.dart';
import 'package:matrix/matrix.dart';
class ThreadPage extends StatelessWidget {
final String roomId;