Merge pull request #192 from moonlight-mod/kasimir/mb-ulr-ctf
Cynthia Foxwell 1 month ago 5 files (+62, -22)
Changed files
@@ -1,5 +1,12 @@import { Config, ExtensionEnvironment, ExtensionLoadSource, ExtensionSettingsAdvice } from "@moonlight-mod/types";-import { ExtensionState, MoonbaseExtension, MoonbaseNatives, RepositoryManifest, RestartAdvice } from "../types";+import {+ ExtensionState,+ MoonbaseExtension,+ MoonbaseNatives,+ RepositoryManifest,+ RestartAdvice,+ UpdateState+} from "../types";import { Store } from "@moonlight-mod/wp/discord/packages/flux";import Dispatcher from "@moonlight-mod/wp/discord/Dispatcher";import getNatives from "../native";@@ -25,6 +32,10 @@ modified: boolean;submitting: boolean;installing: boolean;+ #updateState = UpdateState.Ready;+ get updateState() {+ return this.#updateState;+ }newVersion: string | null;shouldShowNotice: boolean;@@ -353,7 +364,18 @@ this.emitChange();}async updateMoonlight() {- await natives.updateMoonlight();+ this.#updateState = UpdateState.Working;+ this.emitChange();++ await natives+ .updateMoonlight()+ .then(() => (this.#updateState = UpdateState.Installed))+ .catch((e) => {+ logger.error(e);+ this.#updateState = UpdateState.Failed;+ });++ this.emitChange();}getConfigOption<K extends keyof Config>(key: K): Config[K] {@@ -381,6 +403,9 @@ return this.configComponents[ext]?.[name];}#computeRestartAdvice() {+ // If moonlight update needs a restart, always hide advice.+ if (this.#updateState === UpdateState.Installed) return RestartAdvice.NotNeeded;+const i = this.initialConfig; // Initial config, from startupconst n = this.config; // New config about to be saved@@ -486,7 +511,7 @@ this.submitting = false;this.modified = false;this.emitChange();- if (modifiedRepos) this.checkUpdates();+ if (modifiedRepos.length !== 0) this.checkUpdates();}reset() {
@@ -58,7 +58,7 @@ />);}-export default function ExtensionCard({ uniqueId }: { uniqueId: number }) {+export default function ExtensionCard({ uniqueId, selectTag }: { uniqueId: number; selectTag: (tag: string) => void }) {const { ext, enabled, busy, update, conflicting } = useStateFromStores([MoonbaseSettingsStore], () => {return {ext: MoonbaseSettingsStore.getExtension(uniqueId),@@ -303,7 +303,7 @@ // This looks wonky in the settings tabrowGap: tab === ExtensionPage.Info ? "16px" : undefined}}>- {tab === ExtensionPage.Info && <ExtensionInfo ext={ext} />}+ {tab === ExtensionPage.Info && <ExtensionInfo ext={ext} selectTag={selectTag} />}{tab === ExtensionPage.Description && (<Text variant="text-md/normal" className={MarkupClasses.markup} style={{ width: "100%" }}>{MarkupUtils.parse(description ?? "*No description*", true, {
@@ -20,6 +20,8 @@ import HelpMessage from "../HelpMessage";const SearchBar = spacepack.require("discord/uikit/search/SearchBar").default;+const validTags: string[] = Object.values(ExtensionTag);+export default function ExtensionsPage() {const { extensions, savedFilter } = useStateFromStoresObject([MoonbaseSettingsStore], () => {return {@@ -41,7 +43,17 @@ } else {filter = filterState[0];setFilter = filterState[1];}+const [selectedTags, setSelectedTags] = React.useState(new Set<string>());+ const selectTag = React.useCallback(+ (tag: string) => {+ const newState = new Set(selectedTags);+ if (validTags.includes(tag)) newState.add(tag);+ setSelectedTags(newState);+ },+ [selectedTags]+ );+const sorted = Object.values(extensions).sort((a, b) => {const aName = a.manifest.meta?.name ?? a.id;const bName = b.manifest.meta?.name ?? b.id;@@ -132,13 +144,13 @@ </HelpMessage>)}{filteredWithUpdates.map((ext) => (- <ExtensionCard uniqueId={ext.uniqueId} key={ext.uniqueId} />+ <ExtensionCard uniqueId={ext.uniqueId} key={ext.uniqueId} selectTag={selectTag} />))}{filteredWithUpdates.length > 0 && filteredWithoutUpdates.length > 0 && (<FormDivider className="moonbase-update-divider" />)}{filteredWithoutUpdates.map((ext) => (- <ExtensionCard uniqueId={ext.uniqueId} key={ext.uniqueId} />+ <ExtensionCard uniqueId={ext.uniqueId} key={ext.uniqueId} selectTag={selectTag} />))}</>);
@@ -54,12 +54,15 @@function Badge({color,children,- style = {}+ style = {},+ onClick}: {color: string;children: React.ReactNode;style?: React.CSSProperties;+ onClick?: () => void;}) {+ if (onClick) style.cursor ??= "pointer";return (<spanclassName="moonlight-card-badge"@@ -69,13 +72,20 @@ "--badge-color": color,...style} as React.CSSProperties}+ onClick={onClick}>{children}</span>);}-export default function ExtensionInfo({ ext }: { ext: MoonbaseExtension }) {+export default function ExtensionInfo({+ ext,+ selectTag+}: {+ ext: MoonbaseExtension;+ selectTag: (tag: string) => void;+}) {const authors = ext.manifest?.meta?.authors;const tags = ext.manifest?.meta?.tags;const version = ext.manifest?.version;@@ -148,7 +158,7 @@ style = { color: "var(--primary-230)" };}return (- <Badge key={i} color={color} style={style}>+ <Badge key={i} color={color} style={style} onClick={() => selectTag(tag)}>{name}</Badge>);
@@ -20,8 +20,6 @@ openModal} from "@moonlight-mod/wp/discord/components/common/index";import MarkupClasses from "@moonlight-mod/wp/discord/modules/messages/web/Markup.css";-const logger = moonlight.getLogger("moonbase/ui/update");-const strings: Record<UpdateState, string> = {[UpdateState.Ready]: "A new version of moonlight is available.",[UpdateState.Working]: "Updating moonlight...",@@ -67,8 +65,10 @@ );}export default function Update() {- const [state, setState] = React.useState(UpdateState.Ready);- const newVersion = useStateFromStores([MoonbaseSettingsStore], () => MoonbaseSettingsStore.newVersion);+ const [newVersion, state] = useStateFromStores([MoonbaseSettingsStore], () => [+ MoonbaseSettingsStore.newVersion,+ MoonbaseSettingsStore.updateState+ ]);if (newVersion == null) return null;@@ -113,14 +113,7 @@ color={Button.Colors.CUSTOM}size={Button.Sizes.TINY}disabled={state !== UpdateState.Ready}onClick={() => {- setState(UpdateState.Working);-- MoonbaseSettingsStore.updateMoonlight()- .then(() => setState(UpdateState.Installed))- .catch((e) => {- logger.error(e);- setState(UpdateState.Failed);- });+ MoonbaseSettingsStore.updateMoonlight();}}>Update