import 'package:flutter/material.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:google_fonts/google_fonts.dart'; import '../../core/routing/routes.dart'; import 'package:go_router/go_router.dart'; import '../providers/manager_provider.dart'; import '../providers/userRoleProvider.dart'; import 'drawerContentWrapper.dart'; class DrawerMenu extends ConsumerStatefulWidget { const DrawerMenu({super.key}); @override ConsumerState createState() => DrawerMenuState(); } class DrawerMenuState extends ConsumerState { OverlayEntry? _overlayEntry; void _showPopup( BuildContext context, Offset offset, Size size, String key, dynamic roleId, ) { _hidePopup(); // clear old one before creating new _overlayEntry = OverlayEntry( builder: (context) { return Positioned( left: offset.dx + size.width - 5, // little spacing top: offset.dy + (size.height / 2) - 20, // left: offset.dx + size.width, // top: offset.dy, child: MouseRegion( onExit: (_) => _hidePopup(), child: Material( elevation: 4, borderRadius: BorderRadius.circular(16), child: Container( padding: const EdgeInsets.all(10), decoration: BoxDecoration( borderRadius: BorderRadius.circular(6), color: const Color(0xFFDDF5F1), // color: Colors.white, ), child: Column( crossAxisAlignment: CrossAxisAlignment.start, // mainAxisSize: MainAxisSize.min, children: [ if (key == 'User') ...[ _buildPopupItem( label: "Agent", onTap: () => context.go(AppRoutes.agentLst), ), const SizedBox(height: 5), _buildPopupItem( label: "Staff", onTap: () => context.go(AppRoutes.staffLst), ), ], if (key == 'Reports') ...[ if (roleId == 'manager' || roleId == 'Accounts' || roleId == 'agent') ...[ _buildPopupItem( label: "Payout List", onTap: () => context.go( roleId == 'agent' ? AppRoutes.gridView : AppRoutes.gridList, ), ), const SizedBox(height: 5), ], _buildPopupItem( label: "Claims", onTap: () => context.go(AppRoutes.claimlist), ), const SizedBox(height: 5), _buildPopupItem( label: "Endorsement", onTap: () => context.go(AppRoutes.Endorsement), ), const SizedBox(height: 5), _buildPopupItem( label: "Policy", onTap: () => context.go(AppRoutes.policylist), ), ], // if (key == 'User') ...[ // Row( // children: [ // GestureDetector( // onTap: () { // print("Tappped Agent"); // context.go(AppRoutes.agentLst); // }, // child: Text("Agent", style: _cardTextStyle), // ), // // Icon( // Icons.arrow_forward_ios_rounded, // size: 12, // color: Colors.black, // ), // ], // ), // const SizedBox(height: 5), // Row( // children: [ // GestureDetector( // onTap: () { // print("Bf clicked"); // context.go(AppRoutes.staffLst); // }, // child: Text("Staff", style: _cardTextStyle), // ), // // Icon( // Icons.arrow_forward_ios_rounded, // size: 12, // color: Colors.black, // ), // ], // ), // ], // // if (key == 'Reports') ...[ // GestureDetector( // onTap: () { // context.go(AppRoutes.claimlist); // }, // child: Row( // children: [ // Text("Claims", style: _cardTextStyle), // Icon( // Icons.arrow_forward_ios_rounded, // size: 12, // color: Colors.black, // ), // ], // ), // ), // // const SizedBox(height: 5), // // GestureDetector( // // onTap: () { // // context.go(AppRoutes.enquiryLst); // // }, // // child: const Text( // // "Enquiries", // // style: TextStyle( // // fontSize: 16, // // fontWeight: FontWeight.w400, // // ), // // ), // // ), // const SizedBox(height: 5), // GestureDetector( // onTap: () { // context.go(AppRoutes.endosement); // }, // child: Row( // children: [ // Text("Endorsement", style: _cardTextStyle), // // Icon( // Icons.arrow_forward_ios_rounded, // size: 12, // color: Colors.black, // ), // ], // ), // ), // const SizedBox(height: 5), // GestureDetector( // onTap: () { // context.go(AppRoutes.policylist); // }, // child: Row( // children: [ // Text("Policy", style: _cardTextStyle), // // Icon( // Icons.arrow_forward_ios_rounded, // size: 12, // color: Colors.black, // ), // ], // ), // ), // ], ], ), ), ), ), ); }, ); final overlay = Overlay.of(context, rootOverlay: true); overlay?.insert(_overlayEntry!); } void _hidePopup() { print('Hide'); _overlayEntry?.remove(); _overlayEntry = null; } @override Widget build(BuildContext context) { final roleId = ref.watch(userRoleProvider); print('RoleId - $roleId'); return Container( color: Color(0xFF425B5B), padding: EdgeInsets.all(13.0), child: ListView( padding: EdgeInsets.zero, children: [ SizedBox(height: 30), GestureDetector( onTap: () { context.go(AppRoutes.dashboard); }, child: DrawerContentWrapper( child: Image.asset( "assets/drawer/drawerImg1.png", height: 25, width: 25, ), ), ), DrawerLabel("Dashboard"), DrawerContentWrapper( child: Consumer( builder: (context, ref, _) { return IconButton( onPressed: () { print('roleI - $roleId'); if (roleId == 'agent') { context.go(AppRoutes.enquiryLst); } else { context.go(AppRoutes.enquiryForStaff); } // ref.read(enquiryIdProvider.notifier).state = null; // context.go(AppRoutes.tabEnquiry); }, icon: const Icon( Icons.list_alt_rounded, size: 30, color: Colors.black, ), ); }, ), ), DrawerLabel("Enquiry"), if (roleId == 'manager') ...[ Builder( builder: (itemContext) { return MouseRegion( // onEnter: (_) => _showPopup(itemContext), onEnter: (_) { final renderBox = itemContext.findRenderObject() as RenderBox; final offset = renderBox.localToGlobal(Offset.zero); final size = renderBox.size; final key = 'User'; _showPopup(context, offset, size, key, roleId); }, child: DrawerContentWrapper( child: Icon(Icons.person_add_alt, size: 30), ), ); }, ), DrawerLabel("User"), ], if (roleId != 'staff') ...[ Builder( builder: (itemContext) { return MouseRegion( // onEnter: (_) => _showPopup(itemContext), onEnter: (_) { final renderBox = itemContext.findRenderObject() as RenderBox; final offset = renderBox.localToGlobal(Offset.zero); final size = renderBox.size; final key = "Reports"; _showPopup(context, offset, size, key, roleId); }, child: DrawerContentWrapper( child: Image.asset( "assets/drawer/drawerImg2.png", height: 25, width: 25, ), ), ); }, ), DrawerLabel("Reports"), ], ], ), ); } } Widget _buildPopupItem({required String label, required VoidCallback onTap}) { return _HoverableContainer( label: label, onTap: onTap, normalColor: Color(0xFFDDF5F1), hoverColor: Colors.white, // change to your desired hover color ); } class DrawerLabel extends StatelessWidget { final String text; const DrawerLabel(this.text, {super.key}); @override Widget build(BuildContext context) { return Row( mainAxisAlignment: MainAxisAlignment.center, children: [ Text( text, style: GoogleFonts.inter(color: Colors.white, fontSize: 11.5), ), SizedBox(height: 20), ], ); } } class _HoverableContainer extends StatefulWidget { final String label; final VoidCallback onTap; final Color normalColor; final Color hoverColor; const _HoverableContainer({ super.key, required this.label, required this.onTap, required this.normalColor, required this.hoverColor, }); @override _HoverableContainerState createState() => _HoverableContainerState(); } class _HoverableContainerState extends State<_HoverableContainer> { bool _isHovered = false; @override Widget build(BuildContext context) { return MouseRegion( onEnter: (_) => setState(() => _isHovered = true), onExit: (_) => setState(() => _isHovered = false), child: GestureDetector( onTap: widget.onTap, child: Container( decoration: BoxDecoration( color: _isHovered ? widget.hoverColor : widget.normalColor, borderRadius: BorderRadius.circular(6), ), padding: const EdgeInsets.symmetric(horizontal: 8, vertical: 4), child: Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ Container( width: 110, child: Text(widget.label, style: _cardTextStyle), ), const Icon( Icons.arrow_forward_ios_rounded, size: 12, color: Colors.black, ), ], ), ), ), ); } } TextStyle _cardTextStyle = GoogleFonts.inter( fontSize: 14, fontWeight: FontWeight.w500, );