From 4b2d259add240505dae601289eb5a0c3b3ecbcac Mon Sep 17 00:00:00 2001 From: Kingkor Roy Tirtho Date: Fri, 31 Jan 2025 22:10:40 +0600 Subject: [PATCH] chore: use navigateTo instead of pushRoute --- lib/collections/routes.dart | 4 +- lib/collections/side_bar_tiles.dart | 18 +- .../fallbacks/anonymous_fallback.dart | 2 +- lib/components/links/artist_link.dart | 2 +- lib/components/links/link_text.dart | 2 +- lib/components/track_tile/track_options.dart | 4 +- lib/components/track_tile/track_tile.dart | 4 +- lib/hooks/configurators/use_deep_linking.dart | 17 +- lib/modules/album/album_card.dart | 2 +- lib/modules/artist/artist_card.dart | 2 +- lib/modules/connect/connect_device.dart | 8 +- lib/modules/home/sections/feed.dart | 2 +- .../home/sections/friends/friend_item.dart | 8 +- .../home/sections/genres/genre_card.dart | 2 +- .../genres/genre_card_playlist_card.dart | 2 +- lib/modules/home/sections/genres/genres.dart | 2 +- .../local_folder/local_folder_item.dart | 2 +- .../library/user_downloads/download_item.dart | 2 +- lib/modules/player/player.dart | 6 +- lib/modules/player/player_overlay.dart | 7 +- lib/modules/player/player_track_details.dart | 4 +- lib/modules/playlist/playlist_card.dart | 2 +- lib/modules/root/sidebar/sidebar.dart | 4 +- lib/modules/root/sidebar/sidebar_footer.dart | 4 +- lib/modules/root/spotube_navigation_bar.dart | 13 +- lib/modules/stats/common/album_item.dart | 4 +- lib/modules/stats/common/artist_item.dart | 2 +- lib/modules/stats/common/playlist_item.dart | 2 +- lib/modules/stats/common/track_item.dart | 4 +- lib/modules/stats/summary/summary.dart | 12 +- lib/pages/connect/connect.dart | 2 +- lib/pages/connect/control/control.dart | 4 +- lib/pages/home/genres/genres.dart | 2 +- lib/pages/home/home.dart | 2 +- lib/pages/library/library.dart | 69 ++-- .../playlist_generate/playlist_generate.dart | 2 +- lib/pages/library/user_playlists.dart | 2 +- .../mobile_login/hooks/login_callback.dart | 2 +- lib/pages/root/root_app.dart | 30 +- lib/pages/search/search.dart | 298 +++++++++--------- lib/pages/settings/sections/about.dart | 2 +- lib/pages/settings/sections/accounts.dart | 4 +- lib/pages/settings/sections/developers.dart | 2 +- lib/pages/settings/sections/playback.dart | 2 +- lib/pages/stats/stats.dart | 39 ++- 45 files changed, 307 insertions(+), 304 deletions(-) diff --git a/lib/collections/routes.dart b/lib/collections/routes.dart index 367e6eb8..10b2dc0d 100644 --- a/lib/collections/routes.dart +++ b/lib/collections/routes.dart @@ -37,7 +37,7 @@ class AppRouter extends RootStackRouter { initial: true, children: [ AutoRoute( - path: "browse", + path: "home", page: HomeRoute.page, initial: true, ), @@ -70,7 +70,7 @@ class AppRouter extends RootStackRouter { page: UserArtistsRoute.page, ), AutoRoute( - path: "album", + path: "albums", page: UserAlbumsRoute.page, ), AutoRoute( diff --git a/lib/collections/side_bar_tiles.dart b/lib/collections/side_bar_tiles.dart index c74d18c7..44c8b308 100644 --- a/lib/collections/side_bar_tiles.dart +++ b/lib/collections/side_bar_tiles.dart @@ -8,6 +8,7 @@ class SideBarTiles { final IconData icon; final String title; final String id; + final String pathPrefix; final PageRouteInfo route; SideBarTiles({ @@ -15,30 +16,35 @@ class SideBarTiles { required this.title, required this.id, required this.route, + required this.pathPrefix, }); } List getSidebarTileList(AppLocalizations l10n) => [ SideBarTiles( - id: "browse", + id: "home", + pathPrefix: "/home", route: const HomeRoute(), icon: SpotubeIcons.home, title: l10n.browse, ), SideBarTiles( id: "search", + pathPrefix: "/search", route: const SearchRoute(), icon: SpotubeIcons.search, title: l10n.search, ), SideBarTiles( id: "lyrics", + pathPrefix: "/lyrics", route: LyricsRoute(), icon: SpotubeIcons.music, title: l10n.lyrics, ), SideBarTiles( id: "stats", + pathPrefix: "/stats", route: const StatsRoute(), icon: SpotubeIcons.chart, title: l10n.stats, @@ -48,24 +54,28 @@ List getSidebarTileList(AppLocalizations l10n) => [ List getSidebarLibraryTileList(AppLocalizations l10n) => [ SideBarTiles( id: "playlists", + pathPrefix: "/library/playlists", title: l10n.playlists, route: const UserPlaylistsRoute(), icon: SpotubeIcons.playlist, ), SideBarTiles( id: "artists", + pathPrefix: "/library/artists", title: l10n.artists, route: const UserArtistsRoute(), icon: SpotubeIcons.artist, ), SideBarTiles( id: "albums", + pathPrefix: "/library/albums", title: l10n.albums, route: const UserAlbumsRoute(), icon: SpotubeIcons.album, ), SideBarTiles( id: "local_library", + pathPrefix: "/library/local", title: l10n.local_library, route: const UserLocalLibraryRoute(), icon: SpotubeIcons.device, @@ -74,25 +84,29 @@ List getSidebarLibraryTileList(AppLocalizations l10n) => [ List getNavbarTileList(AppLocalizations l10n) => [ SideBarTiles( - id: "browse", + id: "home", + pathPrefix: "/home", route: const HomeRoute(), icon: SpotubeIcons.home, title: l10n.browse, ), SideBarTiles( id: "search", + pathPrefix: "/search", route: const SearchRoute(), icon: SpotubeIcons.search, title: l10n.search, ), SideBarTiles( id: "library", + pathPrefix: "/library", route: const UserPlaylistsRoute(), icon: SpotubeIcons.library, title: l10n.library, ), SideBarTiles( id: "stats", + pathPrefix: "/stats", route: const StatsRoute(), icon: SpotubeIcons.chart, title: l10n.stats, diff --git a/lib/components/fallbacks/anonymous_fallback.dart b/lib/components/fallbacks/anonymous_fallback.dart index 714a0df5..293df932 100644 --- a/lib/components/fallbacks/anonymous_fallback.dart +++ b/lib/components/fallbacks/anonymous_fallback.dart @@ -40,7 +40,7 @@ class AnonymousFallback extends ConsumerWidget { Text(context.l10n.not_logged_in), Button.primary( child: Text(context.l10n.login_with_spotify), - onPressed: () => context.pushRoute(const SettingsRoute()), + onPressed: () => context.navigateTo(const SettingsRoute()), ) ], ), diff --git a/lib/components/links/artist_link.dart b/lib/components/links/artist_link.dart index cdd7f659..9467cb38 100644 --- a/lib/components/links/artist_link.dart +++ b/lib/components/links/artist_link.dart @@ -50,7 +50,7 @@ class ArtistLink extends StatelessWidget { onRouteChange?.call("/artist/${artist.value.id}"); } else { context - .pushRoute(ArtistRoute(artistId: artist.value.id!)); + .navigateTo(ArtistRoute(artistId: artist.value.id!)); } }, overflow: TextOverflow.ellipsis, diff --git a/lib/components/links/link_text.dart b/lib/components/links/link_text.dart index f21aa032..c64ae93d 100644 --- a/lib/components/links/link_text.dart +++ b/lib/components/links/link_text.dart @@ -28,7 +28,7 @@ class LinkText extends StatelessWidget { text, onTap: () { if (push) { - context.pushRoute(route); + context.navigateTo(route); } else { context.navigateTo(route); } diff --git a/lib/components/track_tile/track_options.dart b/lib/components/track_tile/track_options.dart index 66cee95f..b1105c7b 100644 --- a/lib/components/track_tile/track_options.dart +++ b/lib/components/track_tile/track_options.dart @@ -210,7 +210,7 @@ class TrackOptions extends HookConsumerWidget { onSelected: (value) async { switch (value) { case TrackOptionValue.album: - await context.pushRoute( + await context.navigateTo( AlbumRoute(id: track.album!.id!, album: track.album!), ); break; @@ -345,7 +345,7 @@ class TrackOptions extends HookConsumerWidget { alignment: Alignment.centerLeft, child: ArtistLink( artists: track.artists!, - onOverflowArtistClick: () => context.pushRoute( + onOverflowArtistClick: () => context.navigateTo( TrackRoute(trackId: track.id!), ), ), diff --git a/lib/components/track_tile/track_tile.dart b/lib/components/track_tile/track_tile.dart index 71aad728..9bb300f4 100644 --- a/lib/components/track_tile/track_tile.dart +++ b/lib/components/track_tile/track_tile.dart @@ -234,7 +234,7 @@ class TrackTile extends HookConsumerWidget { ), onPressed: () { context - .pushRoute(TrackRoute(trackId: track.id!)); + .navigateTo(TrackRoute(trackId: track.id!)); }, child: Text( track.name!, @@ -284,7 +284,7 @@ class TrackTile extends HookConsumerWidget { child: ArtistLink( artists: track.artists ?? [], onOverflowArtistClick: () { - context.pushRoute( + context.navigateTo( TrackRoute(trackId: track.id!), ); }, diff --git a/lib/hooks/configurators/use_deep_linking.dart b/lib/hooks/configurators/use_deep_linking.dart index 045fe016..67000d49 100644 --- a/lib/hooks/configurators/use_deep_linking.dart +++ b/lib/hooks/configurators/use_deep_linking.dart @@ -28,19 +28,20 @@ void useDeepLinking(WidgetRef ref, AppRouter router) { switch (url.pathSegments.first) { case "album": final album = await spotify.albums.get(url.pathSegments.last); - router.push( + router.navigate( AlbumRoute(id: album.id!, album: album), ); break; case "artist": - router.push(ArtistRoute(artistId: url.pathSegments.last)); + router.navigate(ArtistRoute(artistId: url.pathSegments.last)); break; case "playlist": final playlist = await spotify.playlists.get(url.pathSegments.last); - router.push(PlaylistRoute(id: playlist.id!, playlist: playlist)); + router + .navigate(PlaylistRoute(id: playlist.id!, playlist: playlist)); break; case "track": - router.push(TrackRoute(trackId: url.pathSegments.last)); + router.navigate(TrackRoute(trackId: url.pathSegments.last)); break; default: break; @@ -65,19 +66,19 @@ void useDeepLinking(WidgetRef ref, AppRouter router) { switch (startSegment) { case "spotify:album": final album = await spotify.albums.get(endSegment); - await router.push( + await router.navigate( AlbumRoute(id: album.id!, album: album), ); break; case "spotify:artist": - await router.push(ArtistRoute(artistId: endSegment)); + await router.navigate(ArtistRoute(artistId: endSegment)); break; case "spotify:track": - await router.push(TrackRoute(trackId: endSegment)); + await router.navigate(TrackRoute(trackId: endSegment)); break; case "spotify:playlist": final playlist = await spotify.playlists.get(endSegment); - await router.push( + await router.navigate( PlaylistRoute(id: playlist.id!, playlist: playlist), ); break; diff --git a/lib/modules/album/album_card.dart b/lib/modules/album/album_card.dart index a35bd53d..84106594 100644 --- a/lib/modules/album/album_card.dart +++ b/lib/modules/album/album_card.dart @@ -69,7 +69,7 @@ class AlbumCard extends HookConsumerWidget { "${album.albumType?.formatted} • ${album.artists?.asString() ?? ""}"; void onTap() { - context.pushRoute(AlbumRoute(id: album.id!, album: album)); + context.navigateTo(AlbumRoute(id: album.id!, album: album)); } void onPlaybuttonPressed() async { diff --git a/lib/modules/artist/artist_card.dart b/lib/modules/artist/artist_card.dart index 28ae6315..e53070ef 100644 --- a/lib/modules/artist/artist_card.dart +++ b/lib/modules/artist/artist_card.dart @@ -36,7 +36,7 @@ class ArtistCard extends HookConsumerWidget { width: 180, child: Button.card( onPressed: () { - context.pushRoute(ArtistRoute(artistId: artist.id!)); + context.navigateTo(ArtistRoute(artistId: artist.id!)); }, child: Column( children: [ diff --git a/lib/modules/connect/connect_device.dart b/lib/modules/connect/connect_device.dart index df2539a2..2c8d612b 100644 --- a/lib/modules/connect/connect_device.dart +++ b/lib/modules/connect/connect_device.dart @@ -26,7 +26,7 @@ class ConnectDeviceButton extends HookConsumerWidget { return IconButton.ghost( icon: const Icon(SpotubeIcons.speaker), onPressed: () { - context.pushRoute(const ConnectRoute()); + context.navigateTo(const ConnectRoute()); }, ); } @@ -35,7 +35,7 @@ class ConnectDeviceButton extends HookConsumerWidget { width: double.infinity, child: Button.primary( onPressed: () { - context.pushRoute(const ConnectRoute()); + context.navigateTo(const ConnectRoute()); }, trailing: const Icon(SpotubeIcons.speaker), child: Text( @@ -50,7 +50,7 @@ class ConnectDeviceButton extends HookConsumerWidget { children: [ SecondaryBadge( onPressed: () { - context.pushRoute(const ConnectRoute()); + context.navigateTo(const ConnectRoute()); }, style: const ButtonStyle.secondary(size: ButtonSize(.8)), leading: connectClients.asData?.value.resolvedService != null @@ -70,7 +70,7 @@ class ConnectDeviceButton extends HookConsumerWidget { IconButton.primary( icon: const Icon(SpotubeIcons.speaker), onPressed: () { - context.pushRoute(const ConnectRoute()); + context.navigateTo(const ConnectRoute()); }, ) ], diff --git a/lib/modules/home/sections/feed.dart b/lib/modules/home/sections/feed.dart index e423b08c..d3e363cc 100644 --- a/lib/modules/home/sections/feed.dart +++ b/lib/modules/home/sections/feed.dart @@ -40,7 +40,7 @@ class HomePageFeedSection extends HookConsumerWidget { titleTrailing: Button.text( child: Text(context.l10n.browse_all), onPressed: () { - context.pushRoute(HomeFeedSectionRoute(sectionUri: section.uri)); + context.navigateTo(HomeFeedSectionRoute(sectionUri: section.uri)); }, ), ); diff --git a/lib/modules/home/sections/friends/friend_item.dart b/lib/modules/home/sections/friends/friend_item.dart index 216cc607..8e91ab66 100644 --- a/lib/modules/home/sections/friends/friend_item.dart +++ b/lib/modules/home/sections/friends/friend_item.dart @@ -50,7 +50,7 @@ class FriendItem extends HookConsumerWidget { recognizer: TapGestureRecognizer() ..onTap = () { context - .pushRoute(TrackRoute(trackId: friend.track.id)); + .navigateTo(TrackRoute(trackId: friend.track.id)); }, ), const TextSpan(text: " • "), @@ -64,7 +64,7 @@ class FriendItem extends HookConsumerWidget { text: " ${friend.track.artist.name}", recognizer: TapGestureRecognizer() ..onTap = () { - context.pushRoute( + context.navigateTo( ArtistRoute(artistId: friend.track.artist.id), ); }, @@ -74,7 +74,7 @@ class FriendItem extends HookConsumerWidget { text: friend.track.context.name, recognizer: TapGestureRecognizer() ..onTap = () async { - context.router.pushNamed( + context.router.navigateNamed( "/${friend.track.context.path}", // extra: // !friend.track.context.path.startsWith("album") @@ -98,7 +98,7 @@ class FriendItem extends HookConsumerWidget { final album = await spotify.albums.get(friend.track.album.id); if (context.mounted) { - context.pushRoute( + context.navigateTo( AlbumRoute(id: album.id!, album: album), ); } diff --git a/lib/modules/home/sections/genres/genre_card.dart b/lib/modules/home/sections/genres/genre_card.dart index 8371e553..8133f0db 100644 --- a/lib/modules/home/sections/genres/genre_card.dart +++ b/lib/modules/home/sections/genres/genre_card.dart @@ -76,7 +76,7 @@ class GenreSectionCard extends HookConsumerWidget { ).h3(), Button.link( onPressed: () { - context.router.push( + context.navigateTo( GenrePlaylistsRoute( id: category.id!, category: category, diff --git a/lib/modules/home/sections/genres/genre_card_playlist_card.dart b/lib/modules/home/sections/genres/genre_card_playlist_card.dart index e5770efa..1e1b3b76 100644 --- a/lib/modules/home/sections/genres/genre_card_playlist_card.dart +++ b/lib/modules/home/sections/genres/genre_card_playlist_card.dart @@ -47,7 +47,7 @@ class GenreSectionCardPlaylistCard extends HookConsumerWidget { }, ), onPressed: () { - context.pushRoute( + context.navigateTo( PlaylistRoute(id: playlist.id!, playlist: playlist), ); }, diff --git a/lib/modules/home/sections/genres/genres.dart b/lib/modules/home/sections/genres/genres.dart index 507985c2..dd5512c8 100644 --- a/lib/modules/home/sections/genres/genres.dart +++ b/lib/modules/home/sections/genres/genres.dart @@ -48,7 +48,7 @@ class HomeGenresSection extends HookConsumerWidget { ), Button.link( onPressed: () { - context.pushRoute(const GenreRoute()); + context.navigateTo(const GenreRoute()); }, child: Text( context.l10n.browse_all, diff --git a/lib/modules/library/local_folder/local_folder_item.dart b/lib/modules/library/local_folder/local_folder_item.dart index 15355d8f..78f1aa14 100644 --- a/lib/modules/library/local_folder/local_folder_item.dart +++ b/lib/modules/library/local_folder/local_folder_item.dart @@ -59,7 +59,7 @@ class LocalFolderItem extends HookConsumerWidget { return Button( onPressed: () { - context.pushRoute( + context.navigateTo( LocalLibraryRoute( location: folder, isCache: isCacheFolder, diff --git a/lib/modules/library/user_downloads/download_item.dart b/lib/modules/library/user_downloads/download_item.dart index 11c86810..2c0a96a5 100644 --- a/lib/modules/library/user_downloads/download_item.dart +++ b/lib/modules/library/user_downloads/download_item.dart @@ -67,7 +67,7 @@ class DownloadItem extends HookConsumerWidget { artists: track.artists ?? [], mainAxisAlignment: WrapAlignment.start, onOverflowArtistClick: () { - context.pushRoute(TrackRoute(trackId: track.id!)); + context.navigateTo(TrackRoute(trackId: track.id!)); }, ), trailing: isQueryingSourceInfo diff --git a/lib/modules/player/player.dart b/lib/modules/player/player.dart index 2f43cbee..4335e298 100644 --- a/lib/modules/player/player.dart +++ b/lib/modules/player/player.dart @@ -93,7 +93,7 @@ class PlayerView extends HookConsumerWidget { }, [panelController.isAttached && panelController.isPanelOpen]); return AppPopScope( - canPop: context.watchRouter.canPop(), + canPop: false, onPopInvoked: (didPop) async { await panelController.close(); }, @@ -209,9 +209,9 @@ class PlayerView extends HookConsumerWidget { .copyWith(fontWeight: FontWeight.bold), onRouteChange: (route) { panelController.close(); - context.router.pushNamed(route); + context.router.navigateNamed(route); }, - onOverflowArtistClick: () => context.pushRoute( + onOverflowArtistClick: () => context.navigateTo( TrackRoute(trackId: currentTrack!.id!), ), ), diff --git a/lib/modules/player/player_overlay.dart b/lib/modules/player/player_overlay.dart index a37ac5bc..3c3ff373 100644 --- a/lib/modules/player/player_overlay.dart +++ b/lib/modules/player/player_overlay.dart @@ -1,4 +1,3 @@ -import 'package:flutter_hooks/flutter_hooks.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart'; import 'package:shadcn_flutter/shadcn_flutter.dart'; import 'package:sliding_up_panel/sliding_up_panel.dart'; @@ -8,6 +7,10 @@ import 'package:spotube/modules/root/spotube_navigation_bar.dart'; import 'package:spotube/modules/player/player.dart'; import 'package:spotube/provider/audio_player/audio_player.dart'; +final playerOverlayControllerProvider = StateProvider((ref) { + return PanelController(); +}); + class PlayerOverlay extends HookConsumerWidget { final String albumArt; @@ -23,7 +26,7 @@ class PlayerOverlay extends HookConsumerWidget { final screenSize = MediaQuery.sizeOf(context); - final panelController = useMemoized(() => PanelController(), []); + final panelController = ref.watch(playerOverlayControllerProvider); return SlidingUpPanel( maxHeight: screenSize.height, diff --git a/lib/modules/player/player_track_details.dart b/lib/modules/player/player_track_details.dart index 345a19db..2e38bf37 100644 --- a/lib/modules/player/player_track_details.dart +++ b/lib/modules/player/player_track_details.dart @@ -81,10 +81,10 @@ class PlayerTrackDetails extends HookConsumerWidget { ArtistLink( artists: playback.activeTrack?.artists ?? [], onRouteChange: (route) { - context.router.pushNamed(route); + context.router.navigateNamed(route); }, onOverflowArtistClick: () => - context.pushRoute(TrackRoute(trackId: track!.id!)), + context.navigateTo(TrackRoute(trackId: track!.id!)), ) ], ), diff --git a/lib/modules/playlist/playlist_card.dart b/lib/modules/playlist/playlist_card.dart index 1bbcf56f..8f0b5097 100644 --- a/lib/modules/playlist/playlist_card.dart +++ b/lib/modules/playlist/playlist_card.dart @@ -73,7 +73,7 @@ class PlaylistCard extends HookConsumerWidget { } void onTap() { - context.pushRoute(PlaylistRoute(id: playlist.id!, playlist: playlist)); + context.navigateTo(PlaylistRoute(id: playlist.id!, playlist: playlist)); } void onPlaybuttonPressed() async { diff --git a/lib/modules/root/sidebar/sidebar.dart b/lib/modules/root/sidebar/sidebar.dart index 2bfb8687..1149bd00 100644 --- a/lib/modules/root/sidebar/sidebar.dart +++ b/lib/modules/root/sidebar/sidebar.dart @@ -52,12 +52,12 @@ class Sidebar extends HookConsumerWidget { final router = context.watchRouter; final selectedIndex = tileList.indexWhere( - (e) => router.topRoute.name == e.route.routeName, + (e) => router.currentPath.startsWith(e.pathPrefix), ); if (layoutMode == LayoutMode.compact || (mediaQuery.smAndDown && layoutMode == LayoutMode.adaptive)) { - return Scaffold(child: child); + return child; } final navigationButtons = [ diff --git a/lib/modules/root/sidebar/sidebar_footer.dart b/lib/modules/root/sidebar/sidebar_footer.dart index 73916f50..fb3edddd 100644 --- a/lib/modules/root/sidebar/sidebar_footer.dart +++ b/lib/modules/root/sidebar/sidebar_footer.dart @@ -97,7 +97,7 @@ class SidebarFooter extends HookConsumerWidget implements NavigationBarItem { Flexible( child: GestureDetector( onTap: () { - context.pushRoute(const ProfileRoute()); + context.navigateTo(const ProfileRoute()); }, child: Row( children: [ @@ -125,7 +125,7 @@ class SidebarFooter extends HookConsumerWidget implements NavigationBarItem { variance: ButtonVariance.ghost, icon: const Icon(SpotubeIcons.settings), onPressed: () { - context.pushRoute(const SettingsRoute()); + context.navigateTo(const SettingsRoute()); }, ), ], diff --git a/lib/modules/root/spotube_navigation_bar.dart b/lib/modules/root/spotube_navigation_bar.dart index cd717833..9dc02378 100644 --- a/lib/modules/root/spotube_navigation_bar.dart +++ b/lib/modules/root/spotube_navigation_bar.dart @@ -6,7 +6,6 @@ import 'package:flutter_hooks/flutter_hooks.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart'; import 'package:shadcn_flutter/shadcn_flutter.dart'; import 'package:shadcn_flutter/shadcn_flutter_extension.dart'; -import 'package:spotube/collections/routes.gr.dart'; import 'package:spotube/collections/side_bar_tiles.dart'; import 'package:spotube/extensions/constrains.dart'; @@ -35,23 +34,13 @@ class SpotubeNavigationBar extends HookConsumerWidget { [context.l10n], ); - final libraryTiles = useMemoized( - () => getSidebarLibraryTileList(context.l10n) - .map((e) => e.route.routeName) - .toList(), - [context.l10n], - ); - final panelHeight = ref.watch(navigationPanelHeight); final router = context.watchRouter; final selectedIndex = max( 0, navbarTileList.indexWhere( - (e) => - router.topRoute.name == e.route.routeName || - (libraryTiles.contains(router.topRoute.name) && - e.route.routeName == LibraryRoute.name), + (e) => router.currentPath.startsWith(e.pathPrefix), ), ); diff --git a/lib/modules/stats/common/album_item.dart b/lib/modules/stats/common/album_item.dart index 3105eb17..cd0a6caf 100644 --- a/lib/modules/stats/common/album_item.dart +++ b/lib/modules/stats/common/album_item.dart @@ -37,14 +37,14 @@ class StatsAlbumItem extends StatelessWidget { artists: album.artists ?? [], mainAxisAlignment: WrapAlignment.start, onOverflowArtistClick: () => - context.pushRoute(AlbumRoute(id: album.id!, album: album)), + context.navigateTo(AlbumRoute(id: album.id!, album: album)), ), ), ], ), trailing: info, onPressed: () { - context.pushRoute(AlbumRoute(id: album.id!, album: album)); + context.navigateTo(AlbumRoute(id: album.id!, album: album)); }, ); } diff --git a/lib/modules/stats/common/artist_item.dart b/lib/modules/stats/common/artist_item.dart index 13e19777..5eff9a9d 100644 --- a/lib/modules/stats/common/artist_item.dart +++ b/lib/modules/stats/common/artist_item.dart @@ -30,7 +30,7 @@ class StatsArtistItem extends StatelessWidget { ), trailing: info, onPressed: () { - context.pushRoute(ArtistRoute(artistId: artist.id!)); + context.navigateTo(ArtistRoute(artistId: artist.id!)); }, ); } diff --git a/lib/modules/stats/common/playlist_item.dart b/lib/modules/stats/common/playlist_item.dart index 744fef04..58610af1 100644 --- a/lib/modules/stats/common/playlist_item.dart +++ b/lib/modules/stats/common/playlist_item.dart @@ -35,7 +35,7 @@ class StatsPlaylistItem extends StatelessWidget { ), trailing: info, onPressed: () { - context.pushRoute(PlaylistRoute(id: playlist.id!, playlist: playlist)); + context.navigateTo(PlaylistRoute(id: playlist.id!, playlist: playlist)); }, ); } diff --git a/lib/modules/stats/common/track_item.dart b/lib/modules/stats/common/track_item.dart index 640c2b0b..ae2e22c6 100644 --- a/lib/modules/stats/common/track_item.dart +++ b/lib/modules/stats/common/track_item.dart @@ -35,12 +35,12 @@ class StatsTrackItem extends StatelessWidget { artists: track.artists!, mainAxisAlignment: WrapAlignment.start, onOverflowArtistClick: () { - context.pushRoute(TrackRoute(trackId: track.id!)); + context.navigateTo(TrackRoute(trackId: track.id!)); }, ), trailing: info, onPressed: () { - context.pushRoute(TrackRoute(trackId: track.id!)); + context.navigateTo(TrackRoute(trackId: track.id!)); }, ); } diff --git a/lib/modules/stats/summary/summary.dart b/lib/modules/stats/summary/summary.dart index 6966da97..352d9ed3 100644 --- a/lib/modules/stats/summary/summary.dart +++ b/lib/modules/stats/summary/summary.dart @@ -45,7 +45,7 @@ class StatsPageSummarySection extends HookConsumerWidget { description: context.l10n.summary_listened_to_music, color: Colors.indigo, onTap: () { - context.pushRoute(const StatsMinutesRoute()); + context.navigateTo(const StatsMinutesRoute()); }, ), SummaryCard( @@ -54,7 +54,7 @@ class StatsPageSummarySection extends HookConsumerWidget { description: context.l10n.summary_streamed_overall, color: Colors.blue, onTap: () { - context.pushRoute(const StatsStreamsRoute()); + context.navigateTo(const StatsStreamsRoute()); }, ), SummaryCard.unformatted( @@ -63,7 +63,7 @@ class StatsPageSummarySection extends HookConsumerWidget { description: context.l10n.summary_owed_to_artists, color: Colors.green, onTap: () { - context.pushRoute(const StatsStreamsRoute()); + context.navigateTo(const StatsStreamsRoute()); }, ), SummaryCard( @@ -72,7 +72,7 @@ class StatsPageSummarySection extends HookConsumerWidget { description: context.l10n.summary_music_reached_you, color: Colors.yellow, onTap: () { - context.pushRoute(const StatsArtistsRoute()); + context.navigateTo(const StatsArtistsRoute()); }, ), SummaryCard( @@ -81,7 +81,7 @@ class StatsPageSummarySection extends HookConsumerWidget { description: context.l10n.summary_got_your_love, color: Colors.pink, onTap: () { - context.pushRoute(const StatsAlbumsRoute()); + context.navigateTo(const StatsAlbumsRoute()); }, ), SummaryCard( @@ -90,7 +90,7 @@ class StatsPageSummarySection extends HookConsumerWidget { description: context.l10n.summary_were_on_repeat, color: Colors.teal, onTap: () { - context.pushRoute(const StatsPlaylistsRoute()); + context.navigateTo(const StatsPlaylistsRoute()); }, ), ]), diff --git a/lib/pages/connect/connect.dart b/lib/pages/connect/connect.dart index 20b6d0da..d394ba16 100644 --- a/lib/pages/connect/connect.dart +++ b/lib/pages/connect/connect.dart @@ -72,7 +72,7 @@ class ConnectPage extends HookConsumerWidget { : null, onPressed: () { if (selected) { - context.pushRoute(const ConnectControlRoute()); + context.navigateTo(const ConnectControlRoute()); } else { connectClientsNotifier.resolveService(device); } diff --git a/lib/pages/connect/control/control.dart b/lib/pages/connect/control/control.dart index 504d670c..d0b423a6 100644 --- a/lib/pages/connect/control/control.dart +++ b/lib/pages/connect/control/control.dart @@ -115,7 +115,7 @@ class ConnectControlPage extends HookConsumerWidget { style: typography.h4, onTap: () { if (playlist.activeTrack == null) return; - context.pushRoute( + context.navigateTo( TrackRoute( trackId: playlist.activeTrack!.id!), ); @@ -127,7 +127,7 @@ class ConnectControlPage extends HookConsumerWidget { artists: playlist.activeTrack?.artists ?? [], textStyle: typography.normal, mainAxisAlignment: WrapAlignment.start, - onOverflowArtistClick: () => context.pushRoute( + onOverflowArtistClick: () => context.navigateTo( TrackRoute(trackId: playlist.activeTrack!.id!), ), ), diff --git a/lib/pages/home/genres/genres.dart b/lib/pages/home/genres/genres.dart index 1bdb3782..eaddeae6 100644 --- a/lib/pages/home/genres/genres.dart +++ b/lib/pages/home/genres/genres.dart @@ -51,7 +51,7 @@ class GenrePage extends HookConsumerWidget { final gradient = gradients[Random().nextInt(gradients.length)]; return CardImage( onPressed: () { - context.pushRoute( + context.navigateTo( GenrePlaylistsRoute( id: category.id!, category: category, diff --git a/lib/pages/home/home.dart b/lib/pages/home/home.dart index 9bcba29e..cd3ed273 100644 --- a/lib/pages/home/home.dart +++ b/lib/pages/home/home.dart @@ -54,7 +54,7 @@ class HomePage extends HookConsumerWidget { IconButton.ghost( icon: const Icon(SpotubeIcons.settings, size: 20), onPressed: () { - context.pushRoute(const SettingsRoute()); + context.navigateTo(const SettingsRoute()); }, ), const Gap(10), diff --git a/lib/pages/library/library.dart b/lib/pages/library/library.dart index 91353aed..be1d04ce 100644 --- a/lib/pages/library/library.dart +++ b/lib/pages/library/library.dart @@ -24,6 +24,7 @@ class LibraryPage extends HookConsumerWidget { ...getSidebarLibraryTileList(context.l10n), SideBarTiles( id: "downloads", + pathPrefix: "library/downloads", title: context.l10n.downloads, route: const UserDownloadsRoute(), icon: SpotubeIcons.download, @@ -32,42 +33,48 @@ class LibraryPage extends HookConsumerWidget { [context.l10n], ); final index = sidebarLibraryTileList.indexWhere( - (e) => router.topRoute.name == e.route.routeName, + (e) => router.currentPath.startsWith(e.pathPrefix), ); - return SafeArea( - bottom: false, - child: LayoutBuilder(builder: (context, constraints) { - return Scaffold( - headers: [ - if (constraints.smAndDown) - TitleBar( - child: SingleChildScrollView( - scrollDirection: Axis.horizontal, - child: TabList( - index: index, - children: [ - for (final tile in sidebarLibraryTileList) - TabButton( - child: Badge( - isLabelVisible: - tile.id == 'downloads' && downloadingCount > 0, - label: Text(downloadingCount.toString()), - child: Text(tile.title), + return PopScope( + canPop: false, + onPopInvokedWithResult: (didPop, result) { + context.navigateTo(const HomeRoute()); + }, + child: SafeArea( + bottom: false, + child: LayoutBuilder(builder: (context, constraints) { + return Scaffold( + headers: [ + if (constraints.smAndDown) + TitleBar( + child: SingleChildScrollView( + scrollDirection: Axis.horizontal, + child: TabList( + index: index, + children: [ + for (final tile in sidebarLibraryTileList) + TabButton( + child: Badge( + isLabelVisible: tile.id == 'downloads' && + downloadingCount > 0, + label: Text(downloadingCount.toString()), + child: Text(tile.title), + ), + onPressed: () { + context.navigateTo(tile.route); + }, ), - onPressed: () { - context.navigateTo(tile.route); - }, - ), - ], + ], + ), ), ), - ), - const Gap(10), - ], - child: const AutoRouter(), - ); - }), + const Gap(10), + ], + child: const AutoRouter(), + ); + }), + ), ); } } diff --git a/lib/pages/library/playlist_generate/playlist_generate.dart b/lib/pages/library/playlist_generate/playlist_generate.dart index 29bfb360..1bc96a29 100644 --- a/lib/pages/library/playlist_generate/playlist_generate.dart +++ b/lib/pages/library/playlist_generate/playlist_generate.dart @@ -663,7 +663,7 @@ class PlaylistGeneratorPage extends HookConsumerWidget { min: min.value, target: target.value, ); - context.pushRoute( + context.navigateTo( PlaylistGenerateResultRoute( state: routeState, ), diff --git a/lib/pages/library/user_playlists.dart b/lib/pages/library/user_playlists.dart index 76a01e18..6ac3bac0 100644 --- a/lib/pages/library/user_playlists.dart +++ b/lib/pages/library/user_playlists.dart @@ -114,7 +114,7 @@ class UserPlaylistsPage extends HookConsumerWidget { leading: const Icon(SpotubeIcons.magic), child: Text(context.l10n.generate), onPressed: () { - context.pushRoute(const PlaylistGeneratorRoute()); + context.navigateTo(const PlaylistGeneratorRoute()); }, ), const Gap(10), diff --git a/lib/pages/mobile_login/hooks/login_callback.dart b/lib/pages/mobile_login/hooks/login_callback.dart index af08b9f9..986b7f4a 100644 --- a/lib/pages/mobile_login/hooks/login_callback.dart +++ b/lib/pages/mobile_login/hooks/login_callback.dart @@ -21,7 +21,7 @@ Future Function() useLoginCallback(WidgetRef ref) { return useCallback(() async { if (kIsMobile || kIsMacOS) { - context.pushRoute(const WebViewLoginRoute()); + context.navigateTo(const WebViewLoginRoute()); return; } diff --git a/lib/pages/root/root_app.dart b/lib/pages/root/root_app.dart index e5f0917b..43e8fdcb 100644 --- a/lib/pages/root/root_app.dart +++ b/lib/pages/root/root_app.dart @@ -3,18 +3,13 @@ import 'package:flutter/services.dart'; import 'package:flutter_hooks/flutter_hooks.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart'; import 'package:shadcn_flutter/shadcn_flutter.dart'; -import 'package:spotube/collections/routes.gr.dart'; -import 'package:spotube/collections/side_bar_tiles.dart'; -import 'package:spotube/components/framework/app_pop_scope.dart'; import 'package:spotube/modules/root/bottom_player.dart'; import 'package:spotube/modules/root/sidebar/sidebar.dart'; import 'package:spotube/modules/root/spotube_navigation_bar.dart'; -import 'package:spotube/extensions/context.dart'; import 'package:spotube/hooks/configurators/use_endless_playback.dart'; import 'package:spotube/modules/root/use_downloader_dialogs.dart'; import 'package:spotube/modules/root/use_global_subscriptions.dart'; import 'package:spotube/provider/glance/glance.dart'; -import 'package:spotube/utils/platform.dart'; @RoutePage() class RootAppPage extends HookConsumerWidget { @@ -42,10 +37,6 @@ class RootAppPage extends HookConsumerWidget { return null; }, [backgroundColor, brightness]); - final navTileNames = useMemoized(() { - return getSidebarTileList(context.l10n).map((s) => s.route).toList(); - }, []); - final scaffold = MediaQuery.removeViewInsets( context: context, removeBottom: true, @@ -59,25 +50,6 @@ class RootAppPage extends HookConsumerWidget { ), ); - if (!kIsAndroid) { - return scaffold; - } - - final topRoute = context.router.topRoute; - final canPop = navTileNames.any((name) => name.routeName == topRoute.name); - - return AppPopScope( - canPop: canPop, - onPopInvoked: (didPop) { - if (didPop) return; - - if (topRoute.path == const HomeRoute().fragment) { - SystemNavigator.pop(); - } else { - context.navigateTo(const HomeRoute()); - } - }, - child: scaffold, - ); + return scaffold; } } diff --git a/lib/pages/search/search.dart b/lib/pages/search/search.dart index 2a69b057..d82b3153 100644 --- a/lib/pages/search/search.dart +++ b/lib/pages/search/search.dart @@ -6,6 +6,7 @@ import 'package:spotify/spotify.dart'; import 'package:flutter_hooks/flutter_hooks.dart'; import 'package:fuzzywuzzy/fuzzywuzzy.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart'; +import 'package:spotube/collections/routes.gr.dart'; import 'package:spotube/collections/spotube_icons.dart'; import 'package:spotube/components/inter_scrollbar/inter_scrollbar.dart'; @@ -68,165 +69,174 @@ class SearchPage extends HookConsumerWidget { ); } - return SafeArea( - bottom: false, - child: Scaffold( - headers: [ - if (kTitlebarVisible) - const TitleBar(automaticallyImplyLeading: true, height: 30) - ], - child: auth.asData?.value == null - ? const AnonymousFallback() - : Column( - children: [ - Row( - crossAxisAlignment: CrossAxisAlignment.center, - children: [ - Expanded( - child: Padding( - padding: const EdgeInsets.all(20), - child: ListenableBuilder( - listenable: controller, - builder: (context, _) { - final suggestions = controller.text.isEmpty - ? KVStoreService.recentSearches - : KVStoreService.recentSearches - .where( - (s) => - weightedRatio( - s.toLowerCase(), - controller.text.toLowerCase(), - ) > - 50, - ) - .toList(); + return PopScope( + canPop: false, + onPopInvokedWithResult: (didPop, result) { + context.navigateTo(const HomeRoute()); + }, + child: SafeArea( + bottom: false, + child: Scaffold( + headers: [ + if (kTitlebarVisible) + const TitleBar(automaticallyImplyLeading: true, height: 30) + ], + child: auth.asData?.value == null + ? const AnonymousFallback() + : Column( + children: [ + Row( + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Expanded( + child: Padding( + padding: const EdgeInsets.all(20), + child: ListenableBuilder( + listenable: controller, + builder: (context, _) { + final suggestions = controller.text.isEmpty + ? KVStoreService.recentSearches + : KVStoreService.recentSearches + .where( + (s) => + weightedRatio( + s.toLowerCase(), + controller.text.toLowerCase(), + ) > + 50, + ) + .toList(); - return KeyboardListener( - focusNode: focusNode, - autofocus: true, - onKeyEvent: (value) { - final isEnter = value.logicalKey == - LogicalKeyboardKey.enter; - - if (isEnter) { - onSubmitted(controller.text); - focusNode.unfocus(); - } - }, - child: AutoComplete( + return KeyboardListener( + focusNode: focusNode, autofocus: true, - controller: controller, - suggestions: suggestions, - leading: const Icon(SpotubeIcons.search), - textInputAction: TextInputAction.search, - placeholder: Text(context.l10n.search), - trailing: AnimatedCrossFade( - duration: - const Duration(milliseconds: 300), - crossFadeState: controller.text.isNotEmpty - ? CrossFadeState.showFirst - : CrossFadeState.showSecond, - firstChild: IconButton.ghost( - size: ButtonSize.small, - icon: const Icon(SpotubeIcons.close), - onPressed: () { - controller.clear(); - }, - ), - secondChild: - const SizedBox.square(dimension: 28), - ), - onAcceptSuggestion: (index) { - controller.text = - KVStoreService.recentSearches[index]; - ref - .read(searchTermStateProvider - .notifier) - .state = - KVStoreService.recentSearches[index]; + onKeyEvent: (value) { + final isEnter = value.logicalKey == + LogicalKeyboardKey.enter; + + if (isEnter) { + onSubmitted(controller.text); + focusNode.unfocus(); + } }, - onChanged: (value) {}, - onSubmitted: onSubmitted, - ), - ); - }), - ), - ), - ], - ), - Expanded( - child: AnimatedSwitcher( - duration: const Duration(milliseconds: 300), - child: switch ((searchTerm.isEmpty, isFetching)) { - (true, false) => Column( - children: [ - SizedBox( - height: mediaQuery.height * 0.2, - ), - Undraw( - illustration: UndrawIllustration.explore, - color: theme.colorScheme.primary, - height: 200 * theme.scaling, - ), - const SizedBox(height: 20), - Text(context.l10n.search_to_get_results).large(), - ], + child: AutoComplete( + autofocus: true, + controller: controller, + suggestions: suggestions, + leading: const Icon(SpotubeIcons.search), + textInputAction: TextInputAction.search, + placeholder: Text(context.l10n.search), + trailing: AnimatedCrossFade( + duration: + const Duration(milliseconds: 300), + crossFadeState: + controller.text.isNotEmpty + ? CrossFadeState.showFirst + : CrossFadeState.showSecond, + firstChild: IconButton.ghost( + size: ButtonSize.small, + icon: const Icon(SpotubeIcons.close), + onPressed: () { + controller.clear(); + }, + ), + secondChild: const SizedBox.square( + dimension: 28), + ), + onAcceptSuggestion: (index) { + controller.text = KVStoreService + .recentSearches[index]; + ref + .read(searchTermStateProvider + .notifier) + .state = + KVStoreService + .recentSearches[index]; + }, + onChanged: (value) {}, + onSubmitted: onSubmitted, + ), + ); + }), ), - (false, true) => Container( - constraints: BoxConstraints( - maxWidth: mediaQuery.lgAndUp - ? mediaQuery.width * 0.5 - : mediaQuery.width, - ), - padding: const EdgeInsets.symmetric( - horizontal: 20, - ), - child: Column( - mainAxisAlignment: MainAxisAlignment.center, - crossAxisAlignment: CrossAxisAlignment.center, + ), + ], + ), + Expanded( + child: AnimatedSwitcher( + duration: const Duration(milliseconds: 300), + child: switch ((searchTerm.isEmpty, isFetching)) { + (true, false) => Column( children: [ - Text( - context.l10n.crunching_results, - style: TextStyle( - fontSize: 20, - fontWeight: FontWeight.w900, - color: theme.colorScheme.foreground - .withOpacity(0.7), - ), + SizedBox( + height: mediaQuery.height * 0.2, + ), + Undraw( + illustration: UndrawIllustration.explore, + color: theme.colorScheme.primary, + height: 200 * theme.scaling, ), const SizedBox(height: 20), - const LinearProgressIndicator(), + Text(context.l10n.search_to_get_results) + .large(), ], ), - ), - _ => InterScrollbar( - controller: scrollController, - child: SingleChildScrollView( + (false, true) => Container( + constraints: BoxConstraints( + maxWidth: mediaQuery.lgAndUp + ? mediaQuery.width * 0.5 + : mediaQuery.width, + ), + padding: const EdgeInsets.symmetric( + horizontal: 20, + ), + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Text( + context.l10n.crunching_results, + style: TextStyle( + fontSize: 20, + fontWeight: FontWeight.w900, + color: theme.colorScheme.foreground + .withOpacity(0.7), + ), + ), + const SizedBox(height: 20), + const LinearProgressIndicator(), + ], + ), + ), + _ => InterScrollbar( controller: scrollController, - child: const Padding( - padding: EdgeInsets.symmetric(vertical: 8), - child: SafeArea( - child: Column( - crossAxisAlignment: - CrossAxisAlignment.start, - children: [ - SearchTracksSection(), - SearchPlaylistsSection(), - Gap(20), - SearchArtistsSection(), - Gap(20), - SearchAlbumsSection(), - ], + child: SingleChildScrollView( + controller: scrollController, + child: const Padding( + padding: EdgeInsets.symmetric(vertical: 8), + child: SafeArea( + child: Column( + crossAxisAlignment: + CrossAxisAlignment.start, + children: [ + SearchTracksSection(), + SearchPlaylistsSection(), + Gap(20), + SearchArtistsSection(), + Gap(20), + SearchAlbumsSection(), + ], + ), ), ), ), ), - ), - }, + }, + ), ), - ), - ], - ), + ], + ), + ), ), ); } diff --git a/lib/pages/settings/sections/about.dart b/lib/pages/settings/sections/about.dart index fcdac8a7..82c98e90 100644 --- a/lib/pages/settings/sections/about.dart +++ b/lib/pages/settings/sections/about.dart @@ -90,7 +90,7 @@ class SettingsAboutSection extends HookConsumerWidget { title: Text(context.l10n.about_spotube), trailing: const Icon(SpotubeIcons.angleRight), onTap: () { - context.pushRoute(const AboutSpotubeRoute()); + context.navigateTo(const AboutSpotubeRoute()); }, ) ], diff --git a/lib/pages/settings/sections/accounts.dart b/lib/pages/settings/sections/accounts.dart index 95619d30..5e40b9ec 100644 --- a/lib/pages/settings/sections/accounts.dart +++ b/lib/pages/settings/sections/accounts.dart @@ -49,7 +49,7 @@ class SettingsAccountSection extends HookConsumerWidget { ), ), onTap: () { - context.pushRoute(ProfileRoute()); + context.navigateTo(ProfileRoute()); }, ), if (auth.asData?.value == null) @@ -112,7 +112,7 @@ class SettingsAccountSection extends HookConsumerWidget { trailing: Button.secondary( leading: const Icon(SpotubeIcons.lastFm), onPressed: () { - context.pushRoute(const LastFMLoginRoute()); + context.navigateTo(const LastFMLoginRoute()); }, child: Text(context.l10n.connect), ), diff --git a/lib/pages/settings/sections/developers.dart b/lib/pages/settings/sections/developers.dart index 6afe01c3..0862e023 100644 --- a/lib/pages/settings/sections/developers.dart +++ b/lib/pages/settings/sections/developers.dart @@ -21,7 +21,7 @@ class SettingsDevelopersSection extends HookWidget { title: Text(context.l10n.logs), trailing: const Icon(SpotubeIcons.angleRight), onTap: () { - context.pushRoute(const LogsRoute()); + context.navigateTo(const LogsRoute()); }, ) ], diff --git a/lib/pages/settings/sections/playback.dart b/lib/pages/settings/sections/playback.dart index 9e561655..537156d0 100644 --- a/lib/pages/settings/sections/playback.dart +++ b/lib/pages/settings/sections/playback.dart @@ -268,7 +268,7 @@ class SettingsPlaybackSection extends HookConsumerWidget { title: Text(context.l10n.blacklist), subtitle: Text(context.l10n.blacklist_description), onTap: () { - context.pushRoute(const BlackListRoute()); + context.navigateTo(const BlackListRoute()); }, trailing: const Icon(SpotubeIcons.angleRight), ), diff --git a/lib/pages/stats/stats.dart b/lib/pages/stats/stats.dart index 4f0cf95b..1a2a86a1 100644 --- a/lib/pages/stats/stats.dart +++ b/lib/pages/stats/stats.dart @@ -1,5 +1,6 @@ import 'package:hooks_riverpod/hooks_riverpod.dart'; import 'package:shadcn_flutter/shadcn_flutter.dart'; +import 'package:spotube/collections/routes.gr.dart'; import 'package:spotube/components/titlebar/titlebar.dart'; import 'package:spotube/modules/stats/summary/summary.dart'; import 'package:spotube/modules/stats/top/top.dart'; @@ -14,23 +15,29 @@ class StatsPage extends HookConsumerWidget { @override Widget build(BuildContext context, ref) { - return SafeArea( - bottom: false, - child: Scaffold( - headers: [ - if (kTitlebarVisible) const TitleBar(), - ], - child: CustomScrollView( - slivers: [ - if (kIsMacOS) const SliverGap(20), - const StatsPageSummarySection(), - const StatsPageTopSection(), - const SliverToBoxAdapter( - child: SafeArea( - child: SizedBox(), - ), - ) + return PopScope( + canPop: false, + onPopInvokedWithResult: (didPop, result) { + context.navigateTo(const HomeRoute()); + }, + child: SafeArea( + bottom: false, + child: Scaffold( + headers: [ + if (kTitlebarVisible) const TitleBar(), ], + child: CustomScrollView( + slivers: [ + if (kIsMacOS) const SliverGap(20), + const StatsPageSummarySection(), + const StatsPageTopSection(), + const SliverToBoxAdapter( + child: SafeArea( + child: SizedBox(), + ), + ) + ], + ), ), ), );