mirror of
https://gitcode.com/gh_mirrors/hy/Hydro.git
synced 2026-10-20 01:38:19 +08:00
ui: add provideFeature/getFeature API
This commit is contained in:
5 files changed
+34
-21
No files matched your search
@@ -18,6 +18,7 @@ export * from './misc/Page';
|
|||||||
export { initPageLoader } from './hydro';
|
export { initPageLoader } from './hydro';
|
||||||
|
|
||||||
const lazyModules = {};
|
const lazyModules = {};
|
||||||
|
const features = {};
|
||||||
export default async function load(name: string) {
|
export default async function load(name: string) {
|
||||||
if (window.node_modules[name]) return window.node_modules[name];
|
if (window.node_modules[name]) return window.node_modules[name];
|
||||||
if (name === 'echarts') return import('echarts');
|
if (name === 'echarts') return import('echarts');
|
||||||
@@ -37,6 +38,15 @@ export default async function load(name: string) {
|
|||||||
document.body.appendChild(tag);
|
document.body.appendChild(tag);
|
||||||
return lazyModules[name];
|
return lazyModules[name];
|
||||||
}
|
}
|
||||||
|
export async function getFeatures(name: string) {
|
||||||
|
const legacy = Object.keys(window.externalModules).filter((i) => i === name || i.startsWith(`${name}@`));
|
||||||
|
const c = Object.keys(features).filter((i) => i === name || i.startsWith(`${name}@`));
|
||||||
|
return legacy.concat(c);
|
||||||
|
}
|
||||||
|
|
||||||
|
export function provideFeature(name: string, content: string) {
|
||||||
|
features[name] = content;
|
||||||
|
}
|
||||||
|
|
||||||
export interface EventMap { }
|
export interface EventMap { }
|
||||||
|
|
||||||
|
|||||||
@@ -1,6 +1,22 @@
|
|||||||
import { loadExternalModule } from 'vj/utils';
|
import { load as loadModule } from '@hydrooj/ui-default';
|
||||||
|
|
||||||
let loaded;
|
let loaded;
|
||||||
|
|
||||||
|
const val: Record<string, any> = {};
|
||||||
|
/** @deprecated */
|
||||||
|
export async function legacyLoadExternalModule(target: string) {
|
||||||
|
if (val[target]) return val[target];
|
||||||
|
const ele = document.createElement('script');
|
||||||
|
ele.src = target;
|
||||||
|
await new Promise((resolve, reject) => {
|
||||||
|
ele.onload = resolve;
|
||||||
|
ele.onerror = reject;
|
||||||
|
document.head.appendChild(ele);
|
||||||
|
});
|
||||||
|
val[target] = window.exports;
|
||||||
|
return val[target];
|
||||||
|
}
|
||||||
|
|
||||||
const loaders = {
|
const loaders = {
|
||||||
i18n: async () => {
|
i18n: async () => {
|
||||||
const { setLocaleData } = await import('./nls');
|
const { setLocaleData } = await import('./nls');
|
||||||
@@ -21,7 +37,9 @@ const loaders = {
|
|||||||
external: async (monaco, feat) => {
|
external: async (monaco, feat) => {
|
||||||
const items = Object.keys(window.externalModules).filter((i) => i === `monaco-${feat}` || i.startsWith(`monaco-${feat}@`));
|
const items = Object.keys(window.externalModules).filter((i) => i === `monaco-${feat}` || i.startsWith(`monaco-${feat}@`));
|
||||||
for (const item of items) {
|
for (const item of items) {
|
||||||
let apply = await loadExternalModule(window.externalModules[item]);
|
let apply = (item.startsWith('http') || item.startsWith('/'))
|
||||||
|
? await legacyLoadExternalModule(window.externalModules[item])
|
||||||
|
: (await loadModule(item)).apply;
|
||||||
if (typeof apply !== 'function') apply = apply.default || apply.apply;
|
if (typeof apply !== 'function') apply = apply.default || apply.apply;
|
||||||
if (typeof apply === 'function') await apply(monaco);
|
if (typeof apply === 'function') await apply(monaco);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -4,9 +4,9 @@ export default class Sock {
|
|||||||
sock: ReconnectingWebSocket;
|
sock: ReconnectingWebSocket;
|
||||||
interval: NodeJS.Timer;
|
interval: NodeJS.Timer;
|
||||||
|
|
||||||
constructor(public url: string) {
|
constructor(public url: string, nocookie = false) {
|
||||||
const i = new URL(url, window.location.href);
|
const i = new URL(url, window.location.href);
|
||||||
if (i.host !== window.location.host) i.searchParams.append('sid', document.cookie.split('sid=')[1].split(';')[0]);
|
if (i.host !== window.location.host && !nocookie) i.searchParams.append('sid', document.cookie.split('sid=')[1].split(';')[0]);
|
||||||
i.protocol = i.protocol.replace('http', 'ws');
|
i.protocol = i.protocol.replace('http', 'ws');
|
||||||
this.url = i.toString();
|
this.url = i.toString();
|
||||||
this.sock = new ReconnectingWebSocket(this.url, [], {
|
this.sock = new ReconnectingWebSocket(this.url, [], {
|
||||||
|
|||||||
@@ -11,7 +11,8 @@ declare global {
|
|||||||
UserContext: any;
|
UserContext: any;
|
||||||
UiContext: any;
|
UiContext: any;
|
||||||
Hydro: any;
|
Hydro: any;
|
||||||
externalModules: Record<string, string | (() => Promise<any>)>;
|
/** @deprecated */
|
||||||
|
externalModules: Record<string, string>;
|
||||||
captureException?: (e: Error) => void;
|
captureException?: (e: Error) => void;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -77,21 +77,6 @@ export function mongoId(idstring: string) {
|
|||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
const loaded = {};
|
|
||||||
|
|
||||||
export async function loadExternalModule(target: string) {
|
|
||||||
if (loaded[target]) return loaded[target];
|
|
||||||
const ele = document.createElement('script');
|
|
||||||
ele.src = target;
|
|
||||||
await new Promise((resolve, reject) => {
|
|
||||||
ele.onload = resolve;
|
|
||||||
ele.onerror = reject;
|
|
||||||
document.head.appendChild(ele);
|
|
||||||
});
|
|
||||||
loaded[target] = window.exports;
|
|
||||||
return loaded[target];
|
|
||||||
}
|
|
||||||
|
|
||||||
export function emulateAnchorClick(ev: KeyboardEvent, targetUrl: string, alwaysOpenInNewWindow = false) {
|
export function emulateAnchorClick(ev: KeyboardEvent, targetUrl: string, alwaysOpenInNewWindow = false) {
|
||||||
let openInNewWindow;
|
let openInNewWindow;
|
||||||
if (alwaysOpenInNewWindow) openInNewWindow = true;
|
if (alwaysOpenInNewWindow) openInNewWindow = true;
|
||||||
@@ -112,6 +97,5 @@ Object.assign(window.Hydro.utils, {
|
|||||||
zip,
|
zip,
|
||||||
pipeStream,
|
pipeStream,
|
||||||
mongoId,
|
mongoId,
|
||||||
loadExternalModule,
|
|
||||||
emulateAnchorClick,
|
emulateAnchorClick,
|
||||||
});
|
});
|
||||||
Reference in new issue
Block a user