-
Notifications
You must be signed in to change notification settings - Fork 103
Expand file tree
/
Copy pathuseFormFieldValueAdapters.ts
More file actions
33 lines (28 loc) · 1.17 KB
/
useFormFieldValueAdapters.ts
File metadata and controls
33 lines (28 loc) · 1.17 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
import { useMemo, useRef } from 'react';
import useSWRImmutable from 'swr/immutable';
import { type FormField, type FormFieldValueAdapter } from '../types';
import { getRegisteredFieldValueAdapter } from '../registry/registry';
export const useFormFieldValueAdapters = (fields: FormField[]) => {
const typesKey = useMemo(() => {
const uniqueTypes = new Set<string>();
fields.forEach((field) => uniqueTypes.add(field.type));
return Array.from(uniqueTypes).sort().join(',');
}, [fields]);
const adaptersRef = useRef<Record<string, FormFieldValueAdapter>>({});
const { data: adapters } = useSWRImmutable(
typesKey ? ['formFieldValueAdapters', typesKey] : null,
async ([, key]) => {
const types = key.split(',');
const loadedAdapters = await Promise.all(types.map((type) => getRegisteredFieldValueAdapter(type)));
const adaptersByType: Record<string, FormFieldValueAdapter> = {};
types.forEach((type, index) => {
adaptersByType[type] = loadedAdapters[index];
});
return adaptersByType;
},
);
if (adapters && adapters !== adaptersRef.current) {
adaptersRef.current = adapters;
}
return adaptersRef.current;
};