import { useRef } from 'react'; import { Box, Button, Card, CardBody, Collapse, GridItem, Link, VStack, Wrap, WrapItem, useDisclosure, } from '@chakra-ui/react'; import { FileRowResponsiveGrid } from './FileRowResponsiveGrid'; import { DecryptedAudioFile, deleteFile, ProcessState } from './fileListingSlice'; import { useAppDispatch } from '~/hooks'; import { AnimationDefinition } from 'framer-motion'; import { AlbumImage } from './AlbumImage'; import { SongMetadata } from './SongMetadata'; import { FileError } from './FileError'; interface FileRowProps { id: string; file: DecryptedAudioFile; } export function FileRow({ id, file }: FileRowProps) { const { isOpen, onClose } = useDisclosure({ defaultIsOpen: true }); const dispatch = useAppDispatch(); const isDecrypted = file.state === ProcessState.COMPLETE; const metadata = file.metadata; const nameWithoutExt = file.fileName.replace(/\.[a-z\d]{3,6}$/, ''); const decryptedName = nameWithoutExt + '.' + file.ext; const audioPlayerRef = useRef(null); const togglePlay = () => { const player = audioPlayerRef.current; if (!player) { return; } if (player.paused) { player.play(); } else { player.pause(); } }; const onCollapseAnimationComplete = (definition: AnimationDefinition) => { if (definition === 'exit') { dispatch(deleteFile({ id })); } }; return ( {metadata?.name ?? nameWithoutExt} {isDecrypted && metadata && } {file.state === ProcessState.ERROR && } {file.decrypted && ); }