Skip to content

Commit 3f02a63

Browse files
committed
refactor: user traffic handling in components
1 parent 252f8ee commit 3f02a63

File tree

15 files changed

+110
-56
lines changed

15 files changed

+110
-56
lines changed

package-lock.json

Lines changed: 4 additions & 4 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,7 @@
5959
"@monaco-editor/react": "^4.7.0",
6060
"@noble/post-quantum": "^0.5.2",
6161
"@paralleldrive/cuid2": "2.2.2",
62-
"@remnawave/backend-contract": "2.3.2",
62+
"@remnawave/backend-contract": "2.3.6",
6363
"@simplewebauthn/browser": "^13.2.2",
6464
"@stablelib/base64": "^2.0.1",
6565
"@stablelib/x25519": "^2.0.1",

src/entities/dashboard/users/ui/table-columns/connected-node/connected-node.column.tsx

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ import { Group, Text } from '@mantine/core'
44
import { IProps } from './interface'
55

66
export function ConnectedNodeColumnEntity(props: IProps) {
7-
const { lastConnectedNode } = props
7+
const { node } = props
88

99
return (
1010
<Group
@@ -16,17 +16,17 @@ export function ConnectedNodeColumnEntity(props: IProps) {
1616
}}
1717
wrap="nowrap"
1818
>
19-
{lastConnectedNode?.countryCode && lastConnectedNode.countryCode !== 'XX' && (
19+
{node?.countryCode && node.countryCode !== 'XX' && (
2020
<ReactCountryFlag
21-
countryCode={lastConnectedNode.countryCode}
21+
countryCode={node.countryCode}
2222
style={{
2323
fontSize: '1.1em',
2424
borderRadius: '2px'
2525
}}
2626
/>
2727
)}
2828
<Text ff="monospace" fw={500} size="md">
29-
{lastConnectedNode?.nodeName || '–'}
29+
{node?.name || '–'}
3030
</Text>
3131
</Group>
3232
)
Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
1-
import { GetAllUsersCommand } from '@remnawave/backend-contract'
1+
import { GetAllNodesCommand } from '@remnawave/backend-contract'
22

33
export interface IProps {
4-
lastConnectedNode: GetAllUsersCommand.Response['response']['users'][number]['lastConnectedNode']
4+
node: GetAllNodesCommand.Response['response'][number] | undefined
55
}

src/entities/dashboard/users/ui/table-columns/data-usage/data-usage.column.tsx

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,11 +11,11 @@ export function DataUsageColumnEntity(props: IProps) {
1111
const { user } = props
1212

1313
const usedTrafficPercentage = user.trafficLimitBytes
14-
? (user.usedTrafficBytes / user.trafficLimitBytes) * 100
14+
? (user.userTraffic.usedTrafficBytes / user.trafficLimitBytes) * 100
1515
: 0
1616
const limitBytes = prettyBytesUtil(user.trafficLimitBytes, true)
17-
const totalUsedTraffic = prettyBytesUtil(user.usedTrafficBytes, true)
18-
const lifetimeUsedTraffic = prettyBytesUtil(user.lifetimeUsedTrafficBytes, true)
17+
const totalUsedTraffic = prettyBytesUtil(user.userTraffic.usedTrafficBytes, true)
18+
const lifetimeUsedTraffic = prettyBytesUtil(user.userTraffic.lifetimeUsedTrafficBytes, true)
1919

2020
const strategy = {
2121
[RESET_PERIODS.MONTH]: t('data-usage.column.monthly'),

src/entities/dashboard/users/ui/table-columns/username/username.column.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,8 @@ export function UsernameColumnEntity(props: IProps) {
99

1010
const { user } = props
1111

12-
const color = getConnectionStatusColorUtil(user.onlineAt)
13-
const timeAgo = getTimeAgoUtil(user.onlineAt, t, i18n.language)
12+
const color = getConnectionStatusColorUtil(user.userTraffic.onlineAt)
13+
const timeAgo = getTimeAgoUtil(user.userTraffic.onlineAt, t, i18n.language)
1414

1515
return (
1616
<Group align="center" gap="md" pl={10} wrap="nowrap">

src/entities/dashboard/users/users-table-store/users-table-store.ts

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -16,10 +16,7 @@ const DEFAULT_VISIBILITY: MRT_VisibilityState = {
1616
shortUuid: false,
1717
createdAt: false,
1818
subRevokedAt: false,
19-
totalUsedBytes: false,
20-
onlineAt: false,
2119
subLastUserAgent: false,
22-
lifetimeUsedTrafficBytes: false,
2320
description: false,
2421
telegramId: false,
2522
email: false,
@@ -108,7 +105,7 @@ export const useUsersTableStore = create<IActions & IState>()(
108105

109106
{
110107
name: 'x-rmnw-users-table',
111-
version: 4,
108+
version: 5,
112109
storage: createJSONStorage(() => localStorage),
113110
partialize: (state) => ({
114111
columnVisibility: state.columnVisibility,

src/features/dashboard/users/users-table/model/use-table-columns.tsx

Lines changed: 24 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
/* eslint-disable camelcase */
2+
23
import {
34
GetAllNodesCommand,
45
GetAllUsersCommand,
@@ -59,7 +60,13 @@ export const useUserTableColumns = (
5960
header: t('use-table-columns.last-connected-node'),
6061
Cell: ({ cell }) => (
6162
<ConnectedNodeColumnEntity
62-
lastConnectedNode={cell.row.original.lastConnectedNode}
63+
node={
64+
nodes?.find(
65+
(node) =>
66+
node.uuid ===
67+
cell.row.original.userTraffic.lastConnectedNodeUuid
68+
) ?? undefined
69+
}
6370
/>
6471
),
6572
filterVariant: 'select',
@@ -254,12 +261,16 @@ export const useUserTableColumns = (
254261
},
255262

256263
{
257-
accessorKey: 'firstConnectedAt',
264+
accessorKey: 'userTraffic.firstConnectedAt',
258265
header: t('use-table-columns.first-connected-at'),
259-
accessorFn: (originalRow) =>
260-
originalRow.firstConnectedAt
261-
? dayjs(originalRow.firstConnectedAt).format('DD/MM/YYYY, HH:mm')
262-
: '–',
266+
accessorFn: (originalRow) => {
267+
if (originalRow.userTraffic && originalRow.userTraffic.firstConnectedAt) {
268+
return dayjs(originalRow.userTraffic.firstConnectedAt).format(
269+
'DD/MM/YYYY, HH:mm'
270+
)
271+
}
272+
return '–'
273+
},
263274
minSize: 250,
264275
size: 400,
265276

@@ -290,11 +301,11 @@ export const useUserTableColumns = (
290301
}
291302
},
292303
{
293-
accessorKey: 'onlineAt',
304+
accessorKey: 'userTraffic.onlineAt',
294305
header: t('use-table-columns.online-at'),
295306
accessorFn: (originalRow) =>
296-
originalRow.onlineAt
297-
? dayjs(originalRow.onlineAt).format('DD/MM/YYYY, HH:mm')
307+
originalRow.userTraffic && originalRow.userTraffic.onlineAt
308+
? dayjs(originalRow.userTraffic.onlineAt).format('DD/MM/YYYY, HH:mm')
298309
: t('use-table-columns.never'),
299310
minSize: 170,
300311
maxSize: 400,
@@ -334,10 +345,12 @@ export const useUserTableColumns = (
334345
}
335346
},
336347
{
337-
accessorKey: 'lifetimeUsedTrafficBytes',
348+
accessorKey: 'userTraffic.lifetimeUsedTrafficBytes',
338349
header: t('use-table-columns.lifetime-used'),
339350
accessorFn: (originalRow) =>
340-
prettyBytesToAnyUtil(originalRow.lifetimeUsedTrafficBytes) || '–',
351+
originalRow.userTraffic && originalRow.userTraffic.lifetimeUsedTrafficBytes
352+
? prettyBytesToAnyUtil(originalRow.userTraffic.lifetimeUsedTrafficBytes)
353+
: '–',
341354
minSize: 170,
342355
maxSize: 300,
343356
size: 170,

src/pages/dashboard/home/components/home.page.tsx

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -148,10 +148,10 @@ export const HomePage = (props: IProps) => {
148148

149149
<MotionWrapper variants={sectionVariants}>
150150
<AnimatedTitle m="xs" ml={0} order={4} variants={titleVariants}>
151-
{t('home.page.system')}
151+
{t('home.page.online-stats')}
152152
</AnimatedTitle>
153-
<MotionGrid cols={{ base: 1, sm: 2, xl: 3 }} variants={gridVariants}>
154-
{simpleMetrics.map((metric) => (
153+
<MotionGrid cols={{ base: 1, sm: 2, xl: 4 }} variants={gridVariants}>
154+
{onlineMetrics.map((metric) => (
155155
<MotionWrapper key={metric.title} variants={cardVariants}>
156156
<MetricWithIcon {...metric} />
157157
</MotionWrapper>
@@ -161,10 +161,10 @@ export const HomePage = (props: IProps) => {
161161

162162
<MotionWrapper variants={sectionVariants}>
163163
<AnimatedTitle m="xs" ml={0} order={4} variants={titleVariants}>
164-
{t('home.page.online-stats')}
164+
{t('home.page.system')}
165165
</AnimatedTitle>
166-
<MotionGrid cols={{ base: 1, sm: 2, xl: 4 }} variants={gridVariants}>
167-
{onlineMetrics.map((metric) => (
166+
<MotionGrid cols={{ base: 1, sm: 2, xl: 3 }} variants={gridVariants}>
167+
{simpleMetrics.map((metric) => (
168168
<MotionWrapper key={metric.title} variants={cardVariants}>
169169
<MetricWithIcon {...metric} />
170170
</MotionWrapper>

src/pages/dashboard/home/components/metrics/simple-metrics.tsx

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
1-
import { PiCpuDuotone, PiMemoryDuotone } from 'react-icons/pi'
1+
import { PiChartBarDuotone, PiCpuDuotone, PiMemoryDuotone } from 'react-icons/pi'
22
import { GetStatsCommand } from '@remnawave/backend-contract'
33
import { TFunction } from 'i18next'
44

5-
import { prettyBytesUtil } from '@shared/utils/bytes'
5+
import { prettyBytesUtil, prettyBytesUtilWithoutPrefix } from '@shared/utils/bytes'
66

77
export const getSimpleMetrics = (
88
systemInfo: GetStatsCommand.Response['response'],
@@ -20,12 +20,12 @@ export const getSimpleMetrics = (
2020
title: t('simple-metrics.total-online-on-nodes'),
2121
color: 'var(--mantine-color-blue-4)'
2222
},
23-
// {
24-
// value: prettyBytesUtilWithoutPrefix(Number(users.totalTrafficBytes)) ?? 0,
25-
// icon: PiChartBarDuotone,
26-
// title: t('simple-metrics.total-traffic'),
27-
// color: 'var(--mantine-color-green-4)'
28-
// },
23+
{
24+
value: prettyBytesUtilWithoutPrefix(Number(nodes.totalBytesLifetime)) ?? 0,
25+
icon: PiChartBarDuotone,
26+
title: t('simple-metrics.total-traffic'),
27+
color: 'var(--mantine-color-green-4)'
28+
},
2929
{
3030
value: `${usedRamGB} / ${totalRamGB}`,
3131
icon: PiMemoryDuotone,

0 commit comments

Comments
 (0)