1
0
Fork 0
mirror of https://github.com/jellyfin/jellyfin-web synced 2025-03-30 19:56:21 +00:00

Merge pull request #4571 from thornbill/web-config-hook

Add useWebConfig hook
This commit is contained in:
Bill Thornton 2023-05-05 12:35:48 -04:00 committed by GitHub
commit 7f23d7b498
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
3 changed files with 70 additions and 7 deletions

View file

@ -5,6 +5,7 @@ import React from 'react';
import StableApp from './apps/stable/App';
import { HistoryRouter } from './components/router/HistoryRouter';
import { ApiProvider } from './hooks/useApi';
import { WebConfigProvider } from './hooks/useWebConfig';
const ExperimentalApp = loadable(() => import('./apps/experimental/App'));
@ -13,13 +14,15 @@ const RootApp = ({ history }: { history: History }) => {
return (
<ApiProvider>
<HistoryRouter history={history}>
{
layoutMode === 'experimental' ?
<ExperimentalApp /> :
<StableApp />
}
</HistoryRouter>
<WebConfigProvider>
<HistoryRouter history={history}>
{
layoutMode === 'experimental' ?
<ExperimentalApp /> :
<StableApp />
}
</HistoryRouter>
</WebConfigProvider>
</ApiProvider>
);
};

View file

@ -0,0 +1,40 @@
import React, { createContext, FC, useContext, useEffect, useState } from 'react';
import type { WebConfig } from '../types/webConfig';
import defaultConfig from '../config.json';
import fetchLocal from '../utils/fetchLocal';
export const WebConfigContext = createContext<WebConfig>(defaultConfig);
export const useWebConfig = () => useContext(WebConfigContext);
export const WebConfigProvider: FC = ({ children }) => {
const [ config, setConfig ] = useState<WebConfig>(defaultConfig);
useEffect(() => {
const fetchConfig = async () => {
try {
const response = await fetchLocal('config.json', { cache: 'no-cache' });
if (!response.ok) {
throw new Error('network response was not ok');
}
const configData = await response.json();
setConfig(configData);
} catch (err) {
console.warn('[WebConfigProvider] failed to fetch config file', err);
}
};
fetchConfig()
.catch(() => {
// This should never happen since fetchConfig catches errors internally
});
}, [ setConfig ]);
return (
<WebConfigContext.Provider value={config}>
{children}
</WebConfigContext.Provider>
);
};

20
src/types/webConfig.ts Normal file
View file

@ -0,0 +1,20 @@
interface Theme {
name: string
id: string
color: string
}
interface MenuLink {
name: string
icon?: string
url: string
}
export interface WebConfig {
includeCorsCredentials?: boolean
multiserver?: boolean
themes?: Theme[]
menuLinks?: MenuLink[]
servers?: string[]
plugins?: string[]
}