added trigger message code

This commit is contained in:
jonny 2021-06-23 17:32:32 +02:00
parent 3cf0a9ee84
commit 5472d220ba
9 changed files with 267 additions and 99 deletions

View file

@ -18,6 +18,7 @@ import type { PlaySoundEvent } from "./PlaySoundEvent";
import type { MenuItemClickedEvent } from "./ui/MenuItemClickedEvent";
import type { MenuItemRegisterEvent } from './ui/MenuItemRegisterEvent';
import type { HasPlayerMovedEvent } from "./HasPlayerMovedEvent";
import type { MessageReferenceEvent, TriggerMessageEvent } from '../iframe/TriggerMessageEvent';
export interface TypedMessageEvent<T> extends MessageEvent {
@ -49,6 +50,9 @@ export type IframeEventMap = {
stopSound: null,
getState: undefined,
registerMenuCommand: MenuItemRegisterEvent
triggerMessage: TriggerMessageEvent
removeTriggerMessage: MessageReferenceEvent
}
export interface IframeEvent<T extends keyof IframeEventMap> {
type: T;
@ -68,6 +72,7 @@ export interface IframeResponseEventMap {
hasPlayerMoved: HasPlayerMovedEvent
dataLayer: DataLayerEvent
menuItemClicked: MenuItemClickedEvent
messageTriggered: MessageReferenceEvent
}
export interface IframeResponseEvent<T extends keyof IframeResponseEventMap> {
type: T;

View file

@ -0,0 +1,21 @@
import * as tg from "generic-type-guard";
export const triggerMessage = "triggerMessage"
export const removeTriggerMessage = "removeTriggerMessage"
export const isTriggerMessageEvent = new tg.IsInterface().withProperties({
message: tg.isString,
uuid: tg.isString
}).get()
export type TriggerMessageEvent = tg.GuardedType<typeof isTriggerMessageEvent>;
export const isMessageReferenceEvent =
new tg.IsInterface().withProperties({
uuid: tg.isString
}).get();
export type MessageReferenceEvent = tg.GuardedType<typeof isMessageReferenceEvent>;

View file

@ -0,0 +1,42 @@
import { Subject } from 'rxjs';
import { iframeListener } from '../../IframeListener';
import { isMessageReferenceEvent, isTriggerMessageEvent, MessageReferenceEvent, removeTriggerMessage, triggerMessage, TriggerMessageEvent } from './TriggerMessageEvent';
import * as tg from "generic-type-guard";
export function sendMessageTriggeredEvent(uuid: string) {
iframeListener.postMessage({
'type': 'messageTriggered',
'data': {
uuid,
} as MessageReferenceEvent
});
}
const _triggerMessageEvent: Subject<TriggerMessageEvent> = new Subject();
const _removeTriggerMessageEvent: Subject<MessageReferenceEvent> = new Subject();
export const triggerMessageEvent = _triggerMessageEvent.asObservable();
export const removeTriggerMessageEvent = _removeTriggerMessageEvent.asObservable();
const isTriggerMessageEventObject = new tg.IsInterface().withProperties({
type: tg.isSingletonString(triggerMessage),
data: isTriggerMessageEvent
}).get()
const isTriggerMessageRemoveEventObject = new tg.IsInterface().withProperties({
type: tg.isSingletonString(removeTriggerMessage),
data: isMessageReferenceEvent
}).get()
export const isTriggerMessageHandlerEvent = tg.isUnion(isTriggerMessageEventObject, isTriggerMessageRemoveEventObject)
export function triggerMessageEventHandler(event: tg.GuardedType<typeof isTriggerMessageHandlerEvent>) {
if (isTriggerMessageEventObject(event)) {
_triggerMessageEvent.next(event.data)
} else if (isTriggerMessageRemoveEventObject(event)) {
_removeTriggerMessageEvent.next(event.data)
}
}