import type { DomainPreferenceForm, PreferenceField } from '../utils/api' type Props = { form: DomainPreferenceForm values: Record onChange: (values: Record) => void } function asArray(value: unknown): string[] { if (Array.isArray(value)) return value.map(String) if (typeof value === 'string' && value.trim()) { return value.split(',').map(part => part.trim()).filter(Boolean) } return [] } /** * Generic renderer for a server-generated preference form. Adding a domain's * form is a backend data change; this component renders whatever fields arrive. */ export default function PreferenceForm({ form, values, onChange }: Props) { const setValue = (key: string, value: unknown) => onChange({ ...values, [key]: value }) return (
{form.fields.map(field => (
{renderField(field, values[field.key], setValue)}
))}
) } function renderField( field: PreferenceField, value: unknown, setValue: (key: string, value: unknown) => void, ) { if (field.type === 'multiselect') { const selected = asArray(value) return (
{field.options.map(option => { const active = selected.includes(option) return ( ) })}
) } if (field.type === 'select') { return ( ) } // text (default) return ( setValue(field.key, e.target.value)} style={inputStyle} /> ) } function chipStyle(active: boolean): React.CSSProperties { return { padding: '4px 10px', borderRadius: 999, border: `1px solid ${active ? 'var(--primary, #e8742c)' : 'var(--border, #ddd)'}`, background: active ? 'var(--primary, #e8742c)' : 'transparent', color: active ? '#fff' : 'inherit', cursor: 'pointer', fontSize: 13, } } const inputStyle: React.CSSProperties = { width: '100%', padding: '8px 10px', borderRadius: 8, border: '1px solid var(--border, #ddd)', background: 'var(--bg, #fff)', color: 'inherit', fontSize: 14, }