import React, {useContext} from "react"; import FileBrowser from 'react-keyed-file-browser'; import { CardContent, CardDescription, CardHeader, CardMeta, Confirm, Container, Divider, Dropdown, Image, PlaceholderLine, TableCell, TableHeaderCell, } from "semantic-ui-react"; import 'react-keyed-file-browser/dist/react-keyed-file-browser.css'; import {deleteFile, refreshDirectoryFiles, refreshFiles} from "../api"; import { CardGroupCentered, CardPosterLink, epochToDateString, ExternalCardLink, FileIcon, humanFileSize, isEmpty, mimetypeColor, PageContainer, Paginator, textEllipsis, useTitle } from "./Common"; import {useBrowseFiles, useQuery, useSearchFiles} from "../hooks/customHooks"; import {Route, Routes} from "react-router-dom"; import {CardPlacholder} from "./Placeholder"; import {ArchiveCard, ArchiveRowCells} from "./Archive"; import Grid from "semantic-ui-react/dist/commonjs/collections/Grid"; import {ThemeContext} from "../contexts/contexts"; import {Button, Card, CardIcon, Header, Icon, Placeholder, Segment} from "./Theme"; import {SelectableTable} from "./Tables"; import {VideoCard, VideoRowCells} from "./Videos"; import _ from 'lodash'; const icons = { File: , Folder: , FolderOpen: , Image: , PDF: , }; export function Files() { useTitle('Files'); const {t} = useContext(ThemeContext); const {browseFiles, setOpenFolders, fetchFiles} = useBrowseFiles(); const [deleteOpen, setDeleteOpen] = React.useState(false); const [selectedFile, setSelectedFile] = React.useState(null); const [selectedDirectory, setSelectedDirectory] = React.useState(null); const handleFolderChange = async (file, browserProps) => { let openFolders = Object.keys(browserProps.openFolders); setOpenFolders(openFolders); } const onSelect = async (file) => { // A user can only select one file or one directory. if (file.key.endsWith('/')) { setSelectedFile(null); setSelectedDirectory(file); } else { setSelectedDirectory(null); setSelectedFile(file); } } const onDeleteFile = async () => { await deleteFile(selectedFile.key); await fetchFiles(); } const openDelete = () => { setDeleteOpen(true); } const closeDelete = () => { setDeleteOpen(false); } const clearSelection = async (e) => { e.preventDefault(); setOpenFolders(null); setSelectedDirectory(null); setSelectedFile(null); await fetchFiles(); } let clearButton = ; let buttons; if (selectedFile) { buttons = <> ; } else if (selectedDirectory) { buttons = <> ; } else { buttons = ; } return <> {clearButton} {buttons}
<>} // Hide the preview that the 3rd party provided. />
} function EbookCard({file}) { const {s} = useContext(ThemeContext); const downloadUrl = `/download/${encodeURIComponent(file.path)}`; let {ebook, suffix} = file; const coverSrc = ebook && ebook.cover_path ? `/media/${encodeURIComponent(ebook.cover_path)}` : null; let cover = ; if (coverSrc) { cover = ; } suffix = suffix ? _.trimStart(suffix, '.').toUpperCase() : null; const color = mimetypeColor(file.mimetype); return {cover} {ebook ? ebook.title : file.title} {ebook ? ebook.creator : null}

{ebook ? humanFileSize(ebook.size) : null}

{suffix}
} function ImageCard({file}) { const {s} = useContext(ThemeContext); const url = `/media/${encodeURIComponent(file.path)}`; let poster = ; if (file.size && file.size < 50000000) { // Image is less than 5mb, use it. poster = ; } return {poster}

{textEllipsis(file.title || file.stem || file.path, 100)}

{epochToDateString(file.modified / 1000)}

{humanFileSize(file.size)}

} function FileCard({file}) { const {s} = useContext(ThemeContext); const isEbookType = file.mimetype && ( file.mimetype.startsWith('application/epub') || file.mimetype.startsWith('application/x-mobipocket-ebook') ); if (file.model === 'video' && file['video']) { return ; } else if (file.model === 'archive' && file['archive']) { return ; } else if (file.mimetype && file.mimetype.startsWith('image/')) { return ; } else if (isEbookType) { return ; } const url = `/download/${encodeURIComponent(file.path)}`; const color = mimetypeColor(file.mimetype); const size = file.size !== null && file.size !== undefined ? humanFileSize(file.size) : null; return {textEllipsis(file.title || file.stem || file.path)}

{epochToDateString(file.modified / 1000)}

{size}

} export function FileCards({files}) { if (!isEmpty(files)) { return {files.map(i => )} } else if (files && files.length === 0) { return
No files found.
} else { return } } function ImageRowCells({file}) { const url = `/media/${encodeURIComponent(file.path)}`; let poster = ; if (file.size && file.size < 50000000) { // Image is less than 5mb, use it. poster = ; } // Fragment for SelectableRow return (
{poster}

{textEllipsis(file.title || file.stem || file.path, 100)}

) } function FileRow({file}) { if (file.model === 'video' && 'video' in file) { return ; } else if (file.model === 'archive' && 'archive' in file) { return ; } else if (file.mimetype && file.mimetype.startsWith('image/')) { return ; } const onDownloadFile = async () => window.open(`/media/${file.key}`); // Fragment for SelectableRow return
onDownloadFile()}> {textEllipsis(file.title)}
} export function FileTable({files, selectOn, onSelect, footer, selectedKeys}) { if (!isEmpty(files)) { const headerContents = ['Poster', 'Title']; const rows = files.map(i => ); return ; } else if (isEmpty(files)) { return

No results!

} else { return } } export function FilesView({ files, limit, setLimit, showLimit = false, activePage, totalPages, view, setView, showView = true, showSelect = false, selectElem, selectedKeys, onSelect, setPage, menuColumnsCount, menuColumns, filterOptions, activeFilters, setFilters, multipleFilters, filterPlaceholder, }) { let selectButton; const [selectOn, setSelectOn] = React.useState(false); const toggleSelectOn = () => setSelectOn(!selectOn); const selectButtonDisabled = view !== 'list'; if (showSelect && selectOn) { selectButton = ; } function DirectoryFilesRefreshButton({directory}) { const {t} = useContext(ThemeContext); const [loading, setLoading] = React.useState(false); const [name, setName] = React.useState('refresh'); const handleClick = async () => { setLoading(true); await refreshDirectoryFiles(directory); setLoading(false); setName('check'); } return <> ; } export function FilesRoute() { return ( }/> ); }