Skip to content
← Public packages

@kentcdodds/package-app-kit

Design tokens, PWA install/update, About/version, cache helpers, and optional realtime notes sync for Kody package apps.

FollowFork

starter-tanstack/app/ui/double-check-button.tsx

47 lines · 1022 B · TypeScript
import { useState, type ReactNode } from 'react'

/**
 * Two-step confirm for destructive form submits (progressive enhancement).
 * SSR / no-JS: `type="submit"` so the parent form POSTs normally.
 * With JS: first click arms (preventDefault); second click submits; blur resets.
 */
export function DoubleCheckButton({
	label = 'Delete',
	confirmLabel = 'Are you sure?',
	className = 'pak-btn pak-btn-danger',
	icon,
}: {
	label?: string
	confirmLabel?: string
	className?: string
	icon?: ReactNode
}) {
	const [armed, setArmed] = useState(false)
	return (
		<button
			type="submit"
			className={className}
			data-double-check
			data-armed={armed ? 'true' : 'false'}
			aria-pressed={armed ? 'true' : 'false'}
			onClick={(event) => {
				if (!armed) {
					event.preventDefault()
					setArmed(true)
				}
			}}
			onBlur={() => {
				if (armed) setArmed(false)
			}}
		>
			{armed ? (
				confirmLabel
			) : (
				<span className="pak-cluster pak-gap-2">
					{icon}
					{label}
				</span>
			)}
		</button>
	)
}