66 lines
1.2 KiB
TypeScript
66 lines
1.2 KiB
TypeScript
/**
|
|
* External dependencies
|
|
*/
|
|
import { uniqueId } from 'lodash';
|
|
|
|
/**
|
|
* Internal dependencies
|
|
*/
|
|
import {
|
|
ACTION,
|
|
ActionType,
|
|
ActionCallbackType,
|
|
EventObserversType,
|
|
} from './types';
|
|
|
|
export const actions = {
|
|
addEventCallback: (
|
|
eventType: string,
|
|
callback: ActionCallbackType,
|
|
priority = 10
|
|
): ActionType => {
|
|
return {
|
|
id: uniqueId(),
|
|
type: ACTION.ADD_EVENT_CALLBACK,
|
|
eventType,
|
|
callback,
|
|
priority,
|
|
};
|
|
},
|
|
removeEventCallback: ( eventType: string, id: string ): ActionType => {
|
|
return {
|
|
id,
|
|
type: ACTION.REMOVE_EVENT_CALLBACK,
|
|
eventType,
|
|
};
|
|
},
|
|
};
|
|
|
|
const initialState = {} as EventObserversType;
|
|
|
|
/**
|
|
* Handles actions for emitters
|
|
*/
|
|
export const reducer = (
|
|
state = initialState,
|
|
{ type, eventType, id, callback, priority }: ActionType
|
|
): typeof initialState => {
|
|
const newEvents = state.hasOwnProperty( eventType )
|
|
? new Map( state[ eventType ] )
|
|
: new Map();
|
|
switch ( type ) {
|
|
case ACTION.ADD_EVENT_CALLBACK:
|
|
newEvents.set( id, { priority, callback } );
|
|
return {
|
|
...state,
|
|
[ eventType ]: newEvents,
|
|
};
|
|
case ACTION.REMOVE_EVENT_CALLBACK:
|
|
newEvents.delete( id );
|
|
return {
|
|
...state,
|
|
[ eventType ]: newEvents,
|
|
};
|
|
}
|
|
};
|