189 lines
5.3 KiB
Dart
189 lines
5.3 KiB
Dart
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: "Home",
|
|
PageType.tables: "Tables",
|
|
PageType.users: "Users",
|
|
PageType.assets: "Assets",
|
|
PageType.settings: "Settings",
|
|
};
|
|
|
|
@override
|
|
void onInit() {
|
|
super.onInit();
|
|
|
|
Get.lazyPut<TablesListPanelController>(
|
|
() => TablesListPanelController(),
|
|
fenix: true,
|
|
);
|
|
Get.lazyPut<UserListPanelController>(
|
|
() => UserListPanelController(),
|
|
fenix: true,
|
|
);
|
|
Get.lazyPut<AssetsPagePanelController>(
|
|
() => AssetsPagePanelController(),
|
|
fenix: true,
|
|
);
|
|
}
|
|
|
|
Future<void> logout() async {
|
|
ApiController.to.token = "";
|
|
|
|
await Future.wait([
|
|
Get.delete<TablesListPanelController>(),
|
|
Get.delete<UserListPanelController>(),
|
|
Get.delete<AssetsPagePanelController>(),
|
|
Get.delete<HomePageController>(),
|
|
]);
|
|
|
|
Get.offAllNamed("/");
|
|
}
|
|
}
|
|
|
|
class HomePage extends GetView<HomePageController> {
|
|
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("Tables"),
|
|
onTap: () {
|
|
controller.currentPage = PageType.tables;
|
|
},
|
|
selected: controller.currentPage == PageType.tables,
|
|
),
|
|
),
|
|
Obx(
|
|
() => ListTile(
|
|
leading: const Icon(Icons.person),
|
|
title: const Text("Users"),
|
|
onTap: () {
|
|
controller.currentPage = PageType.users;
|
|
},
|
|
selected: controller.currentPage == PageType.users,
|
|
),
|
|
),
|
|
Obx(
|
|
() => ListTile(
|
|
leading: const Icon(Icons.dataset_outlined),
|
|
title: const Text("Assets"),
|
|
onTap: () {
|
|
controller.currentPage = PageType.assets;
|
|
},
|
|
selected: controller.currentPage == PageType.assets,
|
|
),
|
|
),
|
|
Obx(
|
|
() => ListTile(
|
|
leading: const Icon(Icons.settings),
|
|
title: const Text("Settings"),
|
|
onTap: () {
|
|
controller.currentPage = PageType.settings;
|
|
},
|
|
selected: controller.currentPage == PageType.settings,
|
|
),
|
|
),
|
|
const Divider(),
|
|
ListTile(
|
|
leading: const Icon(Icons.logout),
|
|
title: const Text("Logout"),
|
|
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();
|
|
}
|
|
}),
|
|
),
|
|
],
|
|
),
|
|
);
|
|
}
|
|
}
|