mirror of
https://github.com/DSpace/dspace-angular.git
synced 2025-10-07 10:04:11 +00:00
93 lines
2.6 KiB
TypeScript
93 lines
2.6 KiB
TypeScript
import { hasNoValue, hasValue } from '../../shared/empty.util';
|
|
import {
|
|
AddToSSBAction,
|
|
EmptySSBAction,
|
|
ServerSyncBufferAction,
|
|
ServerSyncBufferActionTypes
|
|
} from './server-sync-buffer.actions';
|
|
import { RestRequestMethod } from '../data/rest-request-method';
|
|
|
|
/**
|
|
* An entry in the ServerSyncBufferState
|
|
* href: unique href of an ObjectCacheEntry
|
|
* method: RestRequestMethod type
|
|
*/
|
|
export class ServerSyncBufferEntry {
|
|
href: string;
|
|
method: RestRequestMethod;
|
|
}
|
|
|
|
/**
|
|
* The ServerSyncBuffer State
|
|
*
|
|
* Consists list of ServerSyncBufferState
|
|
*/
|
|
export interface ServerSyncBufferState {
|
|
buffer: ServerSyncBufferEntry[];
|
|
}
|
|
|
|
// Object.create(null) ensures the object has no default js properties (e.g. `__proto__`)
|
|
const initialState: ServerSyncBufferState = { buffer: [] };
|
|
|
|
/**
|
|
* The ServerSyncBuffer Reducer
|
|
*
|
|
* @param state
|
|
* the current state
|
|
* @param action
|
|
* the action to perform on the state
|
|
* @return ServerSyncBufferState
|
|
* the new state
|
|
*/
|
|
export function serverSyncBufferReducer(state = initialState, action: ServerSyncBufferAction): ServerSyncBufferState {
|
|
switch (action.type) {
|
|
|
|
case ServerSyncBufferActionTypes.ADD: {
|
|
return addToServerSyncQueue(state, action as AddToSSBAction)
|
|
}
|
|
|
|
case ServerSyncBufferActionTypes.EMPTY: {
|
|
return emptyServerSyncQueue(state, action as EmptySSBAction);
|
|
}
|
|
default: {
|
|
return state;
|
|
}
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Add a new entry to the buffer with a specified method
|
|
*
|
|
* @param state
|
|
* the current state
|
|
* @param action
|
|
* an AddToSSBAction
|
|
* @return ServerSyncBufferState
|
|
* the new state, with a new entry added to the buffer
|
|
*/
|
|
function addToServerSyncQueue(state: ServerSyncBufferState, action: AddToSSBAction): ServerSyncBufferState {
|
|
const actionEntry = action.payload as ServerSyncBufferEntry;
|
|
if (hasNoValue(state.buffer.find((entry) => entry.href === actionEntry.href && entry.method === actionEntry.method))) {
|
|
return Object.assign({}, state, { buffer: state.buffer.concat(actionEntry) });
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Remove all ServerSyncBuffers entry from the buffer with a specified method
|
|
* If no method is specified, empty the whole buffer
|
|
*
|
|
* @param state
|
|
* the current state
|
|
* @param action
|
|
* an AddToSSBAction
|
|
* @return ServerSyncBufferState
|
|
* the new state, with a new entry added to the buffer
|
|
*/
|
|
function emptyServerSyncQueue(state: ServerSyncBufferState, action: EmptySSBAction): ServerSyncBufferState {
|
|
let newBuffer = [];
|
|
if (hasValue(action.payload)) {
|
|
newBuffer = state.buffer.filter((entry) => entry.method !== action.payload);
|
|
}
|
|
return Object.assign({}, state, { buffer: newBuffer });
|
|
}
|