diff --git a/packages/onlyoffice/frontend/office.page.ts b/packages/onlyoffice/frontend/office.page.ts index d1fb097c4..8b9e63ee6 100644 --- a/packages/onlyoffice/frontend/office.page.ts +++ b/packages/onlyoffice/frontend/office.page.ts @@ -1,19 +1,23 @@ /* eslint-disable github/array-foreach */ import { - $, addPage, AutoloadPage, request, + $, addPage, AutoloadPage, i18n, Notification, request, } from '@hydrooj/ui-default'; - /* global DocsAPI */ let loaded = false; -async function load() { - if (loaded) return Promise.resolve(); +function load(): Promise { + if (loaded) return Promise.resolve(true); + if (!UiContext.onlyofficeApi) { + console.error('Onlyoffice api not set'); + Notification.error(i18n('onlyoffice.not_configured')); + return Promise.resolve(false); + } return new Promise((resolve, reject) => { const scriptElement = document.createElement('script'); scriptElement.src = UiContext.onlyofficeApi; scriptElement.async = true; document.head.appendChild(scriptElement); - scriptElement.onload = resolve; + scriptElement.onload = () => resolve(true); scriptElement.onerror = reject; loaded = true; }); @@ -40,9 +44,16 @@ const getEles = (types: string[]) => types.flatMap((type) => $(`div[data-${type} addPage(new AutoloadPage('onlyoffice', async () => { const all = getEles(['doc', 'docx', 'cell', 'xls', 'xlsx', 'slide', 'ppt', 'pptx', 'pdf']); - if (all.length) await load(); - getEles(['doc', 'docx']).forEach(loader('word')); - getEles(['cell', 'xls', 'xlsx']).forEach(loader('cell')); - getEles(['slide', 'ppt', 'pptx']).forEach(loader('slide')); - getEles(['pdf']).forEach(loader('pdf')); + if (!all.length) return; + try { + const result = await load(); + if (!result) return; + getEles(['doc', 'docx']).forEach(loader('word')); + getEles(['cell', 'xls', 'xlsx']).forEach(loader('cell')); + getEles(['slide', 'ppt', 'pptx']).forEach(loader('slide')); + getEles(['pdf']).forEach(loader('pdf')); + } catch (e) { + console.error(`Failed to initialize onlyoffice: ${e.message}`); + Notification.error(i18n('onlyoffice.inialize_fail', e.message)); + } })); diff --git a/packages/onlyoffice/index.ts b/packages/onlyoffice/index.ts index a5b6963ae..46b614154 100644 --- a/packages/onlyoffice/index.ts +++ b/packages/onlyoffice/index.ts @@ -84,6 +84,18 @@ export function apply(ctx: Context) { enumerable: false, }); }); + + ctx.inject(['i18n'], (c) => { + c.i18n.load('en', { + 'onlyoffice.not_configured': 'Onlyoffice API not configured.', + 'onlyoffice.initialize_fail': 'Failed to initialize onlyoffice: {0}', + }); + c.i18n.load('zh', { + 'onlyoffice.not_configured': 'Onlyoffice 未配置。自行安装 onlyoffice 软件或是使用外部提供的 API。', + 'onlyoffice.initialize_fail': '初始化 onlyoffice 失败: {0}', + }); + }); + ctx.Route('onlyoffice-jwt', '/onlyoffice-jwt', OnlyofficeJWTHandler); if (SystemModel.get('onlyoffice.pdf')) { ctx.provideModule('richmedia', 'pdf', {