/** * External dependencies */ import { Button, useBreakpointMatch, Text } from '@automattic/jetpack-components'; import { __ } from '@wordpress/i18n'; import { Icon, cloudUpload } from '@wordpress/icons'; import classnames from 'classnames'; import { DragEvent, useCallback, useState, useRef, ChangeEvent } from 'react'; /** * Internal dependencies */ import { ReactNode } from 'react'; import { allowedVideoExtensions, fileInputExtensions } from '../../../utils/video-extensions'; import styles from './style.module.scss'; import { VideoUploadAreaProps } from './types'; /** * Video Upload Area component * * @param {VideoUploadAreaProps} props - Component props. * @returns {ReactNode} - VideoUploadArea react component. */ const VideoUploadArea = ( { className, onSelectFiles }: VideoUploadAreaProps ) => { const [ isSm ] = useBreakpointMatch( 'sm' ); const [ isDraggingOver, setIsDraggingOver ] = useState( false ); const inputRef = useRef( null ); const handleFileInputChangeEvent = useCallback( ( e: ChangeEvent< HTMLInputElement > ) => { onSelectFiles( Array.from( e.currentTarget.files ) ); }, [ onSelectFiles ] ); const handleClickEvent = useCallback( () => { inputRef.current.click(); }, [] ); const handleDragOverEvent = useCallback( ( event: DragEvent< HTMLInputElement > ) => { event.preventDefault(); setIsDraggingOver( true ); }, [] ); const handleDragLeaveEvent = useCallback( () => { setIsDraggingOver( false ); }, [] ); const handleDropEvent = useCallback( ( event: DragEvent< HTMLInputElement > ) => { event.preventDefault(); setIsDraggingOver( false ); const files = Array.from( event.dataTransfer.files ).filter( file => { return allowedVideoExtensions.some( extension => file.name.endsWith( extension ) ); } ); onSelectFiles( files ); }, [ onSelectFiles ] ); return (