@capillarytech/creatives-library 2.0.62 → 2.0.63
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/NoImage1.js +50 -0
- package/assets/WithImage1.js +57 -0
- package/components/EmailPreview/assets/images/iPad.svg +10 -0
- package/components/EmailPreview/assets/images/mobile.png +0 -0
- package/components/FormBuilder/_formBuilder.scss +7 -1
- package/components/FormBuilder/index.js +96 -65
- package/components/MobilePushPreviewV2/index.js +120 -0
- package/components/MobilePushPreviewV2/messages.js +13 -0
- package/components/MobilePushPreviewV2/tests/index.test.js +10 -0
- package/components/TemplatePreview/index.js +1 -1
- package/containers/CreativesContainer/SlideBoxContent.js +27 -4
- package/containers/CreativesContainer/SlideBoxFooter.js +3 -3
- package/containers/CreativesContainer/index.js +71 -24
- package/containers/MobilePush/Create/_mobilePushCreate.scss +13 -0
- package/containers/MobilePush/Create/actions.js +6 -0
- package/containers/MobilePush/Create/constants.js +1 -0
- package/containers/MobilePush/Create/index.js +630 -1130
- package/containers/MobilePush/Create/messages.js +5 -1
- package/containers/MobilePush/Create/reducer.js +2 -0
- package/containers/MobilePush/Create/selectors.js +3 -3
- package/containers/MobilePush/Edit/_mobilePushCreate.scss +10 -0
- package/containers/MobilePush/Edit/index.js +375 -1106
- package/containers/MobilePush/Edit/messages.js +4 -0
- package/containers/MobilePush/Edit/reducer.js +2 -1
- package/containers/MobilePush/Edit/selectors.js +3 -1
- package/containers/MobilePush/commonMethods.js +249 -0
- package/containers/MobilePush/eventsMap.js +127 -0
- package/containers/MobilePush/initialSchema.js +1751 -0
- package/containers/MobilepushWrapper/_mobilepushWrapper.scss +18 -0
- package/containers/MobilepushWrapper/index.js +95 -0
- package/containers/MobilepushWrapper/messages.js +25 -0
- package/containers/MobilepushWrapper/tests/index.test.js +10 -0
- package/containers/WeChat/_wechat.scss +8 -0
- package/containers/WeChat/actions.js +52 -0
- package/containers/WeChat/constants.js +28 -0
- package/containers/WeChat/index.js +1635 -0
- package/containers/WeChat/messages.js +73 -0
- package/containers/WeChat/reducer.js +74 -0
- package/containers/WeChat/sagas.js +86 -0
- package/containers/WeChat/selectors.js +25 -0
- package/containers/WeChat/tests/actions.test.js +18 -0
- package/containers/WeChat/tests/index.test.js +10 -0
- package/containers/WeChat/tests/reducer.test.js +9 -0
- package/containers/WeChat/tests/sagas.test.js +15 -0
- package/containers/WeChat/tests/selectors.test.js +10 -0
- package/index.js +1 -1
- package/package.json +1 -1
- package/services/api.js +3 -0
|
@@ -155,7 +155,7 @@ class TemplatePreview extends React.Component { // eslint-disable-line react/pre
|
|
|
155
155
|
</div>
|
|
156
156
|
: ''
|
|
157
157
|
}
|
|
158
|
-
{this.props.templateData &&
|
|
158
|
+
{this.props.templateData && this.props.templateData.updatedByName &&
|
|
159
159
|
[<p className="preview-info" key="preview-info-modified"><FormattedMessage {...messages.lastModified} />: {moment(this.props.templateData.updatedAt).format('MM-DD-YYYY')}</p>,
|
|
160
160
|
<p style={{marginBottom: '8px'}} className="preview-info" key="preview-info-updated"><FormattedMessage {...messages.uploadedBy} /> : {this.props.templateData.updatedByName}</p>,
|
|
161
161
|
]
|
|
@@ -7,6 +7,7 @@ import SmsCreate from '../Sms/Create';
|
|
|
7
7
|
import SmsEdit from '../Sms/Edit';
|
|
8
8
|
import Email from '../Email';
|
|
9
9
|
import EmailWrapper from '../EmailWrapper';
|
|
10
|
+
import MobilepusWrapper from '../MobilepushWrapper';
|
|
10
11
|
import EmailPreviewV2 from '../../components/EmailPreviewV2';
|
|
11
12
|
import CallTask from '../CallTask';
|
|
12
13
|
import MobliPushEdit from '../MobilePush/Edit';
|
|
@@ -33,8 +34,10 @@ function SlideBoxContent(props) {
|
|
|
33
34
|
onChannelChange,
|
|
34
35
|
onEmailModeChange,
|
|
35
36
|
emailCreateMode,
|
|
37
|
+
onMobilepushModeChange,
|
|
38
|
+
mobilePushCreateMode,
|
|
36
39
|
templateStep,
|
|
37
|
-
|
|
40
|
+
onCreateNextStep,
|
|
38
41
|
cap,
|
|
39
42
|
onResetStep,
|
|
40
43
|
isFullMode,
|
|
@@ -152,7 +155,7 @@ function SlideBoxContent(props) {
|
|
|
152
155
|
templateData={templateData}
|
|
153
156
|
type={type}
|
|
154
157
|
step={templateStep}
|
|
155
|
-
showNextStep={
|
|
158
|
+
showNextStep={onCreateNextStep}
|
|
156
159
|
isFullMode={isFullMode}
|
|
157
160
|
cap={cap}
|
|
158
161
|
onResetStep={onResetStep}
|
|
@@ -181,7 +184,7 @@ function SlideBoxContent(props) {
|
|
|
181
184
|
getFormLibraryData={getFormData}
|
|
182
185
|
setIsLoadingContent={setIsLoadingContent}
|
|
183
186
|
location={{
|
|
184
|
-
pathname: `/mobilepush
|
|
187
|
+
pathname: `/mobilepush/edit/`,
|
|
185
188
|
query,
|
|
186
189
|
}}
|
|
187
190
|
isFullMode={false}
|
|
@@ -190,6 +193,24 @@ function SlideBoxContent(props) {
|
|
|
190
193
|
templateData={templateData}
|
|
191
194
|
/>
|
|
192
195
|
}
|
|
196
|
+
{isCreateMPush &&
|
|
197
|
+
<MobilepusWrapper
|
|
198
|
+
key="creatives-mobilepush-wrapper"
|
|
199
|
+
date={new Date().getMilliseconds()}
|
|
200
|
+
setIsLoadingContent={setIsLoadingContent}
|
|
201
|
+
onMobilepushModeChange={onMobilepushModeChange}
|
|
202
|
+
mobilePushCreateMode={mobilePushCreateMode}
|
|
203
|
+
isGetFormData={isGetFormData}
|
|
204
|
+
getFormData={getFormData}
|
|
205
|
+
templateData={templateData}
|
|
206
|
+
type={type}
|
|
207
|
+
step={templateStep}
|
|
208
|
+
showNextStep={onCreateNextStep}
|
|
209
|
+
isFullMode={isFullMode}
|
|
210
|
+
cap={cap}
|
|
211
|
+
onResetStep={onResetStep}
|
|
212
|
+
query={query}/>
|
|
213
|
+
}
|
|
193
214
|
</CreativesWrapper>
|
|
194
215
|
);
|
|
195
216
|
}
|
|
@@ -208,11 +229,13 @@ SlideBoxContent.propTypes = {
|
|
|
208
229
|
onEmailModeChange: PropTypes.func,
|
|
209
230
|
emailCreateMode: PropTypes.string,
|
|
210
231
|
templateStep: PropTypes.string,
|
|
211
|
-
|
|
232
|
+
onCreateNextStep: PropTypes.func,
|
|
212
233
|
cap: PropTypes.object,
|
|
213
234
|
onResetStep: PropTypes.func,
|
|
214
235
|
onCallTaskSubmit: PropTypes.func,
|
|
215
236
|
isFullMode: PropTypes.bool,
|
|
216
237
|
setIsLoadingContent: PropTypes.func,
|
|
238
|
+
onMobilepushModeChange: PropTypes.func,
|
|
239
|
+
mobilePushCreateMode: PropTypes.string,
|
|
217
240
|
};
|
|
218
241
|
export default SlideBoxContent;
|
|
@@ -3,7 +3,7 @@ import { FormattedMessage } from 'react-intl';
|
|
|
3
3
|
import { CapButton } from '@capillarytech/cap-ui-library';
|
|
4
4
|
import PropTypes from 'prop-types';
|
|
5
5
|
function SlideBoxFooter(props) {
|
|
6
|
-
const { slidBoxContent, onSave, messages, onEditTemplate,
|
|
6
|
+
const { slidBoxContent, onSave, messages, onEditTemplate, onCreateNextStep} = props;
|
|
7
7
|
return (
|
|
8
8
|
<div>
|
|
9
9
|
<div>
|
|
@@ -13,7 +13,7 @@ function SlideBoxFooter(props) {
|
|
|
13
13
|
</CapButton>
|
|
14
14
|
)}
|
|
15
15
|
{props.shouldShowContinueFooter() &&
|
|
16
|
-
<CapButton onClick={
|
|
16
|
+
<CapButton onClick={onCreateNextStep}>
|
|
17
17
|
<FormattedMessage {...messages.continue} />
|
|
18
18
|
</CapButton>
|
|
19
19
|
}
|
|
@@ -31,7 +31,7 @@ SlideBoxFooter.propTypes = {
|
|
|
31
31
|
onSave: PropTypes.func,
|
|
32
32
|
messages: PropTypes.object,
|
|
33
33
|
onEditTemplate: PropTypes.func,
|
|
34
|
-
|
|
34
|
+
onCreateNextStep: PropTypes.func,
|
|
35
35
|
shouldShowContinueFooter: PropTypes.func,
|
|
36
36
|
shouldShowDoneFooter: PropTypes.func,
|
|
37
37
|
};
|
|
@@ -5,7 +5,7 @@ import {
|
|
|
5
5
|
} from '@capillarytech/cap-ui-library';
|
|
6
6
|
import { injectIntl } from 'react-intl';
|
|
7
7
|
import classnames from 'classnames';
|
|
8
|
-
import {isEmpty, get} from 'lodash';
|
|
8
|
+
import {isEmpty, get, forEach} from 'lodash';
|
|
9
9
|
import { connect } from 'react-redux';
|
|
10
10
|
import { createStructuredSelector } from 'reselect';
|
|
11
11
|
import { bindActionCreators } from 'redux';
|
|
@@ -71,11 +71,11 @@ class Creatives extends React.Component {
|
|
|
71
71
|
onChannelChange = (channel) => {
|
|
72
72
|
this.setState({currentChannel: channel});
|
|
73
73
|
}
|
|
74
|
-
|
|
74
|
+
onCreateNextStep = () => {
|
|
75
75
|
this.setState((prevState) => {
|
|
76
76
|
let templateStep = prevState.templateStep + 1;
|
|
77
77
|
const {emailCreateMode, currentChannel} = prevState;
|
|
78
|
-
if (currentChannel.toUpperCase() === constants.EMAIL && emailCreateMode === "upload") {
|
|
78
|
+
if ((currentChannel.toUpperCase() === constants.EMAIL && emailCreateMode === "upload") || currentChannel.toUpperCase() === constants.MOBILE_PUSH) {
|
|
79
79
|
templateStep = prevState.templateStep + 2;
|
|
80
80
|
}
|
|
81
81
|
|
|
@@ -88,7 +88,9 @@ class Creatives extends React.Component {
|
|
|
88
88
|
onEmailModeChange = (mode) => {
|
|
89
89
|
this.setState({ emailCreateMode: mode});
|
|
90
90
|
}
|
|
91
|
-
|
|
91
|
+
onMobilepushModeChange = (mode) => {
|
|
92
|
+
this.setState({ mobilePushCreateMode: mode});
|
|
93
|
+
}
|
|
92
94
|
|
|
93
95
|
onCallTaskSubmit = (data) => {
|
|
94
96
|
this.props.getCreativesData({
|
|
@@ -118,10 +120,11 @@ class Creatives extends React.Component {
|
|
|
118
120
|
const formData = {
|
|
119
121
|
subject: templateData.emailSubject,
|
|
120
122
|
html_content: templateData.emailBody,
|
|
121
|
-
is_drag_drop:
|
|
122
|
-
lang_id:
|
|
123
|
-
iso_code:
|
|
124
|
-
language:
|
|
123
|
+
is_drag_drop: templateData.is_drag_drop,
|
|
124
|
+
lang_id: templateData.lang_id,
|
|
125
|
+
iso_code: templateData.iso_code,
|
|
126
|
+
language: templateData.language,
|
|
127
|
+
drag_drop_id: templateData.drag_drop_id,
|
|
125
128
|
};
|
|
126
129
|
creativesTeplateData = {
|
|
127
130
|
base: formData,
|
|
@@ -136,6 +139,19 @@ class Creatives extends React.Component {
|
|
|
136
139
|
edit: true,
|
|
137
140
|
type: channel,
|
|
138
141
|
};
|
|
142
|
+
} else if (channel === constants.MOBILE_PUSH) {
|
|
143
|
+
const mode = get(templateData, 'androidContent.type') || get(templateData, 'iosContent.type');
|
|
144
|
+
creativesTeplateData = {
|
|
145
|
+
type: channel,
|
|
146
|
+
name: templateData.messageSubject,
|
|
147
|
+
versions: {
|
|
148
|
+
base: {
|
|
149
|
+
ANDROID: templateData.androidContent,
|
|
150
|
+
IOS: templateData.iosContent,
|
|
151
|
+
},
|
|
152
|
+
},
|
|
153
|
+
definition: {accountId: templateData.accountId, mode: mode.toLowerCase()},
|
|
154
|
+
};
|
|
139
155
|
}
|
|
140
156
|
return creativesTeplateData;
|
|
141
157
|
}
|
|
@@ -143,12 +159,14 @@ class Creatives extends React.Component {
|
|
|
143
159
|
}
|
|
144
160
|
|
|
145
161
|
getCreativesData = (channel, template) => { //from creatives to consumers
|
|
146
|
-
|
|
162
|
+
let templateData = {channel };
|
|
147
163
|
if (channel === constants.SMS && template.value.base) {
|
|
148
164
|
templateData.messageBody = template.value.base['sms-editor'];
|
|
149
165
|
} else if (channel === constants.EMAIL && template.value.base) {
|
|
150
|
-
|
|
151
|
-
templateData
|
|
166
|
+
const emailBase = template.value.base;
|
|
167
|
+
templateData = {...templateData, ...emailBase, emailBody: emailBase.html_content, emailSubject: emailBase.subject};
|
|
168
|
+
delete templateData.html_content;
|
|
169
|
+
delete templateData.subject;
|
|
152
170
|
} else if (channel === constants.MOBILE_PUSH && get(template, "value.versions.base")) {
|
|
153
171
|
const mobilpushTemplate = template.value;
|
|
154
172
|
templateData.accountId = get(mobilpushTemplate, 'definition.accountId');
|
|
@@ -157,6 +175,11 @@ class Creatives extends React.Component {
|
|
|
157
175
|
delete androidContent.cuid;
|
|
158
176
|
delete androidContent.luid;
|
|
159
177
|
delete androidContent.communicationId;
|
|
178
|
+
const custom = {};
|
|
179
|
+
forEach(androidContent.custom, (customKeyValue) => {
|
|
180
|
+
custom[customKeyValue.key] = customKeyValue.value;
|
|
181
|
+
} );
|
|
182
|
+
androidContent.custom = custom;
|
|
160
183
|
templateData.androidContent = androidContent;
|
|
161
184
|
templateData.androidContent.type = get(mobilpushTemplate, 'definition.mode').toUpperCase();
|
|
162
185
|
templateData.androidContent.deviceType = 'ANDROID';
|
|
@@ -166,6 +189,11 @@ class Creatives extends React.Component {
|
|
|
166
189
|
delete iosContent.cuid;
|
|
167
190
|
delete iosContent.luid;
|
|
168
191
|
delete iosContent.communicationId;
|
|
192
|
+
const custom = {};
|
|
193
|
+
forEach(iosContent.custom, (customKeyValue) => {
|
|
194
|
+
custom[customKeyValue.key] = customKeyValue.value;
|
|
195
|
+
} );
|
|
196
|
+
iosContent.custom = custom;
|
|
169
197
|
templateData.iosContent = iosContent;
|
|
170
198
|
templateData.iosContent.type = get(mobilpushTemplate, 'definition.mode').toUpperCase();
|
|
171
199
|
templateData.iosContent.deviceType = 'IOS';
|
|
@@ -229,15 +257,19 @@ class Creatives extends React.Component {
|
|
|
229
257
|
};
|
|
230
258
|
shouldShowFooter = () => {
|
|
231
259
|
const {isFullMode } = this.props;
|
|
232
|
-
const {slidBoxContent, currentChannel, emailCreateMode, templateStep} = this.state;
|
|
260
|
+
const {slidBoxContent, currentChannel, emailCreateMode, templateStep, mobilePushCreateMode} = this.state;
|
|
233
261
|
const channel = currentChannel.toUpperCase();
|
|
234
262
|
const currentStep = this.creativesTemplateSteps[templateStep];
|
|
235
263
|
let showFooter = false;
|
|
264
|
+
const isMobilepush = channel === constants.MOBILE_PUSH;
|
|
236
265
|
if (!isFullMode ) {
|
|
237
266
|
const isEmailCreate = slidBoxContent === 'createTemplate' && channel === constants.EMAIL && currentStep !== 'createTemplateContent';
|
|
238
267
|
const isCreate = (slidBoxContent === 'editTemplate' || slidBoxContent === 'createTemplate') && !isEmailCreate;
|
|
239
268
|
const isCallTask = channel === constants.CALL_TASK;
|
|
240
269
|
showFooter = (isCreate || (isEmailCreate && emailCreateMode) || slidBoxContent === 'preview') && !isCallTask;
|
|
270
|
+
if (isMobilepush) {
|
|
271
|
+
showFooter = currentStep === "modeSelection" || (currentStep === 'createTemplateContent' && !isEmpty(mobilePushCreateMode));
|
|
272
|
+
}
|
|
241
273
|
} else if (channel === constants.EMAIL && isFullMode) {
|
|
242
274
|
const isEmailCreate = slidBoxContent === 'createTemplate' && channel === constants.EMAIL && currentStep !== 'createTemplateContent';
|
|
243
275
|
showFooter = isEmailCreate && emailCreateMode;
|
|
@@ -257,23 +289,36 @@ class Creatives extends React.Component {
|
|
|
257
289
|
shouldShowDoneFooter = () => {
|
|
258
290
|
const {slidBoxContent, templateStep, currentChannel} = this.state;
|
|
259
291
|
const currentStep = this.creativesTemplateSteps[templateStep];
|
|
260
|
-
|
|
261
|
-
const
|
|
262
|
-
|
|
292
|
+
let showDone = false;
|
|
293
|
+
const channel = currentChannel.toUpperCase();
|
|
294
|
+
if (channel === constants.EMAIL || channel === constants.SMS) {
|
|
295
|
+
const isEmailCreate = slidBoxContent === 'createTemplate' && currentChannel.toUpperCase() === constants.EMAIL && currentStep !== 'createTemplateContent';
|
|
296
|
+
showDone = (slidBoxContent === 'editTemplate' || slidBoxContent === 'createTemplate') && !isEmailCreate;
|
|
297
|
+
} else if (channel === constants.MOBILE_PUSH) {
|
|
298
|
+
showDone = currentStep === "createTemplateContent" || slidBoxContent === "editTemplate";
|
|
299
|
+
}
|
|
300
|
+
|
|
301
|
+
return showDone;
|
|
263
302
|
}
|
|
264
303
|
shouldShowContinueFooter = () => { // only for email for now, has to be modified according to channel
|
|
265
|
-
const {slidBoxContent, templateStep, currentChannel, emailCreateMode} = this.state;
|
|
304
|
+
const {slidBoxContent, templateStep, currentChannel, emailCreateMode, mobilePushCreateMode} = this.state;
|
|
266
305
|
let isShowContinueFooter = false;
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
306
|
+
const currentStep = this.creativesTemplateSteps[templateStep];
|
|
307
|
+
const channel = currentChannel.toUpperCase();
|
|
308
|
+
if (channel === constants.EMAIL || channel === constants.SMS) {
|
|
309
|
+
if ((emailCreateMode === "upload" && !isEmpty(this.props.EmailLayout)) || emailCreateMode === "editor") {
|
|
310
|
+
let isEmailCreate = slidBoxContent === 'createTemplate';
|
|
311
|
+
isEmailCreate = currentChannel.toUpperCase() === constants.EMAIL && ((emailCreateMode === "upload" && currentStep !== 'createTemplateContent') || ( emailCreateMode === "editor" && currentStep !== 'createTemplateContent' && currentStep !== "templateSelection"));
|
|
312
|
+
isShowContinueFooter = isEmailCreate && emailCreateMode;
|
|
313
|
+
}
|
|
314
|
+
} else if (currentChannel.toUpperCase() === constants.MOBILE_PUSH) {
|
|
315
|
+
isShowContinueFooter = !isEmpty(mobilePushCreateMode) && currentStep === "modeSelection";
|
|
272
316
|
}
|
|
317
|
+
|
|
273
318
|
return isShowContinueFooter;
|
|
274
319
|
}
|
|
275
320
|
render() {
|
|
276
|
-
const {slidBoxContent, isGetFormData, showSlideBox, templateData, currentChannel, emailCreateMode, templateStep, isLoadingContent} = this.state;
|
|
321
|
+
const {slidBoxContent, isGetFormData, showSlideBox, templateData, currentChannel, emailCreateMode, templateStep, isLoadingContent, mobilePushCreateMode} = this.state;
|
|
277
322
|
const {isFullMode, creativesMode, cap, isUploading} = this.props;
|
|
278
323
|
return (
|
|
279
324
|
<div className={classnames(`${classPrefix} ${isFullMode ? 'creatives-full-mode' : 'creatives-library-mode'}`)}>
|
|
@@ -308,10 +353,12 @@ class Creatives extends React.Component {
|
|
|
308
353
|
onEmailModeChange={this.onEmailModeChange}//used when create is clicked in email
|
|
309
354
|
emailCreateMode={emailCreateMode}// upload zip || use editor are values
|
|
310
355
|
templateStep={this.creativesTemplateSteps[templateStep]}
|
|
311
|
-
|
|
356
|
+
onCreateNextStep={this.onCreateNextStep}
|
|
312
357
|
onResetStep={this.resetStep}
|
|
313
358
|
cap={cap}
|
|
314
359
|
setIsLoadingContent={this.setIsLoadingContent}
|
|
360
|
+
onMobilepushModeChange={this.onMobilepushModeChange}
|
|
361
|
+
mobilePushCreateMode={mobilePushCreateMode}
|
|
315
362
|
/>
|
|
316
363
|
}
|
|
317
364
|
footer={this.shouldShowFooter() &&
|
|
@@ -320,7 +367,7 @@ class Creatives extends React.Component {
|
|
|
320
367
|
onSave={this.saveMessage}
|
|
321
368
|
onEditTemplate={this.onEditTemplate}
|
|
322
369
|
slidBoxContent={slidBoxContent}
|
|
323
|
-
|
|
370
|
+
onCreateNextStep={this.onCreateNextStep}
|
|
324
371
|
currentChannel={currentChannel.toUpperCase()}
|
|
325
372
|
templateStep={this.creativesTemplateSteps[templateStep]}
|
|
326
373
|
emailCreateMode={emailCreateMode}
|
|
@@ -21,3 +21,4 @@ export const CLEAR_CREATE_RESPONSE_FAILURE = 'app/containers/PushMessage/Create/
|
|
|
21
21
|
export const GET_IOS_CTAS = 'app/containers/PushMessage/Create/GET_IOS_CTAS';
|
|
22
22
|
export const GET_IOS_CTAS_SUCCESS = 'app/containers/PushMessage/Create/GET_IOS_CTAS_SUCCESS';
|
|
23
23
|
export const GET_IOS_CTAS_FAILURE = 'app/containers/PushMessage/Create/GET_IOS_CTAS_FAILURE';
|
|
24
|
+
export const RESET_STORE = 'app/containers/PushMessage/Create/RESET_STORE';
|