From 72fbb34434b586a8b1613686b56cb3c4709bcda7 Mon Sep 17 00:00:00 2001 From: Nastya Date: Sun, 30 Jun 2024 18:32:16 +0300 Subject: [PATCH] =?UTF-8?q?=D0=BD=D0=BE=D0=B2=D0=B0=D1=8F=20=D0=B2=D0=B5?= =?UTF-8?q?=D1=80=D1=81=D0=B8=D1=8F=20api?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/api/integration.ts | 33 +++- .../CustomRadioGroup/CustomRadioGroup.tsx | 1 + .../IntegrationsModal/AmoCRMModal.tsx | 175 +++++++++++------ .../AmoQuestions/AmoQuestions.tsx | 90 +++++++-- .../AmoQuestions/CurrentFields.tsx | 81 +++++++- .../AmoQuestions/EntitiesQuestions.tsx | 48 +++-- .../ItemDetailsView/ItemDetailsView.tsx | 1 + .../ItemsSelectionView/ItemsSelectionView.tsx | 7 +- .../AmoQuestions/NewFields.tsx | 53 ++++- .../IntegrationsModal/types.ts | 4 +- .../IntegrationsModal/useAmoIntegration.ts | 182 ++++++++++-------- .../PartnersBoard/PartnersBoard.tsx | 2 +- 12 files changed, 499 insertions(+), 178 deletions(-) diff --git a/src/api/integration.ts b/src/api/integration.ts index c2e982ef..6c9dc5af 100644 --- a/src/api/integration.ts +++ b/src/api/integration.ts @@ -310,21 +310,36 @@ export type CustomField = { Deleted: boolean; CreatedAt: number; }; +export type Field = { + ID: number; + AmoID: number; + Code: string; + AccountID: number; + Name: string; + Entity: string; + Type: string; + Deleted: boolean; + CreatedAt: number; +}; export type CustomFieldsResponse = { count: number; items: CustomField[]; }; +export type FieldsResponse = { + count: number; + items: Field[]; +}; export const getCustomFields = async ( pagination: PaginationRequest ): Promise<[CustomFieldsResponse | null, string?]> => { try { - const fieldsResponse = await makeRequest({ + const customFieldsResponse = await makeRequest({ method: "GET", url: `${API_URL}/fields?page=${pagination.page}&size=${pagination.size}`, }); - return [fieldsResponse]; + return [customFieldsResponse]; } catch (nativeError) { const [error] = parseAxiosError(nativeError); return [null, `Не удалось получить список кастомных полей. ${error}`]; @@ -345,3 +360,17 @@ export const removeAmoAccount = async (): Promise<[void | null, string?]> => { return [null, `Не удалось отвязать аккаунт. ${error}`]; } }; + + +export const getFields = async ( pagination: PaginationRequest ): Promise<[FieldsResponse | null, string?]> => { + try { + const fieldsResponse = await makeRequest({ + method: "GET", + url: `${API_URL}/fields?page=${pagination.page}&size=${pagination.size}`, + }); + return [fieldsResponse, ""]; + } catch (nativeError) { + const [error] = parseAxiosError(nativeError); + return [null, `Не удалось получить список полей. ${error}`]; + } +}; diff --git a/src/components/CustomRadioGroup/CustomRadioGroup.tsx b/src/components/CustomRadioGroup/CustomRadioGroup.tsx index 63aa90bc..db3fdafc 100644 --- a/src/components/CustomRadioGroup/CustomRadioGroup.tsx +++ b/src/components/CustomRadioGroup/CustomRadioGroup.tsx @@ -67,6 +67,7 @@ export const CustomRadioGroup: FC = ({ width: "200px", overflow: "hidden", textOverflow: "ellipsis", + whiteSpace: "nowrap" }, }} value={item.id} diff --git a/src/pages/IntegrationsPage/IntegrationsModal/AmoCRMModal.tsx b/src/pages/IntegrationsPage/IntegrationsModal/AmoCRMModal.tsx index 44509fff..0ec60171 100644 --- a/src/pages/IntegrationsPage/IntegrationsModal/AmoCRMModal.tsx +++ b/src/pages/IntegrationsPage/IntegrationsModal/AmoCRMModal.tsx @@ -1,5 +1,5 @@ import React, { FC, useCallback, useEffect, useMemo, useState } from "react"; -import {Dialog, IconButton, Typography, useMediaQuery, useTheme, Box, Skeleton} from "@mui/material"; +import { Dialog, IconButton, Typography, useMediaQuery, useTheme, Box, Skeleton } from "@mui/material"; import { useQuestions } from "@/stores/questions/hooks"; import { redirect } from "react-router-dom"; import { enqueueSnackbar } from "notistack"; @@ -35,18 +35,27 @@ import { } from "@api/integration"; import type { QuestionID } from "@api/integration"; import { useAmoIntegration } from "./useAmoIntegration"; -import { QuestionKeys, TagKeys, TagQuestionHC } from "./types"; +import { MinifiedData, QuestionKeys, TagKeys, TagQuestionHC } from "./types"; +import { Quiz } from "@/model/quiz/quiz"; type IntegrationsModalProps = { isModalOpen: boolean; handleCloseModal: () => void; companyName: string | null; - quizID: number | undefined; + quiz: Quiz; }; -export const AmoCRMModal: FC = ({ isModalOpen, handleCloseModal, companyName, quizID }) => { +const FCTranslate = { + "name": "имя", + "email": "почта", + "phone": "телефон", + "text": "номер", + "address": "адрес", +} + +export const AmoCRMModal: FC = ({ isModalOpen, handleCloseModal, companyName, quiz }) => { //Если нет контекста квиза, то и делать на этой страничке нечего - if (quizID === undefined) { + if (quiz?.backendId === undefined) { redirect("/list"); return null; } @@ -66,12 +75,30 @@ export const AmoCRMModal: FC = ({ isModalOpen, handleClo })), [questions] ); + const FieldsAllowedFC = useMemo( + () => { + const list: MinifiedData[] = [] + if (quiz.config.showfc) { + const fields = quiz.config.formContact.fields + for (let key in fields) { + if (fields[key].used) list.push({ + id: key, + title: FCTranslate[key], + entity: "Contact", + }) + } + } + return list; + }, + [quiz] + ); const [step, setStep] = useState(5); const [isSettingsBlock, setIsSettingsBlock] = useState(false); const [isTryRemoveAccount, setIsTryRemoveAccount] = useState(false); const [openDelete, setOpenDelete] = useState(null); + const { isLoadingPage, firstRules, @@ -80,8 +107,10 @@ export const AmoCRMModal: FC = ({ isModalOpen, handleClo arrayOfPipelinesSteps, arrayOfUsers, arrayOfTags, + arrayOfFields, selectedPipeline, setSelectedPipeline, + selectedCurrentFields, selectedPipelineStep, setSelectedPipelineStep, selectedDealUser, @@ -95,10 +124,12 @@ export const AmoCRMModal: FC = ({ isModalOpen, handleClo setPageOfPipelinesSteps, setPageOfUsers, setPageOfTags, + setSelectedCurrentFields, } = useAmoIntegration({ - quizID, + quizID: quiz.backendId, isModalOpen, isTryRemoveAccount, + questions, }); const handleAddTagQuestion = useCallback( @@ -135,6 +166,7 @@ export const AmoCRMModal: FC = ({ isModalOpen, handleClo } if (openDelete.type === "question") { +console.log("delete id ", openDelete.id ) let newArray = selectedQuestions[openDelete.scope as QuestionKeys]; const index = newArray.indexOf(openDelete.id); if (index !== -1) newArray.splice(index, 1); @@ -143,6 +175,9 @@ export const AmoCRMModal: FC = ({ isModalOpen, handleClo ...prevState, [openDelete.scope]: newArray, })); + + setSelectedCurrentFields(selectedCurrentFields.filter(e => e.id !== openDelete.id)); + } setOpenDelete(null); }, [openDelete]); @@ -154,7 +189,7 @@ export const AmoCRMModal: FC = ({ isModalOpen, handleClo setStep((prevState) => prevState - 1); }; const handleSave = () => { - if (quizID === undefined) return; + if (quiz?.backendId === undefined) return; if (selectedPipeline === null) return enqueueSnackbar("Выберите воронку"); if (selectedPipeline === null) return enqueueSnackbar("Выберите этап воронки"); @@ -167,29 +202,42 @@ export const AmoCRMModal: FC = ({ isModalOpen, handleClo }; const FieldsRule = { - Company: [{ QuestionID: {} }], - Lead: [{ QuestionID: {} }], - Customer: [{ QuestionID: {} }], + Company: { QuestionID: {} }, + Lead: { QuestionID: {} }, + Customer: { QuestionID: {} }, + Contact: { + QuestionID: {}, + ContactRuleMap: { + } + }, }; for (let key in FieldsRule) { selectedQuestions[key as QuestionKeys].forEach((id) => { - FieldsRule[key as QuestionKeys][0].QuestionID[id] = 0; + FieldsRule[key as QuestionKeys].QuestionID[id] = 0; }); } + + selectedCurrentFields.forEach((e) => { + FieldsRule.Contact.ContactRuleMap[e.subTitle] = Number(e.id) + }) + + for (let key in body.TagsToAdd) { body.TagsToAdd[key as TagKeys] = body.TagsToAdd[key as TagKeys].map((id) => Number(id)); } body.FieldsRule = FieldsRule; + console.log(body) + if (firstRules) { - setIntegrationRules(quizID.toString(), body); + setIntegrationRules(quiz.backendId.toString(), body); } else { - updateIntegrationRules(quizID.toString(), body); + updateIntegrationRules(quiz.backendId.toString(), body); } - handleCloseModal(); - setStep(1); + handleCloseModal(); + setStep(1); }; const steps = useMemo( () => [ @@ -258,7 +306,7 @@ export const AmoCRMModal: FC = ({ isModalOpen, handleClo tagsItems={arrayOfTags} selectedTags={selectedTags} openDelete={setOpenDelete} - handleScroll={() => {}} + handleScroll={() => { }} handleAddTag={handleAddTagQuestion} handlePrevStep={handlePrevStep} handleNextStep={handleNextStep} @@ -270,12 +318,16 @@ export const AmoCRMModal: FC = ({ isModalOpen, handleClo isSettingsAvailable: true, component: ( ), }, @@ -295,6 +347,7 @@ export const AmoCRMModal: FC = ({ isModalOpen, handleClo arrayOfUsers, minifiedQuestions, arrayOfTags, + selectedCurrentFields, ] ); @@ -355,52 +408,52 @@ export const AmoCRMModal: FC = ({ isModalOpen, handleClo }} > {isLoadingPage ? - : - <> - setIsTryRemoveAccount(true)} + : + <> + setIsTryRemoveAccount(true)} + /> + {openDelete !== null ? ( + setOpenDelete(null)} + deleteItem={handleDeleteTagQuestion} /> - {openDelete !== null ? ( - setOpenDelete(null)} - deleteItem={handleDeleteTagQuestion} - /> - ) : ( - <> - {isTryRemoveAccount && setIsTryRemoveAccount(false)} />} - {isSettingsBlock && ( - - u.id === selectedDealUser)?.title || "не указан"} - selectedFunnel={arrayOfPipelines.find((p) => p.id === selectedPipeline)?.title || "нет данных"} - selectedStage={ - arrayOfPipelinesSteps.find((s) => s.id === selectedPipelineStep)?.title || "нет данных" - } - selectedQuestions={selectedQuestions} - selectedTags={selectedTags} - /> - - )} - {!isSettingsBlock && !isTryRemoveAccount && ( - {steps[step].component} - )} - - )} - + ) : ( + <> + {isTryRemoveAccount && setIsTryRemoveAccount(false)} />} + {isSettingsBlock && ( + + u.id === selectedDealUser)?.title || "не указан"} + selectedFunnel={arrayOfPipelines.find((p) => p.id === selectedPipeline)?.title || "нет данных"} + selectedStage={ + arrayOfPipelinesSteps.find((s) => s.id === selectedPipelineStep)?.title || "нет данных" + } + selectedQuestions={selectedQuestions} + selectedTags={selectedTags} + /> + + )} + {!isSettingsBlock && !isTryRemoveAccount && ( + {steps[step].component} + )} + + )} + } diff --git a/src/pages/IntegrationsPage/IntegrationsModal/AmoQuestions/AmoQuestions.tsx b/src/pages/IntegrationsPage/IntegrationsModal/AmoQuestions/AmoQuestions.tsx index 1f6727e3..47758b0e 100644 --- a/src/pages/IntegrationsPage/IntegrationsModal/AmoQuestions/AmoQuestions.tsx +++ b/src/pages/IntegrationsPage/IntegrationsModal/AmoQuestions/AmoQuestions.tsx @@ -1,41 +1,82 @@ -import { FC, useState } from "react"; +import { FC, useMemo, useState } from "react"; import { ItemsSelectionView } from "./ItemsSelectionView/ItemsSelectionView"; import { ItemDetailsView } from "./ItemDetailsView/ItemDetailsView"; import { Box } from "@mui/material"; -import { QuestionKeys, SelectedQuestions, TagKeys, TagQuestionHC } from "../types"; +import { MinifiedData, QuestionKeys, SelectedQuestions, TagKeys, TagQuestionHC } from "../types"; import { EntitiesQuestions } from "./EntitiesQuestions"; -type MinifiedData = { - id: string; - title: string; - subTitle?: string; -}; type Props = { + selectedCurrentFields: MinifiedData[] | []; questionsItems: MinifiedData[] | []; + fieldsItems: MinifiedData[] | []; selectedQuestions: SelectedQuestions; handleAddQuestion: (scope: QuestionKeys | TagKeys, id: string, type: "question" | "tag") => void; openDelete: (data: TagQuestionHC) => void; handlePrevStep: () => void; handleNextStep: () => void; + FieldsAllowedFC: MinifiedData[] + setSelectedCurrentFields: (value: MinifiedData[]) => void; }; +export type QuestionPair = { + question: string, + field: string +} export const AmoQuestions: FC = ({ + selectedCurrentFields, questionsItems, + fieldsItems, selectedQuestions, handleAddQuestion, handlePrevStep, handleNextStep, openDelete, + FieldsAllowedFC, + setSelectedCurrentFields }) => { + console.log("selectedCurrentFields") + console.log(selectedCurrentFields) + console.log("selectedQuestions") + console.log(selectedQuestions) const [isSelection, setIsSelection] = useState(false); const [activeScope, setActiveScope] = useState(null); const [selectedQuestion, setSelectedQuestion] = useState(null); + const [selectedField, setSelectedField] = useState(null); - const handleAdd = () => { + const [isCurrentFields, setIsCurrentFields] = useState(true); + + const handleAddNewField = () => { if (activeScope === null || selectedQuestion === null) return; setActiveScope(null); handleAddQuestion(activeScope, selectedQuestion, "question"); }; + const handleAddCurrentField = () => { + if (activeScope === null || selectedField === null || selectedQuestion === null || selectedCurrentFields.some(e => e.id === selectedQuestion)) return; + setActiveScope(null); + setSelectedCurrentFields((old) => { + console.log(old) + return ( + [...old, { + id: selectedQuestion, + title: questionsItems.find(e => e.id === selectedQuestion)?.title, + entity: activeScope, + subTitle: selectedField + }] + ) + }); + }; + + const handleAdd = () => { + console.log(activeScope, selectedQuestion) + if (isCurrentFields) { + console.log("добавляю текущее поле") + handleAddCurrentField() + } else { + console.log("добавляю новое поле") + handleAddNewField() + } + } + const handleDelete = (id: string, scope: QuestionKeys) => { openDelete({ id, @@ -43,6 +84,20 @@ export const AmoQuestions: FC = ({ type: "question", }); }; + const SCFworld = useMemo(() => { + const obj = { + Lead: [], + Company: [], + Customer: [], + Contact: [] + } + selectedCurrentFields.forEach((e) => { + if (!obj[e.entity]?.includes(e.id)) { + obj[e.entity].push(e.id) + } + }) + return obj + }, [selectedCurrentFields]) return ( = ({ > {isSelection && activeScope !== null ? ( { setActiveScope(null); setIsSelection(false); @@ -68,6 +126,9 @@ export const AmoQuestions: FC = ({ setActiveScope(null); setIsSelection(false); }} + activeScope={activeScope} + setIsCurrentFields={setIsCurrentFields} + isCurrentFields={isCurrentFields} /> // Здесь выбираем элемент в табличку // = ({ ) : ( // Табличка { - return <>мои поля +interface Props { + items: MinifiedData[]; + fieldsItems: MinifiedData[]; + currentField: string; + currentQuestion: string; + setCurrentField: (value: string) => void; + setCurrentQuestion: (value: string) => void; +} +export const CurrentFields = ({ + items, + fieldsItems, + currentField, + currentQuestion, + setCurrentField, + setCurrentQuestion, +}: Props) => { + + return ( + + + Выберите поле + { }} + activeScope={undefined} + /> + + + Выберите вопрос для этого поля + { }} + activeScope={undefined} + /> + + + ) } \ No newline at end of file diff --git a/src/pages/IntegrationsPage/IntegrationsModal/AmoQuestions/EntitiesQuestions.tsx b/src/pages/IntegrationsPage/IntegrationsModal/AmoQuestions/EntitiesQuestions.tsx index c7c8317f..9553639a 100644 --- a/src/pages/IntegrationsPage/IntegrationsModal/AmoQuestions/EntitiesQuestions.tsx +++ b/src/pages/IntegrationsPage/IntegrationsModal/AmoQuestions/EntitiesQuestions.tsx @@ -1,37 +1,42 @@ import { Box, Button } from "@mui/material" import { StepButtonsBlock } from "../StepButtonsBlock/StepButtonsBlock" import { FC, useState } from "react"; -import { TagKeys } from "../types"; +import { MinifiedData, TagKeys } from "../types"; import { CurrentFields } from "./CurrentFields"; import { NewFields } from "./NewFields"; +import { QuestionPair } from "./AmoQuestions"; -type MinifiedData = { - id: string; - title: string; - subTitle?: string; -}; type ItemsSelectionViewProps = { items: MinifiedData[] | []; + fieldsItems: MinifiedData[] | []; selectedItemId?: string | null; - setSelectedItem: (value: string | null) => void; + setSelectedQuestion: (value: string | null) => void; + selectedField?: string | null; + setSelectedField: (value: string | null) => void; handleScroll?: () => void; onLargeBtnClick: () => void; onSmallBtnClick: () => void; activeScope: TagKeys; -}; + FieldsAllowedFC: MinifiedData[]; + setIsCurrentFields: (a:boolean) => void; + isCurrentFields: boolean +} export const EntitiesQuestions: FC = ({ items, + fieldsItems, selectedItemId, - setSelectedItem, + setSelectedQuestion, + selectedField, + setSelectedField, handleScroll, onLargeBtnClick, onSmallBtnClick, activeScope, + FieldsAllowedFC, + setIsCurrentFields, + isCurrentFields, }) => { - - const [isCurrentFields, setIsCurrentFields] = useState(true); - return ( = ({ { isCurrentFields ? - + e.entity === activeScope)} + currentField={selectedField} + currentQuestion={selectedItemId} + setCurrentField={setSelectedField} + setCurrentQuestion={setSelectedQuestion} + /> : - + } = ({ }} > { + onLargeBtnClick() + }} largeBtnText={"Добавить"} onSmallBtnClick={onSmallBtnClick} smallBtnText={"Отменить"} diff --git a/src/pages/IntegrationsPage/IntegrationsModal/AmoQuestions/ItemDetailsView/ItemDetailsView.tsx b/src/pages/IntegrationsPage/IntegrationsModal/AmoQuestions/ItemDetailsView/ItemDetailsView.tsx index 231bf759..c08c0b64 100644 --- a/src/pages/IntegrationsPage/IntegrationsModal/AmoQuestions/ItemDetailsView/ItemDetailsView.tsx +++ b/src/pages/IntegrationsPage/IntegrationsModal/AmoQuestions/ItemDetailsView/ItemDetailsView.tsx @@ -25,6 +25,7 @@ export const ItemDetailsView: FC = ({ setActiveScope, deleteHC, }) => { + console.log(selectedQuestions) const theme = useTheme(); return ( diff --git a/src/pages/IntegrationsPage/IntegrationsModal/AmoQuestions/ItemsSelectionView/ItemsSelectionView.tsx b/src/pages/IntegrationsPage/IntegrationsModal/AmoQuestions/ItemsSelectionView/ItemsSelectionView.tsx index 78a62d05..a19a6aed 100644 --- a/src/pages/IntegrationsPage/IntegrationsModal/AmoQuestions/ItemsSelectionView/ItemsSelectionView.tsx +++ b/src/pages/IntegrationsPage/IntegrationsModal/AmoQuestions/ItemsSelectionView/ItemsSelectionView.tsx @@ -2,13 +2,8 @@ import { Box } from "@mui/material"; import { CustomRadioGroup } from "../../../../../components/CustomRadioGroup/CustomRadioGroup"; import { StepButtonsBlock } from "../../StepButtonsBlock/StepButtonsBlock"; import { FC } from "react"; -import { TagKeys } from "../../types"; +import { MinifiedData, TagKeys } from "../../types"; -type MinifiedData = { - id: string; - title: string; - subTitle?: string; -}; type ItemsSelectionViewProps = { items: MinifiedData[] | []; selectedItemId?: string | null; diff --git a/src/pages/IntegrationsPage/IntegrationsModal/AmoQuestions/NewFields.tsx b/src/pages/IntegrationsPage/IntegrationsModal/AmoQuestions/NewFields.tsx index 70b240b8..8d2d4a33 100644 --- a/src/pages/IntegrationsPage/IntegrationsModal/AmoQuestions/NewFields.tsx +++ b/src/pages/IntegrationsPage/IntegrationsModal/AmoQuestions/NewFields.tsx @@ -1,4 +1,53 @@ +import { CustomRadioGroup } from "@/components/CustomRadioGroup/CustomRadioGroup" +import { Box, Typography } from "@mui/material" +import { MinifiedData } from "../types"; -export const NewFields = () => { - return <>новые поля +interface Props { + items: MinifiedData[]; + fieldsItems: MinifiedData[]; + currentField: string; + currentQuestion: string; + setCurrentField: (value: string) => void; + setCurrentQuestion: (value: string) => void; +} +export const NewFields = ({ + items, + currentQuestion, + setCurrentQuestion, +}: Props) => { + + return ( + + + Выберите вопрос для поля. Название поля настроится автоматически + { }} + activeScope={undefined} + /> + + + ) } \ No newline at end of file diff --git a/src/pages/IntegrationsPage/IntegrationsModal/types.ts b/src/pages/IntegrationsPage/IntegrationsModal/types.ts index feaf1fef..a45438a1 100644 --- a/src/pages/IntegrationsPage/IntegrationsModal/types.ts +++ b/src/pages/IntegrationsPage/IntegrationsModal/types.ts @@ -1,7 +1,7 @@ -export type TagKeys = "Contact" | "Company" | "Lead" | "Customer"; +export type TagKeys = "Company" | "Lead" | "Customer" | "Contact"; export type SelectedTags = Record; -export type QuestionKeys = "Company" | "Lead" | "Customer"; +export type QuestionKeys = "Company" | "Lead" | "Customer" | "Contact"; export type SelectedQuestions = Record; export type MinifiedData = { diff --git a/src/pages/IntegrationsPage/IntegrationsModal/useAmoIntegration.ts b/src/pages/IntegrationsPage/IntegrationsModal/useAmoIntegration.ts index 33340c31..5f5191da 100644 --- a/src/pages/IntegrationsPage/IntegrationsModal/useAmoIntegration.ts +++ b/src/pages/IntegrationsPage/IntegrationsModal/useAmoIntegration.ts @@ -10,17 +10,27 @@ import { getUsers, getAccount, FieldsRule, + getFields, } from "@/api/integration"; +import { AnyTypedQuizQuestion } from "@frontend/squzanswerer"; -const SIZE = 75; +const SIZE = 175; interface Props { isModalOpen: boolean; isTryRemoveAccount: boolean; quizID: number; + questions: AnyTypedQuizQuestion } -export const useAmoIntegration = ({ isModalOpen, isTryRemoveAccount, quizID }: Props) => { +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); @@ -29,10 +39,12 @@ export const useAmoIntegration = ({ isModalOpen, isTryRemoveAccount, quizID }: P 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({ @@ -45,97 +57,88 @@ export const useAmoIntegration = ({ isModalOpen, isTryRemoveAccount, quizID }: P 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(() => { - if (isModalOpen && !isTryRemoveAccount) { - const fetchAccountRules = async () => { - setIsLoadingPage(true); - const [account, accountError] = await getAccount(); + 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 (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 (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); + 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]; + for (let key in settingsResponse.FieldsRule) { + if ( + settingsResponse.FieldsRule[key as QuestionKeys] !== null + ) { + const gottenList = settingsResponse.FieldsRule[key as QuestionKeys]; - if (gottenList !== null) gottenQuestions[key as QuestionKeys] = Object.keys(gottenList[0].QuestionID); + if (gottenList !== null) gottenQuestions[key as QuestionKeys] = Object.keys(gottenList.QuestionID); + + if (key === "Contact") { + const MAP = settingsResponse.FieldsRule[key as QuestionKeys].ContactRuleMap + + const list = [] + for (let key in MAP) { + list.push({ + id: MAP[key].toString(), + title: FCTranslate[key], + subTitle: key, + entity: "Contact", + }) + } + console.log(list) + 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); + setSelectedQuestions(gottenQuestions); } - 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); - } + 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(() => { @@ -222,6 +225,32 @@ export const useAmoIntegration = ({ isModalOpen, isTryRemoveAccount, quizID }: P } }); }, [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, @@ -231,8 +260,10 @@ export const useAmoIntegration = ({ isModalOpen, isTryRemoveAccount, quizID }: P arrayOfPipelinesSteps, arrayOfUsers, arrayOfTags, + arrayOfFields, selectedPipeline, setSelectedPipeline, + selectedCurrentFields, selectedPipelineStep, setSelectedPipelineStep, selectedDealUser, @@ -246,5 +277,6 @@ export const useAmoIntegration = ({ isModalOpen, isTryRemoveAccount, quizID }: P setPageOfPipelinesSteps, setPageOfUsers, setPageOfTags, + setSelectedCurrentFields, }; }; diff --git a/src/pages/IntegrationsPage/PartnersBoard/PartnersBoard.tsx b/src/pages/IntegrationsPage/PartnersBoard/PartnersBoard.tsx index 88390845..48256d3b 100644 --- a/src/pages/IntegrationsPage/PartnersBoard/PartnersBoard.tsx +++ b/src/pages/IntegrationsPage/PartnersBoard/PartnersBoard.tsx @@ -128,7 +128,7 @@ export const PartnersBoard: FC = ({ isModalOpen={isAmoCrmModalOpen} handleCloseModal={handleCloseAmoSRMModal} companyName={companyName} - quizID={quiz?.backendId} + quiz={quiz} /> )}