import 'package:flutter/material.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:go_router/go_router.dart'; import '../auth/auth_provider.dart'; import '../auth/login_screen.dart'; import '../auth/server_url_screen.dart'; import '../library/album_detail_screen.dart'; import '../library/artist_detail_screen.dart'; import '../library/home_screen.dart'; import '../player/now_playing_screen.dart'; import '../player/player_bar.dart'; import 'widgets/version_gate.dart'; /// Exposed as a Provider so its single argument is a real `Ref` (the /// constructor's redirect closures use `ref.read`). Widgets consume the /// router via `ref.watch(routerProvider)` instead of constructing it /// themselves with a `WidgetRef`, which can't satisfy the `Ref` type. final routerProvider = Provider((ref) => buildRouter(ref)); GoRouter buildRouter(Ref ref) { return GoRouter( initialLocation: '/', redirect: (ctx, state) async { final url = await ref.read(serverUrlProvider.future); if (url == null) return '/server-url'; final user = await ref.read(authControllerProvider.future); final loc = state.matchedLocation; if (user == null && loc != '/login' && loc != '/server-url') { return '/login'; } if (user != null && (loc == '/login' || loc == '/server-url')) { return '/home'; } return null; }, routes: [ GoRoute(path: '/', redirect: (_, __) => '/home'), GoRoute(path: '/server-url', builder: (_, __) => const ServerUrlScreen()), GoRoute(path: '/login', builder: (_, __) => const LoginScreen()), ShellRoute( builder: (ctx, state, child) => VersionGate(child: _ShellWithPlayerBar(child: child)), routes: [ GoRoute(path: '/home', builder: (_, __) => const HomeScreen()), GoRoute( path: '/artists/:id', builder: (_, s) => ArtistDetailScreen(id: s.pathParameters['id']!), ), GoRoute( path: '/albums/:id', builder: (_, s) => AlbumDetailScreen(id: s.pathParameters['id']!), ), GoRoute(path: '/now-playing', builder: (_, __) => const NowPlayingScreen()), ], ), ], ); } class _ShellWithPlayerBar extends StatelessWidget { const _ShellWithPlayerBar({required this.child}); final Widget child; @override Widget build(BuildContext context) { return Column( children: [ Expanded(child: child), const PlayerBar(), ], ); } }