import React, { createRef, useEffect, useState } from 'react'; import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'; import { faEllipsisH } from '@fortawesome/free-solid-svg-icons/faEllipsisH'; import { FileObject } from '@/api/server/files/loadDirectory'; import { CSSTransition } from 'react-transition-group'; import { faPencilAlt } from '@fortawesome/free-solid-svg-icons/faPencilAlt'; import { faTrashAlt } from '@fortawesome/free-solid-svg-icons/faTrashAlt'; import { faFileDownload } from '@fortawesome/free-solid-svg-icons/faFileDownload'; import { faCopy } from '@fortawesome/free-solid-svg-icons/faCopy'; import { faArrowsAltH } from '@fortawesome/free-solid-svg-icons/faArrowsAltH'; import { faBalanceScaleLeft } from '@fortawesome/free-solid-svg-icons/faBalanceScaleLeft'; import { faLevelUpAlt } from '@fortawesome/free-solid-svg-icons/faLevelUpAlt'; export default ({ file }: { file: FileObject }) => { const menu = createRef(); const [ visible, setVisible ] = useState(false); const [posX, setPosX] = useState(0); const windowListener = (e: MouseEvent) => { if (e.button === 2 || !visible || !menu.current) { return; } if (e.target === menu.current || menu.current.contains(e.target as Node)) { return; } if (e.target !== menu.current && !menu.current.contains(e.target as Node)) { setVisible(false); } }; useEffect(() => { visible ? document.addEventListener('click', windowListener) : document.removeEventListener('click', windowListener); if (visible && menu.current) { menu.current.setAttribute( 'style', `margin-top: -0.35rem; left: ${Math.round(posX - menu.current.clientWidth)}px` ); } }, [ visible ]); useEffect(() => () => { document.removeEventListener('click', windowListener); }, []); return (
{ e.preventDefault(); if (!visible) { setPosX(e.clientX); } setVisible(!visible); }} >
Rename
Move
Copy
Download
Delete
); };