gitscope
← marzneshin / v0.2.0 / app/dashboard/src/stores/dashboard.store.ts
https://dev.kronoz.win/r/marzneshin.git
app/dashboard/src/stores/dashboard.store.ts · TypeScript
Blame Raw
 1import { create } from 'zustand';
 2import { subscribeWithSelector } from 'zustand/middleware';
 3import { PageType, Pages } from 'types';
 4import { chakra } from '@chakra-ui/react';
 5import { CubeIcon, HomeIcon, ServerIcon, ServerStackIcon, UsersIcon } from '@heroicons/react/24/outline';
 6import { IconBaseStyle } from 'constants/IconBaseStyle';
 7
 8const UsersSidebarItemIcon = chakra(UsersIcon, IconBaseStyle);
 9const ServicesSidebarItemIcon = chakra(ServerStackIcon, IconBaseStyle);
10const NodesSidebarItemIcon = chakra(CubeIcon, IconBaseStyle);
11const HostSidebarItemIcon = chakra(ServerIcon, IconBaseStyle);
12const HomeSidebarItemIcon = chakra(HomeIcon, IconBaseStyle);
13
14
15export const pages: Pages = {
16  home: {
17    name: 'home',
18    path: '/',
19    itemIcon: HomeSidebarItemIcon,
20  },
21  users: {
22    name: 'users',
23    path: '/users',
24    itemIcon: UsersSidebarItemIcon,
25  },
26  services: {
27    name: 'services',
28    path: '/services',
29    itemIcon: ServicesSidebarItemIcon,
30  },
31  nodes: {
32    name: 'nodes',
33    path: '/nodes',
34    itemIcon: NodesSidebarItemIcon,
35  },
36  hosts: {
37    name: 'hosts',
38    path: '/hosts',
39    itemIcon: HostSidebarItemIcon,
40  },
41};
42
43type DashboardStateType = {
44  version: string | null;
45  loading: boolean;
46  activePage: PageType;
47  isCollapsed: boolean;
48  collapseSidebar: () => void;
49  expandSidebar: () => void;
50  activatePage: (pageId: PageType) => void;
51};
52
53export const useDashboard = create(
54  subscribeWithSelector<DashboardStateType>((set,) => ({
55    version: null,
56    loading: true,
57    activePage: pages.home,
58    isCollapsed: false,
59    expandSidebar: () => {
60      set({ isCollapsed: false })
61    },
62    collapseSidebar: () => {
63      set({ isCollapsed: true })
64    },
65    activatePage: (page) => {
66      set({ activePage: page });
67    },
68  }))
69);