2021-07-02 19:03:34 +02:00
|
|
|
import type { GameStateEvent } from './GameStateEvent';
|
|
|
|
import type { ButtonClickedEvent } from './ButtonClickedEvent';
|
|
|
|
import type { ChatEvent } from './ChatEvent';
|
|
|
|
import type { ClosePopupEvent } from './ClosePopupEvent';
|
|
|
|
import type { EnterLeaveEvent } from './EnterLeaveEvent';
|
|
|
|
import type { GoToPageEvent } from './GoToPageEvent';
|
|
|
|
import type { LoadPageEvent } from './LoadPageEvent';
|
|
|
|
import type { OpenCoWebSiteEvent } from './OpenCoWebSiteEvent';
|
|
|
|
import type { OpenPopupEvent } from './OpenPopupEvent';
|
|
|
|
import type { OpenTabEvent } from './OpenTabEvent';
|
|
|
|
import type { UserInputChatEvent } from './UserInputChatEvent';
|
|
|
|
import type { DataLayerEvent } from './DataLayerEvent';
|
|
|
|
import type { LayerEvent } from './LayerEvent';
|
|
|
|
import type { SetPropertyEvent } from './setPropertyEvent';
|
|
|
|
import type { LoadSoundEvent } from './LoadSoundEvent';
|
|
|
|
import type { PlaySoundEvent } from './PlaySoundEvent';
|
|
|
|
import type { MenuItemClickedEvent } from './ui/MenuItemClickedEvent';
|
|
|
|
import type { MenuItemRegisterEvent } from './ui/MenuItemRegisterEvent';
|
|
|
|
import type { HasPlayerMovedEvent } from './HasPlayerMovedEvent';
|
|
|
|
import type { SetTilesEvent } from './SetTilesEvent';
|
2021-07-02 18:49:22 +02:00
|
|
|
import type {
|
|
|
|
MessageReferenceEvent,
|
|
|
|
removeTriggerMessage,
|
|
|
|
triggerMessage,
|
|
|
|
TriggerMessageEvent,
|
2021-07-02 19:03:34 +02:00
|
|
|
} from './ui/TriggerMessageEvent';
|
2021-05-09 21:30:29 +02:00
|
|
|
|
2021-05-09 21:46:40 +02:00
|
|
|
export interface TypedMessageEvent<T> extends MessageEvent {
|
2021-06-25 18:14:40 +02:00
|
|
|
data: T;
|
2021-05-09 21:46:40 +02:00
|
|
|
}
|
|
|
|
|
2021-07-02 16:41:24 +02:00
|
|
|
/**
|
|
|
|
* List event types sent from an iFrame to WorkAdventure
|
|
|
|
*/
|
2021-05-09 21:30:29 +02:00
|
|
|
export type IframeEventMap = {
|
2021-06-25 18:14:40 +02:00
|
|
|
loadPage: LoadPageEvent;
|
|
|
|
chat: ChatEvent;
|
|
|
|
openPopup: OpenPopupEvent;
|
|
|
|
closePopup: ClosePopupEvent;
|
|
|
|
openTab: OpenTabEvent;
|
|
|
|
goToPage: GoToPageEvent;
|
|
|
|
openCoWebSite: OpenCoWebSiteEvent;
|
|
|
|
closeCoWebSite: null;
|
|
|
|
disablePlayerControls: null;
|
|
|
|
restorePlayerControls: null;
|
|
|
|
displayBubble: null;
|
|
|
|
removeBubble: null;
|
|
|
|
onPlayerMove: undefined;
|
|
|
|
showLayer: LayerEvent;
|
|
|
|
hideLayer: LayerEvent;
|
|
|
|
setProperty: SetPropertyEvent;
|
|
|
|
getDataLayer: undefined;
|
|
|
|
loadSound: LoadSoundEvent;
|
|
|
|
playSound: PlaySoundEvent;
|
|
|
|
stopSound: null;
|
|
|
|
getState: undefined;
|
|
|
|
registerMenuCommand: MenuItemRegisterEvent;
|
2021-07-02 14:35:28 +02:00
|
|
|
setTiles: SetTilesEvent;
|
2021-07-02 18:49:22 +02:00
|
|
|
|
|
|
|
triggerMessage: TriggerMessageEvent;
|
|
|
|
removeTriggerMessage: MessageReferenceEvent;
|
2021-06-25 18:14:40 +02:00
|
|
|
};
|
2021-05-09 21:30:29 +02:00
|
|
|
export interface IframeEvent<T extends keyof IframeEventMap> {
|
|
|
|
type: T;
|
|
|
|
data: IframeEventMap[T];
|
|
|
|
}
|
|
|
|
|
|
|
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
2021-06-25 18:14:40 +02:00
|
|
|
export const isIframeEventWrapper = (event: any): event is IframeEvent<keyof IframeEventMap> =>
|
2021-07-02 19:03:34 +02:00
|
|
|
typeof event.type === 'string';
|
2021-05-09 21:30:29 +02:00
|
|
|
|
|
|
|
export interface IframeResponseEventMap {
|
2021-06-25 18:14:40 +02:00
|
|
|
userInputChat: UserInputChatEvent;
|
|
|
|
enterEvent: EnterLeaveEvent;
|
|
|
|
leaveEvent: EnterLeaveEvent;
|
|
|
|
buttonClickedEvent: ButtonClickedEvent;
|
|
|
|
hasPlayerMoved: HasPlayerMovedEvent;
|
|
|
|
dataLayer: DataLayerEvent;
|
|
|
|
menuItemClicked: MenuItemClickedEvent;
|
2021-07-02 18:49:22 +02:00
|
|
|
messageTriggered: MessageReferenceEvent;
|
2021-05-09 21:30:29 +02:00
|
|
|
}
|
|
|
|
export interface IframeResponseEvent<T extends keyof IframeResponseEventMap> {
|
|
|
|
type: T;
|
|
|
|
data: IframeResponseEventMap[T];
|
2021-03-05 16:50:54 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
2021-06-25 18:14:40 +02:00
|
|
|
export const isIframeResponseEventWrapper = (event: {
|
|
|
|
type?: string;
|
2021-07-02 19:03:34 +02:00
|
|
|
}): event is IframeResponseEvent<keyof IframeResponseEventMap> => typeof event.type === 'string';
|
2021-07-02 16:41:24 +02:00
|
|
|
|
|
|
|
/**
|
|
|
|
* List event types sent from an iFrame to WorkAdventure that expect a unique answer from WorkAdventure along the type for the answer from WorkAdventure to the iFrame
|
|
|
|
*/
|
|
|
|
export type IframeQueryMap = {
|
|
|
|
getState: {
|
2021-07-02 18:49:22 +02:00
|
|
|
query: undefined;
|
|
|
|
answer: GameStateEvent;
|
|
|
|
};
|
|
|
|
|
|
|
|
[triggerMessage]: {
|
|
|
|
query: TriggerMessageEvent;
|
|
|
|
answer: void;
|
|
|
|
};
|
|
|
|
|
|
|
|
[removeTriggerMessage]: {
|
|
|
|
query: MessageReferenceEvent;
|
|
|
|
answer: void;
|
|
|
|
};
|
|
|
|
};
|
2021-07-02 16:41:24 +02:00
|
|
|
|
|
|
|
export interface IframeQuery<T extends keyof IframeQueryMap> {
|
|
|
|
type: T;
|
2021-07-02 19:03:34 +02:00
|
|
|
data: IframeQueryMap[T]['query'];
|
2021-07-02 16:41:24 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
export interface IframeQueryWrapper<T extends keyof IframeQueryMap> {
|
|
|
|
id: number;
|
|
|
|
query: IframeQuery<T>;
|
|
|
|
}
|
|
|
|
|
|
|
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
2021-07-02 19:03:34 +02:00
|
|
|
export const isIframeQuery = (event: any): event is IframeQuery<keyof IframeQueryMap> => typeof event.type === 'string';
|
2021-07-02 16:41:24 +02:00
|
|
|
|
|
|
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
2021-07-02 18:49:22 +02:00
|
|
|
export const isIframeQueryWrapper = (event: any): event is IframeQueryWrapper<keyof IframeQueryMap> =>
|
2021-07-02 19:03:34 +02:00
|
|
|
typeof event.id === 'number' && isIframeQuery(event.query);
|
2021-07-02 16:41:24 +02:00
|
|
|
|
|
|
|
export interface IframeAnswerEvent<T extends keyof IframeQueryMap> {
|
|
|
|
id: number;
|
|
|
|
type: T;
|
2021-07-02 19:03:34 +02:00
|
|
|
data: IframeQueryMap[T]['answer'];
|
2021-07-02 16:41:24 +02:00
|
|
|
}
|
|
|
|
|
2021-07-02 18:49:22 +02:00
|
|
|
export const isIframeAnswerEvent = (event: {
|
|
|
|
type?: string;
|
|
|
|
id?: number;
|
2021-07-02 19:03:34 +02:00
|
|
|
}): event is IframeAnswerEvent<keyof IframeQueryMap> => typeof event.type === 'string' && typeof event.id === 'number';
|
2021-07-02 16:41:24 +02:00
|
|
|
|
|
|
|
export interface IframeErrorAnswerEvent {
|
|
|
|
id: number;
|
|
|
|
type: keyof IframeQueryMap;
|
|
|
|
error: string;
|
|
|
|
}
|
|
|
|
|
2021-07-02 18:49:22 +02:00
|
|
|
export const isIframeErrorAnswerEvent = (event: {
|
|
|
|
type?: string;
|
|
|
|
id?: number;
|
|
|
|
error?: string;
|
|
|
|
}): event is IframeErrorAnswerEvent =>
|
2021-07-02 19:03:34 +02:00
|
|
|
typeof event.type === 'string' && typeof event.id === 'number' && typeof event.error === 'string';
|