@capillarytech/creatives-library 7.14.7-alpha.0 → 7.14.8

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.
@@ -10,7 +10,6 @@ import { connect } from 'react-redux';
10
10
  import TagList from '../TagList';
11
11
  import { bindActionCreators } from 'redux';
12
12
  import { createStructuredSelector } from 'reselect';
13
- import BeePlugin from '@mailupinc/bee-plugin';
14
13
  import makeSelectBEE from './selectors';
15
14
  import { UserIsAuthenticated } from '../../utils/authWrapper';
16
15
  import config from '../../config/app';
@@ -177,17 +176,12 @@ function BeeEditor(props) {
177
176
  actions.createCustomRow(JSON.parse(rowJSON), callbackSaveRow);
178
177
  },
179
178
  };
180
- const beeInstance = new BeePlugin(tokenData);
181
- const parseJson = JSON.parse(beeJson);
182
- beeInstance.start(parseJson);
183
- saveBeeInstance(beePluginInstance);
184
- // beeInstance.start();
185
- // BeePlugin.create(tokenData, beeConfig, (instance) => {
186
- // beePluginInstance = instance;
187
- // const parseJson = JSON.parse(beeJson);
188
- // beePluginInstance.start(parseJson);
189
- // saveBeeInstance(beePluginInstance);
190
- // });
179
+ window.BeePlugin.create(tokenData, beeConfig, (instance) => {
180
+ beePluginInstance = instance;
181
+ const parseJson = JSON.parse(beeJson);
182
+ beePluginInstance.start(parseJson);
183
+ saveBeeInstance(beePluginInstance);
184
+ });
191
185
  return () => clearInterval(intervalTimer);
192
186
  }, []);
193
187
  const callbackSaveRow = (status, errorMsg) => {
@@ -249,7 +249,6 @@ export class Creatives extends React.Component {
249
249
  },
250
250
  },
251
251
  definition: {accountId: templateData.accountId, mode: mode.toLowerCase()},
252
- _id: templateData.templateId,
253
252
  };
254
253
  break;
255
254
  }
@@ -308,7 +308,7 @@ export const Advertisement = (props) => {
308
308
  newCarouselData[activeIndex].subType = value;
309
309
  newCarouselData[activeIndex].imageData = {};
310
310
  updateCarouselData(newCarouselData);
311
- actions.clearFbAdAsset(`Video_${activeIndex}`);
311
+ actions.clearFbAdAsset(activeIndex);
312
312
  }, [carouselData, activeIndex]);
313
313
 
314
314
 
@@ -593,6 +593,22 @@
593
593
  max-height: 123px;
594
594
  margin-bottom: 4px;
595
595
  }
596
+ .whatsapp-doc {
597
+ width: 100%;
598
+ max-height: 123px;
599
+ margin-bottom: 4px;
600
+ .pdf-img-box {
601
+ width: 100%;
602
+ margin: auto;
603
+ .pdf-preview-img {
604
+ width: 100%;
605
+ }
606
+ }
607
+ .pdf-label{
608
+ width: 100%;
609
+ margin: auto;
610
+ }
611
+ }
596
612
  .whatsapp-rcs-template-name {
597
613
  max-width: 170px;
598
614
  overflow: hidden;
@@ -1067,7 +1067,7 @@ export class Templates extends React.Component { // eslint-disable-line react/pr
1067
1067
  break;
1068
1068
  }
1069
1069
  case WHATSAPP: {
1070
- const { whatsappImageSrc = '', templateMsg} = getWhatsappContent(template);
1070
+ const { whatsappImageSrc = '', templateMsg, docPreview} = getWhatsappContent(template);
1071
1071
  templateData.title = (
1072
1072
  <CapRow>
1073
1073
  <CapLabel className="whatsapp-rcs-template-name">{template?.name}</CapLabel>
@@ -1079,6 +1079,7 @@ export class Templates extends React.Component { // eslint-disable-line react/pr
1079
1079
  {whatsappImageSrc && (
1080
1080
  <CapImage src={whatsappImageSrc} className="whatsapp-image" />
1081
1081
  )}
1082
+ <div className="whatsapp-doc">{docPreview}</div>
1082
1083
  <span
1083
1084
  className={`${
1084
1085
  whatsappImageSrc
@@ -786,6 +786,9 @@ exports[`Test Templates container Test max templates exceeded 1`] = `
786
786
  className="whatsapp-image"
787
787
  src="https://crm-nightly-new-fileservice.s3.amazonaws.com/intouch_creative_assets/c9edc114-923b-4ac7-82d0-d6682213.jpg"
788
788
  />
789
+ <div
790
+ className="whatsapp-doc"
791
+ />
789
792
  <span
790
793
  className="whatsapp-message-with-image"
791
794
  >
@@ -1220,6 +1223,9 @@ exports[`Test Templates container Test max templates not exceeded 1`] = `
1220
1223
  className="whatsapp-image"
1221
1224
  src="https://crm-nightly-new-fileservice.s3.amazonaws.com/intouch_creative_assets/c9edc114-923b-4ac7-82d0-d6682213.jpg"
1222
1225
  />
1226
+ <div
1227
+ className="whatsapp-doc"
1228
+ />
1223
1229
  <span
1224
1230
  className="whatsapp-message-with-image"
1225
1231
  >
@@ -1654,6 +1660,9 @@ exports[`Test Templates container Test max templates warning 1`] = `
1654
1660
  className="whatsapp-image"
1655
1661
  src="https://crm-nightly-new-fileservice.s3.amazonaws.com/intouch_creative_assets/c9edc114-923b-4ac7-82d0-d6682213.jpg"
1656
1662
  />
1663
+ <div
1664
+ className="whatsapp-doc"
1665
+ />
1657
1666
  <span
1658
1667
  className="whatsapp-message-with-image"
1659
1668
  >
@@ -179,9 +179,14 @@ export const INITIAL_CTA_DATA = [
179
179
  ];
180
180
 
181
181
  export const ALLOWED_IMAGE_EXTENSIONS_REGEX = /\.(jpe?g|png)$/i;
182
+ export const ALLOWED_EXTENSIONS_VIDEO_REGEX = (/\.(mp4|3gpp)$/i);
183
+ export const ALLOWED_EXTENSIONS_DOCUMENT_REGEX = (/\.(pdf)$/i);
182
184
  export const WHATSAPP_IMG_SIZE = 5000000; // 5MB
185
+ export const WHATSAPP_VIDEO_SIZE = 16000000; // 16MB
186
+ export const WHATSAPP_DOCUMENT_SIZE = 16000000; // 16MB
183
187
  export const HOST_TWILIO = 'twiliowhatsapptrans';
184
188
  export const HOST_KARIX = 'karixwhatsappbulk';
189
+ export const SIZE_UNITS = ['bytes', 'KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB'];
185
190
 
186
191
  export const LANGUAGE_OPTIONS = [
187
192
  {
@@ -59,6 +59,10 @@ import {
59
59
  ALLOWED_IMAGE_EXTENSIONS_REGEX,
60
60
  WHATSAPP_IMG_SIZE,
61
61
  HOST_KARIX,
62
+ ALLOWED_EXTENSIONS_VIDEO_REGEX,
63
+ ALLOWED_EXTENSIONS_DOCUMENT_REGEX,
64
+ WHATSAPP_DOCUMENT_SIZE,
65
+ WHATSAPP_VIDEO_SIZE,
62
66
  } from './constants';
63
67
  import { DATE_DISPLAY_FORMAT, TIME_DISPLAY_FORMAT } from '../App/constants';
64
68
  import messages from './messages';
@@ -75,6 +79,9 @@ import {
75
79
  WEBSITE,
76
80
  } from '../../v2Components/CapWhatsappCTA/constants';
77
81
  import { getCdnUrl } from '../../utils/cdnTransformation';
82
+ import CapVideoUpload from '../../v2Components/CapVideoUpload';
83
+ import CapDocumentUpload from '../../v2Components/CapDocumentUpload';
84
+ import { getWhatsappDocPreview } from './utils';
78
85
 
79
86
  let varMap = {};
80
87
  let editContent = {};
@@ -124,7 +131,12 @@ export const Whatsapp = (props) => {
124
131
  const [spin, setSpin] = useState(false);
125
132
  const [unsubscribeRequired, setUnsubscribeRequired] = useState(false);
126
133
  const [whatsappImageSrc, setWhatsappImageSrc] = useState('');
134
+ const [whatsappVideoSrc, setWhatsappVideoSrc] = useState('');
135
+ const [whatsappVideoPreviewImg, setWhatsappVideoPreviewImg] = useState('');
136
+ const [whatsappDocSource, setWhatsappDocSource] = useState('');
137
+ const [whatsappDocParams, setWhatsappDocParams] = useState({});
127
138
  const [karixFileHandle, setKarixFileHandle] = useState('');
139
+ const [assetList, updateAssetList] = useState([]);
128
140
  //for edit only
129
141
  const [isEditFlow, setEditFlow] = useState(false);
130
142
  const [templateDate, setTemplateDate] = useState('');
@@ -144,6 +156,8 @@ export const Whatsapp = (props) => {
144
156
 
145
157
  const isBtnTypeCta = buttonType === WHATSAPP_BUTTON_TYPES.CTA;
146
158
  const isMediaTypeImage = templateMediaType === WHATSAPP_MEDIA_TYPES.IMAGE;
159
+ const isMediaTypeVideo = templateMediaType === WHATSAPP_MEDIA_TYPES.VIDEO;
160
+ const isMediaTypeDoc = templateMediaType === WHATSAPP_MEDIA_TYPES.DOCUMENT;
147
161
  const WhatsappFooter = styled.div`
148
162
  background-color: ${CAP_WHITE};
149
163
  position: fixed;
@@ -211,9 +225,13 @@ export const Whatsapp = (props) => {
211
225
  languages = [],
212
226
  mediaType = WHATSAPP_MEDIA_TYPES.TEXT,
213
227
  imageUrl = '',
228
+ videoUrl = '',
229
+ documentUrl = '',
214
230
  karixFileHandle = '',
215
231
  buttonType: btnType = WHATSAPP_BUTTON_TYPES.NONE,
216
232
  buttons = [],
233
+ videoPreviewImg = '',
234
+ whatsappDocParams = {},
217
235
  } = editContent;
218
236
  setTemplateCategory(category);
219
237
  setTemplateStatus(status);
@@ -221,6 +239,16 @@ export const Whatsapp = (props) => {
221
239
  setTemplateLanguage(languages[0]?.language);
222
240
  setTemplateMediaType(mediaType);
223
241
  setWhatsappImageSrc(imageUrl);
242
+ setWhatsappVideoSrc(videoUrl);
243
+ setWhatsappDocSource(documentUrl);
244
+ setWhatsappDocParams(whatsappDocParams);
245
+ updateAssetList({
246
+ ...assetList,
247
+ previewUrl: videoPreviewImg,
248
+ videoSrc: videoUrl,
249
+ fileHandle: karixFileHandle,
250
+ });
251
+ setWhatsappVideoPreviewImg(videoPreviewImg);
224
252
  setKarixFileHandle(karixFileHandle);
225
253
  setButtonType(btnType);
226
254
  if (btnType === WHATSAPP_BUTTON_TYPES.CTA && buttons.length > 0) {
@@ -463,20 +491,30 @@ export const Whatsapp = (props) => {
463
491
  {
464
492
  value: WHATSAPP_MEDIA_TYPES.VIDEO,
465
493
  label: (
466
- <CapTooltip title={formatMessage(messages.disabledFeatureTooltip)}>
494
+ <CapTooltip
495
+ title={
496
+ host !== HOST_KARIX
497
+ ? formatMessage(messages.disabledFeatureTooltip)
498
+ : ''
499
+ }>
467
500
  {formatMessage(messages.mediaVideo)}
468
501
  </CapTooltip>
469
502
  ),
470
- disabled: true,
503
+ disabled: host !== HOST_KARIX,
471
504
  },
472
505
  {
473
506
  value: WHATSAPP_MEDIA_TYPES.DOCUMENT,
474
507
  label: (
475
- <CapTooltip title={formatMessage(messages.disabledFeatureTooltip)}>
508
+ <CapTooltip
509
+ title={
510
+ host !== HOST_KARIX
511
+ ? formatMessage(messages.disabledFeatureTooltip)
512
+ : ''
513
+ }>
476
514
  {formatMessage(messages.mediaDocument)}
477
515
  </CapTooltip>
478
516
  ),
479
- disabled: true,
517
+ disabled: host !== HOST_KARIX,
480
518
  },
481
519
  ];
482
520
 
@@ -684,6 +722,31 @@ export const Whatsapp = (props) => {
684
722
  setKarixFileHandle('');
685
723
  }, [whatsappImageSrc]);
686
724
 
725
+ const setUpdateWhatsappVideoSrc = useCallback(
726
+ (index, data) => {
727
+ setWhatsappVideoSrc(data?.videoSrc);
728
+ setKarixFileHandle(data?.fileHandle);
729
+ setWhatsappVideoPreviewImg(data?.previewUrl);
730
+ updateAssetList(data);
731
+ actions.clearWhatsappAsset(0);
732
+ },
733
+ [whatsappVideoSrc],
734
+ );
735
+
736
+ const setUpdateWhatsappDocSrc = useCallback(
737
+ (filePath, fileHandle) => {
738
+ setWhatsappDocSource(filePath);
739
+ setKarixFileHandle(fileHandle);
740
+ actions.clearWhatsappAsset(0);
741
+ },
742
+ [whatsappDocSource],
743
+ );
744
+
745
+ const updateOnWhatsappDocReUpload = useCallback(() => {
746
+ setWhatsappDocSource('');
747
+ setKarixFileHandle('');
748
+ }, [whatsappDocSource]);
749
+
687
750
  const renderImageComponent = () => (
688
751
  <CapImageUpload
689
752
  style={{ paddingTop: '20px' }}
@@ -702,6 +765,44 @@ export const Whatsapp = (props) => {
702
765
  />
703
766
  );
704
767
 
768
+ const renderVideoComonent = () => (
769
+ <CapVideoUpload
770
+ index={0}
771
+ allowedExtensionsRegex={ALLOWED_EXTENSIONS_VIDEO_REGEX}
772
+ videoSize={WHATSAPP_VIDEO_SIZE}
773
+ isFullMode={isFullMode}
774
+ uploadAsset={uploadWhatsappImage}
775
+ uploadedAssetList={assetList}
776
+ onVideoUploadUpdateAssestList={setUpdateWhatsappVideoSrc}
777
+ videoData={editData}
778
+ className="cap-custom-video-upload"
779
+ channel={WHATSAPP}
780
+ />
781
+ );
782
+ const docPreview = ( whatsappDocSource !== '' &&
783
+ getWhatsappDocPreview(whatsappDocParams)
784
+ );
785
+ const renderDocumentComponent = () => (
786
+ <CapDocumentUpload
787
+ style={{ paddingTop: '20px' }}
788
+ allowedExtensionsRegex={ALLOWED_EXTENSIONS_DOCUMENT_REGEX}
789
+ documentSize={WHATSAPP_DOCUMENT_SIZE}
790
+ uploadAsset={uploadWhatsappImage}
791
+ isFullMode={isFullMode}
792
+ documentSrc={whatsappDocSource}
793
+ updateDocumentSrc={setUpdateWhatsappDocSrc}
794
+ updateOnReUpload={updateOnWhatsappDocReUpload}
795
+ index={0}
796
+ className="cap-custom-document-upload"
797
+ key="whatsapp-uploaded-document"
798
+ documentData={editData}
799
+ whatsappDocParams={whatsappDocParams}
800
+ setWhatsappDocParams={setWhatsappDocParams}
801
+ channel={WHATSAPP}
802
+ docPreview={docPreview}
803
+ />
804
+ );
805
+
705
806
  const onTemplateNameChange = ({ target: { value } }) => {
706
807
  setTemplateName(value);
707
808
  templateNameErrorHandler(value);
@@ -857,7 +958,17 @@ export const Whatsapp = (props) => {
857
958
  }),
858
959
  mediaType: templateMediaType,
859
960
  ...(isMediaTypeImage && {
860
- imageUrl: getCdnUrl({url: whatsappImageSrc, channelName: 'WHATSAPP',}),
961
+ imageUrl: getCdnUrl({url: whatsappImageSrc, channelName: 'WHATSAPP' }),
962
+ karixFileHandle,
963
+ }),
964
+ ...(isMediaTypeVideo && {
965
+ videoUrl: getCdnUrl({url: whatsappVideoSrc, channelName: 'WHATSAPP'}),
966
+ karixFileHandle,
967
+ videoPreviewImg: getCdnUrl({url: whatsappVideoPreviewImg, channelName: 'WHATSAPP'}),
968
+ }),
969
+ ...(isMediaTypeDoc && {
970
+ documentUrl: getCdnUrl({url: whatsappDocSource, channelName: 'WHATSAPP'}),
971
+ whatsappDocParams,
861
972
  karixFileHandle,
862
973
  }),
863
974
  varMapped: !isFullMode ? varMap : {},
@@ -1019,6 +1130,8 @@ export const Whatsapp = (props) => {
1019
1130
  {/* template media type */}
1020
1131
  {renderMediaSection()}
1021
1132
  {isMediaTypeImage && renderImageComponent()}
1133
+ {isMediaTypeVideo && renderVideoComonent()}
1134
+ {isMediaTypeDoc && renderDocumentComponent()}
1022
1135
  {/* template message create flow */}
1023
1136
  <CapHeader
1024
1137
  className={`${isMediaTypeImage ? 'whatsapp-heading-spacing' : ''}`}
@@ -1252,6 +1365,8 @@ export const Whatsapp = (props) => {
1252
1365
  {renderLabel('mediaLabel')}
1253
1366
  <CapLabel type="label15">{capitalizeString(templateMediaType)}</CapLabel>
1254
1367
  {isMediaTypeImage && renderImageComponent()}
1368
+ {isMediaTypeVideo && renderVideoComonent()}
1369
+ {isMediaTypeDoc && renderDocumentComponent()}
1255
1370
 
1256
1371
  <CapRow className="whatsapp-render-heading">
1257
1372
  <CapHeader
@@ -1343,6 +1458,12 @@ export const Whatsapp = (props) => {
1343
1458
  ...(isMediaTypeImage && {
1344
1459
  whatsappImageSrc,
1345
1460
  }),
1461
+ ...(isMediaTypeVideo && {
1462
+ whatsappVideoPreviewImg,
1463
+ }),
1464
+ ...(isMediaTypeDoc && {
1465
+ docPreview,
1466
+ }),
1346
1467
  templateMsg,
1347
1468
  ...(isBtnTypeCta && {
1348
1469
  ctaData,
@@ -1444,4 +1565,4 @@ export default withCreatives({
1444
1565
  mapStateToProps,
1445
1566
  mapDispatchToProps,
1446
1567
  userAuth: true,
1447
- });
1568
+ });
@@ -132,4 +132,21 @@
132
132
  color: $FONT_COLOR_05;
133
133
  }
134
134
  }
135
+ .cap-custom-video-upload {
136
+ padding-top: 20px;
137
+ .dragger-button.re-upload {
138
+ top: -175px;
139
+ position: relative;
140
+ left: 525px;
141
+ color: $FONT_COLOR_05;
142
+ }
143
+ }
144
+ .cap-custom-document-upload {
145
+ .dragger-button.re-upload {
146
+ top: -150px;
147
+ position: relative;
148
+ left: 525px;
149
+ color: $FONT_COLOR_05;
150
+ }
151
+ }
135
152
  }
@@ -0,0 +1,38 @@
1
+ .pdf-img-box {
2
+ width: 162px;
3
+ height: 80px;
4
+ overflow: hidden;
5
+ }
6
+ .pdf-preview-img {
7
+ width: 162px;
8
+ }
9
+ .pdf-label {
10
+ width: 162px;
11
+ height: 44px;
12
+ background-color: #F4F5F7;
13
+ display: flex;
14
+ .cap-image-v2 {
15
+ margin: 6px 4px;
16
+ width: 32px;
17
+ height: 32px;
18
+ }
19
+ .pdf-info {
20
+ margin: 8px 4px;
21
+ max-width: 114px;
22
+ .pdf-info-sec {
23
+ color: #5f6d85;
24
+ font-size: 8px;
25
+ font-weight: 400;
26
+ line-height: 12px;
27
+ }
28
+ .pdf-name-div {
29
+ display: flex;
30
+ .pdf-name{
31
+ max-width: 112px;
32
+ text-overflow: ellipsis;
33
+ overflow: hidden;
34
+ white-space: nowrap;
35
+ }
36
+ }
37
+ }
38
+ }