react-defold
Version:
Defold component for react
53 lines (50 loc) • 2.11 kB
JavaScript
import React, { memo, useRef, useState, useEffect, useCallback } from 'react';
var DefoldAppContext = React.createContext(undefined);
var DefoldAppContextProvider = memo(function DefoldAppContextProvider(_a) {
var namespace = _a.namespace, data = _a.data, children = _a.children;
var ref = useRef(data);
var context = useState({
namespace: namespace,
inbound: [],
outbound: [],
data: ref,
onReceive: function () { },
})[0];
useEffect(function () {
window[context.namespace] = {
inbound: context.inbound,
outbound: context.outbound,
data: context.data.current,
in: function (msg) { return context.inbound.push(JSON.parse(msg)); },
out: function () {
var next = context.outbound.shift();
return next ? JSON.stringify(next) : "";
},
tick: function () {
context.inbound.forEach(function (_a) {
var command = _a.command, payload = _a.payload;
return context.onReceive(command, payload);
});
context.inbound.splice(0, context.inbound.length);
}
};
}, [context]);
return React.createElement(DefoldAppContext.Provider, { value: context }, children);
});
var useDefoldAppContext = function (_a) {
var onReceive = _a.onReceive;
var context = React.useContext(DefoldAppContext);
useEffect(function () {
if (onReceive && context)
context.onReceive = onReceive;
}, [context, onReceive]);
var send = useCallback(function (command, payload) {
if (context)
context.outbound.push({ command: command, payload: payload });
}, [context]);
if (context === undefined)
throw new Error('useDefoldAppContext must be used within a useDefoldAppContext');
return { data: context.data.current, send: send };
};
export { DefoldAppContextProvider, useDefoldAppContext };
//# sourceMappingURL=DefoldAppContext.js.map