UNPKG

decentraland-ui

Version:

Decentraland's UI components and styles

137 lines (136 loc) 5.32 kB
"use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.createController = void 0; /* eslint-disable @typescript-eslint/no-explicit-any */ var mitt_1 = __importDefault(require("mitt")); var fp_future_1 = __importDefault(require("fp-future")); var preview_1 = require("@dcl/schemas/dist/dapps/preview"); var promises = new Map(); var emoteEvents = new Map(); window.onmessage = function handleMessage(event) { if (event.data && event.data.type) { switch (event.data.type) { case preview_1.PreviewMessageType.CONTROLLER_RESPONSE: { var payload = event.data .payload; var id = payload.id; var promise = promises.get(id); if (promise) { if (payload.ok) { promise.resolve(payload.result); } else if (payload.ok === false) { promise.reject(new Error(payload.error)); } } break; } case preview_1.PreviewMessageType.EMOTE_EVENT: { var payload = event.data .payload; var type = payload.type, eventPayload = payload.payload; var events = emoteEvents.get(event.source); if (events && type) { events.emit(type, eventPayload); } break; } default: // nothing to do, invalid message } } }; var nonce = 0; function createSendRequest(id) { return function sendRequest(namespace, method, params) { var iframe = document.getElementById(id); var messageId = id + '-' + nonce; var promise = (0, fp_future_1.default)(); promises.set(messageId, promise); var type = preview_1.PreviewMessageType.CONTROLLER_REQUEST; var message = { id: messageId, namespace: namespace, method: method, params: params }; // Cast needed: @dcl/schemas PreviewMessagePayload doesn't include new emote methods yet (0, preview_1.sendMessage)(iframe.contentWindow, type, message); nonce++; return promise; }; } function createController(id) { var _a; var iframe = document.getElementById(id); if (!iframe) { throw new Error("Could not find an iframe with id=\"".concat(id, "\"")); } var events = (_a = emoteEvents.get(iframe.contentWindow)) !== null && _a !== void 0 ? _a : (0, mitt_1.default)(); emoteEvents.set(iframe.contentWindow, events); var sendRequest = createSendRequest(id); return { scene: { getScreenshot: function (width, height) { return sendRequest('scene', 'getScreenshot', [width, height]); }, getMetrics: function () { return sendRequest('scene', 'getMetrics', []); }, changeZoom: function (zoom) { return sendRequest('scene', 'changeZoom', [zoom]); }, panCamera: function (offset) { return sendRequest('scene', 'panCamera', [offset]); }, changeCameraPosition: function (position) { return sendRequest('scene', 'changeCameraPosition', [position]); }, setUsername: function (username) { return sendRequest('scene', 'setUsername', [username]); }, cleanup: function () { return sendRequest('scene', 'cleanup', []); } }, emote: { getLength: function () { return sendRequest('emote', 'getLength', []); }, isPlaying: function () { return sendRequest('emote', 'isPlaying', []); }, goTo: function (seconds) { return sendRequest('emote', 'goTo', [seconds]); }, play: function () { return sendRequest('emote', 'play', []); }, pause: function () { return sendRequest('emote', 'pause', []); }, stop: function () { return sendRequest('emote', 'stop', []); }, enableSound: function () { return sendRequest('emote', 'enableSound', []); }, disableSound: function () { return sendRequest('emote', 'disableSound', []); }, hasSound: function () { return sendRequest('emote', 'hasSound', []); }, isSocialEmote: function () { return sendRequest('emote', 'isSocialEmote', []); }, getSocialEmoteAnimations: function () { return sendRequest('emote', 'getSocialEmoteAnimations', []); }, getPlayingSocialEmoteAnimation: function () { return sendRequest('emote', 'getPlayingSocialEmoteAnimation', []); }, emote: null, events: events } }; } exports.createController = createController;