useSubmitConfirmation
Implements a double-click confirmation pattern: when a user tries to submit with empty optional fields, the button transforms into a warning state. A second click confirms the submission.
You probably don’t need this directly. The
<Form />component handles it automatically whensubmitConfirmationis configured. Use it when building custom submit button behavior.
Signature
import { useSubmitConfirmation } from '@saastro/forms';
const {
needsConfirmation,
isAwaitingConfirmation,
warningFields,
buttonProps,
handleClick,
resetConfirmation,
} = useSubmitConfirmation(config, currentValues, onProceed, buttonType);
The hook takes positional arguments (not an options object).
Parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
config |
FormConfig |
Yes | Form config with submitConfirmation |
currentValues |
Record<string, unknown> |
Yes | Live form values (from methods.watch()) |
onProceed |
() => void |
Yes | Callback when the action is confirmed |
buttonType |
'submit' | 'next' |
No | Which button this applies to (default: 'submit') |
Return Value
| Property | Type | Description |
|---|---|---|
needsConfirmation |
boolean |
Whether the next click will show a warning (empty optional fields, filtered by applyOn and showOnce) |
isAwaitingConfirmation |
boolean |
Whether the button is in warning state (waiting for second click) |
warningFields |
string[] |
Names of the empty optional fields (populated after the first click) |
buttonProps |
{ text?, variant?, effect? } |
Override props for the button during warning state |
handleClick |
(e: React.MouseEvent<HTMLButtonElement>) => void |
Click handler (first click = warn, second click = proceed) |
resetConfirmation |
() => void |
Manually reset the confirmation state |
How It Works
- User clicks the submit/next button with empty optional fields
- First click: Button transforms to warning state (text changes, variant changes). A timer starts (default 3 seconds)
- Second click: Confirmation accepted,
onProceed()fires - If the timer expires without a second click, the button reverts to normal
Configuration
The hook reads config.submitConfirmation, set via the submitConfirmation() method on FormBuilder:
FormBuilder.create('contact')
// ...fields
.submitConfirmation({
optionalFields: [
{ name: 'phone', message: 'Without a phone number we cannot call you back' },
{ name: 'company', message: 'Adding your company helps us prioritize' },
],
buttonBehavior: {
warningText: 'Continue without filling?',
warningVariant: 'outline',
resetDelay: 4000, // ms before reverting (default: 3000)
},
applyOn: 'submit', // 'submit' | 'steps' | 'both' — 'steps' targets the Next button
showOnce: true, // Only warn once per session (default: true)
})
.build();
Example
import { useSubmitConfirmation } from '@saastro/forms';
function SubmitButton({ config, values, onSubmit }) {
const { isAwaitingConfirmation, buttonProps, handleClick, warningFields } = useSubmitConfirmation(
config,
values,
onSubmit,
'submit',
);
return (
<div>
<button onClick={handleClick} className={isAwaitingConfirmation ? 'border-yellow-500' : ''}>
{buttonProps.text || 'Submit'}
</button>
{isAwaitingConfirmation && (
<p className="text-sm text-yellow-600">
You left these fields empty: {warningFields.join(', ')}
</p>
)}
</div>
);
}
Related
- FormBuilder API —
submitConfirmation()configuration reference