@oslokommune/punkt-react
Version:
React komponentbibliotek til Punkt, et designsystem laget av Oslo Origo
44 lines (40 loc) • 1.31 kB
text/typescript
import { RefObject, useEffect } from 'react'
/**
* When `uploadStrategy="custom"` and the upload is marked `required`, the
* native `required` attribute can't do the work (the input isn't posted).
* This hook attaches a submit listener to the containing `<form>` that
* prevents submission if the queue is empty, and surfaces a validation
* error via `onMissingFiles`.
*
* Passive in `form` strategy — native validation handles that case.
*/
export const useRequiredFormValidation = (
fileInputRef: RefObject<HTMLInputElement | null>,
{
uploadStrategy,
required,
currentFileCount,
onMissingFiles,
}: {
uploadStrategy: 'form' | 'custom'
required: boolean
currentFileCount: number
onMissingFiles: () => void
},
) => {
useEffect(() => {
if (uploadStrategy !== 'custom' || !required) return
const input = fileInputRef.current
const form = input?.form
if (!form) return
const handleFormSubmit = (event: SubmitEvent) => {
if (currentFileCount > 0) return
event.preventDefault()
onMissingFiles()
}
form.addEventListener('submit', handleFormSubmit)
return () => {
form.removeEventListener('submit', handleFormSubmit)
}
}, [fileInputRef, uploadStrategy, required, currentFileCount, onMissingFiles])
}