mirror of
https://gitcode.com/gh_mirrors/hy/Hydro.git
synced 2026-10-17 17:36:08 +08:00
67 lines
2.1 KiB
TypeScript
67 lines
2.1 KiB
TypeScript
import React from 'react';
|
|
import ReactDOM from 'react-dom/client';
|
|
import Schema from 'schemastery';
|
|
import Notification from 'vj/components/notification';
|
|
import DomComponent from 'vj/components/react/DomComponent';
|
|
import { NamedPage } from 'vj/misc/Page';
|
|
import { i18n, request } from 'vj/utils';
|
|
|
|
const page = new NamedPage('manage_config', async () => {
|
|
if (document.documentElement.className.includes('theme--dark')) {
|
|
document.documentElement.className += ' dark';
|
|
}
|
|
|
|
const [{ ConfigEditor, ComponentsProvider }, { load }] = await Promise.all([
|
|
import('@hydrooj/components'),
|
|
import('vj/components/monaco/loader'),
|
|
]);
|
|
const { monaco, registerAction, renderMarkdown } = await load(['yaml']);
|
|
|
|
function Markdown({ source }) {
|
|
const rendered = React.useMemo(() => {
|
|
const res = renderMarkdown({ value: source });
|
|
const value = res.element.innerHTML;
|
|
res.dispose();
|
|
return value;
|
|
}, [source]);
|
|
// Markdown snippet come from trusted backend code, no need to sanitize here
|
|
return <div dangerouslySetInnerHTML={{ __html: rendered }} />;
|
|
}
|
|
|
|
ReactDOM.createRoot(document.getElementById('app')!).render(
|
|
<ComponentsProvider theme={UiContext.theme} codeFontFamily={UiContext.codeFontFamily} i18n={i18n}>
|
|
<ConfigEditor
|
|
schema={new Schema(UiContext.schema)}
|
|
config={UiContext.config}
|
|
monaco={monaco}
|
|
registerAction={registerAction}
|
|
Markdown={Markdown}
|
|
onSave={(value) => {
|
|
request.post('', { value }).then(() => {
|
|
Notification.success(i18n('Changes saved successfully'));
|
|
window.location.reload();
|
|
}).catch((e) => {
|
|
Notification.error(i18n('Failed to save changes:'), e.message);
|
|
});
|
|
}}
|
|
sidebar={<DomComponent childDom={$('.section.side').get(0)} />}
|
|
dynamic={UiContext.dynamic || {}}
|
|
/>
|
|
<style>{`
|
|
body {
|
|
overflow: hidden;
|
|
}
|
|
.footer {
|
|
visibility: hidden;
|
|
}
|
|
.omnibar-toggle {
|
|
display: none;
|
|
}
|
|
`}
|
|
</style>
|
|
</ComponentsProvider>,
|
|
);
|
|
});
|
|
|
|
export default page;
|