From 1c9c337d3fcf6146e521e45c34ddd2b7c441d45d Mon Sep 17 00:00:00 2001 From: Kawa Date: Fri, 27 Mar 2026 09:29:51 +0100 Subject: [PATCH] feat(03-02): create FieldRenderer and AzureAuthToggle - FieldRenderer: registry-driven input renderer (text, password, select, hidden provider) - AzureAuthToggle: segmented SAS/Key toggle, defaults to SAS, both fields always registered via CSS show/hide - Both fields preserved on toggle (no conditional rendering that would lose react-hook-form state) --- src/components/ui/FieldRenderer.tsx | 82 +++++++++++++++++++++++ src/components/wizard/AzureAuthToggle.tsx | 70 +++++++++++++++++++ 2 files changed, 152 insertions(+) create mode 100644 src/components/ui/FieldRenderer.tsx create mode 100644 src/components/wizard/AzureAuthToggle.tsx diff --git a/src/components/ui/FieldRenderer.tsx b/src/components/ui/FieldRenderer.tsx new file mode 100644 index 0000000..f86ef55 --- /dev/null +++ b/src/components/ui/FieldRenderer.tsx @@ -0,0 +1,82 @@ +import type { UseFormRegister, FieldError } from 'react-hook-form'; +import type { FieldDef } from '../../schemas/registry'; +import { PasswordField } from './PasswordField'; + +interface FieldRendererProps { + field: FieldDef; + register: UseFormRegister; + error?: FieldError; +} + +export function FieldRenderer({ field, register, error }: FieldRendererProps) { + // provider field: single-option select — hide from UI, auto-register with default value + if (field.key === 'provider' && field.options?.length === 1) { + return ( + + ); + } + + if (field.inputType === 'password') { + return ( + + ); + } + + if (field.inputType === 'select' && field.options) { + return ( +
+ + + {field.helpText && !error &&

{field.helpText}

} + {error &&

{error.message}

} +
+ ); + } + + // text (default) + return ( +
+ + + {field.helpText && !error &&

{field.helpText}

} + {error &&

{error.message}

} +
+ ); +} diff --git a/src/components/wizard/AzureAuthToggle.tsx b/src/components/wizard/AzureAuthToggle.tsx new file mode 100644 index 0000000..845d0fa --- /dev/null +++ b/src/components/wizard/AzureAuthToggle.tsx @@ -0,0 +1,70 @@ +import { useState } from 'react'; +import type { UseFormRegister, FieldError } from 'react-hook-form'; +import { PasswordField } from '../ui/PasswordField'; + +type AuthMethod = 'sas' | 'key'; + +interface AzureAuthToggleProps { + register: UseFormRegister; + errors: { + key?: FieldError; + sas_url?: FieldError; + }; +} + +export function AzureAuthToggle({ register, errors }: AzureAuthToggleProps) { + const [authMethod, setAuthMethod] = useState('sas'); + + return ( +
+ {/* Segmented control */} +
+ + +
+ + {/* Both fields always registered — only active one visible via CSS */} +
+ +
+
+ +
+
+ ); +}