mirror of
https://github.com/LemmyNet/lemmy-ui.git
synced 2024-11-26 06:11:15 +00:00
Update bs theme when site theme is changed (#2226)
This commit is contained in:
parent
8485a2c5dc
commit
dd3842655a
10 changed files with 47 additions and 28 deletions
|
@ -2,7 +2,6 @@ import { initializeSite, setupDateFns } from "@utils/app";
|
||||||
import { hydrate } from "inferno-hydrate";
|
import { hydrate } from "inferno-hydrate";
|
||||||
import { BrowserRouter } from "inferno-router";
|
import { BrowserRouter } from "inferno-router";
|
||||||
import { App } from "../shared/components/app/app";
|
import { App } from "../shared/components/app/app";
|
||||||
import { UserService } from "../shared/services";
|
|
||||||
|
|
||||||
import "bootstrap/js/dist/collapse";
|
import "bootstrap/js/dist/collapse";
|
||||||
import "bootstrap/js/dist/dropdown";
|
import "bootstrap/js/dist/dropdown";
|
||||||
|
@ -15,7 +14,7 @@ async function startClient() {
|
||||||
|
|
||||||
const wrapper = (
|
const wrapper = (
|
||||||
<BrowserRouter>
|
<BrowserRouter>
|
||||||
<App user={UserService.Instance.myUserInfo} />
|
<App />
|
||||||
</BrowserRouter>
|
</BrowserRouter>
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|
|
@ -117,7 +117,7 @@ export default async (req: Request, res: Response) => {
|
||||||
|
|
||||||
const wrapper = (
|
const wrapper = (
|
||||||
<StaticRouter location={url} context={isoData}>
|
<StaticRouter location={url} context={isoData}>
|
||||||
<App user={site?.my_user} />
|
<App />
|
||||||
</StaticRouter>
|
</StaticRouter>
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|
|
@ -3,10 +3,9 @@ import { dataBsTheme } from "@utils/browser";
|
||||||
import { Component, RefObject, createRef, linkEvent } from "inferno";
|
import { Component, RefObject, createRef, linkEvent } from "inferno";
|
||||||
import { Provider } from "inferno-i18next-dess";
|
import { Provider } from "inferno-i18next-dess";
|
||||||
import { Route, Switch } from "inferno-router";
|
import { Route, Switch } from "inferno-router";
|
||||||
import { MyUserInfo } from "lemmy-js-client";
|
|
||||||
import { IsoDataOptionalSite } from "../../interfaces";
|
import { IsoDataOptionalSite } from "../../interfaces";
|
||||||
import { routes } from "../../routes";
|
import { routes } from "../../routes";
|
||||||
import { FirstLoadService, I18NextService, UserService } from "../../services";
|
import { FirstLoadService, I18NextService } from "../../services";
|
||||||
import AuthGuard from "../common/auth-guard";
|
import AuthGuard from "../common/auth-guard";
|
||||||
import ErrorGuard from "../common/error-guard";
|
import ErrorGuard from "../common/error-guard";
|
||||||
import { ErrorPage } from "./error-page";
|
import { ErrorPage } from "./error-page";
|
||||||
|
@ -17,14 +16,10 @@ import { Theme } from "./theme";
|
||||||
import AnonymousGuard from "../common/anonymous-guard";
|
import AnonymousGuard from "../common/anonymous-guard";
|
||||||
import { CodeTheme } from "./code-theme";
|
import { CodeTheme } from "./code-theme";
|
||||||
|
|
||||||
interface AppProps {
|
export class App extends Component<any, any> {
|
||||||
user?: MyUserInfo;
|
|
||||||
}
|
|
||||||
|
|
||||||
export class App extends Component<AppProps, any> {
|
|
||||||
private isoData: IsoDataOptionalSite = setIsoData(this.context);
|
private isoData: IsoDataOptionalSite = setIsoData(this.context);
|
||||||
private readonly mainContentRef: RefObject<HTMLElement>;
|
private readonly mainContentRef: RefObject<HTMLElement>;
|
||||||
constructor(props: AppProps, context: any) {
|
constructor(props: any, context: any) {
|
||||||
super(props, context);
|
super(props, context);
|
||||||
this.mainContentRef = createRef();
|
this.mainContentRef = createRef();
|
||||||
}
|
}
|
||||||
|
@ -34,8 +29,6 @@ export class App extends Component<AppProps, any> {
|
||||||
this.mainContentRef.current?.focus();
|
this.mainContentRef.current?.focus();
|
||||||
}
|
}
|
||||||
|
|
||||||
user = UserService.Instance.myUserInfo;
|
|
||||||
|
|
||||||
render() {
|
render() {
|
||||||
const siteRes = this.isoData.site_res;
|
const siteRes = this.isoData.site_res;
|
||||||
const siteView = siteRes?.site_view;
|
const siteView = siteRes?.site_view;
|
||||||
|
@ -46,7 +39,7 @@ export class App extends Component<AppProps, any> {
|
||||||
<div
|
<div
|
||||||
id="app"
|
id="app"
|
||||||
className="lemmy-site"
|
className="lemmy-site"
|
||||||
data-bs-theme={dataBsTheme(this.props.user)}
|
data-bs-theme={dataBsTheme(siteRes)}
|
||||||
>
|
>
|
||||||
<button
|
<button
|
||||||
type="button"
|
type="button"
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
import { setIsoData } from "@utils/app";
|
import { setIsoData } from "@utils/app";
|
||||||
import { isBrowser } from "@utils/browser";
|
import { isBrowser, updateDataBsTheme } from "@utils/browser";
|
||||||
import { getQueryParams } from "@utils/helpers";
|
import { getQueryParams } from "@utils/helpers";
|
||||||
import { Component, linkEvent } from "inferno";
|
import { Component, linkEvent } from "inferno";
|
||||||
import { RouteComponentProps } from "inferno-router/dist/Route";
|
import { RouteComponentProps } from "inferno-router/dist/Route";
|
||||||
|
@ -47,6 +47,7 @@ async function handleLoginSuccess(i: Login, loginRes: LoginResponse) {
|
||||||
|
|
||||||
if (site.state === "success") {
|
if (site.state === "success") {
|
||||||
UserService.Instance.myUserInfo = site.data.my_user;
|
UserService.Instance.myUserInfo = site.data.my_user;
|
||||||
|
updateDataBsTheme(site.data);
|
||||||
}
|
}
|
||||||
|
|
||||||
const { prev } = getLoginQueryParams();
|
const { prev } = getLoginQueryParams();
|
||||||
|
|
|
@ -61,6 +61,7 @@ import { PersonListing } from "./person-listing";
|
||||||
import { InitialFetchRequest } from "../../interfaces";
|
import { InitialFetchRequest } from "../../interfaces";
|
||||||
import TotpModal from "../common/totp-modal";
|
import TotpModal from "../common/totp-modal";
|
||||||
import { LoadingEllipses } from "../common/loading-ellipses";
|
import { LoadingEllipses } from "../common/loading-ellipses";
|
||||||
|
import { updateDataBsTheme } from "@utils/browser";
|
||||||
|
|
||||||
type SettingsData = RouteDataResponse<{
|
type SettingsData = RouteDataResponse<{
|
||||||
instancesRes: GetFederatedInstancesResponse;
|
instancesRes: GetFederatedInstancesResponse;
|
||||||
|
@ -1621,6 +1622,7 @@ export class Settings extends Component<any, SettingsState> {
|
||||||
} = siteRes.data.my_user!.local_user_view;
|
} = siteRes.data.my_user!.local_user_view;
|
||||||
|
|
||||||
UserService.Instance.myUserInfo = siteRes.data.my_user;
|
UserService.Instance.myUserInfo = siteRes.data.my_user;
|
||||||
|
updateDataBsTheme(siteRes.data);
|
||||||
|
|
||||||
i.setState(prev => ({
|
i.setState(prev => ({
|
||||||
...prev,
|
...prev,
|
||||||
|
|
|
@ -1,9 +1,11 @@
|
||||||
import { GetSiteResponse } from "lemmy-js-client";
|
import { GetSiteResponse } from "lemmy-js-client";
|
||||||
import { setupEmojiDataModel, setupMarkdown } from "../../markdown";
|
import { setupEmojiDataModel, setupMarkdown } from "../../markdown";
|
||||||
import { I18NextService, UserService } from "../../services";
|
import { I18NextService, UserService } from "../../services";
|
||||||
|
import { updateDataBsTheme } from "@utils/browser";
|
||||||
|
|
||||||
export default function initializeSite(site?: GetSiteResponse) {
|
export default function initializeSite(site?: GetSiteResponse) {
|
||||||
UserService.Instance.myUserInfo = site?.my_user;
|
UserService.Instance.myUserInfo = site?.my_user;
|
||||||
|
updateDataBsTheme(site);
|
||||||
I18NextService.i18n.changeLanguage();
|
I18NextService.i18n.changeLanguage();
|
||||||
if (site) {
|
if (site) {
|
||||||
setupEmojiDataModel(site.custom_emojis ?? []);
|
setupEmojiDataModel(site.custom_emojis ?? []);
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
import { fetchThemeList } from "@utils/app";
|
import { fetchThemeList } from "@utils/app";
|
||||||
import { isBrowser, loadCss } from "@utils/browser";
|
import { dataBsTheme, isBrowser, loadCss } from "@utils/browser";
|
||||||
|
|
||||||
export default async function setTheme(theme: string, forceReload = false) {
|
export default async function setTheme(theme: string, forceReload = false) {
|
||||||
if (!isBrowser()) {
|
if (!isBrowser()) {
|
||||||
|
@ -32,5 +32,8 @@ export default async function setTheme(theme: string, forceReload = false) {
|
||||||
const cssLoc = `/css/themes/${theme}.css`;
|
const cssLoc = `/css/themes/${theme}.css`;
|
||||||
|
|
||||||
loadCss(theme, cssLoc);
|
loadCss(theme, cssLoc);
|
||||||
|
document
|
||||||
|
.getElementById("app")
|
||||||
|
?.setAttribute("data-bs-theme", dataBsTheme(theme));
|
||||||
document.getElementById(theme)?.removeAttribute("disabled");
|
document.getElementById(theme)?.removeAttribute("disabled");
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,9 +1,15 @@
|
||||||
import { MyUserInfo } from "lemmy-js-client";
|
import { GetSiteResponse } from "lemmy-js-client";
|
||||||
import isDark from "./is-dark";
|
import isDark from "./is-dark";
|
||||||
|
|
||||||
export default function dataBsTheme(user?: MyUserInfo) {
|
export default function dataBsTheme(siteResOrTheme?: GetSiteResponse | string) {
|
||||||
return (isDark() && user?.local_user_view.local_user.theme === "browser") ||
|
const theme =
|
||||||
(user &&
|
typeof siteResOrTheme === "string"
|
||||||
|
? siteResOrTheme
|
||||||
|
: siteResOrTheme?.my_user?.local_user_view.local_user.theme ??
|
||||||
|
siteResOrTheme?.site_view.local_site.default_theme ??
|
||||||
|
"browser";
|
||||||
|
|
||||||
|
return (isDark() && theme === "browser") ||
|
||||||
[
|
[
|
||||||
"darkly",
|
"darkly",
|
||||||
"darkly-red",
|
"darkly-red",
|
||||||
|
@ -11,7 +17,7 @@ export default function dataBsTheme(user?: MyUserInfo) {
|
||||||
"darkly-compact",
|
"darkly-compact",
|
||||||
"i386",
|
"i386",
|
||||||
"vaporwave-dark",
|
"vaporwave-dark",
|
||||||
].includes(user.local_user_view.local_user.theme))
|
].includes(theme)
|
||||||
? "dark"
|
? "dark"
|
||||||
: "light";
|
: "light";
|
||||||
}
|
}
|
||||||
|
|
|
@ -9,6 +9,7 @@ import restoreScrollPosition from "./restore-scroll-position";
|
||||||
import saveScrollPosition from "./save-scroll-position";
|
import saveScrollPosition from "./save-scroll-position";
|
||||||
import setAuthCookie from "./set-auth-cookie";
|
import setAuthCookie from "./set-auth-cookie";
|
||||||
import share from "./share";
|
import share from "./share";
|
||||||
|
import updateDataBsTheme from "./update-data-bs-theme";
|
||||||
|
|
||||||
export {
|
export {
|
||||||
canShare,
|
canShare,
|
||||||
|
@ -22,4 +23,5 @@ export {
|
||||||
saveScrollPosition,
|
saveScrollPosition,
|
||||||
setAuthCookie,
|
setAuthCookie,
|
||||||
share,
|
share,
|
||||||
|
updateDataBsTheme,
|
||||||
};
|
};
|
||||||
|
|
11
src/shared/utils/browser/update-data-bs-theme.ts
Normal file
11
src/shared/utils/browser/update-data-bs-theme.ts
Normal file
|
@ -0,0 +1,11 @@
|
||||||
|
import { GetSiteResponse } from "lemmy-js-client";
|
||||||
|
import isBrowser from "./is-browser";
|
||||||
|
import dataBsTheme from "./data-bs-theme";
|
||||||
|
|
||||||
|
export default function updateDataBsTheme(siteRes?: GetSiteResponse) {
|
||||||
|
if (isBrowser()) {
|
||||||
|
document
|
||||||
|
.getElementById("app")
|
||||||
|
?.setAttribute("data-bs-theme", dataBsTheme(siteRes));
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in a new issue