@capillarytech/creatives-library 3.6.4 → 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.
Files changed (41) hide show
  1. package/components/TemplatePreview/WechatRichmediaTemplatePreview/index.js +7 -7
  2. package/components/TemplatePreview/_templatePreview.scss +279 -20
  3. package/components/TemplatePreview/assets/images/home-screen-android.svg +21 -0
  4. package/components/TemplatePreview/assets/images/home-screen-ios.svg +16 -0
  5. package/components/TemplatePreview/assets/images/sms_mobile_android.svg +22 -0
  6. package/components/TemplatePreview/assets/images/sms_mobile_ios.svg +16 -0
  7. package/components/TemplatePreview/assets/images/wechat_mobile_android.svg +20 -0
  8. package/components/TemplatePreview/index.js +180 -20
  9. package/components/TemplatePreview/messages.js +16 -0
  10. package/containers/Cap/messsages.js +63 -0
  11. package/package.json +1 -1
  12. package/v2Components/FormBuilder/index.js +15 -6
  13. package/v2Components/Header/index.js +46 -0
  14. package/v2Components/Header/tests/index.test.js +10 -0
  15. package/v2Components/MobilePushPreviewV2/index.js +40 -32
  16. package/v2Components/MobilePushPreviewV2/messages.js +0 -8
  17. package/v2Components/TemplatePreview/WechatRichmediaTemplatePreview/_wechatRichmediaTemplatePrev.scss +64 -0
  18. package/v2Components/TemplatePreview/WechatRichmediaTemplatePreview/index.js +101 -19
  19. package/v2Components/TemplatePreview/WechatRichmediaTemplatePreview/messages.js +12 -0
  20. package/v2Components/TemplatePreview/_templatePreview.scss +13 -4
  21. package/v2Components/TemplatePreview/assets/images/home-screen-android.svg +21 -0
  22. package/v2Components/TemplatePreview/assets/images/home-screen-ios.svg +16 -0
  23. package/v2Components/TemplatePreview/assets/images/sms_mobile_android.svg +22 -0
  24. package/v2Components/TemplatePreview/assets/images/wechat-home-screen-android.svg +21 -0
  25. package/v2Components/TemplatePreview/assets/images/wechat_mobile_android.svg +20 -0
  26. package/v2Components/TemplatePreview/index.js +147 -20
  27. package/v2Components/TemplatePreview/messages.js +8 -0
  28. package/v2Containers/CreativesContainer/SlideBoxContent.js +15 -2
  29. package/v2Containers/CreativesContainer/SlideBoxHeader.js +1 -1
  30. package/v2Containers/CreativesContainer/index.js +3 -1
  31. package/v2Containers/CreativesContainer/messages.js +2 -2
  32. package/v2Containers/Email/_email.scss +7 -1
  33. package/v2Containers/Email/index.js +39 -13
  34. package/v2Containers/Email/messages.js +4 -0
  35. package/v2Containers/EmailWrapper/index.js +4 -0
  36. package/v2Containers/MobilePush/Create/index.js +5 -0
  37. package/v2Containers/MobilePush/Edit/index.js +5 -0
  38. package/v2Containers/MobilepushWrapper/index.js +4 -1
  39. package/v2Containers/Sms/Create/index.js +2 -1
  40. package/v2Containers/Sms/Edit/index.js +2 -0
  41. package/v2Containers/TemplatesV2/_templatesV2.scss +5 -0
@@ -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-react-ui-library';
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
- <div className="shell align-center" id="sms-preview">
57
- <img className="preview-image sms" src={smsBody} alt={this.props.intl.formatMessage(messages.previewGenerated)}/>
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: '#3F51B5', color: '#ffffff'}}>
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
- ( <div className="shell align-center" id="sms-preview">
72
- <img className="preview-image" src={channel.toLowerCase() === 'wechat' ? wechatBody : smsBody} alt={this.props.intl.formatMessage(messages.previewGenerated)}/>
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
- <img className="preview-image" src={this.props.device === "android" ? androidPushMessagePhone : iPhonePushMessagePhone} alt={this.props.intl.formatMessage(messages.previewGenerated)}/>
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
- <img src={content.bodyImage} alt="" />
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
- <img src={content.bodyImage} alt=""/>
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
- <img className="preview-image" src={wechatBody} alt={this.props.intl.formatMessage(messages.previewGenerated)}/>
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) ? <img src={content.bodyImage} alt="ddd" style={{maxWidth: '100%'}}/> : '' }
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
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@capillarytech/creatives-library",
3
3
  "author": "meharaj",
4
- "version": "3.6.4",
4
+ "version": "3.6.5",
5
5
  "description": "Capillary creatives ui",
6
6
  "main": "./index.js",
7
7
  "module": "./index.es.js",
@@ -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 = <img src={imgSrc || ''} alt="" />;
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
- </TemplatePreview>
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
- <img src={self.state.formData[`${self.state.currentTab - 1}`].image} alt={val.alt} style={val.style}/>
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
- <img src={self.state.formData[`${self.state.currentTab - 1}`].image} alt={props.alt} style={props.style}/>
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;
@@ -0,0 +1,10 @@
1
+ // import React from 'react';
2
+ // import { shallow } from 'enzyme';
3
+
4
+ // import Header from '../index';
5
+
6
+ describe('<Header />', () => {
7
+ it('Expect to have unit tests specified', () => {
8
+ expect(true).toEqual(false);
9
+ });
10
+ });
@@ -7,16 +7,10 @@
7
7
  import PropTypes from 'prop-types';
8
8
 
9
9
  import React from 'react';
10
- import { CapButton } from '@capillarytech/cap-ui-library';
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 = (templateData, device) => {
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(ev) {
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, channel} = this.props;
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) && hasAndroid && hasIos &&
87
- <ButtonGroup onClick={this.changeDevice}>
88
- <CapButton type={device === "android" ? "primary" : "secondary"} value={"android"}><FormattedMessage {...messages.android} /></CapButton>
89
- <CapButton type={device === "iphone" ? "primary" : "secondary"} value={"iphone"}><FormattedMessage {...messages.ios} /></CapButton>
90
- </ButtonGroup>}
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
  });