Files
frp-panel/www/components/proxy/proxy_config_list.tsx
VaalaCat 373276633f feat: proxy list [新增代理列表实体]
refactor: change client manager structure [重构:更改客户端管理器结构适配影子客户端]

feat: add proxy config table and dao [添加代理配置独立数据表和DAO层]

feat: new proxy config entity [新建的代理配置实体]

feat: update and delete proxy config [更新和删除代理配置接口]

feat: get config api and beautify proxy item [更新获取配置API并美化代理项]

feat: change proxy form style [美化修改代理的表单样式]

fix: client edit [修复:编辑客户端的问题]

fix: shadow copy status error [修复:影子客户端复制状态错误]

fix: http proxy bug [修复:HTTP代理类型的错误]

fix: cannot update client [修复:无法更新客户端]

feat: record trigger refetch [自动重新获取表格内的数据]

fix: filter string length [修复:过滤字符串长度]

fix: add client error [修复:添加客户端错误]

fix: do not notify client when stopped [修复:停止时不通知客户端]

fix: delete when proxy duplicate [修复:代理重复时删除]

feat: add http proxy location [添加HTTP代理路由路径]

chore: edit style [编辑样式美化]

fix: remove expired client [修复:自动移除过期客户端]

feat: proxy status [新增代理状态提示]

fix: build [修复:构建]

fix: refetch trigger [修复:重新获取数据的问题]

fix: remove all expired client [修复:移除所有过期客户端]

feat: i18n for proxy [代理页面的国际化翻译]
2024-12-20 12:18:28 +00:00

125 lines
3.8 KiB
TypeScript

import { ProxyConfig } from '@/lib/pb/common'
import { ProxyConfigTableSchema, columns as proxyConfigColumnsDef } from './proxy_config_item'
import { DataTable } from '../base/data_table'
import {
getSortedRowModel,
getCoreRowModel,
ColumnFiltersState,
useReactTable,
getFilteredRowModel,
getPaginationRowModel,
SortingState,
PaginationState,
} from '@tanstack/react-table'
import React from 'react'
import { keepPreviousData, useQuery } from '@tanstack/react-query'
import { listProxyConfig } from '@/api/proxy'
import { TypedProxyConfig } from '@/types/proxy'
import { $proxyTableRefetchTrigger } from '@/store/refetch-trigger'
import { useStore } from '@nanostores/react'
export interface ProxyConfigListProps {
ProxyConfigs: ProxyConfig[]
Keyword?: string
ClientID?: string
ServerID?: string
TriggerRefetch?: string
}
export const ProxyConfigList: React.FC<ProxyConfigListProps> = ({ ProxyConfigs, Keyword, TriggerRefetch, ClientID, ServerID }) => {
const [sorting, setSorting] = React.useState<SortingState>([])
const [columnFilters, setColumnFilters] = React.useState<ColumnFiltersState>([])
const globalRefetchTrigger = useStore($proxyTableRefetchTrigger)
const data = ProxyConfigs.map(
(proxy_config) =>
({
id: proxy_config.id || '',
clientID: proxy_config.clientId || '',
serverID: proxy_config.serverId || '',
name: proxy_config.name || '',
type: proxy_config.type || '',
visitPreview: "for test",
originalProxyConfig: proxy_config,
}) as ProxyConfigTableSchema,
)
const [{ pageIndex, pageSize }, setPagination] = React.useState<PaginationState>({
pageIndex: 0,
pageSize: 10,
})
const fetchDataOptions = {
pageIndex,
pageSize,
Keyword,
TriggerRefetch,
ClientID,
ServerID,
globalRefetchTrigger,
}
const pagination = React.useMemo(
() => ({
pageIndex,
pageSize,
}),
[pageIndex, pageSize],
)
const dataQuery = useQuery({
queryKey: ['listProxyConfigs', fetchDataOptions],
queryFn: async () => {
return await listProxyConfig({
page: fetchDataOptions.pageIndex + 1,
pageSize: fetchDataOptions.pageSize,
keyword: fetchDataOptions.Keyword,
clientId: fetchDataOptions.ClientID,
serverId: fetchDataOptions.ServerID,
})
},
placeholderData: keepPreviousData,
})
const table = useReactTable({
data:
dataQuery.data?.proxyConfigs.map((proxy_config) => {
return {
id: proxy_config.id || '',
name: proxy_config.name || '',
clientID: proxy_config.clientId || '',
serverID: proxy_config.serverId || '',
type: proxy_config.type || '',
config: proxy_config.config || '',
localIP: proxy_config.config && ParseProxyConfig(proxy_config.config).localIP,
localPort: proxy_config.config && ParseProxyConfig(proxy_config.config).localPort,
visitPreview: "",
originalProxyConfig: proxy_config,
} as ProxyConfigTableSchema
}) ?? data,
pageCount: Math.ceil(
//@ts-ignore
(dataQuery.data?.total == undefined ? 0 : dataQuery.data?.total) / fetchDataOptions.pageSize ?? 0,
),
columns: proxyConfigColumnsDef,
getCoreRowModel: getCoreRowModel(),
getPaginationRowModel: getPaginationRowModel(),
onSortingChange: setSorting,
onPaginationChange: setPagination,
onColumnFiltersChange: setColumnFilters,
getFilteredRowModel: getFilteredRowModel(),
getSortedRowModel: getSortedRowModel(),
manualPagination: true,
state: {
sorting,
pagination,
columnFilters,
},
})
return <DataTable table={table} columns={proxyConfigColumnsDef} />
}
function ParseProxyConfig(cfg: string): TypedProxyConfig {
return JSON.parse(cfg)
}