This commit is contained in:
OfficialDakari 2025-11-02 11:06:06 +05:00
parent 1c5a632d2a
commit 1757a7a4af
63 changed files with 540 additions and 41 deletions

View File

@ -650,7 +650,7 @@ code + .copy-button {
<script type="text/javascript">
function configurationCacheProblems() { return (
// begin-report-data
{"diagnostics":[{"problem":[{"text":"Executing Gradle on JVM versions 16 and lower has been deprecated."}],"severity":"WARNING","problemDetails":[{"text":"This will fail with an error in Gradle 9.0."}],"contextualLabel":"Executing Gradle on JVM versions 16 and lower has been deprecated.","documentationLink":"https://docs.gradle.org/8.13/userguide/upgrading_version_8.html#minimum_daemon_jvm_version","problemId":[{"name":"deprecation","displayName":"Deprecation"},{"name":"executing-gradle-on-jvm-versions-and-lower","displayName":"Executing Gradle on JVM versions 16 and lower has been deprecated."}],"solutions":[[{"text":"Use JVM 17 or greater to execute Gradle. Projects can continue to use older JVM versions via toolchains."}]]}],"problemsReport":{"totalProblemCount":1,"requestedTasks":"","documentationLink":"https://docs.gradle.org/8.13/userguide/reporting_problems.html","documentationLinkCaption":"Problem report","summaries":[]}}
{"diagnostics":[{"problem":[{"text":"Executing Gradle on JVM versions 16 and lower has been deprecated."}],"severity":"WARNING","problemDetails":[{"text":"This will fail with an error in Gradle 9.0."}],"contextualLabel":"Executing Gradle on JVM versions 16 and lower has been deprecated.","documentationLink":"https://docs.gradle.org/8.13/userguide/upgrading_version_8.html#minimum_daemon_jvm_version","problemId":[{"name":"deprecation","displayName":"Deprecation"},{"name":"executing-gradle-on-jvm-versions-and-lower","displayName":"Executing Gradle on JVM versions 16 and lower has been deprecated."}],"solutions":[[{"text":"Use JVM 17 or greater to execute Gradle. Projects can continue to use older JVM versions via toolchains."}]]},{"problem":[{"text":"No variants exist that would match the request"}],"severity":"ERROR","contextualLabel":"Dependency requires at least JVM runtime version 11. This build uses a Java 8 JVM.","documentationLink":"https://docs.gradle.org/8.13/userguide/variant_model.html#sec:variant-select-errors","problemId":[{"name":"dependency-variant-resolution","displayName":"Variant resolution"},{"name":"no-compatible-variants","displayName":"No variants exist that would match the request"}]}],"problemsReport":{"totalProblemCount":2,"requestedTasks":"","documentationLink":"https://docs.gradle.org/8.13/userguide/reporting_problems.html","documentationLinkCaption":"Problem report","summaries":[]}}
// end-report-data
);}
</script>

View File

@ -894,6 +894,9 @@
},
"chatPermissions": "Chat permissions",
"@chatPermissions": {},
"chatThreads": "Threads",
"@chatThreads": {},
"chatThreadsDescription": "See all threads in this room",
"editDisplayname": "Edit displayname",
"@editDisplayname": {
"type": "String",

View File

@ -893,6 +893,9 @@
},
"chatPermissions": "Права в чате",
"@chatPermissions": {},
"chatThreads": "Обсуждения",
"@chatThreads": {},
"chatThreadsDescription": "Список всех обсуждений в этой комнате",
"editDisplayname": "Отображаемое имя",
"@editDisplayname": {
"type": "String",
@ -937,7 +940,7 @@
"@globalChatId": {},
"accessAndVisibility": "Доступность и видимость",
"@accessAndVisibility": {},
"accessAndVisibilityDescription": "Кто может зайти и как найти этот чат.",
"accessAndVisibilityDescription": "Кто может зайти и как найти этот чат",
"@accessAndVisibilityDescription": {},
"calls": "Звонки",
"@calls": {},

View File

@ -1,6 +1,7 @@
import 'dart:async';
import 'package:extera_next/pages/thread/thread.dart';
import 'package:extera_next/pages/chat_thread/chat_threads.dart';
import 'package:extera_next/pages/chat_thread/thread.dart';
import 'package:flutter/material.dart';
import 'package:go_router/go_router.dart';
@ -152,6 +153,13 @@ abstract class AppRoutes {
routes: [
GoRoute(
path: 'threads',
pageBuilder: (context, state) => defaultPageBuilder(
context,
state,
ChatThreads(
roomId: state.pathParameters['roomid']!,
),
),
redirect: loggedOutRedirect,
routes: [
GoRoute(

View File

@ -1317,6 +1317,18 @@ abstract class L10n {
/// **'Chat permissions'**
String get chatPermissions;
/// No description provided for @chatThreads.
///
/// In en, this message translates to:
/// **'Threads'**
String get chatThreads;
/// No description provided for @chatThreadsDescription.
///
/// In en, this message translates to:
/// **'See all threads in this room'**
String get chatThreadsDescription;
/// No description provided for @editDisplayname.
///
/// In en, this message translates to:

View File

@ -659,6 +659,12 @@ class L10nAr extends L10n {
@override
String get chatPermissions => 'صلاحيات المحادثة';
@override
String get chatThreads => 'Threads';
@override
String get chatThreadsDescription => 'See all threads in this room';
@override
String get editDisplayname => 'حرر الاسم العلني';

View File

@ -663,6 +663,12 @@ class L10nBe extends L10n {
@override
String get chatPermissions => 'Chat permissions';
@override
String get chatThreads => 'Threads';
@override
String get chatThreadsDescription => 'See all threads in this room';
@override
String get editDisplayname => 'Edit displayname';

View File

@ -663,6 +663,12 @@ class L10nBn extends L10n {
@override
String get chatPermissions => 'Chat permissions';
@override
String get chatThreads => 'Threads';
@override
String get chatThreadsDescription => 'See all threads in this room';
@override
String get editDisplayname => 'Edit displayname';

View File

@ -663,6 +663,12 @@ class L10nBo extends L10n {
@override
String get chatPermissions => 'Chat permissions';
@override
String get chatThreads => 'Threads';
@override
String get chatThreadsDescription => 'See all threads in this room';
@override
String get editDisplayname => 'Edit displayname';

View File

@ -668,6 +668,12 @@ class L10nCa extends L10n {
@override
String get chatPermissions => 'Permisos del xat';
@override
String get chatThreads => 'Threads';
@override
String get chatThreadsDescription => 'See all threads in this room';
@override
String get editDisplayname => 'Edita l\'àlies';

View File

@ -667,6 +667,12 @@ class L10nCs extends L10n {
@override
String get chatPermissions => 'Oprávnění konverzace';
@override
String get chatThreads => 'Threads';
@override
String get chatThreadsDescription => 'See all threads in this room';
@override
String get editDisplayname => 'Změnit přezdívku';

View File

@ -669,6 +669,12 @@ class L10nDe extends L10n {
@override
String get chatPermissions => 'Chatberechtigungen';
@override
String get chatThreads => 'Threads';
@override
String get chatThreadsDescription => 'See all threads in this room';
@override
String get editDisplayname => 'Anzeigename ändern';

View File

@ -664,6 +664,12 @@ class L10nEl extends L10n {
@override
String get chatPermissions => 'Chat permissions';
@override
String get chatThreads => 'Threads';
@override
String get chatThreadsDescription => 'See all threads in this room';
@override
String get editDisplayname => 'Edit displayname';

View File

@ -663,6 +663,12 @@ class L10nEn extends L10n {
@override
String get chatPermissions => 'Chat permissions';
@override
String get chatThreads => 'Threads';
@override
String get chatThreadsDescription => 'See all threads in this room';
@override
String get editDisplayname => 'Edit displayname';

View File

@ -666,6 +666,12 @@ class L10nEo extends L10n {
@override
String get chatPermissions => 'Chat permissions';
@override
String get chatThreads => 'Threads';
@override
String get chatThreadsDescription => 'See all threads in this room';
@override
String get editDisplayname => 'Redakti prezentan nomon';

View File

@ -667,6 +667,12 @@ class L10nEs extends L10n {
@override
String get chatPermissions => 'Permisos del chat';
@override
String get chatThreads => 'Threads';
@override
String get chatThreadsDescription => 'See all threads in this room';
@override
String get editDisplayname => 'Editar nombre visible';

View File

@ -665,6 +665,12 @@ class L10nEt extends L10n {
@override
String get chatPermissions => 'Vestluse õigused';
@override
String get chatThreads => 'Threads';
@override
String get chatThreadsDescription => 'See all threads in this room';
@override
String get editDisplayname => 'Muuda kuvatavat nime';

View File

@ -666,6 +666,12 @@ class L10nEu extends L10n {
@override
String get chatPermissions => 'Txataren baimenak';
@override
String get chatThreads => 'Threads';
@override
String get chatThreadsDescription => 'See all threads in this room';
@override
String get editDisplayname => 'Editatu ezizena';

View File

@ -661,6 +661,12 @@ class L10nFa extends L10n {
@override
String get chatPermissions => 'Chat permissions';
@override
String get chatThreads => 'Threads';
@override
String get chatThreadsDescription => 'See all threads in this room';
@override
String get editDisplayname => 'ویرایش نام نمایشی';

View File

@ -668,6 +668,12 @@ class L10nFi extends L10n {
@override
String get chatPermissions => 'Keskustelun oikeudet';
@override
String get chatThreads => 'Threads';
@override
String get chatThreadsDescription => 'See all threads in this room';
@override
String get editDisplayname => 'Muokkaa näyttönimeä';

View File

@ -669,6 +669,12 @@ class L10nFil extends L10n {
@override
String get chatPermissions => 'Mga pahintulot ng chat';
@override
String get chatThreads => 'Threads';
@override
String get chatThreadsDescription => 'See all threads in this room';
@override
String get editDisplayname => 'I-edit ang display name';

View File

@ -672,6 +672,12 @@ class L10nFr extends L10n {
@override
String get chatPermissions => 'Permissions du salon';
@override
String get chatThreads => 'Threads';
@override
String get chatThreadsDescription => 'See all threads in this room';
@override
String get editDisplayname => 'Changer de nom d\'affichage';

View File

@ -671,6 +671,12 @@ class L10nGa extends L10n {
@override
String get chatPermissions => 'Ceadanna comhrá';
@override
String get chatThreads => 'Threads';
@override
String get chatThreadsDescription => 'See all threads in this room';
@override
String get editDisplayname => 'Cuir ainm taispeána in eagar';

View File

@ -666,6 +666,12 @@ class L10nGl extends L10n {
@override
String get chatPermissions => 'Permisos da conversa';
@override
String get chatThreads => 'Threads';
@override
String get chatThreadsDescription => 'See all threads in this room';
@override
String get editDisplayname => 'Editar nome público';

View File

@ -661,6 +661,12 @@ class L10nHe extends L10n {
@override
String get chatPermissions => 'Chat permissions';
@override
String get chatThreads => 'Threads';
@override
String get chatThreadsDescription => 'See all threads in this room';
@override
String get editDisplayname => 'ערוך את שם התצוגה';

View File

@ -663,6 +663,12 @@ class L10nHi extends L10n {
@override
String get chatPermissions => 'Chat permissions';
@override
String get chatThreads => 'Threads';
@override
String get chatThreadsDescription => 'See all threads in this room';
@override
String get editDisplayname => 'Edit displayname';

View File

@ -664,6 +664,12 @@ class L10nHr extends L10n {
@override
String get chatPermissions => 'Dozvole za razgovor';
@override
String get chatThreads => 'Threads';
@override
String get chatThreadsDescription => 'See all threads in this room';
@override
String get editDisplayname => 'Uredi prikazano ime';

View File

@ -666,6 +666,12 @@ class L10nHu extends L10n {
@override
String get chatPermissions => 'Csevegés engedélyek';
@override
String get chatThreads => 'Threads';
@override
String get chatThreadsDescription => 'See all threads in this room';
@override
String get editDisplayname => 'Megjelenítési név szerkesztése';

View File

@ -663,6 +663,12 @@ class L10nIa extends L10n {
@override
String get chatPermissions => 'Chat permissions';
@override
String get chatThreads => 'Threads';
@override
String get chatThreadsDescription => 'See all threads in this room';
@override
String get editDisplayname => 'Edit displayname';

View File

@ -670,6 +670,12 @@ class L10nId extends L10n {
@override
String get chatPermissions => 'Perizinan obrolan';
@override
String get chatThreads => 'Threads';
@override
String get chatThreadsDescription => 'See all threads in this room';
@override
String get editDisplayname => 'Edit nama tampilan';

View File

@ -662,6 +662,12 @@ class L10nIe extends L10n {
@override
String get chatPermissions => 'Chat permissions';
@override
String get chatThreads => 'Threads';
@override
String get chatThreadsDescription => 'See all threads in this room';
@override
String get editDisplayname => 'Redacter li visibil nómine';

View File

@ -667,6 +667,12 @@ class L10nIt extends L10n {
@override
String get chatPermissions => 'Permessi della chat';
@override
String get chatThreads => 'Threads';
@override
String get chatThreadsDescription => 'See all threads in this room';
@override
String get editDisplayname => 'Modifica il nominativo';

View File

@ -654,6 +654,12 @@ class L10nJa extends L10n {
@override
String get chatPermissions => 'Chat permissions';
@override
String get chatThreads => 'Threads';
@override
String get chatThreadsDescription => 'See all threads in this room';
@override
String get editDisplayname => '表示名を編集';

View File

@ -665,6 +665,12 @@ class L10nKa extends L10n {
@override
String get chatPermissions => 'ჩატის უფლებები';
@override
String get chatThreads => 'Threads';
@override
String get chatThreadsDescription => 'See all threads in this room';
@override
String get editDisplayname => 'ნაჩვენები სახელის შეცვლა';

View File

@ -652,6 +652,12 @@ class L10nKo extends L10n {
@override
String get chatPermissions => '채팅 권한';
@override
String get chatThreads => 'Threads';
@override
String get chatThreadsDescription => 'See all threads in this room';
@override
String get editDisplayname => '표시 이름 수정';

View File

@ -665,6 +665,12 @@ class L10nLt extends L10n {
@override
String get chatPermissions => 'Chat permissions';
@override
String get chatThreads => 'Threads';
@override
String get chatThreadsDescription => 'See all threads in this room';
@override
String get editDisplayname => 'Redaguoti rodomą vardą';

View File

@ -669,6 +669,12 @@ class L10nLv extends L10n {
@override
String get chatPermissions => 'Tērzēšanas atļaujas';
@override
String get chatThreads => 'Threads';
@override
String get chatThreadsDescription => 'See all threads in this room';
@override
String get editDisplayname => 'Labot attēlojamo vārdu';

View File

@ -663,6 +663,12 @@ class L10nNb extends L10n {
@override
String get chatPermissions => 'Chat permissions';
@override
String get chatThreads => 'Threads';
@override
String get chatThreadsDescription => 'See all threads in this room';
@override
String get editDisplayname => 'Rediger visningsnavn';

View File

@ -665,6 +665,12 @@ class L10nNl extends L10n {
@override
String get chatPermissions => 'Chat toestemmingen';
@override
String get chatThreads => 'Threads';
@override
String get chatThreadsDescription => 'See all threads in this room';
@override
String get editDisplayname => 'Naam wijzigen';

View File

@ -666,6 +666,12 @@ class L10nPl extends L10n {
@override
String get chatPermissions => 'Uprawnienia w czacie';
@override
String get chatThreads => 'Threads';
@override
String get chatThreadsDescription => 'See all threads in this room';
@override
String get editDisplayname => 'Edytuj nazwę wyświetlaną';

View File

@ -663,6 +663,12 @@ class L10nPt extends L10n {
@override
String get chatPermissions => 'Chat permissions';
@override
String get chatThreads => 'Threads';
@override
String get chatThreadsDescription => 'See all threads in this room';
@override
String get editDisplayname => 'Edit displayname';

View File

@ -668,6 +668,12 @@ class L10nRo extends L10n {
@override
String get chatPermissions => 'Chat permissions';
@override
String get chatThreads => 'Threads';
@override
String get chatThreadsDescription => 'See all threads in this room';
@override
String get editDisplayname => 'Schimbați displayname';

View File

@ -665,6 +665,12 @@ class L10nRu extends L10n {
@override
String get chatPermissions => 'Права в чате';
@override
String get chatThreads => 'Обсуждения';
@override
String get chatThreadsDescription => 'Список всех обсуждений в этой комнате';
@override
String get editDisplayname => 'Отображаемое имя';
@ -698,7 +704,7 @@ class L10nRu extends L10n {
@override
String get accessAndVisibilityDescription =>
'Кто может зайти и как найти этот чат.';
'Кто может зайти и как найти этот чат';
@override
String get calls => 'Звонки';

View File

@ -665,6 +665,12 @@ class L10nSk extends L10n {
@override
String get chatPermissions => 'Chat permissions';
@override
String get chatThreads => 'Threads';
@override
String get chatThreadsDescription => 'See all threads in this room';
@override
String get editDisplayname => 'Zmeniť prezývku';

View File

@ -667,6 +667,12 @@ class L10nSl extends L10n {
@override
String get chatPermissions => 'Chat permissions';
@override
String get chatThreads => 'Threads';
@override
String get chatThreadsDescription => 'See all threads in this room';
@override
String get editDisplayname => 'Edit displayname';

View File

@ -663,6 +663,12 @@ class L10nSr extends L10n {
@override
String get chatPermissions => 'Chat permissions';
@override
String get chatThreads => 'Threads';
@override
String get chatThreadsDescription => 'See all threads in this room';
@override
String get editDisplayname => 'Уреди име за приказ';

View File

@ -664,6 +664,12 @@ class L10nSv extends L10n {
@override
String get chatPermissions => 'Chatt-behörigheter';
@override
String get chatThreads => 'Threads';
@override
String get chatThreadsDescription => 'See all threads in this room';
@override
String get editDisplayname => 'Ändra visningsnamn';

View File

@ -673,6 +673,12 @@ class L10nTa extends L10n {
@override
String get chatPermissions => 'அரட்டை அனுமதிகள்';
@override
String get chatThreads => 'Threads';
@override
String get chatThreadsDescription => 'See all threads in this room';
@override
String get editDisplayname => 'காட்சி பெயர் திருத்து';

View File

@ -663,6 +663,12 @@ class L10nTe extends L10n {
@override
String get chatPermissions => 'Chat permissions';
@override
String get chatThreads => 'Threads';
@override
String get chatThreadsDescription => 'See all threads in this room';
@override
String get editDisplayname => 'Edit displayname';

View File

@ -665,6 +665,12 @@ class L10nTh extends L10n {
@override
String get chatPermissions => 'Chat permissions';
@override
String get chatThreads => 'Threads';
@override
String get chatThreadsDescription => 'See all threads in this room';
@override
String get editDisplayname => 'Edit displayname';

View File

@ -665,6 +665,12 @@ class L10nTr extends L10n {
@override
String get chatPermissions => 'Sohbet izinleri';
@override
String get chatThreads => 'Threads';
@override
String get chatThreadsDescription => 'See all threads in this room';
@override
String get editDisplayname => 'Görünen adı düzenle';

View File

@ -667,6 +667,12 @@ class L10nUk extends L10n {
@override
String get chatPermissions => 'Дозволи бесіди';
@override
String get chatThreads => 'Threads';
@override
String get chatThreadsDescription => 'See all threads in this room';
@override
String get editDisplayname => 'Змінити показуване ім\'я';

View File

@ -663,6 +663,12 @@ class L10nVi extends L10n {
@override
String get chatPermissions => 'Chat permissions';
@override
String get chatThreads => 'Threads';
@override
String get chatThreadsDescription => 'See all threads in this room';
@override
String get editDisplayname => 'Sửa tên hiển thị';

View File

@ -647,6 +647,12 @@ class L10nZh extends L10n {
@override
String get chatPermissions => '聊天权限';
@override
String get chatThreads => 'Threads';
@override
String get chatThreadsDescription => 'See all threads in this room';
@override
String get editDisplayname => '编辑昵称';

View File

@ -15,7 +15,7 @@ import 'package:extera_next/utils/platform_infos.dart';
class ChatEventList extends StatelessWidget {
final ChatController controller;
const ChatEventList({
super.key,
required this.controller,

View File

@ -328,7 +328,9 @@ class ChatView extends StatelessWidget {
Expanded(
child: GestureDetector(
onTap: controller.clearSingleSelectedEvent,
child: ChatEventList(controller: controller),
child: ChatEventList(
controller: controller,
),
),
),
if (controller.showScrollDownButton)

View File

@ -16,14 +16,13 @@ class TranslatedEventDialog extends StatefulWidget {
});
@override
TranslatedEventDialogState createState() =>
TranslatedEventDialogState(event, timeline);
TranslatedEventDialogState createState() => TranslatedEventDialogState();
}
class TranslatedEventDialogState extends State<TranslatedEventDialog> {
final Event event;
final Timeline timeline;
TranslatedEventDialogState(this.event, this.timeline);
Event get event => widget.event;
Timeline get timeline => widget.timeline;
TranslatedEventDialogState();
@override
Widget build(BuildContext context) {
final theme = Theme.of(context);
@ -33,35 +32,31 @@ class TranslatedEventDialogState extends State<TranslatedEventDialog> {
theme.bubbleColor,
];
final message = Message(
event,
colors: colors,
onInfoTab: (Event ev) => {},
onMention: () => {},
onSelect: (Event ev) => {},
onSwipe: () => {},
scrollToEventId: (String p0) => {},
timeline: timeline,
animateIn: false,
displayReadMarker: false,
highlightMarker: false,
longPressSelect: false,
selected: false,
wallpaperMode: false,
gradient: false
);
final message = Message(
event,
colors: colors,
onInfoTab: (Event ev) => {},
onMention: () => {},
onSelect: (Event ev) => {},
onSwipe: () => {},
scrollToEventId: (String p0) => {},
timeline: timeline,
animateIn: false,
displayReadMarker: false,
highlightMarker: false,
longPressSelect: false,
selected: false,
wallpaperMode: false,
gradient: false,
);
return Scaffold(
appBar: AppBar(
title: Text(L10n.of(context).translatedMessage)
),
body: Container(
child: Column(
children: [
message,
],
),
),
);
appBar: AppBar(title: Text(L10n.of(context).translatedMessage)),
body: Column(
children: [
message,
],
),
);
}
}

View File

@ -1,3 +1,4 @@
import 'package:extera_next/pages/chat_thread/chat_threads_view.dart';
import 'package:flutter/material.dart';
import 'package:collection/collection.dart';

View File

@ -259,6 +259,21 @@ class ChatDetailsView extends StatelessWidget {
const SizedBox(height: 16),
],
Divider(color: theme.dividerColor),
ListTile(
leading: CircleAvatar(
backgroundColor: theme.scaffoldBackgroundColor,
foregroundColor: iconColor,
child: const Icon(
Icons.chat_bubble_outline,
),
),
title: Text(L10n.of(context).chatThreads),
subtitle:
Text(L10n.of(context).chatThreadsDescription),
onTap: () =>
context.push('/rooms/${room.id}/threads'),
trailing: const Icon(Icons.chevron_right_outlined),
),
ListTile(
leading: CircleAvatar(
backgroundColor: theme.scaffoldBackgroundColor,
@ -360,4 +375,4 @@ class ChatDetailsView extends StatelessWidget {
},
);
}
}
}

View File

@ -0,0 +1,53 @@
import 'package:extera_next/pages/chat_thread/chat_threads_view.dart';
import 'package:extera_next/widgets/matrix.dart';
import 'package:flutter/cupertino.dart';
import 'package:matrix/matrix.dart';
import 'package:scroll_to_index/scroll_to_index.dart';
class ChatThreads extends StatefulWidget {
final String roomId;
const ChatThreads({
super.key,
required this.roomId,
});
@override
ChatThreadsController createState() => ChatThreadsController();
}
class ChatThreadsController extends State<ChatThreads> {
String get roomId => widget.roomId;
Room? get room => Matrix.of(context).client.getRoomById(roomId);
bool isLoadingThreads = false;
final AutoScrollController scrollController = AutoScrollController();
@override
Widget build(BuildContext context) => ChatThreadsView(this);
void loadThreads([dynamic _]) async {
final room = Matrix.of(context).client.getRoomById(roomId);
if (room == null) {
return;
}
isLoadingThreads = true;
await room.loadThreadsFromServer();
isLoadingThreads = false;
}
List<Thread>? get threads => room?.threads.values.toList();
Stream get onChanged => Matrix.of(context).client.onSync.stream.where(
(e) =>
(e.rooms?.join?.containsKey(roomId) ?? false) &&
(e.rooms!.join![roomId]?.timeline?.events
?.any((s) => s.type == EventTypes.Message && s.content['m.relates_to'] != null) ??
false),
);
}

View File

@ -0,0 +1,110 @@
import 'package:extera_next/config/themes.dart';
import 'package:extera_next/generated/l10n/l10n.dart';
import 'package:extera_next/pages/chat_thread/chat_threads.dart';
import 'package:extera_next/utils/platform_infos.dart';
import 'package:extera_next/widgets/avatar.dart';
import 'package:extera_next/widgets/layouts/max_width_body.dart';
import 'package:flutter/material.dart';
import 'package:matrix/matrix.dart';
import 'package:scroll_to_index/scroll_to_index.dart';
class ChatThreadsView extends StatelessWidget {
final ChatThreadsController controller;
const ChatThreadsView(this.controller, {super.key});
@override
Widget build(BuildContext context) {
final horizontalPadding = FluffyThemes.isColumnMode(context) ? 8.0 : 0.0;
return Scaffold(
appBar: AppBar(
leading: const Center(child: BackButton()),
title: Text(L10n.of(context).chatThreads),
),
body: MaxWidthBody(
child: ListView.custom(
padding: EdgeInsets.only(
top: 16,
bottom: 8,
left: horizontalPadding,
right: horizontalPadding,
),
reverse: true,
controller: controller.scrollController,
keyboardDismissBehavior: PlatformInfos.isIOS
? ScrollViewKeyboardDismissBehavior.onDrag
: ScrollViewKeyboardDismissBehavior.manual,
childrenDelegate: SliverChildBuilderDelegate(
(BuildContext context, int i) {
if (i == (controller.threads?.length ?? 0) + 1) {
if (controller.isLoadingThreads) {
return const Center(
child: CircularProgressIndicator.adaptive(strokeWidth: 2),
);
} else if (!(controller.room?.loadedAllThreads ?? false)) {
return Builder(
builder: (context) {
WidgetsBinding.instance
.addPostFrameCallback(controller.loadThreads);
return Center(
child: IconButton(
onPressed: controller.loadThreads,
icon: const Icon(Icons.refresh_outlined),
),
);
},
);
}
i--;
final thread = controller.threads![i];
return AutoScrollTag(
key: ValueKey(thread.rootEvent.eventId),
index: i,
controller: controller.scrollController,
child: Container(
padding: const EdgeInsets.symmetric(
horizontal: 16.0,
vertical: 8.0,
),
child: Row(
crossAxisAlignment: CrossAxisAlignment.start,
children: <Widget>[
FutureBuilder<User?>(
future: thread.rootEvent.fetchSenderUser(),
builder: (context, snapshot) {
final user = snapshot.data ??
thread.rootEvent.senderFromMemoryOrFallback;
return Avatar(
mxContent: user.avatarUrl,
name: user.calcDisplayname(),
size: 48,
);
},
),
Expanded(
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: <Widget>[
Text(thread.rootEvent.senderFromMemoryOrFallback.calcDisplayname()),
],
),
),
const SizedBox(height: 4.0),
Text(thread.rootEvent.text),
],
),
),
);
}
},
childCount: (controller.threads?.length ?? 0) + 1,
),
),
),
);
}
}

View File

@ -3,7 +3,6 @@ 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;

View File

@ -8,6 +8,10 @@ extension VisibleInGuiExtension on List<Event> {
return where((e) => e.isThreaded == threaded).toList();
}
List<Event> filterThreadRoots() {
return where((e) => e.room.threads.containsKey(e.eventId)).toList();
}
List<Event> filterByVisibleInGui({String? exceptionEventId}) {
final visibleEvents =
where((e) => e.isVisibleInGui || e.eventId == exceptionEventId)