From c95a9c7817b0c02f86d347816e81dd55b700f2f2 Mon Sep 17 00:00:00 2001 From: Mohammad Salameh Date: Wed, 21 Feb 2024 16:39:16 +0300 Subject: [PATCH] initialized menu page --- lib/features/app_layout/bloc/nav_cubit.dart | 4 +- lib/features/menu/bloc/menu_cubit.dart | 90 ++++++++++++++++++- lib/features/menu/bloc/menu_state.dart | 1 - lib/features/menu/model/list_item_model.dart | 9 ++ lib/features/menu/model/menu_list_model.dart | 11 +++ lib/features/menu/view/menu_view.dart | 20 ++++- lib/features/menu/view/widgets/menu_list.dart | 43 +++++++++ .../menu/view/widgets/menu_list_divider.dart | 17 ++++ .../menu/view/widgets/menu_list_item.dart | 43 +++++++++ 9 files changed, 231 insertions(+), 7 deletions(-) create mode 100644 lib/features/menu/model/list_item_model.dart create mode 100644 lib/features/menu/model/menu_list_model.dart create mode 100644 lib/features/menu/view/widgets/menu_list.dart create mode 100644 lib/features/menu/view/widgets/menu_list_divider.dart create mode 100644 lib/features/menu/view/widgets/menu_list_item.dart diff --git a/lib/features/app_layout/bloc/nav_cubit.dart b/lib/features/app_layout/bloc/nav_cubit.dart index 79ac46e..0fe89a4 100644 --- a/lib/features/app_layout/bloc/nav_cubit.dart +++ b/lib/features/app_layout/bloc/nav_cubit.dart @@ -4,7 +4,7 @@ import 'package:flutter_svg/flutter_svg.dart'; import 'package:syncrow_app/features/dashboard/view/dashboard_view.dart'; import 'package:syncrow_app/features/devices/view/widgets/devices_view_body.dart'; import 'package:syncrow_app/features/layout/view/layout_view.dart'; -import 'package:syncrow_app/features/profile/view/profile_view.dart'; +import 'package:syncrow_app/features/menu/view/menu_view.dart'; import 'package:syncrow_app/features/scene/view/scene_view.dart'; import 'package:syncrow_app/utils/resource_manager/assets_manager.dart'; import 'package:syncrow_app/utils/resource_manager/color_manager.dart'; @@ -39,7 +39,7 @@ class NavCubit extends Cubit { const LayoutPage(), const DevicesViewBody(), const SceneView(), - const ProfileView(), + const MenuView(), ]; Widget get currentPage => NavCubit().pages[pageIndex]; diff --git a/lib/features/menu/bloc/menu_cubit.dart b/lib/features/menu/bloc/menu_cubit.dart index 45b937b..56a8714 100644 --- a/lib/features/menu/bloc/menu_cubit.dart +++ b/lib/features/menu/bloc/menu_cubit.dart @@ -1,8 +1,94 @@ -import 'package:bloc/bloc.dart'; -import 'package:meta/meta.dart'; +import 'package:flutter_bloc/flutter_bloc.dart'; + +import '../model/list_item_model.dart'; +import '../model/menu_list_model.dart'; part 'menu_state.dart'; class MenuCubit extends Cubit { MenuCubit() : super(MenuInitial()); + + static MenuCubit of(context) => BlocProvider.of(context); + + List menuLists = [ + MenuListModel( + label: 'Home Management', + listItems: [ + ListItemModel( + label: 'Create a Home', + ), + ListItemModel( + label: 'Join a Home', + ), + ListItemModel( + label: 'Manage Your Home', + ), + ], + ), + MenuListModel( + label: 'General Settings', + listItems: [ + ListItemModel( + label: 'Voice Assistant', + ), + ListItemModel( + label: 'Temperature unit', + ), + ListItemModel( + label: 'Touch tone on panel', + ), + ListItemModel( + label: 'Language', + ), + ListItemModel( + label: 'Network diagnosis', + ), + ListItemModel( + label: 'Clear cache', + ), + ], + ), + MenuListModel( + label: 'Messages Center', + listItems: [ + ListItemModel( + label: 'Alerts', + ), + ListItemModel( + label: 'Messages', + ), + ListItemModel( + label: 'FAQs', + ), + ListItemModel( + label: 'Help & Feedback', + ), + ], + ), + MenuListModel( + label: 'Security and Privacy', + listItems: [ + ListItemModel( + label: 'Security', + ), + ListItemModel( + label: 'privacy', + ), + ], + ), + MenuListModel( + label: 'Legal Information', + listItems: [ + ListItemModel( + label: 'About', + ), + ListItemModel( + label: 'Privacy Policy', + ), + ListItemModel( + label: 'User Agreement', + ), + ], + ), + ]; } diff --git a/lib/features/menu/bloc/menu_state.dart b/lib/features/menu/bloc/menu_state.dart index b1b5cd9..b59b70d 100644 --- a/lib/features/menu/bloc/menu_state.dart +++ b/lib/features/menu/bloc/menu_state.dart @@ -1,6 +1,5 @@ part of 'menu_cubit.dart'; -@immutable abstract class MenuState {} class MenuInitial extends MenuState {} diff --git a/lib/features/menu/model/list_item_model.dart b/lib/features/menu/model/list_item_model.dart new file mode 100644 index 0000000..70a812a --- /dev/null +++ b/lib/features/menu/model/list_item_model.dart @@ -0,0 +1,9 @@ +class ListItemModel { + final String? icon; + final String? label; + + ListItemModel({ + this.icon, + this.label, + }); +} diff --git a/lib/features/menu/model/menu_list_model.dart b/lib/features/menu/model/menu_list_model.dart new file mode 100644 index 0000000..64aaa14 --- /dev/null +++ b/lib/features/menu/model/menu_list_model.dart @@ -0,0 +1,11 @@ +import 'list_item_model.dart'; + +class MenuListModel { + final String? label; + final List? listItems; + + MenuListModel({ + this.label, + this.listItems, + }); +} diff --git a/lib/features/menu/view/menu_view.dart b/lib/features/menu/view/menu_view.dart index e650c6e..fe57bf7 100644 --- a/lib/features/menu/view/menu_view.dart +++ b/lib/features/menu/view/menu_view.dart @@ -1,12 +1,28 @@ import 'package:flutter/material.dart'; +import 'package:flutter_bloc/flutter_bloc.dart'; +import 'package:syncrow_app/features/menu/bloc/menu_cubit.dart'; +import 'package:syncrow_app/features/menu/view/widgets/menu_list.dart'; class MenuView extends StatelessWidget { const MenuView({super.key}); @override Widget build(BuildContext context) { - return const Center( - child: Text('Menu View'), + return BlocProvider( + create: (BuildContext context) => MenuCubit(), + child: BlocBuilder( + builder: (context, state) { + return SingleChildScrollView( + physics: const BouncingScrollPhysics(), + child: Column( + children: MenuCubit.of(context) + .menuLists + .map((list) => MenuList(listModel: list)) + .toList(), + ), + ); + }, + ), ); } } diff --git a/lib/features/menu/view/widgets/menu_list.dart b/lib/features/menu/view/widgets/menu_list.dart new file mode 100644 index 0000000..6e4758b --- /dev/null +++ b/lib/features/menu/view/widgets/menu_list.dart @@ -0,0 +1,43 @@ +import 'package:flutter/material.dart'; +import 'package:gap/gap.dart'; +import 'package:syncrow_app/features/menu/model/menu_list_model.dart'; +import 'package:syncrow_app/features/menu/view/widgets/menu_list_divider.dart'; +import 'package:syncrow_app/features/menu/view/widgets/menu_list_item.dart'; +import 'package:syncrow_app/features/shared_widgets/default_container.dart'; +import 'package:syncrow_app/features/shared_widgets/text_widgets/body_small.dart'; + +class MenuList extends StatelessWidget { + const MenuList({ + super.key, + required this.listModel, + }); + + final MenuListModel listModel; + + @override + Widget build(BuildContext context) { + return Column( + crossAxisAlignment: CrossAxisAlignment.stretch, + children: [ + BodySmall( + text: listModel.label!, + ), + const Gap(5), + DefaultContainer( + child: ListView.separated( + shrinkWrap: true, + padding: const EdgeInsets.all(0), + physics: const NeverScrollableScrollPhysics(), + itemCount: listModel.listItems!.length, + itemBuilder: (context, index) { + return MenuListItem( + listItem: listModel.listItems![index]!, + ); + }, + separatorBuilder: (context, index) => const MenuListDivider()), + ), + const Gap(5), + ], + ); + } +} diff --git a/lib/features/menu/view/widgets/menu_list_divider.dart b/lib/features/menu/view/widgets/menu_list_divider.dart new file mode 100644 index 0000000..6de4e6a --- /dev/null +++ b/lib/features/menu/view/widgets/menu_list_divider.dart @@ -0,0 +1,17 @@ +import 'package:flutter/material.dart'; + +class MenuListDivider extends StatelessWidget { + const MenuListDivider({ + super.key, + }); + + @override + Widget build(BuildContext context) { + return Divider( + color: Colors.grey.withOpacity(0.5), + thickness: 1, + indent: 43, + endIndent: 10, + ); + } +} diff --git a/lib/features/menu/view/widgets/menu_list_item.dart b/lib/features/menu/view/widgets/menu_list_item.dart new file mode 100644 index 0000000..9facec9 --- /dev/null +++ b/lib/features/menu/view/widgets/menu_list_item.dart @@ -0,0 +1,43 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_svg/flutter_svg.dart'; +import 'package:syncrow_app/features/menu/model/list_item_model.dart'; +import 'package:syncrow_app/features/shared_widgets/text_widgets/body_medium.dart'; +import 'package:syncrow_app/utils/resource_manager/color_manager.dart'; + +class MenuListItem extends StatelessWidget { + const MenuListItem({ + super.key, + required this.listItem, + }); + + final ListItemModel listItem; + + @override + Widget build(BuildContext context) { + return Column( + children: [ + Row( + children: [ + Container( + margin: const EdgeInsets.only(right: 10), + height: 33, + width: 33, + decoration: BoxDecoration( + color: ColorsManager.primaryColor, + borderRadius: BorderRadius.circular(15), + ), + child: listItem.icon != null + ? SvgPicture.asset( + listItem.icon!, + ) + : null, + ), + BodyMedium( + text: listItem.label!, + ) + ], + ), + ], + ); + } +}