-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathselect.tsx
35 lines (31 loc) · 898 Bytes
/
select.tsx
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
import { batch } from "@preact/signals-react";
import { forwardRef, useCallback } from "react";
import type { ChangeEventHandler, SelectHTMLAttributes } from "react";
import { useField } from "~/use-field";
export type SelectProps = SelectHTMLAttributes<HTMLSelectElement> & {
name: string;
};
export const Select = forwardRef<HTMLSelectElement, SelectProps>(
({ name, onChange, ...props }, ref) => {
let field = useField<string>(name, { defaultValue: "" });
let onChangeHandler: ChangeEventHandler<HTMLSelectElement> = useCallback(
(e) => {
onChange?.(e);
batch(() => {
field.setData(e.target.value);
field.setTouched();
});
},
[]
);
return (
<select
ref={ref}
{...props}
name={field.name}
value={field.data.value}
onChange={onChangeHandler}
/>
);
}
);