import makeStyles from '@material-ui/core/styles/makeStyles' import React, { useEffect } from 'react' import { ReactNode } from 'react' import { useNavigate } from 'react-router-dom' import { ClientGraphicsRendererProcessValidBuildState } from '../models/ClientGraphicsRendererProcessState' import { AnimationDevelopmentPage, AnimationDevelopmentPageProps, } from './components/AnimationDevelopmentPage' import { InvalidBuildClientGraphicsRendererProcessPage } from './components/InvalidBuildClientGraphicsRendererProcessPage' import { ValidBuildClientGraphicsRendererProcessPage } from './components/ValidBuildClientGraphicsRendererProcessPage' import { ViewResultLinkButton } from './components/ViewResultLinkButton' import { useManagedScrollContainerRef } from './hooks/useManagedScrollContainerRef' import { AssetBaseRoute } from './models' export interface AnimationDevelopmentLogsPageProps< SomeAssetBaseRoute extends AssetBaseRoute > extends Pick< AnimationDevelopmentPageProps, 'graphicsRendererProcessKey' | 'assetBaseRoute' | 'viewSubRoute' > {} export function AnimationDevelopmentLogsPage< SomeAssetBaseRoute extends AssetBaseRoute >(props: AnimationDevelopmentLogsPageProps) { const { graphicsRendererProcessKey, assetBaseRoute, viewSubRoute } = props return ( { const { managedScrollContainerRef, automatedScrollEnabled } = useManagedScrollContainerRef({ graphicsRendererProcessKey, clientGraphicsRendererProcessState, localStorageKey: 'animation-development-logs-display', }) const navigateToRoute = useNavigate() useEffect(() => { if ( automatedScrollEnabled && ((clientGraphicsRendererProcessState.buildStatus === 'invalidBuild' && clientGraphicsRendererProcessState.buildVersion !== previousClientGraphicsRendererProcessState?.buildVersion) || (clientGraphicsRendererProcessState.buildStatus === 'validBuild' && previousClientGraphicsRendererProcessState?.buildStatus === 'validBuild' && (clientGraphicsRendererProcessState.graphicsRendererProcessStatus === 'processSuccessful' || clientGraphicsRendererProcessState.graphicsRendererProcessStatus === 'processFailed') && clientGraphicsRendererProcessState.graphicsRendererProcessStatus !== previousClientGraphicsRendererProcessState?.graphicsRendererProcessStatus)) ) { navigateToRoute(`${assetBaseRoute}/result`) } }, [ clientGraphicsRendererProcessState, previousClientGraphicsRendererProcessState, ]) switch (clientGraphicsRendererProcessState.buildStatus) { case 'invalidBuild': return ( ) : null } /> } /> ) case 'validBuild': return ( ) : clientGraphicsRendererProcessState.graphicsRendererProcessStatus === 'processFailed' ? ( ) : null } /> } /> ) } }} /> ) } export interface AnimationDevelopmentLogsDisplayProps extends Pick< ClientGraphicsRendererProcessValidBuildState, 'graphicsRendererProcessStdoutLog' >, Pick< ReturnType, 'managedScrollContainerRef' > { resultLink: ReactNode } function AnimationDevelopmentLogsDisplay( props: AnimationDevelopmentLogsDisplayProps ) { const { managedScrollContainerRef, graphicsRendererProcessStdoutLog, resultLink, } = props const styles = useAnimationDevelopmentLogsDisplayStyles() return (
{graphicsRendererProcessStdoutLog} {resultLink}
) } const useAnimationDevelopmentLogsDisplayStyles = makeStyles((theme) => ({ logsDisplayContainer: { flexShrink: 1, flexGrow: 1, padding: theme.spacing(1), overflow: 'auto', lineHeight: '1.25rem', whiteSpace: 'pre-wrap', fontSize: 12, }, }))