@capillarytech/creatives-library 8.0.353-alpha.6 → 8.0.353

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.
Files changed (124) hide show
  1. package/constants/unified.js +0 -29
  2. package/package.json +1 -1
  3. package/services/tests/api.test.js +20 -35
  4. package/utils/commonUtils.js +1 -19
  5. package/v2Components/CapActionButton/constants.js +0 -7
  6. package/v2Components/CapActionButton/index.js +108 -166
  7. package/v2Components/CapActionButton/index.scss +6 -157
  8. package/v2Components/CapActionButton/messages.js +3 -19
  9. package/v2Components/CapActionButton/tests/index.test.js +17 -41
  10. package/v2Components/CapTagList/index.js +0 -10
  11. package/v2Components/CommonTestAndPreview/CustomValuesEditor.js +49 -72
  12. package/v2Components/CommonTestAndPreview/DeliverySettings/DeliverySettings.scss +2 -8
  13. package/v2Components/CommonTestAndPreview/DeliverySettings/ModifyDeliverySettings.js +21 -213
  14. package/v2Components/CommonTestAndPreview/DeliverySettings/constants.js +0 -16
  15. package/v2Components/CommonTestAndPreview/DeliverySettings/index.js +10 -85
  16. package/v2Components/CommonTestAndPreview/DeliverySettings/messages.js +0 -30
  17. package/v2Components/CommonTestAndPreview/DeliverySettings/utils/parseSenderDetailsResponse.js +11 -79
  18. package/v2Components/CommonTestAndPreview/SendTestMessage.js +5 -10
  19. package/v2Components/CommonTestAndPreview/UnifiedPreview/RcsPreviewContent.js +15 -157
  20. package/v2Components/CommonTestAndPreview/UnifiedPreview/_unifiedPreview.scss +76 -346
  21. package/v2Components/CommonTestAndPreview/UnifiedPreview/index.js +4 -133
  22. package/v2Components/CommonTestAndPreview/_commonTestAndPreview.scss +0 -11
  23. package/v2Components/CommonTestAndPreview/constants.js +2 -38
  24. package/v2Components/CommonTestAndPreview/index.js +186 -691
  25. package/v2Components/CommonTestAndPreview/messages.js +3 -45
  26. package/v2Components/CommonTestAndPreview/sagas.js +6 -25
  27. package/v2Components/CommonTestAndPreview/tests/CustomValuesEditor.test.js +284 -308
  28. package/v2Components/CommonTestAndPreview/tests/DeliverySettings/ModifyDeliverySettings.test.js +65 -231
  29. package/v2Components/CommonTestAndPreview/tests/DeliverySettings/index.test.js +5 -118
  30. package/v2Components/CommonTestAndPreview/tests/DeliverySettings/utils/parseSenderDetailsResponse.test.js +0 -341
  31. package/v2Components/CommonTestAndPreview/tests/PreviewSection.test.js +1 -8
  32. package/v2Components/CommonTestAndPreview/tests/SendTestMessage.test.js +13 -34
  33. package/v2Components/CommonTestAndPreview/tests/UnifiedPreview/RcsPreviewContent.test.js +283 -281
  34. package/v2Components/CommonTestAndPreview/tests/UnifiedPreview/index.test.js +1 -199
  35. package/v2Components/CommonTestAndPreview/tests/index.test.js +4 -132
  36. package/v2Components/CommonTestAndPreview/tests/sagas.test.js +26 -36
  37. package/v2Components/FormBuilder/index.js +168 -63
  38. package/v2Components/TemplatePreview/_templatePreview.scss +23 -38
  39. package/v2Components/TemplatePreview/index.js +31 -143
  40. package/v2Components/TemplatePreview/tests/index.test.js +0 -142
  41. package/v2Components/TestAndPreviewSlidebox/index.js +1 -13
  42. package/v2Components/TestAndPreviewSlidebox/sagas.js +4 -11
  43. package/v2Components/TestAndPreviewSlidebox/tests/saga.test.js +1 -3
  44. package/v2Containers/CreativesContainer/SlideBoxContent.js +4 -36
  45. package/v2Containers/CreativesContainer/SlideBoxFooter.js +1 -10
  46. package/v2Containers/CreativesContainer/SlideBoxHeader.js +4 -29
  47. package/v2Containers/CreativesContainer/constants.js +0 -9
  48. package/v2Containers/CreativesContainer/index.js +163 -346
  49. package/v2Containers/CreativesContainer/index.scss +1 -51
  50. package/v2Containers/CreativesContainer/tests/SlideBoxFooter.test.js +34 -78
  51. package/v2Containers/CreativesContainer/tests/SlideBoxHeader.test.js +16 -79
  52. package/v2Containers/CreativesContainer/tests/__snapshots__/SlideBoxContent.test.js.snap +0 -8
  53. package/v2Containers/CreativesContainer/tests/__snapshots__/SlideBoxHeader.test.js.snap +98 -357
  54. package/v2Containers/CreativesContainer/tests/__snapshots__/index.test.js.snap +15 -20
  55. package/v2Containers/CreativesContainer/tests/index.test.js +9 -71
  56. package/v2Containers/MobilePush/Create/test/saga.test.js +2 -2
  57. package/v2Containers/Rcs/constants.js +10 -119
  58. package/v2Containers/Rcs/index.js +818 -2450
  59. package/v2Containers/Rcs/index.scss +8 -280
  60. package/v2Containers/Rcs/messages.js +3 -34
  61. package/v2Containers/Rcs/tests/__snapshots__/index.test.js.snap +70073 -98018
  62. package/v2Containers/Rcs/tests/__snapshots__/utils.test.js.snap +5 -0
  63. package/v2Containers/Rcs/tests/index.test.js +121 -152
  64. package/v2Containers/Rcs/tests/mockData.js +0 -38
  65. package/v2Containers/Rcs/tests/utils.test.js +30 -646
  66. package/v2Containers/Rcs/utils.js +11 -478
  67. package/v2Containers/Sms/Create/index.js +40 -106
  68. package/v2Containers/SmsTrai/Create/index.js +4 -9
  69. package/v2Containers/SmsTrai/Edit/constants.js +0 -2
  70. package/v2Containers/SmsTrai/Edit/index.js +130 -640
  71. package/v2Containers/SmsTrai/Edit/messages.js +4 -14
  72. package/v2Containers/SmsTrai/Edit/tests/__snapshots__/index.test.js.snap +2296 -4249
  73. package/v2Containers/SmsWrapper/index.js +8 -37
  74. package/v2Containers/TagList/index.js +0 -6
  75. package/v2Containers/Templates/_templates.scss +9 -166
  76. package/v2Containers/Templates/actions.js +0 -11
  77. package/v2Containers/Templates/constants.js +0 -2
  78. package/v2Containers/Templates/index.js +52 -120
  79. package/v2Containers/Templates/sagas.js +12 -56
  80. package/v2Containers/Templates/tests/__snapshots__/index.test.js.snap +1017 -1062
  81. package/v2Containers/Templates/tests/sagas.test.js +16 -199
  82. package/v2Containers/TemplatesV2/TemplatesV2.style.js +1 -72
  83. package/v2Containers/TemplatesV2/index.js +23 -86
  84. package/v2Containers/WeChat/MapTemplates/test/saga.test.js +9 -9
  85. package/v2Containers/Whatsapp/index.js +20 -3
  86. package/v2Containers/Whatsapp/tests/__snapshots__/index.test.js.snap +34 -578
  87. package/utils/rcsPayloadUtils.js +0 -92
  88. package/utils/templateVarUtils.js +0 -201
  89. package/utils/tests/rcsPayloadUtils.test.js +0 -226
  90. package/utils/tests/templateVarUtils.test.js +0 -204
  91. package/v2Components/CommonTestAndPreview/previewApiUtils.js +0 -59
  92. package/v2Components/CommonTestAndPreview/tests/previewApiUtils.test.js +0 -67
  93. package/v2Components/SmsFallback/SmsFallbackLocalSelector.js +0 -91
  94. package/v2Components/SmsFallback/constants.js +0 -73
  95. package/v2Components/SmsFallback/index.js +0 -956
  96. package/v2Components/SmsFallback/index.scss +0 -265
  97. package/v2Components/SmsFallback/messages.js +0 -78
  98. package/v2Components/SmsFallback/smsFallbackUtils.js +0 -119
  99. package/v2Components/SmsFallback/tests/SmsFallbackLocalSelector.test.js +0 -50
  100. package/v2Components/SmsFallback/tests/rcsSmsFallback.acceptance.test.js +0 -147
  101. package/v2Components/SmsFallback/tests/smsFallbackHandlers.test.js +0 -304
  102. package/v2Components/SmsFallback/tests/smsFallbackUi.test.js +0 -223
  103. package/v2Components/SmsFallback/tests/smsFallbackUtils.test.js +0 -309
  104. package/v2Components/SmsFallback/tests/useLocalTemplateList.test.js +0 -422
  105. package/v2Components/SmsFallback/useLocalTemplateList.js +0 -92
  106. package/v2Components/TemplatePreview/constants.js +0 -2
  107. package/v2Components/VarSegmentMessageEditor/constants.js +0 -2
  108. package/v2Components/VarSegmentMessageEditor/index.js +0 -125
  109. package/v2Components/VarSegmentMessageEditor/index.scss +0 -46
  110. package/v2Containers/CreativesContainer/CreativesSlideBoxWrapper.js +0 -43
  111. package/v2Containers/CreativesContainer/embeddedSlideboxUtils.js +0 -79
  112. package/v2Containers/CreativesContainer/tests/SlideBoxContent.localTemplates.test.js +0 -90
  113. package/v2Containers/CreativesContainer/tests/embeddedSlideboxUtils.test.js +0 -258
  114. package/v2Containers/CreativesContainer/tests/useLocalTemplatesProp.test.js +0 -125
  115. package/v2Containers/Rcs/rcsLibraryHydrationUtils.js +0 -225
  116. package/v2Containers/Rcs/tests/rcsLibraryHydrationUtils.test.js +0 -318
  117. package/v2Containers/Sms/smsFormDataHelpers.js +0 -67
  118. package/v2Containers/Sms/tests/smsFormDataHelpers.test.js +0 -253
  119. package/v2Containers/SmsTrai/Edit/index.scss +0 -121
  120. package/v2Containers/Templates/TemplatesActionBar.js +0 -101
  121. package/v2Containers/Templates/tests/TemplatesActionBar.test.js +0 -120
  122. package/v2Containers/Templates/tests/smsTemplatesListApi.test.js +0 -180
  123. package/v2Containers/Templates/utils/smsTemplatesListApi.js +0 -79
  124. package/v2Containers/TemplatesV2/tests/TemplatesV2.localTemplates.test.js +0 -131
@@ -33,10 +33,6 @@ import injectReducer from '../../../utils/injectReducer';
33
33
  import v2SmsCreateReducer from './reducer';
34
34
  import * as globalActions from '../../Cap/actions';
35
35
  import TestAndPreviewSlidebox from '../../../v2Components/TestAndPreviewSlidebox';
36
- import {
37
- getSmsEmbeddedFooterValidity,
38
- getSmsMessageFromFormData,
39
- } from '../smsFormDataHelpers';
40
36
 
41
37
  export class Create extends React.Component { // eslint-disable-line react/prefer-stateless-function
42
38
  constructor(props) {
@@ -57,11 +53,6 @@ export class Create extends React.Component { // eslint-disable-line react/prefe
57
53
  isTestAndPreviewMode: false,
58
54
  pendingGetFormData: false,
59
55
  };
60
- // Tracks the last validity value reported to SmsFallback so componentDidUpdate
61
- // does not dispatch on every render and create an infinite update loop.
62
- // Intentionally undefined (not true) so the first render always reports the
63
- // real validity rather than assuming the form starts invalid.
64
- this._lastReportedSmsFooterInvalid = undefined;
65
56
  this.saveFormData = this.saveFormData.bind(this);
66
57
  this.onFormDataChange = this.onFormDataChange.bind(this);
67
58
  this.onTemplateNameChange = this.onTemplateNameChange.bind(this);
@@ -168,9 +159,7 @@ export class Create extends React.Component { // eslint-disable-line react/prefe
168
159
  layout: 'SMS',
169
160
  type: 'TAG',
170
161
  context: this.props.location.query.type === 'embedded' ? this.props.location.query.module : 'default',
171
- embedded: this.props.forceFullTagContext
172
- ? 'full'
173
- : (this.props.location.query.type === 'embedded' ? this.props.location.query.type : 'full'),
162
+ embedded: this.props.location.query.type === 'embedded' ? this.props.location.query.type : 'full',
174
163
  };
175
164
  if (this.props.getDefaultTags) {
176
165
  query.context = this.props.getDefaultTags;
@@ -183,28 +172,6 @@ export class Create extends React.Component { // eslint-disable-line react/prefe
183
172
  }
184
173
  }
185
174
 
186
- componentDidUpdate() {
187
- if (!this.props.embeddedSmsFallback || typeof this.props.onEmbeddedSmsFooterValidity !== 'function') {
188
- return;
189
- }
190
- const validity = getSmsEmbeddedFooterValidity(this.state.formData, this.state.tabCount);
191
- const isTemplateNameEmpty = !!validity.isTemplateNameEmpty;
192
- const isMessageEmpty = !!validity.isMessageEmpty;
193
- // Only dispatch when the validity tuple changes. Dispatching unconditionally caused
194
- // an infinite loop: componentDidUpdate → dispatch → SmsFallback re-render →
195
- // SmsCreate re-render → componentDidUpdate → ... even when state was unchanged.
196
- // Tracking both fields individually (not just the combined isInvalid flag) ensures
197
- // the parent receives an updated validity object when individual fields flip even
198
- // while the combined invalid state stays the same (e.g. true→true with different fields).
199
- if (
200
- this._lastReportedSmsFooterTemplateNameEmpty === isTemplateNameEmpty &&
201
- this._lastReportedSmsFooterMessageEmpty === isMessageEmpty
202
- ) return;
203
- this._lastReportedSmsFooterTemplateNameEmpty = isTemplateNameEmpty;
204
- this._lastReportedSmsFooterMessageEmpty = isMessageEmpty;
205
- this.props.onEmbeddedSmsFooterValidity(validity);
206
- }
207
-
208
175
  componentWillUnmount() {
209
176
  if (this.pendingGetFormDataTimeout) {
210
177
  clearTimeout(this.pendingGetFormDataTimeout);
@@ -308,10 +275,6 @@ export class Create extends React.Component { // eslint-disable-line react/prefe
308
275
  }
309
276
  const result = {};
310
277
  result.base = baseData;
311
- /* Root field used by FormBuilder; embedded getFormSubscriptionData reads value.base */
312
- if (formData['template-name'] !== undefined) {
313
- result.base['template-name'] = formData['template-name'];
314
- }
315
278
  if (this.state.isValid) {
316
279
  const msgObj = charCount.updateCharCount(baseData['sms-editor']);
317
280
  result.base.msg_count = msgObj.msgCount;
@@ -921,9 +884,7 @@ export class Create extends React.Component { // eslint-disable-line react/prefe
921
884
  layout: 'SMS',
922
885
  type: 'TAG',
923
886
  context: (data && data.toLowerCase() === 'all') ? 'default' : (data && data.toLowerCase()),
924
- embedded: this.props.forceFullTagContext
925
- ? 'full'
926
- : (this.props.location.query.type === 'embedded' ? this.props.location.query.type : 'full'),
887
+ embedded: this.props.location.query.type === 'embedded' ? this.props.location.query.type : 'full',
927
888
  };
928
889
  this.props.globalActions.fetchSchemaForEntity(query);
929
890
  }
@@ -931,29 +892,11 @@ export class Create extends React.Component { // eslint-disable-line react/prefe
931
892
  removeStandAlone() {
932
893
  const schema = _.cloneDeep(this.state.schema);
933
894
  const childSections = _.get(schema, 'standalone.sections[0].childSections');
934
- if (childSections) {
935
- /* In-form Save / Test row (index 2) only exists when the schema has > 2 sections. */
936
- if (childSections.length > 2) {
937
- childSections.splice(2, 1);
938
- }
939
- /*
940
- * Creatives library drops the standalone template-name block because `SlideBoxHeader`
941
- * shows the name. This is independent of the section count — guard it separately so
942
- * it still runs even when childSections.length <= 2 (e.g. schema arrives pre-trimmed).
943
- * RCS SMS fallback uses the same slidebox footer but keeps the name in the form.
944
- */
945
- if (!this.props.embeddedSmsFallback) {
946
- const fields = _.get(childSections, '[1].childSections[0].childSections');
947
- if (fields && fields.length > 0) {
948
- fields.splice(0, 1);
949
- _.set(childSections, '[1].childSections[0].childSections', fields);
950
- }
951
- }
952
- _.set(schema, 'standalone.sections[0].childSections', childSections);
953
- }
954
- // Always increment loadingStatus — isSmsLoading() requires >= 2 in library mode
955
- // (isFullMode=false). The early return previously skipped this, leaving the
956
- // spinner stuck forever when the schema had <= 2 childSections.
895
+ childSections.splice(2, 1);
896
+ const fields = _.get(childSections, '[1].childSections[0].childSections');//removing template name section
897
+ fields.splice(0, 1);
898
+ _.set(childSections, '[1].childSections[0].childSections', fields);
899
+ _.set(schema, 'standalone.sections[0].childSections', childSections);
957
900
  this.setState({ schema, loadingStatus: this.state.loadingStatus + 1 });
958
901
  }
959
902
 
@@ -998,8 +941,37 @@ export class Create extends React.Component { // eslint-disable-line react/prefe
998
941
  this.setState({startValidation: false});
999
942
  }
1000
943
 
1001
- getTemplateContent = () =>
1002
- getSmsMessageFromFormData(this.state.formData, this.state.currentTab);
944
+ getTemplateContent = () => {
945
+ // Get SMS content from formData
946
+ if (!this.state.formData || !Array.isArray(this.state.formData) || this.state.formData.length === 0) {
947
+ return '';
948
+ }
949
+ const currentTabData = this.state.formData[this.state.currentTab - 1];
950
+ if (!currentTabData) {
951
+ return '';
952
+ }
953
+
954
+ // PRIORITY 1: Check direct path first (most common for SMS)
955
+ // This handles: formData[0]['sms-editor']
956
+ if (currentTabData['sms-editor']) {
957
+ return currentTabData['sms-editor'];
958
+ }
959
+
960
+ // PRIORITY 2: Check activeTab structure (for versioned templates)
961
+ // This handles: formData[0][activeTab]['sms-editor']
962
+ const activeTab = currentTabData?.activeTab || 'base';
963
+ if (currentTabData[activeTab]?.['sms-editor']) {
964
+ return currentTabData[activeTab]['sms-editor'];
965
+ }
966
+
967
+ // PRIORITY 3: Check base explicitly (fallback)
968
+ // This handles: formData[0]['base']['sms-editor']
969
+ if (currentTabData['base']?.['sms-editor']) {
970
+ return currentTabData['base']['sms-editor'];
971
+ }
972
+
973
+ return '';
974
+ }
1003
975
 
1004
976
  handleTestAndPreview = () => {
1005
977
  // If parent is managing state (props exist), call parent handler
@@ -1028,35 +1000,6 @@ export class Create extends React.Component { // eslint-disable-line react/prefe
1028
1000
  }
1029
1001
 
1030
1002
  saveFormData() {
1031
- /*
1032
- * RCS SMS fallback slidebox (embeddedSmsFallback): parent passes isFullMode from RCS, but we must not
1033
- * call createTemplate — that spins CapSpin on createTemplateInProgress and is not the embedded contract.
1034
- * Same as library: hand off form payload via getFormSubscriptionData.
1035
- */
1036
- if (this.props.embeddedSmsFallback && this.props.getFormSubscriptionData) {
1037
- const { isTemplateNameEmpty, isMessageEmpty } = getSmsEmbeddedFooterValidity(
1038
- this.state.formData,
1039
- this.state.tabCount,
1040
- );
1041
- if (isTemplateNameEmpty || isMessageEmpty) {
1042
- this.setState({ startValidation: true, pendingGetFormData: false });
1043
- if (this.props.onValidationFail) {
1044
- this.props.onValidationFail();
1045
- }
1046
- return;
1047
- }
1048
- const payload = this.getFormData();
1049
- if (!payload.validity) {
1050
- if (this.props.onValidationFail) {
1051
- this.props.onValidationFail();
1052
- }
1053
- this.setState({ pendingGetFormData: false, startValidation: false });
1054
- return;
1055
- }
1056
- this.props.getFormSubscriptionData(payload);
1057
- this.setState({ pendingGetFormData: false, startValidation: false });
1058
- return;
1059
- }
1060
1003
  // In library mode: FormBuilder calls onSubmit only after liquid validation succeeds.
1061
1004
  // Submit to parent here so the slidebox can close with valid data.
1062
1005
  if (!this.props.isFullMode) {
@@ -1156,9 +1099,7 @@ export class Create extends React.Component { // eslint-disable-line react/prefe
1156
1099
  onTestContentClicked={this.props.onTestContentClicked}
1157
1100
  onPreviewContentClicked={this.props.onPreviewContentClicked}
1158
1101
  eventContextTags={this.props?.eventContextTags}
1159
- tagListGetPopupContainer={this.props.tagListGetPopupContainer}
1160
- tagListPopoverOverlayStyle={this.props.tagListPopoverOverlayStyle}
1161
- tagListPopoverOverlayClassName={this.props.tagListPopoverOverlayClassName}
1102
+ waitEventContextTags={this.props?.waitEventContextTags}
1162
1103
  />
1163
1104
  </CapColumn>
1164
1105
  </CapRow>
@@ -1171,7 +1112,6 @@ export class Create extends React.Component { // eslint-disable-line react/prefe
1171
1112
  formData={this.state.formData}
1172
1113
  content={this.getTemplateContent()}
1173
1114
  currentChannel={SMS}
1174
- smsRegister={this.props.smsRegister}
1175
1115
  />
1176
1116
  </div>
1177
1117
  );
@@ -1196,17 +1136,11 @@ Create.propTypes = {
1196
1136
  isLoadingMetaEntities: PropTypes.bool,
1197
1137
  selectedOfferDetails: PropTypes.array,
1198
1138
  eventContextTags: PropTypes.array,
1139
+ waitEventContextTags: PropTypes.object,
1199
1140
  showTestAndPreviewSlidebox: PropTypes.bool,
1200
1141
  handleTestAndPreview: PropTypes.func,
1201
1142
  handleCloseTestAndPreview: PropTypes.func,
1202
1143
  isTestAndPreviewMode: PropTypes.bool,
1203
- smsRegister: PropTypes.any,
1204
- forceFullTagContext: PropTypes.bool,
1205
- embeddedSmsFallback: PropTypes.bool,
1206
- onEmbeddedSmsFooterValidity: PropTypes.func,
1207
- tagListGetPopupContainer: PropTypes.func,
1208
- tagListPopoverOverlayStyle: PropTypes.object,
1209
- tagListPopoverOverlayClassName: PropTypes.string,
1210
1144
  };
1211
1145
 
1212
1146
  const mapStateToProps = createStructuredSelector({
@@ -70,7 +70,6 @@ export const SmsTraiCreate = (props) => {
70
70
  onCreateComplete,
71
71
  isFullMode,
72
72
  onShowTemplates,
73
- embeddedSmsFallback,
74
73
  traiSms: {
75
74
  duplicateDetails = {},
76
75
  duplicateDetailsError = '',
@@ -660,11 +659,9 @@ export const SmsTraiCreate = (props) => {
660
659
 
661
660
  const createCallback = ({ errorMessage }) => {
662
661
  if (!errorMessage) {
663
- if (!embeddedSmsFallback) {
664
- CapNotification.success({
665
- message: formatMessage(messages.smsCreateNotification),
666
- });
667
- }
662
+ CapNotification.success({
663
+ message: formatMessage(messages.smsCreateNotification),
664
+ });
668
665
  actions.clearCreateResponse();
669
666
  } else {
670
667
  CapNotification.error({
@@ -744,9 +741,7 @@ export const SmsTraiCreate = (props) => {
744
741
  { templates: savedData },
745
742
  (resp, errorMessage) => {
746
743
  createCallback({ errorMessage });
747
- if (embeddedSmsFallback) {
748
- if (!errorMessage) onCreateComplete(savedData);
749
- } else if (isFullMode) {
744
+ if (isFullMode) {
750
745
  onCreateComplete();
751
746
  } else {
752
747
  onShowTemplates();
@@ -5,8 +5,6 @@
5
5
  */
6
6
 
7
7
  export const CHARLIMIT = 40;
8
- /** Display / soft cap label for DLT SMS body length (matches product UI). */
9
- export const SMS_TRAI_CONTENT_MAX_LENGTH = 1024;
10
8
  export const SMS = 'SMS';
11
9
  export const SMS_TRAI_VAR = '{#var#}';
12
10
  export const TAG = 'TAG';