Add user and rooms to global state

This commit is contained in:
2023-11-20 17:52:51 +07:00
parent 8377a7d5b0
commit 4aae26e994
15 changed files with 329 additions and 43 deletions
@@ -0,0 +1,130 @@
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<IAction>;
}
const UserRoomAvailableContext = createContext<IUserRoomAvailableContext>({});
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 };