@bigbinary/neeto-message-templates-frontend 0.0.8 → 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -78,6 +78,8 @@ yarn add @bigbinary/neeto-message-templates-frontend
78
78
 
79
79
  - `type`: Type can be `email`, `sms` or `whatsapp`.
80
80
 
81
+ - `templateVariables`: (optional) To add dynamic variables to form body field.
82
+
81
83
  ### Usage
82
84
 
83
85
  ```javascript
@@ -96,12 +98,20 @@ const App = () => {
96
98
  //api call
97
99
  };
98
100
 
101
+ const TEMPLATE_VARIABLES = [
102
+ {
103
+ key: "name",
104
+ label: "Name",
105
+ },
106
+ ];
107
+
99
108
  return (
100
109
  <MessageTemplates
101
110
  shouldIncludeTestTemplate
102
111
  breadcrumbs={breadcrumbs}
103
112
  handleSubmitTestTemplate={handleSubmit}
104
113
  isTestMessageLoading={isTestMessageLoading}
114
+ templateVariables={TEMPLATE_VARIABLES}
105
115
  type={type}
106
116
  />
107
117
  );
@@ -129,6 +139,8 @@ const App = () => {
129
139
  - `customFieldsValidationSchema`: (optional) To provide validation schema for
130
140
  the custom fields.
131
141
 
142
+ - `templateVariables`: (optional) To add dynamic variables to form body field.
143
+
132
144
  ### Usage
133
145
 
134
146
  ```js
package/dist/index.cjs.js CHANGED
@@ -5280,6 +5280,7 @@ var template = {
5280
5280
  search: "Search {{what}}",
5281
5281
  markAsActive: "Mark as active",
5282
5282
  markAsInactive: "Mark as inactive",
5283
+ close: "Close",
5283
5284
  "delete": "Delete",
5284
5285
  edit: "Edit",
5285
5286
  saveChanges: "Save changes",
@@ -5303,13 +5304,16 @@ var template = {
5303
5304
  sendTestEmail: "Send test email",
5304
5305
  sendTestSms: "Send test sms",
5305
5306
  filtersEmptyState: "There are no {{type}} to show for applied filters.",
5307
+ preview: "Template Preview",
5308
+ resolveVariable: "Resolve {{type}} variables",
5306
5309
  validation: {
5307
5310
  namePresence: "Name is required",
5308
5311
  subjectPresence: "Subject is required",
5309
5312
  bodyPresence: "Body is required",
5310
5313
  emailAddressPresence: "Email address is required",
5311
5314
  emailAddressFormatValidation: "Invalid email address",
5312
- validPhoneNumber: "Enter valid phone number"
5315
+ validPhoneNumber: "Enter valid phone number",
5316
+ variablePresence: "Variable should not be empty"
5313
5317
  }
5314
5318
  };
5315
5319
  var sendMessage = {
@@ -5401,10 +5405,6 @@ var MESSAGE_TEMPLATES = {
5401
5405
  }
5402
5406
  };
5403
5407
  var DEFAULT_EDITOR_ROW_COUNT = 15;
5404
- var TEMPLATE_VARIABLES = [{
5405
- key: "name",
5406
- label: t$1("template.name")
5407
- }];
5408
5408
 
5409
5409
  var MESSAGE_TEMPLATE_INITIAL_STATE = {
5410
5410
  isOpen: false,
@@ -6090,7 +6090,7 @@ var TestMessage = function TestMessage(_ref) {
6090
6090
 
6091
6091
  function ownKeys$2(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
6092
6092
  function _objectSpread$2(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys$2(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys$2(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
6093
- var Form$1 = function Form(_ref) {
6093
+ var Form = function Form(_ref) {
6094
6094
  var onClose = _ref.onClose,
6095
6095
  isEdit = _ref.isEdit,
6096
6096
  _ref$template = _ref.template,
@@ -6099,7 +6099,8 @@ var Form$1 = function Form(_ref) {
6099
6099
  setInitialFocusField = _ref.setInitialFocusField,
6100
6100
  handleSubmitTestTemplate = _ref.handleSubmitTestTemplate,
6101
6101
  isTestMessageLoading = _ref.isTestMessageLoading,
6102
- shouldIncludeTestTemplate = _ref.shouldIncludeTestTemplate;
6102
+ shouldIncludeTestTemplate = _ref.shouldIncludeTestTemplate,
6103
+ templateVariables = _ref.templateVariables;
6103
6104
  var _useTranslation = useTranslation(),
6104
6105
  t = _useTranslation.t;
6105
6106
  var editorRef = React.useRef(null);
@@ -6161,7 +6162,7 @@ var Form$1 = function Form(_ref) {
6161
6162
  name: "body",
6162
6163
  ref: editorRef,
6163
6164
  rows: DEFAULT_EDITOR_ROW_COUNT,
6164
- variables: TEMPLATE_VARIABLES
6165
+ variables: templateVariables
6165
6166
  }), isTestTemplateVisible && /*#__PURE__*/React__default["default"].createElement(TestMessage, {
6166
6167
  handleSubmitTestTemplate: handleSubmitTestTemplate,
6167
6168
  isEmailTemplate: isEmailTemplate,
@@ -6190,7 +6191,8 @@ var AddEdit = function AddEdit(_ref) {
6190
6191
  handleSubmitTestTemplate = _ref.handleSubmitTestTemplate,
6191
6192
  shouldIncludeTestTemplate = _ref.shouldIncludeTestTemplate,
6192
6193
  addText = _ref.addText,
6193
- editText = _ref.editText;
6194
+ editText = _ref.editText,
6195
+ templateVariables = _ref.templateVariables;
6194
6196
  var initialFocusField = React.useRef();
6195
6197
  var setInitialFocusField = function setInitialFocusField(fieldRef) {
6196
6198
  return initialFocusField.current = fieldRef;
@@ -6206,7 +6208,7 @@ var AddEdit = function AddEdit(_ref) {
6206
6208
  }, /*#__PURE__*/React__default["default"].createElement(neetoui.Pane.Header, null, /*#__PURE__*/React__default["default"].createElement(neetoui.Typography, {
6207
6209
  style: "h2",
6208
6210
  weight: "semibold"
6209
- }, label)), /*#__PURE__*/React__default["default"].createElement(neetoui.Pane.Body, null, /*#__PURE__*/React__default["default"].createElement(Form$1, {
6211
+ }, label)), /*#__PURE__*/React__default["default"].createElement(neetoui.Pane.Body, null, /*#__PURE__*/React__default["default"].createElement(Form, {
6210
6212
  createUpdateTemplate: createUpdateTemplate,
6211
6213
  handleSubmitTestTemplate: handleSubmitTestTemplate,
6212
6214
  isEdit: isEdit,
@@ -6214,6 +6216,7 @@ var AddEdit = function AddEdit(_ref) {
6214
6216
  setInitialFocusField: setInitialFocusField,
6215
6217
  shouldIncludeTestTemplate: shouldIncludeTestTemplate,
6216
6218
  template: template,
6219
+ templateVariables: templateVariables,
6217
6220
  onClose: onClose
6218
6221
  })));
6219
6222
  };
@@ -6379,7 +6382,9 @@ var MessageTemplates = function MessageTemplates(_ref) {
6379
6382
  _ref$isTestMessageLoa = _ref.isTestMessageLoading,
6380
6383
  isTestMessageLoading = _ref$isTestMessageLoa === void 0 ? false : _ref$isTestMessageLoa,
6381
6384
  _ref$shouldIncludeTes = _ref.shouldIncludeTestTemplate,
6382
- shouldIncludeTestTemplate = _ref$shouldIncludeTes === void 0 ? true : _ref$shouldIncludeTes;
6385
+ shouldIncludeTestTemplate = _ref$shouldIncludeTes === void 0 ? true : _ref$shouldIncludeTes,
6386
+ _ref$templateVariable = _ref.templateVariables,
6387
+ templateVariables = _ref$templateVariable === void 0 ? {} : _ref$templateVariable;
6383
6388
  var _useState = React.useState(MESSAGE_TEMPLATE_INITIAL_STATE),
6384
6389
  _useState2 = _slicedToArray(_useState, 2),
6385
6390
  manageTemplatePane = _useState2[0],
@@ -6466,6 +6471,7 @@ var MessageTemplates = function MessageTemplates(_ref) {
6466
6471
  isTestMessageLoading: isTestMessageLoading,
6467
6472
  manageTemplatePane: manageTemplatePane,
6468
6473
  shouldIncludeTestTemplate: shouldIncludeTestTemplate,
6474
+ templateVariables: templateVariables,
6469
6475
  onClose: function onClose() {
6470
6476
  return setManageTemplatePane(ramda.assoc("isOpen", false));
6471
6477
  }
@@ -6473,13 +6479,13 @@ var MessageTemplates = function MessageTemplates(_ref) {
6473
6479
  };
6474
6480
  var index$1 = withReactQuery(MessageTemplates);
6475
6481
 
6482
+ var formatEditorContent = function formatEditorContent(value) {
6483
+ return value === null || value === void 0 ? void 0 : value.replaceAll(/<\/?(?!img)\w*\b[^>]*>/gi, "").trim();
6484
+ };
6476
6485
  var SEND_MESSAGE_INITIAL_VALUES = {
6477
6486
  subject: "",
6478
6487
  body: ""
6479
6488
  };
6480
- var formatEditorContent = function formatEditorContent(value) {
6481
- return value === null || value === void 0 ? void 0 : value.replaceAll(/<\/?(?!img)\w*\b[^>]*>/gi, "").trim();
6482
- };
6483
6489
  var EMAIL_MESSAGE_FORM_SCHEMA = yup__namespace.object().shape({
6484
6490
  subject: yup__namespace.string().trim().required(t$1("template.validation.subjectPresence")),
6485
6491
  body: yup__namespace.string().test("body", t$1("template.validation.bodyPresence"), function (value) {
@@ -6491,15 +6497,21 @@ var SMS_MESSAGE_FORM_VALIDATION_SCHEMA = yup__namespace.object().shape({
6491
6497
  return !!formatEditorContent(value);
6492
6498
  })
6493
6499
  });
6500
+ var WHATSAPP_MESSAGE_FORM_VALIDATIONS_SCHEMA = yup__namespace.object().shape({
6501
+ variableContents: yup__namespace.object().shape({
6502
+ body: yup__namespace.array().of(yup__namespace.string().required(t$1("template.validation.variablePresence")))
6503
+ })
6504
+ });
6494
6505
 
6495
6506
  function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
6496
6507
  function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
6497
- var Form = function Form(_ref) {
6508
+ var EmailAndSms = function EmailAndSms(_ref) {
6498
6509
  var isEmailTemplate = _ref.isEmailTemplate,
6499
6510
  onClose = _ref.onClose,
6500
6511
  templates = _ref.templates,
6501
6512
  handleSubmit = _ref.handleSubmit,
6502
6513
  setInitialFocusField = _ref.setInitialFocusField,
6514
+ templateVariables = _ref.templateVariables,
6503
6515
  customFields = _ref.customFields,
6504
6516
  customFieldsInitialValues = _ref.customFieldsInitialValues,
6505
6517
  customFieldsValidationSchema = _ref.customFieldsValidationSchema;
@@ -6565,7 +6577,7 @@ var Form = function Form(_ref) {
6565
6577
  name: "body",
6566
6578
  ref: editorRef,
6567
6579
  rows: DEFAULT_EDITOR_ROW_COUNT,
6568
- variables: TEMPLATE_VARIABLES
6580
+ variables: templateVariables
6569
6581
  }), /*#__PURE__*/React__default["default"].createElement(neetoui.Pane.Footer, {
6570
6582
  className: "absolute bottom-0 left-0 flex gap-x-2"
6571
6583
  }, /*#__PURE__*/React__default["default"].createElement(neetoui.Button, {
@@ -6582,6 +6594,125 @@ var Form = function Form(_ref) {
6582
6594
  });
6583
6595
  };
6584
6596
 
6597
+ var Whatsapp = function Whatsapp(_ref) {
6598
+ var _templates$, _templates$2, _templates$3, _templates$4;
6599
+ var templates = _ref.templates,
6600
+ onClose = _ref.onClose,
6601
+ handleSubmit = _ref.handleSubmit;
6602
+ var _useTranslation = useTranslation(),
6603
+ t = _useTranslation.t;
6604
+ var getInitialVariableComponents = function getInitialVariableComponents(variables) {
6605
+ var initialComponents = {};
6606
+ variables.forEach(function (_ref2) {
6607
+ var type = _ref2.type,
6608
+ count = _ref2.count;
6609
+ initialComponents[type] = Array(count).fill("");
6610
+ });
6611
+ return initialComponents;
6612
+ };
6613
+ var getTemplateMessage = function getTemplateMessage(components) {
6614
+ return pure.nullSafe(ramda.pluck)("text", components).join("\n");
6615
+ };
6616
+ if (ramda.isEmpty(templates)) {
6617
+ return /*#__PURE__*/React__default["default"].createElement(React__default["default"].Fragment, null, /*#__PURE__*/React__default["default"].createElement(neetoui.Typography, null, t("template.emptyState", {
6618
+ type: t("template.whatsappTemplates")
6619
+ })), /*#__PURE__*/React__default["default"].createElement(neetoui.Pane.Footer, {
6620
+ className: "absolute bottom-0 left-0"
6621
+ }, /*#__PURE__*/React__default["default"].createElement(neetoui.Button, {
6622
+ label: t("template.close"),
6623
+ onClick: onClose
6624
+ })));
6625
+ }
6626
+ var initialFormValues = {
6627
+ selectedTemplate: {
6628
+ label: (_templates$ = templates[0]) === null || _templates$ === void 0 ? void 0 : _templates$.name,
6629
+ value: (_templates$2 = templates[0]) === null || _templates$2 === void 0 ? void 0 : _templates$2.id
6630
+ },
6631
+ templateMessage: getTemplateMessage((_templates$3 = templates[0]) === null || _templates$3 === void 0 ? void 0 : _templates$3.components),
6632
+ variableContents: getInitialVariableComponents((_templates$4 = templates[0]) === null || _templates$4 === void 0 ? void 0 : _templates$4.variableCount)
6633
+ };
6634
+ return /*#__PURE__*/React__default["default"].createElement(formik$1.Form, {
6635
+ formProps: {
6636
+ noValidate: true,
6637
+ className: "flex w-full flex-col gap-y-4 pb-6"
6638
+ },
6639
+ formikProps: {
6640
+ initialValues: initialFormValues,
6641
+ validationSchema: WHATSAPP_MESSAGE_FORM_VALIDATIONS_SCHEMA,
6642
+ onSubmit: handleSubmit
6643
+ }
6644
+ }, function (_ref3) {
6645
+ var dirty = _ref3.dirty,
6646
+ isSubmitting = _ref3.isSubmitting,
6647
+ values = _ref3.values,
6648
+ setValues = _ref3.setValues;
6649
+ var handleTemplateChange = function handleTemplateChange(value) {
6650
+ if (!value) return;
6651
+ var template = pure.findBy({
6652
+ id: value === null || value === void 0 ? void 0 : value.value
6653
+ }, templates);
6654
+ setValues({
6655
+ selectedTemplate: {
6656
+ label: template.name,
6657
+ value: template.id
6658
+ },
6659
+ templateMessage: getTemplateMessage(template.components),
6660
+ variableContents: getInitialVariableComponents(template.variableCount)
6661
+ });
6662
+ };
6663
+ return /*#__PURE__*/React__default["default"].createElement(React__default["default"].Fragment, null, /*#__PURE__*/React__default["default"].createElement(formik$1.Select, {
6664
+ required: true,
6665
+ defaultValue: initialFormValues.selectedTemplate,
6666
+ label: t("template.title"),
6667
+ name: "selectedTemplate",
6668
+ options: templates.map(function (_ref4) {
6669
+ var name = _ref4.name,
6670
+ id = _ref4.id;
6671
+ return {
6672
+ label: name,
6673
+ value: id
6674
+ };
6675
+ }),
6676
+ onChange: handleTemplateChange
6677
+ }), /*#__PURE__*/React__default["default"].createElement(neetoui.Textarea, {
6678
+ disabled: true,
6679
+ nakedTextarea: true,
6680
+ label: t("template.preview"),
6681
+ value: values.templateMessage
6682
+ }), pure.isNotEmpty(values.variableContents) && /*#__PURE__*/React__default["default"].createElement(React__default["default"].Fragment, null, Object.keys(values.variableContents).map(function (group) {
6683
+ return /*#__PURE__*/React__default["default"].createElement("div", {
6684
+ className: "flex flex-col gap-y-2",
6685
+ key: group
6686
+ }, /*#__PURE__*/React__default["default"].createElement(neetoui.Typography, {
6687
+ style: "h4"
6688
+ }, t("template.resolveVariable", {
6689
+ type: pure.capitalize(group)
6690
+ })), values.variableContents[group].map(function (_, index) {
6691
+ return /*#__PURE__*/React__default["default"].createElement("div", {
6692
+ key: "".concat(group, "-").concat(index)
6693
+ }, /*#__PURE__*/React__default["default"].createElement(formik$1.Input, {
6694
+ required: true,
6695
+ key: "".concat(group, "-").concat(index),
6696
+ label: "{{".concat(index + 1, "}}"),
6697
+ name: "variableContents.".concat(group, ".").concat(index)
6698
+ }));
6699
+ }));
6700
+ })), /*#__PURE__*/React__default["default"].createElement(neetoui.Pane.Footer, {
6701
+ className: "absolute bottom-0 left-0 flex gap-x-2"
6702
+ }, /*#__PURE__*/React__default["default"].createElement(formik$1.Button, {
6703
+ disabled: !dirty || isSubmitting,
6704
+ label: t("template.saveChanges"),
6705
+ loading: isSubmitting,
6706
+ type: "submit"
6707
+ }), /*#__PURE__*/React__default["default"].createElement(formik$1.Button, {
6708
+ label: t("template.cancel"),
6709
+ style: "text",
6710
+ type: "reset",
6711
+ onClick: onClose
6712
+ })));
6713
+ });
6714
+ };
6715
+
6585
6716
  var SendMessagePane = function SendMessagePane(_ref) {
6586
6717
  var _ref$isOpen = _ref.isOpen,
6587
6718
  isOpen = _ref$isOpen === void 0 ? false : _ref$isOpen,
@@ -6596,7 +6727,9 @@ var SendMessagePane = function SendMessagePane(_ref) {
6596
6727
  _ref$customFieldsInit = _ref.customFieldsInitialValues,
6597
6728
  customFieldsInitialValues = _ref$customFieldsInit === void 0 ? {} : _ref$customFieldsInit,
6598
6729
  _ref$customFieldsVali = _ref.customFieldsValidationSchema,
6599
- customFieldsValidationSchema = _ref$customFieldsVali === void 0 ? {} : _ref$customFieldsVali;
6730
+ customFieldsValidationSchema = _ref$customFieldsVali === void 0 ? {} : _ref$customFieldsVali,
6731
+ _ref$templateVariable = _ref.templateVariables,
6732
+ templateVariables = _ref$templateVariable === void 0 ? {} : _ref$templateVariable;
6600
6733
  var _useTranslation = useTranslation(),
6601
6734
  t = _useTranslation.t;
6602
6735
  var initialFocusField = React.useRef();
@@ -6614,6 +6747,7 @@ var SendMessagePane = function SendMessagePane(_ref) {
6614
6747
  _useFetchTemplates$da3 = _useFetchTemplates$da2.templates,
6615
6748
  templates = _useFetchTemplates$da3 === void 0 ? [] : _useFetchTemplates$da3;
6616
6749
  var isEmailTemplate = type === "email";
6750
+ var isWhatsappTemplate = type === "whatsapp";
6617
6751
  return /*#__PURE__*/React__default["default"].createElement(neetoui.Pane, {
6618
6752
  initialFocusRef: initialFocusField,
6619
6753
  isOpen: isOpen,
@@ -6621,13 +6755,18 @@ var SendMessagePane = function SendMessagePane(_ref) {
6621
6755
  }, /*#__PURE__*/React__default["default"].createElement(neetoui.Pane.Header, null, /*#__PURE__*/React__default["default"].createElement(neetoui.Typography, {
6622
6756
  style: "h2",
6623
6757
  weight: "semibold"
6624
- }, t("common.send"), " ", type)), /*#__PURE__*/React__default["default"].createElement(neetoui.Pane.Body, null, /*#__PURE__*/React__default["default"].createElement(Form, {
6758
+ }, t("common.send"), " ", type)), /*#__PURE__*/React__default["default"].createElement(neetoui.Pane.Body, null, isWhatsappTemplate ? /*#__PURE__*/React__default["default"].createElement(Whatsapp, {
6759
+ handleSubmit: handleSubmit,
6760
+ templates: templates,
6761
+ onClose: onClose
6762
+ }) : /*#__PURE__*/React__default["default"].createElement(EmailAndSms, {
6625
6763
  customFields: customFields,
6626
6764
  customFieldsInitialValues: customFieldsInitialValues,
6627
6765
  customFieldsValidationSchema: customFieldsValidationSchema,
6628
6766
  handleSubmit: handleSubmit,
6629
6767
  isEmailTemplate: isEmailTemplate,
6630
6768
  setInitialFocusField: setInitialFocusField,
6769
+ templateVariables: templateVariables,
6631
6770
  templates: templates,
6632
6771
  onClose: onClose
6633
6772
  })));