jump to pinned events in view
This commit is contained in:
parent
edc1f95b8d
commit
f6da59ad40
2 changed files with 45 additions and 33 deletions
|
|
@ -9,8 +9,14 @@ import "package:nexus/widgets/renderers/event.dart";
|
|||
|
||||
class PinnedEventsDrawer extends HookConsumerWidget {
|
||||
final String roomId;
|
||||
final IList<PopupMenuEntry> Function(Event event)? getEventOptions;
|
||||
const PinnedEventsDrawer(this.roomId, {this.getEventOptions, super.key});
|
||||
final IList<PopupMenuEntry> Function(Event event) getEventOptions;
|
||||
final Future<void> Function(String eventId) jumpToId;
|
||||
const PinnedEventsDrawer(
|
||||
this.roomId, {
|
||||
required this.getEventOptions,
|
||||
required this.jumpToId,
|
||||
super.key,
|
||||
});
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context, WidgetRef ref) {
|
||||
|
|
@ -60,13 +66,16 @@ class PinnedEventsDrawer extends HookConsumerWidget {
|
|||
borderRadius: .circular(12),
|
||||
onTap: () {
|
||||
Navigator.pop(context);
|
||||
// TODO: // Close drawer, then scroll to the message
|
||||
jumpToId(event.eventId);
|
||||
},
|
||||
child: EventRenderer(
|
||||
event,
|
||||
maxLines: 2,
|
||||
isGrouped: false,
|
||||
getEventOptions: getEventOptions,
|
||||
child: Padding(
|
||||
padding: .symmetric(vertical: 4),
|
||||
child: EventRenderer(
|
||||
event,
|
||||
maxLines: 2,
|
||||
isGrouped: false,
|
||||
getEventOptions: getEventOptions,
|
||||
),
|
||||
),
|
||||
);
|
||||
},
|
||||
|
|
|
|||
|
|
@ -81,6 +81,27 @@ class RoomChat extends HookConsumerWidget {
|
|||
|
||||
final topEventBeforeLoad = useState<String?>(null);
|
||||
|
||||
Future<void> jumpToId(String eventId) async {
|
||||
final index = controllerData.value?.indexWhere(
|
||||
(element) => element.eventId == eventId,
|
||||
);
|
||||
if (index == null) return;
|
||||
|
||||
listController.value.animateToItem(
|
||||
index: index,
|
||||
scrollController: scrollController,
|
||||
alignment: 0.5,
|
||||
duration: (_) => .new(milliseconds: 700),
|
||||
curve: (_) => Curves.easeInOut,
|
||||
);
|
||||
highlightedEvent.value = eventId;
|
||||
await Future.delayed(.new(seconds: 1), () {
|
||||
if (highlightedEvent.value == eventId) {
|
||||
highlightedEvent.value = null;
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
Future<void> loadOlder() async {
|
||||
if (controllerData case AsyncData(:final value?)) {
|
||||
topEventBeforeLoad.value = value.firstOrNull?.eventId;
|
||||
|
|
@ -414,7 +435,11 @@ class RoomChat extends HookConsumerWidget {
|
|||
}
|
||||
|
||||
return Scaffold(
|
||||
endDrawer: PinnedEventsDrawer(roomId, getEventOptions: getEventOptions),
|
||||
endDrawer: PinnedEventsDrawer(
|
||||
roomId,
|
||||
getEventOptions: getEventOptions,
|
||||
jumpToId: jumpToId,
|
||||
),
|
||||
body: Builder(
|
||||
builder: (middleContext) => Scaffold(
|
||||
endDrawer: showMembersByDefault ? null : MemberList(roomId),
|
||||
|
|
@ -468,30 +493,8 @@ class RoomChat extends HookConsumerWidget {
|
|||
return HighlightWrapper(
|
||||
EventRenderer(
|
||||
event,
|
||||
onTapReply: () async {
|
||||
final replyId = event.replyTo;
|
||||
listController.value.animateToItem(
|
||||
index: value.indexWhere(
|
||||
(element) =>
|
||||
element.eventId == replyId,
|
||||
),
|
||||
scrollController: scrollController,
|
||||
alignment: 0.5,
|
||||
duration: (_) =>
|
||||
.new(milliseconds: 700),
|
||||
curve: (_) => Curves.easeInOut,
|
||||
);
|
||||
highlightedEvent.value = replyId;
|
||||
await Future.delayed(
|
||||
.new(seconds: 1),
|
||||
() {
|
||||
if (highlightedEvent.value ==
|
||||
replyId) {
|
||||
highlightedEvent.value = null;
|
||||
}
|
||||
},
|
||||
);
|
||||
},
|
||||
onTapReply: () =>
|
||||
jumpToId(event.replyTo!),
|
||||
getEventOptions: getEventOptions,
|
||||
isGrouped:
|
||||
previousEvent?.content
|
||||
|
|
|
|||
Loading…
Reference in a new issue