Some checks failed
Deploy to Production / Build and Deploy (push) Has been cancelled
- Fix React bug #33580: remove Suspense boundaries co-located with Link components - Delete settings/loading.tsx and admin/loading.tsx (root cause of race condition) - Convert all admin navigation from Next.js Link to anchor tags - Move admin pages to dedicated (admin) route group - Add AdminHeader matching main header visual design - Add AdminSidebar with anchor-based navigation - Add /api/admin/models route handler (replaces server actions for GET) - Add /api/debug/client-error for server-side browser error reporting - Add useNoteRefreshOptional() to fix crash in AdminHeader - Hide Admin Dashboard menu for non-admin users - Change app icons from yellow to blue (#3A7CA5) matching brand primary - Fix admin search bar width to match main header Made-with: Cursor
65 lines
1.7 KiB
TypeScript
65 lines
1.7 KiB
TypeScript
'use client'
|
|
|
|
import { createContext, useContext, useState, useCallback, useMemo, ReactNode } from 'react'
|
|
|
|
interface NotebookDragContextValue {
|
|
draggedNoteId: string | null
|
|
dragOverNotebookId: string | null
|
|
startDrag: (noteId: string) => void
|
|
endDrag: () => void
|
|
dragOver: (notebookId: string | null) => void
|
|
isDragging: boolean
|
|
isDragOver: boolean
|
|
}
|
|
|
|
const NotebookDragContext = createContext<NotebookDragContextValue | null>(null)
|
|
|
|
export function useNotebookDrag() {
|
|
const context = useContext(NotebookDragContext)
|
|
if (!context) {
|
|
throw new Error('useNotebookDrag must be used within NotebookDragProvider')
|
|
}
|
|
return context
|
|
}
|
|
|
|
interface NotebookDragProviderProps {
|
|
children: ReactNode
|
|
}
|
|
|
|
export function NotebookDragProvider({ children }: NotebookDragProviderProps) {
|
|
const [draggedNoteId, setDraggedNoteId] = useState<string | null>(null)
|
|
const [dragOverNotebookId, setDragOverNotebookId] = useState<string | null>(null)
|
|
|
|
const startDrag = useCallback((noteId: string) => {
|
|
setDraggedNoteId(noteId)
|
|
}, [])
|
|
|
|
const endDrag = useCallback(() => {
|
|
setDraggedNoteId(null)
|
|
setDragOverNotebookId(null)
|
|
}, [])
|
|
|
|
const dragOver = useCallback((notebookId: string | null) => {
|
|
setDragOverNotebookId(notebookId)
|
|
}, [])
|
|
|
|
const isDragging = draggedNoteId !== null
|
|
const isDragOver = dragOverNotebookId !== null
|
|
|
|
const value = useMemo(() => ({
|
|
draggedNoteId,
|
|
dragOverNotebookId,
|
|
startDrag,
|
|
endDrag,
|
|
dragOver,
|
|
isDragging,
|
|
isDragOver,
|
|
}), [draggedNoteId, dragOverNotebookId, startDrag, endDrag, dragOver, isDragging, isDragOver])
|
|
|
|
return (
|
|
<NotebookDragContext.Provider value={value}>
|
|
{children}
|
|
</NotebookDragContext.Provider>
|
|
)
|
|
}
|