feat(06-03): extend RemoteConfigStep for all 7 backends

- Add SftpAuthToggle import
- Extend backendLabel record to cover onedrive/sftp/gcs/b2
- Add sftp branch with host/user FieldRenderers + SftpAuthToggle
- onedrive/gcs/b2 render via existing registry loop (no custom branch)
- Full Vitest suite green (147 tests); zero TypeScript errors
This commit is contained in:
2026-03-31 08:53:12 +02:00
parent 7e9bdd8343
commit 09adff0e67
+28 -1
View File
@@ -9,6 +9,7 @@ import { BACKEND_REGISTRY } from '../../schemas/registry';
import { BACKEND_SCHEMAS } from '../../schemas'; import { BACKEND_SCHEMAS } from '../../schemas';
import { FieldRenderer } from '../ui/FieldRenderer'; import { FieldRenderer } from '../ui/FieldRenderer';
import { AzureAuthToggle } from './AzureAuthToggle'; import { AzureAuthToggle } from './AzureAuthToggle';
import { SftpAuthToggle } from './SftpAuthToggle';
import type { FieldError } from 'react-hook-form'; import type { FieldError } from 'react-hook-form';
export function RemoteConfigStep() { export function RemoteConfigStep() {
@@ -45,6 +46,10 @@ export function RemoteConfigStep() {
azureblob: 'Azure Blob Storage', azureblob: 'Azure Blob Storage',
s3: 'Amazon S3', s3: 'Amazon S3',
's3-compatible': 'S3-Compatible Storage', 's3-compatible': 'S3-Compatible Storage',
onedrive: 'OneDrive',
sftp: 'SFTP',
gcs: 'Google Cloud Storage',
b2: 'Backblaze B2',
}; };
return ( return (
@@ -68,8 +73,30 @@ export function RemoteConfigStep() {
}} }}
/> />
</> </>
) : backendType === 'sftp' ? (
<>
{/* host and user via FieldRenderer */}
<FieldRenderer
field={BACKEND_REGISTRY.sftp.fields.find(f => f.key === 'host')!}
register={register}
error={errors.host as FieldError | undefined}
/>
<FieldRenderer
field={BACKEND_REGISTRY.sftp.fields.find(f => f.key === 'user')!}
register={register}
error={errors.user as FieldError | undefined}
/>
{/* Auth toggle handles pass + key_pem — both always registered */}
<SftpAuthToggle
register={register}
errors={{
pass: errors.pass as FieldError | undefined,
key_pem: errors.key_pem as FieldError | undefined,
}}
/>
</>
) : ( ) : (
/* S3 and S3-compatible: full registry loop — FieldRenderer handles provider hiding */ /* All others (onedrive, gcs, b2, s3, s3-compatible): full registry loop */
BACKEND_REGISTRY[backendType].fields.map(field => ( BACKEND_REGISTRY[backendType].fields.map(field => (
<FieldRenderer <FieldRenderer
key={field.key} key={field.key}