fix(sidebar): eliminate full page reloads and fix notebook actions visibility

- Fix createNotebookOptimistic to call loadNotebooks() + triggerRefresh()
  after POST, so new notebooks appear immediately without page reload
- Remove window.location.reload() from delete-notebook-dialog (context
  already handles state refresh)
- Rewrite edit-notebook-dialog to use updateNotebook() from context
  instead of raw fetch + full page reload
- Fix NoteRefreshContext: remove refreshKey from useCallback deps to
  prevent unstable triggerRefresh callback cascade
- Fix notebook actions menu visibility: consolidate NotebookActions and
  expand button into single positioned container with proper z-index
- Add actions menu to active/selected notebook (was previously missing)
- Use proper Notebook type instead of any in sidebar components
- Increase button pr-20 to pr-24 to reserve space for actions
- Remove redundant router.refresh() from create-notebook-dialog

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
Sepehr Ramezani
2026-03-29 22:23:25 +02:00
parent 8daf50ac3f
commit 806f4c4eeb
7 changed files with 106 additions and 114 deletions

View File

@@ -1,7 +1,6 @@
'use client'
import { useState } from 'react'
import { useRouter } from 'next/navigation'
import { useState, useEffect } from 'react'
import { useLanguage } from '@/lib/i18n'
import { Button } from '@/components/ui/button'
import {
@@ -14,41 +13,36 @@ import {
} from '@/components/ui/dialog'
import { Input } from '@/components/ui/input'
import { Label } from '@/components/ui/label'
import { useNotebooks } from '@/context/notebooks-context'
import { Notebook } from '@/lib/types'
interface EditNotebookDialogProps {
notebook: any
notebook: Notebook
open: boolean
onOpenChange: (open: boolean) => void
}
export function EditNotebookDialog({ notebook, open, onOpenChange }: EditNotebookDialogProps) {
const router = useRouter()
const { updateNotebook } = useNotebooks()
const { t } = useLanguage()
const [name, setName] = useState(notebook?.name || '')
const [isSubmitting, setIsSubmitting] = useState(false)
useEffect(() => {
if (open) {
setName(notebook?.name || '')
}
}, [open, notebook?.name])
const handleSubmit = async (e: React.FormEvent) => {
e.preventDefault()
if (!name.trim()) return
setIsSubmitting(true)
try {
const response = await fetch(`/api/notebooks/${notebook.id}`, {
method: 'PATCH',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ name: name.trim() }),
})
if (response.ok) {
onOpenChange(false)
window.location.reload()
} else {
const error = await response.json()
}
} catch (error) {
// Error already handled in UI
await updateNotebook(notebook.id, { name: name.trim() })
onOpenChange(false)
} catch {
// Error handled in UI
} finally {
setIsSubmitting(false)
}
@@ -63,7 +57,6 @@ export function EditNotebookDialog({ notebook, open, onOpenChange }: EditNoteboo
{t('notebook.editDescription')}
</DialogDescription>
</DialogHeader>
<form onSubmit={handleSubmit}>
<div className="grid gap-4 py-4">
<div className="grid grid-cols-4 items-center gap-4">
@@ -80,7 +73,6 @@ export function EditNotebookDialog({ notebook, open, onOpenChange }: EditNoteboo
/>
</div>
</div>
<DialogFooter>
<Button
type="button"