import 'package:flutter/material.dart'; import 'package:salomon_bottom_bar/salomon_bottom_bar.dart'; import 'package:fluffychat/pages/chat_list/chat_list.dart'; import 'package:fluffychat/pages/chat_list/spaces_entry.dart'; import 'package:fluffychat/widgets/avatar.dart'; import 'package:fluffychat/widgets/matrix.dart'; class SpacesBottomBar extends StatelessWidget { final ChatListController controller; const SpacesBottomBar(this.controller, {Key? key}) : super(key: key); @override Widget build(BuildContext context) { final foundIndex = controller.spacesEntries.indexWhere( (se) => spacesEntryRoughEquivalence(se, controller.activeSpacesEntry)); final currentIndex = foundIndex == -1 ? 0 : foundIndex; return Material( color: Theme.of(context).appBarTheme.backgroundColor, elevation: 6, child: SafeArea( child: StreamBuilder( stream: Matrix.of(context).client.onSync.stream.where((sync) => (sync.rooms?.join?.values.any((r) => r.state?.any((s) => s.type.startsWith('m.space')) ?? false) ?? false) || (sync.rooms?.leave?.isNotEmpty ?? false)), builder: (context, snapshot) { return Container( height: 56, alignment: Alignment.center, child: SingleChildScrollView( scrollDirection: Axis.horizontal, child: SalomonBottomBar( itemPadding: const EdgeInsets.all(8), currentIndex: currentIndex, onTap: (i) => controller.setActiveSpacesEntry( context, controller.spacesEntries[i], ), selectedItemColor: Theme.of(context).colorScheme.primary, items: controller.spacesEntries .map((entry) => _buildSpacesEntryUI(context, entry)) .toList(), ), ), ); }), ), ); } SalomonBottomBarItem _buildSpacesEntryUI( BuildContext context, SpacesEntry entry) { final space = entry.getSpace(context); if (space != null) { return SalomonBottomBarItem( icon: InkWell( borderRadius: BorderRadius.circular(28), onTap: () => controller.setActiveSpacesEntry( context, entry, ), onLongPress: () => controller.editSpace(context, space.id), child: Avatar( mxContent: space.avatar, name: space.displayname, size: 24, fontSize: 12, ), ), title: Text(entry.getName(context)), ); } return SalomonBottomBarItem( icon: entry.getIcon(false), activeIcon: entry.getIcon(true), title: Text(entry.getName(context)), ); } }