import capitalize from "../../utils/capitalize"; import React, { memo, useMemo, useRef, useState } from "react"; import ContextMenu from "../ContextMenu/ContextMenu"; import { useContextMenu } from "../../hooks/contextMenu"; import classNames from "classnames"; import { getFileColor, getFileExtension } from "../../utils/files"; import bytes from "bytes"; import { useAppDispatch, useAppSelector } from "../../hooks/store"; import { setMainSelect, setMultiSelectMode } from "../../reducers/selected"; import PlayButtonIcon from "../../icons/PlayIcon"; import { setPopupSelect } from "../../reducers/selected"; import ActionsIcon from "../../icons/ActionsIcon"; import { FileInterface } from "../../types/file"; import getBackendURL from "../../utils/getBackendURL"; import dayjs from "dayjs"; interface FileItemProps { file: FileInterface; } const FileItem: React.FC = memo((props) => { const { file } = props; const elementSelected = useAppSelector((state) => { if (state.selected.mainSection.type !== "file") return false; return state.selected.mainSection.id === file._id; }); const elementMultiSelected = useAppSelector((state) => { if (!state.selected.multiSelectMode) return false; const selected = state.selected.multiSelectMap[file._id]; return selected && selected.type === "file"; }); const multiSelectMode = useAppSelector( (state) => state.selected.multiSelectMode ); const listView = useAppSelector((state) => state.general.listView); const thumbnailURL = `${getBackendURL()}/file-service/thumbnail/${ file.metadata.thumbnailID }`; const hasThumbnail = file.metadata.hasThumbnail; const [thumbnailLoaded, setThumbnailLoaded] = useState(false); const dispatch = useAppDispatch(); const lastSelected = useRef(0); const { onContextMenu, closeContextMenu, onTouchStart, onTouchMove, onTouchEnd, clickStopPropagation, ...contextMenuState } = useContextMenu(); const fileExtension = getFileExtension(file.filename, listView ? 3 : 4); const imageColor = getFileColor(file.filename); const formattedFilename = capitalize(file.filename); const formattedCreatedDate = useMemo( () => dayjs(file.uploadDate).format("MM/DD/YY hh:mma"), [file.uploadDate] ); const fileClick = (e: React.MouseEvent) => { const multiSelectKey = e.metaKey || e.ctrlKey; if (multiSelectMode || multiSelectKey) { dispatch( setMultiSelectMode([ { type: "file", id: file._id, file: file, folder: null, }, ]) ); return; } const currentDate = Date.now(); if (!elementSelected) { dispatch( setMainSelect({ file, id: file._id, type: "file", folder: null }) ); lastSelected.current = Date.now(); return; } if (currentDate - lastSelected.current < 1500) { dispatch(setPopupSelect({ type: "file", file })); } lastSelected.current = Date.now(); }; if (listView) { return ( {/* */}
{fileExtension}

{formattedFilename}

{bytes(props.file.length)}

{formattedCreatedDate}

{contextMenuState.selected && (
)} {/* */}
); } else { return (
{contextMenuState.selected && (
)}
{hasThumbnail && (
setThumbnailLoaded(true)} /> {file.metadata.isVideo && (
)}
)} {!thumbnailLoaded && ( <>

{fileExtension}

)}

{formattedFilename}

); } }); export default FileItem;