Files
tatuchat/lib/pages/chat_list/navigation_rail.dart
Welton Moura 0037b0b9cf
Some checks failed
Main Deploy Workflow / deploy_web (push) Has been cancelled
Main Deploy Workflow / deploy_playstore_internal (push) Has been cancelled
Close stale issues and PRs / stale (push) Has been cancelled
Initial commit
2026-09-11 15:59:56 -03:00

138 lines
5.5 KiB
Dart

// SPDX-FileCopyrightText: 2019-Present Christian Kußowski
// SPDX-FileCopyrightText: 2019-Present Contributors to FluffyChat
//
// SPDX-License-Identifier: AGPL-3.0-or-later
import 'package:tatchat/config/app_config.dart';
import 'package:tatchat/config/themes.dart';
import 'package:tatchat/l10n/l10n.dart';
import 'package:tatchat/pages/chat_list/navi_rail_item.dart';
import 'package:tatchat/pages/chat_list/start_chat_fab.dart';
import 'package:tatchat/utils/matrix_sdk_extensions/matrix_locals.dart';
import 'package:tatchat/utils/stream_extension.dart';
import 'package:tatchat/widgets/avatar.dart';
import 'package:tatchat/widgets/matrix.dart';
import 'package:go_router/go_router.dart';
import 'package:material_ui/material_ui.dart';
import 'package:matrix/matrix.dart';
class SpacesNavigationRail extends StatelessWidget {
final String? activeSpaceId;
final void Function() onGoToChats;
final void Function(String) onGoToSpaceId;
const SpacesNavigationRail({
required this.activeSpaceId,
required this.onGoToChats,
required this.onGoToSpaceId,
super.key,
});
@override
Widget build(BuildContext context) {
final client = Matrix.of(context).client;
final coloredMode = !FluffyThemes.isColumnMode(context);
final theme = Theme.of(context);
return Material(
color: coloredMode ? theme.colorScheme.surfaceContainer : null,
child: SafeArea(
child: StreamBuilder(
key: ValueKey(client.userID.toString()),
stream: client.onSync.stream
.where((s) => s.hasRoomUpdate)
.rateLimit(const Duration(seconds: 1)),
builder: (context, _) {
final allSpaces = client.rooms
.where((room) => room.isSpace)
.toList();
return SizedBox(
width: FluffyThemes.isColumnMode(context)
? FluffyThemes.navRailWidth
: FluffyThemes.navRailWidth - 8,
child: Column(
children: [
Expanded(
child: ListView.builder(
padding: EdgeInsets.symmetric(vertical: 4),
scrollDirection: Axis.vertical,
itemCount: allSpaces.length + 2,
itemBuilder: (context, i) {
if (i == 0) {
return NaviRailItem(
isSelected: activeSpaceId == null,
onTap: onGoToChats,
icon: const Padding(
padding: EdgeInsets.all(12.0),
child: Icon(Icons.forum_outlined),
),
selectedIcon: const Padding(
padding: EdgeInsets.all(12.0),
child: Icon(Icons.forum),
),
toolTip: L10n.of(context).chats,
unreadBadgeFilter: (room) => true,
);
}
i--;
if (i == allSpaces.length) {
return NaviRailItem(
isSelected: false,
onTap: () => context.go('/rooms/newspace'),
icon: const Padding(
padding: EdgeInsets.all(12.0),
child: Icon(Icons.add),
),
toolTip: L10n.of(context).createNewSpace,
);
}
final space = allSpaces[i];
final displayname = allSpaces[i]
.getLocalizedDisplayname(
MatrixLocals(L10n.of(context)),
);
final spaceChildrenIds = space.spaceChildren
.map((c) => c.roomId)
.toSet();
return NaviRailItem(
toolTip: displayname,
isSelected: activeSpaceId == space.id,
onTap: () => onGoToSpaceId(allSpaces[i].id),
unreadBadgeFilter: (room) =>
spaceChildrenIds.contains(room.id),
icon: Avatar(
mxContent: allSpaces[i].avatar,
name: displayname,
//size: 36,
shapeBorder: RoundedSuperellipseBorder(
side: BorderSide(
width: 1,
color: Theme.of(context).dividerColor,
),
borderRadius: BorderRadius.circular(
AppConfig.spaceBorderRadius,
),
),
borderRadius: BorderRadius.circular(
AppConfig.spaceBorderRadius,
),
),
);
},
),
),
if (FluffyThemes.isColumnMode(context))
Padding(
padding: const EdgeInsets.all(12.0),
child: StartChatFab(),
),
],
),
);
},
),
),
);
}
}