diff --git a/src/apiclient.d.ts b/src/apiclient.d.ts index 1f38019893..9ad794dd65 100644 --- a/src/apiclient.d.ts +++ b/src/apiclient.d.ts @@ -68,6 +68,7 @@ declare module 'jellyfin-apiclient' { UtcTimeResponse, VirtualFolderInfo } from '@jellyfin/sdk/lib/generated-client'; + import { ConnectionState } from './utils/jellyfin-apiclient/ConnectionState'; class ApiClient { constructor(serverAddress: string, appName: string, appVersion: string, deviceName: string, deviceId: string); @@ -310,12 +311,18 @@ declare module 'jellyfin-apiclient' { setItem(name: string, value: string): void; } + interface ConnectResponse { + ApiClient: ApiClient + Servers: any[] + State: ConnectionState + } + class ConnectionManager { constructor(credentialProvider: Credentials, appName: string, appVersion: string, deviceName: string, deviceId: string, capabilities: ClientCapabilities); addApiClient(apiClient: ApiClient): void; clearData(): void; - connect(options?: any): Promise; + connect(options?: any): Promise; connectToAddress(address: string, options?: any): Promise; connectToServer(server: any, options?: any): Promise; connectToServers(servers: any[], options?: any): Promise; diff --git a/src/components/ConnectionRequired.tsx b/src/components/ConnectionRequired.tsx index b9e83ddb0c..c48f6e9a8f 100644 --- a/src/components/ConnectionRequired.tsx +++ b/src/components/ConnectionRequired.tsx @@ -1,11 +1,13 @@ import React, { FunctionComponent, useEffect, useState } from 'react'; import { Outlet, useNavigate } from 'react-router-dom'; +import type { ConnectResponse } from 'jellyfin-apiclient'; import alert from './alert'; import { appRouter } from './appRouter'; import loading from './loading/loading'; import ServerConnections from './ServerConnections'; import globalize from '../scripts/globalize'; +import { ConnectionState } from '../utils/jellyfin-apiclient/ConnectionState'; enum BounceRoutes { Home = '/home.html', @@ -14,14 +16,6 @@ enum BounceRoutes { StartWizard = '/wizardstart.html' } -// TODO: This should probably be in the SDK -enum ConnectionState { - SignedIn = 'SignedIn', - ServerSignIn = 'ServerSignIn', - ServerSelection = 'ServerSelection', - ServerUpdateNeeded = 'ServerUpdateNeeded' -} - type ConnectionRequiredProps = { isAdminRequired?: boolean, isUserRequired?: boolean @@ -42,7 +36,7 @@ const ConnectionRequired: FunctionComponent = ({ useEffect(() => { // eslint-disable-next-line @typescript-eslint/no-explicit-any - const bounce = async (connectionResponse: any) => { + const bounce = async (connectionResponse: ConnectResponse) => { switch (connectionResponse.State) { case ConnectionState.SignedIn: // Already logged in, bounce to the home page diff --git a/src/components/appRouter.js b/src/components/appRouter.js index 997e99591a..f6f5e8e53c 100644 --- a/src/components/appRouter.js +++ b/src/components/appRouter.js @@ -9,6 +9,7 @@ import loading from './loading/loading'; import viewManager from './viewManager/viewManager'; import ServerConnections from './ServerConnections'; import alert from './alert'; +import { ConnectionState } from '../utils/jellyfin-apiclient/ConnectionState.ts'; export const history = createHashHistory(); @@ -201,17 +202,17 @@ class AppRouter { #handleConnectionResult(result) { switch (result.State) { - case 'SignedIn': + case ConnectionState.SignedIn: loading.hide(); this.goHome(); break; - case 'ServerSignIn': + case ConnectionState.ServerSignIn: this.showLocalLogin(result.ApiClient.serverId()); break; - case 'ServerSelection': + case ConnectionState.ServerSelection: this.showSelectServer(); break; - case 'ServerUpdateNeeded': + case ConnectionState.ServerUpdateNeeded: alert({ text: globalize.translate('ServerUpdateNeeded', 'https://github.com/jellyfin/jellyfin'), html: globalize.translate('ServerUpdateNeeded', 'https://github.com/jellyfin/jellyfin') @@ -365,7 +366,7 @@ class AppRouter { this.firstConnectionResult = null; if (firstResult) { - if (firstResult.State === 'ServerSignIn') { + if (firstResult.State === ConnectionState.ServerSignIn) { const url = firstResult.ApiClient.serverAddress() + '/System/Info/Public'; fetch(url).then(response => { if (!response.ok) return Promise.reject('fetch failed'); @@ -382,7 +383,7 @@ class AppRouter { }); return; - } else if (firstResult.State !== 'SignedIn') { + } else if (firstResult.State !== ConnectionState.SignedIn) { this.#handleConnectionResult(firstResult); return; } diff --git a/src/controllers/session/addServer/index.js b/src/controllers/session/addServer/index.js index b7cc647e9d..17c72f8e19 100644 --- a/src/controllers/session/addServer/index.js +++ b/src/controllers/session/addServer/index.js @@ -4,30 +4,31 @@ import globalize from '../../../scripts/globalize'; import '../../../elements/emby-button/emby-button'; import Dashboard from '../../../utils/dashboard'; import ServerConnections from '../../../components/ServerConnections'; +import { ConnectionState } from '../../../utils/jellyfin-apiclient/ConnectionState.ts'; /* eslint-disable indent */ function handleConnectionResult(page, result) { loading.hide(); switch (result.State) { - case 'SignedIn': { + case ConnectionState.SignedIn: { const apiClient = result.ApiClient; Dashboard.onServerChanged(apiClient.getCurrentUserId(), apiClient.accessToken(), apiClient); Dashboard.navigate('home.html'); break; } - case 'ServerSignIn': + case ConnectionState.ServerSignIn: Dashboard.navigate('login.html?serverid=' + result.Servers[0].Id, false, 'none'); break; - case 'ServerSelection': + case ConnectionState.ServerSelection: Dashboard.navigate('selectserver.html', false, 'none'); break; - case 'ServerUpdateNeeded': + case ConnectionState.ServerUpdateNeeded: Dashboard.alert({ message: globalize.translate('ServerUpdateNeeded', 'https://github.com/jellyfin/jellyfin') }); break; - case 'Unavailable': + case ConnectionState.Unavailable: Dashboard.alert({ message: globalize.translate('MessageUnableToConnectToServer'), title: globalize.translate('HeaderConnectionFailure') @@ -44,7 +45,7 @@ import ServerConnections from '../../../components/ServerConnections'; handleConnectionResult(page, result); }, function() { handleConnectionResult(page, { - State: 'Unavailable' + State: ConnectionState.Unavailable }); }); } diff --git a/src/controllers/session/selectServer/index.js b/src/controllers/session/selectServer/index.js index 3db27beb1f..4665b2eba0 100644 --- a/src/controllers/session/selectServer/index.js +++ b/src/controllers/session/selectServer/index.js @@ -19,6 +19,7 @@ import Dashboard from '../../../utils/dashboard'; import ServerConnections from '../../../components/ServerConnections'; import alert from '../../../components/alert'; import cardBuilder from '../../../components/cardbuilder/cardBuilder'; +import { ConnectionState } from '../../../utils/jellyfin-apiclient/ConnectionState.ts'; /* eslint-disable indent */ @@ -113,17 +114,17 @@ import cardBuilder from '../../../components/cardbuilder/cardBuilder'; const apiClient = result.ApiClient; switch (result.State) { - case 'SignedIn': + case ConnectionState.SignedIn: Dashboard.onServerChanged(apiClient.getCurrentUserId(), apiClient.accessToken(), apiClient); Dashboard.navigate('home.html'); break; - case 'ServerSignIn': + case ConnectionState.ServerSignIn: Dashboard.onServerChanged(null, null, apiClient); Dashboard.navigate('login.html?serverid=' + result.Servers[0].Id); break; - case 'ServerUpdateNeeded': + case ConnectionState.ServerUpdateNeeded: alertTextWithOptions({ text: globalize.translate('core#ServerUpdateNeeded', 'https://github.com/jellyfin/jellyfin'), html: globalize.translate('core#ServerUpdateNeeded', 'https://github.com/jellyfin/jellyfin') diff --git a/src/utils/jellyfin-apiclient/ConnectionState.ts b/src/utils/jellyfin-apiclient/ConnectionState.ts new file mode 100644 index 0000000000..134a7ffce3 --- /dev/null +++ b/src/utils/jellyfin-apiclient/ConnectionState.ts @@ -0,0 +1,10 @@ +/** + * Server state values for a connected server used by jellyfin-apiclient. + */ +export enum ConnectionState { + SignedIn = 'SignedIn', + ServerSignIn = 'ServerSignIn', + ServerSelection = 'ServerSelection', + ServerUpdateNeeded = 'ServerUpdateNeeded', + Unavailable = 'Unavailable' +}