Barazo default frontend barazo.forum
at main 52 lines 1.4 kB view raw
1/** 2 * SaveButton - Button with state-driven text/icon for save operations. 3 * Cycles through idle, saving (disabled), and saved (with CheckCircle icon). 4 */ 5 6import { CheckCircle } from '@phosphor-icons/react' 7import { cn } from '@/lib/utils' 8import type { SaveStatus } from '@/hooks/use-save-state' 9 10interface SaveButtonProps { 11 status: SaveStatus 12 onClick: () => void 13 label?: string 14 savingLabel?: string 15 savedLabel?: string 16 className?: string 17} 18 19export function SaveButton({ 20 status, 21 onClick, 22 label = 'Save', 23 savingLabel = 'Saving...', 24 savedLabel = 'Saved', 25 className, 26}: SaveButtonProps) { 27 return ( 28 <> 29 <button 30 type="button" 31 onClick={onClick} 32 disabled={status === 'saving'} 33 className={cn( 34 'rounded-md bg-primary px-4 py-2 text-sm font-medium text-primary-foreground transition-colors hover:bg-primary/90 disabled:opacity-50', 35 className 36 )} 37 > 38 {status === 'idle' && label} 39 {status === 'saving' && savingLabel} 40 {status === 'saved' && ( 41 <span className="flex items-center gap-1.5"> 42 <CheckCircle size={16} aria-hidden="true" /> 43 {savedLabel} 44 </span> 45 )} 46 </button> 47 <span role="status" aria-live="polite" className="sr-only"> 48 {status === 'saved' ? `${savedLabel}.` : ''} 49 </span> 50 </> 51 ) 52}