Use sane default values for config.settings (#65)

This commit is contained in:
David Zhao 2024-06-02 16:11:36 -07:00 committed by GitHub
parent 21f068691f
commit 5160e67904
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194

View File

@ -1,10 +1,15 @@
"use client" "use client";
import { getCookie, setCookie } from "cookies-next"; import { getCookie, setCookie } from "cookies-next";
import jsYaml from "js-yaml"; import jsYaml from "js-yaml";
import { useRouter } from "next/navigation"; import { useRouter } from "next/navigation";
import React, { createContext, useCallback, useMemo, useState } from "react"; import React, {
import { useEffect } from "react"; createContext,
useCallback,
useEffect,
useMemo,
useState,
} from "react";
export type AppConfig = { export type AppConfig = {
title: string; title: string;
@ -49,7 +54,7 @@ const defaultConfig: AppConfig = {
video: true, video: true,
}, },
ws_url: "", ws_url: "",
token: "" token: "",
}, },
show_qr: false, show_qr: false,
}; };
@ -61,6 +66,12 @@ const useAppConfig = (): AppConfig => {
const parsedConfig = jsYaml.load( const parsedConfig = jsYaml.load(
process.env.NEXT_PUBLIC_APP_CONFIG process.env.NEXT_PUBLIC_APP_CONFIG
) as AppConfig; ) as AppConfig;
if (parsedConfig.settings === undefined) {
parsedConfig.settings = defaultConfig.settings;
}
if (parsedConfig.settings.editable === undefined) {
parsedConfig.settings.editable = true;
}
return parsedConfig; return parsedConfig;
} catch (e) { } catch (e) {
console.error("Error parsing app config:", e); console.error("Error parsing app config:", e);
@ -77,17 +88,15 @@ type ConfigData = {
const ConfigContext = createContext<ConfigData | undefined>(undefined); const ConfigContext = createContext<ConfigData | undefined>(undefined);
export const ConfigProvider = ({ export const ConfigProvider = ({ children }: { children: React.ReactNode }) => {
children,
}: {
children: React.ReactNode;
}) => {
const appConfig = useAppConfig(); const appConfig = useAppConfig();
const router = useRouter(); const router = useRouter();
const [localColorOverride, setLocalColorOverride] = useState<string | null>(null); const [localColorOverride, setLocalColorOverride] = useState<string | null>(
null
);
const getSettingsFromUrl = useCallback(() => { const getSettingsFromUrl = useCallback(() => {
if(typeof window === 'undefined') { if (typeof window === "undefined") {
return null; return null;
} }
if (!window.location.hash) { if (!window.location.hash) {
@ -95,7 +104,7 @@ export const ConfigProvider = ({
} }
const appConfigFromSettings = appConfig; const appConfigFromSettings = appConfig;
if (appConfigFromSettings.settings.editable === false) { if (appConfigFromSettings.settings.editable === false) {
return null return null;
} }
const params = new URLSearchParams(window.location.hash.replace("#", "")); const params = new URLSearchParams(window.location.hash.replace("#", ""));
return { return {
@ -112,23 +121,24 @@ export const ConfigProvider = ({
chat: params.get("chat") === "1", chat: params.get("chat") === "1",
}, },
ws_url: "", ws_url: "",
token: "" token: "",
} as UserSettings; } as UserSettings;
}, [appConfig]) }, [appConfig]);
const getSettingsFromCookies = useCallback(() => { const getSettingsFromCookies = useCallback(() => {
const appConfigFromSettings = appConfig; const appConfigFromSettings = appConfig;
if (appConfigFromSettings.settings.editable === false) { if (appConfigFromSettings.settings.editable === false) {
return null return null;
} }
const jsonSettings = getCookie("lk_settings"); const jsonSettings = getCookie("lk_settings");
if (!jsonSettings) { if (!jsonSettings) {
return null; return null;
} }
return JSON.parse(jsonSettings) as UserSettings; return JSON.parse(jsonSettings) as UserSettings;
}, [appConfig]) }, [appConfig]);
const setUrlSettings = useCallback((us: UserSettings) => { const setUrlSettings = useCallback(
(us: UserSettings) => {
const obj = new URLSearchParams({ const obj = new URLSearchParams({
cam: boolToString(us.inputs.camera), cam: boolToString(us.inputs.camera),
mic: boolToString(us.inputs.mic), mic: boolToString(us.inputs.mic),
@ -139,12 +149,14 @@ export const ConfigProvider = ({
}); });
// Note: We don't set ws_url and token to the URL on purpose // Note: We don't set ws_url and token to the URL on purpose
router.replace("/#" + obj.toString()); router.replace("/#" + obj.toString());
}, [router]) },
[router]
);
const setCookieSettings = useCallback((us: UserSettings) => { const setCookieSettings = useCallback((us: UserSettings) => {
const json = JSON.stringify(us); const json = JSON.stringify(us);
setCookie("lk_settings", json); setCookie("lk_settings", json);
}, []) }, []);
const getConfig = useCallback(() => { const getConfig = useCallback(() => {
const appConfigFromSettings = appConfig; const appConfigFromSettings = appConfig;
@ -182,11 +194,12 @@ export const ConfigProvider = ({
setUrlSettings, setUrlSettings,
]); ]);
const setUserSettings = useCallback((settings: UserSettings) => { const setUserSettings = useCallback(
(settings: UserSettings) => {
const appConfigFromSettings = appConfig; const appConfigFromSettings = appConfig;
if (appConfigFromSettings.settings.editable === false) { if (appConfigFromSettings.settings.editable === false) {
setLocalColorOverride(settings.theme_color); setLocalColorOverride(settings.theme_color);
return return;
} }
setUrlSettings(settings); setUrlSettings(settings);
setCookieSettings(settings); setCookieSettings(settings);
@ -195,8 +208,10 @@ export const ConfigProvider = ({
...prev, ...prev,
settings: settings, settings: settings,
}; };
}) });
}, [appConfig, setCookieSettings, setUrlSettings]); },
[appConfig, setCookieSettings, setUrlSettings]
);
const [config, _setConfig] = useState<AppConfig>(getConfig()); const [config, _setConfig] = useState<AppConfig>(getConfig());
@ -218,6 +233,6 @@ export const useConfig = () => {
throw new Error("useConfig must be used within a ConfigProvider"); throw new Error("useConfig must be used within a ConfigProvider");
} }
return context; return context;
} };
const boolToString = (b: boolean) => (b ? "1" : "0"); const boolToString = (b: boolean) => (b ? "1" : "0");