Components
Loading preview...
'use client'
import { useState } from 'react'
import { LoaderCircleIcon } from 'lucide-react'
import { Button } from '@/components/ui/button'
import { cn } from '@/lib/utils'
const ButtonPromiseDemo = () => {
const [isLoading, setIsLoading] = useState(false)
const [status, setStatus] = useState<undefined | string>(undefined)
const handleClick = async () => {
setIsLoading(true)
setStatus(undefined)
try {
await new Promise(resolve => setTimeout(resolve, 1000))
setStatus(Math.random() > 0.5 ? 'Submitted!' : 'Rejected!')
} catch (error) {
setStatus('Rejected!')
console.error(error)
} finally {
setIsLoading(false)
}
}
return (
<Button
variant='link'
onClick={handleClick}
disabled={isLoading}
className={cn('btn cursor-pointer hover:no-underline', {
'text-green-600 dark:text-green-400': status === 'Submitted!',
'text-destructive': status === 'Rejected!'
})}
>
{isLoading ? (
<>
<LoaderCircleIcon className='icon animate-spin' />
Loading
</>
) : status ? (
status
) : (
'Click me'
)}
</Button>
)
}
export default ButtonPromiseDemo
Loading preview...
Loading preview...
Loading preview...
Loading preview...
Loading preview...
Loading preview...
Loading preview...
Loading preview...
Loading preview...
Loading preview...
Loading preview...
Loading preview...
Loading preview...
Loading preview...
Loading preview...
Loading preview...
Loading preview...
Loading preview...
Loading preview...
Loading preview...
Loading preview...
Loading preview...
Loading preview...
Loading preview...
Loading preview...
Loading preview...
Loading preview...
Loading preview...
Loading preview...
Loading preview...
Loading preview...
Loading preview...
Loading preview...