import { useEffect, useState } from "react"; import { enqueueSnackbar } from "notistack"; import type { TagKeys, SelectedTags, QuestionKeys, SelectedQuestions, MinifiedData } from "./types"; import { AccountResponse, getIntegrationRules, getPipelines, getSteps, getTags, getUsers, getAccount, FieldsRule, } from "@/api/integration"; const SIZE = 75; interface Props { isModalOpen: boolean; isTryRemoveAccount: boolean; quizID: number; } export const useAmoIntegration = ({ isModalOpen, isTryRemoveAccount, quizID }: Props) => { const [isLoadingPage, setIsLoadingPage] = useState(true); const [firstRules, setFirstRules] = useState(false); const [accountInfo, setAccountInfo] = useState(null); const [arrayOfPipelines, setArrayOfPipelines] = useState([]); const [arrayOfPipelinesSteps, setArrayOfPipelinesSteps] = useState([]); const [arrayOfUsers, setArrayOfUsers] = useState([]); const [arrayOfTags, setArrayOfTags] = useState([]); const [selectedPipeline, setSelectedPipeline] = useState(null); const [selectedPipelineStep, setSelectedPipelineStep] = useState(null); const [selectedDealUser, setSelectedDealPerformer] = useState(null); const [questionsBackend, setQuestionsBackend] = useState({} as FieldsRule); const [selectedTags, setSelectedTags] = useState({ Lead: [], Contact: [], Company: [], Customer: [], }); const [selectedQuestions, setSelectedQuestions] = useState({ Lead: [], Company: [], Customer: [], }); const [pageOfPipelines, setPageOfPipelines] = useState(1); const [pageOfPipelinesSteps, setPageOfPipelinesSteps] = useState(1); const [pageOfUsers, setPageOfUsers] = useState(1); const [pageOfTags, setPageOfTags] = useState(1); useEffect(() => { if (isModalOpen && !isTryRemoveAccount) { const fetchAccountRules = async () => { setIsLoadingPage(true); const [account, accountError] = await getAccount(); if (accountError) { if (!accountError.includes("Not Found")) enqueueSnackbar(accountError); setAccountInfo(null); } if (account) { setAccountInfo(account); } const [settingsResponse, rulesError] = await getIntegrationRules(quizID.toString()); if (rulesError) { if (rulesError === "first") setFirstRules(true); if (!rulesError.includes("Not Found") && !rulesError.includes("first")) enqueueSnackbar(rulesError); } if (settingsResponse) { if (settingsResponse.PipelineID) setSelectedPipeline(settingsResponse.PipelineID.toString()); if (settingsResponse.StepID) setSelectedPipelineStep(settingsResponse.StepID.toString()); if (settingsResponse.PerformerID) setSelectedDealPerformer(settingsResponse.PerformerID.toString()); if (Boolean(settingsResponse.FieldsRule) && Object.keys(settingsResponse?.FieldsRule).length > 0) { const gottenQuestions = { ...selectedQuestions }; setQuestionsBackend(settingsResponse.FieldsRule); for (let key in settingsResponse.FieldsRule) { if ( settingsResponse.FieldsRule[key as QuestionKeys] !== null && Array.isArray(settingsResponse.FieldsRule[key as QuestionKeys]) ) { const gottenList = settingsResponse.FieldsRule[key as QuestionKeys]; if (gottenList !== null) gottenQuestions[key as QuestionKeys] = Object.keys(gottenList[0].QuestionID); } } setSelectedQuestions(gottenQuestions); } if (Boolean(settingsResponse.TagsToAdd) && Object.keys(settingsResponse.TagsToAdd).length > 0) { const gottenTags = { ...selectedTags }; for (let key in settingsResponse.TagsToAdd) { const gottenList = settingsResponse.TagsToAdd[key as TagKeys]; if (gottenList !== null && Array.isArray(gottenList)) { gottenTags[key as TagKeys] = gottenList.map((e) => e.toString()); } } setSelectedTags(gottenTags); } setFirstRules(false); } setIsLoadingPage(false); }; fetchAccountRules(); } else { //Вот по-хорошему компонент должен размонтироваться и стереть всё. Но это будет сделано позже setArrayOfPipelines([]); setArrayOfPipelinesSteps([]); setArrayOfUsers([]); setArrayOfTags([]); setSelectedPipeline(null); setSelectedPipelineStep(null); setSelectedDealPerformer(null); setQuestionsBackend({} as FieldsRule); setSelectedTags({ Lead: [], Contact: [], Company: [], Customer: [], }); setSelectedQuestions({ Lead: [], Company: [], Customer: [], }); setPageOfPipelines(1); setPageOfPipelinesSteps(1); setPageOfUsers(1); setPageOfTags(1); } }, [isModalOpen, isTryRemoveAccount]); useEffect(() => { getPipelines({ page: pageOfPipelines, size: SIZE, }).then(([response]) => { if (response && response.items !== null) { const minifiedPipelines: MinifiedData[] = []; response.items.forEach((step) => { minifiedPipelines.push({ id: step.AmoID.toString(), title: step.Name, }); }); setArrayOfPipelines((prevItems) => [...prevItems, ...minifiedPipelines]); setPageOfPipelinesSteps(1); } }); }, [pageOfPipelines]); useEffect(() => { const oldData = pageOfPipelinesSteps === 1 ? [] : arrayOfPipelinesSteps; if (selectedPipeline !== null) getSteps({ page: pageOfPipelinesSteps, size: SIZE, pipelineId: Number(selectedPipeline), }).then(([response]) => { if (response && response.items !== null) { const minifiedSteps: MinifiedData[] = []; response.items.forEach((step) => { minifiedSteps.push({ id: step.AmoID.toString(), title: step.Name, }); }); setArrayOfPipelinesSteps([...oldData, ...minifiedSteps]); } }); }, [selectedPipeline, pageOfPipelinesSteps]); useEffect(() => { getUsers({ page: pageOfUsers, size: SIZE, }).then(([response]) => { if (response && response.items !== null) { const minifiedUsers: MinifiedData[] = []; response.items.forEach((step) => { minifiedUsers.push({ id: step.amoUserID.toString(), title: step.name, }); }); setArrayOfUsers((prevItems) => [...prevItems, ...minifiedUsers]); } }); }, [pageOfUsers]); useEffect(() => { getTags({ page: pageOfTags, size: SIZE, }).then(([response]) => { if (response && response.items !== null) { const minifiedTags: MinifiedData[] = []; response.items.forEach((step) => { minifiedTags.push({ id: step.AmoID.toString(), title: step.Name, entity: step.Entity === "leads" ? "Lead" : step.Entity === "contacts" ? "Contact" : step.Entity === "companies" ? "Company" : "Customer", }); }); setArrayOfTags((prevItems) => [...prevItems, ...minifiedTags]); } }); }, [pageOfTags]); return { isLoadingPage, firstRules, accountInfo, arrayOfPipelines, arrayOfPipelinesSteps, arrayOfUsers, arrayOfTags, selectedPipeline, setSelectedPipeline, selectedPipelineStep, setSelectedPipelineStep, selectedDealUser, setSelectedDealPerformer, questionsBackend, selectedTags, setSelectedTags, selectedQuestions, setSelectedQuestions, setPageOfPipelines, setPageOfPipelinesSteps, setPageOfUsers, setPageOfTags, }; };