@capillarytech/creatives-library 7.6.1 → 7.6.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.
Files changed (134) hide show
  1. package/assets/DeviceForEmail.png +0 -0
  2. package/components/CapTagList/index.js +5 -5
  3. package/components/Card/index.js +1 -1
  4. package/components/Ckeditor/index.js +5 -5
  5. package/components/CustomPopOver/index.js +3 -3
  6. package/components/Edmeditor/index.js +4 -4
  7. package/components/EmailPreview/index.js +1 -1
  8. package/components/PreviewSideBar/index.js +3 -3
  9. package/components/Sidebar/index.js +1 -1
  10. package/components/SmsTest/index.js +4 -4
  11. package/components/TemplatePreview/index.js +2 -2
  12. package/components/Toastr/index.js +1 -1
  13. package/config/app.js +2 -0
  14. package/containers/Assets/Gallery/index.js +2 -2
  15. package/containers/Assets/Gallery/sagas.js +1 -1
  16. package/containers/Cap/actions.js +2 -2
  17. package/containers/Cap/reducer.js +1 -1
  18. package/containers/Cap/sagas.js +3 -3
  19. package/containers/Cap/selectors.js +1 -1
  20. package/containers/Ebill/actions.js +1 -1
  21. package/containers/Ebill/index.js +34 -34
  22. package/containers/Ebill/sagas.js +3 -3
  23. package/containers/Email/actions.js +2 -2
  24. package/containers/Email/index.js +171 -171
  25. package/containers/Email/reducer.js +1 -1
  26. package/containers/Email/sagas.js +6 -6
  27. package/containers/LanguageProvider/actions.js +1 -1
  28. package/containers/Line/Create/actions.js +5 -5
  29. package/containers/Line/Create/index.js +37 -37
  30. package/containers/Line/Create/sagas.js +7 -7
  31. package/containers/Line/Edit/actions.js +3 -3
  32. package/containers/Line/Edit/index.js +24 -24
  33. package/containers/Line/Edit/sagas.js +4 -4
  34. package/containers/MobilePush/Create/actions.js +2 -2
  35. package/containers/MobilePush/Create/index.js +35 -35
  36. package/containers/MobilePush/Create/sagas.js +2 -2
  37. package/containers/MobilePush/Edit/actions.js +3 -3
  38. package/containers/MobilePush/Edit/index.js +32 -32
  39. package/containers/MobilePush/Edit/sagas.js +5 -5
  40. package/containers/Sms/Create/actions.js +2 -2
  41. package/containers/Sms/Create/index.js +57 -57
  42. package/containers/Sms/Create/sagas.js +2 -2
  43. package/containers/Sms/Edit/actions.js +3 -3
  44. package/containers/Sms/Edit/index.js +44 -44
  45. package/containers/Sms/Edit/sagas.js +3 -3
  46. package/containers/TagList/index.js +9 -9
  47. package/containers/Templates/actions.js +5 -5
  48. package/containers/Templates/index.js +44 -44
  49. package/containers/Templates/sagas.js +5 -5
  50. package/containers/WeChat/MapTemplates/actions.js +1 -1
  51. package/containers/WeChat/MapTemplates/index.js +34 -34
  52. package/containers/WeChat/MapTemplates/sagas.js +2 -2
  53. package/containers/WeChat/RichmediaTemplates/Create/index.js +9 -9
  54. package/containers/WeChat/RichmediaTemplates/Edit/actions.js +1 -1
  55. package/containers/WeChat/RichmediaTemplates/Edit/sagas.js +1 -1
  56. package/index.js +6 -0
  57. package/package.json +1 -1
  58. package/reducers.js +2 -1
  59. package/routes.js +5 -0
  60. package/services/api.js +43 -14
  61. package/utils/authWrapper.js +2 -2
  62. package/utils/common.js +13 -1
  63. package/utils/smsCharCount.js +5 -5
  64. package/v2Components/CapTagList/index.js +1 -1
  65. package/v2Components/CapVideoUpload/index.js +14 -6
  66. package/v2Components/Card/index.js +1 -1
  67. package/v2Components/Ckeditor/index.js +5 -5
  68. package/v2Components/CustomPopOver/index.js +3 -3
  69. package/v2Components/Edmeditor/index.js +4 -4
  70. package/v2Components/EmailMobilePreview/index.js +4 -4
  71. package/v2Components/EmailPreviewV2/index.js +4 -4
  72. package/v2Components/FormBuilder/index.js +3 -3
  73. package/v2Components/PreviewSideBar/index.js +3 -3
  74. package/v2Components/SmsTest/index.js +4 -4
  75. package/v2Components/TemplatePreview/index.js +24 -3
  76. package/v2Components/Toastr/index.js +1 -1
  77. package/v2Containers/App/constants.js +21 -0
  78. package/v2Containers/Assets/Gallery/sagas.js +1 -1
  79. package/v2Containers/Cap/actions.js +1 -1
  80. package/v2Containers/Cap/index.js +2 -2
  81. package/v2Containers/Cap/messages.js +30 -0
  82. package/v2Containers/Cap/reducer.js +1 -1
  83. package/v2Containers/Cap/sagas.js +3 -3
  84. package/v2Containers/Cap/selectors.js +1 -1
  85. package/v2Containers/CapFacebookPreview/actions.js +3 -15
  86. package/v2Containers/CapFacebookPreview/constants.js +3 -11
  87. package/v2Containers/CapFacebookPreview/index.js +6 -6
  88. package/v2Containers/CapFacebookPreview/reducer.js +3 -9
  89. package/v2Containers/CapFacebookPreview/sagas.js +6 -65
  90. package/v2Containers/CreativesContainer/SlideBoxContent.js +64 -1
  91. package/v2Containers/CreativesContainer/index.js +19 -8
  92. package/v2Containers/Ebill/actions.js +1 -1
  93. package/v2Containers/Ebill/index.js +34 -34
  94. package/v2Containers/Ebill/sagas.js +3 -3
  95. package/v2Containers/Email/reducer.js +1 -1
  96. package/v2Containers/EmailWrapper/index.js +4 -4
  97. package/v2Containers/Facebook/Advertisement/index.js +38 -15
  98. package/v2Containers/Facebook/Advertisement/index.scss +9 -0
  99. package/v2Containers/Facebook/Advertisement/messages.js +2 -2
  100. package/v2Containers/Facebook/actions.js +63 -0
  101. package/v2Containers/Facebook/constants.js +25 -1
  102. package/v2Containers/Facebook/index.js +135 -107
  103. package/v2Containers/Facebook/reducer.js +98 -1
  104. package/v2Containers/Facebook/sagas.js +147 -0
  105. package/v2Containers/Facebook/selectors.js +10 -0
  106. package/v2Containers/LanguageProvider/actions.js +1 -1
  107. package/v2Containers/Line/Container/Video/index.js +38 -41
  108. package/v2Containers/Line/Container/actions.js +5 -5
  109. package/v2Containers/Line/Container/sagas.js +4 -4
  110. package/v2Containers/MobilePush/Create/actions.js +2 -2
  111. package/v2Containers/MobilePush/Create/index.js +1 -1
  112. package/v2Containers/MobilePush/Create/sagas.js +2 -2
  113. package/v2Containers/MobilePush/Edit/actions.js +3 -3
  114. package/v2Containers/MobilePush/Edit/index.js +26 -26
  115. package/v2Containers/MobilePush/Edit/sagas.js +5 -5
  116. package/v2Containers/Sms/Create/index.js +4 -4
  117. package/v2Containers/TagList/index.js +6 -6
  118. package/v2Containers/Templates/_templates.scss +26 -0
  119. package/v2Containers/Templates/actions.js +18 -5
  120. package/v2Containers/Templates/constants.js +8 -0
  121. package/v2Containers/Templates/index.js +139 -11
  122. package/v2Containers/Templates/messages.js +8 -4
  123. package/v2Containers/Templates/reducer.js +22 -0
  124. package/v2Containers/Templates/sagas.js +30 -5
  125. package/v2Containers/TemplatesV2/index.js +13 -13
  126. package/v2Containers/Viber/actions.js +2 -2
  127. package/v2Containers/Viber/index.js +2 -1
  128. package/v2Containers/Viber/sagas.js +2 -2
  129. package/v2Containers/WeChat/MapTemplates/actions.js +1 -1
  130. package/v2Containers/WeChat/MapTemplates/index.js +19 -19
  131. package/v2Containers/WeChat/MapTemplates/sagas.js +3 -3
  132. package/v2Containers/WeChat/RichmediaTemplates/Create/actions.js +1 -1
  133. package/v2Containers/WeChat/RichmediaTemplates/Edit/actions.js +1 -1
  134. package/v2Containers/WeChat/RichmediaTemplates/Edit/sagas.js +1 -1
@@ -4,12 +4,36 @@
4
4
  *
5
5
  */
6
6
 
7
- const prefix = 'app/Facebook';
7
+ const prefix = 'app/v2Containers/Facebook';
8
8
 
9
9
  export const GET_MARKETING_OBJECTIVES = `${prefix}/GET_MARKETING_OBJECTIVES`;
10
10
  export const SET_MARKETING_OBJECTIVES_SUCCESS = `${prefix}/SET_MARKETING_OBJECTIVES_SUCCESS`;
11
11
  export const SET_MARKETING_OBJECTIVES_FAILURE = `${prefix}/SET_MARKETING_OBJECTIVES_FAILURE`;
12
+ export const UPLOAD_FB_AD_ASSET_REQUEST = `${prefix}/UPLOAD_ASSET_REQUEST`;
13
+ export const UPLOAD_FB_AD_ASSET_SUCCESS = `${prefix}/UPLOAD_ASSET_SUCCESS`;
14
+ export const UPLOAD_FB_AD_ASSET_FAILURE = `${prefix}/UPLOAD_ASSET_FAILURE`;
15
+ export const CREATE_FACEBOOK_AD_TEMPLATE_REQUEST = `${prefix}/CREATE_FACEBOOK_AD_TEMPLATE_REQUEST`;
16
+ export const CREATE_FACEBOOK_AD_TEMPLATE_SUCCESS = `${prefix}/CREATE_FACEBOOK_AD_TEMPLATE_SUCCESS`;
17
+ export const CREATE_FACEBOOK_AD_TEMPLATE_FAILURE = `${prefix}/CREATE_FACEBOOK_AD_TEMPLATE_FAILURE`;
12
18
 
19
+
20
+ export const GET_FACEBOOK_AD_TEMPLATE_DETAILS_REQUEST = `${prefix}/EDIT/CREATE_FACEBOOK_AD_TEMPLATE_DETAILS_REQUEST`;
21
+ export const GET_FACEBOOK_AD_TEMPLATE_DETAILS_SUCCESS = `${prefix}/EDIT/CREATE_FACEBOOK_AD_TEMPLATE_DETAILS_SUCCESS`;
22
+ export const GET_FACEBOOK_AD_TEMPLATE_DETAILS_FAILURE = `${prefix}/EDIT/CREATE_FACEBOOK_AD_TEMPLATE_DETAILS_FAILURE`;
23
+
24
+ export const EDIT_FACEBOOK_AD_TEMPLATE_REQUEST = `${prefix}/Edit/EDIT_FACEBOOK_AD_TEMPLATE_REQUEST`;
25
+ export const EDIT_FACEBOOK_AD_TEMPLATE_SUCCESS = `${prefix}/Edit/EDIT_FACEBOOK_AD_TEMPLATE_SUCCESS`;
26
+ export const EDIT_FACEBOOK_AD_TEMPLATE_FAILURE = `${prefix}/Edit/EDIT_FACEBOOK_AD_TEMPLATE_FAILURE`;
27
+
28
+ export const CLEAR_FACEBOOK_AD_EDIT_RESPONSE_REQUEST = `${prefix}/Edit/CLEAR_EDIT_RESPONSE_REQUEST`;
29
+ export const CLEAR_FACEBOOK_AD_DATA = `${prefix}/Edit/CLEAR_DATA`;
30
+ export const CLEAR_FACEBOOK_AD_CREATE_RESPONSE_REQUEST = `${prefix}/Create/CLEAR_EDIT_RESPONSE_REQUEST`;
31
+ export const CLEAR_FACEBOOK_AD_ASSET = `${prefix}/CLEAR_ASSET`;
32
+
33
+
34
+ export const GET_ORG_OU_LIST_REQUEST = `${prefix}/GET_ORG_OU_LIST_REQUEST`;
35
+ export const GET_ORG_OU_LIST_SUCCESS = `${prefix}/GET_ORG_OU_LIST_SUCCESS`;
36
+ export const GET_ORG_OU_LIST_FAILURE = `${prefix}/GET_ORG_OU_LIST_FAILURE`;
13
37
  // marketing objectives constants
14
38
 
15
39
  export const VALUE_APP_INSTALLS = 'VALUE_APP_INSTALLS';
@@ -24,7 +24,8 @@ import styles, { CampaignDetailCapColumn } from './Facebook.style';
24
24
  import * as actions from './actions';
25
25
  import withStyles from '../../hoc/withStyles';
26
26
  import MarketingObjective from '../../v2Components/MarketingObjective';
27
- import { makeSelectMarketingObjectiveList } from './selectors';
27
+ import { makeSelectMarketingObjectiveList, makeSelectFbAd, makeSelectTemplate } from './selectors';
28
+ import Advertisement from './Advertisement';
28
29
  import {
29
30
  VALUE_APP_INSTALLS,
30
31
  VALUE_BRAND_AWARENESS,
@@ -149,9 +150,7 @@ const getCategorizedMarketingObjectiveList = (marketingObjectivesList, formatMes
149
150
  const Facebook = (props) => {
150
151
  const {
151
152
  className,
152
- templateData: {
153
- selectedMarketingObjective: fbMarketingObjectiveValue = VALUE_REACH,
154
- } = {},
153
+ templateData,
155
154
  cap: {
156
155
  campaignDetails: {
157
156
  name: fbCampaignValue,
@@ -179,13 +178,25 @@ const Facebook = (props) => {
179
178
  marketingObjectiveList,
180
179
  facebookActions,
181
180
  intl,
181
+ isFullMode,
182
+ fbADData,
183
+ onCreateComplete,
184
+ params,
185
+ facebookTemplateData,
182
186
  } = props;
183
-
187
+ const {
188
+ selectedMarketingObjective: fbMarketingObjectiveValue = VALUE_REACH,
189
+ } = templateData || {};
184
190
  const [isDrawerVisible, setDrawerVisibility] = useState(false);
185
191
  const [selectedMarketingObjective, setMarketingObjective] = useState(socialObjective || fbMarketingObjectiveValue);
186
192
 
187
193
  useEffect(() => {
188
- facebookActions.getMarketingObjectives();
194
+ if (!isFullMode) {
195
+ facebookActions.getMarketingObjectives();
196
+ } else {
197
+ const orgId = window.localStorage.getItem('orgID');
198
+ facebookActions.getOrgOUs(orgId);
199
+ }
189
200
  }, []);
190
201
 
191
202
  const categorizedMarketingObjectiveList = getCategorizedMarketingObjectiveList(marketingObjectiveList, intl.formatMessage);
@@ -215,141 +226,158 @@ const Facebook = (props) => {
215
226
  const onMarketingObjectiveSelect = (value) => setMarketingObjective(value);
216
227
 
217
228
  return (
218
- <div className={className}>
219
- <div className="is-scrollable-section">
220
- <div className="account-details-wrapper">
221
- <div className="account-name-section">
222
- <CapHeading type="h4">
223
- <FormattedMessage {...messages.fbAccount} />
224
- </CapHeading>
225
- <CapHeading type="h3">{accountName}</CapHeading>
226
- </div>
229
+ !isFullMode ? (<div className={className}>
230
+ <div className="is-scrollable-section" >
231
+ <div className="account-details-wrapper">
232
+ <div className="account-name-section">
233
+ <CapHeading type="h4">
234
+ <FormattedMessage {...messages.fbAccount} />
235
+ </CapHeading>
236
+ <CapHeading type="h3">{accountName}</CapHeading>
237
+ </div>
227
238
 
228
- <div className="account-section-container">
229
- <CapHeading type="h3">
230
- <FormattedMessage {...messages.fbAdCampaignSetDetailsTitle} />
231
- </CapHeading>
232
- <CapLabel type="label1">
233
- <FormattedMessage
234
- {...messages.fbAdCampaignSetDetailsDescription}
239
+ <div className="account-section-container">
240
+ <CapHeading type="h3">
241
+ <FormattedMessage {...messages.fbAdCampaignSetDetailsTitle} />
242
+ </CapHeading>
243
+ <CapLabel type="label1">
244
+ <FormattedMessage
245
+ {...messages.fbAdCampaignSetDetailsDescription}
235
246
  />
236
- </CapLabel>
237
- </div>
247
+ </CapLabel>
248
+ </div>
238
249
 
239
- <CapRow span={12} type="flex">
240
- {campaignDataList.map(({ label, value, onChange }, index) => (
241
- <StyledCampaignDetailCapColumn
242
- span={index % 2 === 0 ? 6 : 14}
243
- key={label}
250
+ <CapRow span={12} type="flex">
251
+ {campaignDataList.map(({ label, value, onChange }, index) => (
252
+ <StyledCampaignDetailCapColumn
253
+ span={index % 2 === 0 ? 6 : 14}
254
+ key={label}
244
255
  >
245
- <CapRow>
246
- <CapLabel type="label2">
247
- <FormattedMessage {...messages[label]} />
248
- </CapLabel>
249
- <CapHeading type="h4">
250
- {value}
251
- {!socialRemoteCampaignId && onChange && (
252
- <CapButton
253
- type="flat"
254
- className="marketingObjective-change-button facebook-marketing-objective-change"
255
- onClick={onChange}
256
+ <CapRow>
257
+ <CapLabel type="label2">
258
+ <FormattedMessage {...messages[label]} />
259
+ </CapLabel>
260
+ <CapHeading type="h4">
261
+ {value}
262
+ {!socialRemoteCampaignId && onChange && (
263
+ <CapButton
264
+ type="flat"
265
+ className="marketingObjective-change-button facebook-marketing-objective-change"
266
+ onClick={onChange}
256
267
  >
257
- <FormattedMessage {...messages.fbChange} />
258
- </CapButton>
268
+ <FormattedMessage {...messages.fbChange} />
269
+ </CapButton>
259
270
  )}
260
- </CapHeading>
261
- </CapRow>
262
- </StyledCampaignDetailCapColumn>
271
+ </CapHeading>
272
+ </CapRow>
273
+ </StyledCampaignDetailCapColumn>
263
274
  ))}
264
- </CapRow>
265
- <CapDrawer
266
- content={
267
- <MarketingObjective
268
- selectedMarketingObjective={selectedMarketingObjective}
269
- onMarketingObjectiveSelect={onMarketingObjectiveSelect}
270
- defaultmarketingObjective={socialObjective || fbMarketingObjectiveValue}
271
- onSubmit={setDrawerVisibility}
272
- marketingObjectiveList={categorizedMarketingObjectiveList}
275
+ </CapRow>
276
+ <CapDrawer
277
+ content={
278
+ <MarketingObjective
279
+ selectedMarketingObjective={selectedMarketingObjective}
280
+ onMarketingObjectiveSelect={onMarketingObjectiveSelect}
281
+ defaultmarketingObjective={socialObjective || fbMarketingObjectiveValue}
282
+ onSubmit={setDrawerVisibility}
283
+ marketingObjectiveList={categorizedMarketingObjectiveList}
273
284
  />
274
285
  }
275
- visible={isDrawerVisible}
276
- width={380}
277
- onClose={() => setDrawerVisibility(false)}
286
+ visible={isDrawerVisible}
287
+ width={380}
288
+ onClose={() => setDrawerVisibility(false)}
278
289
  />
279
- </div>
290
+ </div>
280
291
 
281
- <div className="ad-section">
282
- <div className="account-section-container">
283
- <CapHeading type="h3">
284
- <FormattedMessage {...messages.fbAdsTitle} />
285
- </CapHeading>
286
- <CapLabel type="label1">
287
- <FormattedMessage {...messages.fbAdsDescription} />
288
- </CapLabel>
289
- </div>
292
+ <div className="ad-section">
293
+ <div className="account-section-container">
294
+ <CapHeading type="h3">
295
+ <FormattedMessage {...messages.fbAdsTitle} />
296
+ </CapHeading>
297
+ <CapLabel type="label1">
298
+ <FormattedMessage {...messages.fbAdsDescription} />
299
+ </CapLabel>
300
+ </div>
290
301
 
291
- <div>
292
- <CapRow span={12} type="flex">
293
- <CapColumn span={6}>
294
- <CapCustomCard
295
- type="Facebook"
296
- FBDynamicComponent={() => (
297
- <CapIcon
298
- size="l"
299
- type="scenery"
300
- className="facebook-dynamic-content"
302
+ <div>
303
+ <CapRow span={12} type="flex">
304
+ <CapColumn span={6}>
305
+ <CapCustomCard
306
+ type="Facebook"
307
+ FBDynamicComponent={() => (
308
+ <CapIcon
309
+ size="l"
310
+ type="scenery"
311
+ className="facebook-dynamic-content"
301
312
  />
302
313
  )}
303
314
  />
304
- </CapColumn>
305
- <CapColumn span={16}>
306
- <ul className="parameter-list">
307
- {adSetParameters.map((parameter, index) => (
308
- <li key={parameter} className="parameter-list-item">
309
- <CapLabel type="label2" className="parameter-index">
310
- {index + 1}
311
- </CapLabel>
312
- <CapHeading type="h5">
313
- <FormattedMessage {...messages[parameter]} />
314
- </CapHeading>
315
- </li>
315
+ </CapColumn>
316
+ <CapColumn span={16}>
317
+ <ul className="parameter-list">
318
+ {adSetParameters.map((parameter, index) => (
319
+ <li key={parameter} className="parameter-list-item">
320
+ <CapLabel type="label2" className="parameter-index">
321
+ {index + 1}
322
+ </CapLabel>
323
+ <CapHeading type="h5">
324
+ <FormattedMessage {...messages[parameter]} />
325
+ </CapHeading>
326
+ </li>
316
327
  ))}
317
- </ul>
318
- </CapColumn>
319
- </CapRow>
320
- </div>
321
- </div>
322
- </div>
323
- <CapButton
324
- className="facebook-confirm-button"
325
- type="primary"
326
- onClick={() =>
328
+ </ul>
329
+ </CapColumn>
330
+ </CapRow>
331
+ </div>
332
+ </div>
333
+ </div>
334
+ <CapButton
335
+ className="facebook-confirm-button"
336
+ type="primary"
337
+ onClick={() =>
327
338
  onFacebookSubmit({ channel: "FACEBOOK", selectedMarketingObjective, accountId })
328
339
  }
329
340
  >
330
- <FormattedMessage {...messages.fbConfirm} />
331
- </CapButton>
332
- </div>
341
+ <FormattedMessage {...messages.fbConfirm} />
342
+ </CapButton>
343
+ </div>) : <div style={{height: '1200px'}}>
344
+ <Advertisement
345
+ isFullMode={isFullMode}
346
+ actions={facebookActions}
347
+ fbADData={fbADData}
348
+ onCreateComplete={onCreateComplete}
349
+ templateData={templateData}
350
+ params={params}
351
+ facebookTemplateData={facebookTemplateData}
352
+ /></div>
333
353
  );
334
354
  };
335
355
 
336
356
  Facebook.propTypes = {
337
- className: PropTypes.string.isRequired,
357
+ className: PropTypes.string,
338
358
  templateData: PropTypes.object,
339
359
  cap: PropTypes.object,
340
360
  messageDetails: PropTypes.object,
341
- onFacebookSubmit: PropTypes.func.isRequired,
361
+ params: PropTypes.object,
362
+ onFacebookSubmit: PropTypes.func,
342
363
  marketingObjectiveList: PropTypes.arrayOf(PropTypes.string),
343
- facebookActions: PropTypes.func.isRequired,
344
- intl: intlShape.isRequired,
364
+ facebookActions: PropTypes.func,
365
+ intl: intlShape,
366
+ isFullMode: PropTypes.boolean,
367
+ fbADData: PropTypes.object,
368
+ onCreateComplete: PropTypes.func,
369
+ facebookTemplateData: PropTypes.object,
345
370
  };
346
371
 
347
372
  Facebook.defaultProps = {
348
- marketingObjectiveList: [],
373
+ marketingObjectiveList: [""],
374
+
349
375
  };
350
376
 
351
377
  const mapStateToProps = createStructuredSelector({
352
378
  marketingObjectiveList: makeSelectMarketingObjectiveList(),
379
+ fbADData: makeSelectFbAd(),
380
+ facebookTemplateData: makeSelectTemplate(),
353
381
  });
354
382
 
355
383
  const mapDispatchToProps = (dispatch) => ({
@@ -8,14 +8,34 @@ import { fromJS } from 'immutable';
8
8
  import {
9
9
  SET_MARKETING_OBJECTIVES_SUCCESS,
10
10
  SET_MARKETING_OBJECTIVES_FAILURE,
11
+ UPLOAD_FB_AD_ASSET_REQUEST,
12
+ UPLOAD_FB_AD_ASSET_SUCCESS,
13
+ UPLOAD_FB_AD_ASSET_FAILURE,
14
+ CREATE_FACEBOOK_AD_TEMPLATE_REQUEST,
15
+ CREATE_FACEBOOK_AD_TEMPLATE_SUCCESS,
16
+ CREATE_FACEBOOK_AD_TEMPLATE_FAILURE,
17
+ CLEAR_FACEBOOK_AD_ASSET,
18
+ EDIT_FACEBOOK_AD_TEMPLATE_REQUEST,
19
+ EDIT_FACEBOOK_AD_TEMPLATE_SUCCESS,
20
+ EDIT_FACEBOOK_AD_TEMPLATE_FAILURE,
21
+ GET_FACEBOOK_AD_TEMPLATE_DETAILS_REQUEST,
22
+ GET_FACEBOOK_AD_TEMPLATE_DETAILS_SUCCESS,
23
+ GET_FACEBOOK_AD_TEMPLATE_DETAILS_FAILURE,
24
+ CLEAR_FACEBOOK_AD_EDIT_RESPONSE_REQUEST,
25
+ CLEAR_FACEBOOK_AD_CREATE_RESPONSE_REQUEST,
26
+ CLEAR_FACEBOOK_AD_DATA,
27
+ GET_ORG_OU_LIST_REQUEST,
28
+ GET_ORG_OU_LIST_FAILURE,
29
+ GET_ORG_OU_LIST_SUCCESS,
11
30
  } from './constants';
12
31
 
13
32
  export const initialState = fromJS({
14
33
  marketinObjectives: {},
34
+ uploadedAssetData: {},
15
35
  });
16
36
 
17
37
  function facebookReducer(state = initialState, action) {
18
- const { type, payload } = action;
38
+ const { type, payload, templateType} = action;
19
39
  switch (type) {
20
40
  case SET_MARKETING_OBJECTIVES_SUCCESS: {
21
41
  return state.set('marketinObjectivesData', payload).set('marketinObjectivesError', null);
@@ -23,6 +43,83 @@ function facebookReducer(state = initialState, action) {
23
43
  case SET_MARKETING_OBJECTIVES_FAILURE: {
24
44
  return state.set('marketinObjectivesData', []).set('marketinObjectivesError', payload);
25
45
  }
46
+ case UPLOAD_FB_AD_ASSET_REQUEST:
47
+ return state
48
+ .set('uploadAssetSuccess', false)
49
+ .set(templateType !== undefined ? `uploadAssetError${templateType}` : 'uploadAssetError', false, )
50
+ .set(templateType !== undefined ? `assetUploading${templateType}` : 'assetUploading', true);
51
+ case UPLOAD_FB_AD_ASSET_SUCCESS:
52
+ return state
53
+ .set('uploadAssetSuccess', (action.statusCode !== undefined && action.statusCode !== '' && action.statusCode < 300))
54
+ .set(templateType !== undefined ? `uploadAssetError${templateType}` : 'uploadAssetError', false, )
55
+ .set(templateType !== undefined ? `assetUploading${templateType}` : 'assetUploading', false)
56
+ .set(templateType !== undefined ? `uploadedAssetData${templateType}` : 'uploadedAssetData', action.data);
57
+ case UPLOAD_FB_AD_ASSET_FAILURE:
58
+ return state
59
+ .set('uploadAssetSuccess', false)
60
+ .set(templateType !== undefined ? `uploadAssetError${templateType}` : 'uploadAssetError', true, )
61
+ .set(templateType !== undefined ? `assetUploading${templateType}` : 'assetUploading', false);
62
+ case CREATE_FACEBOOK_AD_TEMPLATE_REQUEST:
63
+ return state
64
+ .set('createTemplateInProgress', true)
65
+ .set('createTemplateError', false)
66
+ .set('createTemplateErrorMessage', fromJS(""));
67
+ case CREATE_FACEBOOK_AD_TEMPLATE_SUCCESS:
68
+ return state.set('createTemplateInProgress', false)
69
+ .set('response', action.data)
70
+ .set('createTemplateError', (action.statusCode !== undefined && action.statusCode > 300))
71
+ .set('createTemplateErrorMessage', fromJS(action.errorMsg));
72
+ case CREATE_FACEBOOK_AD_TEMPLATE_FAILURE:
73
+ return state
74
+ .set('createTemplateInProgress', false)
75
+ .set('createTemplateError', true)
76
+ .set('createTemplateErrorMessage', fromJS(action.errorMsg));
77
+ case CLEAR_FACEBOOK_AD_ASSET:
78
+ return state
79
+ .delete(templateType !== undefined ? `uploadedAssetData${templateType}` : 'uploadedAssetData');
80
+ // FOR EDIT
81
+ case EDIT_FACEBOOK_AD_TEMPLATE_REQUEST:
82
+ return state
83
+ .set('editTemplateInProgress', true)
84
+ .set('editTemplateError', false)
85
+ .set('editTemplateErrorMessage', fromJS(""));
86
+ case EDIT_FACEBOOK_AD_TEMPLATE_SUCCESS:
87
+ return state.set('editTemplateInProgress', false)
88
+ .set('editResponse', action.data)
89
+ .set('editTemplateError', (action.statusCode !== undefined && action.statusCode > 300))
90
+ .set('editTemplateErrorMessage', fromJS(action.errorMsg));
91
+ case EDIT_FACEBOOK_AD_TEMPLATE_FAILURE:
92
+ return state
93
+ .set('editTemplateInProgress', false)
94
+ .set('editTemplateError', true)
95
+ .set('editTemplateErrorMessage', fromJS(action.errorMsg));
96
+ case GET_FACEBOOK_AD_TEMPLATE_DETAILS_REQUEST:
97
+ return state.set('getTemplateDetailsInProgress', true);
98
+ case GET_FACEBOOK_AD_TEMPLATE_DETAILS_SUCCESS:
99
+ return state.set('getTemplateDetailsInProgress', false)
100
+ .set('templateDetails', action.data);
101
+ case GET_FACEBOOK_AD_TEMPLATE_DETAILS_FAILURE:
102
+ case CLEAR_FACEBOOK_AD_EDIT_RESPONSE_REQUEST:
103
+ return state.set('editResponse', {});
104
+ case CLEAR_FACEBOOK_AD_CREATE_RESPONSE_REQUEST:
105
+ return state.set('response', {});
106
+ case CLEAR_FACEBOOK_AD_DATA:
107
+ return state
108
+ .delete('uploadedAssetData')
109
+ .delete('metaEntities')
110
+ .delete('templateDetails');
111
+ case GET_ORG_OU_LIST_REQUEST: {
112
+ return state.set('orgOuData', fromJS({ status: 'REQUEST' }));
113
+ }
114
+ case GET_ORG_OU_LIST_SUCCESS: {
115
+ return state.set(
116
+ 'orgOuData',
117
+ fromJS({ status: 'SUCCESS', data: action.payload }),
118
+ );
119
+ }
120
+ case GET_ORG_OU_LIST_FAILURE: {
121
+ return state.set('orgOuData', fromJS({ status: 'FAILURE' }));
122
+ }
26
123
  default:
27
124
  return state;
28
125
  }
@@ -5,6 +5,21 @@ import {
5
5
  GET_MARKETING_OBJECTIVES,
6
6
  SET_MARKETING_OBJECTIVES_SUCCESS,
7
7
  SET_MARKETING_OBJECTIVES_FAILURE,
8
+ UPLOAD_FB_AD_ASSET_REQUEST,
9
+ UPLOAD_FB_AD_ASSET_SUCCESS,
10
+ UPLOAD_FB_AD_ASSET_FAILURE,
11
+ CREATE_FACEBOOK_AD_TEMPLATE_REQUEST,
12
+ CREATE_FACEBOOK_AD_TEMPLATE_SUCCESS,
13
+ CREATE_FACEBOOK_AD_TEMPLATE_FAILURE,
14
+ EDIT_FACEBOOK_AD_TEMPLATE_REQUEST,
15
+ EDIT_TEMPLATE_FACEBOOK_AD_SUCCESS,
16
+ EDIT_FACEBOOK_AD_TEMPLATE_FAILURE,
17
+ GET_FACEBOOK_AD_TEMPLATE_DETAILS_REQUEST,
18
+ GET_FACEBOOK_AD_TEMPLATE_DETAILS_SUCCESS,
19
+ GET_FACEBOOK_AD_TEMPLATE_DETAILS_FAILURE,
20
+ GET_ORG_OU_LIST_FAILURE,
21
+ GET_ORG_OU_LIST_SUCCESS,
22
+ GET_ORG_OU_LIST_REQUEST,
8
23
  } from './constants';
9
24
 
10
25
  export function* fetchMarketingObjectives() {
@@ -29,13 +44,145 @@ export function* fetchMarketingObjectives() {
29
44
  });
30
45
  }
31
46
  }
47
+ export function* getOrgOUs({ orgID } = {}) {
48
+ try {
49
+ const apiResponse = yield call(Api.getOrgOUs, { orgID });
50
+ if (apiResponse.status === 200) {
51
+ yield put({
52
+ type: GET_ORG_OU_LIST_SUCCESS,
53
+ payload: apiResponse.result,
54
+ });
55
+ } else {
56
+ yield put({
57
+ type: GET_ORG_OU_LIST_FAILURE,
58
+ payload: apiResponse,
59
+ });
60
+ }
61
+ } catch (error) {
62
+ yield put({
63
+ type: GET_ORG_OU_LIST_FAILURE,
64
+ payload: error,
65
+ });
66
+ }
67
+ }
68
+
69
+ export function* uploadFbAdAsset(file, assetType, fileParams) {
70
+ try {
71
+ const result = yield call(Api.uploadFile, file, assetType, fileParams);
72
+ let videoIdResponse = {};
73
+ if (file.assetType === 'video' && (result.status.code >= 200 && result.status.code < 300)) {
74
+ const {accessToken, actId, pageAccessToken, pageId} = file.videoData;
75
+ videoIdResponse = yield call(Api.getFacebookVideoId, {videoUrl: result.response.asset.metaInfo.secure_file_path, accessToken, actId, pageAccessToken, pageId});
76
+ }
77
+ if (result.status.isError) {
78
+ yield put({ type: UPLOAD_FB_AD_ASSET_FAILURE, error: result.status.message });
79
+ } else if (videoIdResponse.status?.isError) {
80
+ yield put({ type: UPLOAD_FB_AD_ASSET_FAILURE, error: result.status });
81
+ } else {
82
+ yield put({
83
+ type: UPLOAD_FB_AD_ASSET_SUCCESS,
84
+ data: {...result.response.asset, videoIdResponse: videoIdResponse.response},
85
+ statusCode: result.status ? result.status.code : '',
86
+ templateType: file.templateType,
87
+ });
88
+ }
89
+ } catch (error) {
90
+ yield put({ type: UPLOAD_FB_AD_ASSET_FAILURE, error });
91
+ }
92
+ }
93
+ export function* createFacebookADTemplate({ template, callback }) {
94
+ let errorMsg;
95
+ try {
96
+ const result = yield call(Api.createFacebookADTemplate, { template });
97
+ if (result.status.code >= 400) {
98
+ errorMsg = result.message;
99
+ throw errorMsg;
100
+ }
101
+ yield put({ type: CREATE_FACEBOOK_AD_TEMPLATE_SUCCESS, data: result.response, statusCode: result.status ? result.status.code : '', errorMsg });
102
+ if (callback) {
103
+ callback(result.response);
104
+ }
105
+ } catch (error) {
106
+ yield put({ type: CREATE_FACEBOOK_AD_TEMPLATE_FAILURE, error, errorMsg });
107
+ if (callback) {
108
+ callback(null, errorMsg);
109
+ }
110
+ }
111
+ }
112
+
113
+
114
+ export function* editTemplate({ template, callback }) {
115
+ let errorMsg;
116
+ try {
117
+ const result = yield call(Api.createFacebookADTemplate, {template});
118
+ if (result.status.code >= 400) {
119
+ errorMsg = result.message;
120
+ throw errorMsg;
121
+ }
122
+ if (callback) {
123
+ callback(result.response);
124
+ }
125
+ yield put({ type: EDIT_TEMPLATE_FACEBOOK_AD_SUCCESS, data: result.response, statusCode: result.status ? result.status.code : '', errorMsg });
126
+ } catch (error) {
127
+ yield put({ type: EDIT_FACEBOOK_AD_TEMPLATE_FAILURE, error, errorMsg });
128
+ if (callback) {
129
+ callback(null, errorMsg);
130
+ }
131
+ }
132
+ }
133
+
134
+ export function* getTemplateDetails({id, callback}) {
135
+ try {
136
+ const result = yield call(Api.getTemplateDetails, {id, channel: 'FACEBOOK'});
137
+ yield put({ type: GET_FACEBOOK_AD_TEMPLATE_DETAILS_SUCCESS, data: result.response });
138
+ if (callback) {
139
+ callback(false);
140
+ }
141
+ } catch (error) {
142
+ yield put({ type: GET_FACEBOOK_AD_TEMPLATE_DETAILS_FAILURE, error });
143
+ }
144
+ }
145
+
146
+
147
+ function* watchCreateTemplate() {
148
+ const watcher = yield takeLatest(CREATE_FACEBOOK_AD_TEMPLATE_REQUEST, createFacebookADTemplate);
149
+ yield take(LOCATION_CHANGE);
150
+ yield cancel(watcher);
151
+ }
152
+
153
+ function* watchGetTemplateDetails() {
154
+ const watcher = yield takeLatest(GET_FACEBOOK_AD_TEMPLATE_DETAILS_REQUEST, getTemplateDetails);
155
+ yield take(LOCATION_CHANGE);
156
+ yield cancel(watcher);
157
+ }
158
+
159
+ function* watchEditTemplate() {
160
+ const watcher = yield takeLatest(EDIT_FACEBOOK_AD_TEMPLATE_REQUEST, editTemplate);
161
+ yield take(LOCATION_CHANGE);
162
+ yield cancel(watcher);
163
+ }
164
+
32
165
 
33
166
  function* watchFetchMarketingObjective() {
34
167
  const watcher = yield takeLatest(GET_MARKETING_OBJECTIVES, fetchMarketingObjectives);
35
168
  yield take(LOCATION_CHANGE);
36
169
  yield cancel(watcher);
37
170
  }
171
+ function* watchUploadFbADAsset() {
172
+ const watcher = yield takeLatest(UPLOAD_FB_AD_ASSET_REQUEST, uploadFbAdAsset);
173
+ yield take(LOCATION_CHANGE);
174
+ yield cancel(watcher);
175
+ }
176
+ export function* watchGetOrgOUs() {
177
+ yield takeLatest(GET_ORG_OU_LIST_REQUEST, getOrgOUs);
178
+ }
38
179
 
39
180
  export default [
40
181
  watchFetchMarketingObjective,
182
+ watchUploadFbADAsset,
183
+ watchEditTemplate,
184
+ watchGetTemplateDetails,
185
+ watchCreateTemplate,
186
+ watchGetOrgOUs,
41
187
  ];
188
+
@@ -5,6 +5,11 @@ import { createSelector } from 'reselect';
5
5
  */
6
6
  const selectFacebookDomain = () => (state) => state.get('facebook');
7
7
 
8
+ const selectTemplateDomain = () => (state) => state.get('templates');
9
+ export const makeSelectTemplate = () => createSelector(
10
+ selectTemplateDomain(),
11
+ (substate) => substate && substate.toJS()
12
+ );
8
13
  /**
9
14
  * Other specific selectors
10
15
  */
@@ -18,3 +23,8 @@ export const makeSelectMarketingObjectiveList = () => createSelector(
18
23
  selectFacebookDomain(),
19
24
  (substate) => substate && substate.get('marketinObjectivesData'),
20
25
  );
26
+
27
+ export const makeSelectFbAd = () => createSelector(
28
+ selectFacebookDomain(),
29
+ (substate) => substate && substate.toJS()
30
+ );
@@ -7,7 +7,7 @@
7
7
  import * as types from './constants';
8
8
 
9
9
  export function changeLocale(languageLocale) {
10
- console.log('trying to change locale', languageLocale);
10
+
11
11
  return {
12
12
  type: types.CHANGE_LOCALE,
13
13
  locale: languageLocale,