@wordpress/upload-media
Version:
Core media upload logic.
136 lines (135 loc) • 3.15 kB
JavaScript
/**
* Internal dependencies
*/
import { Type } from './types';
const noop = () => {};
const DEFAULT_STATE = {
queue: [],
queueStatus: 'active',
blobUrls: {},
settings: {
mediaUpload: noop
}
};
function reducer(state = DEFAULT_STATE, action = {
type: Type.Unknown
}) {
switch (action.type) {
case Type.PauseQueue:
{
return {
...state,
queueStatus: 'paused'
};
}
case Type.ResumeQueue:
{
return {
...state,
queueStatus: 'active'
};
}
case Type.Add:
return {
...state,
queue: [...state.queue, action.item]
};
case Type.Cancel:
return {
...state,
queue: state.queue.map(item => item.id === action.id ? {
...item,
error: action.error
} : item)
};
case Type.Remove:
return {
...state,
queue: state.queue.filter(item => item.id !== action.id)
};
case Type.OperationStart:
{
return {
...state,
queue: state.queue.map(item => item.id === action.id ? {
...item,
currentOperation: action.operation
} : item)
};
}
case Type.AddOperations:
return {
...state,
queue: state.queue.map(item => {
if (item.id !== action.id) {
return item;
}
return {
...item,
operations: [...(item.operations || []), ...action.operations]
};
})
};
case Type.OperationFinish:
return {
...state,
queue: state.queue.map(item => {
if (item.id !== action.id) {
return item;
}
const operations = item.operations ? item.operations.slice(1) : [];
// Prevent an empty object if there's no attachment data.
const attachment = item.attachment || action.item.attachment ? {
...item.attachment,
...action.item.attachment
} : undefined;
return {
...item,
currentOperation: undefined,
operations,
...action.item,
attachment,
additionalData: {
...item.additionalData,
...action.item.additionalData
}
};
})
};
case Type.CacheBlobUrl:
{
const blobUrls = state.blobUrls[action.id] || [];
return {
...state,
blobUrls: {
...state.blobUrls,
[action.id]: [...blobUrls, action.blobUrl]
}
};
}
case Type.RevokeBlobUrls:
{
const newBlobUrls = {
...state.blobUrls
};
delete newBlobUrls[action.id];
return {
...state,
blobUrls: newBlobUrls
};
}
case Type.UpdateSettings:
{
return {
...state,
settings: {
...state.settings,
...action.settings
}
};
}
}
return state;
}
export default reducer;
//# sourceMappingURL=reducer.js.map