mirror of
https://github.com/Nezumi-2711/react-training.git
synced 2026-09-22 13:38:51 +00:00
140 lines
2.9 KiB
TypeScript
140 lines
2.9 KiB
TypeScript
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 };
|