@capillarytech/creatives-library 7.17.23 → 7.17.25
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/containers/App/constants.js +4 -0
- package/package.json +1 -1
- package/utils/common.js +13 -9
- package/v2Components/CapTagList/index.js +2 -2
- package/v2Containers/App/constants.js +1 -1
- package/v2Containers/TemplatesV2/index.js +3 -3
- package/v2Containers/TemplatesV2/tests/mockData.js +2 -2
- package/v2Containers/ChannelTemplates/actions.js +0 -20
- package/v2Containers/ChannelTemplates/constants.js +0 -8
- package/v2Containers/ChannelTemplates/index.js +0 -47
- package/v2Containers/ChannelTemplates/messages.js +0 -13
- package/v2Containers/ChannelTemplates/reducer.js +0 -34
- package/v2Containers/ChannelTemplates/sagas.js +0 -32
- package/v2Containers/ChannelTemplates/selectors.js +0 -25
- package/v2Containers/Sms/Create/tests/sagas.test.js +0 -82
|
@@ -6,6 +6,10 @@ export const STORE2DOOR_PLUS_ENABLED = 'STORE2DOOR_PLUS_ENABLED';
|
|
|
6
6
|
export const TRAI_DLT = 'TRAI_DLT';
|
|
7
7
|
export const CARD_BASED_SCOPE = 'CARD_BASED_SCOPE';
|
|
8
8
|
export const HOSPITALITY_BASED_SCOPE = 'HOSPITALITY_BASED_SCOPE';
|
|
9
|
+
export const REGISTRATION_CUSTOM_FIELD = 'Registration custom fields';
|
|
10
|
+
export const CUSTOM_TAG = 'CustomTagMessage';
|
|
11
|
+
export const CUSTOMER_EXTENDED_FIELD = 'Customer extended fields';
|
|
12
|
+
export const EXTENDED_TAG = 'ExtendedTagMessage';
|
|
9
13
|
|
|
10
14
|
export const CARD_RELATED_TAGS = [
|
|
11
15
|
'card_series',
|
package/package.json
CHANGED
package/utils/common.js
CHANGED
|
@@ -7,6 +7,10 @@ import {
|
|
|
7
7
|
CARD_BASED_SCOPE,
|
|
8
8
|
HOSPITALITY_RELATED_TAGS,
|
|
9
9
|
HOSPITALITY_BASED_SCOPE,
|
|
10
|
+
EXTENDED_TAG,
|
|
11
|
+
CUSTOMER_EXTENDED_FIELD,
|
|
12
|
+
CUSTOM_TAG,
|
|
13
|
+
REGISTRATION_CUSTOM_FIELD
|
|
10
14
|
} from '../containers/App/constants';
|
|
11
15
|
import { apiMessageFormatHandler } from './commonUtils';
|
|
12
16
|
|
|
@@ -283,16 +287,16 @@ export const intlKeyGenerator = (value = "") => {
|
|
|
283
287
|
};
|
|
284
288
|
|
|
285
289
|
export const handleInjectedData = (data, scope) => {
|
|
286
|
-
|
|
290
|
+
const temp = _.cloneDeep(data);
|
|
287
291
|
let tagType;
|
|
288
292
|
for (const tagKey in temp) {
|
|
289
293
|
if (temp.hasOwnProperty(tagKey)) {
|
|
290
294
|
const tag = temp[tagKey];
|
|
291
295
|
|
|
292
|
-
if (tag?.name ===
|
|
293
|
-
tagType =
|
|
294
|
-
} else if (tag?.name ===
|
|
295
|
-
tagType =
|
|
296
|
+
if (tag?.name === REGISTRATION_CUSTOM_FIELD) {
|
|
297
|
+
tagType = CUSTOM_TAG;
|
|
298
|
+
} else if (tag?.name === CUSTOMER_EXTENDED_FIELD) {
|
|
299
|
+
tagType = EXTENDED_TAG;
|
|
296
300
|
}
|
|
297
301
|
|
|
298
302
|
if (tag?.name) {
|
|
@@ -305,8 +309,8 @@ export const handleInjectedData = (data, scope) => {
|
|
|
305
309
|
tag["name"] = apiMessageFormatHandler(id, name);
|
|
306
310
|
}
|
|
307
311
|
|
|
308
|
-
if (tag
|
|
309
|
-
for (const subtagKey in tag
|
|
312
|
+
if (tag?.subtags) {
|
|
313
|
+
for (const subtagKey in tag.subtags) {
|
|
310
314
|
if (tag["subtags"].hasOwnProperty(subtagKey)) {
|
|
311
315
|
const subtag = tag["subtags"][subtagKey];
|
|
312
316
|
if (subtag?.name) {
|
|
@@ -330,8 +334,8 @@ export const handleInjectedData = (data, scope) => {
|
|
|
330
334
|
}
|
|
331
335
|
}
|
|
332
336
|
}
|
|
333
|
-
tagType="";
|
|
337
|
+
tagType = "";
|
|
334
338
|
}
|
|
335
339
|
}
|
|
336
340
|
return temp;
|
|
337
|
-
};
|
|
341
|
+
};
|
|
@@ -25,7 +25,7 @@ import {
|
|
|
25
25
|
JAPANESE_HELP_TEXT,
|
|
26
26
|
TAG_TRANSLATION_DOC,
|
|
27
27
|
} from "../../containers/TagList/constants";
|
|
28
|
-
import {
|
|
28
|
+
import { HIDE_FOR_JP_LOCALE } from '../../v2Containers/App/constants';
|
|
29
29
|
import { hidingDateTagsForJpLocale } from '../../v2Containers/TagList/utils';
|
|
30
30
|
|
|
31
31
|
|
|
@@ -175,7 +175,7 @@ class CapTagList extends React.Component { // eslint-disable-line react/prefer-s
|
|
|
175
175
|
renderTags(tags, searchString = '') {
|
|
176
176
|
const { disableRelatedTags, childTagsToDisable, parentTagstoDisable, showCardsRelatedTags } = this?.props?.disableTagsDetails;
|
|
177
177
|
const { accessibleFeatures = [] } = this?.props?.currentOrgDetails || {};
|
|
178
|
-
const hideDateTagsForJpLocale = accessibleFeatures.includes(
|
|
178
|
+
const hideDateTagsForJpLocale = accessibleFeatures.includes(HIDE_FOR_JP_LOCALE);
|
|
179
179
|
const list = [];
|
|
180
180
|
const loyaltyAttrDisableText = <FormattedMessage {...messages.loyaltyAttributeDisable} />;
|
|
181
181
|
let clonedTags = _.cloneDeep(tags);
|
|
@@ -54,7 +54,7 @@ export const LINE = 'line';
|
|
|
54
54
|
export const EMAIL = 'email';
|
|
55
55
|
export const ASSETS = 'assets';
|
|
56
56
|
|
|
57
|
-
export const
|
|
57
|
+
export const HIDE_FOR_JP_LOCALE = 'HIDE_FOR_JP_LOCALE';
|
|
58
58
|
|
|
59
59
|
export const TRACK_EDIT_SMS = 'editSms';
|
|
60
60
|
export const TRACK_EDIT_EMAIL = 'editEmail';
|
|
@@ -29,7 +29,7 @@ import FTP from '../FTP';
|
|
|
29
29
|
import Gallery from '../Assets/Gallery';
|
|
30
30
|
import withStyles from '../../hoc/withStyles';
|
|
31
31
|
import styles, { CapTabStyle } from './TemplatesV2.style';
|
|
32
|
-
import { CREATIVES_UI_VIEW, LOYALTY, WHATSAPP, RCS, LINE, EMAIL, ASSETS,
|
|
32
|
+
import { CREATIVES_UI_VIEW, LOYALTY, WHATSAPP, RCS, LINE, EMAIL, ASSETS, HIDE_FOR_JP_LOCALE } from '../App/constants';
|
|
33
33
|
import AccessForbidden from '../../v2Components/AccessForbidden';
|
|
34
34
|
import { getObjFromQueryParams } from '../../utils/v2common';
|
|
35
35
|
import { selectCurrentOrgDetails } from "../../v2Containers/Cap/selectors";
|
|
@@ -119,8 +119,8 @@ export class TemplatesV2 extends React.Component { // eslint-disable-line react/
|
|
|
119
119
|
const { accessibleFeatures = [] } = currentOrgDetails || {};
|
|
120
120
|
// This data will be available when it will be accessed in library mode
|
|
121
121
|
const { currentOrgDetails: { accessibleFeatures: libModeAccessibleFeatures = [] } = {} } = cap || {};
|
|
122
|
-
const hideEngagementChannel = accessibleFeatures.includes(
|
|
123
|
-
// Show only line and email channel content with both channel tabs if the
|
|
122
|
+
const hideEngagementChannel = accessibleFeatures.includes(HIDE_FOR_JP_LOCALE) || libModeAccessibleFeatures.includes(HIDE_FOR_JP_LOCALE);
|
|
123
|
+
// Show only line and email channel content with both channel tabs if the HIDE_FOR_JP_LOCALE feature is enabled;
|
|
124
124
|
filteredPanes = hideEngagementChannel ? filteredPanes?.filter((pane) => [EMAIL, LINE, ASSETS].includes(pane?.key) && pane) : filteredPanes;
|
|
125
125
|
defaultChannel = hideEngagementChannel ? EMAIL : defaultChannel;
|
|
126
126
|
|
|
@@ -599,7 +599,7 @@ export const authData = {
|
|
|
599
599
|
"ENABLE_PRODUCT_SUPPORT_VIDEOS",
|
|
600
600
|
"ENABLE_RANDOM_COUPON_CODE",
|
|
601
601
|
"HIDE_DEFAULT_EMAIL_TEMPLATES",
|
|
602
|
-
"
|
|
602
|
+
"HIDE_FOR_JP_LOCALE",
|
|
603
603
|
],
|
|
604
604
|
org_loyalty_v2_status: true,
|
|
605
605
|
module_details: [
|
|
@@ -680,6 +680,6 @@ export const currentOrgDetails = {
|
|
|
680
680
|
"JOURNEY_UI",
|
|
681
681
|
"LOYALTY_PROMOTION_ENABLED",
|
|
682
682
|
"HIDE_DEFAULT_EMAIL_TEMPLATES",
|
|
683
|
-
"
|
|
683
|
+
"HIDE_FOR_JP_LOCALE",
|
|
684
684
|
],
|
|
685
685
|
};
|
|
@@ -1,20 +0,0 @@
|
|
|
1
|
-
/*
|
|
2
|
-
*
|
|
3
|
-
* ChannelTemplates actions
|
|
4
|
-
*
|
|
5
|
-
*/
|
|
6
|
-
|
|
7
|
-
import * as types from './constants';
|
|
8
|
-
|
|
9
|
-
export function defaultAction() {
|
|
10
|
-
return {
|
|
11
|
-
type: types.DEFAULT_ACTION,
|
|
12
|
-
};
|
|
13
|
-
}
|
|
14
|
-
|
|
15
|
-
export function getTemplates(channel) {
|
|
16
|
-
return {
|
|
17
|
-
type: types.GET_TEMPLATES_REQUEST,
|
|
18
|
-
channel,
|
|
19
|
-
};
|
|
20
|
-
}
|
|
@@ -1,47 +0,0 @@
|
|
|
1
|
-
/*
|
|
2
|
-
*
|
|
3
|
-
* ChannelTemplates
|
|
4
|
-
*
|
|
5
|
-
*/
|
|
6
|
-
|
|
7
|
-
import PropTypes from 'prop-types';
|
|
8
|
-
|
|
9
|
-
import React from 'react';
|
|
10
|
-
import { connect } from 'react-redux';
|
|
11
|
-
import { FormattedMessage } from 'react-intl';
|
|
12
|
-
import { bindActionCreators } from 'redux';
|
|
13
|
-
import { createStructuredSelector } from 'reselect';
|
|
14
|
-
import makeSelectChannelTemplates from './selectors';
|
|
15
|
-
import * as actions from './actions';
|
|
16
|
-
import messages from './messages';
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
export class ChannelTemplates extends React.Component { // eslint-disable-line react/prefer-stateless-function
|
|
20
|
-
componentDidMount() {
|
|
21
|
-
this.props.actions.getTemplates(this.props.channel);
|
|
22
|
-
}
|
|
23
|
-
render() {
|
|
24
|
-
return (
|
|
25
|
-
<CardGrid
|
|
26
|
-
cardDataList={[]}
|
|
27
|
-
/>
|
|
28
|
-
);
|
|
29
|
-
}
|
|
30
|
-
}
|
|
31
|
-
|
|
32
|
-
ChannelTemplates.propTypes = {
|
|
33
|
-
actions: PropTypes.object.isRequired,
|
|
34
|
-
channel: PropTypes.string,
|
|
35
|
-
};
|
|
36
|
-
|
|
37
|
-
const mapStateToProps = createStructuredSelector({
|
|
38
|
-
ChannelTemplates: makeSelectChannelTemplates(),
|
|
39
|
-
});
|
|
40
|
-
|
|
41
|
-
function mapDispatchToProps(dispatch) {
|
|
42
|
-
return {
|
|
43
|
-
actions: bindActionCreators(actions, dispatch),
|
|
44
|
-
};
|
|
45
|
-
}
|
|
46
|
-
|
|
47
|
-
export default connect(mapStateToProps, mapDispatchToProps)(ChannelTemplates);
|
|
@@ -1,13 +0,0 @@
|
|
|
1
|
-
/*
|
|
2
|
-
* ChannelTemplates Messages
|
|
3
|
-
*
|
|
4
|
-
* This contains all the text for the ChannelTemplates component.
|
|
5
|
-
*/
|
|
6
|
-
import { defineMessages } from 'react-intl';
|
|
7
|
-
|
|
8
|
-
export default defineMessages({
|
|
9
|
-
header: {
|
|
10
|
-
id: 'creatives.containersV2.ChannelTemplates.header',
|
|
11
|
-
defaultMessage: 'This is ChannelTemplates container !',
|
|
12
|
-
},
|
|
13
|
-
});
|
|
@@ -1,34 +0,0 @@
|
|
|
1
|
-
/*
|
|
2
|
-
*
|
|
3
|
-
* ChannelTemplates reducer
|
|
4
|
-
*
|
|
5
|
-
*/
|
|
6
|
-
|
|
7
|
-
import { fromJS } from 'immutable';
|
|
8
|
-
import * as types from './constants';
|
|
9
|
-
|
|
10
|
-
const initialState = fromJS({
|
|
11
|
-
loadingTemplates: true,
|
|
12
|
-
smsTemplates: [],
|
|
13
|
-
emailTemplates: [],
|
|
14
|
-
wechatTemplates: [],
|
|
15
|
-
mobilepushTemplates: [],
|
|
16
|
-
});
|
|
17
|
-
|
|
18
|
-
function channelTemplatesReducer(state = initialState, action) {
|
|
19
|
-
const channelTemplates = `${action.channel}Templates`;
|
|
20
|
-
switch (action.type) {
|
|
21
|
-
case types.DEFAULT_ACTION:
|
|
22
|
-
return state;
|
|
23
|
-
case types.GET_TEMPLATES_REQUEST:
|
|
24
|
-
return state.set('loadingTemplates', true);
|
|
25
|
-
case types.GET_TEMPLATES_SUCESS:
|
|
26
|
-
return state.set('loadingTemplates', false).set(channelTemplates, action.templates);
|
|
27
|
-
case types.GET_TEMPLATES_FAILURE:
|
|
28
|
-
return state.set('loadingTemplates', false).set('error', action.error);
|
|
29
|
-
default:
|
|
30
|
-
return state;
|
|
31
|
-
}
|
|
32
|
-
}
|
|
33
|
-
|
|
34
|
-
export default channelTemplatesReducer;
|
|
@@ -1,32 +0,0 @@
|
|
|
1
|
-
import { take, takeLatest, call, put, cancel } from 'redux-saga/effects';
|
|
2
|
-
import { LOCATION_CHANGE } from 'react-router-redux';
|
|
3
|
-
import * as Api from '../../services/api';
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
import * as types from './constants';
|
|
7
|
-
// Individual exports for testing
|
|
8
|
-
export function* defaultSaga() {
|
|
9
|
-
// See example in v2Containers/HomePage/sagas.js
|
|
10
|
-
}
|
|
11
|
-
function* getTemplates(action) {
|
|
12
|
-
try {
|
|
13
|
-
const req = {
|
|
14
|
-
channel: action.channel,
|
|
15
|
-
queryParams: action.query,
|
|
16
|
-
};
|
|
17
|
-
const res = call(Api.getAllTemplates, req);
|
|
18
|
-
put({type: types.GET_TEMPLATES_SUCESS, templates: res.response, channel: action.channel});
|
|
19
|
-
} catch (error) {
|
|
20
|
-
put({type: types.GET_TEMPLATES_FAILURE, error});
|
|
21
|
-
}
|
|
22
|
-
}
|
|
23
|
-
function* getTemplatesWatcher() {
|
|
24
|
-
const watcher = yield takeLatest(types.GET_TEMPLATES_REQUEST, getTemplates);
|
|
25
|
-
yield take(LOCATION_CHANGE);
|
|
26
|
-
yield cancel(watcher);
|
|
27
|
-
}
|
|
28
|
-
// All sagas to be loaded
|
|
29
|
-
export default [
|
|
30
|
-
defaultSaga,
|
|
31
|
-
getTemplatesWatcher,
|
|
32
|
-
];
|
|
@@ -1,25 +0,0 @@
|
|
|
1
|
-
import { createSelector } from 'reselect';
|
|
2
|
-
|
|
3
|
-
/**
|
|
4
|
-
* Direct selector to the channelTemplates state domain
|
|
5
|
-
*/
|
|
6
|
-
const selectChannelTemplatesDomain = () => (state) => state.get('templates');
|
|
7
|
-
|
|
8
|
-
/**
|
|
9
|
-
* Other specific selectors
|
|
10
|
-
*/
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
/**
|
|
14
|
-
* Default selector used by ChannelTemplates
|
|
15
|
-
*/
|
|
16
|
-
|
|
17
|
-
const makeSelectChannelTemplates = () => createSelector(
|
|
18
|
-
selectChannelTemplatesDomain(),
|
|
19
|
-
(substate) => substate.toJS()
|
|
20
|
-
);
|
|
21
|
-
|
|
22
|
-
export default makeSelectChannelTemplates;
|
|
23
|
-
export {
|
|
24
|
-
selectChannelTemplatesDomain,
|
|
25
|
-
};
|
|
@@ -1,82 +0,0 @@
|
|
|
1
|
-
import { expectSaga } from "redux-saga-test-plan";
|
|
2
|
-
import { take, cancel, takeLatest } from "redux-saga/effects";
|
|
3
|
-
import * as matchers from "redux-saga-test-plan/matchers";
|
|
4
|
-
import { LOCATION_CHANGE } from "react-router-redux";
|
|
5
|
-
import { throwError } from "redux-saga-test-plan/providers";
|
|
6
|
-
import { createMockTask } from "redux-saga/utils";
|
|
7
|
-
import * as types from "../constants";
|
|
8
|
-
import { watchAiSuggestions, getAiSuggestions } from "../sagas";
|
|
9
|
-
import * as Api from "../../../../services/api";
|
|
10
|
-
|
|
11
|
-
describe("getAiSuggestions saga", () => {
|
|
12
|
-
it("Should handle valid response from api", () => {
|
|
13
|
-
const successCallback = () => {};
|
|
14
|
-
const failureCallback = () => {};
|
|
15
|
-
const action = {
|
|
16
|
-
type: types.GET_AI_SUGGESTIONS,
|
|
17
|
-
prompt: {},
|
|
18
|
-
successCallback,
|
|
19
|
-
failureCallback,
|
|
20
|
-
};
|
|
21
|
-
expectSaga(getAiSuggestions, action)
|
|
22
|
-
.provide([
|
|
23
|
-
[
|
|
24
|
-
matchers.call.fn(Api.getAiSuggestions),
|
|
25
|
-
{
|
|
26
|
-
success: true,
|
|
27
|
-
status: {
|
|
28
|
-
isError: false,
|
|
29
|
-
code: 200,
|
|
30
|
-
message: "success",
|
|
31
|
-
},
|
|
32
|
-
message: "Meta data fetched successfully",
|
|
33
|
-
response: {
|
|
34
|
-
"https://response.com": 1400,
|
|
35
|
-
},
|
|
36
|
-
},
|
|
37
|
-
],
|
|
38
|
-
[matchers.call.fn(successCallback)],
|
|
39
|
-
])
|
|
40
|
-
.run();
|
|
41
|
-
});
|
|
42
|
-
|
|
43
|
-
it("Should handles error thrown from api", () => {
|
|
44
|
-
const successCallback = () => {};
|
|
45
|
-
const failureCallback = () => {};
|
|
46
|
-
const action = {
|
|
47
|
-
type: types.GET_AI_SUGGESTIONS,
|
|
48
|
-
prompt: {},
|
|
49
|
-
successCallback,
|
|
50
|
-
failureCallback,
|
|
51
|
-
};
|
|
52
|
-
expectSaga(getAiSuggestions, action)
|
|
53
|
-
.provide([[matchers.call.fn(Api.getAiSuggestions), throwError()]])
|
|
54
|
-
.run();
|
|
55
|
-
});
|
|
56
|
-
});
|
|
57
|
-
|
|
58
|
-
describe("watchAiSuggestions saga", () => {
|
|
59
|
-
let generator = null;
|
|
60
|
-
beforeEach(() => {
|
|
61
|
-
generator = watchAiSuggestions();
|
|
62
|
-
});
|
|
63
|
-
it("Should handle valid response from api", () => {
|
|
64
|
-
const progress1 = generator.next();
|
|
65
|
-
const mockTask = takeLatest(types.GET_AI_SUGGESTIONS, getAiSuggestions);
|
|
66
|
-
expect(progress1.value).toEqual(mockTask);
|
|
67
|
-
const progress2 = generator.next();
|
|
68
|
-
expect(progress2.value).toEqual(take(LOCATION_CHANGE));
|
|
69
|
-
});
|
|
70
|
-
|
|
71
|
-
it("Should handle LOCATION_CHANGE action and cancel the watcher", () => {
|
|
72
|
-
generator = watchAiSuggestions();
|
|
73
|
-
const mockTask = createMockTask();
|
|
74
|
-
|
|
75
|
-
expect(generator.next().value).toEqual(
|
|
76
|
-
takeLatest(types.GET_AI_SUGGESTIONS, getAiSuggestions)
|
|
77
|
-
);
|
|
78
|
-
expect(generator.next(mockTask).value).toEqual(take(LOCATION_CHANGE));
|
|
79
|
-
expect(generator.next().value).toEqual(cancel(mockTask));
|
|
80
|
-
expect(generator.next().done).toEqual(true);
|
|
81
|
-
});
|
|
82
|
-
});
|