@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.
- package/assets/line-image-placeholder.svg +14 -0
- package/assets/line.png +0 -0
- package/assets/smiley-placeholder.svg +11 -0
- package/components/TemplatePreview/index.js +185 -8
- package/index.js +3 -3
- package/package.json +1 -1
- package/routes.js +2 -2
- package/services/api.js +3 -0
- package/styles/vendor/semantic/src/definitions/modules/accordion.less +219 -219
- package/v2Components/TemplatePreview/WechatRichmediaTemplatePreview/index.js +1 -1
- package/v2Components/TemplatePreview/assets/images/WECHAT_5x.png +0 -0
- package/v2Components/TemplatePreview/index.js +164 -12
- package/v2Components/TemplatePreview/messages.js +8 -0
- package/v2Containers/CreativesContainer/SlideBoxContent.js +51 -17
- package/v2Containers/CreativesContainer/index.js +23 -17
- package/v2Containers/Line/Container/Drawer/index.js +93 -0
- package/v2Containers/Line/Container/Image/constants.js +3 -0
- package/v2Containers/Line/Container/Image/index.js +460 -0
- package/v2Containers/Line/Container/Image/messages.js +86 -0
- package/v2Containers/Line/Container/Image/style.js +32 -0
- package/v2Containers/Line/Container/ImageMap/assets/hover/custom.png +0 -0
- package/v2Containers/Line/Container/ImageMap/assets/hover/templateEight.png +0 -0
- package/v2Containers/Line/Container/ImageMap/assets/hover/templateFive.png +0 -0
- package/v2Containers/Line/Container/ImageMap/assets/hover/templateFour.png +0 -0
- package/v2Containers/Line/Container/ImageMap/assets/hover/templateOne.png +0 -0
- package/v2Containers/Line/Container/ImageMap/assets/hover/templateSeven.png +0 -0
- package/v2Containers/Line/Container/ImageMap/assets/hover/templateSix.png +0 -0
- package/v2Containers/Line/Container/ImageMap/assets/hover/templateThree.png +0 -0
- package/v2Containers/Line/Container/ImageMap/assets/hover/templateTwo.png +0 -0
- package/v2Containers/Line/Container/ImageMap/assets/selected/custom.png +0 -0
- package/v2Containers/Line/Container/ImageMap/assets/selected/templateEight.png +0 -0
- package/v2Containers/Line/Container/ImageMap/assets/selected/templateFive.png +0 -0
- package/v2Containers/Line/Container/ImageMap/assets/selected/templateFour.png +0 -0
- package/v2Containers/Line/Container/ImageMap/assets/selected/templateOne.png +0 -0
- package/v2Containers/Line/Container/ImageMap/assets/selected/templateSeven.png +0 -0
- package/v2Containers/Line/Container/ImageMap/assets/selected/templateSix.png +0 -0
- package/v2Containers/Line/Container/ImageMap/assets/selected/templateThree.png +0 -0
- package/v2Containers/Line/Container/ImageMap/assets/selected/templateTwo.png +0 -0
- package/v2Containers/Line/Container/ImageMap/assets/templates/custom.png +0 -0
- package/v2Containers/Line/Container/ImageMap/assets/templates/templateEight.png +0 -0
- package/v2Containers/Line/Container/ImageMap/assets/templates/templateFive.png +0 -0
- package/v2Containers/Line/Container/ImageMap/assets/templates/templateFour.png +0 -0
- package/v2Containers/Line/Container/ImageMap/assets/templates/templateOne.png +0 -0
- package/v2Containers/Line/Container/ImageMap/assets/templates/templateSeven.png +0 -0
- package/v2Containers/Line/Container/ImageMap/assets/templates/templateSix.png +0 -0
- package/v2Containers/Line/Container/ImageMap/assets/templates/templateThree.png +0 -0
- package/v2Containers/Line/Container/ImageMap/assets/templates/templateTwo.png +0 -0
- package/v2Containers/Line/Container/ImageMap/assets/templates_with_alphabets/custom.png +0 -0
- package/v2Containers/Line/Container/ImageMap/assets/templates_with_alphabets/templateEight.png +0 -0
- package/v2Containers/Line/Container/ImageMap/assets/templates_with_alphabets/templateFive.png +0 -0
- package/v2Containers/Line/Container/ImageMap/assets/templates_with_alphabets/templateFour.png +0 -0
- package/v2Containers/Line/Container/ImageMap/assets/templates_with_alphabets/templateOne.png +0 -0
- package/v2Containers/Line/Container/ImageMap/assets/templates_with_alphabets/templateSeven.png +0 -0
- package/v2Containers/Line/Container/ImageMap/assets/templates_with_alphabets/templateSix.png +0 -0
- package/v2Containers/Line/Container/ImageMap/assets/templates_with_alphabets/templateThree.png +0 -0
- package/v2Containers/Line/Container/ImageMap/assets/templates_with_alphabets/templateTwo.png +0 -0
- package/v2Containers/Line/Container/ImageMap/constants.js +19 -0
- package/v2Containers/Line/Container/ImageMap/index.js +603 -0
- package/v2Containers/Line/Container/ImageMap/messages.js +126 -0
- package/v2Containers/Line/Container/ImageMap/style.js +94 -0
- package/v2Containers/Line/Container/ImageMap/templates.json +195 -0
- package/v2Containers/Line/Container/Sticker/index.js +224 -0
- package/v2Containers/Line/Container/Sticker/messages.js +34 -0
- package/v2Containers/Line/Container/Sticker/style.js +36 -0
- package/v2Containers/Line/Container/Sticker/utils.js +68 -0
- package/v2Containers/Line/Container/Text/index.js +338 -0
- package/v2Containers/Line/Container/Text/messages.js +74 -0
- package/v2Containers/Line/Container/Text/style.js +37 -0
- package/v2Containers/Line/Container/Wrapper/index.js +152 -0
- package/v2Containers/Line/Container/Wrapper/messages.js +46 -0
- package/v2Containers/Line/Container/Wrapper/style.js +44 -0
- package/v2Containers/Line/Container/Wrapper/utils.js +67 -0
- package/v2Containers/Line/Container/_lineCreate.scss +108 -0
- package/v2Containers/Line/Container/actions.js +99 -0
- package/v2Containers/Line/Container/constants.js +48 -0
- package/v2Containers/Line/Container/index.js +581 -0
- package/v2Containers/Line/Container/messages.js +66 -0
- package/v2Containers/Line/Container/reducer.js +103 -0
- package/v2Containers/Line/Container/sagas.js +137 -0
- package/v2Containers/Line/Container/selectors.js +30 -0
- package/v2Containers/Line/Container/style.js +57 -0
- package/v2Containers/Line/Create/index.js +1 -1
- package/v2Containers/Templates/index.js +40 -22
- package/v2Containers/Templates/messages.js +8 -0
- 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
|
|
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
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
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
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
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
|
-
|
|
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
|
-
<
|
|
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
|
-
<
|
|
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
|
|
220
|
-
const {
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
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:
|
|
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(
|
|
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 (
|
|
442
|
-
showFooter =
|
|
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;
|