diff --git a/src/Former/index.ts b/src/Former/index.ts index 1966bf2..447ae54 100644 --- a/src/Former/index.ts +++ b/src/Former/index.ts @@ -4,3 +4,4 @@ export { FormerButtonArea } from './FormerButtonArea'; export { FormerResolveSpecAPI } from './FormerResolveSpecAPI'; export { FormerRestHeadSpecAPI } from './FormerRestHeadSpecAPI'; export { FormerDialog, FormerModel, FormerPopover } from './FormerWrappers'; +export { useFormerState } from './use-former-state'; diff --git a/src/Former/use-former-state.tsx b/src/Former/use-former-state.tsx new file mode 100644 index 0000000..c7f1321 --- /dev/null +++ b/src/Former/use-former-state.tsx @@ -0,0 +1,38 @@ +import type { FieldValues } from 'react-hook-form'; + +import { useState } from 'react'; + +import type { FormerProps } from './Former.types'; + +export type UseFormerStateProps = Pick< + FormerProps, + 'onChange' | 'onClose' | 'opened' | 'primeData' | 'request' | 'values' +>; + +export const useFormerState = ( + options?: Partial> +) => { + const [state, setState] = useState>>({ + onChange: options?.onChange, + onClose: options?.onClose ?? (() => setState((cv) => ({ ...cv, opened: false }))), + opened: options?.opened ?? false, + primeData: options?.primeData ?? options?.values, + request: options?.request ?? 'insert', + values: options?.values, + }); + + const updateState = (updates: Partial>) => { + setState((prev) => ({ ...prev, ...updates })); + }; + + const { onChange, onClose, opened, ...formerProps } = state; + + return { + former: { ...formerProps, onChange, onClose, opened }, + formerWrapper: { onClose, opened }, + open: (request: UseFormerStateProps['request'], data: UseFormerStateProps['values']) => { + setState((cv) => ({ ...cv, opened: true, primeData: data, request, values: data })); + }, + updateState, + }; +};