@capillarytech/creatives-library 8.0.76 → 8.0.77
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/package.json
CHANGED
package/services/api.js
CHANGED
|
@@ -2,12 +2,13 @@
|
|
|
2
2
|
* Created by vivek on 3/5/17.
|
|
3
3
|
*/
|
|
4
4
|
import 'whatwg-fetch';
|
|
5
|
+
import { GA, decompressJsonObject } from '@capillarytech/cap-ui-utils';
|
|
6
|
+
import { get } from 'lodash';
|
|
5
7
|
import { loadItem, clearItem } from './localStorageApi';
|
|
6
8
|
import config from '../config/app';
|
|
7
9
|
import pathConfig from '../config/path';
|
|
8
10
|
import getSchema from './getSchema';
|
|
9
11
|
import * as API from '../utils/ApiCaller';
|
|
10
|
-
import { GA, decompressJsonObject } from '@capillarytech/cap-ui-utils';
|
|
11
12
|
import { addBaseToTemplate } from '../utils/commonUtils';
|
|
12
13
|
import { EMAIL, SMS } from '../v2Containers/CreativesContainer/constants';
|
|
13
14
|
let API_ENDPOINT = config.development.api_endpoint;
|
|
@@ -300,15 +301,17 @@ export const getAllAssets = ({assetType, queryParams = {}}) => {
|
|
|
300
301
|
});
|
|
301
302
|
// const url = `https://nightly.capillary.in/arya/api/v1/creatives/assets/${assetType}?query=${JSON.stringify(queryParams)}`;
|
|
302
303
|
return request(url, getAPICallObject('GET'));
|
|
303
|
-
}
|
|
304
|
-
|
|
304
|
+
};
|
|
305
|
+
|
|
305
306
|
export const deleteAssetById = ({assetId, assetType}) => {
|
|
306
307
|
const url = `${API_ENDPOINT}/assets/${assetId}/${assetType}`;
|
|
307
308
|
return request(url, getAPICallObject('DELETE'));
|
|
308
309
|
// return API.deleteResource(url);
|
|
309
310
|
};
|
|
310
311
|
|
|
311
|
-
export const uploadFile = ({
|
|
312
|
+
export const uploadFile = ({
|
|
313
|
+
file, assetType, fileParams, mode, wechatParams, whatsappParams,
|
|
314
|
+
}) => {
|
|
312
315
|
const data = new FormData();
|
|
313
316
|
let fileName = '';
|
|
314
317
|
try {
|
|
@@ -403,14 +406,20 @@ export const getCmsData = (cmsType, projectId, langId) => {
|
|
|
403
406
|
return API.get(url);
|
|
404
407
|
};
|
|
405
408
|
|
|
406
|
-
export const getEdmTemplates = () => {
|
|
409
|
+
export const getEdmTemplates = async () => {
|
|
407
410
|
const url = `${API_ENDPOINT}/templates/email/default`;
|
|
408
|
-
|
|
411
|
+
const compressedEdmTemplates = await request(url, getAPICallObject('GET'));
|
|
412
|
+
const response = get(compressedEdmTemplates, 'response', '');
|
|
413
|
+
const decompressedEdmTemplates = decompressJsonObject(response);
|
|
414
|
+
return { ...compressedEdmTemplates, response: addBaseToTemplate(decompressedEdmTemplates) };
|
|
409
415
|
};
|
|
410
416
|
|
|
411
|
-
export const getDefaultBeeTemplates = () => {
|
|
417
|
+
export const getDefaultBeeTemplates = async () => {
|
|
412
418
|
const url = `${API_ENDPOINT}/templates/v2/email/default`;
|
|
413
|
-
|
|
419
|
+
const compressedDefaultBeeTemplates = await request(url, getAPICallObject('GET'));
|
|
420
|
+
const response = get(compressedDefaultBeeTemplates, 'response', '');
|
|
421
|
+
const decompressedBeeTemplates = decompressJsonObject(response);
|
|
422
|
+
return { ...compressedDefaultBeeTemplates, response: addBaseToTemplate(decompressedBeeTemplates) };
|
|
414
423
|
};
|
|
415
424
|
|
|
416
425
|
// All about line
|
|
@@ -12,17 +12,22 @@ import {
|
|
|
12
12
|
askAiraForLiquid,
|
|
13
13
|
getLiquidTags,
|
|
14
14
|
fetchSchemaForEntity,
|
|
15
|
+
getDefaultBeeTemplates,
|
|
16
|
+
getEdmTemplates,
|
|
15
17
|
} from '../api';
|
|
16
18
|
import { mockData } from './mockData';
|
|
17
19
|
import getSchema from '../getSchema';
|
|
18
20
|
const sampleFile = require('../../assets/line.png');
|
|
19
21
|
|
|
20
22
|
let mockDecompressJsonObject;
|
|
23
|
+
let mockAddBaseToTemplate;
|
|
21
24
|
jest.mock('@capillarytech/cap-ui-utils', () => {
|
|
22
25
|
mockDecompressJsonObject = jest.fn();
|
|
26
|
+
mockAddBaseToTemplate = jest.fn();
|
|
23
27
|
return {
|
|
24
28
|
...jest.requireActual('@capillarytech/cap-ui-utils'),
|
|
25
29
|
decompressJsonObject: mockDecompressJsonObject,
|
|
30
|
+
addBaseToTemplate: mockAddBaseToTemplate,
|
|
26
31
|
};
|
|
27
32
|
});
|
|
28
33
|
|
|
@@ -136,7 +141,7 @@ describe('getAllTemplates -- Test with valid responses', () => {
|
|
|
136
141
|
global.fetch.mockReturnValue(Promise.resolve({json: () => Promise.resolve(),}));
|
|
137
142
|
mockDecompressJsonObject.mockReturnValue();
|
|
138
143
|
expect(await getAllTemplates({channel: 'email'})).toEqual({
|
|
139
|
-
|
|
144
|
+
response: undefined,
|
|
140
145
|
});
|
|
141
146
|
});
|
|
142
147
|
|
|
@@ -493,3 +498,114 @@ describe('fetchSchemaForEntity', () => {
|
|
|
493
498
|
expect(console.error).toHaveBeenCalledWith(mockError);
|
|
494
499
|
});
|
|
495
500
|
});
|
|
501
|
+
|
|
502
|
+
describe('Email Template APIs', () => {
|
|
503
|
+
beforeEach(() => {
|
|
504
|
+
global.fetch = jest.fn();
|
|
505
|
+
});
|
|
506
|
+
|
|
507
|
+
afterEach(() => {
|
|
508
|
+
jest.restoreAllMocks();
|
|
509
|
+
});
|
|
510
|
+
|
|
511
|
+
const sharedTests = (apiFunction, functionName) => {
|
|
512
|
+
it('should handle successful response', async () => {
|
|
513
|
+
const mockResponse = { response: 'compressed-data' };
|
|
514
|
+
const mockDecompressed = { template: 'decompressed-data' };
|
|
515
|
+
const mockWithBase = { template: 'data-with-base' };
|
|
516
|
+
|
|
517
|
+
global.fetch.mockReturnValue(Promise.resolve({
|
|
518
|
+
status: 200,
|
|
519
|
+
json: () => Promise.resolve(mockResponse),
|
|
520
|
+
}));
|
|
521
|
+
mockDecompressJsonObject.mockReturnValue(mockDecompressed);
|
|
522
|
+
mockAddBaseToTemplate.mockReturnValue(mockWithBase);
|
|
523
|
+
|
|
524
|
+
const result = await apiFunction();
|
|
525
|
+
expect(result).toEqual({
|
|
526
|
+
...mockResponse,
|
|
527
|
+
response: mockDecompressed,
|
|
528
|
+
});
|
|
529
|
+
});
|
|
530
|
+
|
|
531
|
+
it('should handle response property as empty object', async () => {
|
|
532
|
+
const mockResponse = { response: {} };
|
|
533
|
+
|
|
534
|
+
global.fetch.mockReturnValue(Promise.resolve({
|
|
535
|
+
status: 200,
|
|
536
|
+
json: () => Promise.resolve(mockResponse),
|
|
537
|
+
}));
|
|
538
|
+
mockDecompressJsonObject.mockReturnValue({});
|
|
539
|
+
mockAddBaseToTemplate.mockReturnValue({});
|
|
540
|
+
|
|
541
|
+
const result = await apiFunction();
|
|
542
|
+
expect(result).toEqual({
|
|
543
|
+
...mockResponse,
|
|
544
|
+
response: {},
|
|
545
|
+
});
|
|
546
|
+
});
|
|
547
|
+
|
|
548
|
+
it('should handle missing response property', async () => {
|
|
549
|
+
const mockResponse = {};
|
|
550
|
+
|
|
551
|
+
global.fetch.mockReturnValue(Promise.resolve({
|
|
552
|
+
status: 200,
|
|
553
|
+
json: () => Promise.resolve(mockResponse),
|
|
554
|
+
}));
|
|
555
|
+
mockDecompressJsonObject.mockReturnValue('');
|
|
556
|
+
mockAddBaseToTemplate.mockReturnValue('');
|
|
557
|
+
|
|
558
|
+
const result = await apiFunction();
|
|
559
|
+
expect(result).toEqual({
|
|
560
|
+
response: '',
|
|
561
|
+
});
|
|
562
|
+
});
|
|
563
|
+
|
|
564
|
+
it('should handle null response', async () => {
|
|
565
|
+
global.fetch.mockReturnValue(Promise.resolve({
|
|
566
|
+
json: () => Promise.resolve(null),
|
|
567
|
+
}));
|
|
568
|
+
mockDecompressJsonObject.mockReturnValue('');
|
|
569
|
+
mockAddBaseToTemplate.mockReturnValue('');
|
|
570
|
+
|
|
571
|
+
const result = await apiFunction();
|
|
572
|
+
expect(result).toEqual({
|
|
573
|
+
response: '',
|
|
574
|
+
});
|
|
575
|
+
});
|
|
576
|
+
|
|
577
|
+
it('should handle undefined response', async () => {
|
|
578
|
+
global.fetch.mockReturnValue(Promise.resolve({
|
|
579
|
+
json: () => Promise.resolve(undefined),
|
|
580
|
+
}));
|
|
581
|
+
mockDecompressJsonObject.mockReturnValue('');
|
|
582
|
+
mockAddBaseToTemplate.mockReturnValue('');
|
|
583
|
+
|
|
584
|
+
const result = await apiFunction();
|
|
585
|
+
expect(result).toEqual({
|
|
586
|
+
response: '',
|
|
587
|
+
});
|
|
588
|
+
});
|
|
589
|
+
|
|
590
|
+
it('should handle fetch failure', async () => {
|
|
591
|
+
global.fetch.mockRejectedValue(new Error('Network error'));
|
|
592
|
+
mockDecompressJsonObject.mockReturnValue(undefined);
|
|
593
|
+
mockAddBaseToTemplate.mockReturnValue(undefined);
|
|
594
|
+
console.error = jest.fn();
|
|
595
|
+
|
|
596
|
+
const result = await apiFunction();
|
|
597
|
+
|
|
598
|
+
expect(result).toEqual({
|
|
599
|
+
response: undefined,
|
|
600
|
+
});
|
|
601
|
+
});
|
|
602
|
+
};
|
|
603
|
+
|
|
604
|
+
describe('getEdmTemplates', () => {
|
|
605
|
+
sharedTests(getEdmTemplates, 'getEdmTemplates');
|
|
606
|
+
});
|
|
607
|
+
|
|
608
|
+
describe('getDefaultBeeTemplates', () => {
|
|
609
|
+
sharedTests(getDefaultBeeTemplates, 'getDefaultBeeTemplates');
|
|
610
|
+
});
|
|
611
|
+
});
|
package/utils/tagValidations.js
CHANGED
|
@@ -315,7 +315,7 @@ export const getTagMapValue = (object = {}) => {
|
|
|
315
315
|
return Object.values(
|
|
316
316
|
object
|
|
317
317
|
).reduce((acc, current) => {
|
|
318
|
-
return { ...acc, ...current?.subtags ?? {} };
|
|
318
|
+
return { ...acc?.subtags ?? {}, ...current?.subtags ?? {} };
|
|
319
319
|
}, {});
|
|
320
320
|
};
|
|
321
321
|
|
|
@@ -498,27 +498,6 @@ describe("getTagMapValue", () => {
|
|
|
498
498
|
name: "233",
|
|
499
499
|
},
|
|
500
500
|
},
|
|
501
|
-
"key 2": {
|
|
502
|
-
name: "24",
|
|
503
|
-
subtags: {
|
|
504
|
-
tagName: "234",
|
|
505
|
-
},
|
|
506
|
-
},
|
|
507
|
-
};
|
|
508
|
-
const result = getTagMapValue(object);
|
|
509
|
-
expect(result).toEqual({ name: "233", tagName: "234", });
|
|
510
|
-
});
|
|
511
|
-
it("should return the tag map value when an object is provided but subtag is not present in one of the obj", () => {
|
|
512
|
-
const object = {
|
|
513
|
-
"key 1": {
|
|
514
|
-
name: "23",
|
|
515
|
-
subtags: {
|
|
516
|
-
name: "233",
|
|
517
|
-
},
|
|
518
|
-
},
|
|
519
|
-
"key 2": {
|
|
520
|
-
name: "24",
|
|
521
|
-
},
|
|
522
501
|
};
|
|
523
502
|
const result = getTagMapValue(object);
|
|
524
503
|
expect(result).toEqual({ name: "233" });
|
|
@@ -199,9 +199,9 @@ export class Email extends React.Component { // eslint-disable-line react/prefer
|
|
|
199
199
|
this.setState({isDragDrop: true});
|
|
200
200
|
}
|
|
201
201
|
if (this.props.params.id) {
|
|
202
|
-
this.props.actions.getCmsSetting(BEE_PLUGIN, this.props.Templates.BEETemplate._id, 'open', undefined, isBEESupport, isBEEAppEnable);
|
|
202
|
+
this.props.actions.getCmsSetting(BEE_PLUGIN, _.get(this.props.Templates.BEETemplate, 'versions.base.drag_drop_id', this.props.Templates.BEETemplate?._id), 'open', undefined, isBEESupport, isBEEAppEnable);
|
|
203
203
|
} else if (this.props.location.query.module !== "library" || (this.props.location.query.module === "library" && !this.props.templateData)) {
|
|
204
|
-
this.props.actions.getCmsSetting(BEE_PLUGIN, this.props.Templates.BEETemplate._id, 'create', undefined, isBEESupport, isBEEAppEnable);
|
|
204
|
+
this.props.actions.getCmsSetting(BEE_PLUGIN, _.get(this.props.Templates.BEETemplate, 'versions.base.drag_drop_id', this.props.Templates.BEETemplate?._id), 'create', undefined, isBEESupport, isBEEAppEnable);
|
|
205
205
|
}
|
|
206
206
|
}
|
|
207
207
|
this.setState({ content: (this.props.Templates.selectedEmailLayout ? this.props.Templates.selectedEmailLayout : ''), formData});
|