{ "name": "circular-progress-interactive-demo", "type": "registry:example", "registryDependencies": [ "button", "circular-progress" ], "files": [ { "path": "examples/circular-progress-interactive-demo.tsx", "type": "registry:example", "content": "\"use client\";\n\nimport * as React from \"react\";\nimport { Button } from \"@/registry/bases/base/ui/button\";\nimport {\n CircularProgress,\n CircularProgressIndicator,\n CircularProgressRange,\n CircularProgressTrack,\n CircularProgressValueText,\n} from \"@/registry/bases/base/ui/circular-progress\";\n\nexport default function CircularProgressControlledDemo() {\n const [uploadProgress, setUploadProgress] = React.useState(0);\n const [isUploading, setIsUploading] = React.useState(false);\n const intervalRef = React.useRef(null);\n\n const onUploadStart = React.useCallback(() => {\n setIsUploading(true);\n setUploadProgress(0);\n }, []);\n\n const onUploadReset = React.useCallback(() => {\n setUploadProgress(0);\n setIsUploading(false);\n if (intervalRef.current) {\n clearInterval(intervalRef.current);\n intervalRef.current = null;\n }\n }, []);\n\n React.useEffect(() => {\n if (isUploading) {\n intervalRef.current = setInterval(() => {\n setUploadProgress((prev) => {\n if (prev === null) return 0;\n if (prev >= 100) {\n if (intervalRef.current) {\n clearInterval(intervalRef.current);\n intervalRef.current = null;\n }\n setIsUploading(false);\n return 100;\n }\n return Math.min(100, prev + Math.random() * 15);\n });\n }, 200);\n }\n\n return () => {\n if (intervalRef.current) {\n clearInterval(intervalRef.current);\n intervalRef.current = null;\n }\n };\n }, [isUploading]);\n\n return (\n
\n
\n \n \n \n \n \n \n \n
\n
Upload Progress
\n
\n Status:{\" \"}\n {isUploading\n ? \"Uploading...\"\n : uploadProgress === 100\n ? \"Complete\"\n : \"Ready\"}\n
\n
\n Progress:{\" \"}\n {uploadProgress === null\n ? \"Indeterminate\"\n : `${Math.round(uploadProgress)}%`}\n
\n
\n
\n
\n \n \n setUploadProgress(null)}\n disabled={isUploading}\n >\n Indeterminate\n \n
\n
\n );\n}\n", "target": "" } ] }