diff --git a/src/pages/IntegrationsPage/IntegrationsModal/Amo/useAmoIntegration.ts b/src/pages/IntegrationsPage/IntegrationsModal/Amo/useAmoIntegration.ts new file mode 100644 index 00000000..d4c0a477 --- /dev/null +++ b/src/pages/IntegrationsPage/IntegrationsModal/Amo/useAmoIntegration.ts @@ -0,0 +1,308 @@ +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, + getFields, +} from "@/api/integration"; +import { AnyTypedQuizQuestion } from "@frontend/squzanswerer"; + +const SIZE = 275; + +interface Props { + isModalOpen: boolean; + isTryRemoveAccount: boolean; + quizID: number; + questions: AnyTypedQuizQuestion[] +} + +const FCTranslate = { + "name": "имя", + "email": "почта", + "phone": "телефон", + "text": "номер", + "address": "адрес", +} +export const useAmoIntegration = ({ isModalOpen, isTryRemoveAccount, quizID, questions }: 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 [arrayOfFields, setArrayOfFields] = useState([]); + + const [selectedPipeline, setSelectedPipeline] = useState(null); + const [selectedPipelineStep, setSelectedPipelineStep] = useState(null); + const [selectedDealUser, setSelectedDealPerformer] = useState(null); + const [selectedCurrentFields, setSelectedCurrentFields] = useState([]); + + const [questionsBackend, setQuestionsBackend] = useState({} as FieldsRule); + const [selectedTags, setSelectedTags] = useState({ + Lead: [], + Contact: [], + Company: [], + Customer: [], + }); + const [selectedQuestions, setSelectedQuestions] = useState({ + Lead: [], + Company: [], + Customer: [], + Contact: [] + }); + + const [pageOfPipelines, setPageOfPipelines] = useState(1); + const [pageOfPipelinesSteps, setPageOfPipelinesSteps] = useState(1); + const [pageOfUsers, setPageOfUsers] = useState(1); + const [pageOfTags, setPageOfTags] = useState(1); + const [pageOfFields, setPageOfFields] = useState(1); + + useEffect(() => { + 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 + ) { + const gottenList = settingsResponse.FieldsRule[key as QuestionKeys]; + + if (gottenList !== null) { + Object.keys(gottenList.QuestionID).forEach((qId) => { + const q = questions.find(e=>e.backendId === Number(qId)) || {} + gottenQuestions[key as QuestionKeys].push({ + id: qId, + title: q.title, + entity: key, + + }) + }) + + } + + if (key === "Contact") { + const MAP = settingsResponse.FieldsRule[key as QuestionKeys].ContactRuleMap + + const list = [] + for (let key in MAP) { + list.push({ + id: key, + title: FCTranslate[key], + entity: "Contact", + amoId: MAP[key].toString(), + }) + } + setSelectedCurrentFields(list) + } + } + } + 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(); + + }, [isModalOpen, isTryRemoveAccount]); + + useEffect(() => { + const transletedQuestions = {} + + Object.keys(selectedQuestions).forEach((column) => { + selectedQuestions[column].forEach((minifiedData) => { + const q = questions.find(e => e.backendId === Number(minifiedData.id)) || {} + transletedQuestions[column] = { + ...minifiedData, + title: q.title || transletedQuestions[column].title + } + }) + }) + + setSelectedQuestions(transletedQuestions) + }, [questions]) + + 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]); + useEffect(() => { + getFields({ + page: pageOfTags, + size: SIZE, + }).then(([response]) => { + if (response && response.items !== null) { + const minifiedTags: MinifiedData[] = []; + + response.items.forEach((field) => { + minifiedTags.push({ + id: field.AmoID.toString(), + title: field.Name, + entity: + field.Entity === "leads" + ? "Lead" + : field.Entity === "contacts" + ? "Contact" + : field.Entity === "companies" + ? "Company" + : "Customer", + }); + }); + setArrayOfFields((prevItems) => [...prevItems, ...minifiedTags]); + } + }); + }, [pageOfFields]); + + return { + isLoadingPage, + firstRules, + accountInfo, + arrayOfPipelines, + arrayOfPipelinesSteps, + arrayOfUsers, + arrayOfTags, + arrayOfFields, + selectedPipeline, + setSelectedPipeline, + selectedCurrentFields, + selectedPipelineStep, + setSelectedPipelineStep, + selectedDealUser, + setSelectedDealPerformer, + questionsBackend, + selectedTags, + setSelectedTags, + selectedQuestions, + setSelectedQuestions, + setPageOfPipelines, + setPageOfPipelinesSteps, + setPageOfUsers, + setPageOfTags, + setSelectedCurrentFields, + }; +};