← vibesdk
src/components/vault/VaultStatusIndicator.tsx
2.6 KB
Download file
import { useState } from 'react';
import { useVault } from '@/hooks/use-vault';
import { Button } from '@/components/ui/button';
import { VaultUnlockModal } from './VaultUnlockModal';
import { VaultSetupWizard } from './VaultSetupWizard';
import { Lock, Unlock, ShieldOff, Loader2 } from 'lucide-react';
import {
Tooltip,
TooltipContent,
TooltipTrigger,
} from '@/components/ui/tooltip';
import {
Dialog,
DialogContent,
} from '@/components/ui/dialog';
export function VaultStatusIndicator() {
const { state, lockVault } = useVault();
const [showUnlock, setShowUnlock] = useState(false);
const [showSetup, setShowSetup] = useState(false);
if (state.isLoading) {
return (
<Button variant="ghost" size="sm" disabled className="gap-1.5">
<Loader2 className="h-4 w-4 animate-spin" />
<span className="hidden sm:inline">Vault</span>
</Button>
);
}
if (state.status === 'not_setup') {
return (
<>
<Tooltip>
<TooltipTrigger asChild>
<Button
variant="ghost"
size="icon"
onClick={() => setShowSetup(true)}
className="text-muted-foreground hover:text-foreground"
>
<ShieldOff className="h-4 w-4" />
</Button>
</TooltipTrigger>
<TooltipContent>
<p>Set up your secure vault to store API keys</p>
</TooltipContent>
</Tooltip>
<Dialog open={showSetup} onOpenChange={setShowSetup}>
<DialogContent className="sm:max-w-lg p-0 overflow-hidden">
<VaultSetupWizard
open={showSetup}
onComplete={() => setShowSetup(false)}
onCancel={() => setShowSetup(false)}
/>
</DialogContent>
</Dialog>
</>
);
}
if (state.status === 'locked') {
return (
<>
<Tooltip>
<TooltipTrigger asChild>
<Button
variant="ghost"
size="icon"
onClick={() => setShowUnlock(true)}
className="text-amber-500 hover:text-amber-600"
>
<Lock className="h-4 w-4" />
</Button>
</TooltipTrigger>
<TooltipContent>
<p>Unlock vault to access your secrets</p>
</TooltipContent>
</Tooltip>
<VaultUnlockModal open={showUnlock} onOpenChange={setShowUnlock} />
</>
);
}
if (state.status === 'unlocked') {
return (
<Tooltip>
<TooltipTrigger asChild>
<Button
variant="ghost"
size="icon"
onClick={lockVault}
className="text-green-500 hover:text-green-600"
>
<Unlock className="h-4 w-4" />
</Button>
</TooltipTrigger>
<TooltipContent>
<p>Click to lock your vault</p>
</TooltipContent>
</Tooltip>
);
}
// Unknown state - don't render
return null;
}