QueenFruits/Mobile Commerce/lib/core/router/app_route.dart

422 lines
15 KiB
Dart

import 'package:flutter/material.dart';
import 'package:go_router/go_router.dart';
import 'package:latlong2/latlong.dart';
import 'package:niogu_ecommerce_v1/core/enums/action_type.dart';
import 'package:niogu_ecommerce_v1/core/widgets/custom_action_screen.dart';
import 'package:niogu_ecommerce_v1/features/account/presentation/screens/account_screen.dart';
import 'package:niogu_ecommerce_v1/features/account/presentation/screens/change_password_screen.dart';
import 'package:niogu_ecommerce_v1/features/account/presentation/screens/map_address_screen.dart';
import 'package:niogu_ecommerce_v1/features/account/presentation/screens/address_screen.dart';
import 'package:niogu_ecommerce_v1/features/account/presentation/screens/save_address_screen.dart';
import 'package:niogu_ecommerce_v1/features/auth/presentation/screens/login_screen.dart';
import 'package:niogu_ecommerce_v1/features/auth/presentation/screens/register_screen.dart';
import 'package:niogu_ecommerce_v1/features/cart/presentation/screens/cart_screen.dart';
import 'package:niogu_ecommerce_v1/features/checkout/presentation/screens/checkout_screen.dart';
import 'package:niogu_ecommerce_v1/features/checkout/presentation/screens/shipping_address_screen.dart';
import 'package:niogu_ecommerce_v1/features/favorite/presentation/screens/favorite_screen.dart';
import 'package:niogu_ecommerce_v1/features/home/domain/entities/home.dart';
import 'package:niogu_ecommerce_v1/features/home/presentation/screens/home_screen.dart';
import 'package:niogu_ecommerce_v1/features/home/presentation/screens/outlet_map_screen.dart';
import 'package:niogu_ecommerce_v1/features/home/presentation/screens/product_category_screen.dart';
import 'package:niogu_ecommerce_v1/features/home/presentation/screens/search_screen.dart';
import 'package:niogu_ecommerce_v1/features/order/domain/entities/order.dart';
import 'package:niogu_ecommerce_v1/features/order/presentation/screens/order_detail_screen.dart';
import 'package:niogu_ecommerce_v1/features/order/presentation/screens/order_screen.dart';
import 'package:niogu_ecommerce_v1/features/order/presentation/screens/rating_screen.dart';
import 'package:niogu_ecommerce_v1/features/product/domain/entities/product.dart';
import 'package:niogu_ecommerce_v1/features/product/presentation/screens/product_detail_screen.dart';
import 'package:niogu_ecommerce_v1/features/splash/presentation/screens/splash_screen.dart';
import 'package:niogu_ecommerce_v1/main_wrapper.dart';
final _rootNavigatorKey = GlobalKey<NavigatorState>();
class AppRoute {
static final String splashScreen = 'splash';
static final String loginScreen = 'login';
static final String registerScreen = 'register';
static final String homeScreen = 'home';
static final String favoriteScreen = 'favorite';
static final String cartScreen = 'cart';
static final String orderScreen = 'order';
static final String accountScreen = 'account';
static final String searchScreen = 'search';
static final String outletMapScreen = 'outletMap';
static final String productCategoryScreen = 'productCategory';
static final String productDetailScreen = 'productDetail';
static final String checkoutScreen = 'checkout';
static final String shippingAddressScreen = 'shippingAddress';
static final String ratingScreen = 'rating';
static final String orderDetailScreen = 'orderDetail';
static final String customActionScreen = 'customAction';
static final String changePasswordScreen = 'changePassword';
static final String addressScreen = 'addresses';
static final String mapAddressScreen = 'mapAddressScreen';
static final String saveAddressScreen = 'saveAddressScreen';
static final router = GoRouter(
navigatorKey: _rootNavigatorKey,
initialLocation: '/splash',
routes: [
GoRoute(
name: splashScreen,
path: '/splash',
builder: (context, state) => const SplashScreen(),
),
GoRoute(
name: loginScreen,
path: '/login',
builder: (context, state) => const LoginScreen(),
),
GoRoute(
name: registerScreen,
path: '/register',
builder: (context, state) => const RegisterScreen(),
),
StatefulShellRoute.indexedStack(
builder: (context, state, navigationShell) {
return MainWrapper(navigationShell: navigationShell);
},
branches: [
StatefulShellBranch(
routes: [
GoRoute(
name: homeScreen,
path: '/home',
builder: (context, state) => const HomeScreen(),
),
],
),
StatefulShellBranch(
routes: [
GoRoute(
name: favoriteScreen,
path: '/favorites',
builder: (context, state) => const FavoriteScreen(),
),
],
),
StatefulShellBranch(
routes: [
GoRoute(
name: cartScreen,
path: '/carts',
builder: (context, state) => const CartScreen(),
),
],
),
StatefulShellBranch(
routes: [
GoRoute(
name: orderScreen,
path: '/orders',
builder: (context, state) => const OrderScreen(),
),
],
),
StatefulShellBranch(
routes: [
GoRoute(
name: accountScreen,
path: '/account',
builder: (context, state) => const AccountScreen(),
),
],
),
],
),
GoRoute(
parentNavigatorKey: _rootNavigatorKey,
name: productDetailScreen,
path: '/product-info',
pageBuilder: (context, state) {
final productDetail = state.extra as ProductDetail;
return CustomTransitionPage(
key: state.pageKey,
child: ProductDetailScreen(productDetail: productDetail),
transitionsBuilder:
(context, animation, secondaryAnimation, child) =>
FadeTransition(
opacity: CurveTween(
curve: Curves.easeIn,
).animate(animation),
child: child,
),
);
},
),
GoRoute(
parentNavigatorKey: _rootNavigatorKey,
name: searchScreen,
path: '/search',
pageBuilder: (context, state) {
final categories = state.extra as List<CategoryItem>;
return CustomTransitionPage(
key: state.pageKey,
child: SearchScreen(categories: categories),
transitionsBuilder:
(context, animation, secondaryAnimation, child) =>
FadeTransition(
opacity: CurveTween(
curve: Curves.easeIn,
).animate(animation),
child: child,
),
);
},
),
GoRoute(
parentNavigatorKey: _rootNavigatorKey,
name: outletMapScreen,
path: '/outlet-map',
pageBuilder: (context, state) {
final data = state.extra as Map<String, dynamic>;
final userLocation = data['user_location'] as LatLng;
final outlets = data['outlets'] as List<OtherOutlet>;
return CustomTransitionPage(
key: state.pageKey,
child: OutletMapScreen(
userLocation: userLocation,
outlets: outlets,
),
transitionsBuilder:
(context, animation, secondaryAnimation, child) =>
FadeTransition(
opacity: CurveTween(
curve: Curves.easeIn,
).animate(animation),
child: child,
),
);
},
),
GoRoute(
parentNavigatorKey: _rootNavigatorKey,
name: productCategoryScreen,
path: '/product-categories',
pageBuilder: (context, state) {
final category = state.extra as CategoryItem;
return CustomTransitionPage(
key: state.pageKey,
child: ProductCategoryScreen(category: category),
transitionsBuilder:
(context, animation, secondaryAnimation, child) =>
FadeTransition(
opacity: CurveTween(
curve: Curves.easeIn,
).animate(animation),
child: child,
),
);
},
),
GoRoute(
parentNavigatorKey: _rootNavigatorKey,
name: checkoutScreen,
path: '/checkout',
pageBuilder: (context, state) {
return CustomTransitionPage(
key: state.pageKey,
child: const CheckoutScreen(),
transitionsBuilder:
(context, animation, secondaryAnimation, child) =>
FadeTransition(
opacity: CurveTween(
curve: Curves.easeIn,
).animate(animation),
child: child,
),
);
},
),
GoRoute(
parentNavigatorKey: _rootNavigatorKey,
name: shippingAddressScreen,
path: '/shipping-address',
pageBuilder: (context, state) {
return CustomTransitionPage(
key: state.pageKey,
child: const ShippingAddressScreen(),
transitionsBuilder:
(context, animation, secondaryAnimation, child) =>
FadeTransition(
opacity: CurveTween(
curve: Curves.easeIn,
).animate(animation),
child: child,
),
);
},
),
GoRoute(
parentNavigatorKey: _rootNavigatorKey,
name: ratingScreen,
path: '/rating/:id',
pageBuilder: (context, state) {
final orderId = state.pathParameters['id'];
final products = state.extra as List<ProductReviewItem>;
return CustomTransitionPage(
key: state.pageKey,
child: RatingScreen(orderId: orderId!, products: products),
transitionsBuilder:
(context, animation, secondaryAnimation, child) =>
FadeTransition(
opacity: CurveTween(
curve: Curves.easeIn,
).animate(animation),
child: child,
),
);
},
),
GoRoute(
parentNavigatorKey: _rootNavigatorKey,
name: orderDetailScreen,
path: '/order-detail',
pageBuilder: (context, state) {
final orderInfo = state.extra as OrderInfo;
return CustomTransitionPage(
key: state.pageKey,
child: OrderDetailScreen(orderInfo: orderInfo),
transitionsBuilder:
(context, animation, secondaryAnimation, child) =>
FadeTransition(
opacity: CurveTween(
curve: Curves.easeIn,
).animate(animation),
child: child,
),
);
},
),
GoRoute(
parentNavigatorKey: _rootNavigatorKey,
name: customActionScreen,
path: '/custom-action',
pageBuilder: (context, state) {
final data = state.extra as Map<String, dynamic>;
final orderId = data['order_id'] as String?;
final orderNumber = data['order_number'] as String;
final type = data['type'] as ActionType;
return CustomTransitionPage(
key: state.pageKey,
child: CustomActionScreen(
orderId: orderId ?? '',
orderNumber: orderNumber,
type: type,
),
transitionsBuilder:
(context, animation, secondaryAnimation, child) =>
FadeTransition(
opacity: CurveTween(
curve: Curves.easeIn,
).animate(animation),
child: child,
),
);
},
),
GoRoute(
parentNavigatorKey: _rootNavigatorKey,
name: changePasswordScreen,
path: '/change-password',
pageBuilder: (context, state) {
return CustomTransitionPage(
key: state.pageKey,
child: const ChangePasswordScreen(),
transitionsBuilder:
(context, animation, secondaryAnimation, child) =>
FadeTransition(
opacity: CurveTween(
curve: Curves.easeIn,
).animate(animation),
child: child,
),
);
},
),
GoRoute(
parentNavigatorKey: _rootNavigatorKey,
name: addressScreen,
path: '/addresses',
pageBuilder: (context, state) {
return CustomTransitionPage(
key: state.pageKey,
child: const AddressScreen(),
transitionsBuilder:
(context, animation, secondaryAnimation, child) =>
FadeTransition(
opacity: CurveTween(
curve: Curves.easeIn,
).animate(animation),
child: child,
),
);
},
),
GoRoute(
parentNavigatorKey: _rootNavigatorKey,
name: mapAddressScreen,
path: '/map-address',
pageBuilder: (context, state) {
return CustomTransitionPage(
key: state.pageKey,
child: const MapAddressScreen(),
transitionsBuilder:
(context, animation, secondaryAnimation, child) =>
FadeTransition(
opacity: CurveTween(
curve: Curves.easeIn,
).animate(animation),
child: child,
),
);
},
),
GoRoute(
parentNavigatorKey: _rootNavigatorKey,
name: saveAddressScreen,
path: '/save-address',
pageBuilder: (context, state) {
final label = state.extra as String?;
return CustomTransitionPage(
key: state.pageKey,
child: SaveAddressScreen(label: label),
transitionsBuilder:
(context, animation, secondaryAnimation, child) =>
FadeTransition(
opacity: CurveTween(
curve: Curves.easeIn,
).animate(animation),
child: child,
),
);
},
),
],
);
}