react-store-input 0.2.5 → 0.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +114 -0
- package/README.md +179 -201
- package/dist/index.d.mts +128 -11
- package/dist/index.d.ts +128 -11
- package/dist/index.js +559 -249
- package/dist/index.js.map +1 -0
- package/dist/index.mjs +552 -247
- package/dist/index.mjs.map +1 -0
- package/dist/text-editor.d.mts +11 -0
- package/dist/text-editor.d.ts +11 -0
- package/dist/{text_editor.js → text-editor.js} +31 -51
- package/dist/text-editor.js.map +1 -0
- package/dist/text-editor.mjs +90 -0
- package/dist/text-editor.mjs.map +1 -0
- package/package.json +78 -18
- package/dist/create_render.d.mts +0 -9
- package/dist/create_render.d.ts +0 -9
- package/dist/create_render.js +0 -51
- package/dist/create_render.mjs +0 -25
- package/dist/text_editor.d.mts +0 -13
- package/dist/text_editor.d.ts +0 -13
- package/dist/text_editor.mjs +0 -112
- package/dist/use_form_store.d.mts +0 -16
- package/dist/use_form_store.d.ts +0 -16
- package/dist/use_form_store.js +0 -365
- package/dist/use_form_store.mjs +0 -340
- package/dist/use_store_component.d.mts +0 -23
- package/dist/use_store_component.d.ts +0 -23
- package/dist/use_store_component.js +0 -337
- package/dist/use_store_component.mjs +0 -311
- package/dist/use_store_controller.d.mts +0 -11
- package/dist/use_store_controller.d.ts +0 -11
- package/dist/use_store_controller.js +0 -57
- package/dist/use_store_controller.mjs +0 -32
- package/dist/use_store_input.d.mts +0 -22
- package/dist/use_store_input.d.ts +0 -22
- package/dist/use_store_input.js +0 -151
- package/dist/use_store_input.mjs +0 -126
- package/dist/use_store_input_with_name.d.mts +0 -17
- package/dist/use_store_input_with_name.d.ts +0 -17
- package/dist/use_store_input_with_name.js +0 -177
- package/dist/use_store_input_with_name.mjs +0 -150
- package/tsup.config.ts +0 -9
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/index.tsx","../src/store/use_store_controller.tsx","../src/store/create_render.tsx","../src/binding/lens.ts","../src/binding/codec.ts","../src/binding/binding.ts","../src/binding/laws.ts","../src/input/use_store_input.tsx","../src/input/dom_value.ts","../src/input/reset_coordinator.ts","../src/input/value_conversion.ts","../src/input/use_store_input_with_name.tsx","../src/form/store_components.tsx","../src/form/use_form_store.tsx"],"sourcesContent":["export * from \"./store/use_store_controller\";\nexport * from \"./store/create_render\";\nexport * from \"./binding/lens\";\nexport * from \"./binding/codec\";\nexport * from \"./binding/binding\";\nexport * from \"./binding/laws\";\nexport * from \"./input/use_store_input\";\nexport * from \"./input/use_store_input_with_name\";\nexport * from \"./form/store_components\";\nexport * from \"./form/use_form_store\";\nexport { err, ok, type Result } from \"gw-result\";\nexport * from \"gw-store\";\n","import { useCallback, useEffect, useId, useRef } from \"react\";\nimport type { Draft, Immutable } from \"immer\";\nimport type { Store } from \"gw-store\";\n\nexport type StoreControllerProps<TState extends object> = {\n onSubscribe: (state: Immutable<TState>) => void;\n onDispatch: (state: Draft<TState>) => void;\n};\n\nexport function useStoreController<TState extends object>(\n store: Store<TState>,\n props: StoreControllerProps<TState>,\n) {\n const dispatchKey = useId();\n const propsRef = useRef(props);\n const subscribedStoreRef = useRef<Store<TState> | null>(null);\n\n useEffect(() => {\n propsRef.current = props;\n }, [props]);\n\n useEffect(() => {\n const isReplacement =\n subscribedStoreRef.current !== null && subscribedStoreRef.current !== store;\n subscribedStoreRef.current = store;\n\n const unsubscribe = store.subscribe((state, key) => {\n if (key !== dispatchKey) {\n propsRef.current.onSubscribe(state);\n }\n });\n\n if (isReplacement) {\n propsRef.current.onSubscribe(store.state);\n }\n\n return unsubscribe;\n }, [dispatchKey, store]);\n\n const dispatch = useCallback(() => {\n store.dispatch(\n (state) => propsRef.current.onDispatch(state),\n { key: dispatchKey },\n );\n }, [dispatchKey, store]);\n\n return { dispatch };\n}\n","import type { Immutable } from \"immer\";\nimport { useSelector, type EqualityFn, type Store } from \"gw-store\";\nimport type { ReactNode } from \"react\";\n\nexport type CreateRender<TState extends object> = (\n selector: (state: Immutable<TState>) => ReactNode,\n compare?: EqualityFn<Immutable<TState>>,\n) => ReactNode;\n\nexport function createRender<TState extends object>(\n store: Store<TState>,\n selector: (state: Immutable<TState>) => ReactNode,\n compare?: EqualityFn<Immutable<TState>>,\n) {\n function Component() {\n const result = useSelector(store, (state) => state, compare);\n return <>{selector(result)}</>;\n }\n\n return <Component />;\n}\n\nexport function createRenderWithStore<TState extends object>(\n store: Store<TState>,\n): CreateRender<TState> {\n return function createRender(selector, compare) {\n function Component() {\n const result = useSelector(store, (state) => state, compare);\n return <>{selector(result)}</>;\n }\n\n return <Component />;\n };\n}\n","import type { Draft, Immutable } from \"immer\";\n\nexport type Lens<TState extends object, TValue> = {\n get: (state: Immutable<TState>) => TValue;\n set: (state: Draft<TState>, value: TValue) => void;\n};\n\nexport type LensBuilder<TState extends object, TValue> = Lens<\n TState,\n TValue\n> &\n (TValue extends object\n ? {\n prop<TKey extends keyof TValue>(\n key: TKey,\n ): LensBuilder<TState, TValue[TKey]>;\n }\n : object);\n\nexport type StateLens<TState extends object> = {\n prop<TKey extends keyof TState>(\n key: TKey,\n ): LensBuilder<TState, TState[TKey]>;\n};\n\nexport function defineLens<TState extends object, TValue>(\n lens: Lens<TState, TValue>,\n) {\n return lens;\n}\n\nfunction readPath(value: unknown, path: readonly PropertyKey[]) {\n return path.reduce<unknown>(\n (current, key) => (current as Record<PropertyKey, unknown>)[key],\n value,\n );\n}\n\nfunction writePath(\n state: unknown,\n path: readonly PropertyKey[],\n value: unknown,\n) {\n const parent = path\n .slice(0, -1)\n .reduce<Record<PropertyKey, unknown>>(\n (current, key) => current[key] as Record<PropertyKey, unknown>,\n state as Record<PropertyKey, unknown>,\n );\n parent[path.at(-1) as PropertyKey] = value;\n}\n\nfunction createPathLens<TState extends object, TValue>(\n path: readonly PropertyKey[],\n): LensBuilder<TState, TValue> {\n return {\n get: (state: Immutable<TState>) => readPath(state, path) as TValue,\n set: (state: Draft<TState>, value: TValue) => writePath(state, path, value),\n prop: (key: PropertyKey) => createPathLens([...path, key]),\n } as unknown as LensBuilder<TState, TValue>;\n}\n\nexport function stateLens<TState extends object>(): StateLens<TState> {\n return {\n prop: (key) => createPathLens<TState, TState[typeof key]>([key]),\n };\n}\n","import type { Result } from \"gw-result\";\n\nexport type Codec<TValue, TInput, TError = never> = {\n format: (value: TValue) => TInput;\n parse: (input: TInput) => Result<TValue, TError>;\n equals?: (previous: TValue, next: TValue) => boolean;\n};\n\nexport function defineCodec<TValue, TInput, TError = never>(\n codec: Codec<TValue, TInput, TError>,\n) {\n return codec;\n}\n","import type { Codec } from \"./codec\";\nimport type { Lens } from \"./lens\";\n\nexport type InputBinding<\n TState extends object,\n TValue,\n TInput,\n TError = never,\n> = {\n lens: Lens<TState, TValue>;\n codec: Codec<TValue, TInput, TError>;\n};\n\nexport function defineBinding<\n TState extends object,\n TValue,\n TInput,\n TError = never,\n>(binding: InputBinding<TState, TValue, TInput, TError>) {\n return binding;\n}\n","import { produce, type Immutable } from \"immer\";\nimport type { Codec } from \"./codec\";\nimport type { Lens } from \"./lens\";\n\ntype Equality<TValue> = (previous: TValue, next: TValue) => boolean;\n\nfunction structuralEqual(previous: unknown, next: unknown): boolean {\n if (Object.is(previous, next)) {\n return true;\n }\n\n if (previous instanceof Date && next instanceof Date) {\n return previous.getTime() === next.getTime();\n }\n\n if (Array.isArray(previous) && Array.isArray(next)) {\n return (\n previous.length === next.length &&\n previous.every((value, index) => structuralEqual(value, next[index]))\n );\n }\n\n if (\n previous !== null &&\n next !== null &&\n typeof previous === \"object\" &&\n typeof next === \"object\"\n ) {\n const previousRecord = previous as Record<PropertyKey, unknown>;\n const nextRecord = next as Record<PropertyKey, unknown>;\n const previousKeys = Reflect.ownKeys(previousRecord);\n const nextKeys = Reflect.ownKeys(nextRecord);\n\n return (\n previousKeys.length === nextKeys.length &&\n previousKeys.every(\n (key) =>\n Object.prototype.hasOwnProperty.call(nextRecord, key) &&\n structuralEqual(previousRecord[key], nextRecord[key]),\n )\n );\n }\n\n return false;\n}\n\nexport function assertLensLaws<TState extends object, TValue>(\n lens: Lens<TState, TValue>,\n options: {\n state: TState;\n values: readonly TValue[];\n equalsState?: Equality<TState>;\n equalsValue?: Equality<TValue>;\n },\n) {\n const equalsState = options.equalsState ?? structuralEqual;\n const equalsValue = options.equalsValue ?? structuralEqual;\n const set = (state: TState, value: TValue) =>\n produce(state, (draft) => lens.set(draft, value)) as TState;\n\n if (\n !equalsState(\n set(options.state, lens.get(options.state as Immutable<TState>)),\n options.state,\n )\n ) {\n throw new Error(\"Lens law failed: setting the current value changed state.\");\n }\n\n for (const value of options.values) {\n const updated = set(options.state, value);\n\n if (!equalsValue(lens.get(updated as Immutable<TState>), value)) {\n throw new Error(\"Lens law failed: get(set(state, value)) !== value.\");\n }\n }\n\n for (const previous of options.values) {\n for (const next of options.values) {\n if (\n !equalsState(\n set(set(options.state, previous), next),\n set(options.state, next),\n )\n ) {\n throw new Error(\"Lens law failed: the last set did not win.\");\n }\n }\n }\n}\n\nexport function assertCodecLaws<TValue, TInput, TError>(\n codec: Codec<TValue, TInput, TError>,\n options: {\n values: readonly TValue[];\n inputs?: readonly TInput[];\n equals?: Equality<TValue>;\n equalsInput?: Equality<TInput>;\n },\n) {\n const equals = options.equals ?? codec.equals ?? structuralEqual;\n const equalsInput = options.equalsInput ?? structuralEqual;\n\n for (const value of options.values) {\n const result = codec.parse(codec.format(value));\n\n if (result.isErr) {\n throw new Error(\"Codec law failed: parse(format(value)) returned Err.\");\n }\n\n if (!equals(result.value, value)) {\n throw new Error(\"Codec law failed: parse(format(value)) !== value.\");\n }\n }\n\n for (const input of options.inputs ?? []) {\n const result = codec.parse(input);\n\n if (result.isOk && !equalsInput(codec.format(result.value), input)) {\n throw new Error(\n \"Codec law failed: format(parse(input).value) !== input.\",\n );\n }\n }\n}\n","import {\n useCallback,\n useEffect,\n useRef,\n useState,\n type RefObject,\n} from \"react\";\nimport type { Draft } from \"immer\";\nimport type { Store } from \"gw-store\";\nimport type { InputBinding } from \"../binding/binding\";\nimport { useStoreController } from \"../store/use_store_controller\";\nimport {\n equalStateValue,\n readElementValue,\n writeElementValue,\n} from \"./dom_value\";\nimport { isFormResetting, registerResetBinding } from \"./reset_coordinator\";\nimport type {\n BindingInputResult,\n InputControlValue,\n InputDisplayValue,\n StoreInputDomProps,\n StoreInputBindingOptions,\n StoreInputMeta,\n StoreInputOptions,\n} from \"./types\";\nimport { resolveDefaultChecked, resolveDefaultValue } from \"./value_conversion\";\n\nexport type {\n BindingInputResult,\n InputControlValue,\n InputDisplayValue,\n InputStateValue,\n StoreInputBindingOptions,\n StoreInputDomProps,\n StoreInputMeta,\n StoreInputOptions,\n} from \"./types\";\n\ntype StoreElement =\n | HTMLInputElement\n | HTMLTextAreaElement\n | HTMLSelectElement;\n\nfunction isDisplayValue(value: InputControlValue): value is InputDisplayValue {\n return (\n typeof value === \"string\" ||\n typeof value === \"number\" ||\n (Array.isArray(value) && value.every((item) => typeof item === \"string\"))\n );\n}\n\nfunction readControlValue(\n element: StoreElement,\n type: StoreInputOptions<StoreElement>[\"type\"],\n radioValue: InputDisplayValue | undefined,\n): InputControlValue | undefined {\n if (\"files\" in element && type === \"file\") {\n return element.files?.length ? element.files : null;\n }\n\n if (\"checked\" in element && type === \"checkbox\") {\n return element.checked;\n }\n\n if (\"checked\" in element && type === \"radio\") {\n return element.checked ? (radioValue ?? element.value) : undefined;\n }\n\n return readElementValue(element);\n}\n\nexport function useStoreInput<\n TInputElement extends StoreElement,\n TState extends object,\n TValue,\n TInput extends InputControlValue,\n TError,\n>(\n ref: RefObject<TInputElement | null>,\n store: Store<TState>,\n binding: InputBinding<TState, TValue, TInput, TError>,\n options: StoreInputBindingOptions<TInputElement, TValue> = {},\n): BindingInputResult<TInputElement, TError> {\n const props: StoreInputOptions<TInputElement> = options;\n const getStateValue = binding.lens.get;\n const setStoreValue = binding.lens.set;\n const [meta, setMeta] = useState<StoreInputMeta<TError>>({ valid: true });\n const metaRef = useRef<StoreInputMeta<TError>>(meta);\n\n const formatValue = useCallback(\n (value: TValue): InputControlValue => binding.codec.format(value),\n [binding],\n );\n\n const parseValue = useCallback(\n (value: InputControlValue) => binding.codec.parse(value as TInput),\n [binding],\n );\n\n const toChecked = useCallback(\n (value: TValue) =>\n props.type === \"radio\"\n ? Object.is(formatValue(value), props.value)\n : Boolean(formatValue(value)),\n [formatValue, props.type, props.value],\n );\n\n const initialStateValue = getStateValue(store.state);\n const resetValueRef = useRef(\n Object.prototype.hasOwnProperty.call(options, \"resetValue\")\n ? (options.resetValue as TValue)\n : initialStateValue,\n );\n\n const setStateValue = useCallback(\n (state: Draft<TState>, value: TValue) => {\n const equals = binding.codec.equals ?? equalStateValue;\n\n if (equals(getStateValue(store.state), value)) {\n return;\n }\n\n setStoreValue(state, value);\n },\n [binding, getStateValue, setStoreValue, store],\n );\n\n const commitValue = useCallback(\n (state: Draft<TState>, controlValue: InputControlValue) => {\n const result = parseValue(controlValue);\n\n if (result.isErr) {\n const invalidMeta: StoreInputMeta<TError> = {\n valid: false,\n error: result.error,\n };\n metaRef.current = invalidMeta;\n setMeta(invalidMeta);\n return;\n }\n\n const validMeta: StoreInputMeta<TError> = { valid: true };\n metaRef.current = validMeta;\n setMeta((current) => (current.valid ? current : validMeta));\n setStateValue(state, result.value);\n },\n [parseValue, setStateValue],\n );\n\n const writeValue = useCallback(\n (element: TInputElement, value: TValue) => {\n if (\n \"checked\" in element &&\n (props.type === \"checkbox\" || props.type === \"radio\")\n ) {\n element.checked = toChecked(value);\n return;\n }\n\n if (\"files\" in element && props.type === \"file\") {\n return;\n }\n\n const formatted = formatValue(value);\n\n if (isDisplayValue(formatted)) {\n writeElementValue(element, formatted);\n }\n },\n [formatValue, props.type, toChecked],\n );\n\n const { dispatch } = useStoreController(store, {\n onSubscribe: (state) => {\n const element = ref.current;\n\n if (\n !element ||\n !metaRef.current.valid ||\n (element.form && isFormResetting(element.form)) ||\n (props.type !== \"radio\" && props.value !== undefined)\n ) {\n return;\n }\n\n if (\n \"checked\" in element &&\n (props.type === \"checkbox\" || props.type === \"radio\") &&\n props.checked !== undefined\n ) {\n return;\n }\n\n writeValue(element, getStateValue(state));\n },\n onDispatch: (state) => {\n const element = ref.current;\n\n if (!element) {\n return;\n }\n\n const controlValue = readControlValue(element, props.type, props.value);\n\n if (controlValue !== undefined) {\n commitValue(state, controlValue);\n }\n },\n });\n\n useEffect(() => {\n const element = ref.current;\n const form = element?.form;\n\n if (!element || !form) {\n return;\n }\n\n return registerResetBinding(form, store.batch, () => {\n if (!element.isConnected) {\n return;\n }\n\n const resetValue = resetValueRef.current;\n const writeResetValue = () => writeValue(element, resetValue);\n\n writeResetValue();\n const validMeta: StoreInputMeta<TError> = { valid: true };\n metaRef.current = validMeta;\n setMeta((current) => (current.valid ? current : validMeta));\n store.dispatch((state) => setStateValue(state, resetValue));\n\n setTimeout(() => {\n if (element.isConnected) {\n writeResetValue();\n }\n }, 0);\n });\n }, [ref, setStateValue, store, store.batch, writeValue]);\n\n const inputProps: StoreInputDomProps<TInputElement> = {\n defaultValue: resolveDefaultValue(props, initialStateValue, (value) => {\n const formatted = formatValue(value);\n return isDisplayValue(formatted) ? formatted : \"\";\n }),\n defaultChecked: resolveDefaultChecked(\n props,\n initialStateValue,\n toChecked,\n ),\n onChange: (event) => {\n dispatch();\n props.onChange?.(event);\n },\n };\n\n return { inputProps, meta };\n}\n","import type { InputDisplayValue, InputStateValue } from \"./types\";\n\ntype StoreElement =\n | HTMLInputElement\n | HTMLTextAreaElement\n | HTMLSelectElement;\n\nfunction pad(value: number) {\n return String(value).padStart(2, \"0\");\n}\n\nexport function formatDateTimeLocal(value: unknown) {\n const date = new Date(value as string | number | Date);\n\n if (Number.isNaN(date.getTime())) {\n return \"\";\n }\n\n return [\n date.getFullYear(),\n \"-\",\n pad(date.getMonth() + 1),\n \"-\",\n pad(date.getDate()),\n \"T\",\n pad(date.getHours()),\n \":\",\n pad(date.getMinutes()),\n \":\",\n pad(date.getSeconds()),\n ].join(\"\");\n}\n\nexport function readElementValue(element: StoreElement): InputStateValue {\n if (\"options\" in element && element.multiple) {\n return Array.from(element.selectedOptions, (option) => option.value);\n }\n\n return element.value;\n}\n\nexport function writeElementValue(\n element: StoreElement,\n value: InputDisplayValue,\n) {\n if (\"files\" in element && element.type === \"file\") {\n return;\n }\n\n if (\"options\" in element && element.multiple) {\n const selectedValues = new Set(\n (Array.isArray(value) ? value : [value]).map(String),\n );\n\n for (const option of element.options) {\n const selected = selectedValues.has(option.value);\n\n if (option.selected !== selected) {\n option.selected = selected;\n }\n }\n\n return;\n }\n\n const nextValue = String(value);\n\n if (element.value !== nextValue) {\n element.value = nextValue;\n }\n}\n\nexport function equalStateValue(previous: unknown, next: unknown) {\n if (Object.is(previous, next)) {\n return true;\n }\n\n if (previous instanceof Date && next instanceof Date) {\n return Object.is(previous.getTime(), next.getTime());\n }\n\n if (Array.isArray(previous) && Array.isArray(next)) {\n return (\n previous.length === next.length &&\n previous.every((value, index) => Object.is(value, next[index]))\n );\n }\n\n return false;\n}\n","type ResetBatch = (callback: () => void) => unknown;\n\ntype ResetCoordinator = {\n groups: Map<ResetBatch, Set<() => void>>;\n handleReset: () => void;\n};\n\nconst resettingForms = new WeakSet<HTMLFormElement>();\nconst resetCoordinators = new WeakMap<HTMLFormElement, ResetCoordinator>();\n\nexport function isFormResetting(form: HTMLFormElement) {\n return resettingForms.has(form);\n}\n\nexport function registerResetBinding(\n form: HTMLFormElement,\n batch: ResetBatch,\n reset: () => void,\n) {\n let coordinator = resetCoordinators.get(form);\n\n if (!coordinator) {\n const groups = new Map<ResetBatch, Set<() => void>>();\n const handleReset = () => {\n resettingForms.add(form);\n\n // React reset handlers may render and re-register bindings before the\n // browser completes the native reset default action.\n const groupSnapshots = Array.from(groups, ([groupBatch, bindings]) => [\n groupBatch,\n [...bindings],\n ] as const);\n\n setTimeout(() => {\n try {\n for (const [groupBatch, bindings] of groupSnapshots) {\n groupBatch(() => {\n for (const binding of bindings) {\n binding();\n }\n });\n }\n } finally {\n setTimeout(() => resettingForms.delete(form), 0);\n }\n }, 0);\n };\n\n coordinator = { groups, handleReset };\n resetCoordinators.set(form, coordinator);\n form.addEventListener(\"reset\", handleReset);\n }\n\n let bindings = coordinator.groups.get(batch);\n\n if (!bindings) {\n bindings = new Set();\n coordinator.groups.set(batch, bindings);\n }\n\n bindings.add(reset);\n\n return () => {\n const currentCoordinator = resetCoordinators.get(form);\n\n if (!currentCoordinator) {\n return;\n }\n\n const currentBindings = currentCoordinator.groups.get(batch);\n currentBindings?.delete(reset);\n\n if (currentBindings?.size === 0) {\n currentCoordinator.groups.delete(batch);\n }\n\n if (currentCoordinator.groups.size === 0) {\n form.removeEventListener(\"reset\", currentCoordinator.handleReset);\n resetCoordinators.delete(form);\n }\n };\n}\n","import type { HTMLInputTypeAttribute } from \"react\";\nimport { formatDateTimeLocal } from \"./dom_value\";\nimport type {\n InputDisplayValue,\n InputStateValue,\n StoreInputOptions,\n} from \"./types\";\n\nexport function convertToInputValue<TValue>(\n value: TValue,\n type?: HTMLInputTypeAttribute,\n): InputDisplayValue {\n if (value === undefined || value === null) {\n return \"\";\n }\n\n if (type === \"datetime-local\") {\n return formatDateTimeLocal(value);\n }\n\n return Array.isArray(value) ? value.map(String) : String(value);\n}\n\nexport function convertToChecked(\n value: unknown,\n type?: HTMLInputTypeAttribute,\n inputValue?: InputDisplayValue,\n) {\n return type === \"radio\"\n ? value !== undefined && Object.is(value, inputValue)\n : Boolean(value);\n}\n\nexport function convertToStateValue(\n value: InputStateValue,\n type?: HTMLInputTypeAttribute,\n): unknown {\n if (Array.isArray(value)) {\n return value;\n }\n\n if (type === \"number\" || type === \"range\") {\n return value === \"\" ? undefined : Number(value);\n }\n\n if (type === \"datetime-local\") {\n if (value === \"\") {\n return undefined;\n }\n\n const date = new Date(value);\n return Number.isNaN(date.getTime()) ? undefined : date;\n }\n\n return value;\n}\n\nexport function resolveDefaultValue<TInputElement, TValue>(\n props: StoreInputOptions<TInputElement>,\n stateValue: TValue,\n format: (value: TValue) => InputDisplayValue,\n) {\n if (props.type !== \"radio\" && props.value !== undefined) {\n return undefined;\n }\n\n if (props.defaultValue !== undefined) {\n return props.defaultValue;\n }\n\n if (\n props.type === \"checkbox\" ||\n props.type === \"radio\" ||\n props.type === \"file\"\n ) {\n return undefined;\n }\n\n return format(stateValue);\n}\n\nexport function resolveDefaultChecked<\n TInputElement,\n TValue,\n>(\n props: StoreInputOptions<TInputElement>,\n stateValue: TValue,\n toChecked: (value: TValue) => boolean,\n) {\n if (props.checked !== undefined) {\n return undefined;\n }\n\n if (props.defaultChecked !== undefined) {\n return props.defaultChecked;\n }\n\n return props.type === \"checkbox\" || props.type === \"radio\"\n ? toChecked(stateValue)\n : undefined;\n}\n\nexport function resolveResetStateValue<\n TInputElement,\n TValue,\n>(\n props: StoreInputOptions<TInputElement>,\n stateValue: TValue,\n parse: (value: InputStateValue) => TValue,\n): TValue {\n if (props.type === \"checkbox\" && props.defaultChecked !== undefined) {\n return props.defaultChecked as TValue;\n }\n\n if (props.type === \"radio\" && props.defaultChecked) {\n if (props.value !== undefined) {\n return props.value as TValue;\n }\n\n return convertToStateValue(\n String(props.defaultValue ?? \"\"),\n props.type,\n ) as TValue;\n }\n\n if (\n props.type !== \"file\" &&\n props.type !== \"checkbox\" &&\n props.type !== \"radio\" &&\n props.defaultValue !== undefined\n ) {\n const defaultValue = Array.isArray(props.defaultValue)\n ? props.defaultValue.map(String)\n : String(props.defaultValue);\n return parse(defaultValue);\n }\n\n return stateValue;\n}\n","import { useMemo, type RefObject } from \"react\";\nimport { ok } from \"gw-result\";\nimport type { Store } from \"gw-store\";\nimport type { InputBinding } from \"../binding/binding\";\nimport { useStoreInput } from \"./use_store_input\";\nimport type {\n InputControlValue,\n InputStateValue,\n StoreInputOptions,\n} from \"./types\";\nimport {\n convertToInputValue,\n convertToStateValue,\n resolveResetStateValue,\n} from \"./value_conversion\";\n\ntype StoreElement =\n | HTMLInputElement\n | HTMLTextAreaElement\n | HTMLSelectElement;\n\nexport type StoreInputWithNameProps<\n TInputElement,\n TState extends object,\n TName extends keyof TState,\n> = StoreInputOptions<TInputElement> & {\n name: TName;\n};\n\nfunction formatControlValue<TValue>(\n value: TValue,\n type: StoreInputOptions<StoreElement>[\"type\"],\n): InputControlValue {\n if (type === \"checkbox\") {\n return Boolean(value);\n }\n\n if (type === \"radio\" || type === \"file\") {\n return value as InputControlValue;\n }\n\n return convertToInputValue(value, type);\n}\n\nfunction parseControlValue<TValue>(\n value: InputControlValue,\n type: StoreInputOptions<StoreElement>[\"type\"],\n): TValue {\n if (typeof value === \"string\" || Array.isArray(value)) {\n const stateInputValue: InputStateValue = Array.isArray(value)\n ? [...value]\n : value;\n return convertToStateValue(stateInputValue, type) as TValue;\n }\n\n return value as TValue;\n}\n\nexport function useStoreInputWithName<\n TInputElement extends StoreElement,\n TState extends object,\n TName extends keyof TState,\n>(\n ref: RefObject<TInputElement | null>,\n store: Store<TState>,\n props: StoreInputWithNameProps<TInputElement, TState, TName>,\n) {\n type TValue = TState[TName];\n\n const binding = useMemo<\n InputBinding<TState, TValue, InputControlValue, never>\n >(\n () => ({\n lens: {\n get: (state) =>\n (state as Readonly<Record<PropertyKey, unknown>>)[\n props.name as PropertyKey\n ] as TValue,\n set: (state, value) => {\n (state as unknown as Record<PropertyKey, unknown>)[\n props.name as PropertyKey\n ] = value;\n },\n },\n codec: {\n format: (value) => formatControlValue(value, props.type),\n parse: (value) => ok(parseControlValue<TValue>(value, props.type)),\n },\n }),\n [props.name, props.type],\n );\n const initialStateValue = binding.lens.get(store.state);\n const resetValue = resolveResetStateValue(\n props,\n initialStateValue,\n (value) => parseControlValue<TValue>(value, props.type),\n );\n const { inputProps } = useStoreInput(ref, store, binding, {\n ...props,\n resetValue,\n });\n\n return {\n ...inputProps,\n name: String(props.name),\n };\n}\n","import {\n useCallback,\n useRef,\n type InputHTMLAttributes,\n type SelectHTMLAttributes,\n type TextareaHTMLAttributes,\n} from \"react\";\nimport type { Store } from \"gw-store\";\nimport {\n useStoreInputWithName,\n type StoreInputWithNameProps,\n} from \"../input/use_store_input_with_name\";\n\ntype StoreElement =\n | HTMLInputElement\n | HTMLSelectElement\n | HTMLTextAreaElement;\n\ntype ElementAttributes<TElement extends StoreElement> =\n TElement extends HTMLInputElement\n ? InputHTMLAttributes<HTMLInputElement>\n : TElement extends HTMLSelectElement\n ? SelectHTMLAttributes<HTMLSelectElement>\n : TextareaHTMLAttributes<HTMLTextAreaElement>;\n\nexport type StoreInputWithNameComponentProps<\n TElement extends StoreElement,\n TState extends object,\n TName extends keyof TState,\n> = StoreInputWithNameProps<TElement, TState, TName> &\n Omit<\n ElementAttributes<TElement>,\n keyof StoreInputWithNameProps<TElement, TState, TName>\n >;\n\nexport type StoreComponentPropsWithStore<\n TElement extends StoreElement,\n TState extends object,\n TName extends keyof TState,\n> = StoreInputWithNameComponentProps<TElement, TState, TName> & {\n store: Store<TState>;\n};\n\nexport function Input<TState extends object, TName extends keyof TState>({\n store,\n ...props\n}: StoreComponentPropsWithStore<HTMLInputElement, TState, TName>) {\n const ref = useRef<HTMLInputElement | null>(null);\n const storeProps = useStoreInputWithName(ref, store, props);\n\n return <input ref={ref} {...props} {...storeProps} />;\n}\n\nexport function Select<TState extends object, TName extends keyof TState>({\n store,\n ...props\n}: StoreComponentPropsWithStore<HTMLSelectElement, TState, TName>) {\n const ref = useRef<HTMLSelectElement | null>(null);\n const storeProps = useStoreInputWithName(ref, store, props);\n\n return <select ref={ref} {...props} {...storeProps} />;\n}\n\nexport function Textarea<TState extends object, TName extends keyof TState>({\n store,\n ...props\n}: StoreComponentPropsWithStore<HTMLTextAreaElement, TState, TName>) {\n const ref = useRef<HTMLTextAreaElement | null>(null);\n const storeProps = useStoreInputWithName(ref, store, props);\n\n return <textarea ref={ref} {...props} {...storeProps} />;\n}\n\nexport function useStoreComponent<TState extends object>(store: Store<TState>) {\n const input = useCallback(\n function Component<TName extends keyof TState>(\n props: StoreInputWithNameComponentProps<\n HTMLInputElement,\n TState,\n TName\n >,\n ) {\n return <Input store={store} {...props} />;\n },\n [store],\n );\n\n const select = useCallback(\n function Component<TName extends keyof TState>(\n props: StoreInputWithNameComponentProps<\n HTMLSelectElement,\n TState,\n TName\n >,\n ) {\n return <Select store={store} {...props} />;\n },\n [store],\n );\n\n const textarea = useCallback(\n function Component<TName extends keyof TState>(\n props: StoreInputWithNameComponentProps<\n HTMLTextAreaElement,\n TState,\n TName\n >,\n ) {\n return <Textarea store={store} {...props} />;\n },\n [store],\n );\n\n return { input, select, textarea };\n}\n","import { useStore, type Store } from \"gw-store\";\nimport {\n createRenderWithStore,\n type CreateRender,\n} from \"../store/create_render\";\nimport { useStoreComponent } from \"./store_components\";\n\nexport type FormStore<TState extends object> = Store<TState> &\n ReturnType<typeof useStoreComponent<TState>> & {\n render: CreateRender<TState>;\n };\n\nexport function useFormStore<TState extends object>(\n initialState: TState,\n): FormStore<TState> {\n const store = useStore<TState>(initialState);\n const storeComponent = useStoreComponent<TState>(store);\n\n return {\n get state() {\n return store.state;\n },\n dispatch: store.dispatch,\n batch: store.batch,\n subscribe: store.subscribe,\n render: createRenderWithStore<TState>(store),\n ...storeComponent,\n };\n}\n"],"mappings":"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","names":["createRender","import_react","bindings","import_react","import_react","import_jsx_runtime","import_gw_store","import_gw_result"]}
|