import * as THREE from 'three'; import { Button, Dialog, DialogContent, DialogTitle, IconButton, Typography, } from '@mui/material'; import CloseIcon from '@mui/icons-material/Close'; import {XRConfigProps} from './XRConfig'; import {useEffect, useRef, useState} from 'react'; import './XRDialog.css'; import {getRenderer, init, updatetranslationText} from './XRRendering'; import ARButton from './ARButton'; import {getURLParams} from '../URLParams'; function XRContent(props: XRConfigProps) { const debugParam = getURLParams().debug; const {translationSentences} = props; useEffect(() => { updatetranslationText(translationSentences); }, [translationSentences]); const [renderer, setRenderer] = useState<THREE.WebGLRenderer | null>(null); const canvasRef = useRef<HTMLDivElement | null>(null); useEffect(() => { if (canvasRef.current != null || debugParam === false) { const existingRenderer = getRenderer(); if (existingRenderer) { setRenderer(existingRenderer); } else { const newRenderer = init( 400, 300, debugParam ? canvasRef.current : null, ); setRenderer(newRenderer); } } }, [canvasRef.current]); return ( <DialogContent dividers className="xr-dialog-container xr-dialog-text-center"> <Typography gutterBottom> Welcome to the Seamless team streaming demo experience! In this demo you will experience AI powered text and audio translation in real time. </Typography> <div ref={canvasRef} className="xr-dialog-canvas-container" /> <ARButton bufferedSpeechPlayer={props.bufferedSpeechPlayer} renderer={renderer} onARHidden={props.onARHidden} onARVisible={props.onARVisible} /> </DialogContent> ); } export default function XRDialog(props: XRConfigProps) { const [isDialogOpen, setIsDialogOpen] = useState<boolean>(false); return ( <> <Button variant="contained" onClick={() => setIsDialogOpen(true)}> Enter AR Experience </Button> {isDialogOpen && ( <Dialog onClose={() => setIsDialogOpen(false)} open={true}> <DialogTitle sx={{m: 0, p: 2}} className="xr-dialog-text-center"> FAIR Seamless Streaming Demo </DialogTitle> <IconButton aria-label="close" onClick={() => setIsDialogOpen(false)} sx={{ position: 'absolute', right: 8, top: 8, color: (theme) => theme.palette.grey[500], }}> <CloseIcon /> </IconButton> <XRContent {...props} /> </Dialog> )} </> ); }