Spaces:
Sleeping
Sleeping
File size: 3,442 Bytes
f871fed |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 |
'use client'
import { useState } from 'react'
import {
Dialog,
DialogContent,
DialogDescription,
DialogFooter,
DialogHeader,
DialogTitle,
} from '@/components/ui/dialog'
import { Button } from '@/components/ui/button'
import { CheckboxList } from '@/components/ui/checkbox-list'
import { useNotebooks } from '@/lib/hooks/use-notebooks'
import { useCreateNote } from '@/lib/hooks/use-notes'
import { LoadingSpinner } from '@/components/common/LoadingSpinner'
import { toast } from 'sonner'
interface SaveToNotebooksDialogProps {
open: boolean
onOpenChange: (open: boolean) => void
question: string
answer: string
}
export function SaveToNotebooksDialog({
open,
onOpenChange,
question,
answer
}: SaveToNotebooksDialogProps) {
const [selectedNotebooks, setSelectedNotebooks] = useState<string[]>([])
const { data: notebooks, isLoading } = useNotebooks(false) // false = not archived
const createNote = useCreateNote()
const handleToggle = (notebookId: string) => {
setSelectedNotebooks(prev =>
prev.includes(notebookId)
? prev.filter(id => id !== notebookId)
: [...prev, notebookId]
)
}
const handleSave = async () => {
if (selectedNotebooks.length === 0) {
toast.error('Please select at least one notebook')
return
}
try {
// Create note in each selected notebook
for (const notebookId of selectedNotebooks) {
await createNote.mutateAsync({
title: question,
content: answer,
note_type: 'ai',
notebook_id: notebookId
})
}
toast.success(`Answer saved to ${selectedNotebooks.length} notebook${selectedNotebooks.length > 1 ? 's' : ''}`)
setSelectedNotebooks([])
onOpenChange(false)
} catch {
toast.error('Failed to save answer')
}
}
const notebookItems = notebooks?.map(nb => ({
id: nb.id,
title: nb.name,
description: nb.description || undefined
})) || []
return (
<Dialog open={open} onOpenChange={onOpenChange}>
<DialogContent className="sm:max-w-[500px]">
<DialogHeader>
<DialogTitle>Save to Notebooks</DialogTitle>
<DialogDescription>
Select one or more notebooks to save this answer
</DialogDescription>
</DialogHeader>
<div className="py-4">
{isLoading ? (
<div className="flex items-center justify-center py-8">
<LoadingSpinner />
</div>
) : (
<CheckboxList
items={notebookItems}
selectedIds={selectedNotebooks}
onToggle={handleToggle}
emptyMessage="No notebooks found. Create a notebook first."
/>
)}
</div>
<DialogFooter>
<Button variant="outline" onClick={() => onOpenChange(false)}>
Cancel
</Button>
<Button
onClick={handleSave}
disabled={selectedNotebooks.length === 0 || createNote.isPending}
>
{createNote.isPending ? (
<>
<LoadingSpinner size="sm" className="mr-2" />
Saving...
</>
) : (
`Save to ${selectedNotebooks.length || ''} Notebook${selectedNotebooks.length !== 1 ? 's' : ''}`
)}
</Button>
</DialogFooter>
</DialogContent>
</Dialog>
)
}
|