diff --git a/lib/controllers/jump_to_event.dart b/lib/controllers/jump_to_event.dart deleted file mode 100644 index 389f077..0000000 --- a/lib/controllers/jump_to_event.dart +++ /dev/null @@ -1,15 +0,0 @@ -import "package:flutter_riverpod/flutter_riverpod.dart"; - -class JumpToEventController extends Notifier { - @override - String? build() => null; - - void set(String? eventId) => state = eventId; - - @override - bool updateShouldNotify(_, _) => true; - - static final provider = NotifierProvider( - JumpToEventController.new, - ); -} diff --git a/lib/controllers/notification.dart b/lib/controllers/notification.dart index 5ee34499..681c625 100644 --- a/lib/controllers/notification.dart +++ b/lib/controllers/notification.dart @@ -7,7 +7,7 @@ import "package:nexus/controllers/portal.dart"; import "package:nexus/main.dart"; import "package:flutter_local_notifications/flutter_local_notifications.dart"; import "package:flutter_riverpod/flutter_riverpod.dart"; -import "package:nexus/widgets/pages/notifications.dart"; +import "package:nexus/pages/notifications.dart"; import "package:xdg_desktop_portal/xdg_desktop_portal.dart"; class NotificationController diff --git a/lib/helpers/hooks/chat_scroll.dart b/lib/helpers/hooks/chat_scroll.dart index 3b1531eb..bea65b9 100644 --- a/lib/helpers/hooks/chat_scroll.dart +++ b/lib/helpers/hooks/chat_scroll.dart @@ -68,14 +68,6 @@ final class ChatScroll({ if (found || controllerData is AsyncError) { if (found) { anchorId.value = target; - - WidgetsBinding.instance.addPostFrameCallback((_) { - final context = keyFor(target).currentContext; - if (context != null && context.mounted) { - anchorMountedCompleter.value?.complete(context); - anchorMountedCompleter.value = null; - } - }); } else { anchorMountedCompleter.value?.completeError( StateError("Failed to load context for $target"), @@ -88,6 +80,21 @@ final class ChatScroll({ return null; }, [controllerData, pendingAnchorTarget.value]); + useEffect(() { + final completer = anchorMountedCompleter.value; + if (completer == null) return null; + + WidgetsBinding.instance.addPostFrameCallback((_) { + final context = keyFor(anchorId.value!).currentContext; + if (context != null && context.mounted) { + anchorMountedCompleter.value?.complete(context); + anchorMountedCompleter.value = null; + } + }); + + return null; + }, [anchorId.value]); + final ({IList history, IList live}) split = useMemoized(() { final items = controllerData.value?.timeline; final anchor = anchorId.value; diff --git a/lib/main.dart b/lib/main.dart index 5586cbf..bbc8a4e 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -14,10 +14,10 @@ import "package:nexus/controllers/settings.dart"; import "package:nexus/controllers/unified_push.dart"; import "package:nexus/helpers/extensions/scheme_to_theme.dart"; import "package:nexus/helpers/font_licenses.dart"; -import "package:nexus/widgets/pages/chat.dart"; -import "package:nexus/widgets/pages/select_server.dart"; -import "package:nexus/widgets/pages/settings.dart"; -import "package:nexus/widgets/pages/verify.dart"; +import "package:nexus/pages/chat.dart"; +import "package:nexus/pages/select_server.dart"; +import "package:nexus/pages/settings.dart"; +import "package:nexus/pages/verify.dart"; import "package:nexus/widgets/appbar.dart"; import "package:nexus/widgets/error_dialog.dart"; import "package:nexus/widgets/loading.dart"; diff --git a/lib/widgets/pages/chat.dart b/lib/pages/chat.dart similarity index 66% rename from lib/widgets/pages/chat.dart rename to lib/pages/chat.dart index 34efe5c..279f077 100644 --- a/lib/widgets/pages/chat.dart +++ b/lib/pages/chat.dart @@ -1,14 +1,13 @@ import "package:material_ui/material_ui.dart"; import "package:hooks_riverpod/hooks_riverpod.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/widgets/appbar.dart"; import "package:nexus/widgets/sidebar.dart"; import "package:nexus/widgets/room_chat/room_chat.dart"; import "package:nexus/widgets/loading.dart"; -class const ChatPage({super.key}) extends HookConsumerWidget { +class const ChatPage({super.key}) extends ConsumerWidget { @override Widget build(BuildContext context, WidgetRef ref) => LayoutBuilder( builder: (context, constraints) { @@ -27,19 +26,11 @@ class const ChatPage({super.key}) extends HookConsumerWidget { children: [ if (isDesktop) Sidebar(isDesktop: isDesktop), Expanded( - child: Consumer( - builder: (context, ref, _) { - final initialHighlight = ref.watch( - JumpToEventController.provider, - ); - return RoomChat( - key: ValueKey((roomId, initialHighlight)), - roomId: roomId, - isDesktop: isDesktop, - initialHighlightedEvent: initialHighlight, - showMembersByDefault: showMembersByDefault, - ); - }, + child: RoomChat( + key: ValueKey(roomId), + roomId: roomId, + isDesktop: isDesktop, + showMembersByDefault: showMembersByDefault, ), ), ], diff --git a/lib/widgets/pages/notifications.dart b/lib/pages/notifications.dart similarity index 67% rename from lib/widgets/pages/notifications.dart rename to lib/pages/notifications.dart index c8cfe76..3e70104 100644 --- a/lib/widgets/pages/notifications.dart +++ b/lib/pages/notifications.dart @@ -1,14 +1,10 @@ import "dart:async"; -import "package:collection/collection.dart"; import "package:m3e_buttons/m3e_buttons.dart"; import "package:material_ui/material_ui.dart"; import "package:flutter_hooks/flutter_hooks.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/notifications.dart"; -import "package:nexus/controllers/spaces.dart"; import "package:nexus/models/event.dart"; import "package:nexus/widgets/appbar.dart"; import "package:nexus/widgets/error_dialog.dart"; @@ -131,54 +127,9 @@ class const NotificationsPage({ child: HighlightWrapper( InkWell( onTap: () { - final spaces = ref.read( - SpacesController.provider, - ); - final space = spaces.firstWhereOrNull( - (space) => - space.children.any( - (room) => - room.metadata?.id == - event.roomId, - ) || - space.subSpaces.any( - (subSpace) => - subSpace.children.any( - (room) => - room.metadata?.id == - event.roomId, - ), - ), - ); - if (space == null) return; - - ref - .read( - KeyController.provider( - KeyController.spaceKey, - ).notifier, - ) - .set(space.id); - ref - .read( - KeyController.provider( - KeyController.roomKey, - ).notifier, - ) - .set(event.roomId); - ref - .read( - JumpToEventController - .provider - .notifier, - ) - .set(event.eventId); - - Navigator.of(context).pop(); + // TODO: Jump to event }, - child: IgnorePointer( - child: EventRenderer(event), - ), + child: EventRenderer(event), ), isHighlighted: isHighlighted, ), diff --git a/lib/widgets/pages/select_server.dart b/lib/pages/select_server.dart similarity index 99% rename from lib/widgets/pages/select_server.dart rename to lib/pages/select_server.dart index 34f1a50..a903cf6 100644 --- a/lib/widgets/pages/select_server.dart +++ b/lib/pages/select_server.dart @@ -9,7 +9,7 @@ import "package:nexus/controllers/client_id.dart"; import "package:nexus/helpers/launch_helper.dart"; import "package:nexus/main.dart"; import "package:nexus/models/homeserver.dart"; -import "package:nexus/widgets/pages/settings.dart"; +import "package:nexus/pages/settings.dart"; import "package:nexus/widgets/appbar.dart"; import "package:nexus/widgets/divider_text.dart"; diff --git a/lib/widgets/pages/settings.dart b/lib/pages/settings.dart similarity index 99% rename from lib/widgets/pages/settings.dart rename to lib/pages/settings.dart index 50eb7f0..ed9dc59 100644 --- a/lib/widgets/pages/settings.dart +++ b/lib/pages/settings.dart @@ -8,7 +8,7 @@ import "package:navigation_rail_m3e/navigation_rail_m3e.dart"; import "package:nexus/controllers/settings_sections.dart"; import "package:nexus/helpers/extensions/better_when.dart"; import "package:nexus/helpers/extensions/show_about_dialog.dart"; -import "package:nexus/widgets/pages/settings_category.dart"; +import "package:nexus/pages/settings_category.dart"; import "package:nexus/widgets/divider_text.dart"; import "package:nexus/widgets/highlight_wrapper.dart"; import "package:super_sliver_list/super_sliver_list.dart"; diff --git a/lib/widgets/pages/settings_category.dart b/lib/pages/settings_category.dart similarity index 100% rename from lib/widgets/pages/settings_category.dart rename to lib/pages/settings_category.dart diff --git a/lib/widgets/pages/verify.dart b/lib/pages/verify.dart similarity index 98% rename from lib/widgets/pages/verify.dart rename to lib/pages/verify.dart index a4f95ec..42a8dfc 100644 --- a/lib/widgets/pages/verify.dart +++ b/lib/pages/verify.dart @@ -2,7 +2,7 @@ import "package:material_ui/material_ui.dart"; import "package:flutter_hooks/flutter_hooks.dart"; import "package:hooks_riverpod/hooks_riverpod.dart"; import "package:nexus/controllers/client.dart"; -import "package:nexus/widgets/pages/settings.dart"; +import "package:nexus/pages/settings.dart"; import "package:nexus/widgets/appbar.dart"; import "package:nexus/helpers/required_validator_helper.dart"; diff --git a/lib/widgets/room_chat/room_chat.dart b/lib/widgets/room_chat/room_chat.dart index 709d22d..f58bda0 100644 --- a/lib/widgets/room_chat/room_chat.dart +++ b/lib/widgets/room_chat/room_chat.dart @@ -32,7 +32,7 @@ final class const RoomChat({ final relatedEvent = useState(null); final relationType = useState(RelationType.reply); final contextualEvent = useState(initialHighlightedEvent); - final highlightedEvent = useState(null); + final highlightedEvent = useState(initialHighlightedEvent); final composerSize = useState(64); @@ -106,24 +106,6 @@ final class const RoomChat({ }); } - useEffect(() { - if (initialHighlightedEvent == null) return null; - - void check() { - if (!context.mounted) return; - - if (scroll.scrollController.hasClients) { - jumpToId(initialHighlightedEvent!); - } else { - WidgetsBinding.instance.addPostFrameCallback((_) => check()); - } - } - - check(); - - return null; - }, [initialHighlightedEvent]); - IList getEventOptions(Event event) => event.buildEventOptions( context: context, diff --git a/lib/widgets/sidebar.dart b/lib/widgets/sidebar.dart index 6689ce2..b2d8295 100644 --- a/lib/widgets/sidebar.dart +++ b/lib/widgets/sidebar.dart @@ -6,8 +6,8 @@ import "package:navigation_rail_m3e/navigation_rail_m3e.dart"; import "package:nexus/controllers/key.dart"; import "package:nexus/controllers/spaces.dart"; import "package:nexus/models/room.dart"; -import "package:nexus/widgets/pages/notifications.dart"; -import "package:nexus/widgets/pages/settings.dart"; +import "package:nexus/pages/notifications.dart"; +import "package:nexus/pages/settings.dart"; import "package:nexus/widgets/avatar_or_hash.dart"; import "package:nexus/widgets/divider_widget.dart"; import "package:nexus/widgets/join_dialog.dart";