UNPKG

@uppy/provider-views

Version:

View library for Uppy remote provider plugins.

36 lines (35 loc) 1.38 kB
import { nanoid } from 'nanoid/non-secure'; import { useCallback, useEffect, useState } from 'preact/hooks'; /** * Hook to create a form element outside the component tree to avoid nested forms. * Returns a formId that can be used with the `form` attribute on inputs and buttons. * * This allows form submission (Enter key) to work properly even when the component * is rendered inside another form element. * * @param onSubmit - Callback to execute when the form is submitted * @returns Object containing the formId to use with form attribute */ export function useSearchForm(onSubmit) { const submit = useCallback((ev) => { ev.preventDefault(); onSubmit(); }, [onSubmit]); // We create a form element and append it to document.body to avoid nested <form>s // (See https://github.com/transloadit/uppy/pull/5050#discussion_r1640392516) const [form] = useState(() => { const formEl = document.createElement('form'); formEl.setAttribute('tabindex', '-1'); formEl.id = nanoid(); return formEl; }); useEffect(() => { document.body.appendChild(form); form.addEventListener('submit', submit); return () => { form.removeEventListener('submit', submit); document.body.removeChild(form); }; }, [form, submit]); return { formId: form.id }; }