@fto-consult/expo-ui
Version:
Bibliothèque de composants UI Expo,react-native
92 lines (84 loc) • 2.03 kB
JavaScript
/***
* MIT License
Copyright (c) 2020 Mo Gorhom
@see : https://github.com/gorhom/react-native-portal
*/
import { ACTIONS } from './constants';
const registerHost = (state,hostName) => {
if (!(hostName in state)) {
state[hostName] = [];
}
return state;
};
const deregisterHost = (
state,
hostName
) => {
delete state[hostName];
return state;
};
const addUpdatePortal = (
state,
hostName,
portalName,
node
) => {
if (!(hostName in state)) {
state = registerHost(state, hostName);
}
/**
* updated portal, if it was already added.
*/
const index = state[hostName].findIndex(item => item.name === portalName);
if (index !== -1) {
state[hostName][index].node = node;
} else {
state[hostName].push({
name: portalName,
node,
});
}
return state;
};
const removePortal = (
state,
hostName,
portalName
) => {
if (!(hostName in state)) {
console.warn({
component: reducer.name,
method: removePortal.name,
params: `Failed to remove portal '${portalName}', '${hostName}' was not registered!`,
});
return state;
}
const index = state[hostName].findIndex(item => item.name === portalName);
if (index !== -1) state[hostName].splice(index, 1);
return state;
};
export const reducer = (state,action) => {
const { type } = action;
let clonedState = { ...state };
switch (type) {
case ACTIONS.REGISTER_HOST:
return registerHost(clonedState, action.hostName);
case ACTIONS.DEREGISTER_HOST:
return deregisterHost(clonedState, action.hostName);
case ACTIONS.ADD_UPDATE_PORTAL:
return addUpdatePortal(
clonedState,
action.hostName,
(action).portalName,
(action).node
);
case ACTIONS.REMOVE_PORTAL:
return removePortal(
clonedState,
action.hostName,
(action).portalName
);
default:
return state;
}
};