diff --git a/packages/core-extensions/src/moonbase/style.css b/packages/core-extensions/src/moonbase/style.css index a36675e..f853018 100644 --- a/packages/core-extensions/src/moonbase/style.css +++ b/packages/core-extensions/src/moonbase/style.css @@ -11,6 +11,7 @@ textarea.moonbase-resizeable { resize: vertical; } +/* Update notice at the top of the client */ .moonbase-updates-notice { background-color: var(--moonbase-bg); color: var(--moonbase-fg); @@ -31,15 +32,22 @@ textarea.moonbase-resizeable { gap: 2px; } +/* Help messages in Moonbase UI */ +.moonbase-help-message { + display: flex; + flex-direction: row; + justify-content: space-between; +} + +.moonbase-extension-update-section { + margin-top: 15px; +} + .moonbase-update-section { background-color: var(--moonbase-bg); --info-help-foreground: var(--moonbase-fg); border: none !important; color: var(--moonbase-fg); - - display: flex; - flex-direction: row; - justify-content: space-between; } .moonbase-update-section button { @@ -49,7 +57,7 @@ textarea.moonbase-resizeable { border-color: var(--moonbase-fg); } -.moonbase-update-section-buttons { +.moonbase-help-message-buttons { display: flex; flex-direction: row; gap: 8px; @@ -59,7 +67,7 @@ textarea.moonbase-resizeable { margin: 32px 0; } -/* crash screen */ +/* Crash screen */ .moonbase-crash-wrapper > [class^="buttons_"] { gap: 1rem; } diff --git a/packages/core-extensions/src/moonbase/webpackModules/settings.tsx b/packages/core-extensions/src/moonbase/webpackModules/settings.tsx index 290f95b..e753d63 100644 --- a/packages/core-extensions/src/moonbase/webpackModules/settings.tsx +++ b/packages/core-extensions/src/moonbase/webpackModules/settings.tsx @@ -14,11 +14,12 @@ const Margins = spacepack.require("discord/styles/shared/Margins.css"); const { open } = spacepack.findByExports("setSection", "clearSubsection")[0].exports.Z; +let SettingsNotice; const notice = { stores: [MoonbaseSettingsStore], element: () => { // Require it here because lazy loading SUX - const SettingsNotice = spacepack.findByCode("onSaveButtonColor", "FocusRingScope")[0].exports.Z; + SettingsNotice ??= spacepack.findByCode("onSaveButtonColor", "FocusRingScope")[0].exports.Z; return ( { newVersion: string | null; shouldShowNotice: boolean; + #showOnlyUpdateable = false; + set showOnlyUpdateable(v: boolean) { + this.#showOnlyUpdateable = v; + this.emitChange(); + } + get showOnlyUpdateable() { + return this.#showOnlyUpdateable; + } + extensions: { [id: number]: MoonbaseExtension }; updates: { [id: number]: { diff --git a/packages/core-extensions/src/moonbase/webpackModules/ui/HelpMessage.tsx b/packages/core-extensions/src/moonbase/webpackModules/ui/HelpMessage.tsx new file mode 100644 index 0000000..bdee4b2 --- /dev/null +++ b/packages/core-extensions/src/moonbase/webpackModules/ui/HelpMessage.tsx @@ -0,0 +1,47 @@ +import React from "@moonlight-mod/wp/react"; +import spacepack from "@moonlight-mod/wp/spacepack_spacepack"; +import Flex from "@moonlight-mod/wp/discord/uikit/Flex"; +import { Text } from "@moonlight-mod/wp/discord/components/common/index"; + +const Margins = spacepack.require("discord/styles/shared/Margins.css"); +const HelpMessageClasses = spacepack.findByExports("positive", "iconDiv")[0].exports; + +// reimpl of HelpMessage but with a custom icon +export default function HelpMessage({ + className, + text, + icon, + children +}: { + className?: string; + text: string; + icon: React.ComponentType; + children?: React.ReactNode; +}) { + return ( +
+ +
+ {React.createElement(icon, { + size: "sm", + color: "currentColor", + className: HelpMessageClasses.icon + })} +
+ + + {text} + + + {children} +
+
+ ); +} diff --git a/packages/core-extensions/src/moonbase/webpackModules/ui/extensions/index.tsx b/packages/core-extensions/src/moonbase/webpackModules/ui/extensions/index.tsx index a8a1e57..bafa1f1 100644 --- a/packages/core-extensions/src/moonbase/webpackModules/ui/extensions/index.tsx +++ b/packages/core-extensions/src/moonbase/webpackModules/ui/extensions/index.tsx @@ -10,14 +10,18 @@ import * as Components from "@moonlight-mod/wp/discord/components/common/index"; import { MoonbaseSettingsStore } from "@moonlight-mod/wp/moonbase_stores"; import { ExtensionCompat } from "@moonlight-mod/core/extension/loader"; +import HelpMessage from "../HelpMessage"; const SearchBar: any = Object.values(spacepack.findByCode("hideSearchIcon")[0].exports)[0]; +const { CircleInformationIcon, XSmallIcon } = Components; +const PanelButton = spacepack.findByCode("Masks.PANEL_BUTTON")[0].exports.Z; export default function ExtensionsPage() { - const { extensions, savedFilter } = useStateFromStoresObject([MoonbaseSettingsStore], () => { + const { extensions, savedFilter, showOnlyUpdateable } = useStateFromStoresObject([MoonbaseSettingsStore], () => { return { extensions: MoonbaseSettingsStore.extensions, - savedFilter: MoonbaseSettingsStore.getExtensionConfigRaw("moonbase", "filter", defaultFilter) + savedFilter: MoonbaseSettingsStore.getExtensionConfigRaw("moonbase", "filter", defaultFilter), + showOnlyUpdateable: MoonbaseSettingsStore.showOnlyUpdateable }; }); @@ -93,15 +97,36 @@ export default function ExtensionsPage() { /> + {showOnlyUpdateable && ( + +
+ { + MoonbaseSettingsStore.showOnlyUpdateable = false; + }} + /> +
+
+ )} + {filteredWithUpdates.map((ext) => ( ))} - {filteredWithUpdates.length > 0 && filteredWithoutUpdates.length > 0 && ( - + {!showOnlyUpdateable && ( + <> + {filteredWithUpdates.length > 0 && filteredWithoutUpdates.length > 0 && ( + + )} + {filteredWithoutUpdates.map((ext) => ( + + ))} + )} - {filteredWithoutUpdates.map((ext) => ( - - ))} ); } diff --git a/packages/core-extensions/src/moonbase/webpackModules/ui/index.tsx b/packages/core-extensions/src/moonbase/webpackModules/ui/index.tsx index 8a0e7b0..e0613fd 100644 --- a/packages/core-extensions/src/moonbase/webpackModules/ui/index.tsx +++ b/packages/core-extensions/src/moonbase/webpackModules/ui/index.tsx @@ -7,6 +7,7 @@ import { UserSettingsModalStore } from "@moonlight-mod/wp/common_stores"; import ExtensionsPage from "./extensions"; import ConfigPage from "./config"; import Update from "./update"; +import { MoonbaseSettingsStore } from "@moonlight-mod/wp/moonbase_stores"; const { Divider } = spacepack.findByCode(".forumOrHome]:")[0].exports.Z; const TitleBarClasses = spacepack.findByCode("iconWrapper:", "children:")[0].exports; @@ -44,6 +45,7 @@ export function Moonbase(props: { initialTab?: number } = {}) { () => () => { // Normally there's an onSettingsClose prop you can set but we don't expose it and I don't care enough to add support for it right now clearSubsection("moonbase"); + MoonbaseSettingsStore.showOnlyUpdateable = false; }, [] ); diff --git a/packages/core-extensions/src/moonbase/webpackModules/ui/update.tsx b/packages/core-extensions/src/moonbase/webpackModules/ui/update.tsx index a2f5a87..782fac4 100644 --- a/packages/core-extensions/src/moonbase/webpackModules/ui/update.tsx +++ b/packages/core-extensions/src/moonbase/webpackModules/ui/update.tsx @@ -2,13 +2,10 @@ import { useStateFromStores } from "@moonlight-mod/wp/discord/packages/flux"; import { MoonbaseSettingsStore } from "@moonlight-mod/wp/moonbase_stores"; import * as Components from "@moonlight-mod/wp/discord/components/common/index"; import React from "@moonlight-mod/wp/react"; -import spacepack from "@moonlight-mod/wp/spacepack_spacepack"; -import Flex from "@moonlight-mod/wp/discord/uikit/Flex"; import { UpdateState } from "../../types"; +import HelpMessage from "./HelpMessage"; -const { ThemeDarkIcon, Text, Button } = Components; -const Margins = spacepack.require("discord/styles/shared/Margins.css"); -const HelpMessageClasses = spacepack.findByExports("positive", "iconDiv")[0].exports; +const { ThemeDarkIcon, Button } = Components; const logger = moonlight.getLogger("moonbase/ui/update"); @@ -25,27 +22,9 @@ export default function Update() { if (newVersion == null) return null; - // reimpl of HelpMessage but with a custom icon return ( -
- -
- -
- - - {strings[state]} - -
- -
+ +
{state === UpdateState.Installed && (
-
+ ); } diff --git a/packages/core-extensions/src/moonbase/webpackModules/updates.tsx b/packages/core-extensions/src/moonbase/webpackModules/updates.tsx index d607ac3..047f9ca 100644 --- a/packages/core-extensions/src/moonbase/webpackModules/updates.tsx +++ b/packages/core-extensions/src/moonbase/webpackModules/updates.tsx @@ -5,10 +5,6 @@ import { MoonlightBranch } from "@moonlight-mod/types"; import React from "@moonlight-mod/wp/react"; import * as Components from "@moonlight-mod/wp/discord/components/common/index"; -// FIXME: not indexed as importable -const Constants = spacepack.require("discord/Constants"); -const UserSettingsSections = spacepack.findObjectFromKey(Constants, "DEVELOPER_OPTIONS"); - const { ThemeDarkIcon } = Components; function plural(str: string, num: number) { @@ -64,18 +60,12 @@ function listener() { name: "Open Moonbase", onClick: () => { const { open } = spacepack.findByExports("setSection", "clearSubsection")[0].exports.Z; - - // settings is lazy loaded thus lazily patched - // FIXME: figure out a way to detect if settings has been opened - // alreadyjust so the transition isnt as jarring - open(UserSettingsSections.ACCOUNT); - setTimeout(() => { - if (MoonbaseSettingsStore.getExtensionConfigRaw("moonbase", "sections", false)) { - open("moonbase-extensions"); - } else { - open("moonbase", 0); - } - }, 0); + if (MoonbaseSettingsStore.getExtensionConfigRaw("moonbase", "sections", false)) { + open("moonbase-extensions"); + } else { + MoonbaseSettingsStore.showOnlyUpdateable = true; + open("moonbase", 0); + } return true; } } -- 2.51.2 From 2cd7d443ad498937ce0613e1eff4fc773e89ada5 Mon Sep 17 00:00:00 2001 From: redstonekasi Date: Sun, 12 Jan 2025 02:05:26 +0100 Subject: [PATCH 2/2] core/patch: bleh --- packages/core/src/patch.ts | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/packages/core/src/patch.ts b/packages/core/src/patch.ts index a504099..a3e22e6 100644 --- a/packages/core/src/patch.ts +++ b/packages/core/src/patch.ts @@ -101,6 +101,7 @@ function patchModules(entry: WebpackJsonpEntry[1]) { } } + let modified = false; for (const [id, func] of Object.entries(entry)) { if (func.__moonlight === true) continue; @@ -165,15 +166,20 @@ function patchModules(entry: WebpackJsonpEntry[1]) { } } - if (!hardFailed) moduleString = replaced; + if (!hardFailed) { + moduleString = replaced; + modified = true; + } moonlight.unpatched.delete(patch); if (shouldRemove) patches.splice(i--, 1); } } - patchModule(id, patchedStr.join(", "), moduleString); - moduleCache[id] = moduleString; + if (modified) { + patchModule(id, patchedStr.join(", "), moduleString); + moduleCache[id] = moduleString; + } try { const parsed = moonlight.lunast.parseScript(id, moduleString);