mirror of
https://gitlab.com/famedly/fluffychat.git
synced 2024-12-25 23:12:37 +01:00
99 lines
2.9 KiB
Dart
99 lines
2.9 KiB
Dart
import 'package:flutter/material.dart';
|
|
|
|
import 'package:flutter_gen/gen_l10n/l10n.dart';
|
|
|
|
import 'package:fluffychat/pages/chat_list/chat_list.dart';
|
|
import 'package:fluffychat/pages/chat_list/spaces_drawer.dart';
|
|
import 'package:fluffychat/utils/space_navigator.dart';
|
|
import 'package:fluffychat/widgets/avatar.dart';
|
|
|
|
class SpacesDrawerEntry extends StatelessWidget {
|
|
final SpacesEntryMaybeChildren entry;
|
|
final ChatListController controller;
|
|
|
|
const SpacesDrawerEntry(
|
|
{Key? key, required this.entry, required this.controller})
|
|
: super(key: key);
|
|
|
|
@override
|
|
Widget build(BuildContext context) {
|
|
final space = entry.spacesEntry;
|
|
final room = space.getSpace(context);
|
|
|
|
final active = controller.activeSpacesEntry == entry.spacesEntry;
|
|
final leading = room == null
|
|
? CircleAvatar(
|
|
radius: Avatar.defaultSize / 2,
|
|
backgroundColor: Theme.of(context).colorScheme.secondary,
|
|
foregroundColor: Theme.of(context).colorScheme.onSecondary,
|
|
child: space.getIcon(active),
|
|
)
|
|
: Avatar(
|
|
mxContent: room.avatar,
|
|
name: space.getName(context),
|
|
);
|
|
final title = Text(
|
|
space.getName(context),
|
|
maxLines: 1,
|
|
overflow: TextOverflow.ellipsis,
|
|
);
|
|
final subtitle = room?.topic.isEmpty ?? true
|
|
? null
|
|
: Tooltip(
|
|
message: room!.topic,
|
|
child: Text(
|
|
room.topic.replaceAll('\n', ' '),
|
|
softWrap: false,
|
|
overflow: TextOverflow.fade,
|
|
),
|
|
);
|
|
void onTap() {
|
|
SpaceNavigator.navigateToSpace(space.routeHandle);
|
|
Scaffold.of(context).closeDrawer();
|
|
}
|
|
|
|
final trailing = room != null
|
|
? SizedBox(
|
|
width: 32,
|
|
child: IconButton(
|
|
splashRadius: 24,
|
|
icon: const Icon(Icons.edit_outlined),
|
|
tooltip: L10n.of(context)!.edit,
|
|
onPressed: () => controller.editSpace(context, room.id),
|
|
),
|
|
)
|
|
: const Icon(Icons.arrow_forward_ios_outlined);
|
|
|
|
if (entry.children.isEmpty) {
|
|
return ListTile(
|
|
selected: active,
|
|
leading: leading,
|
|
title: title,
|
|
subtitle: subtitle,
|
|
onTap: onTap,
|
|
trailing: trailing,
|
|
);
|
|
} else {
|
|
return ExpansionTile(
|
|
leading: leading,
|
|
initiallyExpanded:
|
|
entry.children.any((element) => entry.isActiveOfChild(controller)),
|
|
title: GestureDetector(
|
|
onTap: onTap,
|
|
child: Row(
|
|
crossAxisAlignment: CrossAxisAlignment.center,
|
|
mainAxisSize: MainAxisSize.max,
|
|
children: [
|
|
Expanded(child: title),
|
|
const SizedBox(width: 8),
|
|
trailing
|
|
]),
|
|
),
|
|
children: entry.children
|
|
.map((e) => SpacesDrawerEntry(entry: e, controller: controller))
|
|
.toList(),
|
|
);
|
|
}
|
|
}
|
|
}
|