diff --git a/android/build/reports/problems/problems-report.html b/android/build/reports/problems/problems-report.html
index f85479d..e923c4a 100644
--- a/android/build/reports/problems/problems-report.html
+++ b/android/build/reports/problems/problems-report.html
@@ -650,7 +650,7 @@ code + .copy-button {
diff --git a/assets/l10n/intl_en.arb b/assets/l10n/intl_en.arb
index e1e6aa1..c14f47d 100644
--- a/assets/l10n/intl_en.arb
+++ b/assets/l10n/intl_en.arb
@@ -894,6 +894,9 @@
},
"chatPermissions": "Chat permissions",
"@chatPermissions": {},
+ "chatThreads": "Threads",
+ "@chatThreads": {},
+ "chatThreadsDescription": "See all threads in this room",
"editDisplayname": "Edit displayname",
"@editDisplayname": {
"type": "String",
diff --git a/assets/l10n/intl_ru.arb b/assets/l10n/intl_ru.arb
index 8e50924..af8a974 100644
--- a/assets/l10n/intl_ru.arb
+++ b/assets/l10n/intl_ru.arb
@@ -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": {},
diff --git a/lib/config/routes.dart b/lib/config/routes.dart
index ed84b31..2841c06 100644
--- a/lib/config/routes.dart
+++ b/lib/config/routes.dart
@@ -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(
diff --git a/lib/generated/l10n/l10n.dart b/lib/generated/l10n/l10n.dart
index 0142cb1..7d1a5ea 100644
--- a/lib/generated/l10n/l10n.dart
+++ b/lib/generated/l10n/l10n.dart
@@ -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:
diff --git a/lib/generated/l10n/l10n_ar.dart b/lib/generated/l10n/l10n_ar.dart
index 1dca7be..129d998 100644
--- a/lib/generated/l10n/l10n_ar.dart
+++ b/lib/generated/l10n/l10n_ar.dart
@@ -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 => 'حرر الاسم العلني';
diff --git a/lib/generated/l10n/l10n_be.dart b/lib/generated/l10n/l10n_be.dart
index e56739a..47ea2b6 100644
--- a/lib/generated/l10n/l10n_be.dart
+++ b/lib/generated/l10n/l10n_be.dart
@@ -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';
diff --git a/lib/generated/l10n/l10n_bn.dart b/lib/generated/l10n/l10n_bn.dart
index 9999e47..bbd7340 100644
--- a/lib/generated/l10n/l10n_bn.dart
+++ b/lib/generated/l10n/l10n_bn.dart
@@ -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';
diff --git a/lib/generated/l10n/l10n_bo.dart b/lib/generated/l10n/l10n_bo.dart
index 218b960..5ca3f14 100644
--- a/lib/generated/l10n/l10n_bo.dart
+++ b/lib/generated/l10n/l10n_bo.dart
@@ -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';
diff --git a/lib/generated/l10n/l10n_ca.dart b/lib/generated/l10n/l10n_ca.dart
index ceadb89..16bb4b1 100644
--- a/lib/generated/l10n/l10n_ca.dart
+++ b/lib/generated/l10n/l10n_ca.dart
@@ -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';
diff --git a/lib/generated/l10n/l10n_cs.dart b/lib/generated/l10n/l10n_cs.dart
index 1c440b6..bd2a35c 100644
--- a/lib/generated/l10n/l10n_cs.dart
+++ b/lib/generated/l10n/l10n_cs.dart
@@ -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';
diff --git a/lib/generated/l10n/l10n_de.dart b/lib/generated/l10n/l10n_de.dart
index 08b344f..4a353ff 100644
--- a/lib/generated/l10n/l10n_de.dart
+++ b/lib/generated/l10n/l10n_de.dart
@@ -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';
diff --git a/lib/generated/l10n/l10n_el.dart b/lib/generated/l10n/l10n_el.dart
index c01c3a3..18d28c0 100644
--- a/lib/generated/l10n/l10n_el.dart
+++ b/lib/generated/l10n/l10n_el.dart
@@ -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';
diff --git a/lib/generated/l10n/l10n_en.dart b/lib/generated/l10n/l10n_en.dart
index bfc5779..04c491b 100644
--- a/lib/generated/l10n/l10n_en.dart
+++ b/lib/generated/l10n/l10n_en.dart
@@ -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';
diff --git a/lib/generated/l10n/l10n_eo.dart b/lib/generated/l10n/l10n_eo.dart
index d1be07f..62a3a8a 100644
--- a/lib/generated/l10n/l10n_eo.dart
+++ b/lib/generated/l10n/l10n_eo.dart
@@ -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';
diff --git a/lib/generated/l10n/l10n_es.dart b/lib/generated/l10n/l10n_es.dart
index 45b37ea..e80a010 100644
--- a/lib/generated/l10n/l10n_es.dart
+++ b/lib/generated/l10n/l10n_es.dart
@@ -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';
diff --git a/lib/generated/l10n/l10n_et.dart b/lib/generated/l10n/l10n_et.dart
index 108e526..afda2ec 100644
--- a/lib/generated/l10n/l10n_et.dart
+++ b/lib/generated/l10n/l10n_et.dart
@@ -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';
diff --git a/lib/generated/l10n/l10n_eu.dart b/lib/generated/l10n/l10n_eu.dart
index 5ed11ca..a4c5eb4 100644
--- a/lib/generated/l10n/l10n_eu.dart
+++ b/lib/generated/l10n/l10n_eu.dart
@@ -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';
diff --git a/lib/generated/l10n/l10n_fa.dart b/lib/generated/l10n/l10n_fa.dart
index e41eaf6..a796961 100644
--- a/lib/generated/l10n/l10n_fa.dart
+++ b/lib/generated/l10n/l10n_fa.dart
@@ -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 => 'ویرایش نام نمایشی';
diff --git a/lib/generated/l10n/l10n_fi.dart b/lib/generated/l10n/l10n_fi.dart
index c786c02..0accfcc 100644
--- a/lib/generated/l10n/l10n_fi.dart
+++ b/lib/generated/l10n/l10n_fi.dart
@@ -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ä';
diff --git a/lib/generated/l10n/l10n_fil.dart b/lib/generated/l10n/l10n_fil.dart
index 72e0637..20010ed 100644
--- a/lib/generated/l10n/l10n_fil.dart
+++ b/lib/generated/l10n/l10n_fil.dart
@@ -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';
diff --git a/lib/generated/l10n/l10n_fr.dart b/lib/generated/l10n/l10n_fr.dart
index eb38cff..33e4d5a 100644
--- a/lib/generated/l10n/l10n_fr.dart
+++ b/lib/generated/l10n/l10n_fr.dart
@@ -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';
diff --git a/lib/generated/l10n/l10n_ga.dart b/lib/generated/l10n/l10n_ga.dart
index 6c55850..94b2051 100644
--- a/lib/generated/l10n/l10n_ga.dart
+++ b/lib/generated/l10n/l10n_ga.dart
@@ -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';
diff --git a/lib/generated/l10n/l10n_gl.dart b/lib/generated/l10n/l10n_gl.dart
index 5d1caec..1f4e199 100644
--- a/lib/generated/l10n/l10n_gl.dart
+++ b/lib/generated/l10n/l10n_gl.dart
@@ -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';
diff --git a/lib/generated/l10n/l10n_he.dart b/lib/generated/l10n/l10n_he.dart
index 9bae162..3d32ec7 100644
--- a/lib/generated/l10n/l10n_he.dart
+++ b/lib/generated/l10n/l10n_he.dart
@@ -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 => 'ערוך את שם התצוגה';
diff --git a/lib/generated/l10n/l10n_hi.dart b/lib/generated/l10n/l10n_hi.dart
index fc80631..a12d291 100644
--- a/lib/generated/l10n/l10n_hi.dart
+++ b/lib/generated/l10n/l10n_hi.dart
@@ -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';
diff --git a/lib/generated/l10n/l10n_hr.dart b/lib/generated/l10n/l10n_hr.dart
index 9187316..02d5df4 100644
--- a/lib/generated/l10n/l10n_hr.dart
+++ b/lib/generated/l10n/l10n_hr.dart
@@ -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';
diff --git a/lib/generated/l10n/l10n_hu.dart b/lib/generated/l10n/l10n_hu.dart
index 0485832..bb01c3e 100644
--- a/lib/generated/l10n/l10n_hu.dart
+++ b/lib/generated/l10n/l10n_hu.dart
@@ -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';
diff --git a/lib/generated/l10n/l10n_ia.dart b/lib/generated/l10n/l10n_ia.dart
index 8ea9d92..c3fed88 100644
--- a/lib/generated/l10n/l10n_ia.dart
+++ b/lib/generated/l10n/l10n_ia.dart
@@ -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';
diff --git a/lib/generated/l10n/l10n_id.dart b/lib/generated/l10n/l10n_id.dart
index e0c5964..12c4c3b 100644
--- a/lib/generated/l10n/l10n_id.dart
+++ b/lib/generated/l10n/l10n_id.dart
@@ -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';
diff --git a/lib/generated/l10n/l10n_ie.dart b/lib/generated/l10n/l10n_ie.dart
index 1074ddb..7d3b20a 100644
--- a/lib/generated/l10n/l10n_ie.dart
+++ b/lib/generated/l10n/l10n_ie.dart
@@ -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';
diff --git a/lib/generated/l10n/l10n_it.dart b/lib/generated/l10n/l10n_it.dart
index eb05dec..2be51c0 100644
--- a/lib/generated/l10n/l10n_it.dart
+++ b/lib/generated/l10n/l10n_it.dart
@@ -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';
diff --git a/lib/generated/l10n/l10n_ja.dart b/lib/generated/l10n/l10n_ja.dart
index 04a1d22..e3fe6bb 100644
--- a/lib/generated/l10n/l10n_ja.dart
+++ b/lib/generated/l10n/l10n_ja.dart
@@ -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 => '表示名を編集';
diff --git a/lib/generated/l10n/l10n_ka.dart b/lib/generated/l10n/l10n_ka.dart
index 53c423f..3010bdd 100644
--- a/lib/generated/l10n/l10n_ka.dart
+++ b/lib/generated/l10n/l10n_ka.dart
@@ -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 => 'ნაჩვენები სახელის შეცვლა';
diff --git a/lib/generated/l10n/l10n_ko.dart b/lib/generated/l10n/l10n_ko.dart
index 92b8286..7b80318 100644
--- a/lib/generated/l10n/l10n_ko.dart
+++ b/lib/generated/l10n/l10n_ko.dart
@@ -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 => '표시 이름 수정';
diff --git a/lib/generated/l10n/l10n_lt.dart b/lib/generated/l10n/l10n_lt.dart
index 28362b4..0a81214 100644
--- a/lib/generated/l10n/l10n_lt.dart
+++ b/lib/generated/l10n/l10n_lt.dart
@@ -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ą';
diff --git a/lib/generated/l10n/l10n_lv.dart b/lib/generated/l10n/l10n_lv.dart
index b3417a4..5b32b8a 100644
--- a/lib/generated/l10n/l10n_lv.dart
+++ b/lib/generated/l10n/l10n_lv.dart
@@ -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';
diff --git a/lib/generated/l10n/l10n_nb.dart b/lib/generated/l10n/l10n_nb.dart
index d6fc856..e4df751 100644
--- a/lib/generated/l10n/l10n_nb.dart
+++ b/lib/generated/l10n/l10n_nb.dart
@@ -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';
diff --git a/lib/generated/l10n/l10n_nl.dart b/lib/generated/l10n/l10n_nl.dart
index af0eceb..e4be809 100644
--- a/lib/generated/l10n/l10n_nl.dart
+++ b/lib/generated/l10n/l10n_nl.dart
@@ -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';
diff --git a/lib/generated/l10n/l10n_pl.dart b/lib/generated/l10n/l10n_pl.dart
index a8791df..0d1522d 100644
--- a/lib/generated/l10n/l10n_pl.dart
+++ b/lib/generated/l10n/l10n_pl.dart
@@ -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ą';
diff --git a/lib/generated/l10n/l10n_pt.dart b/lib/generated/l10n/l10n_pt.dart
index aae1a03..9ac3270 100644
--- a/lib/generated/l10n/l10n_pt.dart
+++ b/lib/generated/l10n/l10n_pt.dart
@@ -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';
diff --git a/lib/generated/l10n/l10n_ro.dart b/lib/generated/l10n/l10n_ro.dart
index 589e285..27570ba 100644
--- a/lib/generated/l10n/l10n_ro.dart
+++ b/lib/generated/l10n/l10n_ro.dart
@@ -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';
diff --git a/lib/generated/l10n/l10n_ru.dart b/lib/generated/l10n/l10n_ru.dart
index 6ee67f0..b3cab54 100644
--- a/lib/generated/l10n/l10n_ru.dart
+++ b/lib/generated/l10n/l10n_ru.dart
@@ -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 => 'Звонки';
diff --git a/lib/generated/l10n/l10n_sk.dart b/lib/generated/l10n/l10n_sk.dart
index 33f6390..eaf5a91 100644
--- a/lib/generated/l10n/l10n_sk.dart
+++ b/lib/generated/l10n/l10n_sk.dart
@@ -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';
diff --git a/lib/generated/l10n/l10n_sl.dart b/lib/generated/l10n/l10n_sl.dart
index e12d910..36b0412 100644
--- a/lib/generated/l10n/l10n_sl.dart
+++ b/lib/generated/l10n/l10n_sl.dart
@@ -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';
diff --git a/lib/generated/l10n/l10n_sr.dart b/lib/generated/l10n/l10n_sr.dart
index 9928fe1..ed06706 100644
--- a/lib/generated/l10n/l10n_sr.dart
+++ b/lib/generated/l10n/l10n_sr.dart
@@ -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 => 'Уреди име за приказ';
diff --git a/lib/generated/l10n/l10n_sv.dart b/lib/generated/l10n/l10n_sv.dart
index 6b67f5c..72be4e4 100644
--- a/lib/generated/l10n/l10n_sv.dart
+++ b/lib/generated/l10n/l10n_sv.dart
@@ -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';
diff --git a/lib/generated/l10n/l10n_ta.dart b/lib/generated/l10n/l10n_ta.dart
index 34d65dd..2406198 100644
--- a/lib/generated/l10n/l10n_ta.dart
+++ b/lib/generated/l10n/l10n_ta.dart
@@ -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 => 'காட்சி பெயர் திருத்து';
diff --git a/lib/generated/l10n/l10n_te.dart b/lib/generated/l10n/l10n_te.dart
index 5822fb2..64c73fb 100644
--- a/lib/generated/l10n/l10n_te.dart
+++ b/lib/generated/l10n/l10n_te.dart
@@ -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';
diff --git a/lib/generated/l10n/l10n_th.dart b/lib/generated/l10n/l10n_th.dart
index 6361640..ea57c24 100644
--- a/lib/generated/l10n/l10n_th.dart
+++ b/lib/generated/l10n/l10n_th.dart
@@ -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';
diff --git a/lib/generated/l10n/l10n_tr.dart b/lib/generated/l10n/l10n_tr.dart
index f5c32a3..91dbd9d 100644
--- a/lib/generated/l10n/l10n_tr.dart
+++ b/lib/generated/l10n/l10n_tr.dart
@@ -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';
diff --git a/lib/generated/l10n/l10n_uk.dart b/lib/generated/l10n/l10n_uk.dart
index 60aa8ac..4964ed8 100644
--- a/lib/generated/l10n/l10n_uk.dart
+++ b/lib/generated/l10n/l10n_uk.dart
@@ -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 => 'Змінити показуване ім\'я';
diff --git a/lib/generated/l10n/l10n_vi.dart b/lib/generated/l10n/l10n_vi.dart
index 1ac0e9d..1bcb6d4 100644
--- a/lib/generated/l10n/l10n_vi.dart
+++ b/lib/generated/l10n/l10n_vi.dart
@@ -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ị';
diff --git a/lib/generated/l10n/l10n_zh.dart b/lib/generated/l10n/l10n_zh.dart
index ef91fd3..0550d1a 100644
--- a/lib/generated/l10n/l10n_zh.dart
+++ b/lib/generated/l10n/l10n_zh.dart
@@ -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 => '编辑昵称';
diff --git a/lib/pages/chat/chat_event_list.dart b/lib/pages/chat/chat_event_list.dart
index f807fd4..54f2a14 100644
--- a/lib/pages/chat/chat_event_list.dart
+++ b/lib/pages/chat/chat_event_list.dart
@@ -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,
diff --git a/lib/pages/chat/chat_view.dart b/lib/pages/chat/chat_view.dart
index 7cda110..76cab5d 100644
--- a/lib/pages/chat/chat_view.dart
+++ b/lib/pages/chat/chat_view.dart
@@ -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)
diff --git a/lib/pages/chat/translated_event_dialog.dart b/lib/pages/chat/translated_event_dialog.dart
index 337701f..7b9f399 100644
--- a/lib/pages/chat/translated_event_dialog.dart
+++ b/lib/pages/chat/translated_event_dialog.dart
@@ -16,14 +16,13 @@ class TranslatedEventDialog extends StatefulWidget {
});
@override
- TranslatedEventDialogState createState() =>
- TranslatedEventDialogState(event, timeline);
+ TranslatedEventDialogState createState() => TranslatedEventDialogState();
}
class TranslatedEventDialogState extends State {
- 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 {
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,
+ ],
+ ),
+ );
}
}
diff --git a/lib/pages/chat_details/chat_details.dart b/lib/pages/chat_details/chat_details.dart
index a0efa8c..c3cc32c 100644
--- a/lib/pages/chat_details/chat_details.dart
+++ b/lib/pages/chat_details/chat_details.dart
@@ -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';
diff --git a/lib/pages/chat_details/chat_details_view.dart b/lib/pages/chat_details/chat_details_view.dart
index f5f4ccc..e990f40 100644
--- a/lib/pages/chat_details/chat_details_view.dart
+++ b/lib/pages/chat_details/chat_details_view.dart
@@ -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 {
},
);
}
-}
\ No newline at end of file
+}
diff --git a/lib/pages/chat_thread/chat_threads.dart b/lib/pages/chat_thread/chat_threads.dart
new file mode 100644
index 0000000..ff0d001
--- /dev/null
+++ b/lib/pages/chat_thread/chat_threads.dart
@@ -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 {
+ 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? 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),
+ );
+}
\ No newline at end of file
diff --git a/lib/pages/chat_thread/chat_threads_view.dart b/lib/pages/chat_thread/chat_threads_view.dart
new file mode 100644
index 0000000..15ef1d2
--- /dev/null
+++ b/lib/pages/chat_thread/chat_threads_view.dart
@@ -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: [
+ FutureBuilder(
+ 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: [
+ Text(thread.rootEvent.senderFromMemoryOrFallback.calcDisplayname()),
+ ],
+ ),
+ ),
+ const SizedBox(height: 4.0),
+ Text(thread.rootEvent.text),
+ ],
+ ),
+ ),
+ );
+ }
+ },
+ childCount: (controller.threads?.length ?? 0) + 1,
+ ),
+ ),
+ ),
+ );
+ }
+}
diff --git a/lib/pages/thread/thread.dart b/lib/pages/chat_thread/thread.dart
similarity index 97%
rename from lib/pages/thread/thread.dart
rename to lib/pages/chat_thread/thread.dart
index 4c032bf..b1f0bf4 100644
--- a/lib/pages/thread/thread.dart
+++ b/lib/pages/chat_thread/thread.dart
@@ -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;
diff --git a/lib/utils/matrix_sdk_extensions/filtered_timeline_extension.dart b/lib/utils/matrix_sdk_extensions/filtered_timeline_extension.dart
index 4732c56..b7340cf 100644
--- a/lib/utils/matrix_sdk_extensions/filtered_timeline_extension.dart
+++ b/lib/utils/matrix_sdk_extensions/filtered_timeline_extension.dart
@@ -8,6 +8,10 @@ extension VisibleInGuiExtension on List {
return where((e) => e.isThreaded == threaded).toList();
}
+ List filterThreadRoots() {
+ return where((e) => e.room.threads.containsKey(e.eventId)).toList();
+ }
+
List filterByVisibleInGui({String? exceptionEventId}) {
final visibleEvents =
where((e) => e.isVisibleInGui || e.eventId == exceptionEventId)