@saber2pr/react
Version:
react in Typescript.
102 lines (101 loc) • 3.46 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
/*
* @Author: saber2pr
* @Date: 2019-12-06 19:07:32
* @Last Modified by: saber2pr
* @Last Modified time: 2019-12-08 12:31:52
*/
var ReactFiberWorkLoop_1 = require("./ReactFiberWorkLoop");
var ReactTypes_1 = require("../shared/ReactTypes");
var ReactFiberHostConfig_1 = require("./ReactFiberHostConfig");
var ReactFiberReflection_1 = require("./ReactFiberReflection");
var testStackSize_1 = require("../shared/testStackSize");
var updateQueue = [];
var lastTime = 0;
function pushEffect(callback) {
if (requestIdleCallback) {
requestIdleCallback(callback);
}
else {
setTimeout(callback);
}
}
function pushLayoutEffect(callback) {
if (requestAnimationFrame) {
requestAnimationFrame(callback);
}
else {
var now = Date.now();
var nextTime_1 = Math.max(lastTime + 16, now);
return setTimeout(function () { return callback((lastTime = nextTime_1)); }, nextTime_1 - now);
}
}
function scheduleWork(fiber, mode) {
if (mode === void 0) { mode = "normal"; }
updateQueue.push(fiber);
switch (mode) {
case "normal":
pushEffect(scheduleUnitOfWorkNormalMode);
break;
case "layout":
pushLayoutEffect(scheduleUnitOfWorkLayoutMode);
break;
default:
pushEffect(scheduleUnitOfWorkNormalMode);
}
}
exports.scheduleWork = scheduleWork;
function scheduleUnitOfWorkNormalMode() {
testStackSize_1.TestStackSize("scheduleUnitOfWorkNormalMode");
var update = updateQueue.pop();
if (update)
ReactFiberWorkLoop_1.renderRoot(update);
if (updateQueue.length) {
pushEffect(scheduleUnitOfWorkNormalMode);
}
}
function scheduleUnitOfWorkLayoutMode() {
testStackSize_1.TestStackSize("scheduleUnitOfWorkLayoutMode");
var update = updateQueue.pop();
if (update)
ReactFiberWorkLoop_1.renderRoot(update);
if (updateQueue.length) {
pushLayoutEffect(scheduleUnitOfWorkLayoutMode);
}
}
function createRenderer(HostConfig) {
ReactFiberHostConfig_1.setHostConfig(HostConfig);
var createContainer = function (component, container, callback) {
var rootFiber = {
$$typeof: ReactTypes_1.NodeType.Root,
props: { children: [component] },
stateNode: container,
callback: callback
};
HostConfig.removeAllChild(container);
scheduleWork(rootFiber);
};
var updateContainer = function (component, container, callback) {
var rootFiber = {
$$typeof: ReactTypes_1.NodeType.Root,
props: { children: [component] },
stateNode: container,
callback: callback
};
var containerFiber = ReactFiberReflection_1.Reflection.getContainerFiber(rootFiber);
containerFiber.alternate = null;
rootFiber.alternate = containerFiber;
scheduleWork(rootFiber);
};
var isContainer = function (container) {
return ReactFiberReflection_1.Reflection.hasContainerFiber(container);
};
return {
createContainer: createContainer,
updateContainer: updateContainer,
isContainer: isContainer
};
}
exports.createRenderer = createRenderer;
exports.default = createRenderer;