Add changelog tab, make settings page update without reload
Changed files
MODIFIED
packages/browser/src/index.ts
MODIFIED
packages/browser/src/index.ts
@@ -123,7 +123,7 @@ return getConfig(ext, config);},getConfigOption(ext, name) {const manifest = getManifest(extensions, ext);- return getConfigOption(ext, name, config, manifest);+ return getConfigOption(ext, name, config, manifest?.settings);},setConfigOption(ext, name, value) {setConfigOption(config, ext, name, value);
@@ -28,6 +28,8 @@ source: DetectedExtension["source"];state: ExtensionState;compat: ExtensionCompat;hasUpdate: boolean;+ changelog?: string;+ settingsOverride?: ExtensionManifest["settings"];};export enum UpdateState {
@@ -102,6 +102,7 @@ download: ext.download,updateManifest: ext};existing.hasUpdate = true;+ existing.changelog = ext.meta?.changelog;}continue;@@ -193,7 +194,8 @@ }getExtensionConfig<T>(uniqueId: number, key: string): T | undefined {const ext = this.getExtension(uniqueId);- return getConfigOption(ext.id, key, this.config, ext.manifest);+ const settings = ext.settingsOverride ?? ext.manifest.settings;+ return getConfigOption(ext.id, key, this.config, settings);}getExtensionConfigRaw<T>(id: string, key: string, defaultValue: T | undefined): T | undefined {@@ -204,12 +206,14 @@ }getExtensionConfigName(uniqueId: number, key: string) {const ext = this.getExtension(uniqueId);- return ext.manifest.settings?.[key]?.displayName ?? key;+ const settings = ext.settingsOverride ?? ext.manifest.settings;+ return settings?.[key]?.displayName ?? key;}getExtensionConfigDescription(uniqueId: number, key: string) {const ext = this.getExtension(uniqueId);- return ext.manifest.settings?.[key]?.description;+ const settings = ext.settingsOverride ?? ext.manifest.settings;+ return settings?.[key]?.description;}setExtensionConfig(id: string, key: string, value: any) {@@ -255,7 +259,10 @@ if (ext.state === ExtensionState.NotDownloaded) {this.extensions[uniqueId].state = ExtensionState.Disabled;}- if (update != null) this.extensions[uniqueId].compat = checkExtensionCompat(update.updateManifest);+ if (update != null) {+ this.extensions[uniqueId].settingsOverride = update.updateManifest.settings;+ this.extensions[uniqueId].compat = checkExtensionCompat(update.updateManifest);+ }delete this.updates[uniqueId];} catch (e) {
@@ -17,6 +17,7 @@export enum ExtensionPage {Info,Description,+ Changelog,Settings}@@ -57,8 +58,9 @@const { Card, Text, FormSwitch, TabBar, Button } = Components;const tagline = ext.manifest?.meta?.tagline;- const settings = ext.manifest?.settings;+ const settings = ext.settingsOverride ?? ext.manifest?.settings;const description = ext.manifest?.meta?.description;+ const changelog = ext.changelog;const enabledDependants = useStateFromStores([MoonbaseSettingsStore], () =>Object.keys(MoonbaseSettingsStore.extensions).filter((uniqueId) => {@@ -196,7 +198,7 @@ </Flex></div><div>- {(description != null || settings != null) && (+ {(description != null || changelog != null || settings != null) && (<TabBarselectedItem={tab}type="top"@@ -216,6 +218,12 @@ Description</TabBar.Item>)}+ {changelog != null && (+ <TabBar.Item className={TabBarClasses.tabBarItem} id={ExtensionPage.Changelog}>+ Changelog+ </TabBar.Item>+ )}+{settings != null && (<TabBar.Item className={TabBarClasses.tabBarItem} id={ExtensionPage.Settings}>Settings@@ -235,6 +243,15 @@ {tab === ExtensionPage.Info && <ExtensionInfo ext={ext} />}{tab === ExtensionPage.Description && (<Text variant="text-md/normal" className={MarkupClasses.markup} style={{ width: "100%" }}>{MarkupUtils.parse(description ?? "*No description*", true, {+ allowHeading: true,+ allowLinks: true,+ allowList: true+ })}+ </Text>+ )}+ {tab === ExtensionPage.Changelog && (+ <Text variant="text-md/normal" className={MarkupClasses.markup} style={{ width: "100%" }}>+ {MarkupUtils.parse(changelog ?? "*No changelog*", true, {allowHeading: true,allowLinks: true,allowList: true
@@ -370,7 +370,7 @@export default function Settings({ ext }: { ext: MoonbaseExtension }) {return (<Flex className="moonbase-settings" direction={Flex.Direction.VERTICAL}>- {Object.entries(ext.manifest.settings!).map(([name, setting]) => (+ {Object.entries(ext.settingsOverride ?? ext.manifest.settings!).map(([name, setting]) => (<Settingext={ext}key={name}
MODIFIED
packages/core/src/util/config.ts
MODIFIED
packages/core/src/util/config.ts
@@ -14,9 +14,9 @@ export function getConfigOption<T>(ext: string,key: string,config: Config,- manifest?: ExtensionManifest+ settings?: ExtensionManifest["settings"]): T | undefined {- const defaultValue: T | undefined = structuredClone(manifest?.settings?.[key]?.default);+ const defaultValue: T | undefined = structuredClone(settings?.[key]?.default);const cfg = getConfig(ext, config);if (cfg == null || typeof cfg === "boolean") return defaultValue;return cfg?.[key] ?? defaultValue;
MODIFIED
packages/node-preload/src/index.ts
MODIFIED
packages/node-preload/src/index.ts
@@ -57,7 +57,7 @@ return getConfig(ext, config);},getConfigOption(ext, name) {const manifest = getManifest(extensions, ext);- return getConfigOption(ext, name, config, manifest);+ return getConfigOption(ext, name, config, manifest?.settings);},setConfigOption(ext, name, value) {setConfigOption(config, ext, name, value);
MODIFIED
packages/types/src/extension.ts
MODIFIED
packages/types/src/extension.ts
@@ -41,6 +41,7 @@ authors?: ExtensionAuthor[];deprecated?: boolean;tags?: ExtensionTag[];source?: string;+ changelog?: string;};dependencies?: string[];