@tamagui/react-native-web-lite
Version:
React Native for Web
111 lines • 3.33 kB
JavaScript
var __defProp = Object.defineProperty;
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
var __getOwnPropNames = Object.getOwnPropertyNames;
var __hasOwnProp = Object.prototype.hasOwnProperty;
var __export = (target, all) => {
for (var name in all) __defProp(target, name, {
get: all[name],
enumerable: true
});
};
var __copyProps = (to, from, except, desc) => {
if (from && typeof from === "object" || typeof from === "function") {
for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, {
get: () => from[key],
enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable
});
}
return to;
};
var __toCommonJS = mod => __copyProps(__defProp({}, "__esModule", {
value: true
}), mod);
var TaskQueue_exports = {};
__export(TaskQueue_exports, {
TaskQueue: () => TaskQueue
});
module.exports = __toCommonJS(TaskQueue_exports);
var import_react_native_web_internals = require("@tamagui/react-native-web-internals");
class TaskQueue {
_queueStack;
_onMoreTasks;
constructor({
onMoreTasks
}) {
this._onMoreTasks = onMoreTasks;
this._queueStack = [{
tasks: [],
popable: true
}];
}
enqueue(task) {
this._getCurrentQueue().push(task);
}
enqueueTasks(tasks) {
tasks.forEach(task => this.enqueue(task));
}
cancelTasks(tasksToCancel) {
this._queueStack = this._queueStack.map(queue => ({
...queue,
tasks: queue.tasks.filter(task => !tasksToCancel.includes(task))
})).filter((queue, idx) => queue.tasks.length > 0 || idx === 0);
}
hasTasksToProcess() {
return this._getCurrentQueue().length > 0;
}
/**
* Executes the next task in the queue.
*/
processNext() {
const queue = this._getCurrentQueue();
if (queue.length) {
const task = queue.shift();
try {
if (typeof task === "object" && "gen" in task) {
this._genPromise(task);
} else if (typeof task === "object" && "run" in task) {
task.run();
} else {
(0, import_react_native_web_internals.invariant)(typeof task === "function", "Expected Function, SimpleTask, or PromiseTask, but got:\n" + JSON.stringify(task, null, 2));
task();
}
} catch (e) {
if (e instanceof Error) {
e.message = "TaskQueue: Error with task " + (task?.name || "") + ": " + e.message;
}
throw e;
}
}
}
_getCurrentQueue() {
const stackIdx = this._queueStack.length - 1;
const queue = this._queueStack[stackIdx];
if (queue.popable && queue.tasks.length === 0 && stackIdx > 0) {
this._queueStack.pop();
return this._getCurrentQueue();
} else {
return queue.tasks;
}
}
_genPromise(task) {
const length = this._queueStack.push({
tasks: [],
popable: false
});
const stackIdx = length - 1;
const stackItem = this._queueStack[stackIdx];
task.gen().then(() => {
stackItem.popable = true;
if (this.hasTasksToProcess()) {
this._onMoreTasks();
}
}).catch(ex => {
setTimeout(() => {
if (ex instanceof Error) {
ex.message = `TaskQueue: Error resolving Promise in task ${task.name}: ${ex.message}`;
}
throw ex;
}, 0);
});
}
}