-
-
Notifications
You must be signed in to change notification settings - Fork 57
/
Copy pathgetElementInput.ts
69 lines (62 loc) · 1.69 KB
/
getElementInput.ts
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
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
import { untrack } from 'solid-js';
import type {
FieldElement,
FieldPath,
FieldPathValue,
FieldType,
FieldValues,
InternalFieldStore,
Maybe,
} from '../types';
/**
* Returns the current input of the element.
*
* @param element The field element.
* @param field The store of the field.
* @param type The data type to capture.
*
* @returns The element input.
*/
export function getElementInput<
TFieldValues extends FieldValues,
TFieldName extends FieldPath<TFieldValues>,
>(
element: FieldElement,
field: InternalFieldStore<TFieldValues, TFieldName>,
type: Maybe<FieldType<any>>
): FieldPathValue<TFieldValues, TFieldName> {
const { checked, files, options, value, valueAsDate, valueAsNumber } =
element as HTMLInputElement & HTMLSelectElement & HTMLTextAreaElement;
return untrack(() => {
if (!type || type === 'string') {
return value;
}
if (type === 'string[]') {
return options
? [...options]
.filter((e) => e.selected && !e.disabled)
.map((e) => e.value)
: checked
? [...((field.value.get() || []) as string[]), value]
: ((field.value.get() || []) as string[]).filter((v) => v !== value);
}
if (type === 'number') {
if (element instanceof HTMLSelectElement) {
return value ? parseFloat(value) : undefined;
}
return valueAsNumber;
}
if (type === 'boolean') {
return checked;
}
if (type === 'File') {
return files ? files[0] : undefined;
}
if (type === 'File[]') {
return files ? [...files] : undefined;
}
if (type === 'Date') {
return valueAsDate;
}
}) as FieldPathValue<TFieldValues, TFieldName>;
}