Socket
Socket
Sign inDemoInstall

@vtex/order-manager

Package Overview
Dependencies
Maintainers
74
Versions
36
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

@vtex/order-manager - npm Package Compare versions

Comparing version 0.0.3-16 to 0.0.3-17

568

dist/index.esm.js
/*!
* @vtex/order-manager v0.0.3-16
* @vtex/order-manager v0.0.3-17
* (c) VTEX

@@ -9,66 +9,2 @@ * Released under the MIT License.

/*! *****************************************************************************
Copyright (c) Microsoft Corporation.
Permission to use, copy, modify, and/or distribute this software for any
purpose with or without fee is hereby granted.
THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
PERFORMANCE OF THIS SOFTWARE.
***************************************************************************** */
var __assign = function() {
__assign = Object.assign || function __assign(t) {
for (var s, i = 1, n = arguments.length; i < n; i++) {
s = arguments[i];
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];
}
return t;
};
return __assign.apply(this, arguments);
};
function __awaiter(thisArg, _arguments, P, generator) {
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
return new (P || (P = Promise))(function (resolve, reject) {
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
step((generator = generator.apply(thisArg, _arguments || [])).next());
});
}
function __generator(thisArg, body) {
var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
function verb(n) { return function (v) { return step([n, v]); }; }
function step(op) {
if (f) throw new TypeError("Generator is already executing.");
while (_) try {
if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
if (y = 0, t) op = [op[0] & 2, t.value];
switch (op[0]) {
case 0: case 1: t = op; break;
case 4: _.label++; return { value: op[1], done: false };
case 5: _.label++; y = op[1]; op = [0]; continue;
case 7: op = _.ops.pop(); _.trys.pop(); continue;
default:
if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
if (t[2]) _.ops.pop();
_.trys.pop(); continue;
}
op = body.call(thisArg, _);
} catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
}
}
// Adapted from https://github.com/BalassaMarton/sequential-task-queue/blob/master/src/sequential-task-queue.ts

@@ -80,3 +16,3 @@ /**

*/
var cancellationTokenReasons = {
const cancellationTokenReasons = {
/** Used when the task was cancelled in response to a call to {@link SequentialTaskQueue.cancel} */

@@ -90,3 +26,3 @@ cancel: Object.create(null),

*/
var sequentialTaskQueueEvents = {
const sequentialTaskQueueEvents = {
drained: 'drained',

@@ -103,3 +39,3 @@ error: 'error',

*/
var SequentialTaskQueue = /** @class */ (function () {
class SequentialTaskQueue {
/**

@@ -109,3 +45,3 @@ * Creates a new instance of {@link SequentialTaskQueue}

*/
function SequentialTaskQueue(options) {
constructor(options) {
var _a, _b;

@@ -121,10 +57,6 @@ this.queue = [];

}
Object.defineProperty(SequentialTaskQueue.prototype, "isClosed", {
/** Indicates if the queue has been closed. Calling {@link SequentialTaskQueue.push} on a closed queue will result in an exception. */
get: function () {
return this._isClosed;
},
enumerable: false,
configurable: true
});
/** Indicates if the queue has been closed. Calling {@link SequentialTaskQueue.push} on a closed queue will result in an exception. */
get isClosed() {
return this._isClosed;
}
/**

@@ -136,8 +68,7 @@ * Adds a new task to the queue.

*/
SequentialTaskQueue.prototype.push = function (task, options) {
var _this = this;
push(task, options) {
if (this._isClosed) {
throw new Error(this.name + " has been previously closed");
throw new Error(`${this.name} has been previously closed`);
}
var taskEntry = {
const taskEntry = {
callback: task,

@@ -151,3 +82,3 @@ args: (options === null || options === void 0 ? void 0 : options.args)

cancellationToken: {
cancel: function (reason) { return _this.cancelTask(taskEntry, reason); },
cancel: (reason) => this.cancelTask(taskEntry, reason),
},

@@ -159,12 +90,10 @@ resolve: undefined,

this.queue.push(taskEntry);
this.scheduler.schedule(function () { return _this.next(); });
var result = new Promise(function (resolve, reject) {
this.scheduler.schedule(() => this.next());
const result = new Promise((resolve, reject) => {
taskEntry.resolve = resolve;
taskEntry.reject = reject;
});
result.cancel = function (reason) {
return taskEntry.cancellationToken.cancel(reason);
};
result.cancel = (reason) => taskEntry.cancellationToken.cancel(reason);
return result;
};
}
/**

@@ -174,18 +103,15 @@ * Cancels the currently running task (if any), and clears the queue.

*/
SequentialTaskQueue.prototype.cancel = function () {
var _this = this;
cancel() {
if (this.currentTask) {
this.cancelTask(this.currentTask, cancellationTokenReasons.cancel);
}
var queue = this.queue.splice(0);
const queue = this.queue.splice(0);
// Cancel all and emit a drained event if there were tasks waiting in the queue
if (queue.length) {
queue.forEach(function (task) {
return _this.cancelTask(task, cancellationTokenReasons.cancel);
});
queue.forEach((task) => this.cancelTask(task, cancellationTokenReasons.cancel));
this.emit(sequentialTaskQueueEvents.drained);
}
return this.wait();
};
SequentialTaskQueue.prototype.indexOf = function (task) {
}
indexOf(task) {
var _a;

@@ -195,6 +121,6 @@ if (((_a = this.currentTask) === null || _a === void 0 ? void 0 : _a.callback) === task) {

}
var queueIndex = this.queue
const queueIndex = this.queue
// Skip cancelled tasks
.filter(function (taskEntry) { var _a; return !((_a = taskEntry.cancellationToken) === null || _a === void 0 ? void 0 : _a.cancelled); })
.findIndex(function (taskEntry) { return taskEntry.callback === task; });
.filter((taskEntry) => { var _a; return !((_a = taskEntry.cancellationToken) === null || _a === void 0 ? void 0 : _a.cancelled); })
.findIndex((taskEntry) => taskEntry.callback === task);
if (queueIndex < 0) {

@@ -208,3 +134,3 @@ // Task not found, return -1

return queueIndex + (this.currentTask !== undefined ? 1 : 0);
};
}
/**

@@ -216,3 +142,3 @@ * Closes the queue, preventing new tasks to be added.

*/
SequentialTaskQueue.prototype.close = function (cancel) {
close(cancel) {
if (!this._isClosed) {

@@ -224,3 +150,3 @@ this._isClosed = true;

return this.wait();
};
}
/**

@@ -230,14 +156,9 @@ * Returns a promise that is fulfilled when the queue is empty.

*/
SequentialTaskQueue.prototype.wait = function () {
return __awaiter(this, void 0, void 0, function () {
var _this = this;
return __generator(this, function (_a) {
if (!this.currentTask && this.queue.length === 0)
return [2 /*return*/, Promise.resolve()];
return [2 /*return*/, new Promise(function (resolve) {
_this.waiters.push(resolve);
})];
});
async wait() {
if (!this.currentTask && this.queue.length === 0)
return Promise.resolve();
return new Promise((resolve) => {
this.waiters.push(resolve);
});
};
}
/**

@@ -248,7 +169,7 @@ * Adds an event handler for a named event.

*/
SequentialTaskQueue.prototype.on = function (evt, handler) {
on(evt, handler) {
var _a;
this.events = (_a = this.events) !== null && _a !== void 0 ? _a : {};
(this.events[evt] || (this.events[evt] = [])).push(handler);
};
}
/**

@@ -259,14 +180,9 @@ * Adds a single-shot event handler for a named event.

*/
SequentialTaskQueue.prototype.once = function (evt, handler) {
var _this = this;
var cb = function () {
var args = [];
for (var _i = 0; _i < arguments.length; _i++) {
args[_i] = arguments[_i];
}
_this.removeListener(evt, cb);
handler.apply(_this, args);
once(evt, handler) {
const cb = (...args) => {
this.removeListener(evt, cb);
handler.apply(this, args);
};
this.on(evt, cb);
};
}
/**

@@ -277,7 +193,7 @@ * Removes an event handler.

*/
SequentialTaskQueue.prototype.removeListener = function (evt, handler) {
removeListener(evt, handler) {
if (this.events) {
var list = this.events[evt];
const list = this.events[evt];
if (list) {
var i = 0;
let i = 0;
while (i < list.length) {

@@ -291,56 +207,50 @@ if (list[i] === handler)

}
};
}
/** @see {@link SequentialTaskQueue.removeListener} */
SequentialTaskQueue.prototype.off = function (evt, handler) {
off(evt, handler) {
return this.removeListener(evt, handler);
};
SequentialTaskQueue.prototype.emit = function (evt) {
var _this = this;
}
emit(evt, ...args) {
var _a;
var args = [];
for (var _i = 1; _i < arguments.length; _i++) {
args[_i - 1] = arguments[_i];
}
if ((_a = this.events) === null || _a === void 0 ? void 0 : _a[evt]) {
try {
this.events[evt].forEach(function (fn) { return fn.apply(_this, args); });
this.events[evt].forEach((fn) => fn.apply(this, args));
}
catch (e) {
console.error(this.name + ": Exception in '" + evt + "' event handler", e);
console.error(`${this.name}: Exception in '${evt}' event handler`, e);
}
}
};
SequentialTaskQueue.prototype.next = function () {
var _this = this;
}
next() {
// Try running the next task, if not currently running one
if (!this.currentTask) {
var task_1 = this.queue.shift();
let task = this.queue.shift();
// skip cancelled tasks
while (task_1 === null || task_1 === void 0 ? void 0 : task_1.cancellationToken.cancelled)
task_1 = this.queue.shift();
if (task_1) {
while (task === null || task === void 0 ? void 0 : task.cancellationToken.cancelled)
task = this.queue.shift();
if (task) {
try {
this.currentTask = task_1;
if (task_1.timeout) {
task_1.timeoutHandle = setTimeout(function () {
_this.emit(sequentialTaskQueueEvents.timeout);
_this.cancelTask(task_1, cancellationTokenReasons.timeout);
}, task_1.timeout);
this.currentTask = task;
if (task.timeout) {
task.timeoutHandle = setTimeout(() => {
this.emit(sequentialTaskQueueEvents.timeout);
this.cancelTask(task, cancellationTokenReasons.timeout);
}, task.timeout);
}
var res = task_1.callback.apply(undefined, task_1.args);
const res = task.callback.apply(undefined, task.args);
if (res && isPromise(res)) {
res.then(function (result) {
task_1.result = result;
_this.doneTask(task_1);
}, function (err) {
_this.doneTask(task_1, err);
res.then((result) => {
task.result = result;
this.doneTask(task);
}, (err) => {
this.doneTask(task, err);
});
}
else {
task_1.result = res;
this.doneTask(task_1);
task.result = res;
this.doneTask(task);
}
}
catch (e) {
this.doneTask(task_1, e);
this.doneTask(task, e);
}

@@ -353,10 +263,9 @@ }

}
};
SequentialTaskQueue.prototype.cancelTask = function (task, reason) {
}
cancelTask(task, reason) {
task.cancellationToken.cancelled = true;
task.cancellationToken.reason = reason;
this.doneTask(task);
};
SequentialTaskQueue.prototype.doneTask = function (task, error) {
var _this = this;
}
doneTask(task, error) {
if (task.timeoutHandle)

@@ -382,27 +291,26 @@ clearTimeout(task.timeoutHandle);

else {
this.scheduler.schedule(function () { return _this.next(); });
this.scheduler.schedule(() => this.next());
}
}
};
SequentialTaskQueue.prototype.callWaiters = function () {
var waiters = this.waiters.splice(0);
waiters.forEach(function (waiter) { return waiter(); });
};
SequentialTaskQueue.defaultScheduler = {
schedule: function (callback) { return setTimeout(function () { return callback(); }, 0); },
};
return SequentialTaskQueue;
}());
}
callWaiters() {
const waiters = this.waiters.splice(0);
waiters.forEach((waiter) => waiter());
}
}
SequentialTaskQueue.defaultScheduler = {
schedule: (callback) => setTimeout(() => callback(), 0),
};
SequentialTaskQueue.defaultScheduler = {
schedule: typeof setImmediate === 'function'
? function (callback) { return setImmediate(function () { return callback(); }); }
: function (callback) { return setTimeout(function () { return callback(); }, 0); },
? (callback) => setImmediate(() => callback())
: (callback) => setTimeout(() => callback(), 0),
};
var TASK_CANCELLED_CODE = 'TASK_CANCELLED';
const TASK_CANCELLED_CODE = 'TASK_CANCELLED';
// keep default value as -1 to indicate this order form
// is the initial value (not yet synchonized with server).
var UNSYNC_ORDER_FORM_VALUE = -1;
var DEFAULT_ORDER_FORM_ID = 'default-order-form';
var DEFAULT_ORDER_FORM = {
const UNSYNC_ORDER_FORM_VALUE = -1;
const DEFAULT_ORDER_FORM_ID = 'default-order-form';
const DEFAULT_ORDER_FORM = {
id: DEFAULT_ORDER_FORM_ID,

@@ -433,5 +341,4 @@ items: [],

var TaskQueue = /** @class */ (function () {
function TaskQueue() {
var _this = this;
class TaskQueue {
constructor() {
this.queue = new SequentialTaskQueue();

@@ -441,12 +348,11 @@ this.taskIdMap = {};

this.isEmpty = true;
this.queue.on('drained', function () {
_this.isEmpty = true;
_this.emit('Fulfilled');
this.queue.on('drained', () => {
this.isEmpty = true;
this.emit('Fulfilled');
});
}
TaskQueue.prototype.isWaiting = function (id) {
isWaiting(id) {
return !!this.taskIdMap[id];
};
TaskQueue.prototype.enqueue = function (task, id) {
var _this = this;
}
enqueue(task, id) {
if (this.isEmpty) {

@@ -459,33 +365,22 @@ this.isEmpty = false;

}
var wrappedTask = function () {
if (id && _this.taskIdMap[id]) {
delete _this.taskIdMap[id];
const wrappedTask = () => {
if (id && this.taskIdMap[id]) {
delete this.taskIdMap[id];
}
return new Promise(function (resolve, reject) {
var handleOnline = function () { return __awaiter(_this, void 0, void 0, function () {
var result, err_1;
return __generator(this, function (_a) {
switch (_a.label) {
case 0:
_a.trys.push([0, 2, , 3]);
return [4 /*yield*/, task()];
case 1:
result = _a.sent();
resolve(result);
return [3 /*break*/, 3];
case 2:
err_1 = _a.sent();
// we might have gone offline when this request was in-flight
// so we need to wait to be online again and replay this request
if (!navigator.onLine) {
return [2 /*return*/];
}
reject(err_1);
return [3 /*break*/, 3];
case 3:
window.removeEventListener('online', handleOnline);
return [2 /*return*/];
return new Promise((resolve, reject) => {
const handleOnline = async () => {
try {
const result = await task();
resolve(result);
}
catch (err) {
// we might have gone offline when this request was in-flight
// so we need to wait to be online again and replay this request
if (!navigator.onLine) {
return;
}
});
}); };
reject(err);
}
window.removeEventListener('online', handleOnline);
};
window.addEventListener('online', handleOnline);

@@ -497,20 +392,17 @@ if (navigator.onLine) {

};
var promise = this.queue.push(wrappedTask);
var cancelPromise = promise.cancel;
promise.cancel = function () {
return cancelPromise({
code: TASK_CANCELLED_CODE,
index: _this.queue.indexOf(wrappedTask),
});
};
const promise = this.queue.push(wrappedTask);
const cancelPromise = promise.cancel;
promise.cancel = () => cancelPromise({
code: TASK_CANCELLED_CODE,
index: this.queue.indexOf(wrappedTask),
});
if (id) {
this.taskIdMap[id] = {
task: task,
promise: promise,
task,
promise,
};
}
return promise;
};
TaskQueue.prototype.listen = function (event, cb) {
var _this = this;
}
listen(event, cb) {
if (!this.listeners[event]) {

@@ -520,27 +412,26 @@ this.listeners[event] = [];

this.listeners[event].push(cb);
var unlisten = function () {
var index = _this.listeners[event].indexOf(cb);
const unlisten = () => {
const index = this.listeners[event].indexOf(cb);
if (index !== -1) {
_this.listeners[event].splice(index, 1);
this.listeners[event].splice(index, 1);
}
};
return unlisten;
};
TaskQueue.prototype.emit = function (event) {
}
emit(event) {
if (this.listeners[event]) {
this.listeners[event].forEach(function (cb) { return cb(); });
this.listeners[event].forEach((cb) => cb());
}
};
return TaskQueue;
}());
}
}
var OrderQueueContext = createContext(undefined);
var useQueueStatus = function (listen) {
var queueStatus = useRef('Fulfilled');
useLayoutEffect(function () {
var unlisten = listen('Pending', function () { return (queueStatus.current = 'Pending'); });
const OrderQueueContext = createContext(undefined);
const useQueueStatus = (listen) => {
const queueStatus = useRef('Fulfilled');
useLayoutEffect(() => {
const unlisten = listen('Pending', () => (queueStatus.current = 'Pending'));
return unlisten;
}, [listen]);
useLayoutEffect(function () {
var unlisten = listen('Fulfilled', function () { return (queueStatus.current = 'Fulfilled'); });
useLayoutEffect(() => {
const unlisten = listen('Fulfilled', () => (queueStatus.current = 'Fulfilled'));
return unlisten;

@@ -550,14 +441,13 @@ }, [listen]);

};
var OrderQueueProvider = function (_a) {
var children = _a.children;
var queue = useState(function () { return new TaskQueue(); })[0];
var value = useMemo(function () { return ({
const OrderQueueProvider = ({ children, }) => {
const [queue] = useState(() => new TaskQueue());
const value = useMemo(() => ({
enqueue: queue.enqueue.bind(queue),
listen: queue.listen.bind(queue),
isWaiting: queue.isWaiting.bind(queue),
}); }, [queue]);
}), [queue]);
return (React.createElement(OrderQueueContext.Provider, { value: value }, children));
};
var useOrderQueue = function () {
var context = useContext(OrderQueueContext);
const useOrderQueue = () => {
const context = useContext(OrderQueueContext);
if (context === undefined) {

@@ -569,11 +459,10 @@ throw new Error('useOrderQueue must be used within a OrderQueueProvider');

var createUseMessages = function (_a) {
var useClearOrderFormMessages = _a.useClearOrderFormMessages, useToast = _a.useToast;
var useOrderFormMessages = function (orderForm, setOrderForm) {
var _a = useState([]), messages = _a[0], setMessages = _a[1];
var _b = useToast(), showToast = _b.showToast, toastState = _b.toastState;
var _c = useOrderQueue(), enqueue = _c.enqueue, listen = _c.listen;
var queueStatusRef = useQueueStatus(listen);
var clearOrderFormMessages = useClearOrderFormMessages();
useEffect(function () {
const createUseMessages = ({ useClearOrderFormMessages, useToast, }) => {
const useOrderFormMessages = (orderForm, setOrderForm) => {
const [messages, setMessages] = useState([]);
const { showToast, toastState } = useToast();
const { enqueue, listen } = useOrderQueue();
const queueStatusRef = useQueueStatus(listen);
const clearOrderFormMessages = useClearOrderFormMessages();
useEffect(() => {
if (toastState.isToastVisible || !messages.length) {

@@ -583,5 +472,5 @@ return;

showToast(messages[0].text);
setMessages(function (queue) { return queue.slice(1); });
setMessages((queue) => queue.slice(1));
}, [showToast, toastState.isToastVisible, messages]);
useEffect(function () {
useEffect(() => {
var _a, _b;

@@ -591,24 +480,23 @@ if (!((_b = (_a = orderForm.messages) === null || _a === void 0 ? void 0 : _a.generalMessages) === null || _b === void 0 ? void 0 : _b.length)) {

}
setMessages(function (prevMessages) { var _a, _b; return prevMessages.concat((_b = (_a = orderForm.messages) === null || _a === void 0 ? void 0 : _a.generalMessages) !== null && _b !== void 0 ? _b : []); });
setOrderForm(function (prevOrderForm) {
return __assign(__assign({}, prevOrderForm), { messages: __assign(__assign({}, prevOrderForm.messages), { generalMessages: [] }) });
setMessages((prevMessages) => { var _a, _b; return prevMessages.concat((_b = (_a = orderForm.messages) === null || _a === void 0 ? void 0 : _a.generalMessages) !== null && _b !== void 0 ? _b : []); });
setOrderForm((prevOrderForm) => {
return {
...prevOrderForm,
messages: {
...prevOrderForm.messages,
generalMessages: [],
},
};
});
var enqueuePromise = enqueue(function () { return __awaiter(void 0, void 0, void 0, function () {
var data;
return __generator(this, function (_a) {
switch (_a.label) {
case 0: return [4 /*yield*/, clearOrderFormMessages({
orderFormId: orderForm.id,
})];
case 1:
data = (_a.sent()).data;
return [2 /*return*/, data.clearOrderFormMessages];
}
const enqueuePromise = enqueue(async () => {
const { data } = await clearOrderFormMessages({
orderFormId: orderForm.id,
});
}); });
enqueuePromise.then(function (updatedOrderForm) {
return data.clearOrderFormMessages;
});
enqueuePromise.then((updatedOrderForm) => {
if (queueStatusRef.current === 'Fulfilled') {
setOrderForm(updatedOrderForm);
}
}, function (err) {
}, (err) => {
if (err.code === TASK_CANCELLED_CODE) {

@@ -632,3 +520,7 @@ return;

var _a, _b, _c, _d, _e;
var orderFormOptimizationEnabled = (_e = (_d = (_c = (_b = (_a = window) === null || _a === void 0 ? void 0 : _a.__RUNTIME__) === null || _b === void 0 ? void 0 : _b.settings) === null || _c === void 0 ? void 0 : _c['vtex.store']) === null || _d === void 0 ? void 0 : _d.enableOrderFormOptimization) !== null && _e !== void 0 ? _e : false;
const canUseDOM = !!(typeof window !== 'undefined' &&
window.document &&
window.document.createElement);
const orderFormOptimizationEnabled = (_e = (canUseDOM &&
((_d = (_c = (_b = (_a = window) === null || _a === void 0 ? void 0 : _a.__RUNTIME__) === null || _b === void 0 ? void 0 : _b.settings) === null || _c === void 0 ? void 0 : _c['vtex.store']) === null || _d === void 0 ? void 0 : _d.enableOrderFormOptimization))) !== null && _e !== void 0 ? _e : false;
/**

@@ -639,3 +531,3 @@ * Heuristic function to determine whether or not the local

*/
var shouldUpdateOrderForm = function (localOrderForm, remoteOrderForm) {
const shouldUpdateOrderForm = (localOrderForm, remoteOrderForm) => {
return (localOrderForm.value === UNSYNC_ORDER_FORM_VALUE ||

@@ -647,3 +539,3 @@ (orderFormOptimizationEnabled &&

var saveLocalOrderForm = function (orderForm) {
const saveLocalOrderForm = (orderForm) => {
localStorage.setItem('orderform', JSON.stringify(orderForm));

@@ -657,14 +549,22 @@ };

}
var noop = function () { };
function createOrderFormProvider$1(_a) {
var useOrderFormMessages = _a.useOrderFormMessages, useGetOrderForm = _a.useGetOrderForm, defaultOrderForm = _a.defaultOrderForm;
const noop = () => { };
function createOrderFormProvider$1({ useOrderFormMessages, useGetOrderForm, defaultOrderForm, }) {
function reducer(prevOrderForm, updateOrderForm) {
if (typeof updateOrderForm === 'function') {
return __assign(__assign({}, prevOrderForm), updateOrderForm(__assign(__assign({}, prevOrderForm), { value: prevOrderForm.value === UNSYNC_ORDER_FORM_VALUE
? 0
: prevOrderForm.value })));
return {
...prevOrderForm,
...updateOrderForm({
...prevOrderForm,
value: prevOrderForm.value === UNSYNC_ORDER_FORM_VALUE
? 0
: prevOrderForm.value,
}),
};
}
return __assign(__assign({}, prevOrderForm), updateOrderForm);
return {
...prevOrderForm,
...updateOrderForm,
};
}
var OrderFormContext = createContext({
const OrderFormContext = createContext({
orderForm: defaultOrderForm,

@@ -675,21 +575,20 @@ setOrderForm: noop,

});
var OrderFormProvider = function (_a) {
var _b;
var children = _a.children;
var _c = useGetOrderForm(), loading = _c.loading, data = _c.data, error = _c.error;
var shouldUseLocalOrderForm = typeof document !== 'undefined' && !navigator.onLine;
var _d = useReducer(reducer, (_b = (shouldUseLocalOrderForm
const OrderFormProvider = ({ children }) => {
var _a;
const { loading, data, error } = useGetOrderForm();
const shouldUseLocalOrderForm = typeof document !== 'undefined' && !navigator.onLine;
const [orderForm, setOrderForm] = useReducer(reducer, (_a = (shouldUseLocalOrderForm
? getLocalOrderForm()
: defaultOrderForm)) !== null && _b !== void 0 ? _b : defaultOrderForm), orderForm = _d[0], setOrderForm = _d[1];
: defaultOrderForm)) !== null && _a !== void 0 ? _a : defaultOrderForm);
// use a different variable to store the loading state because if some
// component uses the `loading` from the Apollo query they won't be perfectly
// synchronized with our `orderForm` state and could cause some anomalies.
var _e = useState(!shouldUseLocalOrderForm), orderFormLoading = _e[0], setOrderFormLoading = _e[1];
var listen = useOrderQueue().listen;
var queueStatusRef = useQueueStatus(listen);
useEffect(function () {
const [orderFormLoading, setOrderFormLoading] = useState(!shouldUseLocalOrderForm);
const { listen } = useOrderQueue();
const queueStatusRef = useQueueStatus(listen);
useEffect(() => {
if (loading || error || !data) {
return;
}
var localOrderForm = getLocalOrderForm();
const localOrderForm = getLocalOrderForm();
if (localOrderForm != null) {

@@ -705,3 +604,3 @@ if (!shouldUpdateOrderForm(localOrderForm, data.orderForm) ||

setOrderFormLoading(false);
setOrderForm(function (prevOrderForm) {
setOrderForm((prevOrderForm) => {
if (prevOrderForm.id !== defaultOrderForm.id) {

@@ -718,13 +617,20 @@ return prevOrderForm;

}, [data, error, loading, queueStatusRef]);
useEffect(function () {
useEffect(() => {
saveLocalOrderForm(orderForm);
}, [orderForm]);
useOrderFormMessages(orderForm, setOrderForm);
var value = useMemo(function () {
const value = useMemo(() => {
if (orderForm.id !== DEFAULT_ORDER_FORM_ID) {
return {
error: error,
orderForm: __assign(__assign({}, orderForm), { value: orderForm.value === UNSYNC_ORDER_FORM_VALUE ? 0 : orderForm.value, messages: __assign(__assign({}, orderForm.messages), { generalMessages: [] }) }),
error,
orderForm: {
...orderForm,
value: orderForm.value === UNSYNC_ORDER_FORM_VALUE ? 0 : orderForm.value,
messages: {
...orderForm.messages,
generalMessages: [],
},
},
initialFetchComplete: true,
setOrderForm: setOrderForm,
setOrderForm,
loading: orderFormLoading,

@@ -734,6 +640,13 @@ };

return {
error: error,
orderForm: __assign(__assign({}, orderForm), { value: orderForm.value === UNSYNC_ORDER_FORM_VALUE ? 0 : orderForm.value, messages: __assign(__assign({}, orderForm.messages), { generalMessages: [] }) }),
error,
orderForm: {
...orderForm,
value: orderForm.value === UNSYNC_ORDER_FORM_VALUE ? 0 : orderForm.value,
messages: {
...orderForm.messages,
generalMessages: [],
},
},
initialFetchComplete: false,
setOrderForm: setOrderForm,
setOrderForm,
loading: orderFormLoading,

@@ -745,3 +658,3 @@ };

function useOrderForm() {
var context = useContext(OrderFormContext);
const context = useContext(OrderFormContext);
if (context === undefined) {

@@ -752,15 +665,14 @@ throw new Error('useOrderForm must be used within a OrderFormProvider');

}
return { OrderFormProvider: OrderFormProvider, useOrderForm: useOrderForm };
return { OrderFormProvider, useOrderForm };
}
function createOrderFormProvider(_a) {
var useToast = _a.useToast, useClearOrderFormMessages = _a.useClearOrderFormMessages, useGetOrderForm = _a.useGetOrderForm, defaultOrderForm = _a.defaultOrderForm;
var useOrderFormMessages = createUseMessages({
useToast: useToast,
useClearOrderFormMessages: useClearOrderFormMessages,
function createOrderFormProvider({ useToast, useClearOrderFormMessages, useGetOrderForm, defaultOrderForm, }) {
const useOrderFormMessages = createUseMessages({
useToast,
useClearOrderFormMessages,
});
return createOrderFormProvider$1({
useOrderFormMessages: useOrderFormMessages,
useGetOrderForm: useGetOrderForm,
defaultOrderForm: defaultOrderForm,
useOrderFormMessages,
useGetOrderForm,
defaultOrderForm,
});

@@ -767,0 +679,0 @@ }

/*!
* @vtex/order-manager v0.0.3-16
* @vtex/order-manager v0.0.3-17
* (c) VTEX

@@ -17,66 +17,2 @@ * Released under the MIT License.

/*! *****************************************************************************
Copyright (c) Microsoft Corporation.
Permission to use, copy, modify, and/or distribute this software for any
purpose with or without fee is hereby granted.
THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
PERFORMANCE OF THIS SOFTWARE.
***************************************************************************** */
var __assign = function() {
__assign = Object.assign || function __assign(t) {
for (var s, i = 1, n = arguments.length; i < n; i++) {
s = arguments[i];
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];
}
return t;
};
return __assign.apply(this, arguments);
};
function __awaiter(thisArg, _arguments, P, generator) {
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
return new (P || (P = Promise))(function (resolve, reject) {
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
step((generator = generator.apply(thisArg, _arguments || [])).next());
});
}
function __generator(thisArg, body) {
var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
function verb(n) { return function (v) { return step([n, v]); }; }
function step(op) {
if (f) throw new TypeError("Generator is already executing.");
while (_) try {
if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
if (y = 0, t) op = [op[0] & 2, t.value];
switch (op[0]) {
case 0: case 1: t = op; break;
case 4: _.label++; return { value: op[1], done: false };
case 5: _.label++; y = op[1]; op = [0]; continue;
case 7: op = _.ops.pop(); _.trys.pop(); continue;
default:
if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
if (t[2]) _.ops.pop();
_.trys.pop(); continue;
}
op = body.call(thisArg, _);
} catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
}
}
// Adapted from https://github.com/BalassaMarton/sequential-task-queue/blob/master/src/sequential-task-queue.ts

@@ -88,3 +24,3 @@ /**

*/
var cancellationTokenReasons = {
const cancellationTokenReasons = {
/** Used when the task was cancelled in response to a call to {@link SequentialTaskQueue.cancel} */

@@ -98,3 +34,3 @@ cancel: Object.create(null),

*/
var sequentialTaskQueueEvents = {
const sequentialTaskQueueEvents = {
drained: 'drained',

@@ -111,3 +47,3 @@ error: 'error',

*/
var SequentialTaskQueue = /** @class */ (function () {
class SequentialTaskQueue {
/**

@@ -117,3 +53,3 @@ * Creates a new instance of {@link SequentialTaskQueue}

*/
function SequentialTaskQueue(options) {
constructor(options) {
var _a, _b;

@@ -129,10 +65,6 @@ this.queue = [];

}
Object.defineProperty(SequentialTaskQueue.prototype, "isClosed", {
/** Indicates if the queue has been closed. Calling {@link SequentialTaskQueue.push} on a closed queue will result in an exception. */
get: function () {
return this._isClosed;
},
enumerable: false,
configurable: true
});
/** Indicates if the queue has been closed. Calling {@link SequentialTaskQueue.push} on a closed queue will result in an exception. */
get isClosed() {
return this._isClosed;
}
/**

@@ -144,8 +76,7 @@ * Adds a new task to the queue.

*/
SequentialTaskQueue.prototype.push = function (task, options) {
var _this = this;
push(task, options) {
if (this._isClosed) {
throw new Error(this.name + " has been previously closed");
throw new Error(`${this.name} has been previously closed`);
}
var taskEntry = {
const taskEntry = {
callback: task,

@@ -159,3 +90,3 @@ args: (options === null || options === void 0 ? void 0 : options.args)

cancellationToken: {
cancel: function (reason) { return _this.cancelTask(taskEntry, reason); },
cancel: (reason) => this.cancelTask(taskEntry, reason),
},

@@ -167,12 +98,10 @@ resolve: undefined,

this.queue.push(taskEntry);
this.scheduler.schedule(function () { return _this.next(); });
var result = new Promise(function (resolve, reject) {
this.scheduler.schedule(() => this.next());
const result = new Promise((resolve, reject) => {
taskEntry.resolve = resolve;
taskEntry.reject = reject;
});
result.cancel = function (reason) {
return taskEntry.cancellationToken.cancel(reason);
};
result.cancel = (reason) => taskEntry.cancellationToken.cancel(reason);
return result;
};
}
/**

@@ -182,18 +111,15 @@ * Cancels the currently running task (if any), and clears the queue.

*/
SequentialTaskQueue.prototype.cancel = function () {
var _this = this;
cancel() {
if (this.currentTask) {
this.cancelTask(this.currentTask, cancellationTokenReasons.cancel);
}
var queue = this.queue.splice(0);
const queue = this.queue.splice(0);
// Cancel all and emit a drained event if there were tasks waiting in the queue
if (queue.length) {
queue.forEach(function (task) {
return _this.cancelTask(task, cancellationTokenReasons.cancel);
});
queue.forEach((task) => this.cancelTask(task, cancellationTokenReasons.cancel));
this.emit(sequentialTaskQueueEvents.drained);
}
return this.wait();
};
SequentialTaskQueue.prototype.indexOf = function (task) {
}
indexOf(task) {
var _a;

@@ -203,6 +129,6 @@ if (((_a = this.currentTask) === null || _a === void 0 ? void 0 : _a.callback) === task) {

}
var queueIndex = this.queue
const queueIndex = this.queue
// Skip cancelled tasks
.filter(function (taskEntry) { var _a; return !((_a = taskEntry.cancellationToken) === null || _a === void 0 ? void 0 : _a.cancelled); })
.findIndex(function (taskEntry) { return taskEntry.callback === task; });
.filter((taskEntry) => { var _a; return !((_a = taskEntry.cancellationToken) === null || _a === void 0 ? void 0 : _a.cancelled); })
.findIndex((taskEntry) => taskEntry.callback === task);
if (queueIndex < 0) {

@@ -216,3 +142,3 @@ // Task not found, return -1

return queueIndex + (this.currentTask !== undefined ? 1 : 0);
};
}
/**

@@ -224,3 +150,3 @@ * Closes the queue, preventing new tasks to be added.

*/
SequentialTaskQueue.prototype.close = function (cancel) {
close(cancel) {
if (!this._isClosed) {

@@ -232,3 +158,3 @@ this._isClosed = true;

return this.wait();
};
}
/**

@@ -238,14 +164,9 @@ * Returns a promise that is fulfilled when the queue is empty.

*/
SequentialTaskQueue.prototype.wait = function () {
return __awaiter(this, void 0, void 0, function () {
var _this = this;
return __generator(this, function (_a) {
if (!this.currentTask && this.queue.length === 0)
return [2 /*return*/, Promise.resolve()];
return [2 /*return*/, new Promise(function (resolve) {
_this.waiters.push(resolve);
})];
});
async wait() {
if (!this.currentTask && this.queue.length === 0)
return Promise.resolve();
return new Promise((resolve) => {
this.waiters.push(resolve);
});
};
}
/**

@@ -256,7 +177,7 @@ * Adds an event handler for a named event.

*/
SequentialTaskQueue.prototype.on = function (evt, handler) {
on(evt, handler) {
var _a;
this.events = (_a = this.events) !== null && _a !== void 0 ? _a : {};
(this.events[evt] || (this.events[evt] = [])).push(handler);
};
}
/**

@@ -267,14 +188,9 @@ * Adds a single-shot event handler for a named event.

*/
SequentialTaskQueue.prototype.once = function (evt, handler) {
var _this = this;
var cb = function () {
var args = [];
for (var _i = 0; _i < arguments.length; _i++) {
args[_i] = arguments[_i];
}
_this.removeListener(evt, cb);
handler.apply(_this, args);
once(evt, handler) {
const cb = (...args) => {
this.removeListener(evt, cb);
handler.apply(this, args);
};
this.on(evt, cb);
};
}
/**

@@ -285,7 +201,7 @@ * Removes an event handler.

*/
SequentialTaskQueue.prototype.removeListener = function (evt, handler) {
removeListener(evt, handler) {
if (this.events) {
var list = this.events[evt];
const list = this.events[evt];
if (list) {
var i = 0;
let i = 0;
while (i < list.length) {

@@ -299,56 +215,50 @@ if (list[i] === handler)

}
};
}
/** @see {@link SequentialTaskQueue.removeListener} */
SequentialTaskQueue.prototype.off = function (evt, handler) {
off(evt, handler) {
return this.removeListener(evt, handler);
};
SequentialTaskQueue.prototype.emit = function (evt) {
var _this = this;
}
emit(evt, ...args) {
var _a;
var args = [];
for (var _i = 1; _i < arguments.length; _i++) {
args[_i - 1] = arguments[_i];
}
if ((_a = this.events) === null || _a === void 0 ? void 0 : _a[evt]) {
try {
this.events[evt].forEach(function (fn) { return fn.apply(_this, args); });
this.events[evt].forEach((fn) => fn.apply(this, args));
}
catch (e) {
console.error(this.name + ": Exception in '" + evt + "' event handler", e);
console.error(`${this.name}: Exception in '${evt}' event handler`, e);
}
}
};
SequentialTaskQueue.prototype.next = function () {
var _this = this;
}
next() {
// Try running the next task, if not currently running one
if (!this.currentTask) {
var task_1 = this.queue.shift();
let task = this.queue.shift();
// skip cancelled tasks
while (task_1 === null || task_1 === void 0 ? void 0 : task_1.cancellationToken.cancelled)
task_1 = this.queue.shift();
if (task_1) {
while (task === null || task === void 0 ? void 0 : task.cancellationToken.cancelled)
task = this.queue.shift();
if (task) {
try {
this.currentTask = task_1;
if (task_1.timeout) {
task_1.timeoutHandle = setTimeout(function () {
_this.emit(sequentialTaskQueueEvents.timeout);
_this.cancelTask(task_1, cancellationTokenReasons.timeout);
}, task_1.timeout);
this.currentTask = task;
if (task.timeout) {
task.timeoutHandle = setTimeout(() => {
this.emit(sequentialTaskQueueEvents.timeout);
this.cancelTask(task, cancellationTokenReasons.timeout);
}, task.timeout);
}
var res = task_1.callback.apply(undefined, task_1.args);
const res = task.callback.apply(undefined, task.args);
if (res && isPromise(res)) {
res.then(function (result) {
task_1.result = result;
_this.doneTask(task_1);
}, function (err) {
_this.doneTask(task_1, err);
res.then((result) => {
task.result = result;
this.doneTask(task);
}, (err) => {
this.doneTask(task, err);
});
}
else {
task_1.result = res;
this.doneTask(task_1);
task.result = res;
this.doneTask(task);
}
}
catch (e) {
this.doneTask(task_1, e);
this.doneTask(task, e);
}

@@ -361,10 +271,9 @@ }

}
};
SequentialTaskQueue.prototype.cancelTask = function (task, reason) {
}
cancelTask(task, reason) {
task.cancellationToken.cancelled = true;
task.cancellationToken.reason = reason;
this.doneTask(task);
};
SequentialTaskQueue.prototype.doneTask = function (task, error) {
var _this = this;
}
doneTask(task, error) {
if (task.timeoutHandle)

@@ -390,27 +299,26 @@ clearTimeout(task.timeoutHandle);

else {
this.scheduler.schedule(function () { return _this.next(); });
this.scheduler.schedule(() => this.next());
}
}
};
SequentialTaskQueue.prototype.callWaiters = function () {
var waiters = this.waiters.splice(0);
waiters.forEach(function (waiter) { return waiter(); });
};
SequentialTaskQueue.defaultScheduler = {
schedule: function (callback) { return setTimeout(function () { return callback(); }, 0); },
};
return SequentialTaskQueue;
}());
}
callWaiters() {
const waiters = this.waiters.splice(0);
waiters.forEach((waiter) => waiter());
}
}
SequentialTaskQueue.defaultScheduler = {
schedule: (callback) => setTimeout(() => callback(), 0),
};
SequentialTaskQueue.defaultScheduler = {
schedule: typeof setImmediate === 'function'
? function (callback) { return setImmediate(function () { return callback(); }); }
: function (callback) { return setTimeout(function () { return callback(); }, 0); },
? (callback) => setImmediate(() => callback())
: (callback) => setTimeout(() => callback(), 0),
};
var TASK_CANCELLED_CODE = 'TASK_CANCELLED';
const TASK_CANCELLED_CODE = 'TASK_CANCELLED';
// keep default value as -1 to indicate this order form
// is the initial value (not yet synchonized with server).
var UNSYNC_ORDER_FORM_VALUE = -1;
var DEFAULT_ORDER_FORM_ID = 'default-order-form';
var DEFAULT_ORDER_FORM = {
const UNSYNC_ORDER_FORM_VALUE = -1;
const DEFAULT_ORDER_FORM_ID = 'default-order-form';
const DEFAULT_ORDER_FORM = {
id: DEFAULT_ORDER_FORM_ID,

@@ -441,5 +349,4 @@ items: [],

var TaskQueue = /** @class */ (function () {
function TaskQueue() {
var _this = this;
class TaskQueue {
constructor() {
this.queue = new SequentialTaskQueue();

@@ -449,12 +356,11 @@ this.taskIdMap = {};

this.isEmpty = true;
this.queue.on('drained', function () {
_this.isEmpty = true;
_this.emit('Fulfilled');
this.queue.on('drained', () => {
this.isEmpty = true;
this.emit('Fulfilled');
});
}
TaskQueue.prototype.isWaiting = function (id) {
isWaiting(id) {
return !!this.taskIdMap[id];
};
TaskQueue.prototype.enqueue = function (task, id) {
var _this = this;
}
enqueue(task, id) {
if (this.isEmpty) {

@@ -467,33 +373,22 @@ this.isEmpty = false;

}
var wrappedTask = function () {
if (id && _this.taskIdMap[id]) {
delete _this.taskIdMap[id];
const wrappedTask = () => {
if (id && this.taskIdMap[id]) {
delete this.taskIdMap[id];
}
return new Promise(function (resolve, reject) {
var handleOnline = function () { return __awaiter(_this, void 0, void 0, function () {
var result, err_1;
return __generator(this, function (_a) {
switch (_a.label) {
case 0:
_a.trys.push([0, 2, , 3]);
return [4 /*yield*/, task()];
case 1:
result = _a.sent();
resolve(result);
return [3 /*break*/, 3];
case 2:
err_1 = _a.sent();
// we might have gone offline when this request was in-flight
// so we need to wait to be online again and replay this request
if (!navigator.onLine) {
return [2 /*return*/];
}
reject(err_1);
return [3 /*break*/, 3];
case 3:
window.removeEventListener('online', handleOnline);
return [2 /*return*/];
return new Promise((resolve, reject) => {
const handleOnline = async () => {
try {
const result = await task();
resolve(result);
}
catch (err) {
// we might have gone offline when this request was in-flight
// so we need to wait to be online again and replay this request
if (!navigator.onLine) {
return;
}
});
}); };
reject(err);
}
window.removeEventListener('online', handleOnline);
};
window.addEventListener('online', handleOnline);

@@ -505,20 +400,17 @@ if (navigator.onLine) {

};
var promise = this.queue.push(wrappedTask);
var cancelPromise = promise.cancel;
promise.cancel = function () {
return cancelPromise({
code: TASK_CANCELLED_CODE,
index: _this.queue.indexOf(wrappedTask),
});
};
const promise = this.queue.push(wrappedTask);
const cancelPromise = promise.cancel;
promise.cancel = () => cancelPromise({
code: TASK_CANCELLED_CODE,
index: this.queue.indexOf(wrappedTask),
});
if (id) {
this.taskIdMap[id] = {
task: task,
promise: promise,
task,
promise,
};
}
return promise;
};
TaskQueue.prototype.listen = function (event, cb) {
var _this = this;
}
listen(event, cb) {
if (!this.listeners[event]) {

@@ -528,27 +420,26 @@ this.listeners[event] = [];

this.listeners[event].push(cb);
var unlisten = function () {
var index = _this.listeners[event].indexOf(cb);
const unlisten = () => {
const index = this.listeners[event].indexOf(cb);
if (index !== -1) {
_this.listeners[event].splice(index, 1);
this.listeners[event].splice(index, 1);
}
};
return unlisten;
};
TaskQueue.prototype.emit = function (event) {
}
emit(event) {
if (this.listeners[event]) {
this.listeners[event].forEach(function (cb) { return cb(); });
this.listeners[event].forEach((cb) => cb());
}
};
return TaskQueue;
}());
}
}
var OrderQueueContext = React.createContext(undefined);
var useQueueStatus = function (listen) {
var queueStatus = React.useRef('Fulfilled');
React.useLayoutEffect(function () {
var unlisten = listen('Pending', function () { return (queueStatus.current = 'Pending'); });
const OrderQueueContext = React.createContext(undefined);
const useQueueStatus = (listen) => {
const queueStatus = React.useRef('Fulfilled');
React.useLayoutEffect(() => {
const unlisten = listen('Pending', () => (queueStatus.current = 'Pending'));
return unlisten;
}, [listen]);
React.useLayoutEffect(function () {
var unlisten = listen('Fulfilled', function () { return (queueStatus.current = 'Fulfilled'); });
React.useLayoutEffect(() => {
const unlisten = listen('Fulfilled', () => (queueStatus.current = 'Fulfilled'));
return unlisten;

@@ -558,14 +449,13 @@ }, [listen]);

};
var OrderQueueProvider = function (_a) {
var children = _a.children;
var queue = React.useState(function () { return new TaskQueue(); })[0];
var value = React.useMemo(function () { return ({
const OrderQueueProvider = ({ children, }) => {
const [queue] = React.useState(() => new TaskQueue());
const value = React.useMemo(() => ({
enqueue: queue.enqueue.bind(queue),
listen: queue.listen.bind(queue),
isWaiting: queue.isWaiting.bind(queue),
}); }, [queue]);
}), [queue]);
return (React__default['default'].createElement(OrderQueueContext.Provider, { value: value }, children));
};
var useOrderQueue = function () {
var context = React.useContext(OrderQueueContext);
const useOrderQueue = () => {
const context = React.useContext(OrderQueueContext);
if (context === undefined) {

@@ -577,11 +467,10 @@ throw new Error('useOrderQueue must be used within a OrderQueueProvider');

var createUseMessages = function (_a) {
var useClearOrderFormMessages = _a.useClearOrderFormMessages, useToast = _a.useToast;
var useOrderFormMessages = function (orderForm, setOrderForm) {
var _a = React.useState([]), messages = _a[0], setMessages = _a[1];
var _b = useToast(), showToast = _b.showToast, toastState = _b.toastState;
var _c = useOrderQueue(), enqueue = _c.enqueue, listen = _c.listen;
var queueStatusRef = useQueueStatus(listen);
var clearOrderFormMessages = useClearOrderFormMessages();
React.useEffect(function () {
const createUseMessages = ({ useClearOrderFormMessages, useToast, }) => {
const useOrderFormMessages = (orderForm, setOrderForm) => {
const [messages, setMessages] = React.useState([]);
const { showToast, toastState } = useToast();
const { enqueue, listen } = useOrderQueue();
const queueStatusRef = useQueueStatus(listen);
const clearOrderFormMessages = useClearOrderFormMessages();
React.useEffect(() => {
if (toastState.isToastVisible || !messages.length) {

@@ -591,5 +480,5 @@ return;

showToast(messages[0].text);
setMessages(function (queue) { return queue.slice(1); });
setMessages((queue) => queue.slice(1));
}, [showToast, toastState.isToastVisible, messages]);
React.useEffect(function () {
React.useEffect(() => {
var _a, _b;

@@ -599,24 +488,23 @@ if (!((_b = (_a = orderForm.messages) === null || _a === void 0 ? void 0 : _a.generalMessages) === null || _b === void 0 ? void 0 : _b.length)) {

}
setMessages(function (prevMessages) { var _a, _b; return prevMessages.concat((_b = (_a = orderForm.messages) === null || _a === void 0 ? void 0 : _a.generalMessages) !== null && _b !== void 0 ? _b : []); });
setOrderForm(function (prevOrderForm) {
return __assign(__assign({}, prevOrderForm), { messages: __assign(__assign({}, prevOrderForm.messages), { generalMessages: [] }) });
setMessages((prevMessages) => { var _a, _b; return prevMessages.concat((_b = (_a = orderForm.messages) === null || _a === void 0 ? void 0 : _a.generalMessages) !== null && _b !== void 0 ? _b : []); });
setOrderForm((prevOrderForm) => {
return {
...prevOrderForm,
messages: {
...prevOrderForm.messages,
generalMessages: [],
},
};
});
var enqueuePromise = enqueue(function () { return __awaiter(void 0, void 0, void 0, function () {
var data;
return __generator(this, function (_a) {
switch (_a.label) {
case 0: return [4 /*yield*/, clearOrderFormMessages({
orderFormId: orderForm.id,
})];
case 1:
data = (_a.sent()).data;
return [2 /*return*/, data.clearOrderFormMessages];
}
const enqueuePromise = enqueue(async () => {
const { data } = await clearOrderFormMessages({
orderFormId: orderForm.id,
});
}); });
enqueuePromise.then(function (updatedOrderForm) {
return data.clearOrderFormMessages;
});
enqueuePromise.then((updatedOrderForm) => {
if (queueStatusRef.current === 'Fulfilled') {
setOrderForm(updatedOrderForm);
}
}, function (err) {
}, (err) => {
if (err.code === TASK_CANCELLED_CODE) {

@@ -640,3 +528,7 @@ return;

var _a, _b, _c, _d, _e;
var orderFormOptimizationEnabled = (_e = (_d = (_c = (_b = (_a = window) === null || _a === void 0 ? void 0 : _a.__RUNTIME__) === null || _b === void 0 ? void 0 : _b.settings) === null || _c === void 0 ? void 0 : _c['vtex.store']) === null || _d === void 0 ? void 0 : _d.enableOrderFormOptimization) !== null && _e !== void 0 ? _e : false;
const canUseDOM = !!(typeof window !== 'undefined' &&
window.document &&
window.document.createElement);
const orderFormOptimizationEnabled = (_e = (canUseDOM &&
((_d = (_c = (_b = (_a = window) === null || _a === void 0 ? void 0 : _a.__RUNTIME__) === null || _b === void 0 ? void 0 : _b.settings) === null || _c === void 0 ? void 0 : _c['vtex.store']) === null || _d === void 0 ? void 0 : _d.enableOrderFormOptimization))) !== null && _e !== void 0 ? _e : false;
/**

@@ -647,3 +539,3 @@ * Heuristic function to determine whether or not the local

*/
var shouldUpdateOrderForm = function (localOrderForm, remoteOrderForm) {
const shouldUpdateOrderForm = (localOrderForm, remoteOrderForm) => {
return (localOrderForm.value === UNSYNC_ORDER_FORM_VALUE ||

@@ -655,3 +547,3 @@ (orderFormOptimizationEnabled &&

var saveLocalOrderForm = function (orderForm) {
const saveLocalOrderForm = (orderForm) => {
localStorage.setItem('orderform', JSON.stringify(orderForm));

@@ -665,14 +557,22 @@ };

}
var noop = function () { };
function createOrderFormProvider$1(_a) {
var useOrderFormMessages = _a.useOrderFormMessages, useGetOrderForm = _a.useGetOrderForm, defaultOrderForm = _a.defaultOrderForm;
const noop = () => { };
function createOrderFormProvider$1({ useOrderFormMessages, useGetOrderForm, defaultOrderForm, }) {
function reducer(prevOrderForm, updateOrderForm) {
if (typeof updateOrderForm === 'function') {
return __assign(__assign({}, prevOrderForm), updateOrderForm(__assign(__assign({}, prevOrderForm), { value: prevOrderForm.value === UNSYNC_ORDER_FORM_VALUE
? 0
: prevOrderForm.value })));
return {
...prevOrderForm,
...updateOrderForm({
...prevOrderForm,
value: prevOrderForm.value === UNSYNC_ORDER_FORM_VALUE
? 0
: prevOrderForm.value,
}),
};
}
return __assign(__assign({}, prevOrderForm), updateOrderForm);
return {
...prevOrderForm,
...updateOrderForm,
};
}
var OrderFormContext = React.createContext({
const OrderFormContext = React.createContext({
orderForm: defaultOrderForm,

@@ -683,21 +583,20 @@ setOrderForm: noop,

});
var OrderFormProvider = function (_a) {
var _b;
var children = _a.children;
var _c = useGetOrderForm(), loading = _c.loading, data = _c.data, error = _c.error;
var shouldUseLocalOrderForm = typeof document !== 'undefined' && !navigator.onLine;
var _d = React.useReducer(reducer, (_b = (shouldUseLocalOrderForm
const OrderFormProvider = ({ children }) => {
var _a;
const { loading, data, error } = useGetOrderForm();
const shouldUseLocalOrderForm = typeof document !== 'undefined' && !navigator.onLine;
const [orderForm, setOrderForm] = React.useReducer(reducer, (_a = (shouldUseLocalOrderForm
? getLocalOrderForm()
: defaultOrderForm)) !== null && _b !== void 0 ? _b : defaultOrderForm), orderForm = _d[0], setOrderForm = _d[1];
: defaultOrderForm)) !== null && _a !== void 0 ? _a : defaultOrderForm);
// use a different variable to store the loading state because if some
// component uses the `loading` from the Apollo query they won't be perfectly
// synchronized with our `orderForm` state and could cause some anomalies.
var _e = React.useState(!shouldUseLocalOrderForm), orderFormLoading = _e[0], setOrderFormLoading = _e[1];
var listen = useOrderQueue().listen;
var queueStatusRef = useQueueStatus(listen);
React.useEffect(function () {
const [orderFormLoading, setOrderFormLoading] = React.useState(!shouldUseLocalOrderForm);
const { listen } = useOrderQueue();
const queueStatusRef = useQueueStatus(listen);
React.useEffect(() => {
if (loading || error || !data) {
return;
}
var localOrderForm = getLocalOrderForm();
const localOrderForm = getLocalOrderForm();
if (localOrderForm != null) {

@@ -713,3 +612,3 @@ if (!shouldUpdateOrderForm(localOrderForm, data.orderForm) ||

setOrderFormLoading(false);
setOrderForm(function (prevOrderForm) {
setOrderForm((prevOrderForm) => {
if (prevOrderForm.id !== defaultOrderForm.id) {

@@ -726,13 +625,20 @@ return prevOrderForm;

}, [data, error, loading, queueStatusRef]);
React.useEffect(function () {
React.useEffect(() => {
saveLocalOrderForm(orderForm);
}, [orderForm]);
useOrderFormMessages(orderForm, setOrderForm);
var value = React.useMemo(function () {
const value = React.useMemo(() => {
if (orderForm.id !== DEFAULT_ORDER_FORM_ID) {
return {
error: error,
orderForm: __assign(__assign({}, orderForm), { value: orderForm.value === UNSYNC_ORDER_FORM_VALUE ? 0 : orderForm.value, messages: __assign(__assign({}, orderForm.messages), { generalMessages: [] }) }),
error,
orderForm: {
...orderForm,
value: orderForm.value === UNSYNC_ORDER_FORM_VALUE ? 0 : orderForm.value,
messages: {
...orderForm.messages,
generalMessages: [],
},
},
initialFetchComplete: true,
setOrderForm: setOrderForm,
setOrderForm,
loading: orderFormLoading,

@@ -742,6 +648,13 @@ };

return {
error: error,
orderForm: __assign(__assign({}, orderForm), { value: orderForm.value === UNSYNC_ORDER_FORM_VALUE ? 0 : orderForm.value, messages: __assign(__assign({}, orderForm.messages), { generalMessages: [] }) }),
error,
orderForm: {
...orderForm,
value: orderForm.value === UNSYNC_ORDER_FORM_VALUE ? 0 : orderForm.value,
messages: {
...orderForm.messages,
generalMessages: [],
},
},
initialFetchComplete: false,
setOrderForm: setOrderForm,
setOrderForm,
loading: orderFormLoading,

@@ -753,3 +666,3 @@ };

function useOrderForm() {
var context = React.useContext(OrderFormContext);
const context = React.useContext(OrderFormContext);
if (context === undefined) {

@@ -760,15 +673,14 @@ throw new Error('useOrderForm must be used within a OrderFormProvider');

}
return { OrderFormProvider: OrderFormProvider, useOrderForm: useOrderForm };
return { OrderFormProvider, useOrderForm };
}
function createOrderFormProvider(_a) {
var useToast = _a.useToast, useClearOrderFormMessages = _a.useClearOrderFormMessages, useGetOrderForm = _a.useGetOrderForm, defaultOrderForm = _a.defaultOrderForm;
var useOrderFormMessages = createUseMessages({
useToast: useToast,
useClearOrderFormMessages: useClearOrderFormMessages,
function createOrderFormProvider({ useToast, useClearOrderFormMessages, useGetOrderForm, defaultOrderForm, }) {
const useOrderFormMessages = createUseMessages({
useToast,
useClearOrderFormMessages,
});
return createOrderFormProvider$1({
useOrderFormMessages: useOrderFormMessages,
useGetOrderForm: useGetOrderForm,
defaultOrderForm: defaultOrderForm,
useOrderFormMessages,
useGetOrderForm,
defaultOrderForm,
});

@@ -775,0 +687,0 @@ }

{
"name": "@vtex/order-manager",
"version": "0.0.3-16",
"version": "0.0.3-17",
"description": "",

@@ -5,0 +5,0 @@ "cdn": "dist/index.umd.js",

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

SocketSocket SOC 2 Logo

Product

  • Package Alerts
  • Integrations
  • Docs
  • Pricing
  • FAQ
  • Roadmap
  • Changelog

Packages

npm

Stay in touch

Get open source security insights delivered straight into your inbox.


  • Terms
  • Privacy
  • Security

Made with ⚡️ by Socket Inc