@capillarytech/creatives-library 3.2.0 → 3.2.2
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/config/app.js +1 -1
- package/hoc/withStyles.js +12 -0
- package/package.json +1 -1
- package/v2Containers/CreativesContainer/SlideBoxHeader.js +2 -1
- package/v2Containers/CreativesContainer/index.js +4 -1
- package/v2Containers/CreativesContainer/index.scss +6 -3
- package/v2Containers/LanguageProvider/sagas.js +39 -0
- package/v2Containers/TemplatesV2/TemplatesV2.style.js +29 -0
- package/v2Containers/WeChat/MapTemplates/index.js +1 -5
- package/v2Containers/WeChat/RichmediaTemplates/Create/index.js +9 -18
- package/v2Containers/WeChat/RichmediaTemplates/Create/messages.js +90 -46
- package/v2Containers/WeChat/RichmediaTemplates/Create/sagas.js +1 -1
- package/v2Containers/WeChat/RichmediaTemplates/View/index.js +0 -7
package/config/app.js
CHANGED
|
@@ -14,7 +14,7 @@ const config = {
|
|
|
14
14
|
development: {
|
|
15
15
|
api_endpoint: 'https://nightly.capillary.in/arya/api/v1/creatives',
|
|
16
16
|
auth_endpoint: 'https://nightly.capillary.in/arya/api/v1/auth',
|
|
17
|
-
subscription_api_endpoint: 'https://nightly.capillary.in/arya/api/v1/subscription',
|
|
17
|
+
subscription_api_endpoint: 'https://nightly.capillary.in/arya/api/v1/org-settings/subscription',
|
|
18
18
|
login_url: 'auth/login',
|
|
19
19
|
dashboard_url: '/sms',
|
|
20
20
|
dashboard_url_v2: '/v2',
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import styled from 'styled-components';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Higher Order Component to have consistent logic of styling components
|
|
5
|
+
* @param {*} WrappedComponent
|
|
6
|
+
* @returns {*} styled wrapped component
|
|
7
|
+
*/
|
|
8
|
+
export default (WrappedComponent, styles) => {
|
|
9
|
+
const StyledComponent = styled(WrappedComponent)`${styles};`;
|
|
10
|
+
StyledComponent.defaultProps = WrappedComponent.defaultProps;
|
|
11
|
+
return StyledComponent;
|
|
12
|
+
};
|
package/package.json
CHANGED
|
@@ -21,6 +21,7 @@ function getChannelLabel(channel) {
|
|
|
21
21
|
function SlideBoxHeader(props) {
|
|
22
22
|
const { slidBoxContent, templateData, onShowTemplates, creativesMode, isFullMode, showPrefix, shouldShowTemplateName, channel, templateNameRenderProp, weChatTemplateType, onWeChatMaptemplateStepChange, weChatMaptemplateStep, templateStep } = props;
|
|
23
23
|
const showTemplateNameHeader = isFullMode && shouldShowTemplateName;
|
|
24
|
+
const mapTemplateCreate = !showTemplateNameHeader && slidBoxContent === 'createTemplate' && weChatTemplateType === MAP_TEMPLATE && templateStep !== 'modeSelection';
|
|
24
25
|
return (
|
|
25
26
|
<div key="creatives-container-slidebox-header-content">
|
|
26
27
|
{slidBoxContent === 'templates' && !showTemplateNameHeader && (
|
|
@@ -65,7 +66,7 @@ function SlideBoxHeader(props) {
|
|
|
65
66
|
}
|
|
66
67
|
/>
|
|
67
68
|
)}
|
|
68
|
-
{
|
|
69
|
+
{mapTemplateCreate && (
|
|
69
70
|
<CapSteps
|
|
70
71
|
onChange={onWeChatMaptemplateStepChange}
|
|
71
72
|
current={weChatMaptemplateStep}
|
|
@@ -24,6 +24,8 @@ import * as templateActions from '../Templates/actions';
|
|
|
24
24
|
import * as globalActions from '../Cap/actions';
|
|
25
25
|
import {isLoading as isLoadingSelector} from './selectors';
|
|
26
26
|
import messages from './messages';
|
|
27
|
+
import { MAP_TEMPLATE } from '../WeChat/Wrapper/constants';
|
|
28
|
+
|
|
27
29
|
const classPrefix = 'add-creatives-section';
|
|
28
30
|
|
|
29
31
|
const SlideBoxWrapper = styled.div`
|
|
@@ -464,8 +466,9 @@ class Creatives extends React.Component {
|
|
|
464
466
|
render() {
|
|
465
467
|
const {slidBoxContent, isGetFormData, showSlideBox, templateData, currentChannel, emailCreateMode, templateStep, isLoadingContent, mobilePushCreateMode, isDiscardMessage, weChatTemplateType, weChatMaptemplateStep} = this.state;
|
|
466
468
|
const {isFullMode, creativesMode, cap, isUploading, channelsToHide, selectedWeChatAccount, forwardedTags} = this.props;
|
|
469
|
+
const mapTemplateCreate = slidBoxContent === 'createTemplate' && weChatTemplateType === MAP_TEMPLATE && templateStep !== 'modeSelection';
|
|
467
470
|
return (
|
|
468
|
-
<SlideBoxWrapper className={classnames(`${classPrefix} ${isFullMode ? 'creatives-full-mode' : 'creatives-library-mode'}`)}>
|
|
471
|
+
<SlideBoxWrapper className={classnames(`${classPrefix} ${isFullMode ? 'creatives-full-mode' : 'creatives-library-mode'} ${mapTemplateCreate ? 'map-template-create' : ''}`)}>
|
|
469
472
|
<CapSlideBox
|
|
470
473
|
header={
|
|
471
474
|
<SlideBoxHeader
|
|
@@ -24,9 +24,6 @@ $classPrefix: add-creatives-section;
|
|
|
24
24
|
width: 100%;
|
|
25
25
|
}
|
|
26
26
|
}
|
|
27
|
-
.slidebox-header div:first-child {
|
|
28
|
-
width: 100%;
|
|
29
|
-
}
|
|
30
27
|
.wechat-steps {
|
|
31
28
|
width: 40% !important;
|
|
32
29
|
left: 20%;
|
|
@@ -39,4 +36,10 @@ $classPrefix: add-creatives-section;
|
|
|
39
36
|
padding-top: 4px;
|
|
40
37
|
}
|
|
41
38
|
}
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
.map-template-create {
|
|
42
|
+
.slidebox-header div:first-child {
|
|
43
|
+
width: 100%;
|
|
44
|
+
}
|
|
42
45
|
}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import { takeLatest, take, all, cancel, call, put } from 'redux-saga/effects';
|
|
2
|
+
import { LOCATION_CHANGE } from 'react-router-redux';
|
|
3
|
+
import * as Api from '../../services/api';
|
|
4
|
+
import * as types from './constants';
|
|
5
|
+
|
|
6
|
+
function* getLocizMessage(action) {
|
|
7
|
+
try {
|
|
8
|
+
const result = yield call(Api.getLocizMessage, action.locale);
|
|
9
|
+
yield [
|
|
10
|
+
put({
|
|
11
|
+
type: types.GET_LOCIZ_MESSAGE_SUCCESS,
|
|
12
|
+
data: result,
|
|
13
|
+
}),
|
|
14
|
+
];
|
|
15
|
+
} catch (error) {
|
|
16
|
+
yield [
|
|
17
|
+
put({
|
|
18
|
+
type: types.GET_LOCIZ_MESSAGE_FAILURE,
|
|
19
|
+
data: error,
|
|
20
|
+
}),
|
|
21
|
+
];
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
export function* watchGetLocizMessage() {
|
|
25
|
+
const watcher = yield takeLatest(
|
|
26
|
+
types.GET_LOCIZ_MESSAGE_REQUEST,
|
|
27
|
+
getLocizMessage,
|
|
28
|
+
);
|
|
29
|
+
yield take(LOCATION_CHANGE);
|
|
30
|
+
yield cancel(watcher);
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
export default [watchGetLocizMessage];
|
|
34
|
+
|
|
35
|
+
export function* LanguageProviderRootSaga() {
|
|
36
|
+
yield all([
|
|
37
|
+
watchGetLocizMessage(),
|
|
38
|
+
]);
|
|
39
|
+
}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { css } from 'styled-components';
|
|
2
|
+
import {CAP_SPACE_24, CAP_SPACE_16} from '@capillarytech/cap-ui-library/styled/variables';
|
|
3
|
+
|
|
4
|
+
export default css`
|
|
5
|
+
.cap-tab-v2-wrapper{
|
|
6
|
+
.ant-tabs-tabpane {
|
|
7
|
+
border: none;
|
|
8
|
+
}
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
.component-wrapper {
|
|
12
|
+
${(props) => props.isFullMode ? `
|
|
13
|
+
max-width: 1140px;
|
|
14
|
+
margin: 0 auto;
|
|
15
|
+
width: 100%;
|
|
16
|
+
padding: ${CAP_SPACE_24} 0;
|
|
17
|
+
.ant-tabs-content{
|
|
18
|
+
margin-top: ${CAP_SPACE_16}
|
|
19
|
+
}
|
|
20
|
+
` : `.cap-tab-v2 {
|
|
21
|
+
height: calc(100vh - 118px);
|
|
22
|
+
} `}
|
|
23
|
+
}
|
|
24
|
+
`;
|
|
25
|
+
|
|
26
|
+
export const CapTabStyle = css`
|
|
27
|
+
${(props) => props.isFullMode ? `margin-top: ${CAP_SPACE_24}` : ``
|
|
28
|
+
}
|
|
29
|
+
`;
|
|
@@ -8,7 +8,6 @@ import PropTypes from 'prop-types';
|
|
|
8
8
|
|
|
9
9
|
import React from 'react';
|
|
10
10
|
import { bindActionCreators } from 'redux';
|
|
11
|
-
import Helmet from 'react-helmet';
|
|
12
11
|
import { intlShape, FormattedMessage } from 'react-intl';
|
|
13
12
|
import { createStructuredSelector } from 'reselect';
|
|
14
13
|
import { CapRow, CapColumn, CapSpin, CapCustomCard, CapButton, CapHeading } from '@capillarytech/cap-ui-library';
|
|
@@ -1214,7 +1213,7 @@ export class MapTemplates extends React.Component { // eslint-disable-line react
|
|
|
1214
1213
|
if (!isLoading && this.props.setIsLoadingContent) {
|
|
1215
1214
|
this.props.setIsLoadingContent(isLoading);
|
|
1216
1215
|
}
|
|
1217
|
-
return isLoading;
|
|
1216
|
+
return !!isLoading;
|
|
1218
1217
|
}
|
|
1219
1218
|
|
|
1220
1219
|
render() {
|
|
@@ -1233,9 +1232,6 @@ export class MapTemplates extends React.Component { // eslint-disable-line react
|
|
|
1233
1232
|
tip={this.props.intl.formatMessage(messages.gettingTemplateData)}
|
|
1234
1233
|
spinning={spinning}>
|
|
1235
1234
|
<div>
|
|
1236
|
-
<Helmet
|
|
1237
|
-
title="WeChat"
|
|
1238
|
-
/>
|
|
1239
1235
|
<CapHeading type="h5">Template name</CapHeading>
|
|
1240
1236
|
<CapHeading type="h3">{weChatData.title}</CapHeading>
|
|
1241
1237
|
<CapRow className="wechat-container">
|
|
@@ -17,14 +17,12 @@ import cloneDeep from 'lodash/cloneDeep';
|
|
|
17
17
|
import forEach from 'lodash/forEach';
|
|
18
18
|
import isEqual from 'lodash/isEqual';
|
|
19
19
|
import get from 'lodash/get';
|
|
20
|
-
import { CapRow, CapColumn, CapButton, CapCard, CapSpin, CapInput, CapHeading, CapDivider, CapIcon, CapLink, CapLabel } from '@capillarytech/cap-ui-library';
|
|
20
|
+
import { CapRow, CapColumn, CapButton, CapCard, CapSpin, CapInput, CapHeading, CapDivider, CapIcon, CapLink, CapLabel, CapNotification } from '@capillarytech/cap-ui-library';
|
|
21
21
|
import makeSelectCreate, {makeSelectTemplates, getAssetDetails, getContentAssetDetails} from './selectors';
|
|
22
22
|
import * as actions from './actions';
|
|
23
23
|
import richmediaschema from './richmediaschema';
|
|
24
24
|
import './_createRichmedia.scss';
|
|
25
25
|
import messages from './messages';
|
|
26
|
-
import * as globalActions from '../../../Cap/actions';
|
|
27
|
-
import {getMessageObject} from '../../../../utils/messageUtils';
|
|
28
26
|
import FormBuilder from '../../../../v2Components/FormBuilder';
|
|
29
27
|
import WechatRichmediaTemplatePreview from '../../../../v2Components/TemplatePreview/WechatRichmediaTemplatePreview';
|
|
30
28
|
import noImage from '../../../../assets/noImage.png';
|
|
@@ -146,12 +144,14 @@ export class Create extends React.Component { // eslint-disable-line react/prefe
|
|
|
146
144
|
}
|
|
147
145
|
if (nextProps.Create.saveTemplateRes && !isEmpty(nextProps.Create.saveTemplateRes) && nextProps.Create.saveTemplateSuccess && !isEqual(nextProps.Create.saveTemplateRes, this.props.Create.saveTemplateRes)) {
|
|
148
146
|
this.setState({loading: false});
|
|
149
|
-
|
|
150
|
-
|
|
147
|
+
CapNotification.success({
|
|
148
|
+
message: this.props.intl.formatMessage(messages.saveSuccess),
|
|
149
|
+
});
|
|
151
150
|
}
|
|
152
151
|
if (!nextProps.Create.saveTemplateSuccess && nextProps.Create.saveTemplateSuccess !== undefined && nextProps.Create.saveTemplateErrorMessage && nextProps.Create.saveTemplateErrorMessage !== this.props.Create.saveTemplateErrorMessage) {
|
|
153
152
|
this.setState({loading: false});
|
|
154
|
-
this.showErrorMessage(nextProps.Create.saveTemplateErrorMessage);
|
|
153
|
+
this.showErrorMessage(this.props.intl.formatMessage(messages[nextProps.Create.saveTemplateErrorMessage] || messages.somethingWentWrong));
|
|
154
|
+
this.props.onValidationFail();
|
|
155
155
|
}
|
|
156
156
|
if (!isEqual(nextProps.templateName, this.props.templateName)) {
|
|
157
157
|
this.setState({templateName: nextProps.templateName});
|
|
@@ -173,16 +173,13 @@ export class Create extends React.Component { // eslint-disable-line react/prefe
|
|
|
173
173
|
}
|
|
174
174
|
onContentChange = (evt) => {
|
|
175
175
|
const templateData = cloneDeep(this.state.templateData);
|
|
176
|
-
console.log('oncontentchange onChange ', evt, evt.editor.getData(), templateData);
|
|
177
176
|
templateData[this.state.currentContentId].formData['content-value'] = evt.editor.getData();
|
|
178
177
|
this.setState({templateData});
|
|
179
178
|
}
|
|
180
179
|
getEditorInstanse = (instance, id) => {
|
|
181
|
-
console.log('Got editor Instance ', instance, id);
|
|
182
180
|
window.CKEDITOR.on( 'instanceReady', ( event ) => {
|
|
183
181
|
this.setState({editorInstanse: event.editor});
|
|
184
182
|
event.editor.on( 'focus', () => {
|
|
185
|
-
console.log( 'focused', event.editor, this );
|
|
186
183
|
this.setState({editorInstanse: event.editor});
|
|
187
184
|
});
|
|
188
185
|
});
|
|
@@ -198,7 +195,6 @@ export class Create extends React.Component { // eslint-disable-line react/prefe
|
|
|
198
195
|
this.setState({isFormValid});
|
|
199
196
|
}
|
|
200
197
|
getCurrentWindow(e) {
|
|
201
|
-
console.log("moveToTemplates richmedia getCurrentWindow");
|
|
202
198
|
const response = {
|
|
203
199
|
action: e.action,
|
|
204
200
|
value: 'edit',
|
|
@@ -281,8 +277,9 @@ export class Create extends React.Component { // eslint-disable-line react/prefe
|
|
|
281
277
|
return temp;
|
|
282
278
|
}
|
|
283
279
|
showErrorMessage = (errorMessage) => {
|
|
284
|
-
|
|
285
|
-
|
|
280
|
+
CapNotification.error({
|
|
281
|
+
message: errorMessage,
|
|
282
|
+
});
|
|
286
283
|
}
|
|
287
284
|
checkFormFieldsCount = () => {
|
|
288
285
|
const templateData = cloneDeep(this.state.templateData);
|
|
@@ -562,7 +559,6 @@ export class Create extends React.Component { // eslint-disable-line react/prefe
|
|
|
562
559
|
}
|
|
563
560
|
}
|
|
564
561
|
uploadImage = (data, uploadId) => {
|
|
565
|
-
console.log("uploadImage", data, uploadId);
|
|
566
562
|
if (data.type === "wrong file") {
|
|
567
563
|
this.showErrorMessage(this.props.intl.formatMessage(messages.wrongFormatFile));
|
|
568
564
|
} else {
|
|
@@ -601,12 +597,10 @@ export class Create extends React.Component { // eslint-disable-line react/prefe
|
|
|
601
597
|
}
|
|
602
598
|
viewContent = (id, e) => {
|
|
603
599
|
e.stopPropagation();
|
|
604
|
-
console.log("moveContentUpward viewContent", id);
|
|
605
600
|
this.setState({currentContentId: id});
|
|
606
601
|
}
|
|
607
602
|
deleteContent = (id, e) => {
|
|
608
603
|
e.stopPropagation();
|
|
609
|
-
console.log("clicked delete", id);
|
|
610
604
|
const modalContent = {
|
|
611
605
|
title: this.props.intl.formatMessage(messages.modalTitle),
|
|
612
606
|
body: this.props.intl.formatMessage(messages.deleteContent),
|
|
@@ -648,7 +642,6 @@ export class Create extends React.Component { // eslint-disable-line react/prefe
|
|
|
648
642
|
templateData[id] = cloneDeep(templateData[id - 1]);
|
|
649
643
|
templateData[id - 1] = temp;
|
|
650
644
|
currentContentId = id - 1;
|
|
651
|
-
console.log("moveContentUpward", id, this.state.currentContentId, currentContentId);
|
|
652
645
|
this.setState({templateData, currentContentId});
|
|
653
646
|
}
|
|
654
647
|
getCardActionBar = (contentBlocks, id) => (
|
|
@@ -981,7 +974,6 @@ Create.propTypes = {
|
|
|
981
974
|
Templates: PropTypes.object,
|
|
982
975
|
ImageData: PropTypes.object,
|
|
983
976
|
actions: PropTypes.object,
|
|
984
|
-
globalActions: PropTypes.object,
|
|
985
977
|
Create: PropTypes.object,
|
|
986
978
|
intl: intlShape.isRequired,
|
|
987
979
|
ContentImageData: PropTypes.object,
|
|
@@ -1002,7 +994,6 @@ const mapStateToProps = createStructuredSelector({
|
|
|
1002
994
|
function mapDispatchToProps(dispatch) {
|
|
1003
995
|
return {
|
|
1004
996
|
actions: bindActionCreators(actions, dispatch),
|
|
1005
|
-
globalActions: bindActionCreators(globalActions, dispatch),
|
|
1006
997
|
};
|
|
1007
998
|
}
|
|
1008
999
|
|
|
@@ -7,187 +7,231 @@ import { defineMessages } from 'react-intl';
|
|
|
7
7
|
|
|
8
8
|
export default defineMessages({
|
|
9
9
|
"header": {
|
|
10
|
-
id: 'creatives.containersV2.
|
|
10
|
+
id: 'creatives.containersV2.richMedia.create.header',
|
|
11
11
|
defaultMessage: 'This is Create container !',
|
|
12
12
|
},
|
|
13
13
|
"titleCharacterCount": {
|
|
14
|
-
id: 'creatives.containersV2.
|
|
14
|
+
id: 'creatives.containersV2.richMedia.create.titleCharacterCount',
|
|
15
15
|
defaultMessage: 'Title exceeds character count limit by',
|
|
16
16
|
},
|
|
17
17
|
"authorCharacterCount": {
|
|
18
|
-
id: 'creatives.containersV2.
|
|
18
|
+
id: 'creatives.containersV2.richMedia.create.authorCharacterCount',
|
|
19
19
|
defaultMessage: 'Author exceeds character count limit by',
|
|
20
20
|
},
|
|
21
21
|
"coverAbstractCharacterCount": {
|
|
22
|
-
id: 'creatives.containersV2.
|
|
22
|
+
id: 'creatives.containersV2.richMedia.create.coverAbstractCharacterCount',
|
|
23
23
|
defaultMessage: 'Cover abstract exceeds character count limit by',
|
|
24
24
|
},
|
|
25
25
|
"saveSuccess": {
|
|
26
|
-
id: 'creatives.containersV2.
|
|
26
|
+
id: 'creatives.containersV2.richMedia.create.saveSuccess',
|
|
27
27
|
defaultMessage: 'Template saved successfully',
|
|
28
28
|
},
|
|
29
29
|
"modalTitle": {
|
|
30
|
-
id: 'creatives.containersV2.
|
|
30
|
+
id: 'creatives.containersV2.richMedia.create.modalTitle',
|
|
31
31
|
defaultMessage: 'Alert',
|
|
32
32
|
},
|
|
33
33
|
"modalBody": {
|
|
34
|
-
id: 'creatives.containersV2.
|
|
34
|
+
id: 'creatives.containersV2.richMedia.create.modalBody',
|
|
35
35
|
defaultMessage: 'Do you really want to go back? All your temporary changes will be lost!',
|
|
36
36
|
},
|
|
37
37
|
"deleteContent": {
|
|
38
|
-
id: 'creatives.containersV2.
|
|
38
|
+
id: 'creatives.containersV2.richMedia.create.deleteContent',
|
|
39
39
|
defaultMessage: 'Do you really want to delete? All your temporary changes will be lost!',
|
|
40
40
|
},
|
|
41
41
|
"emptyTemplateName": {
|
|
42
|
-
id: 'creatives.containersV2.
|
|
42
|
+
id: 'creatives.containersV2.richMedia.create.emptyTemplateName',
|
|
43
43
|
defaultMessage: 'Cannot leave template name empty',
|
|
44
44
|
},
|
|
45
45
|
"wrongFormatFile": {
|
|
46
|
-
id: 'creatives.containersV2.
|
|
46
|
+
id: 'creatives.containersV2.richMedia.create.wrongFormatFile',
|
|
47
47
|
defaultMessage: 'Wrong file upoaded. Please upload image file',
|
|
48
48
|
},
|
|
49
49
|
"formEmpty": {
|
|
50
|
-
id: 'creatives.containersV2.
|
|
50
|
+
id: 'creatives.containersV2.richMedia.create.formEmpty',
|
|
51
51
|
defaultMessage: 'Cannot leave form empty',
|
|
52
52
|
},
|
|
53
53
|
"titleEmpty": {
|
|
54
|
-
id: 'creatives.containersV2.
|
|
54
|
+
id: 'creatives.containersV2.richMedia.create.titleEmpty',
|
|
55
55
|
defaultMessage: 'Cannot leave title field empty',
|
|
56
56
|
},
|
|
57
57
|
"noImage": {
|
|
58
|
-
id: 'creatives.containersV2.
|
|
58
|
+
id: 'creatives.containersV2.richMedia.create.noImage',
|
|
59
59
|
defaultMessage: 'Please upload an image',
|
|
60
60
|
},
|
|
61
61
|
"sourceLinkEmpty": {
|
|
62
|
-
id: 'creatives.containersV2.
|
|
62
|
+
id: 'creatives.containersV2.richMedia.create.sourceLinkEmpty',
|
|
63
63
|
defaultMessage: 'Cannot leave source link field empty',
|
|
64
64
|
},
|
|
65
65
|
"contentEmpty": {
|
|
66
|
-
id: 'creatives.containersV2.
|
|
66
|
+
id: 'creatives.containersV2.richMedia.create.contentEmpty',
|
|
67
67
|
defaultMessage: 'Cannot leave content field empty',
|
|
68
68
|
},
|
|
69
69
|
"titleNameRepeated": {
|
|
70
|
-
id: 'creatives.containersV2.
|
|
70
|
+
id: 'creatives.containersV2.richMedia.create.titleNameRepeated',
|
|
71
71
|
defaultMessage: 'Title name cannot be repeated',
|
|
72
72
|
},
|
|
73
73
|
"wrongUrl": {
|
|
74
|
-
id: 'creatives.containersV2.
|
|
74
|
+
id: 'creatives.containersV2.richMedia.create.wrongUrl',
|
|
75
75
|
defaultMessage: 'Enter correct URL',
|
|
76
76
|
},
|
|
77
77
|
"maxContentCount": {
|
|
78
|
-
id: 'creatives.containersV2.
|
|
78
|
+
id: 'creatives.containersV2.richMedia.create.maxContentCount',
|
|
79
79
|
defaultMessage: 'You have reached the maximum template size',
|
|
80
80
|
},
|
|
81
81
|
"addNewRichmedia": {
|
|
82
|
-
id: 'creatives.containersV2.
|
|
82
|
+
id: 'creatives.containersV2.richMedia.create.addNewRichmedia',
|
|
83
83
|
defaultMessage: 'Add richmedia content',
|
|
84
84
|
},
|
|
85
85
|
'Title': {
|
|
86
|
-
id: 'creatives.containersV2.
|
|
86
|
+
id: 'creatives.containersV2.richMedia.create.Title',
|
|
87
87
|
defaultMessage: 'Title',
|
|
88
88
|
},
|
|
89
89
|
'Please input title': {
|
|
90
|
-
id: 'creatives.containersV2.
|
|
90
|
+
id: 'creatives.containersV2.richMedia.create.Please_input_title',
|
|
91
91
|
defaultMessage: 'Please input title',
|
|
92
92
|
},
|
|
93
93
|
'Author': {
|
|
94
|
-
id: 'creatives.containersV2.
|
|
94
|
+
id: 'creatives.containersV2.richMedia.create.Author',
|
|
95
95
|
defaultMessage: 'Author',
|
|
96
96
|
},
|
|
97
97
|
'Please input author': {
|
|
98
|
-
id: 'creatives.containersV2.
|
|
98
|
+
id: 'creatives.containersV2.richMedia.create.Please_input_author',
|
|
99
99
|
defaultMessage: 'Please input author',
|
|
100
100
|
},
|
|
101
101
|
'Cover image': {
|
|
102
|
-
id: 'creatives.containersV2.
|
|
102
|
+
id: 'creatives.containersV2.richMedia.create.Cover_image',
|
|
103
103
|
defaultMessage: 'Cover image',
|
|
104
104
|
},
|
|
105
105
|
'Cover abstract': {
|
|
106
|
-
id: 'creatives.containersV2.
|
|
106
|
+
id: 'creatives.containersV2.richMedia.create.Cover_abstract',
|
|
107
107
|
defaultMessage: 'Cover abstract',
|
|
108
108
|
},
|
|
109
109
|
'Please input cover abstract': {
|
|
110
|
-
id: 'creatives.containersV2.
|
|
110
|
+
id: 'creatives.containersV2.richMedia.create.Please_input_cover_abstract',
|
|
111
111
|
defaultMessage: 'Please input cover abstract',
|
|
112
112
|
},
|
|
113
113
|
'Content': {
|
|
114
|
-
id: 'creatives.containersV2.
|
|
114
|
+
id: 'creatives.containersV2.richMedia.create.Content',
|
|
115
115
|
defaultMessage: 'Content',
|
|
116
116
|
},
|
|
117
117
|
'Please input content': {
|
|
118
|
-
id: 'creatives.containersV2.
|
|
118
|
+
id: 'creatives.containersV2.richMedia.create.Please_input_content',
|
|
119
119
|
defaultMessage: 'Please input content',
|
|
120
120
|
},
|
|
121
121
|
'Show cover picture': {
|
|
122
|
-
id: 'creatives.containersV2.
|
|
122
|
+
id: 'creatives.containersV2.richMedia.create.Show_cover_picture',
|
|
123
123
|
defaultMessage: 'Show cover picture',
|
|
124
124
|
},
|
|
125
125
|
'Who can post comments on this content': {
|
|
126
|
-
id: 'creatives.containersV2.
|
|
126
|
+
id: 'creatives.containersV2.richMedia.create.Who_can_post_comments_on_this_content',
|
|
127
127
|
defaultMessage: 'Who can post comments on this content',
|
|
128
128
|
},
|
|
129
129
|
'No one': {
|
|
130
|
-
id: 'creatives.containersV2.
|
|
130
|
+
id: 'creatives.containersV2.richMedia.create.No_one',
|
|
131
131
|
defaultMessage: 'No one',
|
|
132
132
|
},
|
|
133
133
|
'Anyone': {
|
|
134
|
-
id: 'creatives.containersV2.
|
|
134
|
+
id: 'creatives.containersV2.richMedia.create.Anyone',
|
|
135
135
|
defaultMessage: 'Anyone',
|
|
136
136
|
},
|
|
137
137
|
'Only followers': {
|
|
138
|
-
id: 'creatives.containersV2.
|
|
138
|
+
id: 'creatives.containersV2.richMedia.create.Only_followers',
|
|
139
139
|
defaultMessage: 'Only followers',
|
|
140
140
|
},
|
|
141
141
|
'visibility': {
|
|
142
|
-
id: 'creatives.containersV2.
|
|
142
|
+
id: 'creatives.containersV2.richMedia.create.visibility',
|
|
143
143
|
defaultMessage: 'visibility',
|
|
144
144
|
},
|
|
145
145
|
'delete': {
|
|
146
|
-
id: 'creatives.containersV2.
|
|
146
|
+
id: 'creatives.containersV2.richMedia.create.delete',
|
|
147
147
|
defaultMessage: 'delete',
|
|
148
148
|
},
|
|
149
149
|
'This field is required!': {
|
|
150
|
-
id: 'creatives.containersV2.
|
|
150
|
+
id: 'creatives.containersV2.richMedia.create.requiredField',
|
|
151
151
|
defaultMessage: 'This field is required!',
|
|
152
152
|
},
|
|
153
153
|
"Write a brief headline to draw customer's attention": {
|
|
154
|
-
id: 'creatives.containersV2.
|
|
154
|
+
id: 'creatives.containersV2.richMedia.create.titleInductiveText',
|
|
155
155
|
defaultMessage: "Write a brief headline to draw customer's attention",
|
|
156
156
|
},
|
|
157
157
|
"Brand/name that your customer will recognise": {
|
|
158
|
-
id: 'creatives.containersV2.
|
|
158
|
+
id: 'creatives.containersV2.richMedia.create.authorInductiveText',
|
|
159
159
|
defaultMessage: "Brand/name that your customer will recognise",
|
|
160
160
|
},
|
|
161
161
|
'Resolution 360 x 200': {
|
|
162
|
-
id: 'creatives.containersV2.
|
|
162
|
+
id: 'creatives.containersV2.richMedia.create.resolutionText',
|
|
163
163
|
defaultMessage: 'Resolution 360 x 200',
|
|
164
164
|
},
|
|
165
165
|
'The relevant image that complements title.': {
|
|
166
|
-
id: 'creatives.containersV2.
|
|
166
|
+
id: 'creatives.containersV2.richMedia.create.coverImageTitle',
|
|
167
167
|
defaultMessage: 'The relevant image that complements title.',
|
|
168
168
|
},
|
|
169
169
|
'Upload Image': {
|
|
170
|
-
id: 'creatives.containersV2.
|
|
170
|
+
id: 'creatives.containersV2.richMedia.create.uploadImage',
|
|
171
171
|
defaultMessage: 'Upload Image',
|
|
172
172
|
},
|
|
173
173
|
'A short description help customers learn more': {
|
|
174
|
-
id: 'creatives.containersV2.
|
|
174
|
+
id: 'creatives.containersV2.richMedia.create.coverAbstractInductive',
|
|
175
175
|
defaultMessage: 'A short description help customers learn more',
|
|
176
176
|
},
|
|
177
177
|
'Article content': {
|
|
178
|
-
id: 'creatives.containersV2.
|
|
178
|
+
id: 'creatives.containersV2.richMedia.create.articleContent',
|
|
179
179
|
defaultMessage: 'Article content',
|
|
180
180
|
},
|
|
181
181
|
'Insert Image': {
|
|
182
|
-
id: 'creatives.containersV2.
|
|
182
|
+
id: 'creatives.containersV2.richMedia.create.insertImage',
|
|
183
183
|
defaultMessage: 'Insert Image',
|
|
184
184
|
},
|
|
185
185
|
'Read more link': {
|
|
186
|
-
id: 'creatives.containersV2.
|
|
186
|
+
id: 'creatives.containersV2.richMedia.create.readMoreLink',
|
|
187
187
|
defaultMessage: 'Read more link',
|
|
188
188
|
},
|
|
189
189
|
'Link to help customers discover more about the brand.': {
|
|
190
|
-
id: 'creatives.containersV2.
|
|
190
|
+
id: 'creatives.containersV2.richMedia.create.linkInductiveText',
|
|
191
191
|
defaultMessage: 'Link to help customers discover more about the brand.',
|
|
192
192
|
},
|
|
193
|
+
'somethingWentWrong': {
|
|
194
|
+
id: 'creatives.containersV2.richMedia.create.somethingWentWrong',
|
|
195
|
+
defaultMessage: 'Something went wrong!!',
|
|
196
|
+
},
|
|
197
|
+
'Template with the same name exists. Please try another template name.': {
|
|
198
|
+
id: 'creatives.containersV2.richMedia.create.templateNameExists',
|
|
199
|
+
defaultMessage: 'Template with the same name exists. Please try another template name.',
|
|
200
|
+
},
|
|
201
|
+
'Template name cannot be blank!': {
|
|
202
|
+
id: 'creatives.containersV2.richMedia.create.templateNameBlank',
|
|
203
|
+
defaultMessage: 'Template name cannot be blank',
|
|
204
|
+
},
|
|
205
|
+
'Template name contains only whitespaces': {
|
|
206
|
+
id: 'creatives.containersV2.richMedia.create.templateNameContainsWS',
|
|
207
|
+
defaultMessage: 'Template name contains only whitespaces',
|
|
208
|
+
},
|
|
209
|
+
'Please provide payload to the wechat template': {
|
|
210
|
+
id: 'creatives.containersV2.richMedia.create.payloadMissing',
|
|
211
|
+
defaultMessage: 'Please provide payload to create wechat template',
|
|
212
|
+
},
|
|
213
|
+
'Please provide source account identifier': {
|
|
214
|
+
id: 'creatives.containersV2.richMedia.create.sourceIdentMissing',
|
|
215
|
+
defaultMessage: 'Please provide source account identifier',
|
|
216
|
+
},
|
|
217
|
+
'Please provide sufficient parameters to generate richmedia message payload': {
|
|
218
|
+
id: 'creatives.containersV2.richMedia.create.sufficientPayload',
|
|
219
|
+
defaultMessage: 'Please provide sufficient parameters to generate richmedia message payload',
|
|
220
|
+
},
|
|
221
|
+
'Please provide sufficient params to create richmedia wechat template': {
|
|
222
|
+
id: 'creatives.containersV2.richMedia.create.sufficientParam',
|
|
223
|
+
defaultMessage: 'Please provide sufficient params to create richmedia wechat template',
|
|
224
|
+
},
|
|
225
|
+
'Upload has failed': {
|
|
226
|
+
id: 'creatives.containersV2.richMedia.create.uploadFailed',
|
|
227
|
+
defaultMessage: 'Upload has failed',
|
|
228
|
+
},
|
|
229
|
+
'Template with the same name exists': {
|
|
230
|
+
id: 'creatives.containersV2.richMedia.create.sameTemplateExists',
|
|
231
|
+
defaultMessage: 'Template with the same name exists',
|
|
232
|
+
},
|
|
233
|
+
'Failed to get File content': {
|
|
234
|
+
id: 'creatives.containersV2.richMedia.create.fileContentFailed',
|
|
235
|
+
defaultMessage: 'Failed to get File content',
|
|
236
|
+
},
|
|
193
237
|
});
|
|
@@ -25,7 +25,7 @@ export function* saveTemplate({template, callback}) {
|
|
|
25
25
|
if (!result.success || result.status.code === 500) {
|
|
26
26
|
errorMsg = result.message;
|
|
27
27
|
}
|
|
28
|
-
if (callback) {
|
|
28
|
+
if (callback && !errorMsg) {
|
|
29
29
|
yield call(callback, result.response);
|
|
30
30
|
}
|
|
31
31
|
yield put({ type: types.SAVE_TEMPLATE_SUCCESS, data: result.response, statusCode: result.status ? result.status.code : '', errorMsg});
|
|
@@ -8,7 +8,6 @@ import PropTypes from 'prop-types';
|
|
|
8
8
|
|
|
9
9
|
import React from 'react';
|
|
10
10
|
import { connect } from 'react-redux';
|
|
11
|
-
import Helmet from 'react-helmet';
|
|
12
11
|
import { FormattedMessage } from 'react-intl';
|
|
13
12
|
import { createStructuredSelector } from 'reselect';
|
|
14
13
|
import makeSelectView from './selectors';
|
|
@@ -18,12 +17,6 @@ export class View extends React.PureComponent { // eslint-disable-line react/pre
|
|
|
18
17
|
render() {
|
|
19
18
|
return (
|
|
20
19
|
<div>
|
|
21
|
-
<Helmet
|
|
22
|
-
title="View"
|
|
23
|
-
meta={[
|
|
24
|
-
{ name: 'description', content: 'Description of View' },
|
|
25
|
-
]}
|
|
26
|
-
/>
|
|
27
20
|
<FormattedMessage {...messages.header} />
|
|
28
21
|
</div>
|
|
29
22
|
);
|