add JumpToEventController to allow jumping to events from the NotificationsPage when it has been pushed from the NotificationController

This commit is contained in:
Henry Hiles 2026-09-26 19:37:47 -04:00
commit 1c1f585362
Signed by: Henry-Hiles
SSH key fingerprint: SHA256:VKQUdS31Q90KvX7EkKMHMBpUspcmItAh86a+v7PGiIs
5 changed files with 70 additions and 65 deletions

View file

@ -0,0 +1,15 @@
import "package:flutter_riverpod/flutter_riverpod.dart";
class JumpToEventController extends Notifier<String?> {
@override
String? build() => null;
void set(String? eventId) => state = eventId;
@override
bool updateShouldNotify(_, _) => true;
static final provider = NotifierProvider<JumpToEventController, String?>(
JumpToEventController.new,
);
}

View file

@ -37,7 +37,6 @@ class NotificationController
MaterialPageRoute( MaterialPageRoute(
builder: (_) => NotificationsPage( builder: (_) => NotificationsPage(
highlightedEventId: eventId, highlightedEventId: eventId,
jumpToEvent: (eventId) {},
defaultToAllNotifications: true, defaultToAllNotifications: true,
), ),
), ),
@ -63,7 +62,6 @@ class NotificationController
MaterialPageRoute( MaterialPageRoute(
builder: (_) => NotificationsPage( builder: (_) => NotificationsPage(
highlightedEventId: eventId, highlightedEventId: eventId,
jumpToEvent: (eventId) {},
defaultToAllNotifications: true, defaultToAllNotifications: true,
), ),
), ),

View file

@ -1,7 +1,7 @@
import "package:flutter_hooks/flutter_hooks.dart";
import "package:material_ui/material_ui.dart"; import "package:material_ui/material_ui.dart";
import "package:hooks_riverpod/hooks_riverpod.dart"; import "package:hooks_riverpod/hooks_riverpod.dart";
import "package:nexus/controllers/init_complete.dart"; import "package:nexus/controllers/init_complete.dart";
import "package:nexus/controllers/jump_to_event.dart";
import "package:nexus/controllers/key.dart"; import "package:nexus/controllers/key.dart";
import "package:nexus/widgets/appbar.dart"; import "package:nexus/widgets/appbar.dart";
import "package:nexus/widgets/sidebar.dart"; import "package:nexus/widgets/sidebar.dart";
@ -10,61 +10,51 @@ import "package:nexus/widgets/loading.dart";
class const ChatPage({super.key}) extends HookConsumerWidget { class const ChatPage({super.key}) extends HookConsumerWidget {
@override @override
Widget build(BuildContext context, WidgetRef ref) { Widget build(BuildContext context, WidgetRef ref) => LayoutBuilder(
final initialHighlightedEvent = useState<String?>(null); builder: (context, constraints) {
final isDesktop = constraints.maxWidth > 650;
final showMembersByDefault = constraints.maxWidth > 1000;
final initComplete = ref.watch(InitCompleteController.provider);
final roomId = ref
.watch(KeyController.provider(KeyController.roomKey))
.requireValue;
return LayoutBuilder( return SafeArea(
builder: (context, constraints) { child: Scaffold(
final isDesktop = constraints.maxWidth > 650; appBar: initComplete ? null : Appbar(),
final showMembersByDefault = constraints.maxWidth > 1000; body: initComplete
final initComplete = ref.watch(InitCompleteController.provider); ? Row(
final roomId = ref children: [
.watch(KeyController.provider(KeyController.roomKey)) if (isDesktop) Sidebar(isDesktop: isDesktop),
.requireValue; Expanded(
child: Consumer(
return SafeArea( builder: (context, ref, _) {
child: Scaffold( final initialHighlight = ref.watch(
appBar: initComplete ? null : Appbar(), JumpToEventController.provider,
body: initComplete );
? Row( return RoomChat(
children: [ key: ValueKey((roomId, initialHighlight)),
if (isDesktop) roomId: roomId,
Sidebar( isDesktop: isDesktop,
isDesktop: isDesktop, initialHighlightedEvent: initialHighlight,
jumpToEvent: (eventId) => showMembersByDefault: showMembersByDefault,
initialHighlightedEvent.value = eventId, );
), },
Expanded(
child: RoomChat(
key: ValueKey((
roomId,
initialHighlightedEvent.value,
)),
roomId: roomId,
isDesktop: isDesktop,
showMembersByDefault: showMembersByDefault,
initialHighlightedEvent:
initialHighlightedEvent.value,
),
), ),
],
)
: Center(
child: Column(
mainAxisSize: .min,
children: [Loading(), Text("Syncing...")],
), ),
],
)
: Center(
child: Column(
mainAxisSize: .min,
children: [Loading(), Text("Syncing...")],
), ),
drawer: isDesktop || !initComplete ),
? null drawer: isDesktop || !initComplete
: Sidebar( ? null
isDesktop: isDesktop, : Sidebar(isDesktop: isDesktop),
jumpToEvent: (eventId) => ),
initialHighlightedEvent.value = eventId, );
), },
), );
);
},
);
}
} }

View file

@ -5,6 +5,7 @@ import "package:m3e_buttons/m3e_buttons.dart";
import "package:material_ui/material_ui.dart"; import "package:material_ui/material_ui.dart";
import "package:flutter_hooks/flutter_hooks.dart"; import "package:flutter_hooks/flutter_hooks.dart";
import "package:hooks_riverpod/hooks_riverpod.dart"; import "package:hooks_riverpod/hooks_riverpod.dart";
import "package:nexus/controllers/jump_to_event.dart";
import "package:nexus/controllers/key.dart"; import "package:nexus/controllers/key.dart";
import "package:nexus/controllers/notifications.dart"; import "package:nexus/controllers/notifications.dart";
import "package:nexus/controllers/spaces.dart"; import "package:nexus/controllers/spaces.dart";
@ -19,7 +20,6 @@ import "package:super_sliver_list/super_sliver_list.dart";
class const NotificationsPage({ class const NotificationsPage({
final String? highlightedEventId, final String? highlightedEventId,
final bool defaultToAllNotifications = false, final bool defaultToAllNotifications = false,
required final void Function(String eventId) jumpToEvent,
super.key, super.key,
}) extends HookConsumerWidget { }) extends HookConsumerWidget {
@override @override
@ -166,7 +166,13 @@ class const NotificationsPage({
).notifier, ).notifier,
) )
.set(event.roomId); .set(event.roomId);
jumpToEvent(event.eventId); ref
.read(
JumpToEventController
.provider
.notifier,
)
.set(event.eventId);
Navigator.of(context).pop(); Navigator.of(context).pop();
}, },

View file

@ -16,11 +16,8 @@ import "package:nexus/widgets/room_menu.dart";
// Needed for navigation_rail_m3e (#65). // Needed for navigation_rail_m3e (#65).
import "package:flutter/material.dart" as old_mat; import "package:flutter/material.dart" as old_mat;
class const Sidebar({ class const Sidebar({required final bool isDesktop, super.key})
required final bool isDesktop, extends HookConsumerWidget {
required final void Function(String eventId) jumpToEvent,
super.key,
}) extends HookConsumerWidget {
@override @override
Widget build(BuildContext context, WidgetRef ref) { Widget build(BuildContext context, WidgetRef ref) {
final selectedSpaceProvider = KeyController.provider( final selectedSpaceProvider = KeyController.provider(
@ -197,8 +194,7 @@ class const Sidebar({
tooltip: "Open notifications", tooltip: "Open notifications",
onPressed: () => Navigator.of(context).push( onPressed: () => Navigator.of(context).push(
MaterialPageRoute( MaterialPageRoute(
builder: (_) => builder: (_) => NotificationsPage(),
NotificationsPage(jumpToEvent: jumpToEvent),
), ),
), ),
icon: Icon(Icons.notifications), icon: Icon(Icons.notifications),