import WebpackRequire from "@moonlight-mod/types/discord/require"; import { DownloadIconSVG, ExtensionState, TrashIconSVG } from "../types"; import { ExtensionLoadSource } from "types/src"; import info from "./info"; import settings from "./settings"; export enum ExtensionPage { Info, Description, Settings } export default (require: typeof WebpackRequire) => { const React = require("common_react"); const spacepack = require("spacepack_spacepack").spacepack; const CommonComponents = require("common_components"); const Flux = require("common_flux"); const { ExtensionInfo } = info(require); const { Settings } = settings(require); const { MoonbaseSettingsStore } = require("moonbase_stores") as typeof import("../webpackModules/stores"); const UserProfileClasses = spacepack.findByCode( "tabBarContainer", "topSection" )[0].exports; const DownloadIcon = spacepack.findByCode(DownloadIconSVG)[0].exports.default; const TrashIcon = spacepack.findByCode(TrashIconSVG)[0].exports.default; function ExtensionCard({ id }: { id: string }) { const [tab, setTab] = React.useState(ExtensionPage.Info); const { ext, enabled, busy, update } = Flux.useStateFromStores( [MoonbaseSettingsStore], () => { return { ext: MoonbaseSettingsStore.getExtension(id), enabled: MoonbaseSettingsStore.getExtensionEnabled(id), busy: MoonbaseSettingsStore.busy, update: MoonbaseSettingsStore.getExtensionUpdate(id) }; } ); // Why it work like that :sob: if (ext == null) return <>; const { Card, CardClasses, Flex, Text, MarkdownParser, Switch, TabBar, Button } = CommonComponents; const tagline = ext.manifest?.meta?.tagline; const settings = ext.manifest?.settings; const description = ext.manifest?.meta?.description; return (
{ext.manifest?.meta?.name ?? ext.id} {tagline != null && ( {MarkdownParser.parse(tagline)} )} {ext.state === ExtensionState.NotDownloaded ? ( ) : (
works lmao style={{ display: "flex", alignItems: "center", gap: "1rem" }} > {ext.source.type === ExtensionLoadSource.Normal && ( // TODO: this needs centering )} {update !== null && ( )} { MoonbaseSettingsStore.setExtensionEnabled(id, !enabled); }} />
)}
{(description != null || settings != null) && (
Info {description != null && ( Description )} {settings != null && ( Settings )}
)} {tab === ExtensionPage.Info && } {tab === ExtensionPage.Description && ( {MarkdownParser.parse(description ?? "*No description*")} )} {tab === ExtensionPage.Settings && }
); } return function Moonbase() { const { extensions } = Flux.useStateFromStoresObject( [MoonbaseSettingsStore], () => { return { extensions: MoonbaseSettingsStore.extensions }; } ); const sorted = Object.values(extensions).sort((a, b) => { const aName = a.manifest.meta?.name ?? a.id; const bName = b.manifest.meta?.name ?? b.id; return aName.localeCompare(bName); }); return ( <> {sorted.map((ext) => ( ))} ); }; };