All files / hooks use-attach-menu.ts

59.09% Statements 13/22
25% Branches 2/8
37.5% Functions 3/8
61.11% Lines 11/18

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 };
}