add "discuss" button
This commit is contained in:
parent
251ca9893d
commit
9d8f1e3656
|
|
@ -16,6 +16,7 @@
|
|||
"vote": "Vote",
|
||||
"changeVote": "Re-vote",
|
||||
"choicesSelected": "{selected} of {max} selected",
|
||||
"discuss": "Discuss",
|
||||
"@choicesSelected": {
|
||||
"type": "String",
|
||||
"placeholders": {
|
||||
|
|
|
|||
|
|
@ -16,6 +16,7 @@
|
|||
"vote": "Голосовать",
|
||||
"changeVote": "Изменить ответ",
|
||||
"choicesSelected": "Выбрано {selected} из {max}",
|
||||
"discuss": "Обсудить",
|
||||
"@choicesSelected": {
|
||||
"type": "String",
|
||||
"placeholders": {
|
||||
|
|
|
|||
|
|
@ -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:
|
||||
|
|
|
|||
|
|
@ -56,6 +56,9 @@ class L10nAr extends L10n {
|
|||
return '$selected of $max selected';
|
||||
}
|
||||
|
||||
@override
|
||||
String get discuss => 'Discuss';
|
||||
|
||||
@override
|
||||
String get pollType => 'Poll type';
|
||||
|
||||
|
|
|
|||
|
|
@ -56,6 +56,9 @@ class L10nBe extends L10n {
|
|||
return '$selected of $max selected';
|
||||
}
|
||||
|
||||
@override
|
||||
String get discuss => 'Discuss';
|
||||
|
||||
@override
|
||||
String get pollType => 'Poll type';
|
||||
|
||||
|
|
|
|||
|
|
@ -56,6 +56,9 @@ class L10nBn extends L10n {
|
|||
return '$selected of $max selected';
|
||||
}
|
||||
|
||||
@override
|
||||
String get discuss => 'Discuss';
|
||||
|
||||
@override
|
||||
String get pollType => 'Poll type';
|
||||
|
||||
|
|
|
|||
|
|
@ -56,6 +56,9 @@ class L10nBo extends L10n {
|
|||
return '$selected of $max selected';
|
||||
}
|
||||
|
||||
@override
|
||||
String get discuss => 'Discuss';
|
||||
|
||||
@override
|
||||
String get pollType => 'Poll type';
|
||||
|
||||
|
|
|
|||
|
|
@ -56,6 +56,9 @@ class L10nCa extends L10n {
|
|||
return '$selected of $max selected';
|
||||
}
|
||||
|
||||
@override
|
||||
String get discuss => 'Discuss';
|
||||
|
||||
@override
|
||||
String get pollType => 'Poll type';
|
||||
|
||||
|
|
|
|||
|
|
@ -56,6 +56,9 @@ class L10nCs extends L10n {
|
|||
return '$selected of $max selected';
|
||||
}
|
||||
|
||||
@override
|
||||
String get discuss => 'Discuss';
|
||||
|
||||
@override
|
||||
String get pollType => 'Poll type';
|
||||
|
||||
|
|
|
|||
|
|
@ -56,6 +56,9 @@ class L10nDe extends L10n {
|
|||
return '$selected of $max selected';
|
||||
}
|
||||
|
||||
@override
|
||||
String get discuss => 'Discuss';
|
||||
|
||||
@override
|
||||
String get pollType => 'Poll type';
|
||||
|
||||
|
|
|
|||
|
|
@ -56,6 +56,9 @@ class L10nEl extends L10n {
|
|||
return '$selected of $max selected';
|
||||
}
|
||||
|
||||
@override
|
||||
String get discuss => 'Discuss';
|
||||
|
||||
@override
|
||||
String get pollType => 'Poll type';
|
||||
|
||||
|
|
|
|||
|
|
@ -56,6 +56,9 @@ class L10nEn extends L10n {
|
|||
return '$selected of $max selected';
|
||||
}
|
||||
|
||||
@override
|
||||
String get discuss => 'Discuss';
|
||||
|
||||
@override
|
||||
String get pollType => 'Poll type';
|
||||
|
||||
|
|
|
|||
|
|
@ -56,6 +56,9 @@ class L10nEo extends L10n {
|
|||
return '$selected of $max selected';
|
||||
}
|
||||
|
||||
@override
|
||||
String get discuss => 'Discuss';
|
||||
|
||||
@override
|
||||
String get pollType => 'Poll type';
|
||||
|
||||
|
|
|
|||
|
|
@ -56,6 +56,9 @@ class L10nEs extends L10n {
|
|||
return '$selected of $max selected';
|
||||
}
|
||||
|
||||
@override
|
||||
String get discuss => 'Discuss';
|
||||
|
||||
@override
|
||||
String get pollType => 'Poll type';
|
||||
|
||||
|
|
|
|||
|
|
@ -56,6 +56,9 @@ class L10nEt extends L10n {
|
|||
return '$selected of $max selected';
|
||||
}
|
||||
|
||||
@override
|
||||
String get discuss => 'Discuss';
|
||||
|
||||
@override
|
||||
String get pollType => 'Poll type';
|
||||
|
||||
|
|
|
|||
|
|
@ -56,6 +56,9 @@ class L10nEu extends L10n {
|
|||
return '$selected of $max selected';
|
||||
}
|
||||
|
||||
@override
|
||||
String get discuss => 'Discuss';
|
||||
|
||||
@override
|
||||
String get pollType => 'Poll type';
|
||||
|
||||
|
|
|
|||
|
|
@ -56,6 +56,9 @@ class L10nFa extends L10n {
|
|||
return '$selected of $max selected';
|
||||
}
|
||||
|
||||
@override
|
||||
String get discuss => 'Discuss';
|
||||
|
||||
@override
|
||||
String get pollType => 'Poll type';
|
||||
|
||||
|
|
|
|||
|
|
@ -56,6 +56,9 @@ class L10nFi extends L10n {
|
|||
return '$selected of $max selected';
|
||||
}
|
||||
|
||||
@override
|
||||
String get discuss => 'Discuss';
|
||||
|
||||
@override
|
||||
String get pollType => 'Poll type';
|
||||
|
||||
|
|
|
|||
|
|
@ -56,6 +56,9 @@ class L10nFil extends L10n {
|
|||
return '$selected of $max selected';
|
||||
}
|
||||
|
||||
@override
|
||||
String get discuss => 'Discuss';
|
||||
|
||||
@override
|
||||
String get pollType => 'Poll type';
|
||||
|
||||
|
|
|
|||
|
|
@ -56,6 +56,9 @@ class L10nFr extends L10n {
|
|||
return '$selected of $max selected';
|
||||
}
|
||||
|
||||
@override
|
||||
String get discuss => 'Discuss';
|
||||
|
||||
@override
|
||||
String get pollType => 'Poll type';
|
||||
|
||||
|
|
|
|||
|
|
@ -56,6 +56,9 @@ class L10nGa extends L10n {
|
|||
return '$selected of $max selected';
|
||||
}
|
||||
|
||||
@override
|
||||
String get discuss => 'Discuss';
|
||||
|
||||
@override
|
||||
String get pollType => 'Poll type';
|
||||
|
||||
|
|
|
|||
|
|
@ -56,6 +56,9 @@ class L10nGl extends L10n {
|
|||
return '$selected of $max selected';
|
||||
}
|
||||
|
||||
@override
|
||||
String get discuss => 'Discuss';
|
||||
|
||||
@override
|
||||
String get pollType => 'Poll type';
|
||||
|
||||
|
|
|
|||
|
|
@ -56,6 +56,9 @@ class L10nHe extends L10n {
|
|||
return '$selected of $max selected';
|
||||
}
|
||||
|
||||
@override
|
||||
String get discuss => 'Discuss';
|
||||
|
||||
@override
|
||||
String get pollType => 'Poll type';
|
||||
|
||||
|
|
|
|||
|
|
@ -56,6 +56,9 @@ class L10nHi extends L10n {
|
|||
return '$selected of $max selected';
|
||||
}
|
||||
|
||||
@override
|
||||
String get discuss => 'Discuss';
|
||||
|
||||
@override
|
||||
String get pollType => 'Poll type';
|
||||
|
||||
|
|
|
|||
|
|
@ -56,6 +56,9 @@ class L10nHr extends L10n {
|
|||
return '$selected of $max selected';
|
||||
}
|
||||
|
||||
@override
|
||||
String get discuss => 'Discuss';
|
||||
|
||||
@override
|
||||
String get pollType => 'Poll type';
|
||||
|
||||
|
|
|
|||
|
|
@ -56,6 +56,9 @@ class L10nHu extends L10n {
|
|||
return '$selected of $max selected';
|
||||
}
|
||||
|
||||
@override
|
||||
String get discuss => 'Discuss';
|
||||
|
||||
@override
|
||||
String get pollType => 'Poll type';
|
||||
|
||||
|
|
|
|||
|
|
@ -56,6 +56,9 @@ class L10nIa extends L10n {
|
|||
return '$selected of $max selected';
|
||||
}
|
||||
|
||||
@override
|
||||
String get discuss => 'Discuss';
|
||||
|
||||
@override
|
||||
String get pollType => 'Poll type';
|
||||
|
||||
|
|
|
|||
|
|
@ -56,6 +56,9 @@ class L10nId extends L10n {
|
|||
return '$selected of $max selected';
|
||||
}
|
||||
|
||||
@override
|
||||
String get discuss => 'Discuss';
|
||||
|
||||
@override
|
||||
String get pollType => 'Poll type';
|
||||
|
||||
|
|
|
|||
|
|
@ -56,6 +56,9 @@ class L10nIe extends L10n {
|
|||
return '$selected of $max selected';
|
||||
}
|
||||
|
||||
@override
|
||||
String get discuss => 'Discuss';
|
||||
|
||||
@override
|
||||
String get pollType => 'Poll type';
|
||||
|
||||
|
|
|
|||
|
|
@ -56,6 +56,9 @@ class L10nIt extends L10n {
|
|||
return '$selected of $max selected';
|
||||
}
|
||||
|
||||
@override
|
||||
String get discuss => 'Discuss';
|
||||
|
||||
@override
|
||||
String get pollType => 'Poll type';
|
||||
|
||||
|
|
|
|||
|
|
@ -56,6 +56,9 @@ class L10nJa extends L10n {
|
|||
return '$selected of $max selected';
|
||||
}
|
||||
|
||||
@override
|
||||
String get discuss => 'Discuss';
|
||||
|
||||
@override
|
||||
String get pollType => 'Poll type';
|
||||
|
||||
|
|
|
|||
|
|
@ -56,6 +56,9 @@ class L10nKa extends L10n {
|
|||
return '$selected of $max selected';
|
||||
}
|
||||
|
||||
@override
|
||||
String get discuss => 'Discuss';
|
||||
|
||||
@override
|
||||
String get pollType => 'Poll type';
|
||||
|
||||
|
|
|
|||
|
|
@ -56,6 +56,9 @@ class L10nKo extends L10n {
|
|||
return '$selected of $max selected';
|
||||
}
|
||||
|
||||
@override
|
||||
String get discuss => 'Discuss';
|
||||
|
||||
@override
|
||||
String get pollType => 'Poll type';
|
||||
|
||||
|
|
|
|||
|
|
@ -56,6 +56,9 @@ class L10nLt extends L10n {
|
|||
return '$selected of $max selected';
|
||||
}
|
||||
|
||||
@override
|
||||
String get discuss => 'Discuss';
|
||||
|
||||
@override
|
||||
String get pollType => 'Poll type';
|
||||
|
||||
|
|
|
|||
|
|
@ -56,6 +56,9 @@ class L10nLv extends L10n {
|
|||
return '$selected of $max selected';
|
||||
}
|
||||
|
||||
@override
|
||||
String get discuss => 'Discuss';
|
||||
|
||||
@override
|
||||
String get pollType => 'Poll type';
|
||||
|
||||
|
|
|
|||
|
|
@ -56,6 +56,9 @@ class L10nNb extends L10n {
|
|||
return '$selected of $max selected';
|
||||
}
|
||||
|
||||
@override
|
||||
String get discuss => 'Discuss';
|
||||
|
||||
@override
|
||||
String get pollType => 'Poll type';
|
||||
|
||||
|
|
|
|||
|
|
@ -56,6 +56,9 @@ class L10nNl extends L10n {
|
|||
return '$selected of $max selected';
|
||||
}
|
||||
|
||||
@override
|
||||
String get discuss => 'Discuss';
|
||||
|
||||
@override
|
||||
String get pollType => 'Poll type';
|
||||
|
||||
|
|
|
|||
|
|
@ -56,6 +56,9 @@ class L10nPl extends L10n {
|
|||
return '$selected of $max selected';
|
||||
}
|
||||
|
||||
@override
|
||||
String get discuss => 'Discuss';
|
||||
|
||||
@override
|
||||
String get pollType => 'Poll type';
|
||||
|
||||
|
|
|
|||
|
|
@ -56,6 +56,9 @@ class L10nPt extends L10n {
|
|||
return '$selected of $max selected';
|
||||
}
|
||||
|
||||
@override
|
||||
String get discuss => 'Discuss';
|
||||
|
||||
@override
|
||||
String get pollType => 'Poll type';
|
||||
|
||||
|
|
|
|||
|
|
@ -56,6 +56,9 @@ class L10nRo extends L10n {
|
|||
return '$selected of $max selected';
|
||||
}
|
||||
|
||||
@override
|
||||
String get discuss => 'Discuss';
|
||||
|
||||
@override
|
||||
String get pollType => 'Poll type';
|
||||
|
||||
|
|
|
|||
|
|
@ -56,6 +56,9 @@ class L10nRu extends L10n {
|
|||
return 'Выбрано $selected из $max';
|
||||
}
|
||||
|
||||
@override
|
||||
String get discuss => 'Обсудить';
|
||||
|
||||
@override
|
||||
String get pollType => 'Тип опроса';
|
||||
|
||||
|
|
|
|||
|
|
@ -56,6 +56,9 @@ class L10nSk extends L10n {
|
|||
return '$selected of $max selected';
|
||||
}
|
||||
|
||||
@override
|
||||
String get discuss => 'Discuss';
|
||||
|
||||
@override
|
||||
String get pollType => 'Poll type';
|
||||
|
||||
|
|
|
|||
|
|
@ -56,6 +56,9 @@ class L10nSl extends L10n {
|
|||
return '$selected of $max selected';
|
||||
}
|
||||
|
||||
@override
|
||||
String get discuss => 'Discuss';
|
||||
|
||||
@override
|
||||
String get pollType => 'Poll type';
|
||||
|
||||
|
|
|
|||
|
|
@ -56,6 +56,9 @@ class L10nSr extends L10n {
|
|||
return '$selected of $max selected';
|
||||
}
|
||||
|
||||
@override
|
||||
String get discuss => 'Discuss';
|
||||
|
||||
@override
|
||||
String get pollType => 'Poll type';
|
||||
|
||||
|
|
|
|||
|
|
@ -56,6 +56,9 @@ class L10nSv extends L10n {
|
|||
return '$selected of $max selected';
|
||||
}
|
||||
|
||||
@override
|
||||
String get discuss => 'Discuss';
|
||||
|
||||
@override
|
||||
String get pollType => 'Poll type';
|
||||
|
||||
|
|
|
|||
|
|
@ -56,6 +56,9 @@ class L10nTa extends L10n {
|
|||
return '$selected of $max selected';
|
||||
}
|
||||
|
||||
@override
|
||||
String get discuss => 'Discuss';
|
||||
|
||||
@override
|
||||
String get pollType => 'Poll type';
|
||||
|
||||
|
|
|
|||
|
|
@ -56,6 +56,9 @@ class L10nTe extends L10n {
|
|||
return '$selected of $max selected';
|
||||
}
|
||||
|
||||
@override
|
||||
String get discuss => 'Discuss';
|
||||
|
||||
@override
|
||||
String get pollType => 'Poll type';
|
||||
|
||||
|
|
|
|||
|
|
@ -56,6 +56,9 @@ class L10nTh extends L10n {
|
|||
return '$selected of $max selected';
|
||||
}
|
||||
|
||||
@override
|
||||
String get discuss => 'Discuss';
|
||||
|
||||
@override
|
||||
String get pollType => 'Poll type';
|
||||
|
||||
|
|
|
|||
|
|
@ -56,6 +56,9 @@ class L10nTr extends L10n {
|
|||
return '$selected of $max selected';
|
||||
}
|
||||
|
||||
@override
|
||||
String get discuss => 'Discuss';
|
||||
|
||||
@override
|
||||
String get pollType => 'Poll type';
|
||||
|
||||
|
|
|
|||
|
|
@ -56,6 +56,9 @@ class L10nUk extends L10n {
|
|||
return '$selected of $max selected';
|
||||
}
|
||||
|
||||
@override
|
||||
String get discuss => 'Discuss';
|
||||
|
||||
@override
|
||||
String get pollType => 'Poll type';
|
||||
|
||||
|
|
|
|||
|
|
@ -56,6 +56,9 @@ class L10nVi extends L10n {
|
|||
return '$selected of $max selected';
|
||||
}
|
||||
|
||||
@override
|
||||
String get discuss => 'Discuss';
|
||||
|
||||
@override
|
||||
String get pollType => 'Poll type';
|
||||
|
||||
|
|
|
|||
|
|
@ -56,6 +56,9 @@ class L10nZh extends L10n {
|
|||
return '$selected of $max selected';
|
||||
}
|
||||
|
||||
@override
|
||||
String get discuss => 'Discuss';
|
||||
|
||||
@override
|
||||
String get pollType => 'Poll type';
|
||||
|
||||
|
|
|
|||
|
|
@ -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(
|
||||
|
|
|
|||
|
|
@ -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(
|
||||
|
|
|
|||
|
|
@ -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(
|
||||
|
|
|
|||
|
|
@ -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'),
|
||||
],
|
||||
),
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
Loading…
Reference in New Issue