import React, {
createContext,
useReducer,
} from 'react';
import ChatLogger from '/imports/ui/components/chat/chat-logger/ChatLogger';
export const ACTIONS = {
TEST: 'test',
ADDED: 'added',
CHANGED: 'changed',
REMOVED: 'removed',
ADDED_USER_PERSISTENT_DATA: 'added_user_persistent_data',
CHANGED_USER_PERSISTENT_DATA: 'changed_user_persistent_data',
};
export const UsersContext = createContext();
const reducer = (state, action) => {
switch (action.type) {
case ACTIONS.TEST: {
return {
...state,
...action.value,
};
}
case ACTIONS.ADDED:
case ACTIONS.CHANGED: {
ChatLogger.debug('UsersContextProvider::reducer::added', { ...action });
const { user } = action.value;
const newState = { ...state };
if (!newState[user.meetingId]) {
newState[user.meetingId] = {};
}
newState[user.meetingId][user.userId] = {
...user,
};
return newState;
}
case ACTIONS.REMOVED: {
ChatLogger.debug('UsersContextProvider::reducer::removed', { ...action });
const { user } = action.value;
if (state[user.meetingId][user.userId]) {
const newState = { ...state };
delete newState[user.meetingId][user.userId];
return newState;
}
return state;
}
// USER PERSISTENT DATA
case ACTIONS.ADDED_USER_PERSISTENT_DATA: {
const { user } = action.value;
if (state[user.meetingId] && state[user.meetingId][user.userId]) {
return state;
}
const newState = { ...state };
if (!newState[user.meetingId]) {
newState[user.meetingId] = {};
}
newState[user.meetingId][user.userId] = {
...user,
};
return newState;
}
case ACTIONS.CHANGED_USER_PERSISTENT_DATA: {
const { user } = action.value;
const stateUser = state[user.meetingId][user.userId];
if (stateUser) {
const newState = { ...state };
newState[user.meetingId][user.userId] = {
...stateUser,
...user,
};
return newState;
}
return state;
}
default: {
throw new Error(`Unexpected action: ${JSON.stringify(action)}`);
}
}
};
export const UsersContextProvider = (props) => {
const [usersContextState, usersContextDispatch] = useReducer(reducer, {});
ChatLogger.debug('UsersContextProvider::usersContextState', usersContextState);
return (
{props.children}
);
};
export const UsersContextConsumer = Component => props => (
{contexts => }
);
export const withUsersConsumer = Component => UsersContextConsumer(Component);
export default {
UsersContextConsumer,
UsersContextProvider,
};