/* eslint-disable sonarjs/cognitive-complexity */ import { message } from '@/Components/Common/Notification'; import { publicRuntimeConfigSchema } from '@/config/schema/runtime-config'; import getUrls from '@/config/urls'; import { ApolloLink, from, HttpLink } from '@apollo/client'; import { setContext } from '@apollo/client/link/context'; import { onError } from '@apollo/client/link/error'; import { getCurrentScope } from '@sentry/nextjs'; import getConfig from 'next/config'; import { isServer } from 'tools'; export function createLink(headers) { const { URL_CRM_GRAPHQL } = getUrls(); const modifyDataLink = new ApolloLink((operation, forward) => { const context = operation?.getContext(); return forward(operation).map((response) => { if (!context?.disableModify) { if (Object.keys(response?.data).includes('evo_addproduct_types')) { response.data.evo_addproduct_types = response.data.evo_addproduct_types.map( (evo_addproduct_type) => { if (evo_addproduct_type.evo_graph_price) return { ...evo_addproduct_type, label: `${evo_addproduct_type.label} (${evo_addproduct_type.evo_graph_price} руб.)`, }; return evo_addproduct_type; } ); } if (Object.keys(response?.data).includes('evo_equipments')) { response.data.evo_equipments = response.data.evo_equipments.map((evo_equipment) => { if (evo_equipment.evo_start_production_year) return { ...evo_equipment, label: `${evo_equipment.label} (${evo_equipment.evo_start_production_year})`, }; return evo_equipment; }); } if (operation.operationName === 'GetInsuranceCompanies') { response.data.accounts = response.data.accounts.map((account) => { const substring = account.label.match(/"(.+)"/u); if (substring) return { ...account, label: substring ? substring[1].replaceAll('"', '').trim() : account.label, }; return account; }); } } return response; }); }); const httpLink = new HttpLink({ uri: URL_CRM_GRAPHQL, }); const authLink = setContext((_, { headers: existingHeaders }) => { if (process.env.NODE_ENV === 'development') { const { publicRuntimeConfig } = getConfig(); const { DEV_AUTH_TOKEN } = publicRuntimeConfigSchema.parse(publicRuntimeConfig); if (DEV_AUTH_TOKEN) return { headers: { ...existingHeaders, authorization: `Bearer ${DEV_AUTH_TOKEN}`, }, }; } if (isServer()) { return { headers: { ...existingHeaders, authorization: headers?.authorization, }, }; } return { headers: { ...existingHeaders, }, }; }); const key = 'APOLLO_GRAPHQL'; const errorLink = onError(({ graphQLErrors, networkError, operation, response }) => { const scope = getCurrentScope(); scope.setTag('operationName', operation.operationName); if (!isServer()) { message.error({ content: `Ошибка во время загрузки данных из CRM`, key, onClick: () => message.destroy(key), }); } scope.setExtras({ graphQLErrors, networkError, operation, response, }); }); return from([authLink, errorLink, modifyDataLink, httpLink]); }