From 834d365a9712850c0db4b254ee36c8553fc3c36c Mon Sep 17 00:00:00 2001 From: elforjani13 <39470382+elforjani13@users.noreply.github.com> Date: Sun, 7 Nov 2021 13:39:29 +0200 Subject: [PATCH] feat: Add SMS Integration & SMS Message Form. --- src/common/classes.js | 1 + .../DataTableCells/SwitchFieldCell.js | 2 +- src/components/DialogsContainer.js | 2 + .../SMSMessageDialogContent.js | 20 +++++ .../SMSMessageDialogProvider.js | 38 +++++++++ .../SMSMessageDialog/SMSMessageForm.js | 79 +++++++++++++++++++ .../SMSMessageDialog/SMSMessageForm.schema.js | 11 +++ .../SMSMessageDialog/SMSMessageFormContent.js | 17 ++++ .../SMSMessageDialog/SMSMessageFormFields.js | 31 ++++++++ .../SMSMessageFormFloatingActions.js | 47 +++++++++++ .../Dialogs/SMSMessageDialog/index.js | 39 +++++++++ .../SMSIntegration/SMSIntegrationProvider.js | 39 +++++++++ .../SMSIntegration/SMSIntegrationTabs.js | 42 ++++++++++ .../SMSIntegration/SMSMessagesDataTable.js | 40 ++++++++++ .../Preferences/SMSIntegration/components.js | 67 ++++++++++++++++ .../Preferences/SMSIntegration/index.js | 15 ++++ .../SMSMessagesTemplatesDataTable.js | 54 ------------- .../SMSMessagesTemplatesProvider.js | 35 -------- .../SMSMessagesTemplates/components.js | 40 ---------- .../Preferences/SMSMessagesTemplates/index.js | 15 ---- .../Preferences/Users/components.js | 2 +- src/hooks/query/settings.js | 41 +++++++++- src/hooks/query/types.js | 2 + src/lang/en/index.json | 15 ++-- src/routes/preferences.js | 4 +- .../NotifyConactViaSMSDialog.scss | 2 +- .../pages/Preferences/SMSIntegration.scss | 38 +++++++++ src/style/pages/SMSMessage/SMSMessage.scss | 29 +++++++ 28 files changed, 612 insertions(+), 155 deletions(-) create mode 100644 src/containers/Dialogs/SMSMessageDialog/SMSMessageDialogContent.js create mode 100644 src/containers/Dialogs/SMSMessageDialog/SMSMessageDialogProvider.js create mode 100644 src/containers/Dialogs/SMSMessageDialog/SMSMessageForm.js create mode 100644 src/containers/Dialogs/SMSMessageDialog/SMSMessageForm.schema.js create mode 100644 src/containers/Dialogs/SMSMessageDialog/SMSMessageFormContent.js create mode 100644 src/containers/Dialogs/SMSMessageDialog/SMSMessageFormFields.js create mode 100644 src/containers/Dialogs/SMSMessageDialog/SMSMessageFormFloatingActions.js create mode 100644 src/containers/Dialogs/SMSMessageDialog/index.js create mode 100644 src/containers/Preferences/SMSIntegration/SMSIntegrationProvider.js create mode 100644 src/containers/Preferences/SMSIntegration/SMSIntegrationTabs.js create mode 100644 src/containers/Preferences/SMSIntegration/SMSMessagesDataTable.js create mode 100644 src/containers/Preferences/SMSIntegration/components.js create mode 100644 src/containers/Preferences/SMSIntegration/index.js delete mode 100644 src/containers/Preferences/SMSMessagesTemplates/SMSMessagesTemplatesDataTable.js delete mode 100644 src/containers/Preferences/SMSMessagesTemplates/SMSMessagesTemplatesProvider.js delete mode 100644 src/containers/Preferences/SMSMessagesTemplates/components.js delete mode 100644 src/containers/Preferences/SMSMessagesTemplates/index.js create mode 100644 src/style/pages/Preferences/SMSIntegration.scss create mode 100644 src/style/pages/SMSMessage/SMSMessage.scss diff --git a/src/common/classes.js b/src/common/classes.js index f20587caa..bea33a718 100644 --- a/src/common/classes.js +++ b/src/common/classes.js @@ -66,6 +66,7 @@ const CLASSES = { PREFERENCES_PAGE_INSIDE_CONTENT_USERS: 'preferences-page__inside-content--users', PREFERENCES_PAGE_INSIDE_CONTENT_CURRENCIES: 'preferences-page__inside-content--currencies', PREFERENCES_PAGE_INSIDE_CONTENT_ACCOUNTANT: 'preferences-page__inside-content--accountant', + PREFERENCES_PAGE_INSIDE_CONTENT_SMS_INTEGRATION: 'preferences-page__inside-content--sms-integration', FINANCIAL_REPORT_INSIDER: 'dashboard__insider--financial-report', diff --git a/src/components/DataTableCells/SwitchFieldCell.js b/src/components/DataTableCells/SwitchFieldCell.js index 0e9635439..df5bb0e89 100644 --- a/src/components/DataTableCells/SwitchFieldCell.js +++ b/src/components/DataTableCells/SwitchFieldCell.js @@ -31,7 +31,7 @@ const SwitchEditableCell = ({ > + ); } diff --git a/src/containers/Dialogs/SMSMessageDialog/SMSMessageDialogContent.js b/src/containers/Dialogs/SMSMessageDialog/SMSMessageDialogContent.js new file mode 100644 index 000000000..134a42f48 --- /dev/null +++ b/src/containers/Dialogs/SMSMessageDialog/SMSMessageDialogContent.js @@ -0,0 +1,20 @@ +import React from 'react'; + +import '../../../style/pages/SMSMessage/SMSMessage.scss'; +import { SMSMessageDialogProvider } from './SMSMessageDialogProvider'; +import SMSMessageForm from './SMSMessageForm'; + +export default function SMSMessageDialogContent({ + // #ownProps + dialogName, + notificationkey, +}) { + return ( + + + + ); +} diff --git a/src/containers/Dialogs/SMSMessageDialog/SMSMessageDialogProvider.js b/src/containers/Dialogs/SMSMessageDialog/SMSMessageDialogProvider.js new file mode 100644 index 000000000..28c6b180f --- /dev/null +++ b/src/containers/Dialogs/SMSMessageDialog/SMSMessageDialogProvider.js @@ -0,0 +1,38 @@ +import React from 'react'; +import { DialogContent } from 'components'; +import { + useSettingEditSMSNotification, + useSettingSMSNotification, +} from 'hooks/query'; + +const SMSMessageDialogContext = React.createContext(); + +/** + * SMS Message dialog provider. + */ +function SMSMessageDialogProvider({ notificationkey, dialogName, ...props }) { + // Edit SMS message notification mutations. + const { mutateAsync: editSMSNotificationMutate } = + useSettingEditSMSNotification(); + + const { data: smsNotification, isLoading: isSMSNotificationLoading } = + useSettingSMSNotification(notificationkey); + + // provider. + const provider = { + dialogName, + smsNotification, + editSMSNotificationMutate, + }; + + return ( + + + + ); +} + +const useSMSMessageDialogContext = () => + React.useContext(SMSMessageDialogContext); + +export { SMSMessageDialogProvider, useSMSMessageDialogContext }; diff --git a/src/containers/Dialogs/SMSMessageDialog/SMSMessageForm.js b/src/containers/Dialogs/SMSMessageDialog/SMSMessageForm.js new file mode 100644 index 000000000..3a98f36a6 --- /dev/null +++ b/src/containers/Dialogs/SMSMessageDialog/SMSMessageForm.js @@ -0,0 +1,79 @@ +import React from 'react'; +import intl from 'react-intl-universal'; +import { Formik } from 'formik'; +import { omit } from 'lodash'; +import { Intent } from '@blueprintjs/core'; + +import { AppToaster } from 'components'; + +import SMSMessageFormContent from './SMSMessageFormContent'; +import { CreateSMSMessageFormSchema } from './SMSMessageForm.schema'; +import { useSMSMessageDialogContext } from './SMSMessageDialogProvider'; + +import withDialogActions from 'containers/Dialog/withDialogActions'; + +import { compose, transformToForm } from 'utils'; + +const defaultInitialValues = { + notification_key: '', + is_notification_enabled: '', + message_text: '', +}; + +/** + * SMS Message form. + */ +function SMSMessageForm({ + // #withDialogActions + closeDialog, +}) { + const { dialogName, smsNotification, editSMSNotificationMutate } = + useSMSMessageDialogContext(); + + // Initial form values. + const initialValues = { + ...defaultInitialValues, + ...transformToForm(smsNotification, defaultInitialValues), + notification_key: smsNotification.key, + message_text: smsNotification.sms_message, + }; + + // Handles the form submit. + const handleFormSubmit = (values, { setSubmitting, setErrors }) => { + const form = { + ...omit(values, ['is_notification_enabled', 'sms_message']), + notification_key: smsNotification.key, + }; + + // Handle request response success. + const onSuccess = (response) => { + AppToaster.show({ + message: intl.get('sms_message.dialog.success_message'), + intent: Intent.SUCCESS, + }); + closeDialog(dialogName); + }; + + // Handle request response errors. + const onError = ({ + response: { + data: { errors }, + }, + }) => { + setSubmitting(false); + }; + + editSMSNotificationMutate(form).then(onSuccess).catch(onError); + }; + + return ( + + ); +} + +export default compose(withDialogActions)(SMSMessageForm); diff --git a/src/containers/Dialogs/SMSMessageDialog/SMSMessageForm.schema.js b/src/containers/Dialogs/SMSMessageDialog/SMSMessageForm.schema.js new file mode 100644 index 000000000..441e73381 --- /dev/null +++ b/src/containers/Dialogs/SMSMessageDialog/SMSMessageForm.schema.js @@ -0,0 +1,11 @@ +import * as Yup from 'yup'; +import intl from 'react-intl-universal'; +import { DATATYPES_LENGTH } from 'common/dataTypes'; + +const Schema = Yup.object().shape({ + notification_key: Yup.string().required(), + is_notification_enabled: Yup.boolean(), + message_text: Yup.string().min(3).max(DATATYPES_LENGTH.TEXT), +}); + +export const CreateSMSMessageFormSchema = Schema; diff --git a/src/containers/Dialogs/SMSMessageDialog/SMSMessageFormContent.js b/src/containers/Dialogs/SMSMessageDialog/SMSMessageFormContent.js new file mode 100644 index 000000000..52c417b24 --- /dev/null +++ b/src/containers/Dialogs/SMSMessageDialog/SMSMessageFormContent.js @@ -0,0 +1,17 @@ +import React from 'react'; +import { Form } from 'formik'; + +import SMSMessageFormFields from './SMSMessageFormFields'; +import SMSMessageFormFloatingActions from './SMSMessageFormFloatingActions'; + +/** + * SMS message form content. + */ +export default function SMSMessageFormContent() { + return ( +
+ + + + ); +} diff --git a/src/containers/Dialogs/SMSMessageDialog/SMSMessageFormFields.js b/src/containers/Dialogs/SMSMessageDialog/SMSMessageFormFields.js new file mode 100644 index 000000000..fd4c54c0c --- /dev/null +++ b/src/containers/Dialogs/SMSMessageDialog/SMSMessageFormFields.js @@ -0,0 +1,31 @@ +import React from 'react'; + +import { FastField, Field, ErrorMessage } from 'formik'; +import { Classes, FormGroup, TextArea } from '@blueprintjs/core'; +import { FormattedMessage as T, FieldRequiredHint } from 'components'; +import { inputIntent } from 'utils'; + +export default function SMSMessageFormFields() { + return ( +
+ {/* ----------- Message Text ----------- */} + + {({ field, meta: { error, touched } }) => ( + } + className={'form-group--message_text'} + intent={inputIntent({ error, touched })} + helperText={} + > +