diff --git a/src/files-ui/components/file-card/FileCard.tsx b/src/files-ui/components/file-card/FileCard.tsx index 985d7a94e93c51d029a2890a9a81e80d7bccb88b..065c9abbc9cfa85901b5c6f8adde2a7e84904d90 100644 --- a/src/files-ui/components/file-card/FileCard.tsx +++ b/src/files-ui/components/file-card/FileCard.tsx @@ -77,6 +77,7 @@ const FileCard: React.FC<FileCardProps> = (props: FileCardProps) => { localization, preview, imageUrl, + videoUrl, info, backgroundBlurImage = true, darkMode, @@ -107,8 +108,6 @@ const FileCard: React.FC<FileCardProps> = (props: FileCardProps) => { //ref for anchor element const downloadRef = React.useRef<HTMLAnchorElement>(null); - const downloadAnchorRef = React.useRef<HTMLAnchorElement>(null); - //className created const finalClassName: string = makeFileCardClassName( elevation, @@ -127,21 +126,22 @@ const FileCard: React.FC<FileCardProps> = (props: FileCardProps) => { const localProgress: number | undefined = useProgress(progress, xhr); //Initialize File Item - const [isReady, isImage, isVideo, url, imageSource]: [ + const [isReady, isImage, isVideo, url, imageSource, videoSource]: [ boolean, boolean, boolean, string, - string | undefined + string | undefined, + File | string | undefined ] = useFileMosaicInitializer( file, propName, propType, valid, preview as boolean, - imageUrl + imageUrl, + videoUrl ); - //The size formatted and rounded in 2 decimals const sizeFormatted: string = localSize ? fileSizeFormater(localSize) @@ -343,15 +343,11 @@ const FileCard: React.FC<FileCardProps> = (props: FileCardProps) => { <FileCardRightActions deleteIcon={onDelete !== undefined} onDelete={handleDelete} - darkMode={darkMode} - valid={valid} - uploadStatus={uploadStatus} - localization={localization} - sizeFormatted={sizeFormatted} + darkMode={darkMode} imageIcon={isImage && onSee !== undefined} onSee={() => onSee?.(imageSource)} videoIcon={isVideo && onWatch !== undefined} - onWatch={() => onWatch?.(file)} + onWatch={() => onWatch?.(videoSource)} downloadIcon={onDownload !== undefined || downloadUrl !== undefined} onDownload={handleDownload} infoIcon={info !== undefined} diff --git a/src/files-ui/components/file-card/components/FileCardRightActions.tsx b/src/files-ui/components/file-card/components/FileCardRightActions.tsx index dbba7d5212d4ac3d2ccc9b88458cddc9314c5fc5..2cb660fb57fe4bd2aed77502de10d51b0e4da399 100644 --- a/src/files-ui/components/file-card/components/FileCardRightActions.tsx +++ b/src/files-ui/components/file-card/components/FileCardRightActions.tsx @@ -13,13 +13,7 @@ declare type FileCardRightActionsProps = { darkMode?: boolean; deleteIcon?: boolean; onDelete?: Function; - - valid: boolean | null | undefined; - uploadStatus?: UPLOADSTATUS; - localization?: Localization; - - sizeFormatted: string; - + imageIcon: boolean; onSee: ((imageSource: string | undefined) => void) | undefined; @@ -49,87 +43,84 @@ const FileCardRightActions: React.FC<FileCardRightActionsProps> = ( onOpenInfo, onSee, onWatch, - sizeFormatted, - valid, + videoIcon, - localization, - uploadStatus, isActive, - visible + visible, } = props; -if(visible) - return ( - <> - <div className="file-card-right-layer-header"> - {isActive && deleteIcon && ( - <Clear - className={ - darkMode ? "files-ui-file-icon dark-mode" : "files-ui-file-icon" - } - color={darkMode ? "#121212" : "rgba(255,255,255,0.851)"} - onClick={onDelete} - size="small" - colorFill="transparent" - /> - )} - </div> - <div className="file-card-right-layer-footer"> - {isActive && ( - <React.Fragment> - {imageIcon && ( - <Visibility - className={ - darkMode - ? "files-ui-file-icon dark-mode" - : "files-ui-file-icon" - } - color={darkMode ? "#121212" : "rgba(255,255,255,0.851)"} - onClick={onSee} - size="small" - /> - )} + if (visible) + return ( + <> + <div className="file-card-right-layer-header"> + {isActive && deleteIcon && ( + <Clear + className={ + darkMode ? "files-ui-file-icon dark-mode" : "files-ui-file-icon" + } + color={darkMode ? "#121212" : "rgba(255,255,255,0.851)"} + onClick={onDelete} + size="small" + colorFill="transparent" + /> + )} + </div> + <div className="file-card-right-layer-footer"> + {isActive && ( + <React.Fragment> + {imageIcon && ( + <Visibility + className={ + darkMode + ? "files-ui-file-icon dark-mode" + : "files-ui-file-icon" + } + color={darkMode ? "#121212" : "rgba(255,255,255,0.851)"} + onClick={onSee} + size="small" + /> + )} - {videoIcon && ( - <PlayIcon - className={ - darkMode - ? "files-ui-file-icon dark-mode" - : "files-ui-file-icon" - } - color={darkMode ? "#121212" : "rgba(255,255,255,0.851)"} - onClick={onWatch} - size="small" - /> - )} - {downloadIcon && ( - <DownloadFile - className={ - darkMode - ? "files-ui-file-icon dark-mode" - : "files-ui-file-icon" - } - color={darkMode ? "#121212" : "rgba(255,255,255,0.851)"} - onClick={onDownload} - size="small" - /> - )} - {infoIcon && ( - <InfoDisney - className={ - darkMode - ? "files-ui-file-icon dark-mode" - : "files-ui-file-icon" - } - onClick={onOpenInfo} - color={darkMode ? "#121212" : "rgba(255,255,255,0.851)"} - size="micro" - /> - )} - </React.Fragment> - )} - </div> - </> - ) - return <></> + {videoIcon && ( + <PlayIcon + className={ + darkMode + ? "files-ui-file-icon dark-mode" + : "files-ui-file-icon" + } + color={darkMode ? "#121212" : "rgba(255,255,255,0.851)"} + onClick={onWatch} + size="small" + /> + )} + {downloadIcon && ( + <DownloadFile + className={ + darkMode + ? "files-ui-file-icon dark-mode" + : "files-ui-file-icon" + } + color={darkMode ? "#121212" : "rgba(255,255,255,0.851)"} + onClick={onDownload} + size="small" + /> + )} + {infoIcon && ( + <InfoDisney + className={ + darkMode + ? "files-ui-file-icon dark-mode" + : "files-ui-file-icon" + } + onClick={onOpenInfo} + color={darkMode ? "#121212" : "rgba(255,255,255,0.851)"} + size="micro" + /> + )} + </React.Fragment> + )} + </div> + </> + ); + return <></>; }; export default FileCardRightActions; diff --git a/src/files-ui/components/file-mosaic/components/file-mosaic/FileMosaic.tsx b/src/files-ui/components/file-mosaic/components/file-mosaic/FileMosaic.tsx index 696d21da28c042eac3b955018999109c034252a8..261d30fbdd236e192637d06ba1f15ea8dc3f2679 100644 --- a/src/files-ui/components/file-mosaic/components/file-mosaic/FileMosaic.tsx +++ b/src/files-ui/components/file-mosaic/components/file-mosaic/FileMosaic.tsx @@ -37,6 +37,7 @@ const FileMosaic: React.FC<FileMosaicProps> = (props: FileMosaicProps) => { localization, preview, imageUrl, + videoUrl, info, backgroundBlurImage = true, darkMode, @@ -60,7 +61,7 @@ const FileMosaic: React.FC<FileMosaicProps> = (props: FileMosaicProps) => { onRightClick, } = props; - // console.log("FileMosaic progress " + id, progress); + // console.log("FileMosaic progress " + id, progress); //ref for anchor download element const downloadRef = React.useRef<HTMLAnchorElement>(null); @@ -90,19 +91,21 @@ const FileMosaic: React.FC<FileMosaicProps> = (props: FileMosaicProps) => { //console.log("FileMosaic progress localProgress " + localProgress); //Initialize File Item - const [isReady, isImage, isVideo, url, imageSource]: [ + const [isReady, isImage, isVideo, url, imageSource, videoSource]: [ boolean, boolean, boolean, string, - string | undefined + string | undefined, + File | string | undefined ] = useFileMosaicInitializer( file, propName, propType, valid, preview as boolean, - imageUrl + imageUrl, + videoUrl ); //The size formatted and rounded in 2 decimals @@ -250,7 +253,7 @@ const FileMosaic: React.FC<FileMosaicProps> = (props: FileMosaicProps) => { imageIcon={isImage && onSee !== undefined} onSee={() => onSee?.(imageSource)} videoIcon={isVideo && onWatch !== undefined} - onWatch={() => onWatch?.(file)} + onWatch={() => onWatch?.(videoSource)} downloadIcon={ onDownload !== undefined || downloadUrl !== undefined } diff --git a/src/files-ui/components/file-mosaic/components/file-mosaic/FileMosaicProps.ts b/src/files-ui/components/file-mosaic/components/file-mosaic/FileMosaicProps.ts index 899f9a6391eea5e8ed9966e5e7de4340744bc660..29d1948f4d7a34dce3179bde51dae77d916b6786 100644 --- a/src/files-ui/components/file-mosaic/components/file-mosaic/FileMosaicProps.ts +++ b/src/files-ui/components/file-mosaic/components/file-mosaic/FileMosaicProps.ts @@ -56,9 +56,15 @@ export interface FileMosaicPropsMap extends OverridableComponentProps { /** * A string representation or web url of the image * that will be set to the "src" prop of an <img/> tag - * <img src={`${url}`} /> + * <img src={`${imageUrl}`} /> */ imageUrl?: string; + /** + * A string representation or web url of the video + * that will be set to the "src" prop of an <video/> tag + * <video src={`${videoUrl}`} /> + */ + videoUrl?: string; /** * If true, a background blur image will be shown */ @@ -91,7 +97,7 @@ export interface FileMosaicPropsMap extends OverridableComponentProps { /** * A function that return a file object when "play" button is presssed or clicked */ - onWatch?: (videoSource: File | undefined) => void; + onWatch?: (videoSource: File | string | undefined) => void; /** * Event that is triggered when `delete` button is clicked or pressed. * If present, `delete` button will be visible. diff --git a/src/files-ui/components/file-mosaic/hooks/useFileMosaicInitializer.ts b/src/files-ui/components/file-mosaic/hooks/useFileMosaicInitializer.ts index e28ec9028fcc6c72c85816cbd04a642fbe72d142..a0a76d02e4ab7577938590b99b281ab44f890e1f 100644 --- a/src/files-ui/components/file-mosaic/hooks/useFileMosaicInitializer.ts +++ b/src/files-ui/components/file-mosaic/hooks/useFileMosaicInitializer.ts @@ -19,14 +19,16 @@ const useFileMosaicInitializer = ( valid: boolean | undefined | null, preview: boolean, imageUrl: string | undefined, + videoUrl: string | undefined, xhr?: XMLHttpRequest, -): [boolean,boolean, boolean, string, string | undefined] => { +): [boolean,boolean, boolean, string, string | undefined, File |string | undefined] => { const [isImage, setIsImage] = React.useState<boolean>(false); const [isVideo, setIsVideo] = React.useState<boolean>(false); const [url, setUrl] = React.useState<string>(""); const [imageSource, setImageSource] = React.useState<string | undefined>(undefined); + const [videoSource, setVideoSource] = React.useState<File | string | undefined>(undefined); const [isReady,setIsReady]=React.useState(false); @@ -37,6 +39,7 @@ const useFileMosaicInitializer = ( valid: boolean | undefined | null, preview: boolean, imageUrl: string | undefined, + videoUrl: string | undefined, xhr?: XMLHttpRequest, progress?: number ) => { @@ -57,10 +60,15 @@ const useFileMosaicInitializer = ( setImageSource(imageUrl); setIsReady(true); return; - } else { + } else if(videoUrl){ + setIsVideo(true); + setVideoSource(videoUrl); + setIsReady(true); + }else { const [headerMime, tailMime] = getHeaderAndTail(file, type); setIsImage(headerMime === "image"); + setIsVideo( headerMime === "video" && ["mp4", "ogg", "webm"].includes(tailMime) ); @@ -93,7 +101,7 @@ const useFileMosaicInitializer = ( ////// CLEAN UP React.useEffect(() => { - init(file, name, type, valid, preview || false, imageUrl); + init(file, name, type, valid, preview || false, imageUrl,videoUrl); return () => { setImageSource(undefined); setIsImage(false); @@ -101,8 +109,9 @@ const useFileMosaicInitializer = ( setIsReady(false); }; // eslint-disable-next-line - }, [file, name, type, valid, preview, imageUrl,]); - return [isReady,isImage, isVideo, url, imageSource]; + }, [file, name, type, valid, preview, imageUrl,videoUrl]); + + return [isReady,isImage, isVideo, url, imageSource,videoSource]; } export default useFileMosaicInitializer;