@capillarytech/creatives-library 7.6.1 → 7.6.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/config/app.js +2 -0
- package/index.js +6 -0
- package/package.json +1 -1
- package/reducers.js +2 -1
- package/routes.js +5 -0
- package/services/api.js +30 -1
- package/utils/common.js +13 -1
- package/v2Components/CapVideoUpload/index.js +14 -6
- package/v2Components/TemplatePreview/index.js +23 -2
- package/v2Containers/App/constants.js +21 -0
- package/v2Containers/Cap/messages.js +30 -0
- package/v2Containers/CapFacebookPreview/actions.js +3 -15
- package/v2Containers/CapFacebookPreview/constants.js +3 -11
- package/v2Containers/CapFacebookPreview/index.js +6 -6
- package/v2Containers/CapFacebookPreview/reducer.js +3 -9
- package/v2Containers/CapFacebookPreview/sagas.js +6 -65
- package/v2Containers/CreativesContainer/SlideBoxContent.js +64 -1
- package/v2Containers/CreativesContainer/index.js +19 -8
- package/v2Containers/Facebook/Advertisement/index.js +38 -15
- package/v2Containers/Facebook/Advertisement/index.scss +9 -0
- package/v2Containers/Facebook/Advertisement/messages.js +2 -2
- package/v2Containers/Facebook/actions.js +63 -0
- package/v2Containers/Facebook/constants.js +25 -1
- package/v2Containers/Facebook/index.js +135 -107
- package/v2Containers/Facebook/reducer.js +98 -1
- package/v2Containers/Facebook/sagas.js +147 -0
- package/v2Containers/Facebook/selectors.js +10 -0
- package/v2Containers/Line/Container/Video/index.js +38 -41
- package/v2Containers/Templates/_templates.scss +26 -0
- package/v2Containers/Templates/actions.js +14 -1
- package/v2Containers/Templates/constants.js +8 -0
- package/v2Containers/Templates/index.js +138 -10
- package/v2Containers/Templates/messages.js +8 -4
- package/v2Containers/Templates/reducer.js +22 -0
- package/v2Containers/Templates/sagas.js +26 -1
- package/v2Containers/TemplatesV2/index.js +13 -13
- package/v2Containers/Viber/index.js +2 -1
|
@@ -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
|
-
|
|
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
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
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
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
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
|
-
|
|
237
|
-
|
|
247
|
+
</CapLabel>
|
|
248
|
+
</div>
|
|
238
249
|
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
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
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
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
|
-
|
|
258
|
-
|
|
268
|
+
<FormattedMessage {...messages.fbChange} />
|
|
269
|
+
</CapButton>
|
|
259
270
|
)}
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
271
|
+
</CapHeading>
|
|
272
|
+
</CapRow>
|
|
273
|
+
</StyledCampaignDetailCapColumn>
|
|
263
274
|
))}
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
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
|
-
|
|
276
|
-
|
|
277
|
-
|
|
286
|
+
visible={isDrawerVisible}
|
|
287
|
+
width={380}
|
|
288
|
+
onClose={() => setDrawerVisibility(false)}
|
|
278
289
|
/>
|
|
279
|
-
|
|
290
|
+
</div>
|
|
280
291
|
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
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
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
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
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
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
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
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
|
-
|
|
331
|
-
|
|
332
|
-
|
|
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
|
|
357
|
+
className: PropTypes.string,
|
|
338
358
|
templateData: PropTypes.object,
|
|
339
359
|
cap: PropTypes.object,
|
|
340
360
|
messageDetails: PropTypes.object,
|
|
341
|
-
|
|
361
|
+
params: PropTypes.object,
|
|
362
|
+
onFacebookSubmit: PropTypes.func,
|
|
342
363
|
marketingObjectiveList: PropTypes.arrayOf(PropTypes.string),
|
|
343
|
-
facebookActions: PropTypes.func
|
|
344
|
-
intl: intlShape
|
|
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
|
+
);
|