From 8312429be373ca497fdc2065f6453665cd29e82c Mon Sep 17 00:00:00 2001 From: efrilm Date: Wed, 27 Aug 2025 18:51:14 +0700 Subject: [PATCH] feat: main page --- lib/common/theme/theme.dart | 7 + lib/presentation/pages/auth/pin/pin_page.dart | 3 + lib/presentation/pages/main/main_page.dart | 24 +++ .../pages/main/pages/home/home_page.dart | 12 ++ .../pages/main/pages/order/order_page.dart | 12 ++ .../main/pages/profile/profile_page.dart | 12 ++ .../main/pages/voucher/voucher_page.dart | 12 ++ .../pages/main/widgets/bottom_navbar.dart | 39 ++++ lib/presentation/router/app_router.dart | 11 ++ lib/presentation/router/app_router.gr.dart | 171 +++++++++++++----- 10 files changed, 262 insertions(+), 41 deletions(-) create mode 100644 lib/presentation/pages/main/main_page.dart create mode 100644 lib/presentation/pages/main/pages/home/home_page.dart create mode 100644 lib/presentation/pages/main/pages/order/order_page.dart create mode 100644 lib/presentation/pages/main/pages/profile/profile_page.dart create mode 100644 lib/presentation/pages/main/pages/voucher/voucher_page.dart create mode 100644 lib/presentation/pages/main/widgets/bottom_navbar.dart diff --git a/lib/common/theme/theme.dart b/lib/common/theme/theme.dart index 17b4352..3504646 100644 --- a/lib/common/theme/theme.dart +++ b/lib/common/theme/theme.dart @@ -53,5 +53,12 @@ class ThemeApp { ), contentPadding: const EdgeInsets.symmetric(vertical: 12), ), + bottomNavigationBarTheme: BottomNavigationBarThemeData( + type: BottomNavigationBarType.fixed, + selectedItemColor: AppColor.primary, + unselectedItemColor: AppColor.textSecondary, + backgroundColor: AppColor.white, + elevation: 4, + ), ); } diff --git a/lib/presentation/pages/auth/pin/pin_page.dart b/lib/presentation/pages/auth/pin/pin_page.dart index 86aca6c..c759315 100644 --- a/lib/presentation/pages/auth/pin/pin_page.dart +++ b/lib/presentation/pages/auth/pin/pin_page.dart @@ -5,6 +5,7 @@ import 'package:flutter/services.dart'; import '../../../../common/theme/theme.dart'; import '../../../components/button/button.dart'; +import '../../../router/app_router.gr.dart'; @RoutePage() class PinPage extends StatefulWidget { @@ -92,6 +93,8 @@ class _PinPageState extends State { _verifyPin(currentPin); } } + + context.router.push(MainRoute()); } void _clearPinFields() { diff --git a/lib/presentation/pages/main/main_page.dart b/lib/presentation/pages/main/main_page.dart new file mode 100644 index 0000000..cb273d5 --- /dev/null +++ b/lib/presentation/pages/main/main_page.dart @@ -0,0 +1,24 @@ +import 'package:auto_route/auto_route.dart'; +import 'package:flutter/material.dart'; + +import '../../router/app_router.gr.dart'; +import 'widgets/bottom_navbar.dart'; + +@RoutePage() +class MainPage extends StatelessWidget { + const MainPage({super.key}); + + @override + Widget build(BuildContext context) { + return AutoTabsRouter.pageView( + routes: [HomeRoute(), VoucherRoute(), OrderRoute(), ProfileRoute()], + physics: const NeverScrollableScrollPhysics(), + builder: (context, child, pageController) => Scaffold( + body: child, + bottomNavigationBar: MainBottomNavbar( + tabsRouter: AutoTabsRouter.of(context), + ), + ), + ); + } +} diff --git a/lib/presentation/pages/main/pages/home/home_page.dart b/lib/presentation/pages/main/pages/home/home_page.dart new file mode 100644 index 0000000..01c68aa --- /dev/null +++ b/lib/presentation/pages/main/pages/home/home_page.dart @@ -0,0 +1,12 @@ +import 'package:auto_route/auto_route.dart'; +import 'package:flutter/material.dart'; + +@RoutePage() +class HomePage extends StatelessWidget { + const HomePage({super.key}); + + @override + Widget build(BuildContext context) { + return Center(child: Text('Home Page')); + } +} diff --git a/lib/presentation/pages/main/pages/order/order_page.dart b/lib/presentation/pages/main/pages/order/order_page.dart new file mode 100644 index 0000000..9dd5178 --- /dev/null +++ b/lib/presentation/pages/main/pages/order/order_page.dart @@ -0,0 +1,12 @@ +import 'package:auto_route/auto_route.dart'; +import 'package:flutter/material.dart'; + +@RoutePage() +class OrderPage extends StatelessWidget { + const OrderPage({super.key}); + + @override + Widget build(BuildContext context) { + return Center(child: Text('Order Page')); + } +} diff --git a/lib/presentation/pages/main/pages/profile/profile_page.dart b/lib/presentation/pages/main/pages/profile/profile_page.dart new file mode 100644 index 0000000..99429f7 --- /dev/null +++ b/lib/presentation/pages/main/pages/profile/profile_page.dart @@ -0,0 +1,12 @@ +import 'package:auto_route/auto_route.dart'; +import 'package:flutter/material.dart'; + +@RoutePage() +class ProfilePage extends StatelessWidget { + const ProfilePage({super.key}); + + @override + Widget build(BuildContext context) { + return Center(child: Text('Profile Page')); + } +} diff --git a/lib/presentation/pages/main/pages/voucher/voucher_page.dart b/lib/presentation/pages/main/pages/voucher/voucher_page.dart new file mode 100644 index 0000000..2f7f067 --- /dev/null +++ b/lib/presentation/pages/main/pages/voucher/voucher_page.dart @@ -0,0 +1,12 @@ +import 'package:auto_route/auto_route.dart'; +import 'package:flutter/material.dart'; + +@RoutePage() +class VoucherPage extends StatelessWidget { + const VoucherPage({super.key}); + + @override + Widget build(BuildContext context) { + return Center(child: Text('Voucher Page')); + } +} diff --git a/lib/presentation/pages/main/widgets/bottom_navbar.dart b/lib/presentation/pages/main/widgets/bottom_navbar.dart new file mode 100644 index 0000000..db1065c --- /dev/null +++ b/lib/presentation/pages/main/widgets/bottom_navbar.dart @@ -0,0 +1,39 @@ +import 'package:auto_route/auto_route.dart'; +import 'package:flutter/material.dart'; + +class MainBottomNavbar extends StatelessWidget { + final TabsRouter tabsRouter; + const MainBottomNavbar({super.key, required this.tabsRouter}); + + @override + Widget build(BuildContext context) { + return BottomNavigationBar( + currentIndex: tabsRouter.activeIndex, + onTap: (index) { + tabsRouter.setActiveIndex(index); + }, + items: const [ + BottomNavigationBarItem( + icon: Icon(Icons.home), + label: 'Home', + tooltip: 'Home', + ), + BottomNavigationBarItem( + icon: Icon(Icons.card_giftcard), + label: 'Voucher', + tooltip: 'Voucher', + ), + BottomNavigationBarItem( + icon: Icon(Icons.list), + label: 'Pesanan', + tooltip: 'Pesanan', + ), + BottomNavigationBarItem( + icon: Icon(Icons.person), + label: 'Profil', + tooltip: 'Profil', + ), + ], + ); + } +} diff --git a/lib/presentation/router/app_router.dart b/lib/presentation/router/app_router.dart index 041e67f..13370d8 100644 --- a/lib/presentation/router/app_router.dart +++ b/lib/presentation/router/app_router.dart @@ -16,5 +16,16 @@ class AppRouter extends RootStackRouter { AutoRoute(page: RegisterRoute.page), AutoRoute(page: OtpRoute.page), AutoRoute(page: PinRoute.page), + + // Main + AutoRoute( + page: MainRoute.page, + children: [ + AutoRoute(page: HomeRoute.page), + AutoRoute(page: VoucherRoute.page), + AutoRoute(page: OrderRoute.page), + AutoRoute(page: ProfileRoute.page), + ], + ), ]; } diff --git a/lib/presentation/router/app_router.gr.dart b/lib/presentation/router/app_router.gr.dart index b45b698..c669c8c 100644 --- a/lib/presentation/router/app_router.gr.dart +++ b/lib/presentation/router/app_router.gr.dart @@ -9,73 +9,130 @@ // coverage:ignore-file // ignore_for_file: no_leading_underscores_for_library_prefixes -import 'package:auto_route/auto_route.dart' as _i7; -import 'package:enaklo/presentation/pages/auth/login/login_page.dart' as _i1; -import 'package:enaklo/presentation/pages/auth/otp/otp_page.dart' as _i3; -import 'package:enaklo/presentation/pages/auth/pin/pin_page.dart' as _i4; +import 'package:auto_route/auto_route.dart' as _i12; +import 'package:enaklo/presentation/pages/auth/login/login_page.dart' as _i2; +import 'package:enaklo/presentation/pages/auth/otp/otp_page.dart' as _i6; +import 'package:enaklo/presentation/pages/auth/pin/pin_page.dart' as _i7; import 'package:enaklo/presentation/pages/auth/register/register_page.dart' + as _i9; +import 'package:enaklo/presentation/pages/main/main_page.dart' as _i3; +import 'package:enaklo/presentation/pages/main/pages/home/home_page.dart' + as _i1; +import 'package:enaklo/presentation/pages/main/pages/order/order_page.dart' as _i5; +import 'package:enaklo/presentation/pages/main/pages/profile/profile_page.dart' + as _i8; +import 'package:enaklo/presentation/pages/main/pages/voucher/voucher_page.dart' + as _i11; import 'package:enaklo/presentation/pages/onboarding/onboarding_page.dart' - as _i2; -import 'package:enaklo/presentation/pages/splash/splash_page.dart' as _i6; -import 'package:flutter/material.dart' as _i8; + as _i4; +import 'package:enaklo/presentation/pages/splash/splash_page.dart' as _i10; +import 'package:flutter/material.dart' as _i13; /// generated route for -/// [_i1.LoginPage] -class LoginRoute extends _i7.PageRouteInfo { - const LoginRoute({List<_i7.PageRouteInfo>? children}) +/// [_i1.HomePage] +class HomeRoute extends _i12.PageRouteInfo { + const HomeRoute({List<_i12.PageRouteInfo>? children}) + : super(HomeRoute.name, initialChildren: children); + + static const String name = 'HomeRoute'; + + static _i12.PageInfo page = _i12.PageInfo( + name, + builder: (data) { + return const _i1.HomePage(); + }, + ); +} + +/// generated route for +/// [_i2.LoginPage] +class LoginRoute extends _i12.PageRouteInfo { + const LoginRoute({List<_i12.PageRouteInfo>? children}) : super(LoginRoute.name, initialChildren: children); static const String name = 'LoginRoute'; - static _i7.PageInfo page = _i7.PageInfo( + static _i12.PageInfo page = _i12.PageInfo( name, builder: (data) { - return const _i1.LoginPage(); + return const _i2.LoginPage(); }, ); } /// generated route for -/// [_i2.OnboardingPage] -class OnboardingRoute extends _i7.PageRouteInfo { - const OnboardingRoute({List<_i7.PageRouteInfo>? children}) +/// [_i3.MainPage] +class MainRoute extends _i12.PageRouteInfo { + const MainRoute({List<_i12.PageRouteInfo>? children}) + : super(MainRoute.name, initialChildren: children); + + static const String name = 'MainRoute'; + + static _i12.PageInfo page = _i12.PageInfo( + name, + builder: (data) { + return const _i3.MainPage(); + }, + ); +} + +/// generated route for +/// [_i4.OnboardingPage] +class OnboardingRoute extends _i12.PageRouteInfo { + const OnboardingRoute({List<_i12.PageRouteInfo>? children}) : super(OnboardingRoute.name, initialChildren: children); static const String name = 'OnboardingRoute'; - static _i7.PageInfo page = _i7.PageInfo( + static _i12.PageInfo page = _i12.PageInfo( name, builder: (data) { - return const _i2.OnboardingPage(); + return const _i4.OnboardingPage(); }, ); } /// generated route for -/// [_i3.OtpPage] -class OtpRoute extends _i7.PageRouteInfo { - const OtpRoute({List<_i7.PageRouteInfo>? children}) +/// [_i5.OrderPage] +class OrderRoute extends _i12.PageRouteInfo { + const OrderRoute({List<_i12.PageRouteInfo>? children}) + : super(OrderRoute.name, initialChildren: children); + + static const String name = 'OrderRoute'; + + static _i12.PageInfo page = _i12.PageInfo( + name, + builder: (data) { + return const _i5.OrderPage(); + }, + ); +} + +/// generated route for +/// [_i6.OtpPage] +class OtpRoute extends _i12.PageRouteInfo { + const OtpRoute({List<_i12.PageRouteInfo>? children}) : super(OtpRoute.name, initialChildren: children); static const String name = 'OtpRoute'; - static _i7.PageInfo page = _i7.PageInfo( + static _i12.PageInfo page = _i12.PageInfo( name, builder: (data) { - return const _i3.OtpPage(); + return const _i6.OtpPage(); }, ); } /// generated route for -/// [_i4.PinPage] -class PinRoute extends _i7.PageRouteInfo { +/// [_i7.PinPage] +class PinRoute extends _i12.PageRouteInfo { PinRoute({ - _i8.Key? key, + _i13.Key? key, bool isCreatePin = true, String? title, - List<_i7.PageRouteInfo>? children, + List<_i12.PageRouteInfo>? children, }) : super( PinRoute.name, args: PinRouteArgs(key: key, isCreatePin: isCreatePin, title: title), @@ -84,13 +141,13 @@ class PinRoute extends _i7.PageRouteInfo { static const String name = 'PinRoute'; - static _i7.PageInfo page = _i7.PageInfo( + static _i12.PageInfo page = _i12.PageInfo( name, builder: (data) { final args = data.argsAs( orElse: () => const PinRouteArgs(), ); - return _i4.PinPage( + return _i7.PinPage( key: args.key, isCreatePin: args.isCreatePin, title: args.title, @@ -102,7 +159,7 @@ class PinRoute extends _i7.PageRouteInfo { class PinRouteArgs { const PinRouteArgs({this.key, this.isCreatePin = true, this.title}); - final _i8.Key? key; + final _i13.Key? key; final bool isCreatePin; @@ -115,33 +172,65 @@ class PinRouteArgs { } /// generated route for -/// [_i5.RegisterPage] -class RegisterRoute extends _i7.PageRouteInfo { - const RegisterRoute({List<_i7.PageRouteInfo>? children}) - : super(RegisterRoute.name, initialChildren: children); +/// [_i8.ProfilePage] +class ProfileRoute extends _i12.PageRouteInfo { + const ProfileRoute({List<_i12.PageRouteInfo>? children}) + : super(ProfileRoute.name, initialChildren: children); - static const String name = 'RegisterRoute'; + static const String name = 'ProfileRoute'; - static _i7.PageInfo page = _i7.PageInfo( + static _i12.PageInfo page = _i12.PageInfo( name, builder: (data) { - return const _i5.RegisterPage(); + return const _i8.ProfilePage(); }, ); } /// generated route for -/// [_i6.SplashPage] -class SplashRoute extends _i7.PageRouteInfo { - const SplashRoute({List<_i7.PageRouteInfo>? children}) +/// [_i9.RegisterPage] +class RegisterRoute extends _i12.PageRouteInfo { + const RegisterRoute({List<_i12.PageRouteInfo>? children}) + : super(RegisterRoute.name, initialChildren: children); + + static const String name = 'RegisterRoute'; + + static _i12.PageInfo page = _i12.PageInfo( + name, + builder: (data) { + return const _i9.RegisterPage(); + }, + ); +} + +/// generated route for +/// [_i10.SplashPage] +class SplashRoute extends _i12.PageRouteInfo { + const SplashRoute({List<_i12.PageRouteInfo>? children}) : super(SplashRoute.name, initialChildren: children); static const String name = 'SplashRoute'; - static _i7.PageInfo page = _i7.PageInfo( + static _i12.PageInfo page = _i12.PageInfo( name, builder: (data) { - return const _i6.SplashPage(); + return const _i10.SplashPage(); + }, + ); +} + +/// generated route for +/// [_i11.VoucherPage] +class VoucherRoute extends _i12.PageRouteInfo { + const VoucherRoute({List<_i12.PageRouteInfo>? children}) + : super(VoucherRoute.name, initialChildren: children); + + static const String name = 'VoucherRoute'; + + static _i12.PageInfo page = _i12.PageInfo( + name, + builder: (data) { + return const _i11.VoucherPage(); }, ); }