Files
Frontend/src/lib/callWidget/contexts/answers.jsx

87 lines
3.0 KiB
JavaScript

import { createContext, useEffect, useReducer, useState } from "react";
import { GET_CATEGORY } from "@/core/data/apiRoutes";
import useRequest from "@/lib/app/hooks/useRequest";
const reducer = (state, action) => {
switch (action.type) {
case "CHANGE_ACTIVE_TAB":
return state.map((answer, index) =>
action.newValue === index
? { ...answer, active: true }
: {
...answer,
active: false,
}
);
case "CHANGE_LIST":
return [...action.newList];
case "CHANGE_ACTIVE_ID":
return state.map((answer, index) =>
action.tab_id === answer.id
? {
...answer,
active_category_id: action.category_id,
}
: { ...answer }
);
default:
return state;
}
};
const submission = (handleCategories, operation) => {
switch (operation.type) {
case "SET_CATEGORIES":
return { ...handleCategories, categoryLists: operation.categoriesByAPI };
case "SET_SUBCATEGORIES":
return { ...handleCategories, subCategoryLists: operation.subCategoriesByAPI };
default:
return handleCategories;
}
};
export const AnswersContext = createContext();
export const AnswersProvider = ({ children }) => {
const requestServer = useRequest({ auth: true, notification: false });
const [openCallDialog, setOpenCallDialog] = useState(false);
const [activeTab, setActiveTab] = useState(0);
const [handleCategories, operation] = useReducer(submission, {
categoryLists: [],
subCategoryLists: [],
});
const [state, dispatch] = useReducer(reducer, []);
useEffect(() => {
requestServer(GET_CATEGORY, "get")
.then(({ data }) => {
const subCategoriesByAPI = data.data;
const categoriesByAPI = subCategoriesByAPI.reduce((accumulator, currentValue) => {
if (!accumulator.find((item) => item.category_id === currentValue.category_id)) {
accumulator.push(currentValue);
}
return accumulator;
}, []);
operation({ type: "SET_CATEGORIES", categoriesByAPI });
operation({ type: "SET_SUBCATEGORIES", subCategoriesByAPI });
})
.catch(() => {});
}, []);
return (
<AnswersContext.Provider
value={{
openCallDialog,
setOpenCallDialog,
state,
dispatch,
activeTab,
setActiveTab,
categoryLists: handleCategories.categoryLists,
subCategoryLists: handleCategories.subCategoryLists,
}}
>
{children}
</AnswersContext.Provider>
);
};