@capillarytech/creatives-library 9.0.43 → 9.0.44

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 (28) hide show
  1. package/package.json +1 -1
  2. package/v2Components/CapDeviceContent/index.scss +1 -1
  3. package/v2Components/CommonTestAndPreview/UnifiedPreview/ViberPreviewContent.js +15 -106
  4. package/v2Components/CommonTestAndPreview/UnifiedPreview/_unifiedPreview.scss +1 -139
  5. package/v2Components/CommonTestAndPreview/_commonTestAndPreview.scss +5 -1
  6. package/v2Components/CommonTestAndPreview/constants.js +0 -2
  7. package/v2Components/CommonTestAndPreview/index.js +26 -240
  8. package/v2Components/CommonTestAndPreview/tests/UnifiedPreview/ViberPreviewContent.test.js +0 -364
  9. package/v2Components/CommonTestAndPreview/tests/utils.test.js +0 -49
  10. package/v2Components/CommonTestAndPreview/utils.js +0 -20
  11. package/v2Components/FormBuilder/_formBuilder.scss +1 -1
  12. package/v2Containers/Email/_email.scss +4 -0
  13. package/v2Containers/Email/index.js +1 -1
  14. package/v2Containers/MobilePush/Create/_mobilePushCreate.scss +14 -10
  15. package/v2Containers/MobilePush/Edit/_mobilePushCreate.scss +14 -9
  16. package/v2Containers/Templates/_templates.scss +12 -180
  17. package/v2Containers/Templates/index.js +18 -104
  18. package/v2Containers/Templates/tests/__snapshots__/index.test.js.snap +15 -6
  19. package/v2Containers/Viber/constants.js +0 -21
  20. package/v2Containers/Viber/index.js +49 -719
  21. package/v2Containers/Viber/index.scss +0 -175
  22. package/v2Containers/Viber/messages.js +0 -121
  23. package/v2Containers/Viber/tests/index.test.js +0 -80
  24. package/v2Containers/Whatsapp/index.js +4 -2
  25. package/v2Containers/Whatsapp/index.scss +8 -5
  26. package/v2Containers/Whatsapp/tests/__snapshots__/index.test.js.snap +280 -224
  27. package/v2Components/CommonTestAndPreview/UnifiedPreview/ViberCarouselPreviewCards.js +0 -127
  28. package/v2Components/CommonTestAndPreview/UnifiedPreview/_viberCarouselPreviewCards.scss +0 -133
@@ -246,8 +246,6 @@ const CommonTestAndPreview = (props) => {
246
246
  const [smsFallbackPreviewText, setSmsFallbackPreviewText] = useState(undefined);
247
247
  // Track if a preview call has been made (to know when to use previewDataHtml vs raw content)
248
248
  const [hasPreviewCallBeenMade, setHasPreviewCallBeenMade] = useState(false);
249
- // Viber: tag values applied to preview only after explicit Update preview / Discard (not while typing)
250
- const [viberPreviewTagValues, setViberPreviewTagValues] = useState(null);
251
249
  const [previewDataHtml, setPreviewDataHtml] = useState(() => {
252
250
  // Initialize preview data based on channel
253
251
  if (channel === CHANNELS.EMAIL && formData) {
@@ -689,159 +687,6 @@ const CommonTestAndPreview = (props) => {
689
687
  return resolvedText;
690
688
  };
691
689
 
692
- const getViberMergedFormData = useCallback((formDataOverride) => {
693
- const formDataObj = formDataOverride && typeof formDataOverride === 'object'
694
- ? formDataOverride
695
- : (formData && typeof formData === 'object' ? formData : {});
696
- let contentObj = {};
697
- if (content && typeof content === 'object') {
698
- contentObj = content;
699
- } else if (typeof content === 'string' && content.trim()) {
700
- try {
701
- contentObj = JSON.parse(content);
702
- } catch (e) {
703
- contentObj = {};
704
- }
705
- }
706
- const previewCards = formDataObj?.viberPreviewContent?.cards
707
- ?? formDataObj?.cards
708
- ?? contentObj?.viberPreviewContent?.cards
709
- ?? contentObj?.cards;
710
- const isCarousel = Boolean(
711
- formDataObj.type === MEDIA_TYPE_CAROUSEL
712
- || contentObj.type === MEDIA_TYPE_CAROUSEL
713
- || (Array.isArray(previewCards) && previewCards.length > 0),
714
- );
715
- const mergedPreview = {
716
- ...(contentObj.viberPreviewContent || {}),
717
- ...(formDataObj.viberPreviewContent || {}),
718
- ...(Array.isArray(previewCards) && previewCards.length ? { cards: previewCards } : {}),
719
- ...(isCarousel ? {
720
- type: MEDIA_TYPE_CAROUSEL,
721
- showCarouselEditorPreview: true,
722
- } : {}),
723
- };
724
- return {
725
- ...contentObj,
726
- ...formDataObj,
727
- ...(Array.isArray(previewCards) && previewCards.length ? { cards: previewCards } : {}),
728
- ...(isCarousel ? { type: MEDIA_TYPE_CAROUSEL } : {}),
729
- ...(Object.keys(mergedPreview).length ? { viberPreviewContent: mergedPreview } : {}),
730
- };
731
- }, [formData, content]);
732
-
733
- const getViberCarouselCardsFromFormData = (formDataObj) => {
734
- const previewCards = formDataObj?.viberPreviewContent?.cards;
735
- if (Array.isArray(previewCards) && previewCards.length) {
736
- return previewCards;
737
- }
738
- const rootCards = formDataObj?.cards;
739
- if (Array.isArray(rootCards) && rootCards.length) {
740
- return rootCards;
741
- }
742
- return [];
743
- };
744
-
745
- const getViberTagExtractionContent = (formDataObj, contentStr = '') => {
746
- const messageText = formDataObj?.messageContent
747
- || formDataObj?.viberPreviewContent?.messageContent
748
- || contentStr
749
- || '';
750
- const cardFieldTexts = getViberCarouselCardsFromFormData(formDataObj).flatMap((card) => {
751
- const fields = [card?.text || ''];
752
- (card?.buttons || []).forEach((button) => {
753
- fields.push(button?.title || '', button?.action || '');
754
- });
755
- return fields;
756
- });
757
- return [messageText, ...cardFieldTexts]
758
- .filter((value) => typeof value === 'string' && value.trim())
759
- .join(' ');
760
- };
761
-
762
- const resolveViberCarouselCards = (cards, tagValues) => {
763
- if (!Array.isArray(cards) || !tagValues || !Object.keys(tagValues).length) {
764
- return cards;
765
- }
766
- return cards.map((card) => ({
767
- ...card,
768
- text: resolveTagsInText(card?.text || '', tagValues),
769
- buttons: (card?.buttons || []).map((button) => ({
770
- ...button,
771
- title: resolveTagsInText(button?.title || '', tagValues),
772
- action: resolveTagsInText(button?.action || '', tagValues),
773
- })),
774
- }));
775
- };
776
-
777
- const applyViberCustomValuesToContent = (contentObj, tagValues) => {
778
- if (!contentObj || typeof contentObj !== 'object' || !tagValues || !Object.keys(tagValues).length) {
779
- return contentObj;
780
- }
781
- const result = { ...contentObj };
782
- if (typeof result.messageContent === 'string') {
783
- result.messageContent = resolveTagsInText(result.messageContent, tagValues);
784
- }
785
- if (Array.isArray(result.cards)) {
786
- result.cards = resolveViberCarouselCards(result.cards, tagValues);
787
- }
788
- if (result.viberPreviewContent && typeof result.viberPreviewContent === 'object') {
789
- const preview = result.viberPreviewContent;
790
- result.viberPreviewContent = {
791
- ...preview,
792
- messageContent: resolveTagsInText(preview.messageContent || '', tagValues),
793
- cards: resolveViberCarouselCards(preview.cards, tagValues),
794
- };
795
- }
796
- return result;
797
- };
798
-
799
- const mergeViberPreviewWithResolved = (base, resolved) => {
800
- if (!resolved || typeof resolved !== 'object') {
801
- return base && typeof base === 'object' ? base : {};
802
- }
803
- const baseObj = base && typeof base === 'object' ? base : {};
804
- const basePreview = baseObj.viberPreviewContent || {};
805
- const resolvedPreview = resolved.viberPreviewContent || {};
806
- const baseCards = basePreview.cards || baseObj.cards || [];
807
- const resolvedCards = resolvedPreview.cards || resolved.cards || [];
808
- const mergedCards = baseCards.length
809
- ? baseCards.map((card, index) => {
810
- const resolvedCard = resolvedCards[index];
811
- if (!resolvedCard) {
812
- return card;
813
- }
814
- return {
815
- ...card,
816
- ...(resolvedCard.text != null ? { text: resolvedCard.text } : {}),
817
- ...(resolvedCard.mediaUrl != null ? { mediaUrl: resolvedCard.mediaUrl } : {}),
818
- buttons: (card.buttons || []).map((button, buttonIndex) => ({
819
- ...button,
820
- ...(resolvedCard.buttons?.[buttonIndex] || {}),
821
- })),
822
- };
823
- })
824
- : resolvedCards;
825
- const resolvedMessage = resolved.messageContent ?? resolvedPreview.messageContent;
826
-
827
- return {
828
- ...baseObj,
829
- ...resolved,
830
- viberPreviewContent: {
831
- ...basePreview,
832
- ...resolvedPreview,
833
- type: resolvedPreview.type || basePreview.type || baseObj.type || (mergedCards.length ? MEDIA_TYPE_CAROUSEL : ''),
834
- cards: mergedCards.length ? mergedCards : (resolvedPreview.cards || basePreview.cards),
835
- showCarouselEditorPreview: Boolean(
836
- basePreview.showCarouselEditorPreview
837
- || resolvedPreview.showCarouselEditorPreview
838
- || mergedCards.length > 0,
839
- ),
840
- ...(resolvedMessage != null ? { messageContent: resolvedMessage } : {}),
841
- },
842
- };
843
- };
844
-
845
690
  /**
846
691
  * Common handler for saving test customers (both new and existing)
847
692
  */
@@ -1120,13 +965,11 @@ const CommonTestAndPreview = (props) => {
1120
965
  templateContent: formDataObj?.bodyText || contentStr,
1121
966
  };
1122
967
 
1123
- case CHANNELS.VIBER: {
1124
- const viberFormData = getViberMergedFormData(formDataObj);
968
+ case CHANNELS.VIBER:
1125
969
  return {
1126
- templateSubject: viberFormData?.messageTitle || '',
1127
- templateContent: getViberTagExtractionContent(viberFormData, contentStr),
970
+ templateSubject: formDataObj?.messageTitle || '',
971
+ templateContent: contentStr,
1128
972
  };
1129
- }
1130
973
 
1131
974
  case CHANNELS.WEBPUSH:
1132
975
  return {
@@ -2180,16 +2023,11 @@ const CommonTestAndPreview = (props) => {
2180
2023
  // 1. formDataObj from getTemplateContent (contains both viberPreviewContent and payload fields)
2181
2024
  // 2. formDataObj[0] (array format - legacy)
2182
2025
  // 3. contentStr (direct string - legacy)
2183
- // Merge content prop so listing / preview-only flows include carousel card tags
2184
- const viberFormData = getViberMergedFormData(formDataObj);
2185
- formDataObj = viberFormData;
2186
2026
 
2187
2027
  let messageText = '';
2188
2028
  let imageData = null;
2189
2029
  let videoData = null;
2190
2030
  let buttonData = null;
2191
- let cardsData = [];
2192
- let messageType = '';
2193
2031
  let accountId = null;
2194
2032
  let accountDetails = null;
2195
2033
  let scenarioKey = '';
@@ -2204,8 +2042,6 @@ const CommonTestAndPreview = (props) => {
2204
2042
  imageData = formDataObj.image || null;
2205
2043
  videoData = formDataObj.video || null;
2206
2044
  buttonData = formDataObj.button || null;
2207
- cardsData = formDataObj.cards || [];
2208
- messageType = formDataObj.type || '';
2209
2045
  accountId = formDataObj.accountId || null;
2210
2046
  accountDetails = formDataObj.accountDetails || null;
2211
2047
  scenarioKey = formDataObj.scenarioKey || VIBER_API_SCENARIO_KEY;
@@ -2232,8 +2068,6 @@ const CommonTestAndPreview = (props) => {
2232
2068
  url: formDataObj?.buttonURL || '',
2233
2069
  };
2234
2070
  }
2235
- cardsData = viberPreview.cards || formDataObj?.cards || [];
2236
- messageType = viberPreview.type || formDataObj?.type || '';
2237
2071
  // Extract account info from parent formDataObj if available
2238
2072
  accountId = formDataObj.accountId || null;
2239
2073
  accountDetails = formDataObj.accountDetails || null;
@@ -2276,10 +2110,6 @@ const CommonTestAndPreview = (props) => {
2276
2110
  text: messageText,
2277
2111
  };
2278
2112
 
2279
- if (messageType === CHANNELS.VIBER) {
2280
- messageType = '';
2281
- }
2282
-
2283
2113
  // Add image if present
2284
2114
  if (imageData && imageData.url) {
2285
2115
  viberContent.image = {
@@ -2308,34 +2138,9 @@ const CommonTestAndPreview = (props) => {
2308
2138
  }
2309
2139
  }
2310
2140
 
2311
- if (messageType === MEDIA_TYPE_CAROUSEL || (Array.isArray(cardsData) && cardsData.length)) {
2312
- viberContent.type = MEDIA_TYPE_CAROUSEL;
2313
- viberContent.cards = (cardsData || []).map((card) => ({
2314
- text: card?.text || '',
2315
- mediaUrl: card?.mediaUrl || '',
2316
- buttons: (card?.buttons || []).map((button) => ({
2317
- title: button?.title || '',
2318
- action: button?.action || '',
2319
- })),
2320
- }));
2321
- delete viberContent.button;
2322
- }
2323
-
2324
- // Resolve tags in text/cards if custom values are provided
2325
- if (customValuesObj && Object.keys(customValuesObj).length > 0) {
2326
- if (viberContent.text) {
2327
- viberContent.text = resolveTagsInText(viberContent.text, customValuesObj);
2328
- }
2329
- if (Array.isArray(viberContent.cards)) {
2330
- viberContent.cards = resolveViberCarouselCards(viberContent.cards, customValuesObj);
2331
- }
2332
- if (viberContent.button) {
2333
- viberContent.button = {
2334
- ...viberContent.button,
2335
- text: resolveTagsInText(viberContent.button.text || '', customValuesObj),
2336
- url: resolveTagsInText(viberContent.button.url || '', customValuesObj),
2337
- };
2338
- }
2141
+ // Resolve tags in text if custom values are provided
2142
+ if (customValuesObj && Object.keys(customValuesObj).length > 0 && viberContent.text) {
2143
+ viberContent.text = resolveTagsInText(viberContent.text, customValuesObj);
2339
2144
  }
2340
2145
 
2341
2146
  // Build messageBody JSON string
@@ -2727,39 +2532,33 @@ const CommonTestAndPreview = (props) => {
2727
2532
  // Only use previewDataHtml if preview call was made
2728
2533
  if (hasPreviewCallBeenMade && previewDataHtml?.resolvedBody) {
2729
2534
  resolvedContent = previewDataHtml.resolvedBody;
2730
- if (typeof resolvedContent === 'string') {
2731
- try {
2732
- resolvedContent = JSON.parse(resolvedContent);
2733
- } catch (e) {
2734
- resolvedContent = null;
2735
- }
2736
- }
2737
2535
  }
2738
2536
 
2739
- // Parse content if it's a string, then merge with formData for carousel + tags in all entry flows
2740
- let parsedViberContent = getViberMergedFormData();
2741
- if (!parsedViberContent || typeof parsedViberContent !== 'object') {
2742
- parsedViberContent = {};
2537
+ // Parse content if it's a string
2538
+ let parsedViberContent = content;
2539
+ if (typeof content === 'string') {
2540
+ try {
2541
+ parsedViberContent = JSON.parse(content);
2542
+ } catch (e) {
2543
+ parsedViberContent = {};
2544
+ }
2743
2545
  }
2744
- // Merge template preview state with API resolved body so carousel type/cards survive slim responses
2546
+ // Use resolvedContent if available (from preview call), otherwise use raw content
2745
2547
  if (resolvedContent && typeof resolvedContent === 'object') {
2746
- const base = parsedViberContent && typeof parsedViberContent === 'object' ? parsedViberContent : {};
2747
- contentObj = mergeViberPreviewWithResolved(base, resolvedContent);
2748
- if (base.accountName && !contentObj.accountName) {
2749
- contentObj.accountName = base.accountName;
2548
+ contentObj = { ...resolvedContent };
2549
+ // Merge in accountName and brandName from raw content if not in resolvedContent
2550
+ if (parsedViberContent?.accountName && !contentObj.accountName) {
2551
+ contentObj.accountName = parsedViberContent.accountName;
2750
2552
  }
2751
- if (base.brandName && !contentObj.brandName) {
2752
- contentObj.brandName = base.brandName;
2553
+ if (parsedViberContent?.brandName && !contentObj.brandName) {
2554
+ contentObj.brandName = parsedViberContent.brandName;
2753
2555
  }
2754
2556
  } else {
2755
- contentObj = parsedViberContent && typeof parsedViberContent === 'object' ? parsedViberContent : {};
2756
- }
2757
- if (
2758
- hasPreviewCallBeenMade
2759
- && viberPreviewTagValues
2760
- && Object.keys(viberPreviewTagValues).length > 0
2761
- ) {
2762
- contentObj = applyViberCustomValuesToContent(contentObj, viberPreviewTagValues);
2557
+ // Use raw content if no preview call was made or resolvedContent is not available
2558
+ contentObj = {...parsedViberContent, messageContent: resolvedContent};
2559
+ if (resolvedContent) {
2560
+ contentObj.viberPreviewContent = {...parsedViberContent?.viberPreviewContent, messageContent: resolvedContent};
2561
+ }
2763
2562
  }
2764
2563
  } else if (channel === CHANNELS.ZALO) {
2765
2564
  // For Zalo, content is an object with templatePreviewUrl, templateStatus, etc.
@@ -3143,11 +2942,6 @@ const CommonTestAndPreview = (props) => {
3143
2942
 
3144
2943
  setCustomValues(updatedValues);
3145
2944
 
3146
- // Viber: do not auto-resolve tags in preview; user must click Update preview
3147
- if (channel === CHANNELS.VIBER) {
3148
- return;
3149
- }
3150
-
3151
2945
  // Update preview with prefilled values (this is a valid preview call trigger)
3152
2946
  // For RCS: always dispatch with RCS channel/content so previewDataHtml stays RCS-shaped.
3153
2947
  // SMS fallback preview is kept in sync by syncSmsFallbackPreview via smsFallbackPreviewText.
@@ -3230,7 +3024,6 @@ const CommonTestAndPreview = (props) => {
3230
3024
  setPreviewDevice(DESKTOP);
3231
3025
  setPreviewDataHtml('');
3232
3026
  setHasPreviewCallBeenMade(false); // Reset preview call flag
3233
- setViberPreviewTagValues(null);
3234
3027
  setSelectedTestEntities([]);
3235
3028
  setBeeContent('');
3236
3029
  previousBeeContentRef.current = '';
@@ -3268,7 +3061,6 @@ const CommonTestAndPreview = (props) => {
3268
3061
  const handleClearSelection = () => {
3269
3062
  setSelectedCustomer(null);
3270
3063
  setHasPreviewCallBeenMade(false); // Reset flag when customer is cleared
3271
- setViberPreviewTagValues(null);
3272
3064
 
3273
3065
  // Clear all preview errors when customer is cleared
3274
3066
  actions.clearPreviewErrors();
@@ -3327,9 +3119,6 @@ const CommonTestAndPreview = (props) => {
3327
3119
  emptyValues,
3328
3120
  selectedCustomer
3329
3121
  );
3330
- if (channel === CHANNELS.VIBER) {
3331
- setViberPreviewTagValues({ ...emptyValues });
3332
- }
3333
3122
  actions.updatePreviewRequested(payload);
3334
3123
  setHasPreviewCallBeenMade(true); // Mark that preview call was made
3335
3124
  };
@@ -3355,9 +3144,6 @@ const CommonTestAndPreview = (props) => {
3355
3144
  customValues,
3356
3145
  selectedCustomer
3357
3146
  );
3358
- if (channel === CHANNELS.VIBER) {
3359
- setViberPreviewTagValues({ ...customValues });
3360
- }
3361
3147
  await actions.updatePreviewRequested(payload);
3362
3148
 
3363
3149
  await syncSmsFallbackPreview(customValues, selectedCustomer);