fix(keep-notes): sidebar chevron, labels sync, batch org errors, perf guards

- Notebooks: chevron visible when expanded (remove overflow clip), functional expand state
- Labels: sync/cleanup by notebookId, reconcile after note move
- Settings: refresh notebooks after cleanup; label dialog routing
- ConnectionsBadge lazy-load; reminder check persistence; i18n keys

Made-with: Cursor
This commit is contained in:
Sepehr Ramezani
2026-04-13 22:07:09 +02:00
parent fa7e166f3e
commit 39671c6472
16 changed files with 469 additions and 303 deletions

View File

@@ -1,7 +1,6 @@
'use client'
import { useState, useEffect } from 'react'
import { useRouter } from 'next/navigation'
import { Button } from '@/components/ui/button'
import { Badge } from '@/components/ui/badge'
import { Bell, Check, X, Clock, User } from 'lucide-react'
@@ -37,7 +36,6 @@ interface ShareRequest {
}
export function NotificationPanel() {
const router = useRouter()
const { triggerRefresh } = useNoteRefresh()
const { t } = useLanguage()
const [requests, setRequests] = useState<ShareRequest[]>([])
@@ -59,17 +57,16 @@ export function NotificationPanel() {
useEffect(() => {
loadRequests()
const interval = setInterval(loadRequests, 10000)
const interval = setInterval(loadRequests, 30000)
return () => clearInterval(interval)
}, [])
const handleAccept = async (shareId: string) => {
try {
await respondToShareRequest(shareId, 'accept')
router.refresh()
triggerRefresh()
setRequests(prev => prev.filter(r => r.id !== shareId))
setPendingCount(prev => prev - 1)
triggerRefresh()
toast.success(t('notes.noteCreated'), {
description: t('collaboration.nowHasAccess', { name: 'Note' }),
duration: 3000,
@@ -83,11 +80,9 @@ export function NotificationPanel() {
const handleDecline = async (shareId: string) => {
try {
await respondToShareRequest(shareId, 'decline')
router.refresh()
triggerRefresh()
setRequests(prev => prev.filter(r => r.id !== shareId))
setPendingCount(prev => prev - 1)
toast.info(t('general.operationFailed'))
toast.info(t('notification.declined'))
} catch (error: any) {
console.error('[NOTIFICATION] Error:', error)
toast.error(error.message || t('general.error'))
@@ -97,10 +92,8 @@ export function NotificationPanel() {
const handleRemove = async (shareId: string) => {
try {
await removeSharedNoteFromView(shareId)
router.refresh()
triggerRefresh()
setRequests(prev => prev.filter(r => r.id !== shareId))
toast.info(t('general.operationFailed'))
toast.info(t('notification.removed'))
} catch (error: any) {
toast.error(error.message || t('general.error'))
}