1 line
8.2 KiB
Plaintext
1 line
8.2 KiB
Plaintext
|
{"version":3,"file":"react-final-form-arrays.umd.min.js","sources":["../src/defaultIsEqual.js","../src/useConstant.js","../src/useFieldArray.js","../src/FieldArray.js","../src/renderComponent.js"],"sourcesContent":["// @flow\nconst defaultIsEqual = (aArray: any[], bArray: any[]) =>\n aArray === bArray ||\n (Array.isArray(aArray) &&\n Array.isArray(bArray) &&\n aArray.length === bArray.length &&\n !aArray.some((a, index) => a !== bArray[index]))\n\nexport default defaultIsEqual\n","// @flow\nimport React from 'react'\n\n/**\n * A simple hook to create a constant value that lives for\n * the lifetime of the component.\n *\n * Plagiarized from https://github.com/Andarist/use-constant\n *\n * Do NOT reuse this code unless you know what you're doing.\n * Use Andarist's hook; it's more fault tolerant to things like\n * falsy values.\n *\n * @param {Function} init - A function to generate the value\n */\nexport default function useConstant<T>(init: () => T): T {\n const ref = React.useRef<?T>()\n if (!ref.current) {\n ref.current = init()\n }\n return ref.current\n}\n","// @flow\nimport { useForm, useField } from 'react-final-form'\nimport { fieldSubscriptionItems, ARRAY_ERROR } from 'final-form'\nimport type { Mutators } from 'final-form-arrays'\nimport type { FieldValidator, FieldSubscription } from 'final-form'\nimport type { FieldArrayRenderProps, UseFieldArrayConfig } from './types'\nimport defaultIsEqual from './defaultIsEqual'\nimport useConstant from './useConstant'\n\nconst all: FieldSubscription = fieldSubscriptionItems.reduce((result, key) => {\n result[key] = true\n return result\n}, {})\n\nconst useFieldArray = (\n name: string,\n {\n subscription = all,\n defaultValue,\n initialValue,\n isEqual = defaultIsEqual,\n validate: validateProp\n }: UseFieldArrayConfig = {}\n): FieldArrayRenderProps => {\n const form = useForm('useFieldArray')\n\n const formMutators: Mutators = form.mutators\n const hasMutators = !!(formMutators && formMutators.push && formMutators.pop)\n if (!hasMutators) {\n throw new Error(\n 'Array mutators not found. You need to provide the mutators from final-form-arrays to your form'\n )\n }\n const mutators = useConstant<Mutators>(() =>\n // curry the field name onto all mutator calls\n Object.keys(formMutators).reduce((result, key) => {\n result[key] = (...args) => formMutators[key](name, ...args)\n return result\n }, {})\n )\n\n const validate: FieldValidator = useConstant(\n () => (value, allValues, meta) => {\n if (!validateProp) return undefined\n const error = validateProp(value, allValues, meta)\n if (!error || Array.isArray(error)) {\n return error\n } else {\n const arrayError = []\n // gross, but we have to set a string key on the array\n ;((arrayError: any): Object)[ARRAY_ERROR] = error\n return arrayError\n }\n }\n )\n\n const {\n meta: { length, ...meta },\n input,\n ...fieldState\n } = useField(name, {\n subscription: { ...subscription, length: true },\n defaultValue,\n initialValue,\n isEqual,\n validate,\n format: v => v\n })\n\n const forEach = (iterator: (name: string, index: number) => void): void => {\n // required || for Flow, but results in uncovered line in Jest/Istanbul\n // istanbul ignore next\n const len = length || 0\n for (let i = 0; i < len; i++) {\n iterator(`${name}[${i}]`, i)\n }\n }\n\n const map = (iterator: (name: string, index: number) => any): any[] => {\n // required || for Flow, but results in uncovered line in Jest/Istanbul\n // istanbul ignore next\n const len = length || 0\n const results: any[] = []\n for (let i = 0; i < len; i++) {\n results.push(iterator(`${name}[${i}]`, i))\n }\n return results\n }\n\n return {\n fields: {\n name,\n forEach,\n length: length || 0,\n map,\n ...mutators,\n ...fieldState,\n value: input.value\n },\n meta\n }\n}\n\nexport default useFieldArray\n","// @flow\
|