diff --git a/apps/admin/app/dashboard/server/form-schema.ts b/apps/admin/app/dashboard/server/form-schema.ts index d19232d..bc1dc3b 100644 --- a/apps/admin/app/dashboard/server/form-schema.ts +++ b/apps/admin/app/dashboard/server/form-schema.ts @@ -92,9 +92,17 @@ const baseFormSchema = z.object({ speed_limit: z.number().nullish(), traffic_ratio: z.number().default(1), group_id: z.number().nullish(), - enable_relay: z.boolean().nullish().default(false), - relay_host: nullableString, - relay_port: portSchema, + relay_mode: z.string().nullish().default('none'), + relay_node: z + .array( + z.object({ + host: z.string(), + port: portSchema, + prefix: z.string().nullish(), + }), + ) + .nullish() + .default([]), }); export const formSchema = z.intersection(baseFormSchema, protocolConfigSchema); diff --git a/apps/admin/app/dashboard/server/node-form.tsx b/apps/admin/app/dashboard/server/node-form.tsx index ab60bd6..fc1fc21 100644 --- a/apps/admin/app/dashboard/server/node-form.tsx +++ b/apps/admin/app/dashboard/server/node-form.tsx @@ -33,6 +33,7 @@ import { import { Switch } from '@workspace/ui/components/switch'; import { Tabs, TabsList, TabsTrigger } from '@workspace/ui/components/tabs'; import { Combobox } from '@workspace/ui/custom-components/combobox'; +import { ArrayInput } from '@workspace/ui/custom-components/dynamic-Inputs'; import { EnhancedInput } from '@workspace/ui/custom-components/enhanced-input'; import { cn } from '@workspace/ui/lib/utils'; import { unitConversion } from '@workspace/ui/utils'; @@ -75,6 +76,7 @@ export default function NodeForm({ const protocol = form.watch('protocol'); const transport = form.watch('config.transport'); const security = form.watch('config.security'); + const relayMode = form.watch('relay_mode'); useEffect(() => { form?.reset(initialValues); @@ -105,7 +107,7 @@ export default function NodeForm({ {trigger} - + {title} @@ -214,65 +216,6 @@ export default function NodeForm({ )} /> - ( - - {t('form.enableRelay')} - -
- { - form.setValue(field.name, value); - }} - /> -
-
- -
- )} - /> - ( - - {t('form.relayHost')} - - { - form.setValue(field.name, value); - }} - /> - - - - )} - /> - ( - - {t('form.relayPort')} - - { - form.setValue(field.name, value); - }} - /> - - - - )} - /> ({ { @@ -389,6 +333,7 @@ export default function NodeForm({ { form.setValue(field.name, value); }} @@ -499,7 +444,7 @@ export default function NodeForm({ control={form.control} name='config.transport' render={({ field }) => ( - + { @@ -814,6 +759,84 @@ export default function NodeForm({ )} + + + + {t('form.relayMode')} + ( + + + + + + + )} + /> + + {relayMode !== 'none' && ( + + ( + + + { + form.setValue(field.name, value); + }} + /> + + + + )} + /> + + )} + diff --git a/apps/admin/app/dashboard/system/node.tsx b/apps/admin/app/dashboard/system/node.tsx index 0308b83..2719bdc 100644 --- a/apps/admin/app/dashboard/system/node.tsx +++ b/apps/admin/app/dashboard/system/node.tsx @@ -177,7 +177,7 @@ export default function Node() {
- + >({ return (
- {fields.map(({ name, type, options, ...fieldProps }) => ( -
+ {fields.map(({ name, type, options, className, ...fieldProps }) => ( +
{type === 'select' && options ? ( placeholder={fieldProps.placeholder} diff --git a/packages/ui/src/custom-components/enhanced-input.tsx b/packages/ui/src/custom-components/enhanced-input.tsx index 2a6bcdc..6ae90b2 100644 --- a/packages/ui/src/custom-components/enhanced-input.tsx +++ b/packages/ui/src/custom-components/enhanced-input.tsx @@ -77,7 +77,9 @@ export function EnhancedInput({ suppressHydrationWarning > {prefix && ( -
{prefix}
+
+ {prefix} +
)} {suffix && ( -
{suffix}
+
+ {suffix} +
)}
);