144 lines
5.2 KiB
Dart
144 lines
5.2 KiB
Dart
import "package:flutter/material.dart";
|
|
import "package:hooks_riverpod/hooks_riverpod.dart";
|
|
import "package:nexus/controllers/rooms_controller.dart";
|
|
import "package:nexus/helpers/extensions/mxc_to_https.dart";
|
|
import "package:nexus/widgets/appbar.dart";
|
|
import "package:nexus/widgets/avatar_or_hash.dart";
|
|
import "package:nexus/widgets/expandable_image.dart";
|
|
import "package:nexus/controllers/client_state_controller.dart";
|
|
import "package:nexus/widgets/linkified_text.dart";
|
|
import "package:nexus/widgets/room_menu.dart";
|
|
|
|
class RoomAppbar extends ConsumerWidget implements PreferredSizeWidget {
|
|
final bool isDesktop;
|
|
final void Function(BuildContext context)? onOpenMemberList;
|
|
final void Function(BuildContext context) onOpenDrawer;
|
|
final String? roomId;
|
|
const RoomAppbar({
|
|
required this.roomId,
|
|
required this.isDesktop,
|
|
required this.onOpenDrawer,
|
|
this.onOpenMemberList,
|
|
super.key,
|
|
});
|
|
|
|
@override
|
|
Size get preferredSize => AppBar().preferredSize;
|
|
|
|
@override
|
|
Widget build(BuildContext context, WidgetRef ref) {
|
|
final room = roomId == null
|
|
? null
|
|
: ref.watch(RoomsController.provider.select((value) => value[roomId!]));
|
|
|
|
return Appbar(
|
|
onTap: room == null
|
|
? null
|
|
: () => showDialog(
|
|
context: context,
|
|
builder: (context) => Dialog(
|
|
constraints: .loose(.fromWidth(400)),
|
|
child: Padding(
|
|
padding: .all(24),
|
|
child: Column(
|
|
mainAxisSize: .min,
|
|
crossAxisAlignment: .start,
|
|
spacing: 8,
|
|
children: [
|
|
Row(
|
|
spacing: 12,
|
|
mainAxisSize: .min,
|
|
children: [
|
|
if (room.metadata?.avatar != null)
|
|
ExpandableImage(
|
|
room.metadata!.avatar!
|
|
.mxcToHttps(
|
|
ref.watch(
|
|
ClientStateController.provider.select(
|
|
(value) => value!.homeserverUrl!,
|
|
),
|
|
),
|
|
)
|
|
.toString(),
|
|
child: AvatarOrHash(
|
|
room.metadata?.avatar,
|
|
room.metadata?.name ?? "Unnamed Room",
|
|
height: 64,
|
|
fallback: Icon(Icons.numbers),
|
|
),
|
|
),
|
|
Expanded(
|
|
child: Text(
|
|
room.metadata?.name ?? "Unnamed Room",
|
|
overflow: .ellipsis,
|
|
maxLines: 3,
|
|
style: Theme.of(context).textTheme.headlineSmall,
|
|
),
|
|
),
|
|
],
|
|
),
|
|
if (room.metadata?.topic?.isNotEmpty == true)
|
|
LinkifiedText(
|
|
room.metadata!.topic!,
|
|
style: Theme.of(context).textTheme.bodyLarge
|
|
?.copyWith(
|
|
color: Theme.of(
|
|
context,
|
|
).colorScheme.onSurfaceVariant,
|
|
),
|
|
),
|
|
],
|
|
),
|
|
),
|
|
),
|
|
),
|
|
leading: isDesktop
|
|
? room == null
|
|
? null
|
|
: AvatarOrHash(
|
|
room.metadata?.avatar,
|
|
room.metadata?.name ?? "Unnamed Room",
|
|
height: 24,
|
|
fallback: Icon(Icons.numbers),
|
|
)
|
|
: DrawerButton(onPressed: () => onOpenDrawer(context)),
|
|
scrolledUnderElevation: 0,
|
|
title: room == null
|
|
? null
|
|
: Column(
|
|
crossAxisAlignment: .start,
|
|
children: [
|
|
Text(
|
|
room.metadata?.name ?? "Unnamed Room",
|
|
overflow: .ellipsis,
|
|
maxLines: 1,
|
|
),
|
|
if (room.metadata?.topic?.isNotEmpty == true)
|
|
Text(
|
|
room.metadata!.topic!,
|
|
maxLines: 1,
|
|
overflow: .ellipsis,
|
|
style: Theme.of(context).textTheme.labelMedium?.copyWith(
|
|
color: Theme.of(context).colorScheme.onSurfaceVariant,
|
|
),
|
|
),
|
|
],
|
|
),
|
|
actions: room == null
|
|
? .new()
|
|
: .new([
|
|
IconButton(
|
|
onPressed: null,
|
|
icon: Icon(Icons.push_pin),
|
|
tooltip: "Open pinned messages",
|
|
),
|
|
IconButton(
|
|
onPressed: () => onOpenMemberList?.call(context),
|
|
tooltip: "Open member list",
|
|
icon: Icon(Icons.people),
|
|
),
|
|
RoomMenu(room),
|
|
]),
|
|
);
|
|
}
|
|
}
|