this repo has no description
1import { useStateFromStores } from "@moonlight-mod/wp/discord/packages/flux";
2import { MoonbaseSettingsStore } from "@moonlight-mod/wp/moonbase_stores";
3import React from "@moonlight-mod/wp/react";
4import { UpdateState } from "../../types";
5import HelpMessage from "./HelpMessage";
6import { MoonlightBranch } from "@moonlight-mod/types";
7import MarkupUtils from "@moonlight-mod/wp/discord/modules/markup/MarkupUtils";
8import Flex from "@moonlight-mod/wp/discord/uikit/Flex";
9import {
10 ThemeDarkIcon,
11 Button,
12 Text,
13 ModalRoot,
14 ModalSize,
15 ModalContent,
16 ModalHeader,
17 Heading,
18 ModalCloseButton,
19 openModal
20} from "@moonlight-mod/wp/discord/components/common/index";
21import MarkupClasses from "@moonlight-mod/wp/discord/modules/messages/web/Markup.css";
22
23const strings: Record<UpdateState, string> = {
24 [UpdateState.Ready]: "A new version of moonlight is available.",
25 [UpdateState.Working]: "Updating moonlight...",
26 [UpdateState.Installed]: "Updated. Restart Discord to apply changes.",
27 [UpdateState.Failed]: "Failed to update moonlight. Please use the installer instead."
28};
29
30function MoonlightChangelog({
31 changelog,
32 version,
33 transitionState,
34 onClose
35}: {
36 changelog: string;
37 version: string;
38 transitionState: number | null;
39 onClose: () => void;
40}) {
41 return (
42 <ModalRoot transitionState={transitionState} size={ModalSize.DYNAMIC}>
43 <ModalHeader>
44 <Flex.Child grow={1} shrink={1}>
45 <Heading variant="heading-lg/semibold">moonlight</Heading>
46 <Text variant="text-xs/normal">{version}</Text>
47 </Flex.Child>
48
49 <Flex.Child grow={0}>
50 <ModalCloseButton onClick={onClose} />
51 </Flex.Child>
52 </ModalHeader>
53
54 <ModalContent>
55 <Text variant="text-md/normal" className={MarkupClasses.markup} style={{ padding: "1rem" }}>
56 {MarkupUtils.parse(changelog, true, {
57 allowHeading: true,
58 allowList: true,
59 allowLinks: true
60 })}
61 </Text>
62 </ModalContent>
63 </ModalRoot>
64 );
65}
66
67export default function Update() {
68 const [newVersion, state] = useStateFromStores([MoonbaseSettingsStore], () => [
69 MoonbaseSettingsStore.newVersion,
70 MoonbaseSettingsStore.updateState
71 ]);
72
73 if (newVersion == null) return null;
74
75 return (
76 <HelpMessage text={strings[state]} className="moonbase-update-section" icon={ThemeDarkIcon}>
77 <div className="moonbase-help-message-buttons">
78 {moonlight.branch === MoonlightBranch.STABLE && (
79 <Button
80 look={Button.Looks.OUTLINED}
81 color={Button.Colors.CUSTOM}
82 size={Button.Sizes.TINY}
83 onClick={() => {
84 fetch(`https://raw.githubusercontent.com/moonlight-mod/moonlight/refs/tags/${newVersion}/CHANGELOG.md`)
85 .then((r) => r.text())
86 .then((changelog) =>
87 openModal((modalProps) => {
88 return <MoonlightChangelog {...modalProps} changelog={changelog} version={newVersion} />;
89 })
90 );
91 }}
92 >
93 View changelog
94 </Button>
95 )}
96
97 {state === UpdateState.Installed && (
98 <Button
99 look={Button.Looks.OUTLINED}
100 color={Button.Colors.CUSTOM}
101 size={Button.Sizes.TINY}
102 onClick={() => {
103 MoonbaseSettingsStore.restartDiscord();
104 }}
105 >
106 Restart Discord
107 </Button>
108 )}
109
110 <Button
111 look={Button.Looks.OUTLINED}
112 color={Button.Colors.CUSTOM}
113 size={Button.Sizes.TINY}
114 disabled={state !== UpdateState.Ready}
115 onClick={() => {
116 MoonbaseSettingsStore.updateMoonlight();
117 }}
118 >
119 Update
120 </Button>
121 </div>
122 </HelpMessage>
123 );
124}