aboutsummaryrefslogtreecommitdiff
path: root/src/components/Monaco.ts
blob: 495f512a12b2a1b10f4b147975e35bf89de5b10f (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
/*
 * Vencord, a modification for Discord's desktop app
 * Copyright (c) 2022 Vendicated and contributors
 *
 * This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program.  If not, see <https://www.gnu.org/licenses/>.
*/


import { IpcEvents } from "../utils";
import { debounce } from "../utils/debounce";
import { find } from "../webpack/webpack";

const setCss = debounce((css: string) => {
    VencordNative.ipc.invoke(IpcEvents.SET_QUICK_CSS, css);
});

// FIXME: Discord Desktop support.
// open() fails to create the popup and returns null. Probably have to
// do some logic in main

// adapted from https://stackoverflow.com/a/63179814
export async function launchMonacoEditor() {
    const win = open("about:blank", void 0, "popup,width=1000,height=1000")!;

    win.getCurrentCss = () => VencordNative.ipc.invoke(IpcEvents.GET_QUICK_CSS);
    win.callback = (editor: any) => {
        editor.onDidChangeModelContent(() =>
            setCss(editor.getValue())
        );
    };

    let { theme } = find(m => m.ProtoClass?.typeName.endsWith("PreloadedUserSettings"))
        .getCurrentValue().appearance;
    theme = theme === 1 ? "vs-dark" : "vs-light";

    // problem?
    win.document.write(`

    <!doctype html>
    <html lang="en">
    <head>
        <meta charset="utf-8">
        <title>QuickCss Editor</title>
        <link rel="stylesheet" data-name="vs/editor/editor.main" href="https://cdnjs.cloudflare.com/ajax/libs/monaco-editor/0.34.0/min/vs/editor/editor.main.min.css">
        <style>
        html, body, #container {
            position: absolute;
            left: 0;
            top: 0;
            width: 100%;
            height: 100%;
            margin: 0;
            padding: 0;
            overflow: hidden;
        }
        </style>
    </head>
    <body>
        <div id="container"></div>
        <script src="https://cdnjs.cloudflare.com/ajax/libs/monaco-editor/0.34.0/min/vs/loader.min.js"></script>

        <script>
            var editor;
            require.config({ paths: { 'vs': 'https://cdnjs.cloudflare.com/ajax/libs/monaco-editor/0.34.0/min/vs' }});
            require(["vs/editor/editor.main"], () => {
                getCurrentCss().then(css => {
                    callback(editor = monaco.editor.create(document.getElementById('container'), {
                        value: css,
                        language: 'css',
                        theme: '${theme}',
                    }));
                });
            });

            window.addEventListener("resize", () => {
                // make monaco re-layout
                editor.layout();
            });
        </script>
    </body>
    </html>

`);
}