import { RefObject } from 'react'; import React, { FC, memo, useRef } from '../../lib/teact/teact'; import useShowTransition from '../../hooks/useShowTransition'; import useTransitionForMedia from '../../hooks/useTransitionForMedia'; import buildClassName from '../../util/buildClassName'; import { formatMediaDateTime, formatPastTimeShort } from '../../util/dateFormat'; import { getColorFromExtension, getFileSizeString } from './helpers/documentInfo'; import { getDocumentThumbnailDimensions } from './helpers/mediaDimensions'; import renderText from './helpers/renderText'; import useLang from '../../hooks/useLang'; import ProgressSpinner from '../ui/ProgressSpinner'; import Link from '../ui/Link'; import './File.scss'; type OwnProps = { ref?: RefObject; name: string; extension?: string; size: number; timestamp?: number; sender?: string; thumbnailDataUri?: string; previewData?: string; className?: string; smaller?: boolean; isTransferring?: boolean; isUploading?: boolean; isSelectable?: boolean; isSelected?: boolean; transferProgress?: number; actionIcon?: string; onClick?: () => void; onDateClick?: (e: React.MouseEvent) => void; }; const File: FC = ({ ref, name, size, extension = '', timestamp, sender, thumbnailDataUri, previewData, className, smaller, isTransferring, isUploading, isSelectable, isSelected, transferProgress, actionIcon, onClick, onDateClick, }) => { const lang = useLang(); // eslint-disable-next-line no-null/no-null let elementRef = useRef(null); if (ref) { elementRef = ref; } const { shouldRender: shouldSpinnerRender, transitionClassNames: spinnerClassNames, } = useShowTransition(isTransferring, undefined, true); const color = getColorFromExtension(extension); const sizeString = getFileSizeString(size); const { shouldRenderThumb, shouldRenderFullMedia, transitionClassNames, } = useTransitionForMedia(previewData, 'slow'); const { width, height } = getDocumentThumbnailDimensions(smaller); const fullClassName = buildClassName( 'File', className, smaller && 'smaller', onClick && !isUploading && 'interactive', isSelected && 'file-is-selected', ); return (
{isSelectable && (
{isSelected && }
)}
{thumbnailDataUri || previewData ? (
{shouldRenderThumb && ( )} {shouldRenderFullMedia && ( )}
) : (
{extension.length <= 4 && ( {extension} )}
)} {shouldSpinnerRender && (
)} {onClick && ( )}
{renderText(name)}
{isTransferring && transferProgress ? `${Math.round(transferProgress * 100)}%` : sizeString} {sender && {renderText(sender)}} {!sender && timestamp && ( <> {' '} {formatMediaDateTime(lang, timestamp * 1000)} )}
{sender && timestamp && ( {formatPastTimeShort(lang, timestamp * 1000)} )}
); }; export default memo(File);