From 46f6380fe6098b35c41af0bde4228e5d0197a820 Mon Sep 17 00:00:00 2001
From: elforjani13 <39470382+elforjani13@users.noreply.github.com>
Date: Thu, 4 Nov 2021 15:46:14 +0200
Subject: [PATCH] feat: add notify via SMS.
---
src/components/DialogsContainer.js | 2 +
.../NotifyContactViaSMSContent.js | 19 +++++
.../NotifyContactViaSMSForm.js | 47 +++++++++++
.../NotifyContactViaSMSForm.schema.js | 11 +++
.../NotifyContactViaSMSFormContent.js | 16 ++++
.../NotifyContactViaSMSFormFields.js | 79 +++++++++++++++++++
.../NotifyContactViaSMSFormFloatingActions.js | 45 +++++++++++
.../NotifyContactViaSMSFormProvider.js | 33 ++++++++
.../NotifyContactViaSMSDialog/index.js | 32 ++++++++
.../InvoiceDetailActionsBar.js | 11 ++-
.../Drawers/InvoiceDetailDrawer/utils.js | 13 ++-
.../NotifyConactViaSMSDialog.scss | 32 ++++++++
12 files changed, 335 insertions(+), 5 deletions(-)
create mode 100644 src/containers/Dialogs/NotifyContactViaSMSDialog/NotifyContactViaSMSContent.js
create mode 100644 src/containers/Dialogs/NotifyContactViaSMSDialog/NotifyContactViaSMSForm.js
create mode 100644 src/containers/Dialogs/NotifyContactViaSMSDialog/NotifyContactViaSMSForm.schema.js
create mode 100644 src/containers/Dialogs/NotifyContactViaSMSDialog/NotifyContactViaSMSFormContent.js
create mode 100644 src/containers/Dialogs/NotifyContactViaSMSDialog/NotifyContactViaSMSFormFields.js
create mode 100644 src/containers/Dialogs/NotifyContactViaSMSDialog/NotifyContactViaSMSFormFloatingActions.js
create mode 100644 src/containers/Dialogs/NotifyContactViaSMSDialog/NotifyContactViaSMSFormProvider.js
create mode 100644 src/containers/Dialogs/NotifyContactViaSMSDialog/index.js
create mode 100644 src/style/pages/NotifyConactViaSMS/NotifyConactViaSMSDialog.scss
diff --git a/src/components/DialogsContainer.js b/src/components/DialogsContainer.js
index 1a31006dc..1530c5cf7 100644
--- a/src/components/DialogsContainer.js
+++ b/src/components/DialogsContainer.js
@@ -20,6 +20,7 @@ import ReceiptPdfPreviewDialog from '../containers/Dialogs/ReceiptPdfPreviewDial
import MoneyInDialog from '../containers/Dialogs/MoneyInDialog';
import MoneyOutDialog from '../containers/Dialogs/MoneyOutDialog';
import BadDebtDialog from '../containers/Dialogs/BadDebtDialog';
+import NotifyContactViaSMSDialog from '../containers/Dialogs/NotifyContactViaSMSDialog';
/**
* Dialogs container.
@@ -45,6 +46,7 @@ export default function DialogsContainer() {
+
);
diff --git a/src/containers/Dialogs/NotifyContactViaSMSDialog/NotifyContactViaSMSContent.js b/src/containers/Dialogs/NotifyContactViaSMSDialog/NotifyContactViaSMSContent.js
new file mode 100644
index 000000000..59f725294
--- /dev/null
+++ b/src/containers/Dialogs/NotifyContactViaSMSDialog/NotifyContactViaSMSContent.js
@@ -0,0 +1,19 @@
+import React from 'react';
+
+import '../../../style/pages/NotifyConactViaSMS/NotifyConactViaSMSDialog.scss';
+import { NotifyContactViaSMSFormProvider } from './NotifyContactViaSMSFormProvider';
+import NotifyContactViaSMSForm from './NotifyContactViaSMSForm';
+
+/**
+ * Notify contact via SMS.
+ */
+export default function NotifyContactViaSMSContent({
+ // #ownProps
+ dialogName,
+}) {
+ return (
+
+
+
+ );
+}
diff --git a/src/containers/Dialogs/NotifyContactViaSMSDialog/NotifyContactViaSMSForm.js b/src/containers/Dialogs/NotifyContactViaSMSDialog/NotifyContactViaSMSForm.js
new file mode 100644
index 000000000..56b49508f
--- /dev/null
+++ b/src/containers/Dialogs/NotifyContactViaSMSDialog/NotifyContactViaSMSForm.js
@@ -0,0 +1,47 @@
+import React from 'react';
+import intl from 'react-intl-universal';
+
+import { Formik } from 'formik';
+import { Intent } from '@blueprintjs/core';
+
+import { AppToaster } from 'components';
+import { CreateNotifyContactViaSMSFormSchema } from './NotifyContactViaSMSForm.schema';
+
+import NotifyContactViaSMSFormContent from './NotifyContactViaSMSFormContent';
+
+import withDialogActions from 'containers/Dialog/withDialogActions';
+
+import { useNotifyContactViaSMSContext } from './NotifyContactViaSMSFormProvider';
+
+import { compose } from 'utils';
+
+const defaultInitialValues = {
+ name: '',
+ phone: '',
+ note: '',
+};
+
+function NotifyContactViaSMSForm({
+ // #withDialogActions
+ closeDialog,
+}) {
+ const { dialogName } = useNotifyContactViaSMSContext();
+
+ // Initial form values
+ const initialValues = {
+ ...defaultInitialValues,
+ };
+
+ // Handles the form submit.
+ const handleFormSubmit = (values, { setSubmitting, setErrors }) => {};
+
+ return (
+
+ );
+}
+export default compose(withDialogActions)(NotifyContactViaSMSForm);
diff --git a/src/containers/Dialogs/NotifyContactViaSMSDialog/NotifyContactViaSMSForm.schema.js b/src/containers/Dialogs/NotifyContactViaSMSDialog/NotifyContactViaSMSForm.schema.js
new file mode 100644
index 000000000..694f1e73c
--- /dev/null
+++ b/src/containers/Dialogs/NotifyContactViaSMSDialog/NotifyContactViaSMSForm.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({
+ customer_id: Yup.string().required(),
+ phone: Yup.number().required(),
+ note: Yup.string().required().trim().max(DATATYPES_LENGTH.TEXT),
+});
+
+export const CreateNotifyContactViaSMSFormSchema = Schema;
diff --git a/src/containers/Dialogs/NotifyContactViaSMSDialog/NotifyContactViaSMSFormContent.js b/src/containers/Dialogs/NotifyContactViaSMSDialog/NotifyContactViaSMSFormContent.js
new file mode 100644
index 000000000..336306f34
--- /dev/null
+++ b/src/containers/Dialogs/NotifyContactViaSMSDialog/NotifyContactViaSMSFormContent.js
@@ -0,0 +1,16 @@
+import React from 'react';
+import { Form } from 'formik';
+
+import NotifyContactViaSMSFormFields from './NotifyContactViaSMSFormFields';
+import NotifyContactViaSMSFormFloatingActions from './NotifyContactViaSMSFormFloatingActions';
+/**
+ * Nofity contact via SMS form content.
+ */
+export default function NotifyContactViaSMSFormContent() {
+ return (
+
+ );
+}
diff --git a/src/containers/Dialogs/NotifyContactViaSMSDialog/NotifyContactViaSMSFormFields.js b/src/containers/Dialogs/NotifyContactViaSMSDialog/NotifyContactViaSMSFormFields.js
new file mode 100644
index 000000000..ca0cf59c8
--- /dev/null
+++ b/src/containers/Dialogs/NotifyContactViaSMSDialog/NotifyContactViaSMSFormFields.js
@@ -0,0 +1,79 @@
+import React from 'react';
+import { FastField, ErrorMessage } from 'formik';
+import { FormattedMessage as T } from 'components';
+
+import { useAutofocus } from 'hooks';
+import {
+ Classes,
+ FormGroup,
+ TextArea,
+ Intent,
+ InputGroup,
+} from '@blueprintjs/core';
+import classNames from 'classnames';
+import { CLASSES } from 'common/classes';
+import { inputIntent } from 'utils';
+import { FieldRequiredHint } from 'components';
+
+import { useNotifyContactViaSMSContext } from './NotifyContactViaSMSFormProvider';
+
+/**
+ * Notify contact via SMS fields.
+ */
+function NotifyContactViaSMSFormFields() {
+ return (
+
+ {/* ----------- Send Notification to ----------- */}
+
+ {({ form, field, meta: { error, touched } }) => (
+ }
+ className={classNames('form-group--customer-name', CLASSES.FILL)}
+ labelInfo={}
+ intent={inputIntent({ error, touched })}
+ helperText={}
+ >
+
+
+ )}
+
+
+ {/* ----------- Phone number ----------- */}
+
+ {({ form, field, meta: { error, touched } }) => (
+ }
+ labelInfo={}
+ intent={inputIntent({ error, touched })}
+ helperText={}
+ className={classNames('form-group--phone', CLASSES.FILL)}
+ >
+
+
+ )}
+
+
+ {/* ----------- Message Text ----------- */}
+
+ {({ field, meta: { error, touched } }) => (
+ }
+ labelInfo={}
+ className={'form-group--note'}
+ intent={inputIntent({ error, touched })}
+ helperText={}
+ >
+
+
+ )}
+
+
+ );
+}
+
+export default NotifyContactViaSMSFormFields;
diff --git a/src/containers/Dialogs/NotifyContactViaSMSDialog/NotifyContactViaSMSFormFloatingActions.js b/src/containers/Dialogs/NotifyContactViaSMSDialog/NotifyContactViaSMSFormFloatingActions.js
new file mode 100644
index 000000000..8b785bbf1
--- /dev/null
+++ b/src/containers/Dialogs/NotifyContactViaSMSDialog/NotifyContactViaSMSFormFloatingActions.js
@@ -0,0 +1,45 @@
+import React from 'react';
+import { Intent, Button, Classes } from '@blueprintjs/core';
+import { useFormikContext } from 'formik';
+import { FormattedMessage as T } from 'components';
+
+import { useNotifyContactViaSMSContext } from './NotifyContactViaSMSFormProvider';
+import withDialogActions from 'containers/Dialog/withDialogActions';
+import { compose } from 'utils';
+
+function NotifyContactViaSMSFormFloatingActions({
+ // #withDialogActions
+ closeDialog,
+}) {
+ // Formik context.
+ const { isSubmitting } = useFormikContext();
+
+ const { dialogName } = useNotifyContactViaSMSContext();
+
+ // Handle close button click.
+ const handleCancelBtnClick = () => {
+ closeDialog(dialogName);
+ };
+
+ return (
+
+ );
+}
+
+export default compose(withDialogActions)(
+ NotifyContactViaSMSFormFloatingActions,
+);
diff --git a/src/containers/Dialogs/NotifyContactViaSMSDialog/NotifyContactViaSMSFormProvider.js b/src/containers/Dialogs/NotifyContactViaSMSDialog/NotifyContactViaSMSFormProvider.js
new file mode 100644
index 000000000..4cdfa1d2e
--- /dev/null
+++ b/src/containers/Dialogs/NotifyContactViaSMSDialog/NotifyContactViaSMSFormProvider.js
@@ -0,0 +1,33 @@
+import React from 'react';
+import { DialogContent } from 'components';
+import { useCustomers } from 'hooks/query';
+
+const NotifyContactViaSMSContext = React.createContext();
+
+/**
+ * Notify contact via SMS provider.
+ */
+function NotifyContactViaSMSFormProvider({ dialogName, ...props }) {
+ // Fetches customers list.
+ const {
+ data: { customers },
+ isLoading: isCustomersLoading,
+ } = useCustomers();
+
+ // State provider.
+ const provider = {
+ dialogName,
+ customers,
+ };
+
+ return (
+
+
+
+ );
+}
+
+const useNotifyContactViaSMSContext = () =>
+ React.useContext(NotifyContactViaSMSContext);
+
+export { NotifyContactViaSMSFormProvider, useNotifyContactViaSMSContext };
diff --git a/src/containers/Dialogs/NotifyContactViaSMSDialog/index.js b/src/containers/Dialogs/NotifyContactViaSMSDialog/index.js
new file mode 100644
index 000000000..2c99a0985
--- /dev/null
+++ b/src/containers/Dialogs/NotifyContactViaSMSDialog/index.js
@@ -0,0 +1,32 @@
+import React from 'react';
+
+import { FormattedMessage as T } from 'components';
+import { Dialog, DialogSuspense } from 'components';
+import withDialogRedux from 'components/DialogReduxConnect';
+import { compose } from 'redux';
+
+const NotifyContactViaSMSDialogContent = React.lazy(() =>
+ import('./NotifyContactViaSMSContent'),
+);
+
+/**
+ * Notify contact via SMS.
+ */
+function NotifyContactViaSMSDialog({ dialogName, payload, isOpen }) {
+ return (
+
+ );
+}
+
+export default compose(withDialogRedux())(NotifyContactViaSMSDialog);
diff --git a/src/containers/Drawers/InvoiceDetailDrawer/InvoiceDetailActionsBar.js b/src/containers/Drawers/InvoiceDetailDrawer/InvoiceDetailActionsBar.js
index b83b8a6ed..5b5a7dd87 100644
--- a/src/containers/Drawers/InvoiceDetailDrawer/InvoiceDetailActionsBar.js
+++ b/src/containers/Drawers/InvoiceDetailDrawer/InvoiceDetailActionsBar.js
@@ -76,6 +76,10 @@ function InvoiceDetailActionsBar({
const handleBadDebtInvoice = () => {
openDialog('write-off-bad-debt', { invoiceId });
};
+ // Handle notify via SMS.
+ const handleNotifyViaSMS = () => {
+ openDialog('notify-via-sms', {});
+ };
// Handle cancele write-off invoice.
const handleCancelBadDebtInvoice = () => {
@@ -117,8 +121,11 @@ function InvoiceDetailActionsBar({
diff --git a/src/containers/Drawers/InvoiceDetailDrawer/utils.js b/src/containers/Drawers/InvoiceDetailDrawer/utils.js
index 26bd03fab..7fae12971 100644
--- a/src/containers/Drawers/InvoiceDetailDrawer/utils.js
+++ b/src/containers/Drawers/InvoiceDetailDrawer/utils.js
@@ -58,7 +58,10 @@ export const useInvoiceReadonlyEntriesColumns = () =>
[],
);
-export const BadDebtMenuItem = ({ invoice, onDialog, onAlert }) => {
+export const BadDebtMenuItem = ({
+ invoice,
+ payload: { onCancelBadDebt, onBadDebt, onNotifyViaSMS },
+}) => {
return (
{
}
- onClick={onDialog}
+ onClick={onBadDebt}
/>
}
/>
+ }
+ />
}
>
diff --git a/src/style/pages/NotifyConactViaSMS/NotifyConactViaSMSDialog.scss b/src/style/pages/NotifyConactViaSMS/NotifyConactViaSMSDialog.scss
new file mode 100644
index 000000000..27b7f2a8c
--- /dev/null
+++ b/src/style/pages/NotifyConactViaSMS/NotifyConactViaSMSDialog.scss
@@ -0,0 +1,32 @@
+.dialog--notify-vis-sms {
+ max-width: 350px;
+ max-height: 450px;
+
+ .bp3-dialog-body {
+ .bp3-form-group {
+ margin-bottom: 15px;
+ margin-top: 15px;
+
+ label.bp3-label {
+ margin-bottom: 3px;
+ font-size: 13px;
+ }
+ }
+
+ .form-group {
+ &--note {
+ .bp3-form-content {
+ textarea {
+ width: 100%;
+ min-width: 100%;
+ font-size: 14px;
+ }
+ }
+ }
+ }
+ }
+
+ .bp3-dialog-footer {
+ padding-top: 10px;
+ }
+}