Implementation of getTag of the current user
documentation of getTag Adding map for test of getTag
This commit is contained in:
parent
96545c618a
commit
2f9cc393a7
9 changed files with 354 additions and 3 deletions
|
@ -15,6 +15,7 @@ import type { UserInputChatEvent } from './UserInputChatEvent';
|
|||
import type { DataLayerEvent } from "./DataLayerEvent";
|
||||
import type { LayerEvent } from './LayerEvent';
|
||||
import type { SetPropertyEvent } from "./setPropertyEvent";
|
||||
import type { TagEvent } from "./TagEvent";
|
||||
|
||||
export interface TypedMessageEvent<T> extends MessageEvent {
|
||||
data: T
|
||||
|
@ -36,11 +37,11 @@ export type IframeEventMap = {
|
|||
displayBubble: null
|
||||
removeBubble: null
|
||||
onPlayerMove: undefined
|
||||
onDataLayerChange: undefined
|
||||
showLayer: LayerEvent
|
||||
hideLayer: LayerEvent
|
||||
setProperty: SetPropertyEvent
|
||||
getDataLayer: undefined
|
||||
getTag: undefined
|
||||
}
|
||||
export interface IframeEvent<T extends keyof IframeEventMap> {
|
||||
type: T;
|
||||
|
@ -60,6 +61,7 @@ export interface IframeResponseEventMap {
|
|||
hasPlayerMoved: HasPlayerMovedEvent
|
||||
dataLayer: DataLayerEvent
|
||||
menuItemClicked: MenuItemClickedEvent
|
||||
tagList: TagEvent
|
||||
}
|
||||
export interface IframeResponseEvent<T extends keyof IframeResponseEventMap> {
|
||||
type: T;
|
||||
|
|
10
front/src/Api/Events/TagEvent.ts
Normal file
10
front/src/Api/Events/TagEvent.ts
Normal file
|
@ -0,0 +1,10 @@
|
|||
import * as tg from "generic-type-guard";
|
||||
|
||||
export const isTagEvent =
|
||||
new tg.IsInterface().withProperties({
|
||||
list: tg.isArray(tg.isString),
|
||||
}).get();
|
||||
/**
|
||||
* A message sent from the iFrame to the game to show/hide a layer.
|
||||
*/
|
||||
export type TagEvent = tg.GuardedType<typeof isTagEvent>;
|
|
@ -19,6 +19,7 @@ import { Math } from 'phaser';
|
|||
import type { DataLayerEvent } from "./Events/DataLayerEvent";
|
||||
import { isMenuItemRegisterEvent } from './Events/MenuItemRegisterEvent';
|
||||
import type { MenuItemClickedEvent } from './Events/MenuItemClickedEvent';
|
||||
import type { TagEvent } from "./Events/TagEvent";
|
||||
|
||||
|
||||
/**
|
||||
|
@ -77,6 +78,10 @@ class IframeListener {
|
|||
|
||||
private readonly _registerMenuCommandStream: Subject<string> = new Subject();
|
||||
public readonly registerMenuCommandStream = this._registerMenuCommandStream.asObservable();
|
||||
|
||||
private readonly _tagListStream: Subject<string> = new Subject();
|
||||
public readonly tagListStream = this._tagListStream.asObservable();
|
||||
|
||||
private readonly iframes = new Set<HTMLIFrameElement>();
|
||||
private readonly scripts = new Map<string, HTMLIFrameElement>();
|
||||
private sendPlayerMove: boolean = false;
|
||||
|
@ -145,12 +150,21 @@ class IframeListener {
|
|||
this._dataLayerChangeStream.next();
|
||||
} else if (payload.type == "registerMenuCommand" && isMenuItemRegisterEvent(payload.data)) {
|
||||
this._registerMenuCommandStream.next(payload.data.menutItem)
|
||||
} else if (payload.type == "getTag") {
|
||||
this._tagListStream.next();
|
||||
}
|
||||
}
|
||||
}, false);
|
||||
|
||||
}
|
||||
|
||||
sendUserTagList(tagList: TagEvent){
|
||||
this.postMessage({
|
||||
'type' : 'tagList',
|
||||
'data' : tagList
|
||||
})
|
||||
}
|
||||
|
||||
sendDataLayerEvent(dataLayerEvent: DataLayerEvent) {
|
||||
this.postMessage({
|
||||
'type' : 'dataLayer',
|
||||
|
|
|
@ -598,4 +598,11 @@ export class RoomConnection implements RoomConnection {
|
|||
public isAdmin(): boolean {
|
||||
return this.hasTag('admin');
|
||||
}
|
||||
|
||||
public getAllTag() : string[] {
|
||||
this.tags.push('TEST');
|
||||
this.tags.push('TEST 2');
|
||||
this.tags.push('TEST 3');
|
||||
return this.tags;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -903,6 +903,13 @@ ${escapedMessage}
|
|||
iframeListener.sendDataLayerEvent({data: this.gameMap.getMap()});
|
||||
}))
|
||||
|
||||
this.iframeSubscriptionList.push(iframeListener.tagListStream.subscribe(()=> {
|
||||
if (this.connection === undefined) {
|
||||
return;
|
||||
}
|
||||
iframeListener.sendUserTagList({list: this.connection.getAllTag()});
|
||||
}))
|
||||
|
||||
}
|
||||
|
||||
private setPropertyLayer(layerName: string, propertyName: string, propertyValue: string | number | boolean | undefined): void {
|
||||
|
|
|
@ -17,6 +17,7 @@ import { DataLayerEvent, isDataLayerEvent } from "./Api/Events/DataLayerEvent";
|
|||
import type { ITiledMap } from "./Phaser/Map/ITiledMap";
|
||||
import type { MenuItemRegisterEvent } from "./Api/Events/MenuItemRegisterEvent";
|
||||
import { isMenuItemClickedEvent } from "./Api/Events/MenuItemClickedEvent";
|
||||
import {TagEvent, isTagEvent} from "./Api/Events/TagEvent";
|
||||
|
||||
interface WorkAdventureApi {
|
||||
sendChatMessage(message: string, author: string): void;
|
||||
|
@ -45,10 +46,10 @@ interface WorkAdventureApi {
|
|||
getRoomId(): Promise<string>;
|
||||
getStartLayerName(): Promise<string | null>;
|
||||
getNickName(): Promise<string | null>;
|
||||
|
||||
getTagUser(): Promise<string[]>;
|
||||
getMap(): Promise<ITiledMap>
|
||||
|
||||
onPlayerMove(callback: (playerMovedEvent: HasPlayerMovedEvent) => void): void
|
||||
getMap(): Promise<ITiledMap>
|
||||
}
|
||||
|
||||
declare global {
|
||||
|
@ -128,8 +129,19 @@ function getDataLayer(): Promise<DataLayerEvent> {
|
|||
})
|
||||
}
|
||||
|
||||
function getTag(): Promise<TagEvent> {
|
||||
return new Promise<TagEvent>((resolver, thrower) => {
|
||||
tagResolver.push((resolver));
|
||||
postToParent({
|
||||
type: "getTag",
|
||||
data: undefined
|
||||
})
|
||||
})
|
||||
}
|
||||
|
||||
const gameStateResolver: Array<(event: GameStateEvent) => void> = []
|
||||
const dataLayerResolver: Array<(event: DataLayerEvent) => void> = []
|
||||
const tagResolver: Array<(event : TagEvent) => void> = []
|
||||
let immutableData: GameStateEvent;
|
||||
|
||||
const callbackPlayerMoved: { [type: string]: HasPlayerMovedEventCallback | ((arg?: HasPlayerMovedEvent | never) => void) } = {}
|
||||
|
@ -151,6 +163,11 @@ window.WA = {
|
|||
})
|
||||
},
|
||||
|
||||
getTagUser(): Promise<string[]> {
|
||||
return getTag().then((res) => {
|
||||
return res.list;
|
||||
})
|
||||
},
|
||||
|
||||
getMap(): Promise<ITiledMap> {
|
||||
return getDataLayer().then((res) => {
|
||||
|
@ -389,6 +406,12 @@ window.addEventListener('message', message => {
|
|||
if (callback) {
|
||||
callback(payload.data.menuItem)
|
||||
}
|
||||
} else {
|
||||
if (payload.type == "tagList" && isTagEvent(payloadData)) {
|
||||
tagResolver.forEach(resolver => {
|
||||
resolver(payloadData);
|
||||
})
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue