= (props) => {
className={classNames('interactive', {
'last-row': i === nodes.length - 1,
})}
- onClick={() => onEditingNodes(node)}
+ onClick={() => onEditingNode(node)}
>
|
@@ -425,7 +409,7 @@ export const NodesTable: FC = (props) => {
noObjectT="nodesTable.noNode"
noObjectMatchedT='nodesTable.noNodeMatched'
createObjectT="addNode"
- onCreateObject={onCreateNodes}
+ onCreateObject={onAddingNode}
/>
|
diff --git a/app/dashboard/src/pages/nodes/usage.tsx b/app/dashboard/src/pages/nodes/usage.tsx
index 3678b60..757eeda 100644
--- a/app/dashboard/src/pages/nodes/usage.tsx
+++ b/app/dashboard/src/pages/nodes/usage.tsx
@@ -13,7 +13,7 @@ import { FC, Suspense, useEffect, useState } from 'react';
import ReactApexChart from 'react-apexcharts';
import { useTranslation } from 'react-i18next';
import { Icon } from 'components/icon';
-import { UsageFilter, createUsageConfig } from 'components/UsageFilter';
+import { UsageFilter, createUsageConfig } from 'components/usage-filter';
import { StatisticsCardWide } from 'components/statistics-card';
const UsageIcon = chakra(ChartPieIcon, {
diff --git a/app/dashboard/src/pages/routes.tsx b/app/dashboard/src/pages/routes.tsx
index cd95a40..663b68b 100644
--- a/app/dashboard/src/pages/routes.tsx
+++ b/app/dashboard/src/pages/routes.tsx
@@ -1,6 +1,7 @@
import { lazy } from 'react';
import { createHashRouter } from 'react-router-dom';
import { fetchAdminLoader } from 'service/http';
+import { pages } from 'stores';
const ConsoleLayout = lazy(() => import('layouts/console-layout'));
const Home = lazy(() => import('./home'));
@@ -18,23 +19,23 @@ export const router = createHashRouter([
element: ,
children: [
{
- path: '/',
+ path: pages.home.path,
element: ,
},
{
- path: '/users',
+ path: pages.users.path,
element: ,
},
{
- path: '/services',
+ path: pages.services.path,
element: ,
},
{
- path: '/nodes',
+ path: pages.nodes.path,
element: ,
},
{
- path: '/hosts',
+ path: pages.hosts.path,
element: ,
},
],
diff --git a/app/dashboard/src/pages/services/dialog/index.tsx b/app/dashboard/src/pages/services/dialog/index.tsx
index 63580d1..3f6e0c8 100644
--- a/app/dashboard/src/pages/services/dialog/index.tsx
+++ b/app/dashboard/src/pages/services/dialog/index.tsx
@@ -20,9 +20,13 @@ import { zodResolver } from '@hookform/resolvers/zod';
import { FC, useEffect, useState } from 'react';
import { FormProvider, useForm } from 'react-hook-form';
import { useTranslation } from 'react-i18next';
-import { AddIcon, DeleteIcon, EditIcon } from 'components/dialog/Icons';
-import { DialogModalHeader } from 'components/dialog/ModalHeader';
-import { DialogModalFooter } from 'components/dialog/ModalFooter';
+import {
+ AddIcon,
+ DialogModalHeader,
+ DialogModalFooter,
+ DeleteIcon,
+ EditIcon
+} from 'components/dialog';
import { getDefaultValues } from './default-values';
import { schema, FormType } from './form-schema';
import { InboundsField } from './inbounds-field';
diff --git a/app/dashboard/src/pages/services/index.tsx b/app/dashboard/src/pages/services/index.tsx
index 1a8a5ff..105566c 100644
--- a/app/dashboard/src/pages/services/index.tsx
+++ b/app/dashboard/src/pages/services/index.tsx
@@ -1,21 +1,16 @@
-import { FC, useEffect } from 'react';
+import { FC } from 'react';
import { ServicesFilters } from './filters';
import { ServicesTable } from './table';
-import { pages } from 'constants/Pages';
+import { pages } from 'stores';
import { ServiceDialog } from './dialog';
-import { useDashboard, useServices } from 'stores';
import { DeleteServiceModal } from './modals/delete-modal';
import Page from 'components/page';
const ServicesPage: FC = () => {
- useEffect(() => {
- useDashboard.getState().activatePage(pages.findIndex((page) => page.path === '/services'));
- useServices.getState().refetchServices();
- }, []);
return (
-
+
diff --git a/app/dashboard/src/pages/services/table.tsx b/app/dashboard/src/pages/services/table.tsx
index 08e6fb5..fc81ba9 100644
--- a/app/dashboard/src/pages/services/table.tsx
+++ b/app/dashboard/src/pages/services/table.tsx
@@ -31,6 +31,7 @@ export const ServicesTable: FC = (props) => {
onEditingService,
onCreateService,
onFilterChange,
+ refetchServices,
} = useServices();
const { t } = useTranslation();
@@ -62,8 +63,9 @@ export const ServicesTable: FC = (props) => {
});
};
+ refetchServices();
return (
-
+
diff --git a/app/dashboard/src/pages/users/dialog/data-limit-field.tsx b/app/dashboard/src/pages/users/dialog/data-limit-field.tsx
index cd261b3..d225b53 100644
--- a/app/dashboard/src/pages/users/dialog/data-limit-field.tsx
+++ b/app/dashboard/src/pages/users/dialog/data-limit-field.tsx
@@ -1,5 +1,5 @@
import { FormControl, FormLabel } from '@chakra-ui/react';
-import { Input } from 'components/Input';
+import { Input } from 'components/input';
import { TFunction } from 'i18next';
import { Controller } from 'react-hook-form';
diff --git a/app/dashboard/src/pages/users/dialog/expire-date-field.tsx b/app/dashboard/src/pages/users/dialog/expire-date-field.tsx
index 3175a74..7019df8 100644
--- a/app/dashboard/src/pages/users/dialog/expire-date-field.tsx
+++ b/app/dashboard/src/pages/users/dialog/expire-date-field.tsx
@@ -8,7 +8,7 @@ import { i18n, TFunction } from 'i18next';
import ReactDatePicker from 'react-datepicker';
import { Controller } from 'react-hook-form';
import { relativeExpiryDate } from 'utils/dateFormatter';
-import { Input } from 'components/Input';
+import { Input } from 'components/input';
interface ExpireDateFieldProps {
form: any;
diff --git a/app/dashboard/src/pages/users/dialog/index.tsx b/app/dashboard/src/pages/users/dialog/index.tsx
index 0cb254d..6ca47dc 100644
--- a/app/dashboard/src/pages/users/dialog/index.tsx
+++ b/app/dashboard/src/pages/users/dialog/index.tsx
@@ -32,11 +32,14 @@ import {
UserCreate,
Service
} from 'types';
-import { UsageFilter, createUsageConfig } from 'components/UsageFilter';
-import { AddIcon, EditIcon } from 'components/dialog/Icons';
-import { DialogModalHeader } from 'components/dialog/ModalHeader';
-import { DialogModalFooter } from 'components/dialog/ModalFooter';
-import { DeleteIcon } from 'components/dialog/Icons';
+import { UsageFilter, createUsageConfig } from 'components/usage-filter';
+import {
+ AddIcon,
+ EditIcon,
+ DialogModalHeader,
+ DialogModalFooter,
+ DeleteIcon
+} from 'components/dialog';
import { UserUsageIcon } from './icons';
import { getDefaultValues } from './default-values';
import { schema, FormType } from './form-schema';
diff --git a/app/dashboard/src/pages/users/index.tsx b/app/dashboard/src/pages/users/index.tsx
index e906cc8..7e4d74c 100644
--- a/app/dashboard/src/pages/users/index.tsx
+++ b/app/dashboard/src/pages/users/index.tsx
@@ -1,7 +1,5 @@
import { UserDialog } from './dialog';
import { UsersTable } from './table';
-import { useUsers, useDashboard } from 'stores';
-import { useEffect } from 'react';
import { UsersFilters } from './filters';
import {
ResetAllUsageModal,
@@ -10,17 +8,12 @@ import {
ResetUserUsageModal,
RevokeSubscriptionModal
} from './modals';
-import { pages } from 'constants/Pages';
+import { pages } from 'stores';
import Page from 'components/page';
-
const UsersPage = () => {
- useEffect(() => {
- useDashboard.getState().activatePage(pages.findIndex((page) => page.path === '/users'));
- useUsers.getState().refetchUsers();
- }, []);
return (
-
+
diff --git a/app/dashboard/src/pages/users/table/index.tsx b/app/dashboard/src/pages/users/table/index.tsx
index f32fd3b..257ebbe 100644
--- a/app/dashboard/src/pages/users/table/index.tsx
+++ b/app/dashboard/src/pages/users/table/index.tsx
@@ -27,9 +27,9 @@ import { FC, Fragment, useEffect, useState } from 'react';
import CopyToClipboard from 'react-copy-to-clipboard';
import { useTranslation } from 'react-i18next';
import { User } from 'types';
-import { OnlineBadge } from 'components/OnlineBadge';
-import { OnlineStatus } from 'components/OnlineStatus';
-import { StatusBadge } from 'components/StatusBadge';
+import { OnlineBadge } from 'components/online-badge';
+import { OnlineStatus } from 'components/online-status';
+import { StatusBadge } from 'components/status-badge';
import {
Pagination,
EmptySection,
@@ -54,6 +54,7 @@ export const UsersTable: FC = (props) => {
usersFilters: filters,
users: { users },
users: { total },
+ refetchUsers,
onEditingUser,
onCreateUser,
onFilterChange,
@@ -103,7 +104,7 @@ export const UsersTable: FC = (props) => {
const toggleAccordion = (index: number) => {
setSelectedRow(index === selectedRow ? undefined : index);
};
-
+ refetchUsers();
return (
void;
expandSidebar: () => void;
- activatePage: (pageId: PageId) => void;
+ activatePage: (pageId: PageType) => void;
};
export const useDashboard = create(
subscribeWithSelector((set,) => ({
version: null,
loading: true,
- activePage: 0,
+ activePage: pages.home,
isCollapsed: false,
expandSidebar: () => {
set({ isCollapsed: false })
@@ -25,8 +62,8 @@ export const useDashboard = create(
collapseSidebar: () => {
set({ isCollapsed: true })
},
- activatePage: (pageId: number) => {
- set({ activePage: pageId });
+ activatePage: (page) => {
+ set({ activePage: page });
},
}))
);
diff --git a/app/dashboard/src/types/page.ts b/app/dashboard/src/types/page.ts
index 4b35bf3..6559857 100644
--- a/app/dashboard/src/types/page.ts
+++ b/app/dashboard/src/types/page.ts
@@ -1,7 +1,15 @@
import { ChakraIcon } from 'types'
-export interface PageType {
+export type PageType = {
path: string;
name: string;
itemIcon: ChakraIcon;
}
+
+export interface Pages {
+ home: PageType;
+ users: PageType;
+ services: PageType;
+ nodes: PageType;
+ hosts: PageType;
+}