80 lines
2.4 KiB
TypeScript
80 lines
2.4 KiB
TypeScript
/*
|
|
* SPDX-FileCopyrightText: syuilo and misskey-project
|
|
* SPDX-License-Identifier: AGPL-3.0-only
|
|
*/
|
|
|
|
// https://vitejs.dev/config/build-options.html#build-modulepreload
|
|
import 'vite/modulepreload-polyfill';
|
|
|
|
import '@/style.scss';
|
|
import '@/embed/style.scss';
|
|
import { createApp, defineAsyncComponent } from 'vue';
|
|
import type { CommonBootOptions } from '@/boot/common.js';
|
|
import { common } from '@/boot/common.js';
|
|
import { setIframeId, postMessageToParentWindow } from '@/scripts/post-message.js';
|
|
import { parseEmbedParams } from '@/scripts/embed-page.js';
|
|
import { defaultStore } from '@/store.js';
|
|
import { useRouter } from '@/router/supplier.js';
|
|
import { createEmbedRouter } from '@/embed/router.js';
|
|
|
|
const bootOptions: Partial<CommonBootOptions> = {
|
|
routerFactory: createEmbedRouter,
|
|
};
|
|
|
|
const params = new URLSearchParams(location.search);
|
|
const embedParams = parseEmbedParams(params);
|
|
|
|
// カラーモードのオーバーライド
|
|
if (embedParams.colorMode != null) {
|
|
bootOptions.forceColorMode = embedParams.colorMode;
|
|
}
|
|
|
|
// サイズの制限
|
|
document.documentElement.style.maxWidth = '500px';
|
|
|
|
// サーバー起動の場合はもとから付与されているけど一応
|
|
document.documentElement.classList.add('embed');
|
|
|
|
// 外部タブでのstoreの変更の影響を受けないように
|
|
defaultStore.setConfig({
|
|
disableMessageChannel: true,
|
|
});
|
|
|
|
// iframeIdの設定
|
|
function setIframeIdHandler(event: MessageEvent) {
|
|
if (event.data?.type === 'misskey:embedParent:registerIframeId' && event.data.payload?.iframeId != null) {
|
|
setIframeId(event.data.payload.iframeId);
|
|
window.removeEventListener('message', setIframeIdHandler);
|
|
}
|
|
}
|
|
|
|
window.addEventListener('message', setIframeIdHandler);
|
|
|
|
// 起動
|
|
common(() => createApp(
|
|
defineAsyncComponent(() => import('@/embed/ui.vue')),
|
|
), bootOptions).then(async ({ app }) => {
|
|
//#region Embed Provide
|
|
app.provide('EMBED_PAGE', true);
|
|
app.provide('embedParams', embedParams);
|
|
//#endregion
|
|
|
|
//#region defaultStoreを書き換え
|
|
await defaultStore.ready;
|
|
|
|
defaultStore.set('sound_notUseSound', true);
|
|
//#endregion
|
|
|
|
//#region Embed Link Behavior
|
|
//強制的に新しいタブで開く
|
|
const router = useRouter();
|
|
router.navHook = (path, flag): boolean => {
|
|
window.open(path, '_blank', 'noopener');
|
|
return true;
|
|
};
|
|
//#endregion
|
|
|
|
// 起動完了を通知(このあとクライアント側から misskey:embedParent:registerIframeId が送信される)
|
|
postMessageToParentWindow('misskey:embed:ready');
|
|
});
|