feat: update app template using wyatt_go_router
This commit is contained in:
		
							parent
							
								
									0d2605717a
								
							
						
					
					
						commit
						5e9e5af690
					
				| @ -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: | ||||
|  | ||||
| @ -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, | ||||
| } | ||||
| @ -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; | ||||
| } | ||||
| @ -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); | ||||
| } | ||||
| @ -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; | ||||
|   } | ||||
| } | ||||
| @ -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; | ||||
|         }, | ||||
|  | ||||
| @ -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(); | ||||
|   } | ||||
| } | ||||
| @ -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 | ||||
|  | ||||
| @ -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, | ||||
| } | ||||
| @ -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; | ||||
| } | ||||
| @ -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); | ||||
| } | ||||
| @ -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; | ||||
|   } | ||||
| } | ||||
| @ -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; | ||||
|         }, | ||||
|  | ||||
| @ -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(); | ||||
|   } | ||||
| } | ||||
| @ -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 | ||||
|  | ||||
| @ -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: | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user