Initial commit
This commit is contained in:
146
lib/pages/chat_list/chat_list_view.dart
Normal file
146
lib/pages/chat_list/chat_list_view.dart
Normal file
@@ -0,0 +1,146 @@
|
||||
// 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,
|
||||
),
|
||||
),
|
||||
),
|
||||
],
|
||||
),
|
||||
),
|
||||
],
|
||||
),
|
||||
);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user