1 Answer
- Newest
- Most votes
- Most comments
0
import React, { useState, useEffect, useCallback } from 'react';
import { useSelector } from 'react-redux';
import styled from 'styled-components';
import dcv from "./dcvjs-esm/dcv";
import { getStream } from '../../api/dcvController';
const LOG_LEVEL = dcv.LogLevel.INFO;
const TzRender = () => {
const user = useSelector((state) => state.user);
const [message, setMessage] = useState('');
const [authenticated, setAuthenticated] = useState(false);
const [sessionId, setSessionId] = useState("");
const [authToken, setAuthToken] = useState("");
const [credentials, setCredentials] = useState({});
const [sdkLoaded, setSdkLoaded] = useState(false);
const [serverUrl, setServerUrl] = useState('');
const [isLoading, setIsLoading] = useState(false);
const [streamStatus, setStreamStatus] = useState('Initializing Stream...');
const [errorMessage, setErrorMessage] = useState('');
const [connected, setConnected] = useState(false);
const fetchStreamData = useCallback(async () => {
try {
const response = await getStream('tz-owncloud');
if (response.status === 200) {
const data = response.data.data;
setServerUrl(data.serverUrl);
}
} catch (error) {
setErrorMessage('Failed to fetch stream data.');
}
}, []);
useEffect(() => {
if (!connected) {
fetchStreamData();
}
}, [connected, fetchStreamData]);
const onSuccess = (_, result) => {
if (result.length > 0) {
setSessionId(result[0].sessionId);
setAuthToken(result[0].authToken);
setAuthenticated(true);
setIsLoading(false);
setConnected(true);
} else {
setErrorMessage('Session ID not found');
setIsLoading(false);
}
};
const onPromptCredentials = (_, credentialsChallenge) => {
const requestedCredentials = credentialsChallenge.requiredCredentials.reduce((acc, challenge) => {
acc[challenge.name] = "";
return acc;
}, {});
setCredentials(requestedCredentials);
};
const authenticate = useCallback(() => {
dcv.setLogLevel(LOG_LEVEL);
setStreamStatus('Authenticating...');
setIsLoading(true);
const tryAuthenticate = async () => {
if (!serverUrl || !connected) {
await fetchStreamData();
return;
}
const auth = dcv.authenticate(serverUrl, {
promptCredentials: onPromptCredentials,
error: onError,
success: onSuccess,
});
if (!auth.url) {
setIsLoading(false);
setErrorMessage('Failed to start authentication. Please try again.');
}
};
tryAuthenticate();
}, [serverUrl, connected, fetchStreamData]);
const onError = (_, error) => {
console.error(`Error during the authentication: ${error.message}`);
setErrorMessage(error.message);
setIsLoading(false);
};
useEffect(() => {
if (!authenticated && sdkLoaded) {
authenticate();
}
}, [authenticated, sdkLoaded, serverUrl, authenticate]);
const loadSdkAndRender = () => {
setSdkLoaded(true);
setIsLoading(true);
};
const resizeDisplay = () => {
const displayFrame = document.getElementById("dcv-display-frame");
const display = document.getElementById("dcv-display");
const dcvContainer = document.getElementById("dcv-container");
if (dcvContainer && displayFrame && display) {
dcvContainer.style.width = "100vw";
dcvContainer.style.height = "100vh";
displayFrame.style.width = "100vw";
displayFrame.style.height = "100vh";
displayFrame.style.overflow = "hidden";
displayFrame.style.position = "absolute";
displayFrame.style.top = "0";
displayFrame.style.left = "0";
displayFrame.style.zIndex = "1";
display.style.width = "100vw";
display.style.height = "100vh";
display.style.position = "absolute";
display.style.top = "0";
display.style.left = "0";
display.style.zIndex = "1";
display.style.margin = "0"; // Ensure there's no margin
display.style.outline = "none"; // Remove any outline
}
};
useEffect(() => {
if (authenticated && sdkLoaded) {
resizeDisplay();
}
}, [authenticated, sdkLoaded]);
const toggleFullscreen = () => {
const elem = document.documentElement;
if (!document.fullscreenElement) {
elem.requestFullscreen?.() || elem.mozRequestFullScreen?.() || elem.webkitRequestFullscreen?.() || elem.msRequestFullscreen?.();
}
};
return (
<BGContainer>
{!sdkLoaded && (
<Button variant="PinkButton" label="Jump In" disable={isLoading} onClick={loadSdkAndRender} />
)}
{errorMessage && sdkLoaded && !isLoading && !authenticated && (
<Typography variant="pWhite" margin={'3rem 0 3rem 0'}>
{errorMessage}
</Typography>
)}
{sdkLoaded && isLoading && (
<Loader>
<Logo src={PinkIntraverseWithoutBorderLogo} alt="Intraverse Logo" />
<Typography variant="pWhite" margin={'3rem 0 3rem 0'}>
{streamStatus}
</Typography>
<AnimatedBoxes />
</Loader>
)}
{sdkLoaded && !isLoading && authenticated && (
<>
<FullscreenButton onClick={toggleFullscreen}>⛶</FullscreenButton>
<DCVViewer
dcv={{
sessionId,
authToken,
serverUrl,
onDisconnect: handleDisconnect,
logLevel: LOG_LEVEL,
}}
uiConfig={{
toolbar: {
visible: true,
fullscreenButton: true,
multimonitorButton: true,
},
}}
style={{
width: "100%",
height: "100%",
}}
/>
</>
)}
</BGContainer>
);
};
export default TzRender;
answered 2 years ago
Relevant content
asked 4 years ago
asked 4 years ago
asked 2 years ago
asked 2 years ago
- AWS OFFICIALUpdated a year ago
- AWS OFFICIALUpdated 4 months ago
