@@ -42,6 +42,7 @@ interface ChatTextAreaProps {
4242 onSend : ( ) => void
4343 onSelectImages : ( ) => void
4444 shouldDisableImages : boolean
45+ supportsVideo ?: boolean
4546 onHeightChange ?: ( height : number ) => void
4647 mode : Mode
4748 setMode : ( value : Mode ) => void
@@ -64,6 +65,7 @@ const ChatTextArea = forwardRef<HTMLTextAreaElement, ChatTextAreaProps>(
6465 onSend,
6566 onSelectImages,
6667 shouldDisableImages,
68+ supportsVideo = false ,
6769 onHeightChange,
6870 mode,
6971 setMode,
@@ -598,17 +600,21 @@ const ChatTextArea = forwardRef<HTMLTextAreaElement, ChatTextAreaProps>(
598600 return
599601 }
600602
601- const acceptedTypes = [ "png" , "jpeg" , "webp" ]
603+ const acceptedImageTypes = [ "png" , "jpeg" , "webp" ]
604+ const acceptedVideoTypes = supportsVideo ? [ "mp4" , "mov" , "avi" , "webm" ] : [ ]
602605
603- const imageItems = Array . from ( items ) . filter ( ( item ) => {
606+ const mediaItems = Array . from ( items ) . filter ( ( item ) => {
604607 const [ type , subtype ] = item . type . split ( "/" )
605- return type === "image" && acceptedTypes . includes ( subtype )
608+ return (
609+ ( type === "image" && acceptedImageTypes . includes ( subtype ) ) ||
610+ ( type === "video" && acceptedVideoTypes . includes ( subtype ) )
611+ )
606612 } )
607613
608- if ( ! shouldDisableImages && imageItems . length > 0 ) {
614+ if ( ! shouldDisableImages && mediaItems . length > 0 ) {
609615 e . preventDefault ( )
610616
611- const imagePromises = imageItems . map ( ( item ) => {
617+ const mediaPromises = mediaItems . map ( ( item ) => {
612618 return new Promise < string | null > ( ( resolve ) => {
613619 const blob = item . getAsFile ( )
614620
@@ -633,8 +639,8 @@ const ChatTextArea = forwardRef<HTMLTextAreaElement, ChatTextAreaProps>(
633639 } )
634640 } )
635641
636- const imageDataArray = await Promise . all ( imagePromises )
637- const dataUrls = imageDataArray . filter ( ( dataUrl ) : dataUrl is string => dataUrl !== null )
642+ const mediaDataArray = await Promise . all ( mediaPromises )
643+ const dataUrls = mediaDataArray . filter ( ( dataUrl ) : dataUrl is string => dataUrl !== null )
638644
639645 if ( dataUrls . length > 0 ) {
640646 setSelectedImages ( ( prevImages ) => [ ...prevImages , ...dataUrls ] . slice ( 0 , MAX_IMAGES_PER_MESSAGE ) )
@@ -643,7 +649,7 @@ const ChatTextArea = forwardRef<HTMLTextAreaElement, ChatTextAreaProps>(
643649 }
644650 }
645651 } ,
646- [ shouldDisableImages , setSelectedImages , cursorPosition , setInputValue , inputValue , t ] ,
652+ [ shouldDisableImages , setSelectedImages , cursorPosition , setInputValue , inputValue , t , supportsVideo ] ,
647653 )
648654
649655 const handleMenuMouseDown = useCallback ( ( ) => {
@@ -732,15 +738,19 @@ const ChatTextArea = forwardRef<HTMLTextAreaElement, ChatTextAreaProps>(
732738 const files = Array . from ( e . dataTransfer . files )
733739
734740 if ( files . length > 0 ) {
735- const acceptedTypes = [ "png" , "jpeg" , "webp" ]
741+ const acceptedImageTypes = [ "png" , "jpeg" , "webp" ]
742+ const acceptedVideoTypes = supportsVideo ? [ "mp4" , "mov" , "avi" , "webm" ] : [ ]
736743
737- const imageFiles = files . filter ( ( file ) => {
744+ const mediaFiles = files . filter ( ( file ) => {
738745 const [ type , subtype ] = file . type . split ( "/" )
739- return type === "image" && acceptedTypes . includes ( subtype )
746+ return (
747+ ( type === "image" && acceptedImageTypes . includes ( subtype ) ) ||
748+ ( type === "video" && acceptedVideoTypes . includes ( subtype ) )
749+ )
740750 } )
741751
742- if ( ! shouldDisableImages && imageFiles . length > 0 ) {
743- const imagePromises = imageFiles . map ( ( file ) => {
752+ if ( ! shouldDisableImages && mediaFiles . length > 0 ) {
753+ const mediaPromises = mediaFiles . map ( ( file ) => {
744754 return new Promise < string | null > ( ( resolve ) => {
745755 const reader = new FileReader ( )
746756
@@ -758,8 +768,8 @@ const ChatTextArea = forwardRef<HTMLTextAreaElement, ChatTextAreaProps>(
758768 } )
759769 } )
760770
761- const imageDataArray = await Promise . all ( imagePromises )
762- const dataUrls = imageDataArray . filter ( ( dataUrl ) : dataUrl is string => dataUrl !== null )
771+ const mediaDataArray = await Promise . all ( mediaPromises )
772+ const dataUrls = mediaDataArray . filter ( ( dataUrl ) : dataUrl is string => dataUrl !== null )
763773
764774 if ( dataUrls . length > 0 ) {
765775 setSelectedImages ( ( prevImages ) =>
@@ -785,6 +795,7 @@ const ChatTextArea = forwardRef<HTMLTextAreaElement, ChatTextAreaProps>(
785795 shouldDisableImages ,
786796 setSelectedImages ,
787797 t ,
798+ supportsVideo ,
788799 ] ,
789800 )
790801
0 commit comments