import { A } from "@solidjs/router"; import { Accessor, createContext, createSignal, JSX, onCleanup, onMount, Setter, Show, useContext, } from "solid-js"; import { Portal } from "solid-js/web"; import { addToClipboard } from "../utils/copy"; const MenuContext = createContext<{ showMenu: Accessor; setShowMenu: Setter; }>(); export const MenuProvider = (props: { children?: JSX.Element }) => { const [showMenu, setShowMenu] = createSignal(false); const value = { showMenu, setShowMenu }; return {props.children}; }; export const CopyMenu = (props: { content: string; label: string; icon?: string }) => { const ctx = useContext(MenuContext); return ( ); }; export const NavMenu = (props: { href: string; label: string; icon?: string; newTab?: boolean; external?: boolean; }) => { const ctx = useContext(MenuContext); return ( ctx?.setShowMenu(false)} class="flex items-center gap-2 rounded-md p-1.5 hover:bg-neutral-200/50 active:bg-neutral-200 dark:hover:bg-neutral-700 dark:active:bg-neutral-600" classList={{ "justify-between": props.external }} target={props.newTab ? "_blank" : undefined} > {props.label} ); }; export const ActionMenu = (props: { label: string; icon: string; onClick: JSX.EventHandlerUnion; }) => { return ( ); }; export const MenuSeparator = () => { return
; }; export const DropdownMenu = (props: { icon: string; buttonClass?: string; menuClass?: string; children?: JSX.Element; }) => { const ctx = useContext(MenuContext); const [menu, setMenu] = createSignal(); const [menuButton, setMenuButton] = createSignal(); const [buttonRect, setButtonRect] = createSignal(); const clickEvent = (event: MouseEvent) => { const target = event.target as Node; if (!menuButton()?.contains(target) && !menu()?.contains(target)) ctx?.setShowMenu(false); }; const updatePosition = () => { const rect = menuButton()?.getBoundingClientRect(); if (rect) setButtonRect(rect); }; onMount(() => { window.addEventListener("click", clickEvent); window.addEventListener("scroll", updatePosition, true); window.addEventListener("resize", updatePosition); }); onCleanup(() => { window.removeEventListener("click", clickEvent); window.removeEventListener("scroll", updatePosition, true); window.removeEventListener("resize", updatePosition); }); return (
{props.children}
); };