/* eslint-disable no-negated-condition */ import type { Elements } from '@/Components/Calculation/config/map/values'; import * as CRMTypes from '@/graphql/crm.types'; import type { ProcessContext } from '@/process/types'; import type { DocumentNode } from '@apollo/client'; import { reaction } from 'mobx'; type LinkReactionParams = { elementName: Elements; entityName: string; linkElementName: Elements; query: DocumentNode; variableName: string; }; export default function reactions({ store, apolloClient }: ProcessContext) { const { $calculation } = store; /** * При выборе Интереса, ЛС и Предложения скачиваем ссылку CRM */ function makeLinkReaction({ elementName, linkElementName, query, variableName, entityName, }: LinkReactionParams) { reaction( () => $calculation.element(elementName).getValue(), (id) => { if (!id) { $calculation.element(linkElementName).resetValue(); return; } const timeoutId = setTimeout(() => { $calculation.$status.setStatus(linkElementName, 'Loading'); }, 1200); apolloClient .query({ query, variables: { [variableName]: id, }, }) .then(({ data }) => { clearTimeout(timeoutId); if (data[entityName]?.link) { $calculation.element(linkElementName).setValue(data[entityName]?.link); } }) .catch(() => { clearTimeout(timeoutId); $calculation.element(linkElementName).resetValue(); }); } ); reaction( () => $calculation.element(linkElementName).getValue(), (url) => { if (!url) { $calculation.element(linkElementName).block(); } else { $calculation.element(linkElementName).unblock(); } } ); } makeLinkReaction({ elementName: 'selectLead', entityName: 'lead', linkElementName: 'linkLeadUrl', query: CRMTypes.GetLeadDocument, variableName: 'leadid', }); makeLinkReaction({ elementName: 'selectOpportunity', entityName: 'opportunity', linkElementName: 'linkOpportunityUrl', query: CRMTypes.GetOpportunityDocument, variableName: 'opportunityid', }); makeLinkReaction({ elementName: 'selectQuote', entityName: 'quote', linkElementName: 'linkQuoteUrl', query: CRMTypes.GetQuoteDocument, variableName: 'quoteId', }); }