Skip to content

Commit 30444ce

Browse files
committed
Destructure React
1 parent bfcc68b commit 30444ce

File tree

3 files changed

+461
-449
lines changed

3 files changed

+461
-449
lines changed

src/index.ts

Lines changed: 37 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,17 @@
1-
import * as React from "react";
1+
import {
2+
MutableRefObject,
3+
ReactElement,
4+
SetStateAction,
5+
useEffect,
6+
useLayoutEffect,
7+
useMemo,
8+
useReducer,
9+
useRef,
10+
} from "react";
211
import { useSyncExternalStore } from "use-sync-external-store/shim";
312

413
// For server-side rendering / react-native
5-
const useIsoLayoutEffect = typeof window === "undefined" ? React.useEffect : React.useLayoutEffect;
14+
const useIsoLayoutEffect = typeof window === "undefined" ? useEffect : useLayoutEffect;
615

716
type AnyRecord = Record<string, unknown>;
817

@@ -54,22 +63,22 @@ export type Form<Values extends AnyRecord, ErrorMessage = string> = {
5463
name: N;
5564
children: (
5665
props: FieldState<Values[N], ErrorMessage> & {
57-
ref: React.MutableRefObject<any>;
66+
ref: MutableRefObject<any>;
5867
onChange: (value: Values[N]) => void;
5968
onBlur: () => void;
6069
focusNextField: () => void;
6170
},
62-
) => React.ReactElement | null;
63-
}) => React.ReactElement | null) & {
71+
) => ReactElement | null;
72+
}) => ReactElement | null) & {
6473
displayName?: string;
6574
};
6675

6776
FieldsListener: (<N extends keyof Values>(props: {
6877
names: N[];
6978
children: (states: {
7079
[N1 in N]: FieldState<Values[N1], ErrorMessage>;
71-
}) => React.ReactElement | null;
72-
}) => React.ReactElement | null) & {
80+
}) => ReactElement | null;
81+
}) => ReactElement | null) & {
7382
displayName?: string;
7483
};
7584

@@ -156,16 +165,16 @@ export const useForm = <Values extends AnyRecord, ErrorMessage = string>(
156165
type Contract = Form<Values, ErrorMessage>;
157166
type Name = keyof Values;
158167

159-
const [, forceUpdate] = React.useReducer(() => [], []);
160-
const mounted = React.useRef(false);
161-
const config = React.useRef(fields);
162-
const formStatus = React.useRef<FormStatus>("untouched");
168+
const [, forceUpdate] = useReducer(() => [], []);
169+
const mounted = useRef(false);
170+
const config = useRef(fields);
171+
const formStatus = useRef<FormStatus>("untouched");
163172

164173
useIsoLayoutEffect(() => {
165174
config.current = fields;
166175
});
167176

168-
React.useEffect(() => {
177+
useEffect(() => {
169178
mounted.current = true;
170179

171180
return () => {
@@ -185,22 +194,22 @@ export const useForm = <Values extends AnyRecord, ErrorMessage = string>(
185194
}>;
186195
};
187196

188-
const states = React.useRef() as React.MutableRefObject<StateMap>;
197+
const states = useRef() as MutableRefObject<StateMap>;
189198

190199
type CallbackMap = Record<Name, Set<() => void>>;
191200
type MountedMap = Record<Name, boolean>;
192-
type RefMap = Record<Name, React.MutableRefObject<any>>;
201+
type RefMap = Record<Name, MutableRefObject<any>>;
193202
type TimeoutMap = Record<Name, number | undefined>;
194203

195-
const callbacks = React.useRef() as React.MutableRefObject<CallbackMap>;
196-
const mounteds = React.useRef() as React.MutableRefObject<MountedMap>;
197-
const refs = React.useRef() as React.MutableRefObject<RefMap>;
198-
const timeouts = React.useRef() as React.MutableRefObject<TimeoutMap>;
204+
const callbacks = useRef() as MutableRefObject<CallbackMap>;
205+
const mounteds = useRef() as MutableRefObject<MountedMap>;
206+
const refs = useRef() as MutableRefObject<RefMap>;
207+
const timeouts = useRef() as MutableRefObject<TimeoutMap>;
199208

200-
const field = React.useRef() as React.MutableRefObject<Contract["Field"]>;
201-
const fieldsListener = React.useRef() as React.MutableRefObject<Contract["FieldsListener"]>;
209+
const field = useRef() as MutableRefObject<Contract["Field"]>;
210+
const fieldsListener = useRef() as MutableRefObject<Contract["FieldsListener"]>;
202211

203-
const api = React.useMemo(() => {
212+
const api = useMemo(() => {
204213
const getDebounceInterval = (name: Name) => config.current[name].debounceInterval ?? 0;
205214
const getEqualityFn = (name: Name) => config.current[name].equalityFn ?? Object.is;
206215
const getInitialValue = (name: Name) => extractInitialValue(config.current[name].initialValue);
@@ -213,9 +222,7 @@ export const useForm = <Values extends AnyRecord, ErrorMessage = string>(
213222

214223
const setState = <N extends Name>(
215224
name: N,
216-
state: React.SetStateAction<
217-
{ value: Values[N] } & Pick<StateMap[N], "talkative" | "validity">
218-
>,
225+
state: SetStateAction<{ value: Values[N] } & Pick<StateMap[N], "talkative" | "validity">>,
219226
) => {
220227
const currentState = states.current[name];
221228

@@ -649,7 +656,7 @@ export const useForm = <Values extends AnyRecord, ErrorMessage = string>(
649656
}
650657

651658
const Field: Contract["Field"] = ({ name, children }) => {
652-
const { subscribe, getSnapshot } = React.useMemo(
659+
const { subscribe, getSnapshot } = useMemo(
653660
() => ({
654661
getSnapshot: () => states.current[name],
655662
subscribe: (callback: () => void): (() => void) => {
@@ -665,7 +672,7 @@ export const useForm = <Values extends AnyRecord, ErrorMessage = string>(
665672

666673
useSyncExternalStore(subscribe, getSnapshot, getSnapshot);
667674

668-
React.useEffect(() => {
675+
useEffect(() => {
669676
const isFirstMounting = !mounteds.current[name];
670677

671678
if (isFirstMounting) {
@@ -688,17 +695,17 @@ export const useForm = <Values extends AnyRecord, ErrorMessage = string>(
688695
return children({
689696
...api.getFieldState(name),
690697
ref: refs.current[name],
691-
focusNextField: React.useMemo(() => api.getFocusNextField(name), [name]),
692-
onBlur: React.useMemo(() => api.getOnBlur(name), [name]),
693-
onChange: React.useMemo(() => api.getOnChange(name), [name]),
698+
focusNextField: useMemo(() => api.getFocusNextField(name), [name]),
699+
onBlur: useMemo(() => api.getOnBlur(name), [name]),
700+
onChange: useMemo(() => api.getOnChange(name), [name]),
694701
});
695702
};
696703

697704
Field.displayName = "Field";
698705
field.current = Field;
699706

700707
const FieldsListener: Contract["FieldsListener"] = ({ names, children }) => {
701-
const { subscribe, getSnapshot } = React.useMemo(
708+
const { subscribe, getSnapshot } = useMemo(
702709
() => ({
703710
getSnapshot: () => JSON.stringify(names.map((name) => states.current[name])),
704711
subscribe: (callback: () => void): (() => void) => {

website/package.json

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -8,13 +8,13 @@
88
},
99
"dependencies": {
1010
"@chakra-ui/icons": "^2.0.19",
11-
"@chakra-ui/react": "^2.7.1",
12-
"@chakra-ui/system": "^2.5.8",
13-
"@emotion/react": "^11.11.1",
14-
"@emotion/styled": "^11.11.0",
11+
"@chakra-ui/react": "^2.6.0",
12+
"@chakra-ui/system": "^2.5.6",
13+
"@emotion/react": "^11.10.8",
14+
"@emotion/styled": "^11.10.8",
1515
"@swan-io/chicane": "^1.4.0",
1616
"card-validator": "^8.1.1",
17-
"framer-motion": "^10.12.16",
17+
"framer-motion": "^10.12.7",
1818
"react": "^18.2.0",
1919
"react-dom": "^18.2.0",
2020
"react-ux-form": "file:../",
@@ -23,8 +23,8 @@
2323
"validator": "^13.9.0"
2424
},
2525
"devDependencies": {
26-
"@types/react": "^18.2.13",
27-
"@types/react-dom": "^18.2.6",
26+
"@types/react": "^18.2.0",
27+
"@types/react-dom": "^18.2.1",
2828
"@types/validator": "^13.7.17",
2929
"@vitejs/plugin-react-swc": "^3.3.2",
3030
"typescript": "^5.1.3",

0 commit comments

Comments
 (0)