Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 6 additions & 4 deletions commet/lib/client/matrix/matrix_client.dart
Original file line number Diff line number Diff line change
Expand Up @@ -701,16 +701,18 @@ class MatrixClient extends Client {

@override
Future<void> leaveRoom(Room room) async {
_rooms.remove(room);
await _matrixClient.leaveRoom(room.identifier);
await _matrixClient.waitForRoomInSync(room.identifier);
await room.close();
return _matrixClient.leaveRoom(room.identifier);
_rooms.remove(room);
}

@override
Future<void> leaveSpace(Space space) async {
await _matrixClient.leaveRoom(space.identifier);
await _matrixClient.waitForRoomInSync(space.identifier);
await space.close();
_spaces.remove(space);
space.close();
return _matrixClient.leaveRoom(space.identifier);
}

void onSyncStatusChanged(matrix.SyncStatusUpdate event) {
Expand Down
25 changes: 25 additions & 0 deletions commet/lib/client/matrix/matrix_space.dart
Original file line number Diff line number Diff line change
Expand Up @@ -220,6 +220,31 @@ class MatrixSpace extends Space {
var leftRoom = client.rooms[index];
if (containsRoom(leftRoom.identifier)) {
_rooms.remove(leftRoom);
_onUpdate.add(null);

// Update preview list
_matrixClient.getSpaceHierarchy(identifier, maxDepth: 1).then((value) {
var chunk = value.rooms
.where((element) => element.roomId == leftRoom.identifier)
.where((element) =>
_matrixClient.getRoomById(element.roomId)?.membership !=
matrix.Membership.join)
.firstOrNull;
if (chunk == null) return;

var viaContent = _matrixRoom
.getState(matrix.EventTypes.SpaceChild, chunk.roomId)
?.content["via"];

List<String> via = const [];

if (viaContent is List) {
via = List.from(viaContent);
}
_previews
.add(MatrixSpaceRoomChunkPreview(chunk, _matrixClient, via: via));
});
_fullyLoaded = true;
}
}

Expand Down
1 change: 0 additions & 1 deletion commet/lib/client/room_preview.dart
Original file line number Diff line number Diff line change
@@ -1,5 +1,4 @@
import 'package:commet/client/client.dart';
import 'package:commet/client/room.dart';
import 'package:flutter/material.dart';

enum RoomPreviewType { room, space, inaccessible }
Expand Down
1 change: 0 additions & 1 deletion commet/lib/ui/atoms/rich_text_field.dart
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,6 @@ import 'package:commet/client/matrix/components/emoticon/matrix_emoticon.dart';
import 'package:commet/client/matrix/components/emoticon/matrix_emoticon_component.dart';
import 'package:commet/client/matrix/components/emoticon/matrix_room_emoticon_component.dart';
import 'package:commet/client/matrix/matrix_client.dart';
import 'package:commet/client/room.dart';
import 'package:commet/main.dart';
import 'package:commet/ui/atoms/emoji_widget.dart';
import 'package:commet/ui/atoms/mention.dart';
Expand Down
1 change: 0 additions & 1 deletion commet/lib/ui/atoms/room_preview.dart
Original file line number Diff line number Diff line change
@@ -1,5 +1,4 @@
import 'package:commet/client/client.dart';
import 'package:commet/client/room.dart';
import 'package:commet/client/room_preview.dart';
import 'package:flutter/material.dart';
import 'package:tiamat/tiamat.dart';
Expand Down
86 changes: 86 additions & 0 deletions commet/lib/ui/atoms/room_preview_text_button.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,86 @@
import 'package:commet/client/client.dart';
import 'package:commet/client/room_preview.dart';
import 'package:commet/main.dart';
import 'package:commet/utils/common_strings.dart';
import 'package:commet/utils/text_utils.dart';
import 'package:flutter/material.dart';
import 'package:tiamat/tiamat.dart' as tiamat;

class RoomPreviewTextButton extends StatefulWidget {
const RoomPreviewTextButton(
this.room, {
this.onTap,
super.key,
});
final RoomPreview room;
final Function(RoomPreview roomPreview)? onTap;

@override
State<RoomPreviewTextButton> createState() => _RoomPreviewTextButtonState();
}

class _RoomPreviewTextButtonState extends State<RoomPreviewTextButton> {
@override
void initState() {
super.initState();
}

static const double height = 37;

@override
Widget build(BuildContext context) {
var color = Theme.of(context).colorScheme.secondary;

bool showRoomIcons = preferences.showRoomAvatars;
bool useGenericIcons = preferences.usePlaceholderRoomAvatars;

String displayName = widget.room.displayName;

Color? avatarPlaceholderColor =
(showRoomIcons && useGenericIcons && widget.room.avatar == null) ||
(!showRoomIcons && useGenericIcons)
? widget.room.color
: null;

String? avatarPlaceholderText =
(showRoomIcons && useGenericIcons && widget.room.avatar == null) ||
(!showRoomIcons && useGenericIcons)
? widget.room.displayName
: null;

bool startsWithEmoji =
TextUtils.isEmoji(widget.room.displayName.characters.first);

if (startsWithEmoji && widget.room.avatar == null) {
var emoji = displayName.characters.first;
displayName = displayName.characters.skip(1).string.trim();
avatarPlaceholderColor = Colors.transparent;
avatarPlaceholderText = emoji;
}
var customBuilder = null;

IconData? icon = widget.room.type?.icon;

Widget result = SizedBox(
height: customBuilder == null ? height : null,
child: tiamat.TextButton(
displayName,
customBuilder: customBuilder,
icon: icon,
avatar: showRoomIcons && widget.room.avatar != null
? widget.room.avatar
: null,
avatarRadius: 12,
avatarPlaceholderColor: avatarPlaceholderColor,
avatarPlaceholderText: avatarPlaceholderText,
iconColor: color,
textColor: color,
softwrap: false,
onTap: () => widget.onTap?.call(widget.room),
footer: tiamat.Text.labelLow(CommonStrings.promptJoin,
color: Theme.of(context).colorScheme.primary),
));

return result;
}
}
38 changes: 38 additions & 0 deletions commet/lib/ui/atoms/space_list.dart
Original file line number Diff line number Diff line change
@@ -1,9 +1,12 @@
import 'dart:async';

import 'package:commet/client/client.dart';
import 'package:commet/client/room_preview.dart';
import 'package:commet/client/space_child.dart';
import 'package:commet/main.dart';
import 'package:commet/ui/atoms/room_preview_text_button.dart';
import 'package:commet/ui/atoms/room_text_button.dart';
import 'package:commet/ui/navigation/adaptive_dialog.dart';
import 'package:commet/utils/event_bus.dart';
import 'package:flutter/material.dart';
import 'package:implicitly_animated_list/implicitly_animated_list.dart';
Expand All @@ -24,6 +27,8 @@ class SpaceList extends StatefulWidget {
}

class _SpaceListState extends State<SpaceList> {
late List<RoomPreview> previews;

late List<SpaceChild> children;

late List<StreamSubscription> subs;
Expand All @@ -35,8 +40,15 @@ class _SpaceListState extends State<SpaceList> {
@override
void initState() {
children = widget.space.children;
previews = widget.space.childPreviews;

subs = [
widget.space.onChildRoomPreviewAdded
.listen((_) => onPreviewListChanged()),
widget.space.onChildRoomPreviewsUpdated
.listen((_) => onPreviewListChanged()),
widget.space.onChildRoomPreviewRemoved
.listen((_) => onPreviewListChanged()),
EventBus.onSelectedRoomChanged.stream.listen(onRoomSelected),
widget.space.onUpdate.listen(onSpaceUpdated),
widget.space.onChildSpaceAdded.listen(onSpaceUpdated),
Expand All @@ -50,9 +62,16 @@ class _SpaceListState extends State<SpaceList> {
super.initState();
}

void onPreviewListChanged() {
setState(() {
previews = widget.space.childPreviews;
});
}

void onSpaceUpdated(void event) {
setState(() {
children = widget.space.children;
previews = widget.space.childPreviews;
});
}

Expand Down Expand Up @@ -82,6 +101,7 @@ class _SpaceListState extends State<SpaceList> {
return Column(
children: [
for (var child in children) buildChild(child),
for (var preview in previews) buildPreviewChild(preview),
],
);
}
Expand Down Expand Up @@ -116,6 +136,24 @@ class _SpaceListState extends State<SpaceList> {
);
}

Widget buildPreviewChild(RoomPreview preview) {
return RoomPreviewTextButton(
preview,
onTap: joinRoomWithConfirmation,
);
}

Future<void> joinRoomWithConfirmation(RoomPreview preview) async {
if (await AdaptiveDialog.confirmation(context,
prompt:
"Are you sure you want to join the room '${preview.displayName}' ?") ==
true) {
Room room = await widget.space.client.joinRoomFromPreview(preview);
await widget.onRoomSelected?.call(room);
subs.add(room.onUpdate.listen(onRoomUpdated));
}
}

Widget buildChild(SpaceChild child) {
if (child case SpaceChildSpace _)
return tiamat.TextButtonExpander(child.child.displayName,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,6 @@ import 'dart:async';

import 'package:commet/client/client.dart';
import 'package:commet/client/components/direct_messages/direct_message_component.dart';
import 'package:commet/client/room.dart';
import 'package:commet/ui/atoms/space_icon.dart';
import 'package:commet/utils/event_bus.dart';
import 'package:flutter/material.dart';
Expand Down
10 changes: 8 additions & 2 deletions commet/lib/ui/organisms/space_summary/space_summary.dart
Original file line number Diff line number Diff line change
Expand Up @@ -17,10 +17,15 @@ import '../../navigation/navigation_utils.dart';

class SpaceSummary extends StatefulWidget {
const SpaceSummary(
{super.key, required this.space, this.onRoomTap, this.onSpaceTap});
{super.key,
required this.space,
this.onRoomTap,
this.onSpaceTap,
this.onLeaveRoom});
final Space space;
final Function(Room room)? onRoomTap;
final Function(Space space)? onSpaceTap;
final Function()? onLeaveRoom;
@override
State<SpaceSummary> createState() => _SpaceSummaryState();
}
Expand Down Expand Up @@ -86,7 +91,8 @@ class _SpaceSummaryState extends State<SpaceSummary> {
}

void openRoomSettings(Room room) {
NavigationUtils.navigateTo(context, RoomSettingsPage(room: room));
NavigationUtils.navigateTo(
context, RoomSettingsPage(room: room, onLeaveRoom: widget.onLeaveRoom));
}

void onAddRoomButtonTap() async {
Expand Down
1 change: 1 addition & 0 deletions commet/lib/ui/pages/main/main_page.dart
Original file line number Diff line number Diff line change
Expand Up @@ -317,6 +317,7 @@ class MainPageState extends State<MainPage> {
context,
RoomSettingsPage(
room: currentRoom!,
onLeaveRoom: clearRoomSelection,
));
}
}
Expand Down
1 change: 1 addition & 0 deletions commet/lib/ui/pages/main/main_page_view_desktop.dart
Original file line number Diff line number Diff line change
Expand Up @@ -420,6 +420,7 @@ class MainPageViewDesktop extends StatelessWidget {
space: state.currentSpace!,
onRoomTap: (room) => state.selectRoom(room),
onSpaceTap: (space) => state.selectSpace(space),
onLeaveRoom: state.clearRoomSelection,
),
],
),
Expand Down
1 change: 1 addition & 0 deletions commet/lib/ui/pages/main/main_page_view_mobile.dart
Original file line number Diff line number Diff line change
Expand Up @@ -236,6 +236,7 @@ class _MainPageViewMobileState extends State<MainPageViewMobile> {
widget.state.selectRoom(room);
},
onSpaceTap: (space) => widget.state.selectSpace(space),
onLeaveRoom: widget.state.clearRoomSelection,
),
),
),
Expand Down
4 changes: 3 additions & 1 deletion commet/lib/ui/pages/settings/room_settings_page.dart
Original file line number Diff line number Diff line change
Expand Up @@ -7,8 +7,9 @@ import 'package:flutter/material.dart';
import 'package:intl/intl.dart';

class RoomSettingsPage extends StatefulWidget {
const RoomSettingsPage({super.key, required this.room});
const RoomSettingsPage({super.key, required this.room, this.onLeaveRoom});
final Room room;
final Function()? onLeaveRoom;

@override
State<RoomSettingsPage> createState() => _RoomSettingsPageState();
Expand Down Expand Up @@ -50,6 +51,7 @@ class _RoomSettingsPageState extends State<RoomSettingsPage> {
true) {
if (context.mounted) Navigator.pop(context);
widget.room.client.leaveRoom(widget.room);
widget.onLeaveRoom?.call();
}
}
}
2 changes: 0 additions & 2 deletions commet/lib/utils/event_bus.dart
Original file line number Diff line number Diff line change
@@ -1,8 +1,6 @@
import 'dart:async';
import 'package:commet/client/client.dart';
import 'package:commet/client/components/message_effects/message_effect_particles.dart';
import 'package:commet/client/room.dart';
import 'package:commet/client/space.dart';
import 'package:commet/ui/molecules/overlapping_panels.dart';
import 'package:desktop_drop/desktop_drop.dart';
import 'package:flutter/material.dart';
Expand Down