Files
jellyfin-web/src/components/ConnectionErrorPage.tsx
T
2025-06-25 16:58:54 -04:00

105 lines
3.7 KiB
TypeScript

import DOMPurify from 'dompurify';
import React, { FC, useCallback, useEffect, useState } from 'react';
import { appHost } from 'components/apphost';
import Page from 'components/Page';
import toast from 'components/toast/toast';
import { AppFeature } from 'constants/appFeature';
import LinkButton from 'elements/emby-button/LinkButton';
import globalize from 'lib/globalize';
import { ConnectionState, ServerConnections } from 'lib/jellyfin-apiclient';
interface ConnectionErrorPageProps {
state: ConnectionState
}
const ConnectionErrorPage: FC<ConnectionErrorPageProps> = ({
state
}) => {
const [ title, setTitle ] = useState<string>();
const [ htmlMessage, setHtmlMessage ] = useState<string>();
const [ message, setMessage ] = useState<string>();
const [ isConnectDisabled, setIsConnectDisabled ] = useState(false);
const onForceConnect = useCallback(async () => {
setIsConnectDisabled(true);
try {
const server = ServerConnections.getLastUsedServer();
await ServerConnections.updateSavedServerId(server);
window.location.reload();
} catch (err) {
console.error('[ConnectionErrorPage] Failed to force connect to server', err);
toast(globalize.translate('HeaderConnectionFailure'));
setIsConnectDisabled(false);
}
}, []);
useEffect(() => {
switch (state) {
case ConnectionState.ServerMismatch:
setTitle(globalize.translate('HeaderServerMismatch'));
setHtmlMessage(undefined);
setMessage(globalize.translate('MessageServerMismatch'));
return;
case ConnectionState.ServerUpdateNeeded:
setTitle(globalize.translate('HeaderUpdateRequired'));
setHtmlMessage(globalize.translate(
'ServerUpdateNeeded',
'<a href="https://jellyfin.org/downloads/server/">jellyfin.org/downloads/server</a>'
));
setMessage(undefined);
return;
case ConnectionState.Unavailable:
setTitle(globalize.translate('HeaderServerUnavailable'));
setHtmlMessage(undefined);
setMessage(globalize.translate('MessageUnableToConnectToServer'));
}
}, [ state ]);
if (!title) return;
return (
<Page
id='connectionErrorPage'
className='mainAnimatedPage standalonePage'
isBackButtonEnabled={false}
>
<div className='padded-left padded-right'>
<h1>{title}</h1>
{htmlMessage && (
<p
dangerouslySetInnerHTML={{ __html: DOMPurify.sanitize(htmlMessage) }}
style={{ maxWidth: '80ch' }}
/>
)}
{message && (
<p style={{ maxWidth: '80ch' }}>
{message}
</p>
)}
{appHost.supports(AppFeature.MultiServer) && (
<LinkButton
className='raised'
href='/selectserver'
>
{globalize.translate('ButtonChangeServer')}
</LinkButton>
)}
{state === ConnectionState.ServerMismatch && (
<LinkButton
onClick={onForceConnect}
style={ isConnectDisabled ? { pointerEvents: 'none' } : undefined }
>
{globalize.translate('ConnectAnyway')}
</LinkButton>
)}
</div>
</Page>
);
};
export default ConnectionErrorPage;