"use client" import { useEffect, useState } from 'react' import { useMutation } from '@tanstack/react-query' import { Label } from '@/components/ui/label' import { Input } from '@/components/ui/input' import { Button } from '@/components/ui/button' import { Dialog, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogTitle, DialogTrigger, } from '@/components/ui/dialog' import { useTranslation } from 'react-i18next' import { ServerSelector } from '../base/server-selector' import { ClientSelector } from '../base/client-selector' import { TypedProxyForm } from '../frpc/proxy_form' import { ProxyType, TypedProxyConfig } from '@/types/proxy' import { BaseSelector } from '../base/selector' import { createProxyConfig } from '@/api/proxy' import { ClientConfig } from '@/types/client' import { ObjToUint8Array } from '@/lib/utils' import { VisitPreview } from '../base/visit-preview' import { ProxyConfig, Server } from '@/lib/pb/common' import { TypedProxyConfigValid } from '@/lib/consts' import { toast } from 'sonner' import { $proxyTableRefetchTrigger } from '@/store/refetch-trigger' export type ProxyConfigMutateDialogProps = { overwrite?: boolean defaultProxyConfig?: TypedProxyConfig defaultOriginalProxyConfig?: ProxyConfig disableChangeProxyName?: boolean } export const ProxyConfigMutateDialog = ({ ...props }: ProxyConfigMutateDialogProps) => { const { t } = useTranslation() return ( {t('proxy.config.create')} ) } export const ProxyConfigMutateForm = ({ overwrite, defaultProxyConfig, defaultOriginalProxyConfig, disableChangeProxyName }: ProxyConfigMutateDialogProps) => { const { t } = useTranslation() const [newClientID, setNewClientID] = useState() const [newServerID, setNewServerID] = useState() const [proxyConfigs, setProxyConfigs] = useState([]) const [proxyName, setProxyName] = useState('') const [proxyType, setProxyType] = useState('http') const [selectedServer, setSelectedServer] = useState() const supportedProxyTypes: ProxyType[] = ["http", "tcp", "udp"] const createProxyConfigMutation = useMutation({ mutationKey: ['createProxyConfig', newClientID, newServerID], mutationFn: () => createProxyConfig({ clientId: newClientID!, serverId: newServerID!, config: ObjToUint8Array({ proxies: proxyConfigs } as ClientConfig), overwrite, }), onSuccess: () => { toast(t('proxy.config.create_success')) $proxyTableRefetchTrigger.set(Math.random()) }, onError: (e) => { toast(t('proxy.config.create_failed'), { description: JSON.stringify(e), }) $proxyTableRefetchTrigger.set(Math.random()) } }) useEffect(() => { if (proxyName && proxyType) { setProxyConfigs([{ name: proxyName, type: proxyType }]) } }, [proxyName, proxyType]) useEffect(() => { if (defaultProxyConfig && defaultOriginalProxyConfig) { setProxyConfigs([defaultProxyConfig]) setProxyType(defaultProxyConfig.type) setProxyName(defaultProxyConfig.name) setNewClientID(defaultOriginalProxyConfig.originClientId) setNewServerID(defaultOriginalProxyConfig.serverId) } }, [defaultProxyConfig, defaultOriginalProxyConfig]) return ( <> {t('proxy.config.select_server')} {t('proxy.config.select_client')} {t('proxy.config.select_proxy_type')} ({ value: type, label: type }))} value={proxyType} setValue={(value) => { setProxyType(value as ProxyType) }} /> {proxyConfigs && selectedServer && proxyConfigs.length > 0 && proxyConfigs[0] && TypedProxyConfigValid(proxyConfigs[0]) && } {t('proxy.config.proxy_name')} setProxyName(e.target.value)} disabled={disableChangeProxyName} /> {proxyName && newClientID && newServerID && 0 ? proxyConfigs[0] : undefined} clientProxyConfigs={proxyConfigs} setClientProxyConfigs={setProxyConfigs} enablePreview={false} />} { if (!TypedProxyConfigValid(proxyConfigs[0])) { toast(t('proxy.config.invalid_config')) return } createProxyConfigMutation.mutate() }} >{t('proxy.config.submit')} > ) }