'use client' import React, { useMemo } from 'react' import { Box, Card, Grid, Stack } from '@mui/material' import { useTheme } from '@mui/material/styles' import { MRT_ColumnDef, MaterialReactTable, useMaterialReactTable, } from 'material-react-table' import { GridColDef, GridRenderCellParams } from '@mui/x-data-grid' import { CopyToClipboard } from '@nymproject/react/clipboard/CopyToClipboard' import { Tooltip as InfoTooltip } from '@nymproject/react/tooltip/Tooltip' import { diff, gte, rcompare } from 'semver' import { useMainContext } from '@/app/context/main' import { TableToolbar } from '@/app/components/TableToolbar' import { CustomColumnHeading } from '@/app/components/CustomColumnHeading' import { Title } from '@/app/components/Title' import { unymToNym } from '@/app/utils/currency' import { Tooltip } from '@/app/components/Tooltip' import { NYM_BIG_DIPPER } from '@/app/api/constants' import { splice } from '@/app/utils' import { VersionDisplaySelector, VersionSelectOptions, } from '@/app/components/Gateways/VersionDisplaySelector' import StyledLink from '@/app/components/StyledLink' import { GatewayRowType, gatewayToGridRow, } from '@/app/components/Gateways/Gateways' const PageGateways = () => { const { gateways } = useMainContext() const [versionFilter, setVersionFilter] = React.useState(VersionSelectOptions.all) const theme = useTheme() const highestVersion = React.useMemo(() => { if (gateways?.data) { const versions = gateways.data.reduce( (a: string[], b) => [...a, b.gateway.version], [] ) const [lastestVersion] = versions.sort(rcompare) return lastestVersion } // fallback value return '2.0.0' }, [gateways]) const filterByLatestVersions = React.useMemo(() => { const filtered = gateways?.data?.filter((gw) => { const versionDiff = diff(highestVersion, gw.gateway.version) return versionDiff === 'patch' || versionDiff === null }) if (filtered) return filtered return [] }, [gateways]) const filterByOlderVersions = React.useMemo(() => { const filtered = gateways?.data?.filter((gw) => { const versionDiff = diff(highestVersion, gw.gateway.version) return versionDiff === 'major' || versionDiff === 'minor' }) if (filtered) return filtered return [] }, [gateways]) const filteredByVersion = React.useMemo(() => { switch (versionFilter) { case VersionSelectOptions.latestVersion: return filterByLatestVersions case VersionSelectOptions.olderVersions: return filterByOlderVersions case VersionSelectOptions.all: return gateways?.data || [] default: return [] } }, [versionFilter, gateways]) const data = useMemo(() => { return gatewayToGridRow(filteredByVersion || []) }, [filteredByVersion]) const columns = useMemo[]>(() => { return [ { id: 'gateway-data', header: 'Gatewsay Data', columns: [ { id: 'identity_key', header: 'Identity Key', accessorKey: 'identity_key', size: 250, Cell: ({ row }) => { return ( {splice(7, 29, row.original.identity_key)} ) }, }, { id: 'node_performance', header: 'Node Performance', accessorKey: 'node_performance', size: 200, Header: () => { return ( ) }, Cell: ({ row }) => { return ( {`${row.original.node_performance}%`} ) }, }, { id: 'version', header: 'Version', accessorKey: 'version', size: 150, Cell: ({ row }) => { return ( {row.original.version} ) }, }, { id: 'location', header: 'Location', accessorKey: 'location', size: 150, Cell: ({ row }) => { return ( {row.original.location} ) }, }, { id: 'host', header: 'IP:Port', accessorKey: 'host', size: 150, Cell: ({ row }) => { return ( {row.original.host} ) }, }, { id: 'owner', header: 'Owner', accessorKey: 'owner', size: 150, Cell: ({ row }) => { return ( {splice(7, 29, row.original.owner)} ) }, }, ], }, ] }, []) const _columns: GridColDef[] = [ { field: 'node_performance', align: 'center', renderHeader: () => ( <> ), width: 120, disableColumnMenu: true, headerAlign: 'center', headerClassName: 'MuiDataGrid-header-override', renderCell: (params: GridRenderCellParams) => ( {`${params.value}%`} ), }, { field: 'version', align: 'center', renderHeader: () => , width: 150, disableColumnMenu: true, headerAlign: 'center', headerClassName: 'MuiDataGrid-header-override', renderCell: (params: GridRenderCellParams) => ( {params.value} ), sortComparator: (a, b) => { if (gte(a, b)) return 1 return -1 }, }, { field: 'location', renderHeader: () => , width: 180, disableColumnMenu: true, headerAlign: 'left', headerClassName: 'MuiDataGrid-header-override', renderCell: (params: GridRenderCellParams) => ( {params.value} ), }, { field: 'host', renderHeader: () => , width: 180, disableColumnMenu: true, headerAlign: 'left', headerClassName: 'MuiDataGrid-header-override', renderCell: (params: GridRenderCellParams) => ( {params.value} ), }, { field: 'owner', headerName: 'Owner', renderHeader: () => , width: 180, disableColumnMenu: true, headerAlign: 'left', headerClassName: 'MuiDataGrid-header-override', renderCell: (params: GridRenderCellParams) => ( {splice(7, 29, params.value)} ), }, { field: 'bond', width: 150, disableColumnMenu: true, type: 'number', renderHeader: () => , headerClassName: 'MuiDataGrid-header-override', headerAlign: 'left', renderCell: (params: GridRenderCellParams) => ( {`${unymToNym(params.value, 6)}`} ), }, ] const table = useMaterialReactTable({ columns, data, }) return ( <> </Box> <Grid container> <Grid item xs={12}> <Card sx={{ padding: 2, height: '100%', }} > <TableToolbar childrenBefore={ <VersionDisplaySelector handleChange={(option) => setVersionFilter(option)} selected={versionFilter} /> } /> <MaterialReactTable table={table} /> </Card> </Grid> </Grid> </> ) } export default PageGateways