import type { ElementRef, FC } from '../../lib/teact/teact'; import type React from '../../lib/teact/teact'; import { memo, useMemo, useRef, useState, } from '../../lib/teact/teact'; import type { IconName } from '../../types/icons'; import { IS_CANVAS_FILTER_SUPPORTED } from '../../util/browser/windowEnvironment'; import buildClassName from '../../util/buildClassName'; import { formatMediaDateTime, formatPastTimeShort } from '../../util/dates/dateFormat'; import { getColorFromExtension, getFileSizeString } from './helpers/documentInfo'; import { getDocumentThumbnailDimensions } from './helpers/mediaDimensions'; import renderText from './helpers/renderText'; import useAppLayout from '../../hooks/useAppLayout'; import useCanvasBlur from '../../hooks/useCanvasBlur'; import useMediaTransitionDeprecated from '../../hooks/useMediaTransitionDeprecated'; import useOldLang from '../../hooks/useOldLang'; import useShowTransitionDeprecated from '../../hooks/useShowTransitionDeprecated'; import Link from '../ui/Link'; import ProgressSpinner from '../ui/ProgressSpinner'; import Icon from './icons/Icon'; import './File.scss'; type OwnProps = { ref?: ElementRef; id?: string; 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?: IconName; onClick?: () => void; onDateClick?: (e: React.MouseEvent) => void; }; const File: FC = ({ ref, id, name, size, extension = '', timestamp, sender, thumbnailDataUri, previewData, className, smaller, isTransferring, isUploading, isSelectable, isSelected, transferProgress, actionIcon, onClick, onDateClick, }) => { const lang = useOldLang(); let elementRef = useRef(); if (ref) { elementRef = ref; } const { isMobile } = useAppLayout(); const [withThumb] = useState(!previewData); const noThumb = Boolean(previewData); const thumbRef = useCanvasBlur(thumbnailDataUri, noThumb, isMobile && !IS_CANVAS_FILTER_SUPPORTED); const thumbClassNames = useMediaTransitionDeprecated(!noThumb); const { shouldRender: shouldSpinnerRender, transitionClassNames: spinnerClassNames, } = useShowTransitionDeprecated(isTransferring, undefined, true); const color = getColorFromExtension(extension); const sizeString = getFileSizeString(size); const subtitle = useMemo(() => { if (!isTransferring || !transferProgress) return sizeString; return `${getFileSizeString(size * transferProgress)} / ${sizeString}`; }, [isTransferring, size, sizeString, transferProgress]); const { width, height } = getDocumentThumbnailDimensions(smaller); const fullClassName = buildClassName( 'File', className, smaller && 'smaller', onClick && !isUploading && 'interactive', isSelected && 'file-is-selected', ); return (
{isSelectable && (
{isSelected && }
)}
{thumbnailDataUri || previewData ? (
{withThumb && ( )}
) : (
{extension.length <= 4 && ( {extension} )}
)} {shouldSpinnerRender && (
)} {onClick && ( )}
{renderText(name)}
{subtitle} {sender && {renderText(sender)}} {!sender && Boolean(timestamp) && ( <> {formatMediaDateTime(lang, timestamp * 1000, true)} )}
{sender && Boolean(timestamp) && ( {formatPastTimeShort(lang, timestamp * 1000)} )}
); }; export default memo(File);