diff --git a/src/components/ViewSelector.tsx b/src/components/ViewSelector.tsx index e19c0d1..65afe7b 100644 --- a/src/components/ViewSelector.tsx +++ b/src/components/ViewSelector.tsx @@ -1,7 +1,7 @@ import { useState, useRef, useCallback } from 'react' +import { createPortal } from 'react-dom' import { Save, Trash2, Pencil, Check, X, Eye } from 'lucide-react' import type { CustomView, CustomViewsStorage } from '../types/views' -import { useClickOutside } from '../hooks/useClickOutside' interface ViewSelectorProps { views: CustomViewsStorage @@ -27,13 +27,20 @@ export function ViewSelector({ const [newName, setNewName] = useState('') const [editingId, setEditingId] = useState(null) const [editName, setEditName] = useState('') - const ref = useRef(null) + const [pos, setPos] = useState<{ top: number; right: number } | null>(null) + const buttonRef = useRef(null) const closeDropdown = useCallback(() => { setOpen(false) setSaveAsMode(false) setEditingId(null) }, []) - useClickOutside(ref, closeDropdown) + + function handleToggle() { + if (open) { setOpen(false); return } + const rect = buttonRef.current?.getBoundingClientRect() + if (rect) setPos({ top: rect.bottom, right: window.innerWidth - rect.right }) + setOpen(true) + } const activeView = views.activeViewId ? views.views.find((v) => v.id === views.activeViewId) : null @@ -62,9 +69,10 @@ export function ViewSelector({ const displayName = activeView?.name ?? 'View' return ( -
+
)} - {open && ( -
+ {open && pos && createPortal( + <> +
+
)}
+ , + document.body, )}
) } + +