fluffychat/lib/pages/chat_list/chat_list_header.dart

177 lines
7.3 KiB
Dart
Raw Normal View History

import 'package:flutter/material.dart';
import 'package:flutter_gen/gen_l10n/l10n.dart';
2023-03-19 18:59:50 +00:00
import 'package:fluffychat/config/themes.dart';
import 'package:fluffychat/pages/chat_list/chat_list.dart';
import 'package:fluffychat/pages/chat_list/client_chooser_button.dart';
2022-08-30 18:24:36 +00:00
import '../../widgets/matrix.dart';
class ChatListHeader extends StatelessWidget implements PreferredSizeWidget {
final ChatListController controller;
const ChatListHeader({super.key, required this.controller});
@override
Widget build(BuildContext context) {
final selectMode = controller.selectMode;
2023-03-19 18:59:50 +00:00
return SliverAppBar(
floating: true,
2023-12-22 19:18:51 +00:00
toolbarHeight: 72,
pinned:
FluffyThemes.isColumnMode(context) || selectMode != SelectMode.normal,
scrolledUnderElevation: selectMode == SelectMode.normal ? 0 : null,
backgroundColor:
selectMode == SelectMode.normal ? Colors.transparent : null,
2022-07-07 16:50:13 +00:00
automaticallyImplyLeading: false,
leading: selectMode == SelectMode.normal
? null
: IconButton(
tooltip: L10n.of(context)!.cancel,
icon: const Icon(Icons.close_outlined),
onPressed: controller.cancelAction,
color: Theme.of(context).colorScheme.primary,
),
title: selectMode == SelectMode.share
? Text(
L10n.of(context)!.share,
key: const ValueKey(SelectMode.share),
)
: selectMode == SelectMode.select
? Text(
controller.selectedRoomIds.length.toString(),
key: const ValueKey(SelectMode.select),
)
2023-07-22 09:11:35 +00:00
: TextField(
controller: controller.searchController,
2023-08-13 11:13:52 +00:00
focusNode: controller.searchFocusNode,
2023-07-22 09:11:35 +00:00
textInputAction: TextInputAction.search,
onChanged: controller.onSearchEnter,
decoration: InputDecoration(
2023-08-11 12:07:51 +00:00
fillColor: Theme.of(context).colorScheme.secondaryContainer,
2023-07-22 09:11:35 +00:00
border: UnderlineInputBorder(
borderSide: BorderSide.none,
2023-08-11 12:07:51 +00:00
borderRadius: BorderRadius.circular(99),
2022-07-07 16:50:13 +00:00
),
hintText: L10n.of(context)!.searchChatsRooms,
hintStyle: TextStyle(
color: Theme.of(context).colorScheme.onPrimaryContainer,
fontWeight: FontWeight.normal,
),
2023-07-22 09:11:35 +00:00
floatingLabelBehavior: FloatingLabelBehavior.never,
prefixIcon: controller.isSearchMode
? IconButton(
tooltip: L10n.of(context)!.cancel,
icon: const Icon(Icons.close_outlined),
onPressed: controller.cancelSearch,
color: Theme.of(context)
.colorScheme
.onPrimaryContainer,
2023-07-22 09:11:35 +00:00
)
2023-08-13 09:15:13 +00:00
: IconButton(
onPressed: controller.startSearch,
icon: Icon(
Icons.search_outlined,
color: Theme.of(context)
.colorScheme
.onPrimaryContainer,
2023-08-13 09:15:13 +00:00
),
2023-07-22 09:11:35 +00:00
),
suffixIcon: controller.isSearchMode
? controller.isSearching
? const Padding(
padding: EdgeInsets.symmetric(
vertical: 10.0,
horizontal: 12,
),
child: SizedBox.square(
dimension: 24,
child: CircularProgressIndicator.adaptive(
strokeWidth: 2,
),
),
)
2023-08-13 09:15:13 +00:00
: TextButton.icon(
2023-07-22 09:11:35 +00:00
onPressed: controller.setServer,
style: TextButton.styleFrom(
2023-08-13 09:15:13 +00:00
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(99),
),
2023-07-22 09:11:35 +00:00
textStyle: const TextStyle(fontSize: 12),
),
2023-08-13 09:15:13 +00:00
icon: const Icon(Icons.edit_outlined, size: 16),
label: Text(
2023-07-22 09:11:35 +00:00
controller.searchServer ??
Matrix.of(context)
.client
.homeserver!
.host,
maxLines: 2,
),
)
: SizedBox(
width: 0,
child: ClientChooserButton(controller),
),
2022-07-07 16:50:13 +00:00
),
),
actions: selectMode == SelectMode.share
2022-09-10 09:53:39 +00:00
? [
Padding(
padding: const EdgeInsets.symmetric(
horizontal: 16.0,
vertical: 8.0,
),
child: ClientChooserButton(controller),
),
]
: selectMode == SelectMode.select
? [
if (controller.spaces.isNotEmpty)
IconButton(
tooltip: L10n.of(context)!.addToSpace,
2022-08-30 18:24:36 +00:00
icon: const Icon(Icons.workspaces_outlined),
onPressed: controller.addToSpace,
),
IconButton(
tooltip: L10n.of(context)!.toggleUnread,
icon: Icon(
controller.anySelectedRoomNotMarkedUnread
? Icons.mark_chat_read_outlined
: Icons.mark_chat_unread_outlined,
),
onPressed: controller.toggleUnread,
),
IconButton(
tooltip: L10n.of(context)!.toggleFavorite,
icon: Icon(
controller.anySelectedRoomNotFavorite
? Icons.push_pin_outlined
: Icons.push_pin,
),
onPressed: controller.toggleFavouriteRoom,
),
IconButton(
icon: Icon(
controller.anySelectedRoomNotMuted
? Icons.notifications_off_outlined
: Icons.notifications_outlined,
),
tooltip: L10n.of(context)!.toggleMuted,
onPressed: controller.toggleMuted,
),
IconButton(
icon: const Icon(Icons.delete_outlined),
tooltip: L10n.of(context)!.archive,
onPressed: controller.archiveAction,
),
]
2022-07-07 16:50:13 +00:00
: null,
);
}
@override
Size get preferredSize => const Size.fromHeight(56);
}