Spaces:
Runtime error
Runtime error
/** | |
* Copyright (c) Meta Platforms, Inc. and affiliates. | |
* | |
* Licensed under the Apache License, Version 2.0 (the "License"); | |
* you may not use this file except in compliance with the License. | |
* You may obtain a copy of the License at | |
* | |
* http://www.apache.org/licenses/LICENSE-2.0 | |
* | |
* Unless required by applicable law or agreed to in writing, software | |
* distributed under the License is distributed on an "AS IS" BASIS, | |
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |
* See the License for the specific language governing permissions and | |
* limitations under the License. | |
*/ | |
import useUploadVideo from '@/common/components/gallery/useUploadVideo'; | |
import useScreenSize from '@/common/screen/useScreenSize'; | |
import {VideoData} from '@/demo/atoms'; | |
import {MAX_UPLOAD_FILE_SIZE} from '@/demo/DemoConfig'; | |
import {BLUE_PINK_FILL_BR} from '@/theme/gradientStyle'; | |
import {RetryFailed, Upload} from '@carbon/icons-react'; | |
import {CSSProperties, ReactNode} from 'react'; | |
import {Loading} from 'react-daisyui'; | |
type Props = { | |
style: CSSProperties; | |
onUpload: (video: VideoData) => void; | |
onUploadStart?: () => void; | |
onUploadError?: (error: Error) => void; | |
}; | |
export default function VideoGalleryUploadVideo({ | |
style, | |
onUpload, | |
onUploadStart, | |
onUploadError, | |
}: Props) { | |
const {getRootProps, getInputProps, isUploading, error} = useUploadVideo({ | |
onUpload, | |
onUploadStart, | |
onUploadError, | |
}); | |
const {isMobile} = useScreenSize(); | |
return ( | |
<div className={`cursor-pointer ${BLUE_PINK_FILL_BR}`} style={style}> | |
<span {...getRootProps()}> | |
<input {...getInputProps()} /> | |
<div className="relative w-full h-full"> | |
<div className="absolute top-1/2 left-1/2 -translate-x-1/2 -translate-y-1/2"> | |
{isUploading && ( | |
<IconWrapper | |
icon={ | |
<Loading | |
size={isMobile ? 'md' : 'lg'} | |
className="text-white" | |
/> | |
} | |
title="Uploading ..." | |
/> | |
)} | |
{error !== null && ( | |
<IconWrapper | |
icon={<RetryFailed color="white" size={isMobile ? 24 : 32} />} | |
title={error} | |
/> | |
)} | |
{!isUploading && error === null && ( | |
<IconWrapper | |
icon={<Upload color="white" size={isMobile ? 24 : 32} />} | |
title={ | |
<> | |
Upload{' '} | |
<div className="text-xs opacity-70"> | |
Max {MAX_UPLOAD_FILE_SIZE} | |
</div> | |
</> | |
} | |
/> | |
)} | |
</div> | |
</div> | |
</span> | |
</div> | |
); | |
} | |
type IconWrapperProps = { | |
icon: ReactNode; | |
title: ReactNode | string; | |
}; | |
function IconWrapper({icon, title}: IconWrapperProps) { | |
return ( | |
<> | |
<div className="flex justify-center">{icon}</div> | |
<div className="mt-1 text-sm md:text-lg text-white font-medium text-center leading-tight"> | |
{title} | |
</div> | |
</> | |
); | |
} | |