mirror of
https://github.com/stashapp/stash.git
synced 2025-12-22 08:16:20 +01:00
* Translated using Weblate (Swedish) Currently translated at 100.0% (1175 of 1175 strings) Translation: stash/stash Translate-URL: https://translate.codeberg.org/projects/stash/stash/sv/ * Translated using Weblate (Estonian) Currently translated at 100.0% (1175 of 1175 strings) Translation: stash/stash Translate-URL: https://translate.codeberg.org/projects/stash/stash/et/ * Added translation using Weblate (Slovak) * Translated using Weblate (Slovak) Currently translated at 1.9% (23 of 1175 strings) Translation: stash/stash Translate-URL: https://translate.codeberg.org/projects/stash/stash/sk/ * Added translation using Weblate (Vietnamese) * Translated using Weblate (Vietnamese) Currently translated at 9.4% (111 of 1175 strings) Translation: stash/stash Translate-URL: https://translate.codeberg.org/projects/stash/stash/vi/ * Translated using Weblate (Czech) Currently translated at 100.0% (1175 of 1175 strings) Translation: stash/stash Translate-URL: https://translate.codeberg.org/projects/stash/stash/cs/ * Translated using Weblate (German) Currently translated at 87.4% (1028 of 1175 strings) Translation: stash/stash Translate-URL: https://translate.codeberg.org/projects/stash/stash/de/ * Translated using Weblate (French) Currently translated at 100.0% (1179 of 1179 strings) Translation: stash/stash Translate-URL: https://translate.codeberg.org/projects/stash/stash/fr/ * Translated using Weblate (Chinese (Traditional Han script)) Currently translated at 100.0% (1179 of 1179 strings) Translation: stash/stash Translate-URL: https://translate.codeberg.org/projects/stash/stash/zh_Hant/ * Translated using Weblate (Chinese (Simplified Han script)) Currently translated at 100.0% (1181 of 1181 strings) Translation: stash/stash Translate-URL: https://translate.codeberg.org/projects/stash/stash/zh_Hans/ * Translated using Weblate (Chinese (Traditional Han script)) Currently translated at 100.0% (1181 of 1181 strings) Translation: stash/stash Translate-URL: https://translate.codeberg.org/projects/stash/stash/zh_Hant/ * Translated using Weblate (Estonian) Currently translated at 100.0% (1181 of 1181 strings) Translation: stash/stash Translate-URL: https://translate.codeberg.org/projects/stash/stash/et/ * Translated using Weblate (French) Currently translated at 100.0% (1181 of 1181 strings) Translation: stash/stash Translate-URL: https://translate.codeberg.org/projects/stash/stash/fr/ * Translated using Weblate (Chinese (Traditional Han script)) Currently translated at 100.0% (1181 of 1181 strings) Translation: stash/stash Translate-URL: https://translate.codeberg.org/projects/stash/stash/zh_Hant/ * Translated using Weblate (Czech) Currently translated at 99.3% (1175 of 1183 strings) Translation: stash/stash Translate-URL: https://translate.codeberg.org/projects/stash/stash/cs/ * Translated using Weblate (Czech) Currently translated at 100.0% (1183 of 1183 strings) Translation: stash/stash Translate-URL: https://translate.codeberg.org/projects/stash/stash/cs/ * Translated using Weblate (French) Currently translated at 100.0% (1183 of 1183 strings) Translation: stash/stash Translate-URL: https://translate.codeberg.org/projects/stash/stash/fr/ * Translated using Weblate (Polish) Currently translated at 83.8% (992 of 1183 strings) Translation: stash/stash Translate-URL: https://translate.codeberg.org/projects/stash/stash/pl/ * Translated using Weblate (Vietnamese) Currently translated at 14.1% (167 of 1183 strings) Translation: stash/stash Translate-URL: https://translate.codeberg.org/projects/stash/stash/vi/ * Translated using Weblate (Chinese (Simplified Han script)) Currently translated at 100.0% (1183 of 1183 strings) Translation: stash/stash Translate-URL: https://translate.codeberg.org/projects/stash/stash/zh_Hans/ * Translated using Weblate (Turkish) Currently translated at 72.6% (859 of 1183 strings) Translation: stash/stash Translate-URL: https://translate.codeberg.org/projects/stash/stash/tr/ * Translated using Weblate (Turkish) Currently translated at 82.3% (974 of 1183 strings) Translation: stash/stash Translate-URL: https://translate.codeberg.org/projects/stash/stash/tr/ * Translated using Weblate (German) Currently translated at 87.1% (1031 of 1183 strings) Translation: stash/stash Translate-URL: https://translate.codeberg.org/projects/stash/stash/de/ * Translated using Weblate (Dutch) Currently translated at 69.7% (825 of 1183 strings) Translation: stash/stash Translate-URL: https://translate.codeberg.org/projects/stash/stash/nl/ * Translated using Weblate (Turkish) Currently translated at 85.4% (1011 of 1183 strings) Translation: stash/stash Translate-URL: https://translate.codeberg.org/projects/stash/stash/tr/ * Translated using Weblate (Dutch) Currently translated at 70.4% (834 of 1183 strings) Translation: stash/stash Translate-URL: https://translate.codeberg.org/projects/stash/stash/nl/ * Translated using Weblate (Turkish) Currently translated at 87.2% (1032 of 1183 strings) Translation: stash/stash Translate-URL: https://translate.codeberg.org/projects/stash/stash/tr/ * Translated using Weblate (Turkish) Currently translated at 87.2% (1032 of 1183 strings) Translation: stash/stash Translate-URL: https://translate.codeberg.org/projects/stash/stash/tr/ * Translated using Weblate (Norwegian Nynorsk) Currently translated at 14.7% (174 of 1183 strings) Translation: stash/stash Translate-URL: https://translate.codeberg.org/projects/stash/stash/nn/ * Translated using Weblate (French) Currently translated at 100.0% (1184 of 1184 strings) Translation: stash/stash Translate-URL: https://translate.codeberg.org/projects/stash/stash/fr/ * Translated using Weblate (Korean) Currently translated at 99.5% (1179 of 1184 strings) Translation: stash/stash Translate-URL: https://translate.codeberg.org/projects/stash/stash/ko/ * Translated using Weblate (Turkish) Currently translated at 91.0% (1078 of 1184 strings) Translation: stash/stash Translate-URL: https://translate.codeberg.org/projects/stash/stash/tr/ * Translated using Weblate (Chinese (Simplified Han script)) Currently translated at 100.0% (1184 of 1184 strings) Translation: stash/stash Translate-URL: https://translate.codeberg.org/projects/stash/stash/zh_Hans/ * Translated using Weblate (Chinese (Traditional Han script)) Currently translated at 100.0% (1184 of 1184 strings) Translation: stash/stash Translate-URL: https://translate.codeberg.org/projects/stash/stash/zh_Hant/ * Translated using Weblate (Turkish) Currently translated at 93.3% (1105 of 1184 strings) Translation: stash/stash Translate-URL: https://translate.codeberg.org/projects/stash/stash/tr/ * Translated using Weblate (French) Currently translated at 100.0% (1184 of 1184 strings) Translation: stash/stash Translate-URL: https://translate.codeberg.org/projects/stash/stash/fr/ * Translated using Weblate (Ukrainian) Currently translated at 18.7% (222 of 1184 strings) Translation: stash/stash Translate-URL: https://translate.codeberg.org/projects/stash/stash/uk/ * Translated using Weblate (Ukrainian) Currently translated at 29.3% (348 of 1184 strings) Translation: stash/stash Translate-URL: https://translate.codeberg.org/projects/stash/stash/uk/ * Translated using Weblate (Ukrainian) Currently translated at 60.3% (714 of 1184 strings) Translation: stash/stash Translate-URL: https://translate.codeberg.org/projects/stash/stash/uk/ * Translated using Weblate (Swedish) Currently translated at 100.0% (1184 of 1184 strings) Translation: stash/stash Translate-URL: https://translate.codeberg.org/projects/stash/stash/sv/ * Translated using Weblate (Chinese (Simplified Han script)) Currently translated at 100.0% (1184 of 1184 strings) Translation: stash/stash Translate-URL: https://translate.codeberg.org/projects/stash/stash/zh_Hans/ * Translated using Weblate (German) Currently translated at 87.5% (1037 of 1185 strings) Translation: stash/stash Translate-URL: https://translate.codeberg.org/projects/stash/stash/de/ * Translated using Weblate (English (United States)) Currently translated at 1.3% (16 of 1185 strings) Translation: stash/stash Translate-URL: https://translate.codeberg.org/projects/stash/stash/en_US/ * Translated using Weblate (Spanish) Currently translated at 97.6% (1157 of 1185 strings) Translation: stash/stash Translate-URL: https://translate.codeberg.org/projects/stash/stash/es/ * Translated using Weblate (French) Currently translated at 100.0% (1192 of 1192 strings) Translation: stash/stash Translate-URL: https://translate.codeberg.org/projects/stash/stash/fr/ * Translated using Weblate (Chinese (Simplified Han script)) Currently translated at 100.0% (1192 of 1192 strings) Translation: stash/stash Translate-URL: https://translate.codeberg.org/projects/stash/stash/zh_Hans/ * Translated using Weblate (Czech) Currently translated at 99.9% (1191 of 1192 strings) Translation: stash/stash Translate-URL: https://translate.codeberg.org/projects/stash/stash/cs/ * Translated using Weblate (Ukrainian) Currently translated at 88.2% (1052 of 1192 strings) Translation: stash/stash Translate-URL: https://translate.codeberg.org/projects/stash/stash/uk/ * Translated using Weblate (Swedish) Currently translated at 100.0% (1192 of 1192 strings) Translation: stash/stash Translate-URL: https://translate.codeberg.org/projects/stash/stash/sv/ * Translated using Weblate (German) Currently translated at 100.0% (1192 of 1192 strings) Translation: stash/stash Translate-URL: https://translate.codeberg.org/projects/stash/stash/de/ * Translated using Weblate (Chinese (Traditional Han script)) Currently translated at 100.0% (1192 of 1192 strings) Translation: stash/stash Translate-URL: https://translate.codeberg.org/projects/stash/stash/zh_Hant/ * Translated using Weblate (Slovak) Currently translated at 2.4% (29 of 1192 strings) Translation: stash/stash Translate-URL: https://translate.codeberg.org/projects/stash/stash/sk/ * Translated using Weblate (Japanese) Currently translated at 83.8% (999 of 1192 strings) Translation: stash/stash Translate-URL: https://translate.codeberg.org/projects/stash/stash/ja/ * Translated using Weblate (Latvian) Currently translated at 9.4% (113 of 1192 strings) Translation: stash/stash Translate-URL: https://translate.codeberg.org/projects/stash/stash/lv/ * Translated using Weblate (Norwegian Bokmål) Currently translated at 19.0% (227 of 1192 strings) Translation: stash/stash Translate-URL: https://translate.codeberg.org/projects/stash/stash/nb_NO/ * Translated using Weblate (Turkish) Currently translated at 92.7% (1105 of 1192 strings) Translation: stash/stash Translate-URL: https://translate.codeberg.org/projects/stash/stash/tr/ * Translated using Weblate (Polish) Currently translated at 83.8% (1000 of 1192 strings) Translation: stash/stash Translate-URL: https://translate.codeberg.org/projects/stash/stash/pl/ * Add instructions to merge codeberg translations * Rename locale files to correct format * Add new locales to dropdown list * Fix error when selecting nn-NO locale --------- Co-authored-by: AlpacaSerious <AlpacaSerious@users.noreply.translate.codeberg.org> Co-authored-by: Zesty6249 <Zesty6249@users.noreply.translate.codeberg.org> Co-authored-by: rodopd <rodopd@users.noreply.translate.codeberg.org> Co-authored-by: namphongbody <namphongbody@users.noreply.translate.codeberg.org> Co-authored-by: NymeriaCZ <NymeriaCZ@users.noreply.translate.codeberg.org> Co-authored-by: upstairs <upstairs@users.noreply.translate.codeberg.org> Co-authored-by: doodoo <doodoo@users.noreply.translate.codeberg.org> Co-authored-by: TWNO1 <TWNO1@users.noreply.translate.codeberg.org> Co-authored-by: wql219 <wanqinglin219@hotmail.com> Co-authored-by: Larsluph <Larsluph@users.noreply.translate.codeberg.org> Co-authored-by: danny60718 <danny60718@users.noreply.translate.codeberg.org> Co-authored-by: k1ngt0ng <k1ngt0ng@users.noreply.translate.codeberg.org> Co-authored-by: slickdaddy <slickdaddy@users.noreply.translate.codeberg.org> Co-authored-by: Vistaus <Vistaus@users.noreply.translate.codeberg.org> Co-authored-by: throbbing <throbbing@users.noreply.translate.codeberg.org> Co-authored-by: yec <yec@users.noreply.translate.codeberg.org> Co-authored-by: orders-pawl <orders-pawl@users.noreply.translate.codeberg.org> Co-authored-by: Mila_42 <Mila_42@users.noreply.translate.codeberg.org> Co-authored-by: murgleburgle <murgleburgle@users.noreply.translate.codeberg.org> Co-authored-by: DJSweder <DJSweder@users.noreply.translate.codeberg.org> Co-authored-by: debate <debate@users.noreply.translate.codeberg.org> Co-authored-by: abev66 <abev66@users.noreply.translate.codeberg.org> Co-authored-by: pipo <pipo@users.noreply.translate.codeberg.org> Co-authored-by: ikayaki <ikayaki@users.noreply.translate.codeberg.org> Co-authored-by: Marky05 <marky05@users.noreply.translate.codeberg.org> Co-authored-by: lexiconi <lexiconi@users.noreply.translate.codeberg.org> Co-authored-by: LauraS <lauras@users.noreply.translate.codeberg.org>
332 lines
9.9 KiB
TypeScript
332 lines
9.9 KiB
TypeScript
import React, { Suspense, useEffect, useState } from "react";
|
|
import {
|
|
Route,
|
|
Switch,
|
|
useHistory,
|
|
useLocation,
|
|
useRouteMatch,
|
|
} from "react-router-dom";
|
|
import { IntlProvider, CustomFormats } from "react-intl";
|
|
import { Helmet } from "react-helmet";
|
|
import cloneDeep from "lodash-es/cloneDeep";
|
|
import mergeWith from "lodash-es/mergeWith";
|
|
import { ToastProvider } from "src/hooks/Toast";
|
|
import { LightboxProvider } from "src/hooks/Lightbox/context";
|
|
import { initPolyfills } from "src/polyfills";
|
|
|
|
import locales, { registerCountry } from "src/locales";
|
|
import {
|
|
useConfiguration,
|
|
useConfigureUI,
|
|
useSystemStatus,
|
|
} from "src/core/StashService";
|
|
import flattenMessages from "./utils/flattenMessages";
|
|
import * as yup from "yup";
|
|
import Mousetrap from "mousetrap";
|
|
import MousetrapPause from "mousetrap-pause";
|
|
import { ErrorBoundary } from "./components/ErrorBoundary";
|
|
import { MainNavbar } from "./components/MainNavbar";
|
|
import { PageNotFound } from "./components/PageNotFound";
|
|
import * as GQL from "./core/generated-graphql";
|
|
import { makeTitleProps } from "./hooks/title";
|
|
import { LoadingIndicator } from "./components/Shared/LoadingIndicator";
|
|
|
|
import { ConfigurationProvider } from "./hooks/Config";
|
|
import { ManualProvider } from "./components/Help/context";
|
|
import { InteractiveProvider } from "./hooks/Interactive/context";
|
|
import { ReleaseNotesDialog } from "./components/Dialogs/ReleaseNotesDialog";
|
|
import { releaseNotes } from "./docs/en/ReleaseNotes";
|
|
import { getPlatformURL } from "./core/createClient";
|
|
import { lazyComponent } from "./utils/lazyComponent";
|
|
import { isPlatformUniquelyRenderedByApple } from "./utils/apple";
|
|
import Event from "./hooks/event";
|
|
|
|
import { PluginRoutes, PluginsLoader } from "./plugins";
|
|
|
|
// import plugin_api to run code
|
|
import "./pluginApi";
|
|
import { ConnectionMonitor } from "./ConnectionMonitor";
|
|
import { PatchFunction } from "./patch";
|
|
|
|
import moment from "moment/min/moment-with-locales";
|
|
|
|
const Performers = lazyComponent(
|
|
() => import("./components/Performers/Performers")
|
|
);
|
|
const FrontPage = lazyComponent(
|
|
() => import("./components/FrontPage/FrontPage")
|
|
);
|
|
const Scenes = lazyComponent(() => import("./components/Scenes/Scenes"));
|
|
const Settings = lazyComponent(() => import("./components/Settings/Settings"));
|
|
const Stats = lazyComponent(() => import("./components/Stats"));
|
|
const Studios = lazyComponent(() => import("./components/Studios/Studios"));
|
|
const Galleries = lazyComponent(
|
|
() => import("./components/Galleries/Galleries")
|
|
);
|
|
|
|
const Groups = lazyComponent(() => import("./components/Groups/Groups"));
|
|
const Tags = lazyComponent(() => import("./components/Tags/Tags"));
|
|
const Images = lazyComponent(() => import("./components/Images/Images"));
|
|
const Setup = lazyComponent(() => import("./components/Setup/Setup"));
|
|
const Migrate = lazyComponent(() => import("./components/Setup/Migrate"));
|
|
|
|
const SceneFilenameParser = lazyComponent(
|
|
() => import("./components/SceneFilenameParser/SceneFilenameParser")
|
|
);
|
|
const SceneDuplicateChecker = lazyComponent(
|
|
() => import("./components/SceneDuplicateChecker/SceneDuplicateChecker")
|
|
);
|
|
|
|
const appleRendering = isPlatformUniquelyRenderedByApple();
|
|
|
|
initPolyfills();
|
|
|
|
MousetrapPause(Mousetrap);
|
|
|
|
const intlFormats: CustomFormats = {
|
|
date: {
|
|
long: { year: "numeric", month: "long", day: "numeric" },
|
|
},
|
|
};
|
|
|
|
const defaultLocale = "en-GB";
|
|
|
|
function languageMessageString(language: string) {
|
|
return language.replace(/-/, "");
|
|
}
|
|
|
|
const AppContainer: React.FC<React.PropsWithChildren<{}>> = PatchFunction(
|
|
"App",
|
|
(props: React.PropsWithChildren<{}>) => {
|
|
return <>{props.children}</>;
|
|
}
|
|
) as React.FC;
|
|
|
|
function translateLanguageLocale(l: string) {
|
|
// intl doesn't support all locales, so we need to map some to supported ones
|
|
switch (l) {
|
|
case "nn-NO":
|
|
// use other Norwegian locale for intl
|
|
return "nb-NO";
|
|
default:
|
|
return l;
|
|
}
|
|
}
|
|
|
|
export const App: React.FC = () => {
|
|
const config = useConfiguration();
|
|
const [saveUI] = useConfigureUI();
|
|
|
|
const { data: systemStatusData } = useSystemStatus();
|
|
|
|
const language =
|
|
config.data?.configuration?.interface?.language ?? defaultLocale;
|
|
const intlLanguage = translateLanguageLocale(language);
|
|
|
|
// use en-GB as default messages if any messages aren't found in the chosen language
|
|
const [messages, setMessages] = useState<{}>();
|
|
const [customMessages, setCustomMessages] = useState<{}>();
|
|
|
|
useEffect(() => {
|
|
(async () => {
|
|
try {
|
|
const res = await fetch(getPlatformURL("customlocales"));
|
|
if (res.ok) {
|
|
setCustomMessages(await res.json());
|
|
}
|
|
} catch (err) {
|
|
console.log(err);
|
|
}
|
|
})();
|
|
}, []);
|
|
|
|
useEffect(() => {
|
|
const setLocale = async () => {
|
|
const defaultMessageLanguage = languageMessageString(defaultLocale);
|
|
const messageLanguage = languageMessageString(language);
|
|
|
|
// register countries for the chosen language
|
|
await registerCountry(language);
|
|
|
|
const defaultMessages = (await locales[defaultMessageLanguage]()).default;
|
|
const mergedMessages = cloneDeep(Object.assign({}, defaultMessages));
|
|
const chosenMessages = (await locales[messageLanguage]()).default;
|
|
|
|
mergeWith(
|
|
mergedMessages,
|
|
chosenMessages,
|
|
customMessages,
|
|
(objVal, srcVal) => {
|
|
if (srcVal === "") {
|
|
return objVal;
|
|
}
|
|
}
|
|
);
|
|
|
|
const newMessages = flattenMessages(mergedMessages);
|
|
|
|
yup.setLocale({
|
|
mixed: {
|
|
required: newMessages["validation.required"],
|
|
},
|
|
});
|
|
|
|
setMessages(newMessages);
|
|
moment.locale([language, defaultLocale]);
|
|
};
|
|
|
|
setLocale();
|
|
}, [customMessages, language]);
|
|
|
|
const location = useLocation();
|
|
const history = useHistory();
|
|
const setupMatch = useRouteMatch(["/setup", "/migrate"]);
|
|
|
|
// dispatch event when location changes
|
|
useEffect(() => {
|
|
Event.dispatch("location", "", { location });
|
|
}, [location]);
|
|
|
|
// redirect to setup or migrate as needed
|
|
useEffect(() => {
|
|
if (!systemStatusData) {
|
|
return;
|
|
}
|
|
|
|
const { status } = systemStatusData.systemStatus;
|
|
|
|
if (
|
|
location.pathname !== "/setup" &&
|
|
status === GQL.SystemStatusEnum.Setup
|
|
) {
|
|
// redirect to setup page
|
|
history.push("/setup");
|
|
}
|
|
|
|
if (
|
|
location.pathname !== "/migrate" &&
|
|
status === GQL.SystemStatusEnum.NeedsMigration
|
|
) {
|
|
// redirect to migrate page
|
|
history.replace("/migrate");
|
|
}
|
|
}, [systemStatusData, setupMatch, history, location]);
|
|
|
|
function maybeRenderNavbar() {
|
|
// don't render navbar for setup views
|
|
if (!setupMatch) {
|
|
return <MainNavbar />;
|
|
}
|
|
}
|
|
|
|
function renderContent() {
|
|
if (!systemStatusData) {
|
|
return <LoadingIndicator />;
|
|
}
|
|
|
|
return (
|
|
<ErrorBoundary>
|
|
<Suspense fallback={<LoadingIndicator />}>
|
|
<Switch>
|
|
<Route exact path="/" component={FrontPage} />
|
|
<Route path="/scenes" component={Scenes} />
|
|
<Route path="/images" component={Images} />
|
|
<Route path="/galleries" component={Galleries} />
|
|
<Route path="/performers" component={Performers} />
|
|
<Route path="/tags" component={Tags} />
|
|
<Route path="/studios" component={Studios} />
|
|
<Route path="/groups" component={Groups} />
|
|
<Route path="/stats" component={Stats} />
|
|
<Route path="/settings" component={Settings} />
|
|
<Route
|
|
path="/sceneFilenameParser"
|
|
component={SceneFilenameParser}
|
|
/>
|
|
<Route
|
|
path="/sceneDuplicateChecker"
|
|
component={SceneDuplicateChecker}
|
|
/>
|
|
<Route path="/setup" component={Setup} />
|
|
<Route path="/migrate" component={Migrate} />
|
|
<PluginRoutes />
|
|
<Route component={PageNotFound} />
|
|
</Switch>
|
|
</Suspense>
|
|
</ErrorBoundary>
|
|
);
|
|
}
|
|
|
|
function maybeRenderReleaseNotes() {
|
|
if (setupMatch || !systemStatusData || config.loading || config.error) {
|
|
return;
|
|
}
|
|
|
|
const lastNoteSeen = config.data?.configuration.ui.lastNoteSeen;
|
|
const notes = releaseNotes.filter((n) => {
|
|
return !lastNoteSeen || n.date > lastNoteSeen;
|
|
});
|
|
|
|
if (notes.length === 0) return;
|
|
|
|
return (
|
|
<ReleaseNotesDialog
|
|
notes={notes}
|
|
onClose={() => {
|
|
saveUI({
|
|
variables: {
|
|
input: {
|
|
...config.data?.configuration.ui,
|
|
lastNoteSeen: notes[0].date,
|
|
},
|
|
},
|
|
});
|
|
}}
|
|
/>
|
|
);
|
|
}
|
|
|
|
const titleProps = makeTitleProps();
|
|
|
|
return (
|
|
<ErrorBoundary>
|
|
{messages ? (
|
|
<IntlProvider
|
|
locale={intlLanguage}
|
|
messages={messages}
|
|
formats={intlFormats}
|
|
>
|
|
<PluginsLoader>
|
|
<AppContainer>
|
|
<ConfigurationProvider
|
|
configuration={config.data?.configuration}
|
|
loading={config.loading}
|
|
>
|
|
{maybeRenderReleaseNotes()}
|
|
<ToastProvider>
|
|
<ConnectionMonitor />
|
|
<Suspense fallback={<LoadingIndicator />}>
|
|
<LightboxProvider>
|
|
<ManualProvider>
|
|
<InteractiveProvider>
|
|
<Helmet {...titleProps} />
|
|
{maybeRenderNavbar()}
|
|
<div
|
|
className={`main container-fluid ${
|
|
appleRendering ? "apple" : ""
|
|
}`}
|
|
>
|
|
{renderContent()}
|
|
</div>
|
|
</InteractiveProvider>
|
|
</ManualProvider>
|
|
</LightboxProvider>
|
|
</Suspense>
|
|
</ToastProvider>
|
|
</ConfigurationProvider>
|
|
</AppContainer>
|
|
</PluginsLoader>
|
|
</IntlProvider>
|
|
) : null}
|
|
</ErrorBoundary>
|
|
);
|
|
};
|