decentraland-ui
Version:
Decentraland's UI components and styles
137 lines (136 loc) • 5.32 kB
JavaScript
;
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;