Redesign the frontend with a dark-tech theme: add Tailwind + PostCSS, design tokens, and shadcn-style primitives (Button/Card/Input/Dialog/ DropdownMenu/Tabs/ScrollArea/etc.); restyle the app shell, navigation, sidebar tree, content view, markdown rendering, editors, modals and settings panels. Behavior/props unchanged; Font Awesome replaced with lucide-react. Add the patch cards feature UI: patch-queries hooks and a PatchCards component rendered below the markdown body, with an Add Patch button and create/edit dialog. Fix tree expandability: folders with an index page now expand on name click (and navigate), and the chevron+folder icon is one larger toggle. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
68 lines
2.2 KiB
JavaScript
68 lines
2.2 KiB
JavaScript
import React, { useState } from 'react';
|
|
import { Trash2 } from 'lucide-react';
|
|
import { useRevokeApiKey } from '../../utils/queries/apikey-queries';
|
|
import {
|
|
Dialog,
|
|
DialogContent,
|
|
DialogHeader,
|
|
DialogTitle,
|
|
DialogFooter,
|
|
} from '../ui/dialog';
|
|
import { Button } from '../ui/button';
|
|
import { Input, Label } from '../ui/input';
|
|
|
|
const ApiKeyRevokeModal = ({ isOpen, onClose }) => {
|
|
const [apiKey, setApiKey] = useState('');
|
|
const revokeApiKeyMutation = useRevokeApiKey();
|
|
|
|
const handleRevoke = async () => {
|
|
if (!apiKey.trim()) {
|
|
alert('Please enter an API key');
|
|
return;
|
|
}
|
|
|
|
try {
|
|
await revokeApiKeyMutation.mutateAsync(apiKey);
|
|
alert('API key revoked successfully');
|
|
onClose();
|
|
} catch (error) {
|
|
console.error('Failed to revoke API key:', error);
|
|
alert('Failed to revoke API key');
|
|
}
|
|
};
|
|
|
|
return (
|
|
<Dialog open={isOpen} onOpenChange={(o) => { if (!o) onClose(); }}>
|
|
<DialogContent>
|
|
<DialogHeader>
|
|
<DialogTitle>Revoke API Key</DialogTitle>
|
|
</DialogHeader>
|
|
<div className="space-y-2">
|
|
<Label htmlFor="revoke-api-key">API Key</Label>
|
|
<Input
|
|
id="revoke-api-key"
|
|
type="text"
|
|
placeholder="Enter API key to revoke"
|
|
value={apiKey}
|
|
onChange={(e) => setApiKey(e.target.value)}
|
|
/>
|
|
</div>
|
|
<DialogFooter>
|
|
<Button variant="outline" onClick={onClose}>
|
|
Cancel
|
|
</Button>
|
|
<Button
|
|
variant="destructive"
|
|
onClick={handleRevoke}
|
|
disabled={revokeApiKeyMutation.isLoading}
|
|
>
|
|
<Trash2 className="h-4 w-4" /> Revoke
|
|
</Button>
|
|
</DialogFooter>
|
|
</DialogContent>
|
|
</Dialog>
|
|
);
|
|
};
|
|
|
|
export default ApiKeyRevokeModal;
|