122 lines
3.5 KiB
JavaScript
122 lines
3.5 KiB
JavaScript
/* 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]);
|
||
}
|