fluffychat/lib/widgets/list_items/public_room_list_item.dart

60 lines
1.9 KiB
Dart
Raw Normal View History

import 'package:matrix/matrix.dart';
2020-12-25 09:58:34 +01:00
import 'package:future_loading_dialog/future_loading_dialog.dart';
2020-02-22 20:05:04 +01:00
import 'package:flutter/material.dart';
import 'package:flutter_gen/gen_l10n/l10n.dart';
2021-05-23 13:11:55 +02:00
import 'package:vrouter/vrouter.dart';
2020-02-22 20:05:04 +01:00
import '../avatar.dart';
2020-06-10 10:07:01 +02:00
import '../matrix.dart';
2020-02-22 20:05:04 +01:00
class PublicRoomListItem extends StatelessWidget {
final PublicRoomsChunk publicRoomEntry;
2020-02-22 20:05:04 +01:00
const PublicRoomListItem(this.publicRoomEntry, {Key key}) : super(key: key);
void joinAction(BuildContext context) async {
2020-12-25 09:58:34 +01:00
final success = await showFutureLoadingDialog(
context: context,
future: () => _joinRoomAndWait(context),
);
if (success.error == null) {
2021-08-15 13:26:16 +02:00
VRouter.of(context).toSegments(['rooms', success.result]);
2020-02-22 20:05:04 +01:00
}
}
2020-06-27 13:24:19 +02:00
Future<String> _joinRoomAndWait(BuildContext context) async {
2020-08-16 12:54:43 +02:00
final roomId =
2021-05-20 13:59:55 +02:00
await Matrix.of(context).client.joinRoom(publicRoomEntry.roomId);
2020-06-27 13:24:19 +02:00
if (Matrix.of(context).client.getRoomById(roomId) == null) {
await Matrix.of(context)
.client
2021-09-10 10:44:24 +02:00
.onSync
2020-06-27 13:24:19 +02:00
.stream
2021-09-10 10:44:24 +02:00
.firstWhere((u) => u.rooms?.join?.containsKey(roomId) ?? false);
2020-06-27 13:24:19 +02:00
}
return roomId;
}
2020-02-22 20:05:04 +01:00
@override
Widget build(BuildContext context) {
2020-05-13 15:58:59 +02:00
final hasTopic =
2020-02-22 20:05:04 +01:00
publicRoomEntry.topic != null && publicRoomEntry.topic.isNotEmpty;
return ListTile(
leading: Avatar(publicRoomEntry.avatarUrl, publicRoomEntry.name),
2020-02-22 20:05:04 +01:00
title: Text(hasTopic
2020-05-13 15:58:59 +02:00
? '${publicRoomEntry.name} (${publicRoomEntry.numJoinedMembers})'
2020-02-22 20:05:04 +01:00
: publicRoomEntry.name),
subtitle: Text(
hasTopic
? publicRoomEntry.topic
2020-06-27 13:24:19 +02:00
: publicRoomEntry.numJoinedMembers == null
? L10n.of(context).joinRoom
: L10n.of(context).countParticipants(
publicRoomEntry.numJoinedMembers.toString()),
2020-02-22 20:05:04 +01:00
maxLines: 1,
),
onTap: () => joinAction(context),
);
}
}