diff --git a/src/containers/Dialogs/NotifyInvoiceViaSMSDialog/NotifyInvoiceViaSMSDialogContent.js b/src/containers/Dialogs/NotifyInvoiceViaSMSDialog/NotifyInvoiceViaSMSDialogContent.js index 88f75332d..349312e89 100644 --- a/src/containers/Dialogs/NotifyInvoiceViaSMSDialog/NotifyInvoiceViaSMSDialogContent.js +++ b/src/containers/Dialogs/NotifyInvoiceViaSMSDialog/NotifyInvoiceViaSMSDialogContent.js @@ -6,11 +6,11 @@ import NotifyInvoiceViaSMSForm from './NotifyInvoiceViaSMSForm'; export default function NotifyInvoiceViaSMSDialogContent({ // #ownProps dialogName, - invoice, + invoiceId, }) { return ( diff --git a/src/containers/Dialogs/NotifyInvoiceViaSMSDialog/NotifyInvoiceViaSMSForm.js b/src/containers/Dialogs/NotifyInvoiceViaSMSDialog/NotifyInvoiceViaSMSForm.js index b3d33176d..a2cf28c20 100644 --- a/src/containers/Dialogs/NotifyInvoiceViaSMSDialog/NotifyInvoiceViaSMSForm.js +++ b/src/containers/Dialogs/NotifyInvoiceViaSMSDialog/NotifyInvoiceViaSMSForm.js @@ -33,6 +33,8 @@ function NotifyInvoiceViaSMSForm({ setNotificationType, } = useNotifyInvoiceViaSMSContext(); + const [calloutCode, setCalloutCode] = React.useState([]); + // Handles the form submit. const handleFormSubmit = (values, { setSubmitting, setErrors }) => { setSubmitting(true); @@ -46,7 +48,6 @@ function NotifyInvoiceViaSMSForm({ setSubmitting(false); closeDialog(dialogName); }; - // Handle request response errors. const onError = ({ response: { @@ -54,13 +55,14 @@ function NotifyInvoiceViaSMSForm({ }, }) => { if (errors) { - transformErrors(errors, { setErrors }); + transformErrors(errors, { setErrors, setCalloutCode }); } setSubmitting(false); }; // Transformes the form values to request. const requestValues = transformFormValuesToRequest(values); + // Submits invoice SMS notification. createNotifyInvoiceBySMSMutate([invoiceId, requestValues]) .then(onSuccess) .catch(onError); @@ -74,7 +76,7 @@ function NotifyInvoiceViaSMSForm({ notification_key: notificationType, ...invoiceSMSDetail, }; - + // Handle form values change. const handleValuesChange = (values) => { if (values.notification_key !== notificationType) { setNotificationType(values.notification_key); @@ -88,7 +90,6 @@ function NotifyInvoiceViaSMSForm({ ], [], ); - return ( ); } diff --git a/src/containers/Dialogs/NotifyInvoiceViaSMSDialog/NotifyInvoiceViaSMSFormProvider.js b/src/containers/Dialogs/NotifyInvoiceViaSMSDialog/NotifyInvoiceViaSMSFormProvider.js index c052dc274..9fdad5c56 100644 --- a/src/containers/Dialogs/NotifyInvoiceViaSMSDialog/NotifyInvoiceViaSMSFormProvider.js +++ b/src/containers/Dialogs/NotifyInvoiceViaSMSDialog/NotifyInvoiceViaSMSFormProvider.js @@ -4,6 +4,9 @@ import { useCreateNotifyInvoiceBySMS, useInvoiceSMSDetail } from 'hooks/query'; const NotifyInvoiceViaSMSContext = React.createContext(); +/** + * Invoice SMS notification provider. + */ function NotifyInvoiceViaSMSFormProvider({ invoiceId, dialogName, ...props }) { const [notificationType, setNotificationType] = React.useState('details'); @@ -16,6 +19,7 @@ function NotifyInvoiceViaSMSFormProvider({ invoiceId, dialogName, ...props }) { }, { enabled: !!invoiceId, + keepPreviousData: true, }, ); // Create notfiy invoice by sms mutations. diff --git a/src/containers/Dialogs/NotifyInvoiceViaSMSDialog/index.js b/src/containers/Dialogs/NotifyInvoiceViaSMSDialog/index.js index 8951788cf..91f0c75e6 100644 --- a/src/containers/Dialogs/NotifyInvoiceViaSMSDialog/index.js +++ b/src/containers/Dialogs/NotifyInvoiceViaSMSDialog/index.js @@ -26,7 +26,7 @@ function NotifyInvoiceViaSMSDialog({ diff --git a/src/containers/Dialogs/SMSMessageDialog/utils.js b/src/containers/Dialogs/SMSMessageDialog/utils.js index b4f46f1f7..6b94176bd 100644 --- a/src/containers/Dialogs/SMSMessageDialog/utils.js +++ b/src/containers/Dialogs/SMSMessageDialog/utils.js @@ -1,15 +1,19 @@ import { Intent } from '@blueprintjs/core'; -import { AppToaster } from 'components'; -import intl from 'react-intl-universal'; +import { castArray } from 'lodash'; export const transformErrors = (errors, { setErrors }) => { - if ( - errors.find((error) => error.type === 'UNSUPPORTED_SMS_MESSAGE_VARIABLES') - ) { + let unsupportedVariablesError = errors.find( + (error) => error.type === 'UNSUPPORTED_SMS_MESSAGE_VARIABLES', + ); + if (unsupportedVariablesError) { + const variables = castArray( + unsupportedVariablesError.data.unsupported_args, + ); + const stringifiedVariables = variables.join(', '); + setErrors({ - message_text: intl.get( - 'sms_message.dialog.unsupported_variables_error_message', - ), + message_text: `The SMS message has unsupported variables - ${stringifiedVariables}`, + intent: Intent.DANGER, }); } }; diff --git a/src/containers/NotifyViaSMS/NotifyViaSMSForm.js b/src/containers/NotifyViaSMS/NotifyViaSMSForm.js index a41bbb697..aec773b22 100644 --- a/src/containers/NotifyViaSMS/NotifyViaSMSForm.js +++ b/src/containers/NotifyViaSMS/NotifyViaSMSForm.js @@ -1,9 +1,9 @@ import React from 'react'; import intl from 'react-intl-universal'; -import { castArray } from 'lodash'; +import { castArray, includes } from 'lodash'; import { Formik, Form, useFormikContext } from 'formik'; import styled from 'styled-components'; -import { Classes } from '@blueprintjs/core'; +import { Callout, Classes, Intent } from '@blueprintjs/core'; import 'style/pages/NotifyConactViaSMS/NotifyConactViaSMSDialog.scss'; @@ -57,6 +57,8 @@ function NotifyViaSMSForm({ onSubmit, onCancel, onValuesChange, + calloutCodes, + formikProps, }) { // Initial form values const initialValues = { @@ -71,6 +73,7 @@ function NotifyViaSMSForm({ return ( + @@ -108,6 +112,26 @@ function NotifyObserveValuesChange({ onChange }) { return ; } +/** + * Notify via SMS form alerts. + */ +function NotifyViaSMSAlerts({ calloutCodes }) { + return [ + includes(calloutCodes, 100) && ( + + The customer phone number does not eixst, please enter a personal phone + number to the customer. + + ), + includes(calloutCodes, 200) && ( + + The customer phone number is invalid, please enter a valid personal + phone number to the customer. + + ), + ]; +} + export default NotifyViaSMSForm; const NotifyContent = styled.div` diff --git a/src/containers/NotifyViaSMS/utils.js b/src/containers/NotifyViaSMS/utils.js index 9b78c1e35..2d6b78593 100644 --- a/src/containers/NotifyViaSMS/utils.js +++ b/src/containers/NotifyViaSMS/utils.js @@ -1,16 +1,14 @@ -import { Intent } from '@blueprintjs/core'; -import { AppToaster } from 'components'; import intl from 'react-intl-universal'; -export const transformErrors = (errors, { setErrors }) => { +export const transformErrors = (errors, { setErrors, setCalloutCode }) => { if (errors.some((e) => e.type === 'CUSTOMER_SMS_NOTIFY_PHONE_INVALID')) { - AppToaster.show({ - message: intl.get('notify_via_sms.dialog.phone_invalid_error_message'), - intent: Intent.DANGER, + setCalloutCode([200]); + setErrors({ + customer_phone_number: 'The personal phone number is invalid.', }); } - if (errors.find((error) => error.type === 'CUSTOMER_HAS_NO_PHONE_NUMBER')) { + setCalloutCode([100]); setErrors({ customer_phone_number: intl.get( 'notify_via_sms.dialog.customer_no_phone_error_message', @@ -19,7 +17,6 @@ export const transformErrors = (errors, { setErrors }) => { } }; - export const getSMSUnits = (message, threshold = 140) => { return Math.ceil(message.length / threshold); -}; \ No newline at end of file +};