fix: errors in space hierarchy

- fix suggestions of joined rooms
- fix missing spaces when parent not joined

Signed-off-by: TheOneWithTheBraid <the-one@with-the-braid.cf>
This commit is contained in:
TheOneWithTheBraid 2022-08-02 16:02:03 +02:00
parent aaf6610ff4
commit 1ce0cb3749
3 changed files with 31 additions and 8 deletions

View File

@ -142,6 +142,7 @@
"type": "text", "type": "text",
"placeholders": {} "placeholders": {}
}, },
"allSuggestedRoomsJoined": "You joined all suggested rooms",
"askVerificationRequest": "Accept this verification request from {username}?", "askVerificationRequest": "Accept this verification request from {username}?",
"@askVerificationRequest": { "@askVerificationRequest": {
"type": "text", "type": "text",

View File

@ -4,6 +4,7 @@ import 'package:flutter/material.dart';
import 'package:collection/collection.dart'; import 'package:collection/collection.dart';
import 'package:flutter_gen/gen_l10n/l10n.dart'; import 'package:flutter_gen/gen_l10n/l10n.dart';
import 'package:matrix/matrix.dart';
import 'package:vrouter/vrouter.dart'; import 'package:vrouter/vrouter.dart';
import 'package:fluffychat/pages/chat_list/spaces_entry.dart'; import 'package:fluffychat/pages/chat_list/spaces_entry.dart';
@ -55,7 +56,9 @@ class SpacesDrawer extends StatelessWidget {
entry.children.addAll(childrenSpaceEntries); entry.children.addAll(childrenSpaceEntries);
spacesHierarchy.add(entry); spacesHierarchy.add(entry);
} else { } else {
if (space?.spaceParents.isEmpty ?? false) { // don't add rooms with parent space apart from those where the
// parent space is not joined
if (space?.hasNotJoinedParentSpace() ?? false) {
spacesHierarchy.add(entry); spacesHierarchy.add(entry);
} }
} }
@ -67,10 +70,6 @@ class SpacesDrawer extends StatelessWidget {
spacesHierarchy.removeWhere((element) => spacesHierarchy.removeWhere((element) =>
childSpaceIds.contains(element.spacesEntry.getSpace(context)?.id)); childSpaceIds.contains(element.spacesEntry.getSpace(context)?.id));
// final spacesHierarchy = spaceEntries;
// TODO(TheOeWithTheBraid): wait for space hierarchy https://gitlab.com/famedly/company/frontend/libraries/matrix_api_lite/-/merge_requests/58
return ListView.builder( return ListView.builder(
itemCount: spacesHierarchy.length + 1, itemCount: spacesHierarchy.length + 1,
itemBuilder: (context, i) { itemBuilder: (context, i) {
@ -113,7 +112,11 @@ class SpacesEntryMaybeChildren {
[String? parent]) { [String? parent]) {
if (entry is SpaceSpacesEntry) { if (entry is SpaceSpacesEntry) {
final room = entry.space; final room = entry.space;
if ((parent == null && room.spaceParents.isNotEmpty) || // don't add rooms with parent space apart from those where the
// parent space is not joined
if ((parent == null &&
room.spaceParents.isNotEmpty &&
room.hasNotJoinedParentSpace()) ||
(parent != null && (parent != null &&
!room.spaceParents.any((element) => element.roomId == parent))) { !room.spaceParents.any((element) => element.roomId == parent))) {
return null; return null;
@ -174,3 +177,14 @@ class SpacesEntryMaybeChildren {
return jsonEncode(toJson()); return jsonEncode(toJson());
} }
} }
extension on Room {
bool hasNotJoinedParentSpace() {
return (spaceParents.isEmpty ||
spaceParents.none(
(p0) =>
(p0.canonical ?? true) &&
client.rooms.map((e) => e.id).contains(p0.roomId),
));
}
}

View File

@ -62,6 +62,7 @@ class _SpacesHierarchyProposalsState extends State<SpacesHierarchyProposals> {
builder: (context, snapshot) { builder: (context, snapshot) {
Widget child; Widget child;
if (snapshot.hasData) { if (snapshot.hasData) {
final thereWereRooms = snapshot.data!.rooms.isNotEmpty;
final rooms = snapshot.data!.rooms.where( final rooms = snapshot.data!.rooms.where(
(element) => (element) =>
element.roomId != widget.space && element.roomId != widget.space &&
@ -72,9 +73,11 @@ class _SpacesHierarchyProposalsState extends State<SpacesHierarchyProposals> {
// in case not, just leave it... // in case not, just leave it...
: true) && : true) &&
client.rooms client.rooms
.any((knownRoom) => element.roomId != knownRoom.id), .every((knownRoom) => element.roomId != knownRoom.id),
); );
if (rooms.isEmpty) child = const ListTile(key: ValueKey(false)); if (rooms.isEmpty && !thereWereRooms) {
child = const ListTile(key: ValueKey(false));
}
child = Column( child = Column(
key: ValueKey(widget.space), key: ValueKey(widget.space),
mainAxisSize: MainAxisSize.min, mainAxisSize: MainAxisSize.min,
@ -96,6 +99,11 @@ class _SpacesHierarchyProposalsState extends State<SpacesHierarchyProposals> {
), ),
onTap: _refreshRooms, onTap: _refreshRooms,
), ),
if (rooms.isEmpty && thereWereRooms)
ListTile(
leading: const Icon(Icons.info),
title: Text(L10n.of(context)!.allSuggestedRoomsJoined),
),
...rooms.map( ...rooms.map(
(e) => RecommendedRoomListItem( (e) => RecommendedRoomListItem(
room: e, room: e,