aaa
This commit is contained in:
205
lib/core/router/app_router.dart
Normal file
205
lib/core/router/app_router.dart
Normal file
@@ -0,0 +1,205 @@
|
||||
/// App Router Configuration
|
||||
///
|
||||
/// Centralized routing configuration using go_router.
|
||||
/// Defines all routes, navigation guards, and deep linking.
|
||||
library;
|
||||
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:go_router/go_router.dart';
|
||||
import 'package:worker/features/home/presentation/pages/home_page.dart';
|
||||
|
||||
/// App Router
|
||||
///
|
||||
/// Handles navigation throughout the app using declarative routing.
|
||||
/// Features:
|
||||
/// - Named routes for type-safe navigation
|
||||
/// - Authentication guards (TODO: implement when auth is ready)
|
||||
/// - Deep linking support
|
||||
/// - Transition animations
|
||||
class AppRouter {
|
||||
/// Router configuration
|
||||
static final GoRouter router = GoRouter(
|
||||
// Initial route
|
||||
initialLocation: RouteNames.home,
|
||||
|
||||
// Route definitions
|
||||
routes: [
|
||||
// Home Route
|
||||
GoRoute(
|
||||
path: RouteNames.home,
|
||||
name: RouteNames.home,
|
||||
pageBuilder: (context, state) => MaterialPage(
|
||||
key: state.pageKey,
|
||||
child: const HomePage(),
|
||||
),
|
||||
),
|
||||
|
||||
// TODO: Add more routes as features are implemented
|
||||
// Example:
|
||||
// GoRoute(
|
||||
// path: RouteNames.products,
|
||||
// name: RouteNames.products,
|
||||
// pageBuilder: (context, state) => MaterialPage(
|
||||
// key: state.pageKey,
|
||||
// child: const ProductsPage(),
|
||||
// ),
|
||||
// ),
|
||||
],
|
||||
|
||||
// Error page for unknown routes
|
||||
errorPageBuilder: (context, state) => MaterialPage(
|
||||
key: state.pageKey,
|
||||
child: Scaffold(
|
||||
appBar: AppBar(
|
||||
title: const Text('Không tìm thấy trang'),
|
||||
),
|
||||
body: Center(
|
||||
child: Column(
|
||||
mainAxisAlignment: MainAxisAlignment.center,
|
||||
children: [
|
||||
const Icon(
|
||||
Icons.error_outline,
|
||||
size: 64,
|
||||
color: Colors.red,
|
||||
),
|
||||
const SizedBox(height: 16),
|
||||
const Text(
|
||||
'Trang không tồn tại',
|
||||
style: TextStyle(fontSize: 20, fontWeight: FontWeight.bold),
|
||||
),
|
||||
const SizedBox(height: 8),
|
||||
Text(
|
||||
state.uri.toString(),
|
||||
style: const TextStyle(color: Colors.grey),
|
||||
),
|
||||
const SizedBox(height: 24),
|
||||
ElevatedButton.icon(
|
||||
onPressed: () => context.go(RouteNames.home),
|
||||
icon: const Icon(Icons.home),
|
||||
label: const Text('Về trang chủ'),
|
||||
),
|
||||
],
|
||||
),
|
||||
),
|
||||
),
|
||||
),
|
||||
|
||||
// Redirect logic for authentication (TODO: implement when auth is ready)
|
||||
// redirect: (context, state) {
|
||||
// final isLoggedIn = false; // TODO: Get from auth provider
|
||||
// final isOnLoginPage = state.matchedLocation == RouteNames.login;
|
||||
//
|
||||
// if (!isLoggedIn && !isOnLoginPage) {
|
||||
// return RouteNames.login;
|
||||
// }
|
||||
//
|
||||
// if (isLoggedIn && isOnLoginPage) {
|
||||
// return RouteNames.home;
|
||||
// }
|
||||
//
|
||||
// return null;
|
||||
// },
|
||||
|
||||
// Debug logging (disable in production)
|
||||
debugLogDiagnostics: true,
|
||||
);
|
||||
}
|
||||
|
||||
/// Route Names
|
||||
///
|
||||
/// Centralized route name constants for type-safe navigation.
|
||||
/// Use these constants instead of hardcoded strings.
|
||||
///
|
||||
/// Example:
|
||||
/// ```dart
|
||||
/// context.go(RouteNames.home);
|
||||
/// context.push(RouteNames.products);
|
||||
/// ```
|
||||
class RouteNames {
|
||||
// Private constructor to prevent instantiation
|
||||
RouteNames._();
|
||||
|
||||
// Main Routes
|
||||
static const String home = '/';
|
||||
static const String products = '/products';
|
||||
static const String productDetail = '/products/:id';
|
||||
static const String cart = '/cart';
|
||||
static const String checkout = '/checkout';
|
||||
static const String orderSuccess = '/order-success';
|
||||
|
||||
// Loyalty Routes
|
||||
static const String loyalty = '/loyalty';
|
||||
static const String rewards = '/loyalty/rewards';
|
||||
static const String pointsHistory = '/loyalty/points-history';
|
||||
static const String myGifts = '/loyalty/gifts';
|
||||
static const String referral = '/loyalty/referral';
|
||||
|
||||
// Orders & Payments Routes
|
||||
static const String orders = '/orders';
|
||||
static const String orderDetail = '/orders/:id';
|
||||
static const String payments = '/payments';
|
||||
|
||||
// Projects & Quotes Routes
|
||||
static const String projects = '/projects';
|
||||
static const String projectDetail = '/projects/:id';
|
||||
static const String projectCreate = '/projects/create';
|
||||
static const String quotes = '/quotes';
|
||||
static const String quoteDetail = '/quotes/:id';
|
||||
static const String quoteCreate = '/quotes/create';
|
||||
|
||||
// Account Routes
|
||||
static const String account = '/account';
|
||||
static const String profile = '/account/profile';
|
||||
static const String addresses = '/account/addresses';
|
||||
static const String addressForm = '/account/addresses/form';
|
||||
static const String changePassword = '/account/change-password';
|
||||
static const String settings = '/account/settings';
|
||||
|
||||
// Promotions & Notifications Routes
|
||||
static const String promotions = '/promotions';
|
||||
static const String promotionDetail = '/promotions/:id';
|
||||
static const String notifications = '/notifications';
|
||||
|
||||
// Chat Route
|
||||
static const String chat = '/chat';
|
||||
|
||||
// Authentication Routes (TODO: implement when auth feature is ready)
|
||||
static const String login = '/login';
|
||||
static const String otpVerification = '/otp-verification';
|
||||
static const String register = '/register';
|
||||
}
|
||||
|
||||
/// Route Extensions
|
||||
///
|
||||
/// Helper extensions for common navigation patterns.
|
||||
extension GoRouterExtension on BuildContext {
|
||||
/// Navigate to home page
|
||||
void goHome() => go(RouteNames.home);
|
||||
|
||||
/// Navigate to products page
|
||||
void goProducts() => go(RouteNames.products);
|
||||
|
||||
/// Navigate to cart page
|
||||
void goCart() => go(RouteNames.cart);
|
||||
|
||||
/// Navigate to loyalty page
|
||||
void goLoyalty() => go(RouteNames.loyalty);
|
||||
|
||||
/// Navigate to orders page
|
||||
void goOrders() => go(RouteNames.orders);
|
||||
|
||||
/// Navigate to projects page
|
||||
void goProjects() => go(RouteNames.projects);
|
||||
|
||||
/// Navigate to account page
|
||||
void goAccount() => go(RouteNames.account);
|
||||
|
||||
/// Navigate to promotions page
|
||||
void goPromotions() => go(RouteNames.promotions);
|
||||
|
||||
/// Navigate to notifications page
|
||||
void goNotifications() => go(RouteNames.notifications);
|
||||
|
||||
/// Navigate to chat page
|
||||
void goChat() => go(RouteNames.chat);
|
||||
}
|
||||
Reference in New Issue
Block a user