@capillarytech/creatives-library 3.6.3 → 3.6.5
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/components/TemplatePreview/WechatRichmediaTemplatePreview/index.js +7 -7
- package/components/TemplatePreview/_templatePreview.scss +279 -20
- package/components/TemplatePreview/assets/images/home-screen-android.svg +21 -0
- package/components/TemplatePreview/assets/images/home-screen-ios.svg +16 -0
- package/components/TemplatePreview/assets/images/sms_mobile_android.svg +22 -0
- package/components/TemplatePreview/assets/images/sms_mobile_ios.svg +16 -0
- package/components/TemplatePreview/assets/images/wechat_mobile_android.svg +20 -0
- package/components/TemplatePreview/index.js +180 -20
- package/components/TemplatePreview/messages.js +16 -0
- package/containers/Cap/messsages.js +63 -0
- package/package.json +1 -1
- package/v2Components/FormBuilder/index.js +15 -6
- package/v2Components/Header/index.js +46 -0
- package/v2Components/Header/tests/index.test.js +10 -0
- package/v2Components/MobilePushPreviewV2/index.js +40 -32
- package/v2Components/MobilePushPreviewV2/messages.js +0 -8
- package/v2Components/TemplatePreview/WechatRichmediaTemplatePreview/_wechatRichmediaTemplatePrev.scss +64 -0
- package/v2Components/TemplatePreview/WechatRichmediaTemplatePreview/index.js +101 -19
- package/v2Components/TemplatePreview/WechatRichmediaTemplatePreview/messages.js +12 -0
- package/v2Components/TemplatePreview/_templatePreview.scss +13 -4
- package/v2Components/TemplatePreview/assets/images/home-screen-android.svg +21 -0
- package/v2Components/TemplatePreview/assets/images/home-screen-ios.svg +16 -0
- package/v2Components/TemplatePreview/assets/images/sms_mobile_android.svg +22 -0
- package/v2Components/TemplatePreview/assets/images/wechat-home-screen-android.svg +21 -0
- package/v2Components/TemplatePreview/assets/images/wechat_mobile_android.svg +20 -0
- package/v2Components/TemplatePreview/index.js +147 -20
- package/v2Components/TemplatePreview/messages.js +8 -0
- package/v2Containers/CreativesContainer/SlideBoxContent.js +15 -2
- package/v2Containers/CreativesContainer/SlideBoxHeader.js +1 -1
- package/v2Containers/CreativesContainer/index.js +3 -1
- package/v2Containers/CreativesContainer/messages.js +2 -2
- package/v2Containers/Email/_email.scss +7 -1
- package/v2Containers/Email/index.js +39 -13
- package/v2Containers/Email/messages.js +4 -0
- package/v2Containers/EmailWrapper/index.js +4 -0
- package/v2Containers/MobilePush/Create/index.js +5 -0
- package/v2Containers/MobilePush/Edit/index.js +5 -0
- package/v2Containers/MobilepushWrapper/index.js +4 -1
- package/v2Containers/Sms/Create/index.js +2 -1
- package/v2Containers/Sms/Edit/index.js +2 -0
- package/v2Containers/Templates/_templates.scss +0 -6
- package/v2Containers/TemplatesV2/_templatesV2.scss +5 -0
- package/v2Containers/WeChat/Wrapper/_wrapper.scss +0 -5
|
@@ -8,18 +8,145 @@ import PropTypes from 'prop-types';
|
|
|
8
8
|
|
|
9
9
|
import React from 'react';
|
|
10
10
|
import _ from 'lodash';
|
|
11
|
-
import { injectIntl, intlShape} from 'react-intl';
|
|
12
|
-
import {CapColumn} from '@capillarytech/cap-
|
|
11
|
+
import { injectIntl, intlShape, FormattedMessage} from 'react-intl';
|
|
12
|
+
import {CapColumn, CapTab, CapIcon, CapLabel, CapImage} from '@capillarytech/cap-ui-library';
|
|
13
13
|
import './_templatePreview.scss';
|
|
14
14
|
import {updateCharCount} from '../../utils/smsCharCountV2';
|
|
15
15
|
import messages from './messages';
|
|
16
16
|
const smsIcon = require('./assets/images/user-icon.svg');
|
|
17
|
+
const smsMobileAndroid = require('./assets/images/sms_mobile_android.svg');
|
|
18
|
+
const wechatMobileAndroid = require('./assets/images/wechat_mobile_android.svg');
|
|
19
|
+
const smsMobileIos = require('./assets/images/sms_mobile_ios.svg');
|
|
20
|
+
const smsAndroidHomeScreen = require('./assets/images/home-screen-android.svg');
|
|
21
|
+
const smsIosHomeScreen = require('./assets/images/home-screen-ios.svg');
|
|
17
22
|
const wechatBody = require('./assets/images/WECHAT_5x.png');
|
|
18
23
|
const smsBody = require('./assets/images/mobile.svg');
|
|
19
24
|
const androidPushMessagePhone = require('./assets/images/androidPushMessage.svg');
|
|
20
25
|
const iPhonePushMessagePhone = require('./assets/images/iPhonePushMessage.svg');
|
|
21
26
|
|
|
22
27
|
class TemplatePreview extends React.Component { // eslint-disable-line react/prefer-stateless-function
|
|
28
|
+
getWechatAndroidPreview = (content) => (
|
|
29
|
+
<div className="shell-lock-screen-android align-center" id="sms-preview">
|
|
30
|
+
<div className="lock-screen-preview">
|
|
31
|
+
<CapImage className="preview-image sms" src={smsAndroidHomeScreen} alt={this.props.intl.formatMessage(messages.previewGenerated)}/>
|
|
32
|
+
<div className="lock-msgContainer wechat">
|
|
33
|
+
<div className="sender-id-text">
|
|
34
|
+
{this.props.intl.formatMessage(messages.senderId)}
|
|
35
|
+
</div>
|
|
36
|
+
<div className="message-text-container">
|
|
37
|
+
<CapLabel type="label1" style={{ height: '15px' }} >{content}</CapLabel>
|
|
38
|
+
</div>
|
|
39
|
+
</div>
|
|
40
|
+
<div className="action-text">
|
|
41
|
+
<FormattedMessage {...messages.markAsRead}/> <FormattedMessage {...messages.reply}/>
|
|
42
|
+
</div>
|
|
43
|
+
</div>
|
|
44
|
+
<div className="main-screen-preview">
|
|
45
|
+
<CapImage className="preview-image" src={wechatMobileAndroid} alt={this.props.intl.formatMessage(messages.previewGenerated)}/>
|
|
46
|
+
<div className="msgContainer wechat">
|
|
47
|
+
<div className="message-pop wechat align-left" style={{ background: '#ffffff', color: '#333333' }}>
|
|
48
|
+
{content}
|
|
49
|
+
</div>
|
|
50
|
+
</div>
|
|
51
|
+
</div>
|
|
52
|
+
</div>
|
|
53
|
+
);
|
|
54
|
+
|
|
55
|
+
getWechatIosPreview = (content) => (
|
|
56
|
+
<div className="shell-lock-screen-ios align-center" id="sms-preview">
|
|
57
|
+
<div className="lock-screen-preview">
|
|
58
|
+
<CapImage className="preview-image sms" src={smsIosHomeScreen} alt={this.props.intl.formatMessage(messages.previewGenerated)}/>
|
|
59
|
+
<div className="lock-msgContainer wechat">
|
|
60
|
+
<div className="sender-id-text">
|
|
61
|
+
{this.props.intl.formatMessage(messages.senderId)}
|
|
62
|
+
</div>
|
|
63
|
+
<div className="message-text-container">
|
|
64
|
+
<CapLabel type="label1" style={{ height: '15px' }} >{content}</CapLabel>
|
|
65
|
+
</div>
|
|
66
|
+
</div>
|
|
67
|
+
<div className="action-text-reply">
|
|
68
|
+
<FormattedMessage {...messages.reply}/>
|
|
69
|
+
</div>
|
|
70
|
+
<div className="action-text-cancel">
|
|
71
|
+
<FormattedMessage {...messages.cancel}/>
|
|
72
|
+
</div>
|
|
73
|
+
</div>
|
|
74
|
+
<div className="main-screen-preview">
|
|
75
|
+
<CapImage className="preview-image" src={wechatMobileAndroid} alt={this.props.intl.formatMessage(messages.previewGenerated)}/>
|
|
76
|
+
<div className="msgContainer wechat">
|
|
77
|
+
<div className="message-pop wechat align-left" style={{ background: '#ffffff', color: '#333333' }}>
|
|
78
|
+
{content}
|
|
79
|
+
</div>
|
|
80
|
+
</div>
|
|
81
|
+
</div>
|
|
82
|
+
</div>
|
|
83
|
+
);
|
|
84
|
+
|
|
85
|
+
getSmsAndroidPreview = (content) => (
|
|
86
|
+
<div className="shell-lock-screen-android align-center" id="sms-preview">
|
|
87
|
+
<div className="lock-screen-preview">
|
|
88
|
+
<CapImage className="preview-image sms" src={smsAndroidHomeScreen} alt={this.props.intl.formatMessage(messages.previewGenerated)}/>
|
|
89
|
+
<div className="lock-msgContainer sms">
|
|
90
|
+
<div className="sender-id-text">
|
|
91
|
+
{this.props.intl.formatMessage(messages.senderId)}
|
|
92
|
+
</div>
|
|
93
|
+
<div className="message-text-container">
|
|
94
|
+
<CapLabel type="label1" style={{ height: '15px' }} >{content}</CapLabel>
|
|
95
|
+
</div>
|
|
96
|
+
</div>
|
|
97
|
+
<div className="action-text">
|
|
98
|
+
<FormattedMessage {...messages.markAsRead}/> <FormattedMessage {...messages.reply}/>
|
|
99
|
+
</div>
|
|
100
|
+
</div>
|
|
101
|
+
<div className="main-screen-preview">
|
|
102
|
+
<CapImage className="preview-image sms" src={smsMobileAndroid} alt={this.props.intl.formatMessage(messages.previewGenerated)}/>
|
|
103
|
+
<div className="msgContainer sms">
|
|
104
|
+
<div className={"message-pop sms"}>
|
|
105
|
+
{content && content.length && content.map((msg) =>
|
|
106
|
+
<CapColumn className="message-pop-item align-left" style={{ background: '#FFFFFF', color: '#091e42'}}>
|
|
107
|
+
{msg}
|
|
108
|
+
</CapColumn>)
|
|
109
|
+
}
|
|
110
|
+
</div>
|
|
111
|
+
</div>
|
|
112
|
+
</div>
|
|
113
|
+
</div>
|
|
114
|
+
);
|
|
115
|
+
|
|
116
|
+
getSmsIosPreview = (content) => (
|
|
117
|
+
<div className="shell-lock-screen-ios align-center" id="sms-preview">
|
|
118
|
+
<div className="lock-screen-preview">
|
|
119
|
+
<CapImage className="preview-image sms" src={smsIosHomeScreen} alt={this.props.intl.formatMessage(messages.previewGenerated)}/>
|
|
120
|
+
<div className="lock-msgContainer sms">
|
|
121
|
+
<div className="sender-id-text">
|
|
122
|
+
{this.props.intl.formatMessage(messages.senderId)}
|
|
123
|
+
</div>
|
|
124
|
+
<div className="message-text-container">
|
|
125
|
+
<CapLabel type="label1" style={{ height: '15px' }} >{content}</CapLabel>
|
|
126
|
+
</div>
|
|
127
|
+
</div>
|
|
128
|
+
<div className="action-text-reply">
|
|
129
|
+
<FormattedMessage {...messages.reply}/>
|
|
130
|
+
</div>
|
|
131
|
+
<div className="action-text-cancel">
|
|
132
|
+
<FormattedMessage {...messages.cancel}/>
|
|
133
|
+
</div>
|
|
134
|
+
</div>
|
|
135
|
+
<div className="main-screen-preview">
|
|
136
|
+
<CapImage className="preview-image sms" src={smsMobileIos} alt={this.props.intl.formatMessage(messages.previewGenerated)}/>
|
|
137
|
+
<div className="msgContainer sms">
|
|
138
|
+
<div className={"message-pop sms"}>
|
|
139
|
+
{content && content.length && content.map((msg) =>
|
|
140
|
+
<CapColumn className="message-pop-item align-left" style={{ background: '#ebecf0', color: '#091e42'}}>
|
|
141
|
+
{msg}
|
|
142
|
+
</CapColumn>)
|
|
143
|
+
}
|
|
144
|
+
</div>
|
|
145
|
+
</div>
|
|
146
|
+
</div>
|
|
147
|
+
</div>
|
|
148
|
+
);
|
|
149
|
+
|
|
23
150
|
render() {
|
|
24
151
|
console.log('preview props', this.props);
|
|
25
152
|
let content = channel && channel.toLowerCase() === 'sms' ? [this.props.content] : this.props.content;
|
|
@@ -38,6 +165,7 @@ class TemplatePreview extends React.Component { // eslint-disable-line react/pre
|
|
|
38
165
|
//smsText = this.props.intl.formatMessage(messages.previewGenerationMessage);
|
|
39
166
|
//console.log('message text', smsText);
|
|
40
167
|
}
|
|
168
|
+
const showLockScreenPreview = !!this.props.showLockScreenPreview;
|
|
41
169
|
const type = this.props.location && this.props.location.query.type ? this.props.location.query.type : '';
|
|
42
170
|
let iosActions = [];
|
|
43
171
|
if (channel.toLowerCase() === "mobilepush") {
|
|
@@ -52,35 +180,67 @@ class TemplatePreview extends React.Component { // eslint-disable-line react/pre
|
|
|
52
180
|
}
|
|
53
181
|
return (
|
|
54
182
|
<div className={`preview-container ${type === 'embedded' ? 'embedded-preview' : ''}`}>
|
|
55
|
-
{ channel && channel.toLowerCase() === 'sms' &&
|
|
56
|
-
|
|
57
|
-
|
|
183
|
+
{ channel && channel.toLowerCase() === 'sms' &&
|
|
184
|
+
(showLockScreenPreview ? (
|
|
185
|
+
<CapTab
|
|
186
|
+
panes={[
|
|
187
|
+
{
|
|
188
|
+
content: this.getSmsAndroidPreview(content),
|
|
189
|
+
tab: <CapIcon type="android" size='m' />,
|
|
190
|
+
key: 'android',
|
|
191
|
+
},
|
|
192
|
+
{
|
|
193
|
+
content: this.getSmsIosPreview(content),
|
|
194
|
+
tab: <CapIcon type="ios" size='m' />,
|
|
195
|
+
key: 'ios',
|
|
196
|
+
},
|
|
197
|
+
]}
|
|
198
|
+
tabBarStyle={{margin: 'auto', width: '14%'}}
|
|
199
|
+
/>
|
|
200
|
+
) : (
|
|
201
|
+
<div className="shell align-center" id="sms-preview">
|
|
202
|
+
<CapImage className="preview-image sms" src={smsMobileAndroid} alt={this.props.intl.formatMessage(messages.previewGenerated)}/>
|
|
58
203
|
<div className="msgContainer sms">
|
|
59
|
-
<img className="sms-icon" src={smsIcon} alt={this.props.intl.formatMessage(messages.smsIcon)} />
|
|
60
204
|
<div className={"message-pop sms"}>
|
|
61
205
|
{content && content.length && content.map((msg) =>
|
|
62
|
-
<CapColumn className="message-pop-item align-left" style={{ background: '#
|
|
206
|
+
<CapColumn className="message-pop-item align-left" style={{ background: '#FFFFFF', color: '#091e42'}}>
|
|
63
207
|
{msg}
|
|
64
208
|
</CapColumn>)
|
|
65
209
|
}
|
|
66
210
|
</div>
|
|
67
211
|
</div>
|
|
68
|
-
</div>
|
|
69
|
-
|
|
70
|
-
{channel && channel.toLowerCase() === 'wechat'
|
|
71
|
-
(
|
|
72
|
-
<
|
|
212
|
+
</div>)
|
|
213
|
+
)}
|
|
214
|
+
{channel && channel.toLowerCase() === 'wechat' &&
|
|
215
|
+
(showLockScreenPreview ? (
|
|
216
|
+
<CapTab
|
|
217
|
+
panes={[
|
|
218
|
+
{
|
|
219
|
+
content: this.getWechatAndroidPreview(content),
|
|
220
|
+
tab: <CapIcon type="android" size='m' />,
|
|
221
|
+
key: 'android',
|
|
222
|
+
},
|
|
223
|
+
{
|
|
224
|
+
content: this.getWechatIosPreview(content),
|
|
225
|
+
tab: <CapIcon type="ios" size='m' />,
|
|
226
|
+
key: 'ios',
|
|
227
|
+
},
|
|
228
|
+
]}
|
|
229
|
+
tabBarStyle={{margin: 'auto', width: '14%'}}
|
|
230
|
+
/>
|
|
231
|
+
) : (
|
|
232
|
+
<div className="shell align-center" id="sms-preview">
|
|
233
|
+
<CapImage className="preview-image" src={channel.toLowerCase() === 'wechat' ? wechatMobileAndroid : smsBody} alt={this.props.intl.formatMessage(messages.previewGenerated)}/>
|
|
73
234
|
<div className="msgContainer">
|
|
74
|
-
{this.props.channel.toLowerCase() === 'wechat' ? <div className="sms-icon" style={{ width: '25px', height: '25px', background: '#2E89DF' }}></div> : <img className="sms-icon" src={smsIcon} alt={this.props.intl.formatMessage(messages.smsIcon)} />}
|
|
75
235
|
<div className="message-pop align-left" style={{ background: `${this.props.channel.toLowerCase() === 'wechat' ? '#ffffff' : '#3F51B5'}`, color: `${this.props.channel.toLowerCase() === 'wechat' ? '#333333' : '#ffffff'}`}}>{content}
|
|
76
236
|
</div>
|
|
77
237
|
</div>
|
|
78
238
|
</div>
|
|
79
|
-
)
|
|
80
|
-
}
|
|
239
|
+
)
|
|
240
|
+
)}
|
|
81
241
|
{ channel && (channel.toLowerCase() === 'mobilepush') &&
|
|
82
242
|
(<div className="shell align-center" id="mobilepush-preview">
|
|
83
|
-
<
|
|
243
|
+
<CapImage className="preview-image" src={this.props.device === "android" ? androidPushMessagePhone : iPhonePushMessagePhone} alt={this.props.intl.formatMessage(messages.previewGenerated)}/>
|
|
84
244
|
{(!!content.header || !!content.bodyText || !!content.bodyImage) &&
|
|
85
245
|
<div className={`${this.props.device}-push-message-Container`}>
|
|
86
246
|
{this.props.device === "android" ?
|
|
@@ -95,7 +255,7 @@ class TemplatePreview extends React.Component { // eslint-disable-line react/pre
|
|
|
95
255
|
{content.bodyText}
|
|
96
256
|
</div>
|
|
97
257
|
{content.bodyImage && <div className="body-image">
|
|
98
|
-
<
|
|
258
|
+
<CapImage src={content.bodyImage} alt="" />
|
|
99
259
|
</div>}
|
|
100
260
|
{content.actions.filter((action) => action.label).length ?
|
|
101
261
|
<div className="actions">
|
|
@@ -111,7 +271,7 @@ class TemplatePreview extends React.Component { // eslint-disable-line react/pre
|
|
|
111
271
|
<span className="app-icon"></span>{content.appName ? content.appName : "App name"} <i className="material-icons">{this.props.intl.formatMessage(messages.close)}</i>
|
|
112
272
|
</div>
|
|
113
273
|
{content.bodyImage && <div className="body-image">
|
|
114
|
-
<
|
|
274
|
+
<CapImage src={content.bodyImage} alt=""/>
|
|
115
275
|
</div>}
|
|
116
276
|
<div className="title">
|
|
117
277
|
{content.header}
|
|
@@ -130,11 +290,11 @@ class TemplatePreview extends React.Component { // eslint-disable-line react/pre
|
|
|
130
290
|
{
|
|
131
291
|
channel && channel.toLowerCase() === 'line' ? (
|
|
132
292
|
<div className="shell align-center" id="sms-preview">
|
|
133
|
-
<
|
|
293
|
+
<CapImage className="preview-image" src={wechatBody} alt={this.props.intl.formatMessage(messages.previewGenerated)}/>
|
|
134
294
|
<div className="msgContainer">
|
|
135
295
|
<div className="sms-icon" style={{ width: '25px', height: '25px', background: '#2E89DF' }}></div>
|
|
136
296
|
<div className="message-pop align-left" style={{ background: '#ffffff', color: '#333333' }}>
|
|
137
|
-
{ (content && content.bodyImage) ? <
|
|
297
|
+
{ (content && content.bodyImage) ? <CapImage src={content.bodyImage} alt="ddd" style={{maxWidth: '100%'}}/> : '' }
|
|
138
298
|
{ (content && content.bodyText) ? content.bodyText : ''}
|
|
139
299
|
</div>
|
|
140
300
|
</div>
|
|
@@ -10,6 +10,10 @@ export default defineMessages({
|
|
|
10
10
|
id: 'creatives.components.TemplatePreview.previewGenerationMessage',
|
|
11
11
|
defaultMessage: "Preview is being generated",
|
|
12
12
|
},
|
|
13
|
+
senderId: {
|
|
14
|
+
id: 'creatives.components.TemplatePreview.senderId',
|
|
15
|
+
defaultMessage: "Sender ID",
|
|
16
|
+
},
|
|
13
17
|
sms: {
|
|
14
18
|
id: 'creatives.components.TemplatePreview.sms',
|
|
15
19
|
defaultMessage: "SMS",
|
|
@@ -46,4 +50,16 @@ export default defineMessages({
|
|
|
46
50
|
id: 'creatives.components.TemplatePreview.smsIcon',
|
|
47
51
|
defaultMessage: 'Sms Icon',
|
|
48
52
|
},
|
|
53
|
+
markAsRead: {
|
|
54
|
+
id: 'creatives.components.TemplatePreview.markAsRead',
|
|
55
|
+
defaultMessage: 'Mark as read',
|
|
56
|
+
},
|
|
57
|
+
reply: {
|
|
58
|
+
id: 'creatives.components.TemplatePreview.reply',
|
|
59
|
+
defaultMessage: 'Reply',
|
|
60
|
+
},
|
|
61
|
+
cancel: {
|
|
62
|
+
id: 'creatives.components.TemplatePreview.cancel',
|
|
63
|
+
defaultMessage: 'Cancel',
|
|
64
|
+
},
|
|
49
65
|
});
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
import { defineMessages } from 'react-intl';
|
|
2
|
+
export default defineMessages({
|
|
3
|
+
"sms": {
|
|
4
|
+
id: 'reon.components.Cap.sms',
|
|
5
|
+
defaultMessage: 'SMS',
|
|
6
|
+
},
|
|
7
|
+
"wechat": {
|
|
8
|
+
id: 'reon.components.Cap.wechat',
|
|
9
|
+
defaultMessage: 'WeChat',
|
|
10
|
+
},
|
|
11
|
+
"gallery": {
|
|
12
|
+
id: 'reon.components.Cap.gallery',
|
|
13
|
+
defaultMessage: 'Gallery',
|
|
14
|
+
},
|
|
15
|
+
"creativesDashboard": {
|
|
16
|
+
id: 'reon.components.Cap.creativesDashboard',
|
|
17
|
+
defaultMessage: 'Creatives',
|
|
18
|
+
},
|
|
19
|
+
"creatives": {
|
|
20
|
+
id: 'reon.components.Cap.creatives',
|
|
21
|
+
defaultMessage: 'Creatives',
|
|
22
|
+
},
|
|
23
|
+
"campaigns": {
|
|
24
|
+
id: 'reon.components.Cap.campaigns',
|
|
25
|
+
defaultMessage: 'Campaigns',
|
|
26
|
+
},
|
|
27
|
+
"loyalty": {
|
|
28
|
+
id: 'reon.components.Cap.loyalty',
|
|
29
|
+
defaultMessage: 'Loyalty',
|
|
30
|
+
},
|
|
31
|
+
"member care": {
|
|
32
|
+
id: 'reon.components.Cap.memberCare',
|
|
33
|
+
defaultMessage: 'Member Care',
|
|
34
|
+
},
|
|
35
|
+
"workbench": {
|
|
36
|
+
id: 'reon.components.Cap.Workbench',
|
|
37
|
+
defaultMessage: 'WorkBench',
|
|
38
|
+
},
|
|
39
|
+
"store care": {
|
|
40
|
+
id: 'reon.components.Cap.storeCare',
|
|
41
|
+
defaultMessage: 'Store Care',
|
|
42
|
+
},
|
|
43
|
+
"store performance": {
|
|
44
|
+
id: 'reon.components.Cap.storePerformance',
|
|
45
|
+
defaultMessage: 'Store Performance',
|
|
46
|
+
},
|
|
47
|
+
"email": {
|
|
48
|
+
id: 'reon.components.Cap.email',
|
|
49
|
+
defaultMessage: 'Email',
|
|
50
|
+
},
|
|
51
|
+
"ebill": {
|
|
52
|
+
id: 'reon.components.Cap.ebill',
|
|
53
|
+
defaultMessage: 'Ebill',
|
|
54
|
+
},
|
|
55
|
+
"campaignsDashboard": {
|
|
56
|
+
id: 'reon.components.campaignsDashboard',
|
|
57
|
+
defaultMessage: 'Campaigns',
|
|
58
|
+
},
|
|
59
|
+
"campaignsHome": {
|
|
60
|
+
id: 'reon.components.campaignsHome',
|
|
61
|
+
defaultMessage: "Campaigns Home",
|
|
62
|
+
},
|
|
63
|
+
});
|
package/package.json
CHANGED
|
@@ -11,7 +11,7 @@ import PropTypes from 'prop-types';
|
|
|
11
11
|
import React from 'react';
|
|
12
12
|
import _ from 'lodash';
|
|
13
13
|
import { Tabs, Table, Modal} from 'antd';
|
|
14
|
-
import { CapButton, CapInput, CapPopover, CapCheckbox, CapRadio, CapSelect, CapTable, CapRow, CapColumn, CapNotification, CapUploader, CapHeading, CapIcon} from '@capillarytech/cap-ui-library';
|
|
14
|
+
import { CapButton, CapInput, CapPopover, CapImage, CapCheckbox, CapRadio, CapSelect, CapTable, CapRow, CapColumn, CapNotification, CapUploader, CapHeading, CapIcon} from '@capillarytech/cap-ui-library';
|
|
15
15
|
import { injectIntl, intlShape, FormattedMessage } from 'react-intl';
|
|
16
16
|
import LabelHOC from '@capillarytech/cap-ui-library/assets/HOCs/ComponentWithLabelHOC';
|
|
17
17
|
import TemplatePreview from '../TemplatePreview';
|
|
@@ -2154,7 +2154,7 @@ class FormBuilder extends React.Component { // eslint-disable-line react/prefer-
|
|
|
2154
2154
|
//
|
|
2155
2155
|
const imgSrc = template && template.versions && template.versions.base ? template.versions.base.preview_http_url : '';
|
|
2156
2156
|
// const ifPreviewGenerated = template && template.versions && template.versions.base ? template.versions.base.isPreviewGenerated : 0;
|
|
2157
|
-
const content = <
|
|
2157
|
+
const content = <CapImage src={imgSrc || ''} alt="" />;
|
|
2158
2158
|
|
|
2159
2159
|
temp.content = (
|
|
2160
2160
|
<div
|
|
@@ -2339,8 +2339,10 @@ class FormBuilder extends React.Component { // eslint-disable-line react/prefer-
|
|
|
2339
2339
|
content={content}
|
|
2340
2340
|
charCounterEnabled={val.charCounterEnabled}
|
|
2341
2341
|
unicodeEnabled={unicodeEnabled}
|
|
2342
|
-
|
|
2343
|
-
|
|
2342
|
+
showTestAndPreviewIcon
|
|
2343
|
+
onPreviewContentClicked={this.props.onPreviewContentClicked}
|
|
2344
|
+
onTestContentClicked={this.props.onTestContentClicked}
|
|
2345
|
+
/>
|
|
2344
2346
|
</CapColumn>
|
|
2345
2347
|
);
|
|
2346
2348
|
break;
|
|
@@ -2706,7 +2708,7 @@ class FormBuilder extends React.Component { // eslint-disable-line react/prefer-
|
|
|
2706
2708
|
<div>
|
|
2707
2709
|
<div className={`image-container ${ifError ? 'error' : ''}`}>
|
|
2708
2710
|
{self.state && !!self.state.formData[`${self.state.currentTab - 1}`].image ?
|
|
2709
|
-
<
|
|
2711
|
+
<CapImage src={self.state.formData[`${self.state.currentTab - 1}`].image} alt={val.alt} style={val.style}/>
|
|
2710
2712
|
:
|
|
2711
2713
|
<div style={{width: "100%", textAlign: "center"}}><span className="image-placeholder">{val.placeholder}</span></div>
|
|
2712
2714
|
}
|
|
@@ -2722,7 +2724,7 @@ class FormBuilder extends React.Component { // eslint-disable-line react/prefer-
|
|
|
2722
2724
|
<div key={`${val.id}-${this.state.currentTab}`}>
|
|
2723
2725
|
<div className={`image-container ${props.ifError ? 'error' : ''}`}>
|
|
2724
2726
|
{self.state && !!self.state.formData[`${self.state.currentTab - 1}`].image ?
|
|
2725
|
-
<
|
|
2727
|
+
<CapImage src={self.state.formData[`${self.state.currentTab - 1}`].image} alt={props.alt} style={props.style}/>
|
|
2726
2728
|
:
|
|
2727
2729
|
<div style={{width: "100%", textAlign: "center"}}><span className="image-placeholder">{props.placeholder}</span></div>
|
|
2728
2730
|
}
|
|
@@ -2834,6 +2836,9 @@ class FormBuilder extends React.Component { // eslint-disable-line react/prefer-
|
|
|
2834
2836
|
content={content}
|
|
2835
2837
|
charCounterEnabled={val.charCounterEnabled}
|
|
2836
2838
|
unicodeEnabled={unicodeEnabled}
|
|
2839
|
+
showTestAndPreviewIcon
|
|
2840
|
+
onPreviewContentClicked={this.props.onPreviewContentClicked}
|
|
2841
|
+
onTestContentClicked={this.props.onTestContentClicked}
|
|
2837
2842
|
>
|
|
2838
2843
|
</TemplatePreview>
|
|
2839
2844
|
</CapColumn>
|
|
@@ -2883,6 +2888,10 @@ class FormBuilder extends React.Component { // eslint-disable-line react/prefer-
|
|
|
2883
2888
|
],
|
|
2884
2889
|
appName: val.content.appName,
|
|
2885
2890
|
}}
|
|
2891
|
+
showTestAndPreviewIcon
|
|
2892
|
+
onPreviewContentClicked={this.props.onPreviewContentClicked}
|
|
2893
|
+
onTestContentClicked={this.props.onTestContentClicked}
|
|
2894
|
+
templateDataRaw={this.props.templateData}
|
|
2886
2895
|
>
|
|
2887
2896
|
</TemplatePreview>
|
|
2888
2897
|
</CapColumn>
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
/**
|
|
2
|
+
*
|
|
3
|
+
* Header
|
|
4
|
+
*
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
import PropTypes from 'prop-types';
|
|
8
|
+
|
|
9
|
+
import React from 'react';
|
|
10
|
+
// import styled from 'styled-components';
|
|
11
|
+
import { FormattedMessage } from 'react-intl';
|
|
12
|
+
|
|
13
|
+
import { CapRow, CapColumn, CapInput, CapButton } from '@capillarytech/cap-ui-library';
|
|
14
|
+
import messages from './messages';
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
function Header(props) {
|
|
18
|
+
return (
|
|
19
|
+
<div>
|
|
20
|
+
<CapRow className="template-form-header">
|
|
21
|
+
<CapColumn span={10}>
|
|
22
|
+
<CapInput id="template-name" placeholder="Enter template name*" defaultValue={props.templateName} type="input" onChange={props.templateNameHandler}/>
|
|
23
|
+
</CapColumn>
|
|
24
|
+
<CapColumn span={2} offset={8}>
|
|
25
|
+
<CapButton id="preview-button" type="cancel" onClick={props.previewHandler}> <FormattedMessage {...messages.preview} /> </CapButton>
|
|
26
|
+
</CapColumn>
|
|
27
|
+
<CapColumn span={2}>
|
|
28
|
+
<CapButton id="cancel-button" type="cancel" onClick={props.cancelHandler}> <FormattedMessage {...messages.cancel} /> </CapButton>
|
|
29
|
+
</CapColumn>
|
|
30
|
+
<CapColumn span={2}>
|
|
31
|
+
<CapButton id="save-button" type="primary" onClick={props.saveHandler}> <FormattedMessage {...messages.save} /> </CapButton>
|
|
32
|
+
</CapColumn>
|
|
33
|
+
</CapRow>
|
|
34
|
+
</div>
|
|
35
|
+
);
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
Header.propTypes = {
|
|
39
|
+
templateNameHandler: PropTypes.func,
|
|
40
|
+
previewHandler: PropTypes.func,
|
|
41
|
+
cancelHandler: PropTypes.func,
|
|
42
|
+
saveHandler: PropTypes.func,
|
|
43
|
+
templateName: PropTypes.string,
|
|
44
|
+
};
|
|
45
|
+
|
|
46
|
+
export default Header;
|
|
@@ -7,16 +7,10 @@
|
|
|
7
7
|
import PropTypes from 'prop-types';
|
|
8
8
|
|
|
9
9
|
import React from 'react';
|
|
10
|
-
import {
|
|
11
|
-
// import styled from 'styled-components';
|
|
12
|
-
|
|
13
|
-
import { FormattedMessage } from 'react-intl';
|
|
14
|
-
import { Button } from 'antd';
|
|
10
|
+
import { CapTab, CapIcon } from '@capillarytech/cap-ui-library';
|
|
15
11
|
import { get, map, isEmpty} from 'lodash';
|
|
16
12
|
import TemplatePreview from '../TemplatePreview';
|
|
17
13
|
import '../PreviewSideBar/_previewsidebar.scss';
|
|
18
|
-
import messages from './messages';
|
|
19
|
-
const ButtonGroup = Button.Group;
|
|
20
14
|
|
|
21
15
|
class MobilePushPreviewV2 extends React.Component { // eslint-disable-line react/prefer-stateless-function
|
|
22
16
|
constructor(props) {
|
|
@@ -24,6 +18,9 @@ class MobilePushPreviewV2 extends React.Component { // eslint-disable-line react
|
|
|
24
18
|
this.goToEdit = this.goToEdit.bind(this);
|
|
25
19
|
this.goToDuplicate = this.goToDuplicate.bind(this);
|
|
26
20
|
this.changeDevice = this.changeDevice.bind(this);
|
|
21
|
+
this.getPreview = this.getPreview.bind(this);
|
|
22
|
+
this.setContent = this.setContent.bind(this);
|
|
23
|
+
this.goToDuplicate = this.goToDuplicate.bind(this);
|
|
27
24
|
const hasAndroid = get(props, 'templateData.versions.base.ANDROID') || get(props, 'templateData.androidContent');
|
|
28
25
|
const hasIos = get(props, 'templateData.versions.base.IOS') || get(props, 'templateData.iosContent');
|
|
29
26
|
let device = "android";
|
|
@@ -38,7 +35,7 @@ class MobilePushPreviewV2 extends React.Component { // eslint-disable-line react
|
|
|
38
35
|
};
|
|
39
36
|
}
|
|
40
37
|
|
|
41
|
-
setContent
|
|
38
|
+
setContent(templateData, device) {
|
|
42
39
|
const androidContent = get(templateData, 'versions.base.ANDROID') || get(templateData, 'androidContent');
|
|
43
40
|
const iosContent = get(templateData, 'versions.base.IOS') || get(templateData, 'iosContent');
|
|
44
41
|
|
|
@@ -59,12 +56,21 @@ class MobilePushPreviewV2 extends React.Component { // eslint-disable-line react
|
|
|
59
56
|
}
|
|
60
57
|
return content;
|
|
61
58
|
}
|
|
59
|
+
getPreview(device) {
|
|
60
|
+
return (
|
|
61
|
+
<TemplatePreview
|
|
62
|
+
device={device}
|
|
63
|
+
channel={this.props.channel}
|
|
64
|
+
content={this.state.content || ''}
|
|
65
|
+
templateData={this.props.templateData}
|
|
66
|
+
/>
|
|
67
|
+
);
|
|
68
|
+
}
|
|
62
69
|
goToDuplicate() {
|
|
63
70
|
this.props.onDuplicateClick(this.props.templateData);
|
|
64
71
|
this.props.handleClose();
|
|
65
72
|
}
|
|
66
|
-
changeDevice(
|
|
67
|
-
const device = ev.target.value;
|
|
73
|
+
changeDevice(device) {
|
|
68
74
|
const content = this.setContent(this.props.templateData, device);
|
|
69
75
|
this.setState({device, content });
|
|
70
76
|
}
|
|
@@ -72,38 +78,40 @@ class MobilePushPreviewV2 extends React.Component { // eslint-disable-line react
|
|
|
72
78
|
this.props.onEditClick(e, this.props.templateData._id, this.props.templateData.modeType, path);
|
|
73
79
|
}
|
|
74
80
|
render() {
|
|
75
|
-
const {templateData
|
|
76
|
-
|
|
81
|
+
const {templateData} = this.props;
|
|
77
82
|
const hasAndroid = get(templateData, 'versions.base.ANDROID') || get(templateData, 'androidContent');
|
|
78
83
|
const hasIos = get(templateData, 'versions.base.IOS') || get(templateData, 'iosContent');
|
|
79
|
-
|
|
80
|
-
const {device, content} = this.state;
|
|
84
|
+
const hasBothAndroidAndIos = hasAndroid && hasIos;
|
|
81
85
|
|
|
82
86
|
return (
|
|
83
|
-
|
|
84
87
|
<div>
|
|
85
88
|
<div className="devices">
|
|
86
|
-
{!isEmpty(templateData) &&
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
89
|
+
{!isEmpty(templateData) &&
|
|
90
|
+
( hasBothAndroidAndIos ? (
|
|
91
|
+
<CapTab
|
|
92
|
+
panes={[
|
|
93
|
+
{
|
|
94
|
+
content: this.getPreview('android'),
|
|
95
|
+
tab: <CapIcon type="android" size="m" />,
|
|
96
|
+
key: 'android',
|
|
97
|
+
},
|
|
98
|
+
{
|
|
99
|
+
content: this.getPreview('iphone'),
|
|
100
|
+
tab: <CapIcon type="ios" size="m" />,
|
|
101
|
+
key: 'iphone',
|
|
102
|
+
},
|
|
103
|
+
]}
|
|
104
|
+
onChange={(activeKey) => this.changeDevice(activeKey)}
|
|
105
|
+
tabBarStyle={{margin: 'auto', width: '38%'}}
|
|
106
|
+
/>
|
|
107
|
+
) : (
|
|
108
|
+
(hasAndroid || hasIos) && this.getPreview(hasAndroid ? 'android' : 'ios')
|
|
109
|
+
))
|
|
110
|
+
}
|
|
91
111
|
</div>
|
|
92
|
-
<TemplatePreview
|
|
93
|
-
device={device === "android" ? "android" : "iphone"}
|
|
94
|
-
channel={channel}
|
|
95
|
-
content={content || ''}
|
|
96
|
-
templateData={templateData}
|
|
97
|
-
>
|
|
98
|
-
</TemplatePreview>
|
|
99
|
-
|
|
100
|
-
|
|
101
112
|
</div>
|
|
102
|
-
|
|
103
|
-
|
|
104
113
|
);
|
|
105
114
|
}
|
|
106
|
-
|
|
107
115
|
}
|
|
108
116
|
|
|
109
117
|
MobilePushPreviewV2.propTypes = {
|
|
@@ -10,12 +10,4 @@ export default defineMessages({
|
|
|
10
10
|
id: 'creatives.componentsv2.MobilePushPreviewV2.header',
|
|
11
11
|
defaultMessage: 'This is the MobilePushPreviewV2 component !',
|
|
12
12
|
},
|
|
13
|
-
android: {
|
|
14
|
-
id: 'creatives.componentsv2.MobilePushPreviewV2.android',
|
|
15
|
-
defaultMessage: 'Android',
|
|
16
|
-
},
|
|
17
|
-
ios: {
|
|
18
|
-
id: 'creatives.componentsv2.MobilePushPreviewV2.ios',
|
|
19
|
-
defaultMessage: 'IOS',
|
|
20
|
-
},
|
|
21
13
|
});
|