import 'package:flutter/material.dart'; import 'package:get/get.dart'; import 'package:get_storage/get_storage.dart'; import 'package:tuuli_app/api/api_client.dart'; import 'package:tuuli_app/api/model/tables_list_model.dart'; import 'package:tuuli_app/c.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, settings, } mixin HomePageStateRef { void refreshData(); } class HomePage extends StatefulWidget { const HomePage({super.key}); @override State createState() => _HomePageState(); } class _HomePageState extends State with HomePageStateRef { final apiClient = Get.find(); TablesListModel tables = TablesListModel([]); TableModel get usersTable => tables.tables.firstWhere((element) => element.tableName == "users"); bool get isNarrow => (MediaQuery.of(context).size.width - C.materialDrawerWidth) <= 600; @override void initState() { super.initState(); refreshData(); } var currentPage = PageType.none; final pageNames = { PageType.none: "Home", PageType.tables: "Tables", PageType.users: "Users", PageType.settings: "Settings", }; AppBar get appBar => AppBar( title: Text(pageNames[currentPage]!), actions: [ IconButton( icon: const Icon(Icons.home), onPressed: () { Get.offAllNamed("/"); }, ), IconButton( icon: const Icon(Icons.refresh), onPressed: refreshData, ), ], ); ListView get drawerOptions => ListView( children: [ ListTile( leading: const Icon(Icons.table_chart), title: const Text("Tables"), onTap: () { setState(() { currentPage = PageType.tables; }); }, ), ListTile( leading: const Icon(Icons.person), title: const Text("Users"), onTap: () { setState(() { currentPage = PageType.users; }); }, ), ListTile( leading: const Icon(Icons.settings), title: const Text("Settings"), onTap: () { setState(() { currentPage = PageType.settings; }); }, ), const Divider(), ListTile( leading: const Icon(Icons.logout), title: const Text("Logout"), onTap: () { GetStorage().erase().then((value) { GetStorage().save(); Get.offAllNamed("/"); }); }, ), ], ); @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: Builder(builder: (context) { switch (currentPage) { case PageType.tables: return TablesListPanel(parent: this, tables: tables); case PageType.users: return UsersListPanel(usersTable: usersTable); case PageType.settings: return const SettingsPanel(); case PageType.none: default: return const NonePanel(); } }), ), ], ), ); } @override void refreshData() { apiClient.tablesList().then( (value) => value.unfold( (tables) { setState(() { this.tables = tables; }); }, (error) { ScaffoldMessenger.of(context).hideCurrentSnackBar(); ScaffoldMessenger.of(context).showSnackBar( SnackBar( content: Text(error.toString()), ), ); }, ), ); } }