'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, 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' import { Switch } from '../ui/switch' import { Textarea } from '../ui/textarea' export type ProxyConfigMutateDialogProps = { overwrite?: boolean defaultProxyConfig?: TypedProxyConfig defaultOriginalProxyConfig?: ProxyConfig disableChangeProxyName?: boolean onSuccess?: () => void } export const ProxyConfigMutateDialog = ({ ...props }: ProxyConfigMutateDialogProps) => { const { t } = useTranslation() return ( {t('proxy.config.create_proxy')} {t('proxy.config.create_proxy_description')} ) } export const ProxyConfigMutateForm = ({ overwrite, defaultProxyConfig, defaultOriginalProxyConfig, disableChangeProxyName, onSuccess, }: 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'] // advanced mode toggle const [advancedMode, setAdvancedMode] = useState(false) const [rawConfig, setRawConfig] = useState('{}') 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()) onSuccess?.() }, onError: (e) => { toast(t('proxy.config.create_failed'), { description: JSON.stringify(e), }) $proxyTableRefetchTrigger.set(Math.random()) }, }) useEffect(() => { if (proxyName && proxyType) { setProxyConfigs([{ ...defaultProxyConfig, name: proxyName, type: proxyType }]) } }, [proxyName, proxyType]) useEffect(() => { if (proxyConfigs) { setRawConfig(JSON.stringify(proxyConfigs, null, 2)) } }, [proxyConfigs, setRawConfig]) useEffect(() => { if (defaultProxyConfig && defaultOriginalProxyConfig) { setProxyConfigs([defaultProxyConfig]) setProxyType(defaultProxyConfig.type) setProxyName(defaultProxyConfig.name) setNewClientID(defaultOriginalProxyConfig.originClientId) setNewServerID(defaultOriginalProxyConfig.serverId) setRawConfig(JSON.stringify([defaultProxyConfig], null, 2)) } }, [defaultProxyConfig, defaultOriginalProxyConfig]) return ( <>
{!advancedMode && ( <> ({ value: type, label: type }))} value={proxyType} setValue={(value) => { setProxyType(value as ProxyType) }} /> {proxyConfigs && selectedServer && proxyConfigs.length > 0 && proxyConfigs[0] && TypedProxyConfigValid(proxyConfigs[0]) && (
)} setProxyName(e.target.value)} disabled={disableChangeProxyName} /> {proxyName && newClientID && newServerID && ( 0 ? proxyConfigs[0] : undefined} clientProxyConfigs={proxyConfigs} setClientProxyConfigs={setProxyConfigs} enablePreview={false} /> )} )} {advancedMode && ( <>