UNPKG

@formkit/inertia

Version:
1 lines 11.8 kB
{"version":3,"sources":["../src/inertia.ts","../src/eventManager.ts","../src/addons/formkit.ts","../src/addons/state.ts"],"sourcesContent":["import type { FormKitNode } from '@formkit/core';\nimport type { Method, VisitOptions, RequestPayload } from '@inertiajs/core';\n\nimport { router } from '@inertiajs/vue3';\nimport { toRefs } from 'vue';\nimport { createEventManager } from './eventManager';\nimport { createFormkitAddon, createStateAddon } from './addons/index';\n\nexport type AddonExtension = (on: ReturnType<typeof createEventManager>['on']) => void;\nexport interface UseFormOptions {\n recentlySuccessfulTimeoutTime?: number;\n formLevelErrorName?: string;\n};\n\nexport const useForm = <F extends RequestPayload>(initialFields?: F, options?: UseFormOptions) => {\n const eventManager = createEventManager();\n const { state: addonState, addon: stateAddon } = createStateAddon(options?.recentlySuccessfulTimeoutTime);\n const { state: formkitState, addon: formkitAddon, plugin } = createFormkitAddon(initialFields, options?.formLevelErrorName);\n\n const addon = (addons: AddonExtension | AddonExtension[]) => {\n if (Array.isArray(addons)) addons.forEach((cb) => cb(eventManager.on));\n else addons(eventManager.on);\n };\n\n addon(stateAddon);\n addon(formkitAddon);\n\n let _cancelToken: {\n cancel: () => void;\n } | undefined = undefined;\n\n addon((on) => {\n on('cancelToken', (token) => {\n _cancelToken = token;\n });\n\n on('finish', () => {\n _cancelToken = undefined;\n });\n });\n\n const submit = (method: Method, url: URL | string, options?: Exclude<VisitOptions, 'method' | 'data'>) => (data: F, node: FormKitNode) => {\n const callbackEvents = (Object.keys(eventManager.events) as (keyof typeof eventManager.events)[]).map((name) => ({\n [`on${name.charAt(0).toUpperCase() + name.slice(1)}`]: (arg: any) => {\n if (name === 'cancel') return eventManager.run(name, arg);\n\n return eventManager.run(name, arg, node);\n }\n })).reduce((p, c) => ({ ...p, ...c }), {});\n\n if (method === 'delete') {\n router.delete(url, {\n ...callbackEvents,\n ...options,\n data\n });\n } else {\n router[method](url, data, {\n ...callbackEvents,\n ...options,\n });\n }\n };\n\n return {\n submit,\n\n get: (url: URL | string, options?: Exclude<VisitOptions, 'method' | 'data'>) => submit('get', url, options),\n post: (url: URL | string, options?: Exclude<VisitOptions, 'method' | 'data'>) => submit('post', url, options),\n put: (url: URL | string, options?: Exclude<VisitOptions, 'method' | 'data'>) => submit('put', url, options),\n patch: (url: URL | string, options?: Exclude<VisitOptions, 'method' | 'data'>) => submit('patch', url, options),\n delete: (url: URL | string, options?: Exclude<VisitOptions, 'method' | 'data'>) => submit('delete', url, options),\n\n cancel: () => {\n if (_cancelToken) _cancelToken.cancel();\n },\n\n ...toRefs(addonState),\n ...toRefs(formkitState),\n\n on: eventManager.on,\n addon,\n\n plugin,\n }\n};\n","import type { FormKitNode } from '@formkit/core';\nimport type { GlobalEventsMap } from '@inertiajs/core';\n\nexport type EventCallback = {\n [K in keyof Omit<GlobalEventsMap, 'navigate' | 'invalid' | 'exception'>]\n : (...args: [...GlobalEventsMap[K]['parameters'], ...[node: FormKitNode]])\n => K extends 'success' | 'error'\n ? Promise<GlobalEventsMap[K]['result']> | GlobalEventsMap[K]['result']\n : GlobalEventsMap[K]['result'];\n} & {\n cancelToken: (...args: [{ cancel: () => void }, ...[node: FormKitNode]]) => void;\n};\n\nexport const createEventManager = () => {\n const events: Partial<{\n [K in keyof EventCallback]: EventCallback[K][];\n }> = {};\n\n const on = <T extends keyof EventCallback>(name: T, cb: EventCallback[T]) => {\n if (typeof events[name] === 'undefined') events[name] = [];\n\n events[name]?.push(cb);\n };\n\n const run = (name: keyof EventCallback, ...args: any): Promise<void> | void | boolean => {\n let promiseResolver = Promise.resolve();\n\n for (const event of events[name] || []) {\n const res = event(...args);\n\n if (name === 'before' && typeof res === 'boolean') return res;\n else if (name === 'success' || name === 'finish') {\n if (res instanceof Promise) {\n promiseResolver = res;\n } else {\n promiseResolver = Promise.resolve(res);\n }\n }\n }\n\n if (name === 'success' || name === 'finish') return promiseResolver;\n };\n\n return {\n events,\n on,\n run\n }\n}\n","import type { FormKitNode } from '@formkit/core';\nimport type { RequestPayload } from '@inertiajs/core';\nimport type { AddonExtension } from '../inertia';\n\nimport { reactive, watchEffect } from 'vue';\nimport { createMessage } from '@formkit/core';\n\nexport default <F extends RequestPayload>(initialFields?: F, formLevelErrorName?: string) => {\n const state = reactive({\n node: null as null | FormKitNode,\n dirty: false as boolean | null,\n errors: false as boolean | null,\n valid: false as boolean | null,\n });\n\n return {\n state,\n\n addon: ((on) => {\n on('start', (_, node) => {\n node.store.set(createMessage({\n key: 'loading',\n visible: false,\n value: true\n }));\n\n if (node.props.submitBehavior !== 'live') node.props.disabled = true;\n });\n\n on('error', (errors, node) => {\n const _formLevelErrorName = formLevelErrorName ? formLevelErrorName : node.name;\n\n let formErrorMessages: string | undefined;\n if (_formLevelErrorName in errors) {\n formErrorMessages = errors[_formLevelErrorName];\n\n delete errors[_formLevelErrorName];\n }\n\n node.setErrors(_formLevelErrorName, errors);\n });\n\n on('finish', (_, node) => {\n node.store.remove('loading');\n\n if (node.props.submitBehavior !== 'live') node.props.disabled = false;\n });\n }) as AddonExtension,\n plugin: (node: FormKitNode) => {\n if (node.props.type !== 'form') return;\n\n state.node = node;\n if (initialFields) node.input(initialFields);\n\n node.on('created', () => {\n watchEffect(() => {\n state.dirty = node.context!.state.dirty;\n state.valid = node.context!.state.valid;\n state.errors = node.context!.state.errors;\n });\n });\n\n return false;\n }\n }\n};\n","import type { AddonExtension } from '../inertia';\n\nimport { reactive } from 'vue';\n\nexport default (recentlySuccessfulTimeoutTime = 2000) => {\n let _recentlySuccessfulTimeoutId: ReturnType<typeof setTimeout> | undefined = undefined;\n\n const state = reactive({\n processing: false,\n progress: 0,\n recentlySuccessful: false,\n wasSuccessful: false,\n });\n\n return {\n state,\n\n addon: ((on) => {\n on('before', () => {\n state.processing = false;\n state.progress = 0;\n state.recentlySuccessful = false;\n state.wasSuccessful = false;\n\n clearInterval(_recentlySuccessfulTimeoutId);\n });\n\n on('start', () => {\n state.processing = true;\n });\n\n on('progress', (progress) => {\n state.progress = progress?.percentage || 0;\n });\n\n on('success', () => {\n state.recentlySuccessful = true;\n state.wasSuccessful = true;\n\n _recentlySuccessfulTimeoutId = setTimeout(() => {\n state.recentlySuccessful = false;\n }, recentlySuccessfulTimeoutTime);\n });\n\n on('finish', () => {\n state.processing = false;\n state.progress = 0;\n });\n }) as AddonExtension\n };\n}\n"],"mappings":"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","names":["reactive","options"]}