import { Backdrop, Button, Checkbox, CircularProgress, Container, Dialog, DialogActions, DialogContent, DialogContentText, DialogTitle, List, ListItem, ListItemButton, ListItemIcon, ListItemText, Paper, SpeedDial, SpeedDialAction, SpeedDialIcon } from '@mui/material' import DeleteForeverIcon from '@mui/icons-material/DeleteForever' import VideoFileIcon from '@mui/icons-material/VideoFile' import { Buffer } from 'buffer' import { useEffect, useMemo, useState } from 'react' import { useSelector } from 'react-redux' import { BehaviorSubject, Subject, combineLatestWith, map, share } from 'rxjs' import { useObservable } from './hooks/observable' import { RootState } from './stores/store' import { DeleteRequest, DirectoryEntry } from './types' export default function Downloaded() { const settings = useSelector((state: RootState) => state.settings) const [openDialog, setOpenDialog] = useState(false) const serverAddr = `${window.location.protocol}//${settings.serverAddr}:${settings.serverPort}` const files$ = useMemo(() => new Subject(), []) const selected$ = useMemo(() => new BehaviorSubject([]), []) const fetcher = () => fetch(`${serverAddr}/downloaded`) .then(res => res.json()) .then(data => files$.next(data)) const selectable$ = useMemo(() => files$.pipe( combineLatestWith(selected$), map(([data, selected]) => data.map(x => ({ ...x, selected: selected.includes(x.name) }))), share() ), []) const selectable = useObservable(selectable$, []) const addSelected = (name: string) => { selected$.value.includes(name) ? selected$.next(selected$.value.filter(val => val !== name)) : selected$.next([...selected$.value, name]) } const deleteSelected = () => { Promise.all(selectable .filter(entry => entry.selected) .map(entry => fetch(`${serverAddr}/delete`, { method: 'POST', headers: { 'Content-Type': 'application/json', }, body: JSON.stringify({ path: entry.path, shaSum: entry.shaSum, } as DeleteRequest) })) ).then(fetcher) } useEffect(() => { fetcher() }, [settings.serverAddr, settings.serverPort]) return ( theme.zIndex.drawer + 1 }} open={!(files$.observed)} > {selectable.length === 0 && 'No files found'} {selectable.map((file) => ( addSelected(file.name)} /> } disablePadding > window.open( `${serverAddr}/play?path=${Buffer.from(file.path).toString('hex')}` )} /> ))} } > } tooltipTitle={`Delete selected`} tooltipOpen onClick={() => setOpenDialog(true)} /> setOpenDialog(false)} > Are you sure? You're deleting:
    {selected$.value.map((entry, idx) => (
  • {entry}
  • ))}
) }