Merge branch 'main' of https://github.com/pangeachat/client into move-chat-buttons
commit
276f3ee913
@ -0,0 +1,47 @@
|
||||
import 'dart:async';
|
||||
|
||||
import 'package:fluffychat/pages/chat_list/chat_list.dart';
|
||||
import 'package:fluffychat/pages/chat_list/chat_list_header.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
|
||||
/// A wrapper around ChatListHeader to allow rebuilding on state changes.
|
||||
/// Prevents having to rebuild the entire ChatList when a single item changes.
|
||||
class ChatListHeaderWrapper extends StatefulWidget {
|
||||
final ChatListController controller;
|
||||
final bool globalSearch;
|
||||
|
||||
const ChatListHeaderWrapper({
|
||||
super.key,
|
||||
required this.controller,
|
||||
this.globalSearch = true,
|
||||
});
|
||||
|
||||
@override
|
||||
ChatListHeaderWrapperState createState() => ChatListHeaderWrapperState();
|
||||
}
|
||||
|
||||
class ChatListHeaderWrapperState extends State<ChatListHeaderWrapper> {
|
||||
StreamSubscription? stateSub;
|
||||
|
||||
@override
|
||||
void initState() {
|
||||
super.initState();
|
||||
stateSub = widget.controller.selectionsStream.stream.listen((roomID) {
|
||||
setState(() {});
|
||||
});
|
||||
}
|
||||
|
||||
@override
|
||||
void dispose() {
|
||||
stateSub?.cancel();
|
||||
super.dispose();
|
||||
}
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return ChatListHeader(
|
||||
controller: widget.controller,
|
||||
globalSearch: widget.globalSearch,
|
||||
);
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,71 @@
|
||||
import 'dart:async';
|
||||
|
||||
import 'package:fluffychat/pages/chat_list/chat_list.dart';
|
||||
import 'package:fluffychat/pages/chat_list/chat_list_item.dart';
|
||||
import 'package:fluffychat/pages/chat_list/utils/on_chat_tap.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:matrix/matrix.dart';
|
||||
|
||||
/// A wrapper around ChatListItem to allow rebuilding on state changes.
|
||||
/// Prevents having to rebuild the entire ChatList when a single item changes.
|
||||
class ChatListItemWrapper extends StatefulWidget {
|
||||
final Room room;
|
||||
final bool activeChat;
|
||||
final void Function()? onForget;
|
||||
final String? filter;
|
||||
final ChatListController controller;
|
||||
|
||||
final void Function()? onLongPress;
|
||||
final void Function()? onTap;
|
||||
|
||||
const ChatListItemWrapper(
|
||||
this.room, {
|
||||
this.activeChat = false,
|
||||
this.onForget,
|
||||
this.filter,
|
||||
required this.controller,
|
||||
this.onLongPress,
|
||||
this.onTap,
|
||||
super.key,
|
||||
});
|
||||
|
||||
@override
|
||||
ChatListItemWrapperState createState() => ChatListItemWrapperState();
|
||||
}
|
||||
|
||||
class ChatListItemWrapperState extends State<ChatListItemWrapper> {
|
||||
StreamSubscription? stateSub;
|
||||
|
||||
@override
|
||||
void initState() {
|
||||
super.initState();
|
||||
stateSub = widget.controller.selectionsStream.stream.listen((roomID) {
|
||||
if (roomID == widget.room.id) {
|
||||
setState(() {});
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
@override
|
||||
void dispose() {
|
||||
stateSub?.cancel();
|
||||
super.dispose();
|
||||
}
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return ChatListItem(
|
||||
widget.room,
|
||||
activeChat: widget.activeChat,
|
||||
selected: widget.controller.selectedRoomIds.contains(widget.room.id),
|
||||
onTap: widget.onTap ??
|
||||
(widget.controller.selectMode == SelectMode.select
|
||||
? () => widget.controller.toggleSelection(widget.room.id)
|
||||
: () => onChatTap(widget.room, context)),
|
||||
onLongPress: widget.onLongPress ??
|
||||
() => widget.controller.toggleSelection(widget.room.id),
|
||||
onForget: widget.onForget,
|
||||
filter: widget.filter,
|
||||
);
|
||||
}
|
||||
}
|
||||
Loading…
Reference in New Issue