import { IDataState } from '@type/common'; import { Dispatch, createContext } from 'react'; interface IUserRoomState { usersAvailable: IDataState[]; roomsAvailable: IDataState[]; } type TAction = | 'initRoom' | 'initUser' | 'addRoom' | 'removeRoom' | 'addUser' | 'removeUser' | 'updateUserName' | 'updateRoomName'; interface IAction { type: TAction; payload: IDataState[]; } interface IUserRoomAvailableContext { roomsAvailable?: IDataState[]; usersAvailable?: IDataState[]; dispatch?: Dispatch; } const UserRoomAvailableContext = createContext({}); const initialState: IUserRoomState = { usersAvailable: [], roomsAvailable: [], }; const reducer = (state: IUserRoomState, action: IAction) => { switch (action.type) { case 'initRoom': return { ...state, roomsAvailable: action.payload, }; case 'initUser': return { ...state, usersAvailable: action.payload, }; case 'addUser': { const tempArr = state.usersAvailable; const itemExist = state.usersAvailable.find( (item) => item.id === action.payload[0].id ); if (!itemExist) { tempArr.push(action.payload[0]); } return { ...state, usersAvailable: tempArr, }; } case 'updateUserName': { const tempArr = state.usersAvailable; if (action.payload[0].name) { const indexItemUpdate = tempArr.findIndex( (item) => item.id === action.payload[0].id ); tempArr[indexItemUpdate].name = action.payload[0].name; } return { ...state, usersAvailable: tempArr, }; } case 'removeUser': return { ...state, usersAvailable: state.usersAvailable.filter( (item) => item.id !== action.payload[0].id ), }; case 'addRoom': { const tempArr = state.roomsAvailable; const itemExist = state.roomsAvailable.find( (item) => item.id === action.payload[0].id ); if (!itemExist) { tempArr.push(action.payload[0]); } return { ...state, roomsAvailable: tempArr, }; } case 'updateRoomName': { const tempArr = state.roomsAvailable; if (action.payload[0].name) { const indexItemUpdate = tempArr.findIndex( (item) => item.id === action.payload[0].id ); tempArr[indexItemUpdate].name = action.payload[0].name; } return { ...state, roomsAvailable: tempArr, }; } case 'removeRoom': return { ...state, roomsAvailable: state.roomsAvailable.filter( (item) => item.id !== action.payload[0].id ), }; default: throw new Error('Action unknown'); } }; export { UserRoomAvailableContext, reducer, initialState };