UNPKG

@rpldy/uploader

Version:

the processing and queuing engine for react-uploady

71 lines (70 loc) 3.11 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.getItemsPrepareUpdater = void 0; var _shared = require("@rpldy/shared"); var _itemHelpers = require("./itemHelpers"); const mergeWithUndefined = (0, _shared.getMerge)({ undefinedOverwrites: true }); const processPrepareResponse = (eventType, items, options, updated) => { let usedOptions = options, usedItems = items; if (updated && typeof updated !== "boolean") { _shared.logger.debugLog(`uploader.queue: REQUEST_PRE_SEND(${eventType}) event returned updated items/options`, updated); if (updated.items) { if (updated.items.length !== items.length || !(0, _shared.isSamePropInArrays)(updated.items, items, ["id", "batchId", "recycled"])) { throw new Error(`REQUEST_PRE_SEND(${eventType}) event handlers must return same items with same ids`); } usedItems = updated.items; } if (updated.options) { usedOptions = mergeWithUndefined({}, options, updated.options); } } return { items: usedItems, options: usedOptions, cancelled: updated === false }; }; const triggerItemsPrepareEvent = (queue, eventSubject, items, options, eventType, validateResponse) => (0, _shared.triggerUpdater)(queue.trigger, eventType, eventSubject, options).then(updated => { validateResponse?.(updated); return processPrepareResponse(eventType, items, options, updated); }); const persistPrepareResponse = (queue, prepared) => { const batchId = prepared.items[0].batchId; if (prepared.items[0] && queue.getState().batches[batchId]) { queue.updateState(state => { prepared.items.forEach(i => { if (!(0, _itemHelpers.getIsItemFinalized)(state.items[i.id])) { state.items[i.id] = i; } }); const batchData = state.batches[batchId]; prepared.items.forEach(({ id }) => { batchData.itemBatchOptions[id] = prepared.options; }); }); const updatedState = queue.getState(); prepared.items = prepared.items.map(item => updatedState.items[item.id]); const batchData = updatedState.batches[batchId]; prepared.options = batchData.itemBatchOptions[prepared.items[0].id] || batchData.batchOptions; } }; const prepareItems = (queue, subject, retrieveItemsFromSubject, createEventSubject, validateResponse, eventType) => { const items = retrieveItemsFromSubject(subject); const batchOptions = queue.getState().batches[items[0].batchId].batchOptions; const eventSubject = createEventSubject?.(subject, batchOptions) || subject; return triggerItemsPrepareEvent(queue, eventSubject, items, batchOptions, eventType, validateResponse).then(prepared => { if (!prepared.cancelled) { persistPrepareResponse(queue, prepared); } return prepared; }); }; const getItemsPrepareUpdater = (eventType, retrieveItemsFromSubject, createEventSubject = null, validateResponse = null) => (queue, subject) => prepareItems(queue, subject, retrieveItemsFromSubject, createEventSubject, validateResponse, eventType); exports.getItemsPrepareUpdater = getItemsPrepareUpdater;