Initial commit
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

This commit is contained in:
2026-09-11 15:59:56 -03:00
commit 0037b0b9cf
651 changed files with 199705 additions and 0 deletions

View 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,
),
),
),
],
),
),
],
),
);
}
}