import type { Did } from "@atcute/lexicons"; import type { EditorView } from "codemirror"; import { createEffect, createSignal, onCleanup, Show } from "solid-js"; import { Button } from "../button.jsx"; import { Modal } from "../modal.jsx"; import { FileUpload } from "./file-upload.jsx"; import { HandleInput } from "./handle-input.jsx"; const MenuItem = (props: { icon: string; label: string; onClick: () => void }) => ( ); export const InsertMenu = (props: { editor: () => EditorView | undefined; repo: Did | undefined; canUpload: boolean; dialogClass: string; }) => { const [openMenu, setOpenMenu] = createSignal(false); const [openUpload, setOpenUpload] = createSignal(false); const [openHandle, setOpenHandle] = createSignal(false); let menuRef!: HTMLDivElement; let blobInput!: HTMLInputElement; let disposed = false; onCleanup(() => (disposed = true)); createEffect(() => { if (!openMenu()) return; const closeOutside = (event: MouseEvent) => { if (!menuRef.contains(event.target as Node)) setOpenMenu(false); }; document.addEventListener("mousedown", closeOutside); onCleanup(() => document.removeEventListener("mousedown", closeOutside)); }); const insert = (text: string) => { // An upload or handle lookup can finish after this editor has been closed. if (disposed) return; const editor = props.editor(); if (!editor) return; editor.dispatch({ changes: { from: editor.state.selection.main.head, insert: text } }); }; return ( <>