import 'dart:math' as math; import 'package:flutter/material.dart'; import 'package:get/get.dart'; import 'package:solian/models/account_status.dart'; import 'package:solian/providers/account_status.dart'; import 'package:solian/providers/auth.dart'; import 'package:solian/providers/relation.dart'; import 'package:solian/router.dart'; import 'package:solian/shells/root_shell.dart'; import 'package:solian/theme.dart'; import 'package:solian/widgets/account/account_avatar.dart'; import 'package:solian/widgets/account/account_status_action.dart'; import 'package:solian/widgets/navigation/app_navigation.dart'; import 'package:badges/badges.dart' as badges; import 'package:solian/widgets/navigation/app_navigation_regions.dart'; class AppNavigationDrawer extends StatefulWidget { final String? routeName; const AppNavigationDrawer({super.key, this.routeName}); @override State createState() => _AppNavigationDrawerState(); } class _AppNavigationDrawerState extends State { bool _isCollapsed = true; AccountStatus? _accountStatus; Future _getStatus() async { final StatusProvider provider = Get.find(); final resp = await provider.getCurrentStatus(); final status = AccountStatus.fromJson(resp.body); if (mounted) { setState(() { _accountStatus = status; }); } } Widget _buildUserInfo() { return Obx(() { final AuthProvider auth = Get.find(); if (auth.isAuthorized.isFalse || auth.userProfile.value == null) { if (_isCollapsed) { return InkWell( child: const Icon(Icons.account_circle).paddingAll(28), onTap: () { AppRouter.instance.goNamed('account'); _closeDrawer(); }, ); } return ListTile( contentPadding: const EdgeInsets.symmetric(horizontal: 28), leading: const Icon(Icons.account_circle), title: !_isCollapsed ? Text('guest'.tr) : null, subtitle: !_isCollapsed ? Text('unsignedIn'.tr) : null, onTap: () { AppRouter.instance.goNamed('account'); _closeDrawer(); }, ); } final leading = Obx(() { final statusBadgeColor = _accountStatus != null ? StatusProvider.determineStatus( _accountStatus!, ).$2 : Colors.grey; final RelationshipProvider relations = Get.find(); final accountNotifications = relations.friendRequestCount.value; return badges.Badge( badgeContent: Text( accountNotifications.toString(), style: const TextStyle(color: Colors.white), ), showBadge: accountNotifications > 0, position: badges.BadgePosition.topEnd( top: -10, end: -6, ), child: badges.Badge( showBadge: _accountStatus != null, badgeStyle: badges.BadgeStyle(badgeColor: statusBadgeColor), position: badges.BadgePosition.bottomEnd( bottom: 0, end: -2, ), child: AccountAvatar( content: auth.userProfile.value!['avatar'], ), ), ); }); return InkWell( child: !_isCollapsed ? ListTile( contentPadding: const EdgeInsets.only(left: 20, right: 20), title: Text( auth.userProfile.value!['nick'], maxLines: 1, overflow: TextOverflow.fade, ), subtitle: Builder( builder: (context) { if (_accountStatus == null) { return Text('loading'.tr); } final info = StatusProvider.determineStatus( _accountStatus!, ); return Text( info.$3, maxLines: 1, overflow: TextOverflow.fade, ); }, ), leading: leading, ) : leading.paddingAll(20), onTap: () { AppRouter.instance.goNamed('account'); _closeDrawer(); }, onLongPress: () { showModalBottomSheet( useRootNavigator: true, context: context, builder: (context) => AccountStatusAction( currentStatus: _accountStatus!.status, ), ).then((val) { if (val == true) _getStatus(); }); }, ); }); } void _closeDrawer() { rootScaffoldKey.currentState!.closeDrawer(); } @override void initState() { super.initState(); _getStatus(); } @override Widget build(BuildContext context) { return Drawer( width: _isCollapsed ? 80 : null, backgroundColor: SolianTheme.isLargeScreen(context) ? Colors.transparent : null, child: SafeArea( bottom: false, child: Column( children: [ _buildUserInfo().paddingSymmetric(vertical: 8), const Divider(thickness: 0.3, height: 1), Column( children: AppNavigation.destinations .map( (e) => _isCollapsed ? InkWell( child: Icon(e.icon, size: 22).paddingSymmetric( horizontal: 28, vertical: 16, ), onTap: () { AppRouter.instance.goNamed(e.page); _closeDrawer(); }, ) : ListTile( contentPadding: const EdgeInsets.symmetric( horizontal: 20, ), leading: Icon(e.icon, size: 20).paddingAll(2), title: !_isCollapsed ? Text(e.label) : null, enabled: true, onTap: () { AppRouter.instance.goNamed(e.page); _closeDrawer(); }, ), ) .toList(), ), const Divider(thickness: 0.3, height: 1), Expanded( child: AppNavigationRegions( isCollapsed: _isCollapsed, onSelected: (item) { _closeDrawer(); }, ), ), const Divider(thickness: 0.3, height: 1), Column( children: [ _isCollapsed ? InkWell( child: const Icon(Icons.settings, size: 22) .paddingSymmetric( horizontal: 28, vertical: 16, ), onTap: () { AppRouter.instance.pushNamed('settings'); _closeDrawer(); }, ) : ListTile( minTileHeight: 0, contentPadding: const EdgeInsets.symmetric( horizontal: 20, ), leading: const Icon(Icons.settings, size: 20).paddingAll(2), title: Text('settings'.tr), onTap: () { AppRouter.instance.pushNamed('settings'); _closeDrawer(); }, ), ], ).paddingOnly( top: 8, bottom: math.max(8, MediaQuery.of(context).padding.bottom), ), ], ), ), ); } }