import { IframeApiContribution, sendToWorkadventure } from "./IframeApiContribution"; import type { HasPlayerMovedEvent, HasPlayerMovedEventCallback } from "../Events/HasPlayerMovedEvent"; import { Subject } from "rxjs"; import { apiCallback } from "./registeredCallbacks"; import { isHasPlayerMovedEvent } from "../Events/HasPlayerMovedEvent"; const moveStream = new Subject(); let playerName: string|undefined; export const setPlayerName = (name: string) => { playerName = name; } let tags: string[]|undefined; export const setTags = (_tags: string[]) => { tags = _tags; } let uuid: string|undefined; export const setUuid = (_uuid: string|undefined) => { uuid = _uuid; } export class WorkadventurePlayerCommands extends IframeApiContribution { callbacks = [ apiCallback({ type: "hasPlayerMoved", typeChecker: isHasPlayerMovedEvent, callback: (payloadData) => { moveStream.next(payloadData); }, }), ]; onPlayerMove(callback: HasPlayerMovedEventCallback): void { moveStream.subscribe(callback); sendToWorkadventure({ type: "onPlayerMove", data: null, }); } get name() : string { if (playerName === undefined) { throw new Error('Player name not initialized yet. You should call WA.player.name within a WA.onInit callback.'); } return playerName; } get tags() : string[] { if (tags === undefined) { throw new Error('Tags not initialized yet. You should call WA.player.tags within a WA.onInit callback.'); } return tags; } get id() : string|undefined { // Note: this is not a type, we are checking if playerName is undefined because playerName cannot be undefined // while uuid could. if (playerName === undefined) { throw new Error('Player id not initialized yet. You should call WA.player.id within a WA.onInit callback.'); } return uuid; } } export default new WorkadventurePlayerCommands();