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 DefaultVideoGalleryModalTrigger from '@/common/components/gallery/DefaultVideoGalleryModalTrigger'; | |
import { | |
frameIndexAtom, | |
sessionAtom, | |
uploadingStateAtom, | |
VideoData, | |
} from '@/demo/atoms'; | |
import {spacing} from '@/theme/tokens.stylex'; | |
import {Close} from '@carbon/icons-react'; | |
import stylex from '@stylexjs/stylex'; | |
import {useSetAtom} from 'jotai'; | |
import {ComponentType, useCallback, useRef} from 'react'; | |
import {Modal} from 'react-daisyui'; | |
import DemoVideoGallery from './DemoVideoGallery'; | |
const styles = stylex.create({ | |
container: { | |
position: 'relative', | |
minWidth: '85vw', | |
minHeight: '85vh', | |
overflow: 'hidden', | |
color: '#fff', | |
boxShadow: '0 0 100px 50px #000', | |
borderRadius: 16, | |
border: '2px solid transparent', | |
background: | |
'linear-gradient(#1A1C1F, #1A1C1F) padding-box, linear-gradient(to right bottom, #FB73A5,#595FEF,#94EAE2,#FCCB6B) border-box', | |
}, | |
closeButton: { | |
position: 'absolute', | |
top: 0, | |
right: 0, | |
padding: spacing[3], | |
zIndex: 10, | |
cursor: 'pointer', | |
':hover': { | |
opacity: 0.7, | |
}, | |
}, | |
galleryContainer: { | |
position: 'absolute', | |
top: spacing[4], | |
left: 0, | |
right: 0, | |
bottom: 0, | |
overflowY: 'auto', | |
}, | |
}); | |
export type VideoGalleryTriggerProps = { | |
onClick: () => void; | |
}; | |
type Props = { | |
trigger?: ComponentType<VideoGalleryTriggerProps>; | |
showUploadInGallery?: boolean; | |
onOpen?: () => void; | |
onSelect?: (video: VideoData, isUpload?: boolean) => void; | |
onUploadVideoError?: (error: Error) => void; | |
}; | |
export default function DemoVideoGalleryModal({ | |
trigger: VideoGalleryModalTrigger = DefaultVideoGalleryModalTrigger, | |
showUploadInGallery = false, | |
onOpen, | |
onSelect, | |
onUploadVideoError, | |
}: Props) { | |
const modalRef = useRef<HTMLDialogElement | null>(null); | |
const setFrameIndex = useSetAtom(frameIndexAtom); | |
const setUploadingState = useSetAtom(uploadingStateAtom); | |
const setSession = useSetAtom(sessionAtom); | |
function openModal() { | |
const modal = modalRef.current; | |
if (modal != null) { | |
modal.style.display = 'grid'; | |
modal.showModal(); | |
} | |
} | |
function closeModal() { | |
const modal = modalRef.current; | |
if (modal != null) { | |
modal.close(); | |
modal.style.display = 'none'; | |
} | |
} | |
const handleSelect = useCallback( | |
async (video: VideoData, isUpload?: boolean) => { | |
closeModal(); | |
setFrameIndex(0); | |
onSelect?.(video, isUpload); | |
setUploadingState('default'); | |
setSession(null); | |
}, | |
[setFrameIndex, onSelect, setUploadingState, setSession], | |
); | |
function handleUploadVideoStart() { | |
setUploadingState('uploading'); | |
closeModal(); | |
} | |
function handleOpenVideoGalleryModal() { | |
onOpen?.(); | |
openModal(); | |
} | |
return ( | |
<> | |
<VideoGalleryModalTrigger onClick={handleOpenVideoGalleryModal} /> | |
<Modal ref={modalRef} {...stylex.props(styles.container)}> | |
<div onClick={closeModal} {...stylex.props(styles.closeButton)}> | |
<Close size={28} /> | |
</div> | |
<Modal.Body> | |
<div {...stylex.props(styles.galleryContainer)}> | |
<DemoVideoGallery | |
showUploadInGallery={showUploadInGallery} | |
onSelect={video => handleSelect(video)} | |
onUpload={video => handleSelect(video, true)} | |
onUploadStart={handleUploadVideoStart} | |
onUploadError={onUploadVideoError} | |
/> | |
</div> | |
</Modal.Body> | |
</Modal> | |
</> | |
); | |
} | |