Press n or j to go to the next uncovered block, b, p or k for the previous block.
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 | 2x 35x 35x 35x 35x 35x 23x 6x 6x 6x 35x | "use client";
import { useEffect, useRef, useState } from "react";
type UseAttachMenuProps = {
onFileSelect: (file: File) => void;
};
export function useAttachMenu({ onFileSelect }: UseAttachMenuProps) {
const [open, setOpen] = useState(false);
const menuRef = useRef<HTMLDivElement>(null);
const fileInputRef = useRef<HTMLInputElement>(null);
useEffect(() => {
Eif (!open) return;
function handleClickOutside(e: MouseEvent) {
if (menuRef.current && !menuRef.current.contains(e.target as Node)) {
setOpen(false);
}
}
document.addEventListener("mousedown", handleClickOutside);
return () => document.removeEventListener("mousedown", handleClickOutside);
}, [open]);
function handleToggle() {
setOpen((prev) => !prev);
}
function handleAddFiles() {
setOpen(false);
fileInputRef.current?.click();
}
function handleFileChange(e: React.ChangeEvent<HTMLInputElement>) {
const file = e.target.files?.[0];
Eif (file) onFileSelect(file);
e.target.value = "";
}
return { open, menuRef, fileInputRef, handleToggle, handleAddFiles, handleFileChange };
}
|