// SPDX-FileCopyrightText: 2019-Present Christian Kußowski // SPDX-FileCopyrightText: 2019-Present Contributors to FluffyChat // // SPDX-License-Identifier: AGPL-3.0-or-later import 'package:material_ui/material_ui.dart'; import 'package:tatchat/config/app_config.dart'; import 'package:tatchat/config/setting_keys.dart'; import 'package:tatchat/config/themes.dart'; import 'package:tatchat/pages/chat_list/chat_list.dart'; import 'package:tatchat/pages/chat_list/navigation_rail.dart'; import 'package:tatchat/pages/chat_list/start_chat_fab.dart'; import 'package:tatchat/pages/chat_list/tabs/channels_tab.dart'; import 'package:tatchat/pages/chat_list/tabs/chat_tab_bar.dart'; import 'package:tatchat/pages/chat_list/tabs/home_tab.dart'; import 'package:tatchat/pages/chat_list/tabs/murals_tab.dart'; import 'package:tatchat/pages/chat_list/tabs/spaces_tab.dart'; import 'chat_list_body.dart'; class ChatListView extends StatelessWidget { final ChatListController controller; const ChatListView(this.controller, {super.key}); @override Widget build(BuildContext context) { final oneColumnSpacesMode = !FluffyThemes.isColumnMode(context) && AppSettings.displayNavigationRail.value; final isColumnMode = FluffyThemes.isColumnMode(context); final homeTab = controller.homeTab; final showSpacesMode = homeTab == HomeTab.chats; final showNavigationRail = showSpacesMode && (isColumnMode || AppSettings.displayNavigationRail.value); return PopScope( canPop: !controller.isSearchMode && controller.activeSpaceId == null, onPopInvokedWithResult: (pop, _) { if (pop) return; if (controller.activeSpaceId != null) { controller.clearActiveSpace(); return; } if (controller.isSearchMode) { controller.cancelSearch(); return; } }, child: Column( crossAxisAlignment: CrossAxisAlignment.stretch, children: [ if (isColumnMode) ChatTopTabBar( currentTab: homeTab, onTabSelected: controller.setHomeTab, ), Expanded( child: Row( children: [ Material( color: Theme.of(context).colorScheme.surface, child: AnimatedSize( duration: FluffyThemes.animationDuration, curve: FluffyThemes.animationCurve, child: showNavigationRail ? SpacesNavigationRail( activeSpaceId: controller.activeSpaceId, onGoToChats: controller.clearActiveSpace, onGoToSpaceId: controller.setActiveSpace, ) : SizedBox( width: 0, height: MediaQuery.sizeOf(context).height, ), ), ), if (showNavigationRail && isColumnMode) Container(width: 1, color: Theme.of(context).dividerColor), Expanded( child: Scaffold( backgroundColor: showSpacesMode && oneColumnSpacesMode ? Theme.of(context).colorScheme.surfaceContainer : null, body: SafeArea( top: showSpacesMode && oneColumnSpacesMode, bottom: false, left: false, right: false, child: IndexedStack( index: homeTab.index, children: [ Material( clipBehavior: showSpacesMode && oneColumnSpacesMode ? Clip.hardEdge : Clip.none, borderRadius: showSpacesMode && oneColumnSpacesMode ? BorderRadius.only( topLeft: Radius.circular( AppConfig.borderRadius, ), ) : null, color: showSpacesMode && oneColumnSpacesMode ? Theme.of(context).colorScheme.surface : null, child: ChatListViewBody(controller), ), ChannelsTab(controller), SpacesTab(controller), MuralsTab(), ], ), ), floatingActionButton: showSpacesMode && !controller.isSearchMode && controller.activeSpaceId == null && !isColumnMode ? ValueListenableBuilder( valueListenable: controller.scrolledToTop, builder: (context, scrolledToTop, _) => StartChatFab( extended: scrolledToTop && !AppSettings.displayNavigationRail.value, ), ) : const SizedBox.shrink(), bottomNavigationBar: isColumnMode ? null : ChatBottomTabBar( currentTab: homeTab, onTabSelected: controller.setHomeTab, ), ), ), ], ), ), ], ), ); } }