initial onboarding

This commit is contained in:
Fabian Freund
2025-06-14 23:33:24 +02:00
parent 11a1e8e5f5
commit bce9f0b3a5
26 changed files with 918 additions and 12 deletions
+26 -2
View File
@@ -2,10 +2,34 @@ import 'package:go_router/go_router.dart';
import 'package:hooks_riverpod/hooks_riverpod.dart';
import 'package:riverpod_annotation/riverpod_annotation.dart';
import 'package:weblibre/core/routing/routes.dart';
import 'package:weblibre/features/user/domain/repositories/onboarding.dart';
part 'router.g.dart';
@Riverpod(keepAlive: true)
GoRouter router(Ref ref) {
return GoRouter(debugLogDiagnostics: true, routes: $appRoutes);
Future<GoRouter> router(Ref ref) async {
String? initialLocation;
final onboardingMandatory = await ref
.read(onboardingRepositoryProvider.notifier)
.isOutdated();
if (onboardingMandatory) {
final current = await ref
.read(onboardingRepositoryProvider.notifier)
.getCurrentRevision();
final route = OnboardingRoute(
currentRevision: current ?? -1,
targetRevision: OnboardingRepository.targetRevision,
);
initialLocation = route.location;
}
return GoRouter(
debugLogDiagnostics: true,
routes: $appRoutes,
initialLocation: initialLocation,
);
}
+3 -3
View File
@@ -6,11 +6,11 @@ part of 'router.dart';
// RiverpodGenerator
// **************************************************************************
String _$routerHash() => r'25fc899b87c080600f6e1d87d510db333378bdfd';
String _$routerHash() => r'ce7cc5b5f236781a06867a852a08ed03d3582022';
/// See also [router].
@ProviderFor(router)
final routerProvider = Provider<GoRouter>.internal(
final routerProvider = FutureProvider<GoRouter>.internal(
router,
name: r'routerProvider',
debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product')
@@ -22,6 +22,6 @@ final routerProvider = Provider<GoRouter>.internal(
@Deprecated('Will be removed in 3.0. Use Ref instead')
// ignore: unused_element
typedef RouterRef = ProviderRef<GoRouter>;
typedef RouterRef = FutureProviderRef<GoRouter>;
// ignore_for_file: type=lint
// ignore_for_file: subtype_of_sealed_class, invalid_use_of_internal_member, invalid_use_of_visible_for_testing_member, deprecated_member_use_from_same_package
+23
View File
@@ -16,6 +16,7 @@ import 'package:weblibre/features/geckoview/features/search/presentation/screens
import 'package:weblibre/features/geckoview/features/tabs/data/models/container_data.dart';
import 'package:weblibre/features/geckoview/features/tabs/presentation/screens/container_edit.dart';
import 'package:weblibre/features/geckoview/features/tabs/presentation/screens/container_list.dart';
import 'package:weblibre/features/onboarding/presentation/onboarding.dart';
import 'package:weblibre/features/settings/presentation/screens/bang_settings.dart';
import 'package:weblibre/features/settings/presentation/screens/general_settings.dart';
import 'package:weblibre/features/settings/presentation/screens/settings.dart';
@@ -43,3 +44,25 @@ class AboutRoute extends GoRouteData with _$AboutRoute {
return DialogPage(builder: (_) => const AboutDialogScreen());
}
}
@TypedGoRoute<OnboardingRoute>(
name: 'OnboardingRoute',
path: '/onboarding/:currentRevision/:targetRevision',
)
class OnboardingRoute extends GoRouteData with _$OnboardingRoute {
final int currentRevision;
final int targetRevision;
const OnboardingRoute({
required this.currentRevision,
required this.targetRevision,
});
@override
Widget build(BuildContext context, GoRouterState state) {
return OnboardingScreen(
currentRevision: currentRevision,
targetRevision: targetRevision,
);
}
}
+35
View File
@@ -8,6 +8,7 @@ part of 'routes.dart';
List<RouteBase> get $appRoutes => [
$aboutRoute,
$onboardingRoute,
$settingsRoute,
$browserRoute,
$bangCategoriesRoute,
@@ -41,6 +42,40 @@ mixin _$AboutRoute on GoRouteData {
void replace(BuildContext context) => context.replace(location);
}
RouteBase get $onboardingRoute => GoRouteData.$route(
path: '/onboarding/:currentRevision/:targetRevision',
name: 'OnboardingRoute',
factory: _$OnboardingRoute._fromState,
);
mixin _$OnboardingRoute on GoRouteData {
static OnboardingRoute _fromState(GoRouterState state) => OnboardingRoute(
currentRevision: int.parse(state.pathParameters['currentRevision']!)!,
targetRevision: int.parse(state.pathParameters['targetRevision']!)!,
);
OnboardingRoute get _self => this as OnboardingRoute;
@override
String get location => GoRouteData.$location(
'/onboarding/${Uri.encodeComponent(_self.currentRevision.toString())}/${Uri.encodeComponent(_self.targetRevision.toString())}',
);
@override
void go(BuildContext context) => context.go(location);
@override
Future<T?> push<T>(BuildContext context) => context.push<T>(location);
@override
void pushReplacement(BuildContext context) =>
context.pushReplacement(location);
@override
void replace(BuildContext context) => context.replace(location);
}
RouteBase get $settingsRoute => GoRouteData.$route(
path: '/settings',
name: 'SettingsRoute',