From b4d5a632dd22ae644750d44ad48bfd3d5e757db9 Mon Sep 17 00:00:00 2001 From: Henry-Hiles Date: Tue, 3 Nov 2026 14:53:53 -0500 Subject: [PATCH] extract adaptive sheets into their own library `material_adaptive_sheets` --- lib/controllers/room_settings_sections.dart | 2 +- lib/controllers/settings_sections.dart | 2 +- .../extensions/build_event_options.dart | 4 +- lib/helpers/extensions/global_rect.dart | 23 -------- lib/helpers/extensions/is_desktop.dart | 7 --- lib/helpers/extensions/open_link_info.dart | 2 +- lib/helpers/extensions/show_about_sheet.dart | 3 +- .../extensions/show_adaptive_menu.dart | 52 ------------------- .../extensions/show_adaptive_popover.dart | 35 ------------- .../extensions/show_adaptive_sheet.dart | 28 ---------- .../extensions/show_leave_room_sheet.dart | 3 +- lib/helpers/extensions/show_user_popover.dart | 2 +- lib/widgets/account_switcher.dart | 4 +- lib/widgets/adaptive_menu_button.dart | 21 -------- lib/widgets/add_space_rooms_sheet.dart | 2 +- lib/widgets/composer/composer.dart | 3 +- lib/widgets/create_poll_sheet.dart | 2 +- lib/widgets/create_room_sheet.dart | 2 +- lib/widgets/editable_avatar.dart | 2 +- lib/widgets/invites_list.dart | 3 +- lib/widgets/join_sheet.dart | 3 +- lib/widgets/knock_sheet.dart | 2 +- lib/widgets/location_message.dart | 2 +- lib/widgets/location_picker_sheet.dart | 2 +- lib/widgets/location_viewer_sheet.dart | 2 +- lib/widgets/mutual_rooms_sheet.dart | 2 +- lib/widgets/pages/chat.dart | 2 +- lib/widgets/pages/verify.dart | 2 +- lib/widgets/popover_layout.dart | 33 ------------ lib/widgets/read_receipts_row.dart | 2 +- lib/widgets/read_receipts_sheet.dart | 2 +- lib/widgets/recovery_key_sheet.dart | 2 +- lib/widgets/renderers/event.dart | 2 +- lib/widgets/renderers/poll.dart | 3 +- lib/widgets/reset_encryption_sheet.dart | 3 +- lib/widgets/room_appbar.dart | 2 +- lib/widgets/room_list.dart | 3 +- lib/widgets/room_menu_button.dart | 4 +- lib/widgets/room_summary_sheet.dart | 3 +- .../settings/add_users_power_level_sheet.dart | 2 +- lib/widgets/settings/aliases_sheet.dart | 2 +- lib/widgets/settings/allowed_rooms_sheet.dart | 2 +- lib/widgets/settings/dialog_list_tile.dart | 2 +- .../settings/enable_image_packs_sheet.dart | 2 +- lib/widgets/settings/image_pack_sheet.dart | 3 +- lib/widgets/settings/local_aliases_sheet.dart | 2 +- lib/widgets/settings/pack_image_sheet.dart | 2 +- .../settings/power_level_entry_sheet.dart | 2 +- lib/widgets/settings/power_level_tile.dart | 3 +- lib/widgets/settings/radio_sheet.dart | 2 +- lib/widgets/settings/text_setting_tile.dart | 3 +- lib/widgets/sheet_layout.dart | 42 --------------- lib/widgets/space_hierarchy_sheet.dart | 3 +- lib/widgets/start_dm_sheet.dart | 2 +- lib/widgets/timezone_field.dart | 2 +- lib/widgets/user_bottom_sheet.dart | 3 +- lib/widgets/user_span.dart | 2 +- pubspec.lock | 8 +++ pubspec.yaml | 1 + 59 files changed, 59 insertions(+), 309 deletions(-) delete mode 100644 lib/helpers/extensions/global_rect.dart delete mode 100644 lib/helpers/extensions/is_desktop.dart delete mode 100644 lib/helpers/extensions/show_adaptive_menu.dart delete mode 100644 lib/helpers/extensions/show_adaptive_popover.dart delete mode 100644 lib/helpers/extensions/show_adaptive_sheet.dart delete mode 100644 lib/widgets/adaptive_menu_button.dart delete mode 100644 lib/widgets/popover_layout.dart delete mode 100644 lib/widgets/sheet_layout.dart diff --git a/lib/controllers/room_settings_sections.dart b/lib/controllers/room_settings_sections.dart index a821164..817f0ee 100644 --- a/lib/controllers/room_settings_sections.dart +++ b/lib/controllers/room_settings_sections.dart @@ -2,6 +2,7 @@ import "package:fast_immutable_collections/fast_immutable_collections.dart"; import "package:flutter_hooks/flutter_hooks.dart"; import "package:hooks_riverpod/hooks_riverpod.dart"; import "package:material_ui/material_ui.dart"; +import "package:material_adaptive_sheets/material_adaptive_sheets.dart"; import "package:nexus/controllers/client.dart"; import "package:nexus/controllers/client_state.dart"; import "package:nexus/controllers/local_aliases.dart"; @@ -11,7 +12,6 @@ import "package:nexus/controllers/room_image_packs.dart"; import "package:nexus/controllers/room_power_levels.dart"; import "package:nexus/controllers/rooms.dart"; import "package:nexus/controllers/space_edges.dart"; -import "package:nexus/helpers/extensions/show_adaptive_sheet.dart"; import "package:nexus/helpers/extensions/join_rule_name.dart"; import "package:nexus/helpers/file_dialog_helper.dart"; import "package:nexus/helpers/hooks/saving.dart"; diff --git a/lib/controllers/settings_sections.dart b/lib/controllers/settings_sections.dart index ea00982..35c7f94 100644 --- a/lib/controllers/settings_sections.dart +++ b/lib/controllers/settings_sections.dart @@ -7,6 +7,7 @@ import "package:material_ui/material_ui.dart"; import "package:intl/intl.dart"; import "package:m3e_buttons/m3e_buttons.dart"; import "package:multi_state_switch/multi_state_switch.dart"; +import "package:material_adaptive_sheets/material_adaptive_sheets.dart"; import "package:nexus/controllers/account_data.dart"; import "package:nexus/controllers/client.dart"; import "package:nexus/controllers/client_state.dart"; @@ -43,7 +44,6 @@ import "package:nexus/widgets/settings/enable_image_packs_sheet.dart"; import "package:nexus/widgets/settings/keyword_field.dart"; import "package:nexus/widgets/user_bottom_sheet.dart"; import "package:nexus/widgets/reset_encryption_sheet.dart"; -import "package:nexus/helpers/extensions/show_adaptive_sheet.dart"; class SettingsSectionsController extends AsyncNotifier>> { diff --git a/lib/helpers/extensions/build_event_options.dart b/lib/helpers/extensions/build_event_options.dart index 28a05ff..32aaecf 100644 --- a/lib/helpers/extensions/build_event_options.dart +++ b/lib/helpers/extensions/build_event_options.dart @@ -1,9 +1,9 @@ import "package:fast_immutable_collections/fast_immutable_collections.dart"; import "package:material_ui/material_ui.dart"; -import "package:nexus/widgets/sheet_layout.dart"; import "package:flutter/services.dart"; import "package:flutter_hooks/flutter_hooks.dart"; import "package:hooks_riverpod/hooks_riverpod.dart"; +import "package:material_adaptive_sheets/material_adaptive_sheets.dart"; import "package:nexus/controllers/client.dart"; import "package:nexus/controllers/pinned_ids.dart"; import "package:nexus/controllers/power_level.dart"; @@ -12,8 +12,6 @@ import "package:nexus/controllers/rooms.dart"; import "package:nexus/controllers/room_chat.dart"; import "package:nexus/controllers/via.dart"; import "package:nexus/helpers/extensions/event_id_is_fake.dart"; -import "package:nexus/helpers/extensions/is_desktop.dart"; -import "package:nexus/helpers/extensions/show_adaptive_sheet.dart"; import "package:nexus/models/content/message.dart"; import "package:nexus/models/event.dart"; import "package:nexus/models/relation_type.dart"; diff --git a/lib/helpers/extensions/global_rect.dart b/lib/helpers/extensions/global_rect.dart deleted file mode 100644 index 4f2169f..0000000 --- a/lib/helpers/extensions/global_rect.dart +++ /dev/null @@ -1,23 +0,0 @@ -import "package:material_ui/material_ui.dart"; - -extension GlobalRect on BuildContext { - /// Where the widget this context belongs to is on screen, e.g. to open a - /// menu or popover next to it. - Rect get globalRect { - final overlay = Overlay.of(this).context.findRenderObject() as RenderBox; - - return switch (findRenderObject()) { - final RenderBox box => - box.localToGlobal(.zero, ancestor: overlay) & box.size, - _ => Rect.zero, - }; - } - - /// [position] on screen as an empty rect, like where text was tapped, to - /// open a popover there. - Rect globalRectAt(Offset position) { - final overlay = Overlay.of(this).context.findRenderObject() as RenderBox; - - return overlay.globalToLocal(position) & .zero; - } -} diff --git a/lib/helpers/extensions/is_desktop.dart b/lib/helpers/extensions/is_desktop.dart deleted file mode 100644 index d4161dd..0000000 --- a/lib/helpers/extensions/is_desktop.dart +++ /dev/null @@ -1,7 +0,0 @@ -import "package:material_ui/material_ui.dart"; - -extension IsDesktop on BuildContext { - /// Whether the window is wide enough for the desktop layout, with the - /// sidebar always visible, menus instead of bottom sheets, etc. - bool get isDesktop => MediaQuery.sizeOf(this).width > 650; -} diff --git a/lib/helpers/extensions/open_link_info.dart b/lib/helpers/extensions/open_link_info.dart index 5283be1..f8688f8 100644 --- a/lib/helpers/extensions/open_link_info.dart +++ b/lib/helpers/extensions/open_link_info.dart @@ -1,10 +1,10 @@ import "package:material_ui/material_ui.dart"; import "package:flutter_riverpod/flutter_riverpod.dart"; +import "package:material_adaptive_sheets/material_adaptive_sheets.dart"; import "package:nexus/controllers/event.dart"; import "package:nexus/controllers/room_summary.dart"; import "package:nexus/helpers/extensions/focus_room.dart"; import "package:nexus/helpers/extensions/get_link_info.dart"; -import "package:nexus/helpers/extensions/show_adaptive_sheet.dart"; import "package:nexus/helpers/extensions/show_user_popover.dart"; import "package:nexus/models/room_summary.dart"; import "package:nexus/widgets/room_summary_sheet.dart"; diff --git a/lib/helpers/extensions/show_about_sheet.dart b/lib/helpers/extensions/show_about_sheet.dart index ee49283..951b07d 100644 --- a/lib/helpers/extensions/show_about_sheet.dart +++ b/lib/helpers/extensions/show_about_sheet.dart @@ -1,9 +1,8 @@ import "package:material_ui/material_ui.dart"; -import "package:nexus/helpers/extensions/show_adaptive_sheet.dart"; -import "package:nexus/widgets/sheet_layout.dart"; import "package:flutter_svg/flutter_svg.dart"; import "package:hooks_riverpod/hooks_riverpod.dart"; import "package:m3e_card_list/m3e_card_list.dart"; +import "package:material_adaptive_sheets/material_adaptive_sheets.dart"; import "package:nexus/helpers/launch_helper.dart"; import "package:package_info_plus/package_info_plus.dart"; diff --git a/lib/helpers/extensions/show_adaptive_menu.dart b/lib/helpers/extensions/show_adaptive_menu.dart deleted file mode 100644 index 2fe21f5..0000000 --- a/lib/helpers/extensions/show_adaptive_menu.dart +++ /dev/null @@ -1,52 +0,0 @@ -import "package:material_ui/material_ui.dart"; -import "package:nexus/helpers/extensions/global_rect.dart"; -import "package:nexus/helpers/extensions/is_desktop.dart"; - -extension ShowAdaptiveMenu on BuildContext { - /// Shows [items] in a popup menu on desktop, or a bottom sheet on mobile. - /// - /// On desktop, the menu opens at [globalPosition] if given (e.g. where the - /// user right clicked), or over the widget this context belongs to. - Future showAdaptiveMenu( - List items, { - Offset? globalPosition, - }) async { - if (!isDesktop) { - await showModalBottomSheet( - context: this, - isScrollControlled: true, - showDragHandle: true, - builder: (context) => SafeArea( - child: SingleChildScrollView( - padding: const .only(bottom: 8), - // PopupMenuItems must be inside something with the menu role - child: Semantics( - role: .menu, - explicitChildNodes: true, - child: ListTileTheme.merge( - contentPadding: const .symmetric(horizontal: 24), - minTileHeight: 48, - titleTextStyle: Theme.of(context).textTheme.titleMedium, - child: Column(mainAxisSize: .min, children: items), - ), - ), - ), - ), - ); - return; - } - - final overlay = Overlay.of(this).context.findRenderObject() as RenderBox; - final anchor = switch (globalPosition) { - final position? => position & Size.zero, - null => globalRect, - }; - - await showMenu( - context: this, - constraints: .loose(.infinite), - position: .fromRect(anchor, Offset.zero & overlay.size), - items: items, - ); - } -} diff --git a/lib/helpers/extensions/show_adaptive_popover.dart b/lib/helpers/extensions/show_adaptive_popover.dart deleted file mode 100644 index 3d2a94c..0000000 --- a/lib/helpers/extensions/show_adaptive_popover.dart +++ /dev/null @@ -1,35 +0,0 @@ -import "package:material_ui/material_ui.dart"; -import "package:nexus/helpers/extensions/global_rect.dart"; -import "package:nexus/helpers/extensions/is_desktop.dart"; -import "package:nexus/helpers/extensions/show_adaptive_sheet.dart"; -import "package:nexus/widgets/popover_layout.dart"; - -extension ShowAdaptivePopover on BuildContext { - /// Shows the widget from [builder] in a popover next to [anchor], or the - /// widget this context belongs to, on desktop, or a bottom sheet on mobile. - /// Use the context passed to [builder] to close it. - Future showAdaptivePopover(WidgetBuilder builder, {Rect? anchor}) { - if (!isDesktop) return showAdaptiveSheet(builder); - - final rect = anchor ?? globalRect; - - return showDialog( - context: this, - barrierColor: Colors.transparent, - useSafeArea: false, - builder: (context) => CustomSingleChildLayout( - delegate: PopoverLayout(rect), - child: ConstrainedBox( - constraints: const .new(maxWidth: 420, maxHeight: 600), - child: Material( - elevation: 8, - clipBehavior: .antiAlias, - color: Theme.of(context).colorScheme.surfaceContainer, - borderRadius: .circular(16), - child: Builder(builder: builder), - ), - ), - ), - ); - } -} diff --git a/lib/helpers/extensions/show_adaptive_sheet.dart b/lib/helpers/extensions/show_adaptive_sheet.dart deleted file mode 100644 index f8dea6e..0000000 --- a/lib/helpers/extensions/show_adaptive_sheet.dart +++ /dev/null @@ -1,28 +0,0 @@ -import "package:material_ui/material_ui.dart"; -import "package:nexus/helpers/extensions/is_desktop.dart"; - -extension ShowAdaptiveSheet on BuildContext { - /// Shows the widget from [builder] in a dialog on desktop, or a bottom sheet - /// on mobile. Use the context passed to [builder] to close it. - Future showAdaptiveSheet( - WidgetBuilder builder, { - bool enableDrag = true, - }) => isDesktop - ? showDialog( - context: this, - builder: (context) => Dialog( - clipBehavior: .antiAlias, - child: ConstrainedBox( - constraints: const .new(maxWidth: 450, maxHeight: 600), - child: Builder(builder: builder), - ), - ), - ) - : showModalBottomSheet( - context: this, - isScrollControlled: true, - enableDrag: enableDrag, - constraints: .new(maxHeight: MediaQuery.sizeOf(this).height - 80), - builder: (context) => SafeArea(child: builder(context)), - ); -} diff --git a/lib/helpers/extensions/show_leave_room_sheet.dart b/lib/helpers/extensions/show_leave_room_sheet.dart index 7dd8d3a..42ff87f 100644 --- a/lib/helpers/extensions/show_leave_room_sheet.dart +++ b/lib/helpers/extensions/show_leave_room_sheet.dart @@ -1,9 +1,8 @@ import "package:flutter_riverpod/flutter_riverpod.dart"; import "package:material_ui/material_ui.dart"; +import "package:material_adaptive_sheets/material_adaptive_sheets.dart"; import "package:nexus/controllers/client.dart"; -import "package:nexus/helpers/extensions/show_adaptive_sheet.dart"; import "package:nexus/helpers/extensions/with_progress_snackbar.dart"; -import "package:nexus/widgets/sheet_layout.dart"; extension ShowLeaveRoomSheet on BuildContext { /// Asks the user to confirm leaving the room, then leaves it. diff --git a/lib/helpers/extensions/show_user_popover.dart b/lib/helpers/extensions/show_user_popover.dart index ccf6898..af3e00e 100644 --- a/lib/helpers/extensions/show_user_popover.dart +++ b/lib/helpers/extensions/show_user_popover.dart @@ -1,5 +1,5 @@ import "package:material_ui/material_ui.dart"; -import "package:nexus/helpers/extensions/show_adaptive_popover.dart"; +import "package:material_adaptive_sheets/material_adaptive_sheets.dart"; import "package:nexus/widgets/user_bottom_sheet.dart"; extension ShowUserPopover on BuildContext { diff --git a/lib/widgets/account_switcher.dart b/lib/widgets/account_switcher.dart index 734a42b..6c9c93b 100644 --- a/lib/widgets/account_switcher.dart +++ b/lib/widgets/account_switcher.dart @@ -1,12 +1,12 @@ import "package:collection/collection.dart"; import "package:flutter_riverpod/flutter_riverpod.dart"; import "package:material_ui/material_ui.dart"; +import "package:material_adaptive_sheets/material_adaptive_sheets.dart"; import "package:nexus/controllers/accounts.dart"; import "package:nexus/controllers/active_account.dart"; import "package:nexus/helpers/extensions/log_out.dart"; import "package:nexus/main.dart"; import "package:nexus/models/account.dart"; -import "package:nexus/widgets/adaptive_menu_button.dart"; import "package:nexus/widgets/avatar_or_hash.dart"; /// Switches between, adds and logs out of accounts. With [onlyWithOthers], it's @@ -45,7 +45,7 @@ class const AccountSwitcher({final bool onlyWithOthers = false, super.key}) final loggingOut = ref.watch(LogOut.mutation).isPending; - return AdaptiveMenuButton( + return AdaptiveMenuButton( tooltip: loggingOut ? "Logging out..." : "Switch account", enabled: !loggingOut, icon: loggingOut diff --git a/lib/widgets/adaptive_menu_button.dart b/lib/widgets/adaptive_menu_button.dart deleted file mode 100644 index 1928358..0000000 --- a/lib/widgets/adaptive_menu_button.dart +++ /dev/null @@ -1,21 +0,0 @@ -import "package:material_ui/material_ui.dart"; -import "package:nexus/helpers/extensions/show_adaptive_menu.dart"; - -/// Like [PopupMenuButton], but shows a bottom sheet on mobile. -class const AdaptiveMenuButton({ - required final Widget icon, - required final List Function(BuildContext context) - itemBuilder, - final String? tooltip, - final bool enabled = true, - super.key, -}) extends StatelessWidget { - @override - Widget build(BuildContext context) => IconButton( - icon: icon, - tooltip: tooltip, - onPressed: enabled - ? () => context.showAdaptiveMenu(itemBuilder(context)) - : null, - ); -} diff --git a/lib/widgets/add_space_rooms_sheet.dart b/lib/widgets/add_space_rooms_sheet.dart index 2f4ff8f..b6d8767 100644 --- a/lib/widgets/add_space_rooms_sheet.dart +++ b/lib/widgets/add_space_rooms_sheet.dart @@ -3,6 +3,7 @@ import "package:fast_immutable_collections/fast_immutable_collections.dart"; import "package:flutter_hooks/flutter_hooks.dart"; import "package:hooks_riverpod/hooks_riverpod.dart"; import "package:material_ui/material_ui.dart"; +import "package:material_adaptive_sheets/material_adaptive_sheets.dart"; import "package:nexus/controllers/client.dart"; import "package:nexus/controllers/client_state.dart"; import "package:nexus/controllers/rooms.dart"; @@ -15,7 +16,6 @@ import "package:nexus/models/content/content.dart"; import "package:nexus/models/content/space_child.dart"; import "package:nexus/widgets/avatar_or_hash.dart"; import "package:nexus/widgets/settings/search_chooser.dart"; -import "package:nexus/widgets/sheet_layout.dart"; /// Chooses rooms to add to the space [spaceId], then adds them. class const AddSpaceRoomsSheet( diff --git a/lib/widgets/composer/composer.dart b/lib/widgets/composer/composer.dart index 84e57cc..6472de2 100644 --- a/lib/widgets/composer/composer.dart +++ b/lib/widgets/composer/composer.dart @@ -2,6 +2,7 @@ import "dart:io"; import "package:fast_immutable_collections/fast_immutable_collections.dart"; import "package:collection/collection.dart"; +import "package:material_adaptive_sheets/material_adaptive_sheets.dart"; import "package:nexus/controllers/bot_argument_suggestions.dart"; import "package:nexus/controllers/bot_command_draft.dart"; import "package:nexus/controllers/bot_commands.dart"; @@ -14,8 +15,6 @@ import "package:nexus/widgets/composer/bot_command_panel.dart"; import "package:nexus/widgets/emoji_picker.dart"; import "package:nexus/helpers/extensions/get_filename.dart"; import "package:nexus/helpers/extensions/is_media.dart"; -import "package:nexus/helpers/extensions/show_adaptive_sheet.dart"; -import "package:nexus/widgets/adaptive_menu_button.dart"; import "package:material_ui/material_ui.dart"; import "package:flutter/services.dart"; import "package:flutter_hooks/flutter_hooks.dart"; diff --git a/lib/widgets/create_poll_sheet.dart b/lib/widgets/create_poll_sheet.dart index 01a26b1..48f849d 100644 --- a/lib/widgets/create_poll_sheet.dart +++ b/lib/widgets/create_poll_sheet.dart @@ -2,8 +2,8 @@ import "package:collection/collection.dart"; import "package:fast_immutable_collections/fast_immutable_collections.dart"; import "package:flutter_hooks/flutter_hooks.dart"; import "package:material_ui/material_ui.dart"; +import "package:material_adaptive_sheets/material_adaptive_sheets.dart"; import "package:nexus/models/content/poll_start.dart"; -import "package:nexus/widgets/sheet_layout.dart"; class const CreatePollSheet({ required final void Function(PollStart poll) onCreate, diff --git a/lib/widgets/create_room_sheet.dart b/lib/widgets/create_room_sheet.dart index 423b909..d91c2f4 100644 --- a/lib/widgets/create_room_sheet.dart +++ b/lib/widgets/create_room_sheet.dart @@ -1,10 +1,10 @@ import "package:flutter_hooks/flutter_hooks.dart"; import "package:hooks_riverpod/hooks_riverpod.dart"; import "package:material_ui/material_ui.dart"; +import "package:material_adaptive_sheets/material_adaptive_sheets.dart"; import "package:nexus/controllers/client_state.dart"; import "package:nexus/helpers/extensions/create_room.dart"; import "package:nexus/helpers/extensions/get_localpart.dart"; -import "package:nexus/widgets/sheet_layout.dart"; class const CreateRoomSheet({super.key}) extends HookConsumerWidget { @override diff --git a/lib/widgets/editable_avatar.dart b/lib/widgets/editable_avatar.dart index d8d387f..5640342 100644 --- a/lib/widgets/editable_avatar.dart +++ b/lib/widgets/editable_avatar.dart @@ -1,7 +1,7 @@ import "package:hooks_riverpod/hooks_riverpod.dart"; import "package:material_ui/material_ui.dart"; +import "package:material_adaptive_sheets/material_adaptive_sheets.dart"; import "package:nexus/controllers/client.dart"; -import "package:nexus/helpers/extensions/show_adaptive_menu.dart"; import "package:nexus/helpers/file_dialog_helper.dart"; import "package:nexus/helpers/hooks/saving.dart"; import "package:nexus/main.dart"; diff --git a/lib/widgets/invites_list.dart b/lib/widgets/invites_list.dart index 7713560..f8847c4 100644 --- a/lib/widgets/invites_list.dart +++ b/lib/widgets/invites_list.dart @@ -1,7 +1,6 @@ import "package:hooks_riverpod/hooks_riverpod.dart"; import "package:material_ui/material_ui.dart"; -import "package:nexus/helpers/extensions/show_adaptive_sheet.dart"; -import "package:nexus/widgets/sheet_layout.dart"; +import "package:material_adaptive_sheets/material_adaptive_sheets.dart"; import "package:nexus/controllers/invites.dart"; import "package:nexus/helpers/extensions/get_localpart.dart"; import "package:nexus/main.dart"; diff --git a/lib/widgets/join_sheet.dart b/lib/widgets/join_sheet.dart index b690e9c..8977814 100644 --- a/lib/widgets/join_sheet.dart +++ b/lib/widgets/join_sheet.dart @@ -1,8 +1,7 @@ import "package:material_ui/material_ui.dart"; -import "package:nexus/helpers/extensions/show_adaptive_sheet.dart"; -import "package:nexus/widgets/sheet_layout.dart"; import "package:flutter_hooks/flutter_hooks.dart"; import "package:hooks_riverpod/hooks_riverpod.dart"; +import "package:material_adaptive_sheets/material_adaptive_sheets.dart"; import "package:nexus/controllers/room_summary.dart"; import "package:nexus/helpers/extensions/get_link_info.dart"; import "package:nexus/widgets/room_summary_sheet.dart"; diff --git a/lib/widgets/knock_sheet.dart b/lib/widgets/knock_sheet.dart index 9c6bdcb..524856c 100644 --- a/lib/widgets/knock_sheet.dart +++ b/lib/widgets/knock_sheet.dart @@ -1,8 +1,8 @@ import "package:fast_immutable_collections/fast_immutable_collections.dart"; import "package:flutter_hooks/flutter_hooks.dart"; import "package:material_ui/material_ui.dart"; +import "package:material_adaptive_sheets/material_adaptive_sheets.dart"; import "package:nexus/helpers/extensions/join_room.dart"; -import "package:nexus/widgets/sheet_layout.dart"; /// Asks the moderators of a room to let the user in, with an optional reason. /// diff --git a/lib/widgets/location_message.dart b/lib/widgets/location_message.dart index be39cb1..2f22b9d 100644 --- a/lib/widgets/location_message.dart +++ b/lib/widgets/location_message.dart @@ -1,5 +1,5 @@ import "package:material_ui/material_ui.dart"; -import "package:nexus/helpers/extensions/show_adaptive_sheet.dart"; +import "package:material_adaptive_sheets/material_adaptive_sheets.dart"; import "package:nexus/models/content/message.dart"; import "package:nexus/models/location.dart"; import "package:nexus/widgets/location_map.dart"; diff --git a/lib/widgets/location_picker_sheet.dart b/lib/widgets/location_picker_sheet.dart index ace1d84..10b77ae 100644 --- a/lib/widgets/location_picker_sheet.dart +++ b/lib/widgets/location_picker_sheet.dart @@ -3,11 +3,11 @@ import "package:flutter_map/flutter_map.dart"; import "package:hooks_riverpod/hooks_riverpod.dart"; import "package:latlong2/latlong.dart"; import "package:material_ui/material_ui.dart"; +import "package:material_adaptive_sheets/material_adaptive_sheets.dart"; import "package:nexus/helpers/current_location_helper.dart"; import "package:nexus/models/content/message.dart"; import "package:nexus/models/location.dart"; import "package:nexus/widgets/location_map.dart"; -import "package:nexus/widgets/sheet_layout.dart"; /// Chooses a location to share, either the user's own or a pin dropped on the /// map. diff --git a/lib/widgets/location_viewer_sheet.dart b/lib/widgets/location_viewer_sheet.dart index bfd37cf..48965bc 100644 --- a/lib/widgets/location_viewer_sheet.dart +++ b/lib/widgets/location_viewer_sheet.dart @@ -1,10 +1,10 @@ import "package:flutter_riverpod/flutter_riverpod.dart"; import "package:latlong2/latlong.dart"; import "package:material_ui/material_ui.dart"; +import "package:material_adaptive_sheets/material_adaptive_sheets.dart"; import "package:nexus/helpers/launch_helper.dart"; import "package:nexus/models/location.dart"; import "package:nexus/widgets/location_map.dart"; -import "package:nexus/widgets/sheet_layout.dart"; class const LocationViewerSheet( final LatLng point, { diff --git a/lib/widgets/mutual_rooms_sheet.dart b/lib/widgets/mutual_rooms_sheet.dart index 68b90e5..4c47577 100644 --- a/lib/widgets/mutual_rooms_sheet.dart +++ b/lib/widgets/mutual_rooms_sheet.dart @@ -1,13 +1,13 @@ import "package:fast_immutable_collections/fast_immutable_collections.dart"; import "package:hooks_riverpod/hooks_riverpod.dart"; import "package:material_ui/material_ui.dart"; +import "package:material_adaptive_sheets/material_adaptive_sheets.dart"; import "package:nexus/controllers/mutual_rooms.dart"; import "package:nexus/controllers/rooms.dart"; import "package:nexus/controllers/sidebar_page.dart"; import "package:nexus/helpers/extensions/better_when.dart"; import "package:nexus/helpers/extensions/focus_room.dart"; import "package:nexus/widgets/avatar_or_hash.dart"; -import "package:nexus/widgets/sheet_layout.dart"; /// The rooms the user shares with [userId]. class const MutualRoomsSheet(final String userId, {super.key}) diff --git a/lib/widgets/pages/chat.dart b/lib/widgets/pages/chat.dart index f7254f9..4e5ca8f 100644 --- a/lib/widgets/pages/chat.dart +++ b/lib/widgets/pages/chat.dart @@ -1,13 +1,13 @@ import "package:flutter_hooks/flutter_hooks.dart"; import "package:material_ui/material_ui.dart"; import "package:hooks_riverpod/hooks_riverpod.dart"; +import "package:material_adaptive_sheets/material_adaptive_sheets.dart"; import "package:nexus/controllers/init_complete.dart"; import "package:nexus/controllers/link_request.dart"; import "package:nexus/helpers/extensions/open_link_info.dart"; import "package:nexus/main.dart"; import "package:nexus/controllers/selected_room.dart"; import "package:nexus/controllers/notification_request.dart"; -import "package:nexus/helpers/extensions/is_desktop.dart"; import "package:nexus/widgets/appbar.dart"; import "package:nexus/widgets/sidebar.dart"; import "package:nexus/widgets/sync_status_banner.dart"; diff --git a/lib/widgets/pages/verify.dart b/lib/widgets/pages/verify.dart index 4cff235..6cf935d 100644 --- a/lib/widgets/pages/verify.dart +++ b/lib/widgets/pages/verify.dart @@ -1,10 +1,10 @@ import "package:material_ui/material_ui.dart"; import "package:flutter_hooks/flutter_hooks.dart"; import "package:hooks_riverpod/hooks_riverpod.dart"; +import "package:material_adaptive_sheets/material_adaptive_sheets.dart"; import "package:nexus/controllers/client.dart"; import "package:nexus/controllers/client_state.dart"; import "package:nexus/models/client_state.dart"; -import "package:nexus/helpers/extensions/show_adaptive_sheet.dart"; import "package:nexus/widgets/loading.dart"; import "package:nexus/widgets/pages/settings.dart"; import "package:nexus/widgets/account_switcher.dart"; diff --git a/lib/widgets/popover_layout.dart b/lib/widgets/popover_layout.dart deleted file mode 100644 index 0ef8ebe..0000000 --- a/lib/widgets/popover_layout.dart +++ /dev/null @@ -1,33 +0,0 @@ -import "dart:math"; - -import "package:material_ui/material_ui.dart"; - -/// Positions a popover below [anchor], or above it if there isn't room below, -/// keeping it fully on screen. -class const PopoverLayout(final Rect anchor) extends SingleChildLayoutDelegate { - static const margin = 8.0; - - @override - BoxConstraints getConstraintsForChild(BoxConstraints constraints) => - constraints.loosen().deflate(const .all(margin)); - - @override - Offset getPositionForChild(Size size, Size childSize) { - final fitsBelow = anchor.bottom + childSize.height + margin <= size.height; - - return .new( - anchor.left.clamp( - margin, - max(margin, size.width - childSize.width - margin), - ), - (fitsBelow ? anchor.bottom : anchor.top - childSize.height).clamp( - margin, - max(margin, size.height - childSize.height - margin), - ), - ); - } - - @override - bool shouldRelayout(PopoverLayout oldDelegate) => - oldDelegate.anchor != anchor; -} diff --git a/lib/widgets/read_receipts_row.dart b/lib/widgets/read_receipts_row.dart index e3f206f..468e4b7 100644 --- a/lib/widgets/read_receipts_row.dart +++ b/lib/widgets/read_receipts_row.dart @@ -1,10 +1,10 @@ import "package:hooks_riverpod/hooks_riverpod.dart"; import "package:material_ui/material_ui.dart"; +import "package:material_adaptive_sheets/material_adaptive_sheets.dart"; import "package:nexus/controllers/read_receipts.dart"; import "package:nexus/controllers/room_chat.dart"; import "package:nexus/controllers/user.dart"; import "package:nexus/helpers/extensions/get_localpart.dart"; -import "package:nexus/helpers/extensions/show_adaptive_sheet.dart"; import "package:nexus/helpers/extensions/show_user_popover.dart"; import "package:nexus/widgets/avatar_or_hash.dart"; import "package:nexus/widgets/avatar_ring.dart"; diff --git a/lib/widgets/read_receipts_sheet.dart b/lib/widgets/read_receipts_sheet.dart index aabdfb3..135e3fb 100644 --- a/lib/widgets/read_receipts_sheet.dart +++ b/lib/widgets/read_receipts_sheet.dart @@ -1,12 +1,12 @@ import "package:hooks_riverpod/hooks_riverpod.dart"; import "package:material_ui/material_ui.dart"; +import "package:material_adaptive_sheets/material_adaptive_sheets.dart"; import "package:nexus/controllers/read_receipts.dart"; import "package:nexus/controllers/room_chat.dart"; import "package:nexus/controllers/user.dart"; import "package:nexus/helpers/extensions/get_localpart.dart"; import "package:nexus/helpers/extensions/show_user_popover.dart"; import "package:nexus/widgets/avatar_or_hash.dart"; -import "package:nexus/widgets/sheet_layout.dart"; /// Everyone who has read up to an event, kept up to date while open. class const ReadReceiptsSheet( diff --git a/lib/widgets/recovery_key_sheet.dart b/lib/widgets/recovery_key_sheet.dart index 68ec682..36e4e09 100644 --- a/lib/widgets/recovery_key_sheet.dart +++ b/lib/widgets/recovery_key_sheet.dart @@ -4,12 +4,12 @@ import "package:flutter/services.dart"; import "package:flutter_hooks/flutter_hooks.dart"; import "package:hooks_riverpod/hooks_riverpod.dart"; import "package:material_ui/material_ui.dart"; +import "package:material_adaptive_sheets/material_adaptive_sheets.dart"; import "package:nexus/controllers/client.dart"; import "package:nexus/controllers/client_state.dart"; import "package:nexus/helpers/launch_helper.dart"; import "package:nexus/models/gomuks_exception.dart"; import "package:nexus/models/recovery_key.dart"; -import "package:nexus/widgets/sheet_layout.dart"; /// Shows a newly generated recovery key, and once the user confirms they've /// saved it, resets encryption with it. Pops with true if that succeeded. diff --git a/lib/widgets/renderers/event.dart b/lib/widgets/renderers/event.dart index b7278e1..5b002d9 100644 --- a/lib/widgets/renderers/event.dart +++ b/lib/widgets/renderers/event.dart @@ -3,6 +3,7 @@ import "package:flutter/gestures.dart"; import "package:material_ui/material_ui.dart"; import "package:flutter_hooks/flutter_hooks.dart"; import "package:hooks_riverpod/hooks_riverpod.dart"; +import "package:material_adaptive_sheets/material_adaptive_sheets.dart"; import "package:nexus/controllers/event.dart"; import "package:nexus/controllers/poll_votes.dart"; import "package:nexus/controllers/room_chat.dart"; @@ -10,7 +11,6 @@ import "package:nexus/controllers/rooms.dart"; import "package:nexus/controllers/settings.dart"; import "package:nexus/helpers/extensions/is_shown_as_message.dart"; import "package:nexus/helpers/extensions/send_failed.dart"; -import "package:nexus/helpers/extensions/show_adaptive_menu.dart"; import "package:nexus/helpers/extensions/success_scheme.dart"; import "package:nexus/helpers/hooks/chat_scroll.dart"; import "package:nexus/helpers/hooks/tap_recognizer.dart"; diff --git a/lib/widgets/renderers/poll.dart b/lib/widgets/renderers/poll.dart index 8b436e9..4ef723a 100644 --- a/lib/widgets/renderers/poll.dart +++ b/lib/widgets/renderers/poll.dart @@ -5,18 +5,17 @@ import "package:hooks_riverpod/hooks_riverpod.dart"; import "package:m3e_buttons/m3e_buttons.dart"; import "package:m3e_card_list/m3e_card_list.dart"; import "package:material_ui/material_ui.dart"; +import "package:material_adaptive_sheets/material_adaptive_sheets.dart"; import "package:nexus/controllers/client_state.dart"; import "package:nexus/controllers/poll_votes.dart"; import "package:nexus/controllers/power_level.dart"; import "package:nexus/controllers/room_chat.dart"; import "package:nexus/controllers/room_power_levels.dart"; import "package:nexus/helpers/extensions/event_id_is_fake.dart"; -import "package:nexus/helpers/extensions/show_adaptive_sheet.dart"; import "package:nexus/main.dart"; import "package:nexus/models/content/poll_start.dart"; import "package:nexus/models/event.dart"; import "package:nexus/widgets/poll_option.dart"; -import "package:nexus/widgets/sheet_layout.dart"; class const PollRenderer(final Event event, final PollStart poll, {super.key}) extends HookConsumerWidget { diff --git a/lib/widgets/reset_encryption_sheet.dart b/lib/widgets/reset_encryption_sheet.dart index 8482a8f..c223b37 100644 --- a/lib/widgets/reset_encryption_sheet.dart +++ b/lib/widgets/reset_encryption_sheet.dart @@ -1,13 +1,12 @@ import "package:flutter_hooks/flutter_hooks.dart"; import "package:hooks_riverpod/hooks_riverpod.dart"; import "package:material_ui/material_ui.dart"; +import "package:material_adaptive_sheets/material_adaptive_sheets.dart"; import "package:nexus/controllers/client.dart"; import "package:nexus/controllers/client_state.dart"; -import "package:nexus/helpers/extensions/show_adaptive_sheet.dart"; import "package:nexus/main.dart"; import "package:nexus/models/client_state.dart"; import "package:nexus/widgets/recovery_key_sheet.dart"; -import "package:nexus/widgets/sheet_layout.dart"; class const ResetEncryptionSheet({ /// Whether this is shown as a page rather than in a sheet, in which case it diff --git a/lib/widgets/room_appbar.dart b/lib/widgets/room_appbar.dart index 248661e..3bdc570 100644 --- a/lib/widgets/room_appbar.dart +++ b/lib/widgets/room_appbar.dart @@ -1,6 +1,6 @@ import "package:material_ui/material_ui.dart"; -import "package:nexus/helpers/extensions/show_adaptive_sheet.dart"; import "package:hooks_riverpod/hooks_riverpod.dart"; +import "package:material_adaptive_sheets/material_adaptive_sheets.dart"; import "package:nexus/controllers/rooms.dart"; import "package:nexus/widgets/appbar.dart"; import "package:nexus/widgets/avatar_or_hash.dart"; diff --git a/lib/widgets/room_list.dart b/lib/widgets/room_list.dart index b2d3b46..316e020 100644 --- a/lib/widgets/room_list.dart +++ b/lib/widgets/room_list.dart @@ -5,11 +5,10 @@ import "package:hooks_riverpod/hooks_riverpod.dart"; import "package:material_ui/material_ui.dart"; import "package:m3e_design/m3e_design.dart"; import "package:navigation_rail_m3e/navigation_rail_m3e.dart"; +import "package:material_adaptive_sheets/material_adaptive_sheets.dart"; import "package:nexus/helpers/extensions/get_all_child_rooms.dart"; import "package:nexus/helpers/extensions/room_destinations.dart"; -import "package:nexus/helpers/extensions/show_adaptive_sheet.dart"; import "package:nexus/widgets/account_switcher.dart"; -import "package:nexus/widgets/adaptive_menu_button.dart"; import "package:nexus/models/nav_page.dart"; import "package:nexus/widgets/appbar.dart"; import "package:nexus/widgets/room_title.dart"; diff --git a/lib/widgets/room_menu_button.dart b/lib/widgets/room_menu_button.dart index 4a83bd8..e1e0e84 100644 --- a/lib/widgets/room_menu_button.dart +++ b/lib/widgets/room_menu_button.dart @@ -1,14 +1,12 @@ import "package:fast_immutable_collections/fast_immutable_collections.dart"; import "package:material_ui/material_ui.dart"; +import "package:material_adaptive_sheets/material_adaptive_sheets.dart"; import "package:nexus/helpers/extensions/get_localpart.dart"; import "package:nexus/helpers/extensions/show_leave_room_sheet.dart"; -import "package:nexus/helpers/extensions/show_adaptive_sheet.dart"; -import "package:nexus/widgets/sheet_layout.dart"; import "package:flutter/services.dart"; import "package:flutter_riverpod/flutter_riverpod.dart"; import "package:nexus/controllers/client.dart"; import "package:nexus/controllers/room_settings_sections.dart"; -import "package:nexus/widgets/adaptive_menu_button.dart"; import "package:nexus/widgets/settings/settings_layout.dart"; import "package:nexus/controllers/via.dart"; import "package:nexus/models/room.dart"; diff --git a/lib/widgets/room_summary_sheet.dart b/lib/widgets/room_summary_sheet.dart index 1118cb9..4ea804a 100644 --- a/lib/widgets/room_summary_sheet.dart +++ b/lib/widgets/room_summary_sheet.dart @@ -1,13 +1,12 @@ import "package:fast_immutable_collections/fast_immutable_collections.dart"; import "package:flutter_riverpod/flutter_riverpod.dart"; import "package:material_ui/material_ui.dart"; -import "package:nexus/widgets/sheet_layout.dart"; +import "package:material_adaptive_sheets/material_adaptive_sheets.dart"; import "package:nexus/controllers/client.dart"; import "package:nexus/controllers/invites.dart"; import "package:nexus/controllers/rooms.dart"; import "package:nexus/helpers/extensions/get_localpart.dart"; import "package:nexus/helpers/extensions/join_room.dart"; -import "package:nexus/helpers/extensions/show_adaptive_sheet.dart"; import "package:nexus/main.dart"; import "package:nexus/widgets/avatar_or_hash.dart"; import "package:nexus/widgets/expandable_image.dart"; diff --git a/lib/widgets/settings/add_users_power_level_sheet.dart b/lib/widgets/settings/add_users_power_level_sheet.dart index 2603fd5..ec865f4 100644 --- a/lib/widgets/settings/add_users_power_level_sheet.dart +++ b/lib/widgets/settings/add_users_power_level_sheet.dart @@ -3,13 +3,13 @@ import "package:fast_immutable_collections/fast_immutable_collections.dart"; import "package:flutter_hooks/flutter_hooks.dart"; import "package:hooks_riverpod/hooks_riverpod.dart"; import "package:material_ui/material_ui.dart"; +import "package:material_adaptive_sheets/material_adaptive_sheets.dart"; import "package:nexus/controllers/members.dart"; import "package:nexus/helpers/extensions/get_localpart.dart"; import "package:nexus/models/content/membership.dart"; import "package:nexus/widgets/avatar_or_hash.dart"; import "package:nexus/widgets/settings/power_level_field.dart"; import "package:nexus/widgets/settings/search_chooser.dart"; -import "package:nexus/widgets/sheet_layout.dart"; /// Chooses users of [roomId] to give a power level of their own. class const AddUsersPowerLevelSheet({ diff --git a/lib/widgets/settings/aliases_sheet.dart b/lib/widgets/settings/aliases_sheet.dart index d517f98..2eec533 100644 --- a/lib/widgets/settings/aliases_sheet.dart +++ b/lib/widgets/settings/aliases_sheet.dart @@ -1,7 +1,7 @@ import "package:fast_immutable_collections/fast_immutable_collections.dart"; import "package:flutter_hooks/flutter_hooks.dart"; import "package:material_ui/material_ui.dart"; -import "package:nexus/widgets/sheet_layout.dart"; +import "package:material_adaptive_sheets/material_adaptive_sheets.dart"; /// Chooses which of a room's [aliases] it publishes, and which one of those is canonical. class const AliasesSheet({ diff --git a/lib/widgets/settings/allowed_rooms_sheet.dart b/lib/widgets/settings/allowed_rooms_sheet.dart index 6ba42fb..8123c51 100644 --- a/lib/widgets/settings/allowed_rooms_sheet.dart +++ b/lib/widgets/settings/allowed_rooms_sheet.dart @@ -3,12 +3,12 @@ import "package:fast_immutable_collections/fast_immutable_collections.dart"; import "package:flutter_hooks/flutter_hooks.dart"; import "package:hooks_riverpod/hooks_riverpod.dart"; import "package:material_ui/material_ui.dart"; +import "package:material_adaptive_sheets/material_adaptive_sheets.dart"; import "package:nexus/controllers/client.dart"; import "package:nexus/controllers/rooms.dart"; import "package:nexus/main.dart"; import "package:nexus/widgets/avatar_or_hash.dart"; import "package:nexus/widgets/settings/search_chooser.dart"; -import "package:nexus/widgets/sheet_layout.dart"; /// Chooses the rooms whose members can join [roomId] without an invite. class const AllowedRoomsSheet({ diff --git a/lib/widgets/settings/dialog_list_tile.dart b/lib/widgets/settings/dialog_list_tile.dart index f884f31..2c9e5de 100644 --- a/lib/widgets/settings/dialog_list_tile.dart +++ b/lib/widgets/settings/dialog_list_tile.dart @@ -2,7 +2,7 @@ import "dart:async"; import "package:flutter_hooks/flutter_hooks.dart"; import "package:material_ui/material_ui.dart"; -import "package:nexus/helpers/extensions/show_adaptive_sheet.dart"; +import "package:material_adaptive_sheets/material_adaptive_sheets.dart"; import "package:nexus/helpers/hooks/saving.dart"; import "package:nexus/widgets/settings/radio_sheet.dart"; diff --git a/lib/widgets/settings/enable_image_packs_sheet.dart b/lib/widgets/settings/enable_image_packs_sheet.dart index afd983b..9bc952f 100644 --- a/lib/widgets/settings/enable_image_packs_sheet.dart +++ b/lib/widgets/settings/enable_image_packs_sheet.dart @@ -3,13 +3,13 @@ import "package:fast_immutable_collections/fast_immutable_collections.dart"; import "package:flutter_hooks/flutter_hooks.dart"; import "package:hooks_riverpod/hooks_riverpod.dart"; import "package:material_ui/material_ui.dart"; +import "package:material_adaptive_sheets/material_adaptive_sheets.dart"; import "package:nexus/controllers/room_image_packs.dart"; import "package:nexus/controllers/rooms.dart"; import "package:nexus/helpers/extensions/better_when.dart"; import "package:nexus/models/account_data.dart"; import "package:nexus/widgets/avatar_or_hash.dart"; import "package:nexus/widgets/image_pack_avatar.dart"; -import "package:nexus/widgets/sheet_layout.dart"; /// Chooses a room, then which of its image packs to use in every room. class const EnableImagePacksSheet({ diff --git a/lib/widgets/settings/image_pack_sheet.dart b/lib/widgets/settings/image_pack_sheet.dart index 97f8599..2dd394e 100644 --- a/lib/widgets/settings/image_pack_sheet.dart +++ b/lib/widgets/settings/image_pack_sheet.dart @@ -2,8 +2,8 @@ import "package:fast_immutable_collections/fast_immutable_collections.dart"; import "package:flutter_hooks/flutter_hooks.dart"; import "package:hooks_riverpod/hooks_riverpod.dart"; import "package:material_ui/material_ui.dart"; +import "package:material_adaptive_sheets/material_adaptive_sheets.dart"; import "package:nexus/controllers/client.dart"; -import "package:nexus/helpers/extensions/show_adaptive_sheet.dart"; import "package:nexus/helpers/file_dialog_helper.dart"; import "package:nexus/helpers/hooks/saving.dart"; import "package:nexus/main.dart"; @@ -13,7 +13,6 @@ import "package:nexus/widgets/image_pack_avatar.dart"; import "package:nexus/widgets/mxc_emoji.dart"; import "package:nexus/widgets/settings/image_usage_chips.dart"; import "package:nexus/widgets/settings/pack_image_sheet.dart"; -import "package:nexus/widgets/sheet_layout.dart"; /// Edits an image pack, or only shows it if [onSave] is null. class const ImagePackSheet({ diff --git a/lib/widgets/settings/local_aliases_sheet.dart b/lib/widgets/settings/local_aliases_sheet.dart index def7db9..b51b7c3 100644 --- a/lib/widgets/settings/local_aliases_sheet.dart +++ b/lib/widgets/settings/local_aliases_sheet.dart @@ -1,13 +1,13 @@ import "package:flutter_hooks/flutter_hooks.dart"; import "package:hooks_riverpod/hooks_riverpod.dart"; import "package:material_ui/material_ui.dart"; +import "package:material_adaptive_sheets/material_adaptive_sheets.dart"; import "package:nexus/controllers/client_state.dart"; import "package:nexus/controllers/local_aliases.dart"; import "package:nexus/helpers/extensions/better_when.dart"; import "package:nexus/helpers/hooks/saving.dart"; import "package:nexus/main.dart"; import "package:nexus/models/gomuks_exception.dart"; -import "package:nexus/widgets/sheet_layout.dart"; class const LocalAliasesSheet( final String roomId, { diff --git a/lib/widgets/settings/pack_image_sheet.dart b/lib/widgets/settings/pack_image_sheet.dart index 9ef70d6..da17f38 100644 --- a/lib/widgets/settings/pack_image_sheet.dart +++ b/lib/widgets/settings/pack_image_sheet.dart @@ -1,10 +1,10 @@ import "package:fast_immutable_collections/fast_immutable_collections.dart"; import "package:flutter_hooks/flutter_hooks.dart"; import "package:material_ui/material_ui.dart"; +import "package:material_adaptive_sheets/material_adaptive_sheets.dart"; import "package:nexus/models/content/image_pack.dart"; import "package:nexus/widgets/mxc_emoji.dart"; import "package:nexus/widgets/settings/image_usage_chips.dart"; -import "package:nexus/widgets/sheet_layout.dart"; /// Edits an image in a pack, or only shows it if [onSave] is null. class const PackImageSheet({ diff --git a/lib/widgets/settings/power_level_entry_sheet.dart b/lib/widgets/settings/power_level_entry_sheet.dart index 9d5e457..05b9831 100644 --- a/lib/widgets/settings/power_level_entry_sheet.dart +++ b/lib/widgets/settings/power_level_entry_sheet.dart @@ -1,7 +1,7 @@ import "package:flutter_hooks/flutter_hooks.dart"; import "package:material_ui/material_ui.dart"; +import "package:material_adaptive_sheets/material_adaptive_sheets.dart"; import "package:nexus/widgets/settings/power_level_field.dart"; -import "package:nexus/widgets/sheet_layout.dart"; /// Gives something, like an event type, its own power level. class const PowerLevelEntrySheet({ diff --git a/lib/widgets/settings/power_level_tile.dart b/lib/widgets/settings/power_level_tile.dart index a553c62..e7df995 100644 --- a/lib/widgets/settings/power_level_tile.dart +++ b/lib/widgets/settings/power_level_tile.dart @@ -1,8 +1,7 @@ import "package:flutter_hooks/flutter_hooks.dart"; import "package:material_ui/material_ui.dart"; -import "package:nexus/helpers/extensions/show_adaptive_sheet.dart"; +import "package:material_adaptive_sheets/material_adaptive_sheets.dart"; import "package:nexus/widgets/settings/power_level_field.dart"; -import "package:nexus/widgets/sheet_layout.dart"; /// Sets the power level needed for something. class const PowerLevelTile({ diff --git a/lib/widgets/settings/radio_sheet.dart b/lib/widgets/settings/radio_sheet.dart index 5572d48..2a58707 100644 --- a/lib/widgets/settings/radio_sheet.dart +++ b/lib/widgets/settings/radio_sheet.dart @@ -1,5 +1,5 @@ import "package:material_ui/material_ui.dart"; -import "package:nexus/widgets/sheet_layout.dart"; +import "package:material_adaptive_sheets/material_adaptive_sheets.dart"; import "package:flutter_hooks/flutter_hooks.dart"; final class const RadioSheet({ diff --git a/lib/widgets/settings/text_setting_tile.dart b/lib/widgets/settings/text_setting_tile.dart index 6f97eb0..4789cc3 100644 --- a/lib/widgets/settings/text_setting_tile.dart +++ b/lib/widgets/settings/text_setting_tile.dart @@ -2,9 +2,8 @@ import "dart:async"; import "package:flutter_hooks/flutter_hooks.dart"; import "package:material_ui/material_ui.dart"; -import "package:nexus/helpers/extensions/show_adaptive_sheet.dart"; +import "package:material_adaptive_sheets/material_adaptive_sheets.dart"; import "package:nexus/helpers/hooks/saving.dart"; -import "package:nexus/widgets/sheet_layout.dart"; class const TextSettingTile({ required final Icon icon, diff --git a/lib/widgets/sheet_layout.dart b/lib/widgets/sheet_layout.dart deleted file mode 100644 index 9a15a1d..0000000 --- a/lib/widgets/sheet_layout.dart +++ /dev/null @@ -1,42 +0,0 @@ -import "package:material_ui/material_ui.dart"; - -class const SheetLayout({ - final Widget? title, - required final List children, - required final List actions, - super.key, -}) extends StatelessWidget { - @override - Widget build(BuildContext context) => Padding( - padding: .only(bottom: MediaQuery.viewInsetsOf(context).bottom), - child: Column( - mainAxisSize: .min, - crossAxisAlignment: .stretch, - children: [ - if (title case final title?) - Padding( - padding: const .fromLTRB(24, 24, 24, 0), - child: DefaultTextStyle( - style: Theme.of(context).textTheme.headlineSmall!, - child: title, - ), - ), - Flexible( - child: SingleChildScrollView( - padding: .fromLTRB(24, title == null ? 24 : 12, 24, 12), - child: Column( - mainAxisSize: .min, - crossAxisAlignment: .stretch, - spacing: 12, - children: children, - ), - ), - ), - Padding( - padding: const .fromLTRB(24, 0, 24, 24), - child: Row(mainAxisAlignment: .end, spacing: 8, children: actions), - ), - ], - ), - ); -} diff --git a/lib/widgets/space_hierarchy_sheet.dart b/lib/widgets/space_hierarchy_sheet.dart index f5147e0..3b799d7 100644 --- a/lib/widgets/space_hierarchy_sheet.dart +++ b/lib/widgets/space_hierarchy_sheet.dart @@ -3,13 +3,13 @@ import "package:fast_immutable_collections/fast_immutable_collections.dart"; import "package:flutter_hooks/flutter_hooks.dart"; import "package:hooks_riverpod/hooks_riverpod.dart"; import "package:material_ui/material_ui.dart"; +import "package:material_adaptive_sheets/material_adaptive_sheets.dart"; import "package:nexus/controllers/client.dart"; import "package:nexus/controllers/power_level.dart"; import "package:nexus/controllers/rooms.dart"; import "package:nexus/controllers/space_hierarchy.dart"; import "package:nexus/helpers/extensions/better_when.dart"; import "package:nexus/helpers/extensions/join_room.dart"; -import "package:nexus/helpers/extensions/show_adaptive_sheet.dart"; import "package:nexus/helpers/extensions/show_leave_room_sheet.dart"; import "package:nexus/helpers/extensions/with_progress_snackbar.dart"; import "package:nexus/main.dart"; @@ -22,7 +22,6 @@ import "package:nexus/widgets/expandable_image.dart"; import "package:nexus/widgets/knock_sheet.dart"; import "package:nexus/widgets/loading.dart"; import "package:nexus/widgets/room_summary_sheet.dart"; -import "package:nexus/widgets/sheet_layout.dart"; class const SpaceHierarchySheet(final String spaceId, {super.key}) extends ConsumerWidget { diff --git a/lib/widgets/start_dm_sheet.dart b/lib/widgets/start_dm_sheet.dart index 4952b0a..e0f38df 100644 --- a/lib/widgets/start_dm_sheet.dart +++ b/lib/widgets/start_dm_sheet.dart @@ -1,8 +1,8 @@ import "package:flutter_hooks/flutter_hooks.dart"; import "package:material_ui/material_ui.dart"; +import "package:material_adaptive_sheets/material_adaptive_sheets.dart"; import "package:nexus/helpers/extensions/get_localpart.dart"; import "package:nexus/helpers/extensions/create_room.dart"; -import "package:nexus/widgets/sheet_layout.dart"; /// Starts a DM, asking for a user ID unless [userId] is given. Pops with true /// if a DM was started. diff --git a/lib/widgets/timezone_field.dart b/lib/widgets/timezone_field.dart index aeab833..9653e7b 100644 --- a/lib/widgets/timezone_field.dart +++ b/lib/widgets/timezone_field.dart @@ -2,8 +2,8 @@ import "dart:async"; import "package:hooks_riverpod/hooks_riverpod.dart"; import "package:material_ui/material_ui.dart"; +import "package:material_adaptive_sheets/material_adaptive_sheets.dart"; import "package:nexus/controllers/timezones.dart"; -import "package:nexus/helpers/extensions/is_desktop.dart"; import "package:nexus/helpers/hooks/saving.dart"; import "package:nexus/widgets/settings/inline_text_field.dart"; import "package:timezone/timezone.dart"; diff --git a/lib/widgets/user_bottom_sheet.dart b/lib/widgets/user_bottom_sheet.dart index 3c34027..373ed52 100644 --- a/lib/widgets/user_bottom_sheet.dart +++ b/lib/widgets/user_bottom_sheet.dart @@ -1,11 +1,11 @@ import "package:collection/collection.dart"; import "package:fast_immutable_collections/fast_immutable_collections.dart"; import "package:material_ui/material_ui.dart"; -import "package:nexus/widgets/sheet_layout.dart"; import "package:flutter_hooks/flutter_hooks.dart"; import "package:flutter_riverpod/flutter_riverpod.dart"; import "package:intl/intl.dart"; import "package:m3e_buttons/m3e_buttons.dart"; +import "package:material_adaptive_sheets/material_adaptive_sheets.dart"; import "package:nexus/controllers/account_data.dart"; import "package:nexus/controllers/client.dart"; import "package:nexus/controllers/client_state.dart"; @@ -16,7 +16,6 @@ import "package:nexus/controllers/rooms.dart"; import "package:nexus/controllers/user.dart"; import "package:nexus/helpers/extensions/better_when.dart"; import "package:nexus/helpers/extensions/create_room.dart"; -import "package:nexus/helpers/extensions/show_adaptive_sheet.dart"; import "package:nexus/helpers/extensions/success_scheme.dart"; import "package:nexus/helpers/extensions/with_progress_snackbar.dart"; import "package:nexus/helpers/extensions/get_localpart.dart"; diff --git a/lib/widgets/user_span.dart b/lib/widgets/user_span.dart index 4fb2f9c..c131a82 100644 --- a/lib/widgets/user_span.dart +++ b/lib/widgets/user_span.dart @@ -1,10 +1,10 @@ import "package:flutter/gestures.dart"; import "package:flutter_riverpod/flutter_riverpod.dart"; import "package:material_ui/material_ui.dart"; +import "package:material_adaptive_sheets/material_adaptive_sheets.dart"; import "package:nexus/controllers/author.dart"; import "package:nexus/helpers/extensions/displayname_color.dart"; import "package:nexus/helpers/extensions/get_localpart.dart"; -import "package:nexus/helpers/extensions/global_rect.dart"; import "package:nexus/helpers/extensions/show_user_popover.dart"; import "package:nexus/models/event.dart"; diff --git a/pubspec.lock b/pubspec.lock index 63f90ea..25269ca 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -969,6 +969,14 @@ packages: url: "https://pub.dev" source: hosted version: "0.12.20" + material_adaptive_sheets: + dependency: "direct main" + description: + name: material_adaptive_sheets + sha256: "9299e8dfa7459583516520db1fe0edec83ab306679c3cfd3d0848f666bc956e5" + url: "https://pub.dev" + source: hosted + version: "1.0.0" material_color_utilities: dependency: transitive description: diff --git a/pubspec.yaml b/pubspec.yaml index b26cf4b..bb6f366 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -114,6 +114,7 @@ dependencies: flutter_local_notifications: 22.3.1 timezone: 0.11.1 material_emoji_picker: 2.0.1 + material_adaptive_sheets: 1.0.0 xdg_desktop_portal: git: url: https://github.com/Henry-Hiles/xdg_desktop_portal.dart