this repo has no description

Merge pull request #192 from moonlight-mod/kasimir/mb-ulr-ctf

Changed files
+62 -22
packages
core-extensions
src
moonbase
webpackModules
+28 -3
packages/core-extensions/src/moonbase/webpackModules/stores.ts
···
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";
···
submitting: boolean;
installing: boolean;
+
#updateState = UpdateState.Ready;
+
get updateState() {
+
return this.#updateState;
+
}
newVersion: string | null;
shouldShowNotice: boolean;
···
}
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] {
···
}
#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 startup
const n = this.config; // New config about to be saved
···
this.modified = false;
this.emitChange();
-
if (modifiedRepos) this.checkUpdates();
+
if (modifiedRepos.length !== 0) this.checkUpdates();
}
reset() {
+2 -2
packages/core-extensions/src/moonbase/webpackModules/ui/extensions/card.tsx
···
);
}
-
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),
···
rowGap: 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, {
+14 -2
packages/core-extensions/src/moonbase/webpackModules/ui/extensions/index.tsx
···
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 {
···
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;
···
)}
{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} />
))}
</>
);
+13 -3
packages/core-extensions/src/moonbase/webpackModules/ui/extensions/info.tsx
···
function Badge({
color,
children,
-
style = {}
+
style = {},
+
onClick
}: {
color: string;
children: React.ReactNode;
style?: React.CSSProperties;
+
onClick?: () => void;
}) {
+
if (onClick) style.cursor ??= "pointer";
return (
<span
className="moonlight-card-badge"
···
...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;
···
}
return (
-
<Badge key={i} color={color} style={style}>
+
<Badge key={i} color={color} style={style} onClick={() => selectTag(tag)}>
{name}
</Badge>
);
+5 -12
packages/core-extensions/src/moonbase/webpackModules/ui/update.tsx
···
} 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...",
···
}
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;
···
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