feat: update app template using wyatt_go_router

This commit is contained in:
Hugo Pointcheval 2023-11-14 18:56:52 +01:00
parent 0d2605717a
commit 5e9e5af690
Signed by: hugo
GPG Key ID: 3AAC487E131E00BC
16 changed files with 28 additions and 288 deletions

View File

@ -17,7 +17,7 @@
name: wyatt_app_template
description: New app template for Wyatt Studio projects.
version: 0.2.1
version: 0.2.2
vars:
display_name:

View File

@ -1,10 +0,0 @@
enum PageProtection {
/// The page can be accessed without authentication.
public,
/// The page can only be accessed with authentication.
protected,
/// The page protection is unknown, and the default one should be used.
none,
}

View File

@ -1,37 +0,0 @@
import 'package:go_router/go_router.dart';
import 'package:starting_template/core/enums/page_protection.dart';
/// Defines if a GoRoute is public or not.
///
/// By default, all routes are in the [PageProtection.none] state.
extension GoRouteGuard on GoRoute {
static final _guard = Expando<PageProtection>();
/// Returns `true` if the route is public.
bool get isPublic => _guard[this] == PageProtection.public;
/// Returns `true` if the route is protected.
bool get isProtected => _guard[this] == PageProtection.protected;
/// Returns `true` if the route is neither public nor protected.
/// This is the default state.
bool get isNone => _guard[this] == PageProtection.none;
/// Sets the route to be public.
/// This is useful for routes that should be accessible
/// without authentication.
/// ```dart
/// GoRoute(
/// path: '/sign_in',
/// ...
/// )..setPublic(),
/// ```
void setPublic() => _guard[this] = PageProtection.public;
/// Sets the route to be protected.
/// This is useful for routes that should only be accessible
/// with authentication.
void setProtected() => _guard[this] = PageProtection.protected;
PageProtection get guard => _guard[this] ?? PageProtection.none;
}

View File

@ -1,21 +0,0 @@
import 'package:go_router/go_router.dart';
import 'package:starting_template/core/extensions/go_route_guard.dart';
extension GoRouteListExtension on Iterable<GoRoute> {
/// Returns a list of public routes.
List<GoRoute> get publicRoutes =>
where((route) => route.isPublic).toList(growable: false);
/// Returns a list of protected routes.
List<GoRoute> get protectedRoutes =>
where((route) => route.isProtected).toList(growable: false);
/// Returns a list of routes that are neither public nor protected.
List<GoRoute> get noneRoutes =>
where((route) => route.isNone).toList(growable: false);
GoRoute fromName(String name) => firstWhere((route) => route.name == name);
GoRoute fromPath(String path) => firstWhere((route) => route.path == path);
GoRoute operator [](String name) => fromName(name);
}

View File

@ -1,20 +0,0 @@
import 'package:go_router/go_router.dart';
/// Flatten the [GoRoute] tree.
extension RouteBaseExtension on RouteBase {
List<GoRoute> flatten() {
final List<GoRoute> routes = [];
if (this is GoRoute) {
routes.add(this as GoRoute);
} else if (this is ShellRoute) {
routes.addAll(
(this as ShellRoute)
.routes
.map((route) => route.flatten())
.expand((routeList) => routeList),
);
}
return routes;
}
}

View File

@ -1,10 +1,6 @@
import 'package:flutter/cupertino.dart';
import 'package:go_router/go_router.dart';
import 'package:starting_template/core/enums/page_protection.dart';
import 'package:starting_template/core/extensions/go_route_guard.dart';
import 'package:starting_template/core/extensions/route_base_extension.dart';
import 'package:starting_template/core/routes/go_router_refresh_stream.dart';
import 'package:starting_template/presentation/features/home/home.dart';
import 'package:wyatt_go_router/wyatt_go_router.dart';
abstract class AppRouter {
/// Default transition for all pages
@ -52,34 +48,15 @@ abstract class AppRouter {
/// Define the default guard
/// This is the guard that will be used if the route
/// does not have a guard set. (It is set to [PageProtection.none])
const defaultGuard = PageProtection.protected;
/// Recursively get all routes and subroutes in a one-dimensional list
/// This will work for any level of nesting
final routes =
AppRouter.routes.map((route) => route.flatten()).expand(
(routeList) => routeList,
);
/// Matches is a list of all routes that match the current uri
final matches = _router?.configuration
.findMatch(
state.uri.toString(),
)
.routes
.map((route) => route.flatten())
.expand(
(routeList) => routeList,
) ??
routes;
const defaultProtection = PageProtection.protected;
/// Get the current route
final currentRoute = matches.last;
final currentRoute = context.currentRoute;
/// Get the guard of the current route
final guard = (currentRoute.guard == PageProtection.none)
? defaultGuard
: currentRoute.guard;
final _ = (currentRoute.protection == PageProtection.none)
? defaultProtection
: currentRoute.protection;
return null;
},

View File

@ -1,24 +0,0 @@
import 'dart:async';
import 'package:flutter/foundation.dart';
/// {@template go_router_refresh_stream}
/// A [ChangeNotifier] that notifies its listeners when a stream emits a value.
/// {@endtemplate}
class GoRouterRefreshStream extends ChangeNotifier {
/// {@macro go_router_refresh_stream}
GoRouterRefreshStream(Stream<dynamic> stream) {
notifyListeners();
_subscription = stream.asBroadcastStream().listen(
(dynamic _) => notifyListeners(),
);
}
late final StreamSubscription<dynamic> _subscription;
@override
void dispose() {
_subscription.cancel();
super.dispose();
}
}

View File

@ -15,9 +15,9 @@ dependencies:
freezed_annotation: ^2.4.1
gap: ^3.0.1
get_it: ^7.6.4
go_router: ^10.1.2
intl: ^0.18.1
json_annotation: ^4.8.1
logging: ^1.2.0
flutter:
sdk: flutter
@ -41,7 +41,12 @@ dependencies:
hosted:
name: wyatt_type_utils
url: https://git.wyatt-studio.fr/api/packages/Wyatt-FOSS/pub/
logging: ^1.2.0
wyatt_go_router:
version: ^1.0.0
hosted:
name: wyatt_go_router
url: https://git.wyatt-studio.fr/api/packages/Wyatt-FOSS/pub/
dev_dependencies:
build_runner: ^2.4.6

View File

@ -1,10 +0,0 @@
enum PageProtection {
/// The page can be accessed without authentication.
public,
/// The page can only be accessed with authentication.
protected,
/// The page protection is unknown, and the default one should be used.
none,
}

View File

@ -1,37 +0,0 @@
import 'package:go_router/go_router.dart';
import 'package:{{#snakeCase}}{{project_name}}{{/snakeCase}}/core/enums/page_protection.dart';
/// Defines if a GoRoute is public or not.
///
/// By default, all routes are in the [PageProtection.none] state.
extension GoRouteGuard on GoRoute {
static final _guard = Expando<PageProtection>();
/// Returns `true` if the route is public.
bool get isPublic => _guard[this] == PageProtection.public;
/// Returns `true` if the route is protected.
bool get isProtected => _guard[this] == PageProtection.protected;
/// Returns `true` if the route is neither public nor protected.
/// This is the default state.
bool get isNone => _guard[this] == PageProtection.none;
/// Sets the route to be public.
/// This is useful for routes that should be accessible
/// without authentication.
/// ```dart
/// GoRoute(
/// path: '/sign_in',
/// ...
/// )..setPublic(),
/// ```
void setPublic() => _guard[this] = PageProtection.public;
/// Sets the route to be protected.
/// This is useful for routes that should only be accessible
/// with authentication.
void setProtected() => _guard[this] = PageProtection.protected;
PageProtection get guard => _guard[this] ?? PageProtection.none;
}

View File

@ -1,21 +0,0 @@
import 'package:go_router/go_router.dart';
import 'package:{{#snakeCase}}{{project_name}}{{/snakeCase}}/core/extensions/go_route_guard.dart';
extension GoRouteListExtension on Iterable<GoRoute> {
/// Returns a list of public routes.
List<GoRoute> get publicRoutes =>
where((route) => route.isPublic).toList(growable: false);
/// Returns a list of protected routes.
List<GoRoute> get protectedRoutes =>
where((route) => route.isProtected).toList(growable: false);
/// Returns a list of routes that are neither public nor protected.
List<GoRoute> get noneRoutes =>
where((route) => route.isNone).toList(growable: false);
GoRoute fromName(String name) => firstWhere((route) => route.name == name);
GoRoute fromPath(String path) => firstWhere((route) => route.path == path);
GoRoute operator [](String name) => fromName(name);
}

View File

@ -1,20 +0,0 @@
import 'package:go_router/go_router.dart';
/// Flatten the [GoRoute] tree.
extension RouteBaseExtension on RouteBase {
List<GoRoute> flatten() {
final List<GoRoute> routes = [];
if (this is GoRoute) {
routes.add(this as GoRoute);
} else if (this is ShellRoute) {
routes.addAll(
(this as ShellRoute)
.routes
.map((route) => route.flatten())
.expand((routeList) => routeList),
);
}
return routes;
}
}

View File

@ -1,10 +1,6 @@
import 'package:flutter/cupertino.dart';
import 'package:go_router/go_router.dart';
import 'package:{{#snakeCase}}{{project_name}}{{/snakeCase}}/core/enums/page_protection.dart';
import 'package:{{#snakeCase}}{{project_name}}{{/snakeCase}}/core/extensions/go_route_guard.dart';
import 'package:{{#snakeCase}}{{project_name}}{{/snakeCase}}/core/extensions/route_base_extension.dart';
import 'package:{{#snakeCase}}{{project_name}}{{/snakeCase}}/core/routes/go_router_refresh_stream.dart';
import 'package:{{#snakeCase}}{{project_name}}{{/snakeCase}}/presentation/features/home/home.dart';
import 'package:wyatt_go_router/wyatt_go_router.dart';
abstract class AppRouter {
/// Default transition for all pages
@ -52,34 +48,15 @@ abstract class AppRouter {
/// Define the default guard
/// This is the guard that will be used if the route
/// does not have a guard set. (It is set to [PageProtection.none])
const defaultGuard = PageProtection.protected;
/// Recursively get all routes and subroutes in a one-dimensional list
/// This will work for any level of nesting
final routes =
AppRouter.routes.map((route) => route.flatten()).expand(
(routeList) => routeList,
);
/// Matches is a list of all routes that match the current uri
final matches = _router?.configuration
.findMatch(
state.uri.toString(),
)
.routes
.map((route) => route.flatten())
.expand(
(routeList) => routeList,
) ??
routes;
const defaultProtection = PageProtection.protected;
/// Get the current route
final currentRoute = matches.last;
final currentRoute = context.currentRoute;
/// Get the guard of the current route
final guard = (currentRoute.guard == PageProtection.none)
? defaultGuard
: currentRoute.guard;
final _ = (currentRoute.protection == PageProtection.none)
? defaultProtection
: currentRoute.protection;
return null;
},

View File

@ -1,24 +0,0 @@
import 'dart:async';
import 'package:flutter/foundation.dart';
/// {@template go_router_refresh_stream}
/// A [ChangeNotifier] that notifies its listeners when a stream emits a value.
/// {@endtemplate}
class GoRouterRefreshStream extends ChangeNotifier {
/// {@macro go_router_refresh_stream}
GoRouterRefreshStream(Stream<dynamic> stream) {
notifyListeners();
_subscription = stream.asBroadcastStream().listen(
(dynamic _) => notifyListeners(),
);
}
late final StreamSubscription<dynamic> _subscription;
@override
void dispose() {
_subscription.cancel();
super.dispose();
}
}

View File

@ -15,9 +15,9 @@ dependencies:
freezed_annotation: ^2.4.1
gap: ^3.0.1
get_it: ^7.6.4
go_router: ^10.1.2
intl: ^0.18.1
json_annotation: ^4.8.1
logging: ^1.2.0
flutter:
sdk: flutter
@ -41,7 +41,12 @@ dependencies:
hosted:
name: wyatt_type_utils
url: https://git.wyatt-studio.fr/api/packages/Wyatt-FOSS/pub/
logging: ^1.2.0
wyatt_go_router:
version: ^1.0.0
hosted:
name: wyatt_go_router
url: https://git.wyatt-studio.fr/api/packages/Wyatt-FOSS/pub/
dev_dependencies:
build_runner: ^2.4.6

View File

@ -1,7 +1,7 @@
name: wyatt_app_template
description: New app template for Wyatt Studio projects.
version: 0.2.1
version: 0.2.2
vars:
display_name: