@capillarytech/creatives-library 6.7.1 → 6.8.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.
Files changed (85) hide show
  1. package/assets/line-image-placeholder.svg +14 -0
  2. package/assets/line.png +0 -0
  3. package/assets/smiley-placeholder.svg +11 -0
  4. package/components/TemplatePreview/index.js +185 -8
  5. package/index.js +3 -3
  6. package/package.json +1 -1
  7. package/routes.js +2 -2
  8. package/services/api.js +3 -0
  9. package/styles/vendor/semantic/src/definitions/modules/accordion.less +219 -219
  10. package/v2Components/TemplatePreview/WechatRichmediaTemplatePreview/index.js +1 -1
  11. package/v2Components/TemplatePreview/assets/images/WECHAT_5x.png +0 -0
  12. package/v2Components/TemplatePreview/index.js +164 -12
  13. package/v2Components/TemplatePreview/messages.js +8 -0
  14. package/v2Containers/CreativesContainer/SlideBoxContent.js +51 -17
  15. package/v2Containers/CreativesContainer/index.js +23 -17
  16. package/v2Containers/Line/Container/Drawer/index.js +93 -0
  17. package/v2Containers/Line/Container/Image/constants.js +3 -0
  18. package/v2Containers/Line/Container/Image/index.js +460 -0
  19. package/v2Containers/Line/Container/Image/messages.js +86 -0
  20. package/v2Containers/Line/Container/Image/style.js +32 -0
  21. package/v2Containers/Line/Container/ImageMap/assets/hover/custom.png +0 -0
  22. package/v2Containers/Line/Container/ImageMap/assets/hover/templateEight.png +0 -0
  23. package/v2Containers/Line/Container/ImageMap/assets/hover/templateFive.png +0 -0
  24. package/v2Containers/Line/Container/ImageMap/assets/hover/templateFour.png +0 -0
  25. package/v2Containers/Line/Container/ImageMap/assets/hover/templateOne.png +0 -0
  26. package/v2Containers/Line/Container/ImageMap/assets/hover/templateSeven.png +0 -0
  27. package/v2Containers/Line/Container/ImageMap/assets/hover/templateSix.png +0 -0
  28. package/v2Containers/Line/Container/ImageMap/assets/hover/templateThree.png +0 -0
  29. package/v2Containers/Line/Container/ImageMap/assets/hover/templateTwo.png +0 -0
  30. package/v2Containers/Line/Container/ImageMap/assets/selected/custom.png +0 -0
  31. package/v2Containers/Line/Container/ImageMap/assets/selected/templateEight.png +0 -0
  32. package/v2Containers/Line/Container/ImageMap/assets/selected/templateFive.png +0 -0
  33. package/v2Containers/Line/Container/ImageMap/assets/selected/templateFour.png +0 -0
  34. package/v2Containers/Line/Container/ImageMap/assets/selected/templateOne.png +0 -0
  35. package/v2Containers/Line/Container/ImageMap/assets/selected/templateSeven.png +0 -0
  36. package/v2Containers/Line/Container/ImageMap/assets/selected/templateSix.png +0 -0
  37. package/v2Containers/Line/Container/ImageMap/assets/selected/templateThree.png +0 -0
  38. package/v2Containers/Line/Container/ImageMap/assets/selected/templateTwo.png +0 -0
  39. package/v2Containers/Line/Container/ImageMap/assets/templates/custom.png +0 -0
  40. package/v2Containers/Line/Container/ImageMap/assets/templates/templateEight.png +0 -0
  41. package/v2Containers/Line/Container/ImageMap/assets/templates/templateFive.png +0 -0
  42. package/v2Containers/Line/Container/ImageMap/assets/templates/templateFour.png +0 -0
  43. package/v2Containers/Line/Container/ImageMap/assets/templates/templateOne.png +0 -0
  44. package/v2Containers/Line/Container/ImageMap/assets/templates/templateSeven.png +0 -0
  45. package/v2Containers/Line/Container/ImageMap/assets/templates/templateSix.png +0 -0
  46. package/v2Containers/Line/Container/ImageMap/assets/templates/templateThree.png +0 -0
  47. package/v2Containers/Line/Container/ImageMap/assets/templates/templateTwo.png +0 -0
  48. package/v2Containers/Line/Container/ImageMap/assets/templates_with_alphabets/custom.png +0 -0
  49. package/v2Containers/Line/Container/ImageMap/assets/templates_with_alphabets/templateEight.png +0 -0
  50. package/v2Containers/Line/Container/ImageMap/assets/templates_with_alphabets/templateFive.png +0 -0
  51. package/v2Containers/Line/Container/ImageMap/assets/templates_with_alphabets/templateFour.png +0 -0
  52. package/v2Containers/Line/Container/ImageMap/assets/templates_with_alphabets/templateOne.png +0 -0
  53. package/v2Containers/Line/Container/ImageMap/assets/templates_with_alphabets/templateSeven.png +0 -0
  54. package/v2Containers/Line/Container/ImageMap/assets/templates_with_alphabets/templateSix.png +0 -0
  55. package/v2Containers/Line/Container/ImageMap/assets/templates_with_alphabets/templateThree.png +0 -0
  56. package/v2Containers/Line/Container/ImageMap/assets/templates_with_alphabets/templateTwo.png +0 -0
  57. package/v2Containers/Line/Container/ImageMap/constants.js +19 -0
  58. package/v2Containers/Line/Container/ImageMap/index.js +603 -0
  59. package/v2Containers/Line/Container/ImageMap/messages.js +126 -0
  60. package/v2Containers/Line/Container/ImageMap/style.js +94 -0
  61. package/v2Containers/Line/Container/ImageMap/templates.json +195 -0
  62. package/v2Containers/Line/Container/Sticker/index.js +224 -0
  63. package/v2Containers/Line/Container/Sticker/messages.js +34 -0
  64. package/v2Containers/Line/Container/Sticker/style.js +36 -0
  65. package/v2Containers/Line/Container/Sticker/utils.js +68 -0
  66. package/v2Containers/Line/Container/Text/index.js +338 -0
  67. package/v2Containers/Line/Container/Text/messages.js +74 -0
  68. package/v2Containers/Line/Container/Text/style.js +37 -0
  69. package/v2Containers/Line/Container/Wrapper/index.js +152 -0
  70. package/v2Containers/Line/Container/Wrapper/messages.js +46 -0
  71. package/v2Containers/Line/Container/Wrapper/style.js +44 -0
  72. package/v2Containers/Line/Container/Wrapper/utils.js +67 -0
  73. package/v2Containers/Line/Container/_lineCreate.scss +108 -0
  74. package/v2Containers/Line/Container/actions.js +99 -0
  75. package/v2Containers/Line/Container/constants.js +48 -0
  76. package/v2Containers/Line/Container/index.js +581 -0
  77. package/v2Containers/Line/Container/messages.js +66 -0
  78. package/v2Containers/Line/Container/reducer.js +103 -0
  79. package/v2Containers/Line/Container/sagas.js +137 -0
  80. package/v2Containers/Line/Container/selectors.js +30 -0
  81. package/v2Containers/Line/Container/style.js +57 -0
  82. package/v2Containers/Line/Create/index.js +1 -1
  83. package/v2Containers/Templates/index.js +40 -22
  84. package/v2Containers/Templates/messages.js +8 -0
  85. package/v2Containers/TemplatesV2/index.js +13 -0
@@ -11,14 +11,13 @@ import EmailWrapper from '../EmailWrapper';
11
11
  import MobilepushWrapper from '../MobilepushWrapper';
12
12
  import EmailPreviewV2 from '../../v2Components/EmailPreviewV2';
13
13
  import MobilePushPreview from '../../v2Components/MobilePushPreviewV2';
14
- import LineEdit from '../Line/Create';
15
14
  import WechatWrapper from '../WeChat/Wrapper';
16
15
  import Facebook from '../Facebook';
17
16
  import { RICH_MEDIA, MAP_TEMPLATE, CREATE } from '../WeChat/Wrapper/constants';
18
17
  import CallTask from '../CallTask';
19
18
  import MobliPushEdit from '../MobilePush/Edit';
20
19
  import * as constants from './constants';
21
- import CreateLineWrapper from '../Line/CreateWrapper';
20
+ import LineContainer from '../Line/Container';
22
21
  const CreativesWrapper = styled.div`
23
22
  .ant-popover,
24
23
  .ant-notification,
@@ -115,6 +114,8 @@ function SlideBoxContent(props) {
115
114
  onFacebookSubmit,
116
115
  saveMessage,
117
116
  selectedAccount,
117
+ onShowTemplates,
118
+ handleClose,
118
119
  } = props;
119
120
  const type = (messageDetails.type || '').toLowerCase(); // type is context in get tags values : outbound | dvs | referral | loyalty | coupons
120
121
  const query = { type: !isFullMode && 'embedded', module: isFullMode ? 'default' : 'library', isEditFromCampaigns: (templateData || {}).isEditFromCampaigns};
@@ -164,20 +165,45 @@ function SlideBoxContent(props) {
164
165
  case constants.SMS:
165
166
  return get(templateDataObject, `versions.base['sms-editor']`);
166
167
  case constants.LINE: {
167
- const content = get(templateDataObject, `versions.base.content.messages[0]`, {});
168
- let previewContent = {};
169
- if (content.text) {
170
- previewContent = {
171
- bodyText: content.text,
168
+ const lineContents = get(templateDataObject, `versions.base.content.messages`, [{}]);
169
+ const previewContent = [];
170
+ return lineContents.map(({
171
+ text,
172
+ previewImageUrl,
173
+ selectedSticker,
174
+ stickerUrl,
175
+ animatedStickerUrl,
176
+ stickerId,
177
+ packageId,
178
+ baseUrl
179
+ }) => {
180
+ let previewContent = {};
181
+ previewContent.messageContent = text;
182
+ previewContent.previewImageUrl = previewImageUrl;
183
+ previewContent.selectedSticker = selectedSticker || {
184
+ stickerUrl,
185
+ animatedStickerUrl,
186
+ stickerId,
187
+ packageId,
172
188
  };
173
- }
174
- if (content.originalContentUrl) {
175
- previewContent = {
176
- ...previewContent,
177
- bodyImage: content.previewImageUrl,
189
+ previewContent.baseUrl = baseUrl;
190
+ const getType = () => {
191
+ if (text) {
192
+ return 'text';
193
+ }
194
+ if (previewImageUrl) {
195
+ return 'image';
196
+ }
197
+ if (selectedSticker || stickerUrl) {
198
+ return 'sticker';
199
+ }
200
+ if (baseUrl) {
201
+ return 'imagemap';
202
+ }
178
203
  };
179
- }
180
- return previewContent;
204
+ previewContent.type = getType();
205
+ return previewContent;
206
+ });
181
207
  }
182
208
  default:
183
209
  return get(templateDataObject, `versions.base.content`);
@@ -202,8 +228,12 @@ function SlideBoxContent(props) {
202
228
  channelsToDisable={channelsToDisable}
203
229
  messageDetails={messageDetails}
204
230
  onFacebookSubmit={onFacebookSubmit}
231
+ location={creativesLocationProps}
232
+ onCreateComplete={onCreateComplete}
233
+ getFormSubscriptionData={getFormData}
234
+ handleClose={handleClose}
205
235
  />
206
- )}
236
+ )}
207
237
  {isPreview && (
208
238
  <TemplatePreview
209
239
  content={getChannelPreviewContent(templateData)}
@@ -414,7 +444,7 @@ function SlideBoxContent(props) {
414
444
  }
415
445
  {
416
446
  isEditLine && (
417
- <LineEdit
447
+ <LineContainer
418
448
  location={creativesLocationProps}
419
449
  params={{
420
450
  id: templateData._id,
@@ -428,12 +458,13 @@ function SlideBoxContent(props) {
428
458
  isGetFormData={isGetFormData}
429
459
  templateData={templateData}
430
460
  selectedAccount={selectedAccount}
461
+ handleClose={handleClose}
431
462
  />
432
463
  )
433
464
  }
434
465
  {
435
466
  isCreateLine && (
436
- <CreateLineWrapper
467
+ <LineContainer
437
468
  location={creativesLocationProps}
438
469
  onCreateComplete={onCreateComplete}
439
470
  isFullMode={isFullMode}
@@ -442,6 +473,9 @@ function SlideBoxContent(props) {
442
473
  selectedAccount={selectedAccount}
443
474
  templateData={templateData}
444
475
  getFormSubscriptionData={getFormData}
476
+ onShowTemplates={onShowTemplates}
477
+ createNew
478
+ handleClose={handleClose}
445
479
  />
446
480
  )
447
481
  }
@@ -136,7 +136,8 @@ class Creatives extends React.Component {
136
136
  this.setState({ isGetFormData: false });
137
137
  };
138
138
  getTemplateData = (templateData) => { //from consumers to creatives
139
- const {isFullMode} = this.props;
139
+ const {isFullMode, messageDetails = {}} = this.props;
140
+ const { additionalProperties = {} } = messageDetails;
140
141
  if (!isFullMode && templateData) { // for component mode
141
142
  const {channel} = templateData;
142
143
  let creativesTemplateData = {type: channel };
@@ -216,27 +217,29 @@ class Creatives extends React.Component {
216
217
  break;
217
218
  }
218
219
  case constants.LINE: {
219
- const { messageBody= '{}', isDefault } = templateData;
220
- const {
221
- messages,
222
- to,
223
- messages: [{
224
- type,
225
- }] = [{}],
226
- } = JSON.parse(messageBody);
220
+ const { messageBody, isDefault } = templateData;
221
+ const { messages = '[]' } = additionalProperties;
222
+ const messagesDefinition = JSON.parse(messages);
223
+ let lineContent = JSON.parse(messageBody || '{}').messages || [{}];
224
+ lineContent = lineContent.map((content, index) => {
225
+ return {
226
+ ...content,
227
+ ...(messagesDefinition[index] || {})
228
+ };
229
+ })
227
230
  creativesTemplateData = {
228
231
  type: constants.LINE,
229
232
  isDefault,
230
233
  edit: true,
231
234
  definition: {
232
- mode: type,
235
+ mode: constants.LINE,
233
236
  },
234
237
  name: "Campaign message Line content",
235
238
  versions: {
236
239
  base: {
237
240
  content: {
238
- messages,
239
- to,
241
+ messages: lineContent,
242
+ to: "{{line_id}}",
240
243
  },
241
244
  },
242
245
  },
@@ -311,9 +314,10 @@ class Creatives extends React.Component {
311
314
  case constants.LINE:
312
315
  if (template.value) {
313
316
  const { versions } = template.value;
314
- const { Templates } = this.props;
317
+ const { Templates, templateData: templateDataProps } = this.props;
318
+ const { accountDetails: selectedAccountDetails } = templateDataProps || {};
315
319
  const selectedLineAccount = Templates && Templates.selectedLineAccount;
316
- const accountDetails = !!selectedLineAccount ? JSON.stringify(Templates.selectedLineAccount) : '';
320
+ const accountDetails = !!selectedLineAccount ? JSON.stringify(selectedLineAccount) : (selectedAccountDetails || '');
317
321
  const accountId = !!selectedLineAccount ? selectedLineAccount.id : '';
318
322
  templateData = {
319
323
  channel,
@@ -438,8 +442,8 @@ class Creatives extends React.Component {
438
442
  }
439
443
 
440
444
  const isLineChannel = templateData && templateData.type === constants.LINE;
441
- if (isFullMode ? channel === constants.LINE : isLineChannel) {
442
- showFooter = showFooter && isFullMode;
445
+ if (channel === constants.LINE || isLineChannel) {
446
+ showFooter = false;
443
447
  }
444
448
 
445
449
  return showFooter;
@@ -595,7 +599,9 @@ class Creatives extends React.Component {
595
599
  onFacebookSubmit={getCreativesData}
596
600
  saveMessage={this.saveMessage}
597
601
  selectedAccount={this.props.selectedAccount}
598
- />
602
+ onShowTemplates={this.onShowTemplates}
603
+ handleClose={this.handleCloseSlideBox}
604
+ />
599
605
  }
600
606
  footer={this.shouldShowFooter() &&
601
607
  <SlideBoxFooter
@@ -0,0 +1,93 @@
1
+ import React, { useState, useEffect } from 'react';
2
+ import CapInput from '@capillarytech/cap-ui-library/CapInput';
3
+ import CapCustomCard from '@capillarytech/cap-ui-library/CapCustomCard';
4
+ import Pagination from '../../../../v2Components/Pagination';
5
+
6
+ const {CapCustomCardList} = CapCustomCard;
7
+
8
+ export const LineDrawer = ({
9
+ getAllTemplates,
10
+ cardDataList,
11
+ isDrawer,
12
+ searchPlaceholder,
13
+ }) => {
14
+
15
+ const [currentPage, updateCurrentPage] = useState(0);
16
+ const [searchText, updateSearchText] = useState('');
17
+
18
+ useEffect(() => {
19
+ if (!isDrawer) {
20
+ updateCurrentPage(0);
21
+ searchTemplate('');
22
+ }
23
+ }, [isDrawer]);
24
+
25
+ let delayTimer = 0;
26
+
27
+ const getAllLineTemplate = ({params = {} , getNextPage, resetPage}, isReRender = false) => {
28
+ let queryParams = {
29
+ sortBy: 'Most Recent',
30
+ ...params,
31
+ };
32
+ let page = currentPage;
33
+ if (getNextPage) {
34
+ page += 1;
35
+ }
36
+
37
+ if (resetPage) {
38
+ page = 1;
39
+ }
40
+ queryParams.page = page;
41
+ queryParams.perPage = 25;
42
+
43
+ if (params.name !== "") {
44
+ queryParams.name = params.name;
45
+ queryParams.page = 1;
46
+ }
47
+ updateCurrentPage(page);
48
+
49
+ getAllTemplates('Line', queryParams);
50
+ };
51
+
52
+ const delayedSearch = (callback, ms) => {
53
+ clearTimeout(delayTimer);
54
+ delayTimer = setTimeout(callback, ms);
55
+ }
56
+
57
+ const searchTemplate = (value) => {
58
+ updateSearchText(value);
59
+ delayedSearch(() => {
60
+ const params = {
61
+ name: value,
62
+ sortBy: 'Most Recent',
63
+ };
64
+ getAllLineTemplate({params, resetPage: true});
65
+
66
+ }, 1000);
67
+ }
68
+
69
+ return (
70
+ <>
71
+ <CapInput.Search
72
+ className="search-text"
73
+ style={{width: 324}}
74
+ value={searchText}
75
+ placeholder={searchPlaceholder}
76
+ onChange={(e) => searchTemplate(e.target.value)}
77
+ onClear={() => searchTemplate('')}
78
+ />
79
+ <Pagination onPageChange={() => { getAllLineTemplate({getNextPage: true}); }} paginationSelector="pagination-container">
80
+ <div className="pagination-container">
81
+ <CapCustomCardList
82
+ key={'LINE-card-list'}
83
+ cardList={cardDataList}
84
+ type="LINE"
85
+ style={{marginLeft: '16px'}}
86
+ />
87
+ </div>
88
+ </Pagination>
89
+ </>
90
+ )
91
+ }
92
+
93
+ export default LineDrawer;
@@ -0,0 +1,3 @@
1
+ export const LINE_IMG_HEIGHT = 400;
2
+ export const LINE_IMG_WIDTH = 300;
3
+ export const LINE_IMG_SIZE = 30000000;