import type { FC } from '../../../lib/teact/teact'; import type React from '../../../lib/teact/teact'; import { memo, useRef } from '../../../lib/teact/teact'; import buildClassName from '../../../util/buildClassName'; import useEffectOnce from '../../../hooks/useEffectOnce'; import useFlag from '../../../hooks/useFlag'; import useLastCallback from '../../../hooks/useLastCallback'; import useResizeObserver from '../../../hooks/useResizeObserver'; import Icon from '../../common/icons/Icon'; import './DropTarget.scss'; export type OwnProps = { isQuick?: boolean; isGeneric?: boolean; onFileSelect: (e: React.DragEvent) => void; }; const DropTarget: FC = ({ isQuick, isGeneric, onFileSelect }) => { const ref = useRef(); const svgRef = useRef(); const [isHovered, markHovered, unmarkHovered] = useFlag(); const handleDragLeave = useLastCallback((e: React.DragEvent) => { const { relatedTarget: toTarget } = e; if (toTarget) { e.stopPropagation(); } unmarkHovered(); }); const handleResize = useLastCallback(() => { const svg = svgRef.current; if (!svg) { return; } const { width, height } = svg.getBoundingClientRect(); svg.viewBox.baseVal.width = width; svg.viewBox.baseVal.height = height; }); // Can't listen for SVG resize useResizeObserver(ref, handleResize); useEffectOnce(handleResize); const className = buildClassName( 'DropTarget', isHovered && 'hovered', ); return (
Drop files here to send them
{!isGeneric &&
{isQuick ? 'in a quick way' : 'without compression'}
}
); }; export default memo(DropTarget);