import 'package:flutter/material.dart'; import 'package:get/get.dart'; import 'package:get_storage/get_storage.dart'; import 'package:tuuli_app/api_controller.dart'; import 'package:tuuli_app/c.dart'; import 'package:tuuli_app/pages/home_panels/assets_panel.dart'; import 'package:tuuli_app/pages/home_panels/none_panel.dart'; import 'package:tuuli_app/pages/home_panels/settings_panel.dart'; import 'package:tuuli_app/pages/home_panels/tables_list_panel.dart'; import 'package:tuuli_app/pages/home_panels/users_list_panel.dart'; enum PageType { none, tables, users, assets, settings, } class HomePageController extends GetxController { final _currentPage = PageType.none.obs; PageType get currentPage => _currentPage.value; set currentPage(PageType value) => _currentPage.value = value; String get currentPageName => pageNames[currentPage]!; final pageNames = { PageType.none: "Домашняя", PageType.tables: "Таблицы", PageType.users: "Пользователи", PageType.assets: "Ресурсы", PageType.settings: "Настройки", }; @override void onInit() { super.onInit(); Get.lazyPut( () => TablesListPanelController(), fenix: true, ); Get.lazyPut( () => UserListPanelController(), fenix: true, ); Get.lazyPut( () => AssetsPagePanelController(), fenix: true, ); } Future logout() async { ApiController.to.token = ""; await Future.wait([ Get.delete(), Get.delete(), Get.delete(), Get.delete(), ]); Get.offAllNamed("/"); } } class HomePage extends GetView { const HomePage({super.key}); bool get isNarrow => (Get.mediaQuery.size.width - C.materialDrawerWidth) <= 600; AppBar get appBar => AppBar( title: Obx(() => Text(controller.currentPageName)), actions: [ IconButton( icon: const Icon(Icons.home), onPressed: () { Get.offAllNamed("/"); }, ), IconButton( icon: const Icon(Icons.logout), onPressed: () => controller.logout(), ), ], ); ListView get drawerOptions => ListView( children: [ Obx( () => ListTile( leading: const Icon(Icons.table_chart), title: const Text("Таблицы"), onTap: () { controller.currentPage = PageType.tables; }, selected: controller.currentPage == PageType.tables, ), ), Obx( () => ListTile( leading: const Icon(Icons.person), title: const Text("Пользователи"), onTap: () { controller.currentPage = PageType.users; }, selected: controller.currentPage == PageType.users, ), ), Obx( () => ListTile( leading: const Icon(Icons.dataset_outlined), title: const Text("Ресурсы"), onTap: () { controller.currentPage = PageType.assets; }, selected: controller.currentPage == PageType.assets, ), ), Obx( () => ListTile( leading: const Icon(Icons.settings), title: const Text("Настройки"), onTap: () { controller.currentPage = PageType.settings; }, selected: controller.currentPage == PageType.settings, ), ), const Divider(), ListTile( leading: const Icon(Icons.logout), title: const Text("Выйти"), onTap: () => controller.logout(), ), ], ); @override Widget build(BuildContext context) { return Scaffold( appBar: appBar, drawer: isNarrow ? Drawer( width: C.materialDrawerWidth, child: drawerOptions, ) : null, body: Row( mainAxisAlignment: MainAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start, children: [ Container( width: C.materialDrawerWidth, decoration: BoxDecoration( color: Colors.black.withAlpha(100), border: Border( right: BorderSide( color: Theme.of(context).dividerColor, width: 1, ), ), ), child: drawerOptions, ), LimitedBox( maxWidth: MediaQuery.of(context).size.width - C.materialDrawerWidth, child: Obx(() { switch (controller.currentPage) { case PageType.tables: return const TablesListPanel(); case PageType.users: return const UsersListPanel(); case PageType.assets: return const AssetsPagePanel(); case PageType.settings: return const SettingsPanel(); case PageType.none: default: return const NonePanel(); } }), ), ], ), ); } }