{ "$schema": "https://ui.shadcn.com/schema/registry-item.json", "name": "dynamic-dialog-countdown", "title": "Dynamic Countdown Dialog", "description": "A dynamic countdown dialog component.", "registryDependencies": [ "button", "dialog", "Quackzoer/shadcn-registry/dynamic-dialog" ], "files": [ { "path": "components/dynamic-dialog/dialogs/countdown-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 { Clock } from \"lucide-react\";\r\nimport { useEffect, useState } from 'react';\r\n\r\nexport interface CountdownDialogProps {\r\n countdownSeconds: number;\r\n autoConfirm?: boolean;\r\n showProgress?: boolean;\r\n}\r\n\r\nconst circumference = 2 * Math.PI * 28;\r\n\r\nexport function CountdownDialog(props: DialogComponentProps) {\r\n const [timeRemaining, setTimeRemaining] = useState(props.countdownSeconds);\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 doneTimer = setTimeout(() => {\r\n if (props.autoConfirm) props.confirm('auto-confirmed');\r\n }, props.countdownSeconds * 1000);\r\n\r\n return () => {\r\n clearInterval(countdownInterval);\r\n clearTimeout(doneTimer);\r\n };\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, []);\r\n\r\n const handleCancel = () => props.dismiss(\"cancel\");\r\n const handleConfirm = () => props.confirm('confirm pressed');\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n
\r\n
\r\n \r\n
\r\n
\r\n \r\n Timed Action\r\n \r\n \r\n {props.autoConfirm\r\n ? `Auto-confirming in ${timeRemaining}s`\r\n : `Action available in ${timeRemaining}s`\r\n }\r\n \r\n
\r\n
\r\n
\r\n
\r\n {props.showProgress !== false && (\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
\r\n {timeRemaining}\r\n
\r\n
\r\n
\r\n\r\n
\r\n \r\n Cancel\r\n \r\n 0 && !props.autoConfirm}\r\n variant=\"default\"\r\n >\r\n {timeRemaining > 0 && !props.autoConfirm\r\n ? `Confirm (${timeRemaining}s)`\r\n : 'Confirm'\r\n }\r\n \r\n
\r\n
\r\n
\r\n
\r\n );\r\n}\r\n\r\nexport const countdownDialog = dialog(CountdownDialog);\r\n", "type": "registry:component", "target": "@components/dynamic-dialog/dialogs/countdown-dialog.tsx" } ], "type": "registry:component" }