import * as React from 'react'; import {augmentAudioFile, getMimeTypeDescription} from 'packages/web-kitchensink-reactnext/src/utils/blob'; import { formatFileSize, formatNumeral, formatSecondsDurationConcise, formatSecondsDurationPrecise, } from 'packages/web-kitchensink-reactnext/src/utils/numeral'; import theme from 'packages/web-kitchensink-reactnext/src/styles/theme'; import {useMediaControls} from '../../hooks/interactive'; import {useFileMetadata, useFileUrl} from 'src/index'; import clsx from 'clsx'; import {SpectrogramCanvas, WaveformCanvas} from 'packages/web-kitchensink-reactnext/src/packages/react-wavesurfer'; import {Slider} from 'categories/number/react'; import {KeyValueTable} from 'categories/information/react'; import {useClientSide} from 'packages/react-utils'; import type {CommonPreviewProps} from '../../../../../categories/blob/react/src/components/FileSelectBox'; export type AudioFilePreviewDerivedElement = HTMLAudioElement; export interface AudioFilePreviewProps = Partial> extends Omit, 'controls'>, CommonPreviewProps {} export const AudioFilePreview = React.forwardRef(({ file, style, className, enhanced: enhancedProp = false, disabled = false, ...etcProps }, forwardedRef) => { const { fileWithUrl } = useFileUrl({ file, }); const { fileWithMetadata, error } = useFileMetadata({ file: fileWithUrl, augmentFunction: augmentAudioFile, }); const { mediaControllerRef, refreshControls, reset, updateSeekFromPlayback, isPlaying, isSeeking, currentTimeDisplay = 0, seekTimeDisplay = 0, durationDisplay = 0, isSeekTimeCountingDown, adjustVolume, volumeRef, handleAction, filenameRef, seekRef, startSeek, endSeek, setSeek, visualizationId, formId, } = useMediaControls({ controllerRef: forwardedRef, visualizationMode: 'waveform', }); const { clientSide } = useClientSide({ clientSide: enhancedProp }); if (!fileWithMetadata) { return null; } const finalSeekTimeDisplay = isSeekTimeCountingDown ? (durationDisplay - seekTimeDisplay) : seekTimeDisplay; const finalCurrentTimeDisplay = isSeekTimeCountingDown ? (durationDisplay - currentTimeDisplay) : currentTimeDisplay; return (
{ typeof fileWithMetadata.url === 'string' && (
{clientSide && ( <>
Math.floor(Number(c) / 2)).join(' ')})`} interact // waveColor={`rgb(${theme.primary})`} // barHeight={4} // minPxPerSec={20000} // hideScrollbar // autoCenter // autoScroll />
)}
{clientSide && (
{formatSecondsDurationConcise(durationDisplay)}
)}
) }
{clientSide && (
Controls
)}
); }); AudioFilePreview.displayName = 'AudioFilePreview';