{ "$schema": "https://ui.shadcn.com/schema/registry-item.json", "name": "dynamic-dialog-delayed-action", "title": "Dynamic Delayed Action Dialog", "description": "A dynamic delayed action dialog component.", "registryDependencies": [ "button", "dialog", "./public/r/dynamic-dialog.json" ], "files": [ { "path": "components/dynamic-dialog/dialogs/delayed-action-dialog.tsx", "content": "\"use client\"\r\n\r\nimport { dialog, type DialogComponentProps } from '@/registry/lib/dynamic-dialog-state';\r\nimport { Button } from \"@/registry/ui/button\";\r\nimport { Dialog, DialogContent, DialogDescription, DialogHeader, DialogTitle } from \"@/registry/ui/dialog\";\r\nimport { AlertTriangle, Check, Clock } from \"lucide-react\";\r\nimport { useEffect, useState } from 'react';\r\n\r\nexport interface DelayedActionDialogProps {\r\n delaySeconds: number;\r\n warningMessage?: string;\r\n allowCancel?: boolean;\r\n dangerAction?: boolean;\r\n}\r\n\r\nconst circumference = 2 * Math.PI * 20;\r\n\r\nexport function DelayedActionDialog(props: DialogComponentProps) {\r\n const [timeRemaining, setTimeRemaining] = useState(props.delaySeconds);\r\n const [canInteract, setCanInteract] = useState(false);\r\n\r\n useEffect(() => {\r\n const countdownInterval = setInterval(() => {\r\n setTimeRemaining(prev => Math.max(0, prev - 1));\r\n }, 1000);\r\n\r\n const enableTimer = setTimeout(() => {\r\n setCanInteract(true);\r\n }, props.delaySeconds * 1000);\r\n\r\n return () => {\r\n clearInterval(countdownInterval);\r\n clearTimeout(enableTimer);\r\n };\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, []);\r\n\r\n const handleConfirm = () => {\r\n if (canInteract) props.confirm(true);\r\n };\r\n\r\n const handleCancel = () => {\r\n if (props.allowCancel !== false) props.dismiss(\"cancel\");\r\n };\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n
\r\n
\r\n {props.dangerAction ? (\r\n \r\n ) : (\r\n \r\n )}\r\n
\r\n
\r\n \r\n Please Wait\r\n \r\n \r\n {canInteract\r\n ? 'You can now proceed'\r\n : `Please wait ${timeRemaining} seconds before continuing`\r\n }\r\n \r\n
\r\n
\r\n
\r\n
\r\n {props.warningMessage && (\r\n
\r\n

{props.warningMessage}

\r\n
\r\n )}\r\n\r\n {!canInteract && (\r\n
\r\n
\r\n
\r\n Time remaining\r\n {timeRemaining}s\r\n
\r\n
\r\n \r\n
\r\n
\r\n\r\n
\r\n
\r\n \r\n \r\n \r\n \r\n
\r\n {timeRemaining}\r\n
\r\n
\r\n
\r\n
\r\n )}\r\n\r\n {canInteract && (\r\n
\r\n
\r\n \r\n Ready to proceed\r\n
\r\n
\r\n )}\r\n\r\n
\r\n {props.allowCancel !== false && (\r\n \r\n )}\r\n \r\n {!canInteract\r\n ? `Please wait (${timeRemaining}s)`\r\n : props.dangerAction\r\n ? 'Confirm Action'\r\n : 'Continue'\r\n }\r\n \r\n
\r\n
\r\n
\r\n
\r\n );\r\n}\r\n\r\nexport const delayedActionDialog = dialog(DelayedActionDialog);\r\n", "type": "registry:component", "target": "@components/dynamic-dialog/dialogs/delayed-action-dialog.tsx" } ], "type": "registry:component" }