diff --git a/config/default-statuses.ts b/config/default-statuses.ts index 12df54e..b7c081e 100644 --- a/config/default-statuses.ts +++ b/config/default-statuses.ts @@ -133,6 +133,8 @@ const defaultStatuses: CalculationStatuses = { linkOpportunityUrl: 'Default', linkQuoteUrl: 'Default', tbxBonusCoefficient: 'Default', + btnCalculate: 'Default', + btnCreateKP: 'Default', }; export default defaultStatuses; diff --git a/pages/index.tsx b/pages/index.tsx index 2069a21..5999a5c 100644 --- a/pages/index.tsx +++ b/pages/index.tsx @@ -5,6 +5,7 @@ import Output from 'Components/Output'; import type { BaseOption } from 'Elements/types'; import type { GetServerSideProps } from 'next'; import Head from 'next/head'; +import calculateValidationReactions from 'process/calculate/reactions/validation'; import leadOpportunityUrlsReactions from 'process/lead-opportunity/reactions/urls'; import paymentsReactions from 'process/payments/reactions'; import { fetchUser } from 'services/user'; @@ -48,6 +49,7 @@ function Home({ graphQLData }: PageProps) { */ leadOpportunityUrlsReactions(store, apolloClient); paymentsReactions(store, apolloClient); + calculateValidationReactions(store, apolloClient); /** * set graphql data to store diff --git a/process/calculate/reactions/validation.ts b/process/calculate/reactions/validation.ts new file mode 100644 index 0000000..7e160aa --- /dev/null +++ b/process/calculate/reactions/validation.ts @@ -0,0 +1,31 @@ +import type { ApolloClient } from '@apollo/client'; +import { reaction } from 'mobx'; +import type RootStore from 'stores/root'; + +export default function calculateValidationReactions( + store: RootStore, + apolloClient: ApolloClient +) { + const { $calculation, $tables } = store; + reaction( + () => { + const hasElementsErrors = $calculation.$validation.hasErrors; + const hasPaymentsErrors = $tables.payments.validation.hasErrors; + const hasInsuranceErrors = $tables.insurance.validation.hasErrors; + + return hasElementsErrors || hasPaymentsErrors || hasInsuranceErrors; + }, + (hasErrors) => { + if (hasErrors) { + $calculation.$status.setStatus('btnCalculate', 'Disabled'); + $calculation.$status.setStatus('btnCreateKP', 'Disabled'); + } else { + $calculation.$status.resetStatus('btnCalculate'); + $calculation.$status.resetStatus('btnCreateKP'); + } + }, + { + fireImmediately: true, + } + ); +} diff --git a/stores/calculation/statuses/index.ts b/stores/calculation/statuses/index.ts index 3b75bc0..096d1a7 100644 --- a/stores/calculation/statuses/index.ts +++ b/stores/calculation/statuses/index.ts @@ -1,5 +1,6 @@ /* eslint-disable object-curly-newline */ -import type { Elements } from 'Components/Calculation/config/map/values'; +import type { Elements as ElementsActions } from 'Components/Calculation/config/map/actions'; +import type { Elements as ElementsValues } from 'Components/Calculation/config/map/values'; import defaultStatuses from 'config/default-statuses'; import type { Status } from 'Elements/types'; import { makeAutoObservable } from 'mobx'; @@ -19,11 +20,11 @@ export default class StatusStore { this.statuses = initialStatuses; }; - getStatus(elementName: Elements) { + getStatus(elementName: ElementsValues | ElementsActions) { return this.statuses[elementName]; } - setStatus = (elementName: Elements, status: Status) => { + setStatus = (elementName: ElementsValues | ElementsActions, status: Status) => { this.statuses[elementName] = status; }; @@ -31,7 +32,7 @@ export default class StatusStore { this.statuses = Object.assign(this.statuses, statuses); }; - resetStatus = (elementName: Elements) => { + resetStatus = (elementName: ElementsValues | ElementsActions) => { this.statuses[elementName] = defaultStatuses[elementName]; }; } diff --git a/stores/calculation/statuses/types.ts b/stores/calculation/statuses/types.ts index a411b9b..a7a39fd 100644 --- a/stores/calculation/statuses/types.ts +++ b/stores/calculation/statuses/types.ts @@ -1,4 +1,5 @@ -import type { Elements } from 'Components/Calculation/config/map/values'; +import type { Elements as ElementsActions } from 'Components/Calculation/config/map/actions'; +import type { Elements as ElementsValues } from 'Components/Calculation/config/map/values'; import type { Status } from 'Elements/types'; -export type CalculationStatuses = Record; +export type CalculationStatuses = Record;