diff --git a/app/src/components/History/HistoryTable.tsx b/app/src/components/History/HistoryTable.tsx index 51a1a163..05f20341 100644 --- a/app/src/components/History/HistoryTable.tsx +++ b/app/src/components/History/HistoryTable.tsx @@ -10,6 +10,7 @@ import { TableHeader, TableRow, } from '@/components/ui/table'; +import { cn } from '@/lib/utils/cn'; import { apiClient } from '@/lib/api/client'; import { useDeleteGeneration, useHistory } from '@/lib/hooks/useHistory'; import { formatDate, formatDuration } from '@/lib/utils/format'; @@ -60,8 +61,6 @@ export function HistoryTable() { return (
-

Generation History

- {history.length === 0 ? (
No generation history yet. Generate your first audio to see it here. @@ -81,8 +80,13 @@ export function HistoryTable() { - {history.map((gen) => ( - + {history.map((gen) => { + const isCurrentlyPlaying = currentAudioId === gen.id && isPlaying; + return ( + {gen.text} {gen.profile_name} @@ -123,7 +127,8 @@ export function HistoryTable() {
- ))} + ); + })}
diff --git a/app/src/components/VoiceProfiles/ProfileCard.tsx b/app/src/components/VoiceProfiles/ProfileCard.tsx index f0aca1f6..0984ea1f 100644 --- a/app/src/components/VoiceProfiles/ProfileCard.tsx +++ b/app/src/components/VoiceProfiles/ProfileCard.tsx @@ -1,7 +1,16 @@ import { Edit, Eye, Mic, Trash2 } from 'lucide-react'; import { useState } from 'react'; import { Badge } from '@/components/ui/badge'; +import { Button } from '@/components/ui/button'; import { CircleButton } from '@/components/ui/circle-button'; +import { + Dialog, + DialogContent, + DialogDescription, + DialogFooter, + DialogHeader, + DialogTitle, +} from '@/components/ui/dialog'; import { Card, CardContent, CardHeader, CardTitle } from '@/components/ui/card'; import { cn } from '@/lib/utils/cn'; import type { VoiceProfileResponse } from '@/lib/api/types'; @@ -16,6 +25,7 @@ interface ProfileCardProps { export function ProfileCard({ profile }: ProfileCardProps) { const [detailOpen, setDetailOpen] = useState(false); + const [deleteDialogOpen, setDeleteDialogOpen] = useState(false); const deleteProfile = useDeleteProfile(); const setEditingProfileId = useUIStore((state) => state.setEditingProfileId); const setProfileDialogOpen = useUIStore((state) => state.setProfileDialogOpen); @@ -33,12 +43,14 @@ export function ProfileCard({ profile }: ProfileCardProps) { setProfileDialogOpen(true); }; - const handleDelete = () => { - if ( - confirm(`Are you sure you want to delete "${profile.name}"? This action cannot be undone.`) - ) { - deleteProfile.mutate(profile.id); - } + const handleDeleteClick = (e: React.MouseEvent) => { + e.stopPropagation(); + setDeleteDialogOpen(true); + }; + + const handleDeleteConfirm = () => { + deleteProfile.mutate(profile.id); + setDeleteDialogOpen(false); }; return ( @@ -67,12 +79,15 @@ export function ProfileCard({ profile }: ProfileCardProps) { /> { + e.stopPropagation(); + handleEdit(); + }} aria-label="Edit profile" /> @@ -93,6 +108,25 @@ export function ProfileCard({ profile }: ProfileCardProps) { + + + + + Delete Profile + + Are you sure you want to delete "{profile.name}"? This action cannot be undone. + + + + + + + + ); } diff --git a/app/src/components/VoiceProfiles/ProfileList.tsx b/app/src/components/VoiceProfiles/ProfileList.tsx index 0e03f593..811bf520 100644 --- a/app/src/components/VoiceProfiles/ProfileList.tsx +++ b/app/src/components/VoiceProfiles/ProfileList.tsx @@ -31,7 +31,7 @@ export function ProfileList() { return (
-

Voice Profiles

+

Voicebox