summaryrefslogtreecommitdiff
path: root/packages/frontend-embed/src/post-message.ts
blob: 93b57c380bd5f36f899ee71021ad4009b2580160 (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
/*
 * SPDX-FileCopyrightText: syuilo and misskey-project
 * SPDX-License-Identifier: AGPL-3.0-only
 */

export const postMessageEventTypes = [
	'misskey:embed:ready',
	'misskey:embed:changeHeight',
] as const;

export type PostMessageEventType = typeof postMessageEventTypes[number];

export interface PostMessageEventPayload extends Record<PostMessageEventType, any> {
	'misskey:embed:ready': undefined;
	'misskey:embed:changeHeight': {
		height: number;
	};
}

export type MiPostMessageEvent<T extends PostMessageEventType = PostMessageEventType> = {
	type: T;
	iframeId?: string;
	payload?: PostMessageEventPayload[T];
};

let defaultIframeId: string | null = null;

export function setIframeId(id: string): void {
	if (defaultIframeId != null) return;

	if (_DEV_) console.log('setIframeId', id);
	defaultIframeId = id;
}

/**
 * 親フレームにイベントを送信
 */
export function postMessageToParentWindow<T extends PostMessageEventType = PostMessageEventType>(type: T, payload?: PostMessageEventPayload[T], iframeId: string | null = null): void {
	let _iframeId = iframeId;
	if (_iframeId == null) {
		_iframeId = defaultIframeId;
	}
	if (_DEV_) console.log('postMessageToParentWindow', type, _iframeId, payload);
	window.parent.postMessage({
		type,
		iframeId: _iframeId,
		payload,
	}, '*');
}