mirror of
https://github.com/Nezumi-2711/react-training.git
synced 2026-09-22 20:01:59 +00:00
Add user and rooms to global state
This commit is contained in:
@@ -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 };
|
||||
Reference in New Issue
Block a user