@capillarytech/creatives-library 7.17.37 → 7.17.39-alpha.0

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/index.js CHANGED
@@ -124,8 +124,8 @@ const ViberContainer = {Viber, viberReducer, viberSaga};
124
124
  const FacebookPreviewContainer = { FacebookPreview, facebookPreviewReducer, facebookPreviewSaga };
125
125
  const SmsTraiContainer = {SmsTraiCreate, SmsTraiCreateReducer, SmsTraiCreateSaga};
126
126
  const WhatsappContainer = { Whatsapp, whatsappReducer, whatsappSaga };
127
- const zaloContainer = { Zalo, zaloReducer, zaloSaga };
128
127
  const RcsContainer = { Rcs, rcsReducer, rcsSaga };
128
+ const ZaloContainer = { Zalo, zaloReducer, zaloSaga };
129
129
 
130
130
  const GalleryContainer = {Gallery, galleryReducer, gallerySagas};
131
131
  const FTPContainer = {FTP, FTPReducer, FTPSagas};
@@ -173,6 +173,6 @@ export { CapContainer,
173
173
  FacebookPreviewContainer,
174
174
  SmsTraiContainer,
175
175
  WhatsappContainer,
176
- zaloContainer,
177
176
  RcsContainer,
177
+ ZaloContainer,
178
178
  };
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@capillarytech/creatives-library",
3
3
  "author": "meharaj",
4
- "version": "7.17.37",
4
+ "version": "7.17.39-alpha.0",
5
5
  "description": "Capillary creatives ui",
6
6
  "main": "./index.js",
7
7
  "module": "./index.es.js",
package/services/api.js CHANGED
@@ -90,7 +90,7 @@ function checkStatus(response) {
90
90
  const isLoginPage = window.location.pathname.indexOf('/login') !== -1;
91
91
  if (!isLoginPage) redirectIfUnauthenticated(response);
92
92
 
93
- const error = new Error({ statusText, status });
93
+ const error = new Error(statusText);
94
94
  error.response = response;
95
95
  error.isError = true;
96
96
  error.status = status;
@@ -493,14 +493,14 @@ export const getSenderDetails = (channel, orgUnitId) => {
493
493
  export const getCdnTransformationConfig = () => {
494
494
  const url = `${API_ENDPOINT}/common/getCdnTransformationConfig`;
495
495
  return request(url, getAPICallObject('GET'));
496
- }
496
+ };
497
497
 
498
498
  export const getS3UrlFileSizes = (data) => {
499
499
  const url = `${API_ENDPOINT}/assets/files/metadata`;
500
500
  return request(url, getAPICallObject('POST', data));
501
- }
501
+ };
502
502
 
503
503
  export const getTemplateInfoById = ({id, username, oa_id, token}) => {
504
- const url = `${API_ENDPOINT}/templates/${id}/Zalo?username=${username}&oa_id=${oa_id}&token=${token}`;
505
- return request(url, getAPICallObject('GET'));
506
- }
504
+ const url = `${API_ENDPOINT}/templates/${id}/Zalo?username=${username}&oa_id=${oa_id}&token=${token}`;
505
+ return request(url, getAPICallObject('GET'));
506
+ };
@@ -321,7 +321,7 @@ class CapTagList extends React.Component { // eslint-disable-line react/prefer-s
321
321
  trigger="click"
322
322
  placement={translationLang === "ja-JP" && channel === 'EMAIL' ? "bottom" : "rightTop"}
323
323
  >
324
- <CapButton isAddBtn type="flat">{label || ''}</CapButton>
324
+ <CapButton disabled={this?.props?.disabled} isAddBtn type="flat">{label || ''}</CapButton>
325
325
  </CapPopover>
326
326
  }
327
327
  <CapModal
@@ -358,6 +358,7 @@ CapTagList.propTypes = {
358
358
  disableTagsDetails: PropTypes.object,
359
359
  currentOrgDetails: PropTypes.object,
360
360
  channel: PropTypes.string,
361
+ disabled: PropTypes.bool
361
362
  };
362
363
 
363
364
  CapTagList.defaultValue = {
@@ -213,7 +213,7 @@ export function SlideBoxContent(props) {
213
213
  isEmailPreview = slidBoxContent === 'preview' && channel === constants.EMAIL;
214
214
  isMpushPreview = slidBoxContent === 'preview' && channel === constants.MOBILE_PUSH;
215
215
  isEditFTP = isEdit && [constants.NO_COMMUNICATION, constants.FTP].includes(channel);
216
- isEditZalo = isEdit && channel === constants.ZALO
216
+ isEditZalo = isEdit && channel === constants.ZALO;
217
217
  }
218
218
  const isDltEnabled = commonUtil.isTraiDLTEnable(isFullMode, smsRegister);
219
219
  const hasJPLocaleHideFeatureEnabled = commonUtil?.hasJPLocaleHideFeatureEnabled();
@@ -510,11 +510,17 @@ export function SlideBoxContent(props) {
510
510
  {
511
511
  isEditZalo &&
512
512
  <Zalo
513
- templateData={templateData}
514
- location={creativesLocationProps}
515
- selectedOfferDetails={selectedOfferDetails}
516
- getDefaultTags={type}
517
- channel={channel}
513
+ isFullMode={isFullMode}
514
+ templateData={templateData}
515
+ getFormData={getFormData}
516
+ getDefaultTags={type}
517
+ forwardedTags={forwardedTags}
518
+ selectedOfferDetails={selectedOfferDetails}
519
+ location={{
520
+ pathname: `/zalo/edit`,
521
+ query,
522
+ search: '',
523
+ }}
518
524
  />
519
525
  }
520
526
  {
@@ -1,8 +1,12 @@
1
1
  import React from 'react';
2
2
  import PropTypes from 'prop-types';
3
3
  import {
4
- CapSlideBox, CapHeader, CapLink, CapInput,
5
- } from '@capillarytech/cap-ui-library';
4
+ CapSlideBox,
5
+ CapHeader,
6
+ CapLink,
7
+ CapInput,
8
+ CapNotification,
9
+ } from "@capillarytech/cap-ui-library";
6
10
  import { injectIntl, FormattedMessage } from 'react-intl';
7
11
  import classnames from 'classnames';
8
12
  import {isEmpty, get, forEach, cloneDeep} from 'lodash';
@@ -23,8 +27,10 @@ import { gtmPush } from '../../utils/gtmTrackers';
23
27
  import './index.scss';
24
28
  import * as templateActions from '../Templates/actions';
25
29
  import * as globalActions from '../Cap/actions';
30
+ import * as zaloActions from '../Zalo/actions';
26
31
  import {isLoading as isLoadingSelector} from './selectors';
27
32
  import messages from './messages';
33
+ import zaloMessages from '../Zalo/messages';
28
34
  import { MAP_TEMPLATE } from '../WeChat/Wrapper/constants';
29
35
  import { makeSelectFetchingCmsData } from '../Email/selectors';
30
36
  import { IMAGE as LINE_IMAGE, IMAGE_MAP, IMAGE_CAROUSEL, VIDEO as LINE_VIDEO, TEMPLATE, STICKER } from '../Line/Container/constants';
@@ -97,12 +103,35 @@ export class Creatives extends React.Component {
97
103
  }
98
104
  this.setState(data);
99
105
  };
106
+
107
+ actionCallback = () => {
108
+ CapNotification.error({
109
+ message: <FormattedMessage {...zaloMessages.zaloFailureNotificationPreview}/>,
110
+ });
111
+ };
112
+
100
113
  onPreviewTemplate = (template) => {
101
- const templateData = template;
102
- const usersList = commonUtil.getMergedUserList(this.props.templateUserList);
103
- const userId = parseInt(template.updatedBy, 10);
104
- templateData.updatedByName = commonUtil.getUserNameById(userId, usersList );
105
- this.setState({ slidBoxContent: 'preview', templateData });
114
+ if (template.type !== constants.ZALO.toLowerCase()) {
115
+ const templateData = template;
116
+ const usersList = commonUtil.getMergedUserList(this.props.templateUserList);
117
+ const userId = parseInt(template.updatedBy, 10);
118
+ templateData.updatedByName = commonUtil.getUserNameById(userId, usersList );
119
+ this.setState({ slidBoxContent: 'preview', templateData });
120
+ } else {
121
+ const {
122
+ name = "",
123
+ sourceAccountIdentifier = "",
124
+ configs: { token = "" } = {},
125
+ } = get(this.props, "Templates.weCrmAccounts[0]", {});
126
+ this.props.zaloActions.getTemplateInfoById({
127
+ username: name,
128
+ oa_id: sourceAccountIdentifier,
129
+ token,
130
+ id: template?._id,
131
+ preview: true,
132
+ actionCallback: this.actionCallback,
133
+ });
134
+ }
106
135
  };
107
136
  onEditTemplate = () => {
108
137
  this.setState({ slidBoxContent: 'editTemplate', showSlideBox: true, templateNameExists: true });
@@ -771,6 +800,14 @@ export class Creatives extends React.Component {
771
800
  }
772
801
  }
773
802
  break;
803
+ case constants.ZALO: {
804
+ if (template.value) {
805
+ templateData = {
806
+ ...template.value,
807
+ };
808
+ }
809
+ }
810
+ break;
774
811
  default:
775
812
  break;
776
813
  }
@@ -1205,6 +1242,7 @@ Creatives.propTypes = {
1205
1242
  channel: PropTypes.string,
1206
1243
  templateActions: PropTypes.object,
1207
1244
  globalActions: PropTypes.object,
1245
+ zaloActions: PropTypes.object,
1208
1246
  cap: PropTypes.object,
1209
1247
  // isLoading: PropTypes.bool,
1210
1248
  templateUserList: PropTypes.array,
@@ -1233,6 +1271,7 @@ function mapDispatchToProps(dispatch) {
1233
1271
  templateActions: bindActionCreators(templateActions, dispatch),
1234
1272
  globalActions: bindActionCreators(globalActions, dispatch),
1235
1273
  actions: bindActionCreators(actions, dispatch),
1274
+ zaloActions: bindActionCreators(zaloActions, dispatch),
1236
1275
  };
1237
1276
  }
1238
1277
  export default connect(mapStatesToProps, mapDispatchToProps)(injectIntl(Creatives));
@@ -260,6 +260,7 @@ export class TagList extends React.Component { // eslint-disable-line react/pref
260
260
  modalProps={this.props.modalProps}
261
261
  currentOrgDetails={this.props.currentOrgDetails}
262
262
  channel={this.props.channel}
263
+ disabled={this.props.disabled}
263
264
  />
264
265
  </div>
265
266
  );
@@ -286,6 +287,7 @@ TagList.propTypes = {
286
287
  modalProps: PropTypes.any,
287
288
  currentOrgDetails: PropTypes.object,
288
289
  channel: PropTypes.string,
290
+ disabled: PropTypes.bool
289
291
  };
290
292
 
291
293
  const mapStateToProps = createStructuredSelector({
@@ -869,10 +869,11 @@ export class Templates extends React.Component { // eslint-disable-line react/pr
869
869
  }
870
870
 
871
871
  filterZaloTemplates = (templates) => {
872
- const { selectedZaloStatus } = this.state;
872
+ let { selectedZaloStatus } = this.state;
873
+ selectedZaloStatus = !this.props.isFullMode ? ZALO_STATUSES.ENABLE : selectedZaloStatus;
873
874
  if (selectedZaloStatus) {
874
- return templates?.filter((template) => template?.versions?.base?.content?.zalo.status === selectedZaloStatus);
875
- }
875
+ return templates?.filter((template) => template?.versions?.base?.content?.zalo?.status === selectedZaloStatus);
876
+ }
876
877
  return templates;
877
878
  }
878
879
 
@@ -1909,6 +1910,12 @@ export class Templates extends React.Component { // eslint-disable-line react/pr
1909
1910
 
1910
1911
  selectTemplate = (id) => find(this.props.TemplatesList, {_id: id})
1911
1912
 
1913
+ actionCallback = () => {
1914
+ CapNotification.error({
1915
+ message: this.props.intl.formatMessage(zaloMessages.zaloFailureNotificationPreview),
1916
+ });
1917
+ };
1918
+
1912
1919
  handlePreviewClick(template, modeType) {
1913
1920
  if (this.state.channel.toLowerCase() !== ZALO_LOWERCASE) {
1914
1921
  this.togglePreview();
@@ -1951,6 +1958,7 @@ export class Templates extends React.Component { // eslint-disable-line react/pr
1951
1958
  token: token,
1952
1959
  id: template?._id,
1953
1960
  preview: true,
1961
+ actionCallback: this.actionCallback,
1954
1962
  });
1955
1963
  }
1956
1964
  }
@@ -2900,6 +2908,12 @@ export class Templates extends React.Component { // eslint-disable-line react/pr
2900
2908
  ) : null
2901
2909
  }
2902
2910
 
2911
+ {
2912
+ channel.toLowerCase() === ZALO_LOWERCASE && !isFullMode ? (
2913
+ <CapInfoNote message={formatMessage(messages.zaloOnlyApprovedTemplates)} />
2914
+ ) : null
2915
+ }
2916
+
2903
2917
  <CapRow>
2904
2918
  <Pagination onPageChange={templates.length ? this.onPaginationChange : () => {}} paginationSelector="pagination-container">
2905
2919
  {this.getTemplateDataForGrid({ isLoading, loadingTip, channel: this.state.channel, templates: this.state.searchingZaloTemplate ? this.state.searchedZaloTemplates : this.props.TemplatesList, filterContent, handlers: { handlePreviewClick: this.handlePreviewClick, handleEditClick: this.handleEditClick}})}
@@ -502,4 +502,8 @@ export default defineMessages({
502
502
  id: `${scope}.zaloPreview`,
503
503
  defaultMessage: 'Open preview in new tab',
504
504
  },
505
+ "zaloOnlyApprovedTemplates": {
506
+ id: `${scope}.zaloOnlyApprovedTemplates`,
507
+ defaultMessage: 'Only enabled templates are shown here',
508
+ },
505
509
  });
@@ -1038,134 +1038,6 @@ exports[`Test Templates container Should render temlates when zalo templates are
1038
1038
  tip="Getting all templates..."
1039
1039
  >
1040
1040
  <div>
1041
- <div
1042
- className="pagination-container"
1043
- >
1044
- <CapCustomCardList
1045
- cardList={
1046
- Array [
1047
- Object {
1048
- "content": <CapLabel
1049
- className="zalo-listing-content desc"
1050
- type="label19"
1051
- >
1052
- Test1
1053
- </CapLabel>,
1054
- "extra": Array [
1055
- <CapTooltip
1056
- title="Open preview in new tab"
1057
- >
1058
- <CapIcon
1059
- className="view-zalo"
1060
- onClick={[Function]}
1061
- style={
1062
- Object {
1063
- "marginRight": "16px",
1064
- }
1065
- }
1066
- type="eye"
1067
- />
1068
- </CapTooltip>,
1069
- ],
1070
- "hoverOption": <CapButton
1071
- className="select-zalo"
1072
- isAddBtn={false}
1073
- onClick={[Function]}
1074
- type="primary"
1075
- >
1076
- Select
1077
- </CapButton>,
1078
- "key": "ZALO-card-Test1",
1079
- "title": <CapRow>
1080
- <CapLabel
1081
- className="zalo-template-name"
1082
- type="label1"
1083
- >
1084
-
1085
- </CapLabel>
1086
- <CapRow
1087
- align="middle"
1088
- className="zalo-status-container"
1089
- type="flex"
1090
- >
1091
- <CapStatus
1092
- color=""
1093
- height="0.571rem"
1094
- labelType="label3"
1095
- text=""
1096
- type="pending"
1097
- width="0.571rem"
1098
- />
1099
- </CapRow>
1100
- </CapRow>,
1101
- },
1102
- Object {
1103
- "content": <CapLabel
1104
- className="zalo-listing-content desc"
1105
- type="label19"
1106
- >
1107
- Test2
1108
- </CapLabel>,
1109
- "extra": Array [
1110
- <CapTooltip
1111
- title="Open preview in new tab"
1112
- >
1113
- <CapIcon
1114
- className="view-zalo"
1115
- onClick={[Function]}
1116
- style={
1117
- Object {
1118
- "marginRight": "16px",
1119
- }
1120
- }
1121
- type="eye"
1122
- />
1123
- </CapTooltip>,
1124
- ],
1125
- "hoverOption": <CapButton
1126
- className="select-zalo"
1127
- isAddBtn={false}
1128
- onClick={[Function]}
1129
- type="primary"
1130
- >
1131
- Select
1132
- </CapButton>,
1133
- "key": "ZALO-card-Test2",
1134
- "title": <CapRow>
1135
- <CapLabel
1136
- className="zalo-template-name"
1137
- type="label1"
1138
- >
1139
-
1140
- </CapLabel>
1141
- <CapRow
1142
- align="middle"
1143
- className="zalo-status-container"
1144
- type="flex"
1145
- >
1146
- <CapStatus
1147
- color=""
1148
- height="0.571rem"
1149
- labelType="label3"
1150
- text=""
1151
- type="pending"
1152
- width="0.571rem"
1153
- />
1154
- </CapRow>
1155
- </CapRow>,
1156
- },
1157
- ]
1158
- }
1159
- fbType="list"
1160
- key="ZALO-card-list"
1161
- style={
1162
- Object {
1163
- "marginLeft": "16px",
1164
- }
1165
- }
1166
- type="ZALO"
1167
- />
1168
- </div>
1169
1041
  <div
1170
1042
  style={
1171
1043
  Object {
@@ -1173,7 +1045,34 @@ exports[`Test Templates container Should render temlates when zalo templates are
1173
1045
  "overflow": "auto",
1174
1046
  }
1175
1047
  }
1176
- />
1048
+ >
1049
+ <CapHeader
1050
+ description={
1051
+ <CapLabel
1052
+ style={
1053
+ Object {
1054
+ "textAlign": "center",
1055
+ }
1056
+ }
1057
+ type="label1"
1058
+ >
1059
+ Please try searching with another term or apply different filter
1060
+ </CapLabel>
1061
+ }
1062
+ descriptionClass=""
1063
+ inline={false}
1064
+ size="large"
1065
+ title={
1066
+ <CapHeading
1067
+ className="channel-specific-illustration-text"
1068
+ type="h3"
1069
+ >
1070
+ Sorry, we couldn’t find any matches
1071
+ </CapHeading>
1072
+ }
1073
+ titleClass=""
1074
+ />
1075
+ </div>
1177
1076
  </div>
1178
1077
  </CapSpin>
1179
1078
  </div>
@@ -93,6 +93,7 @@ describe("Test TemplatesV2", () => {
93
93
  expect(getByText('Viber')).toBeInTheDocument();
94
94
  expect(getByText('Facebook')).toBeInTheDocument();
95
95
  expect(getByText('WhatsApp')).toBeInTheDocument();
96
+ expect(getByText('Zalo')).toBeInTheDocument();
96
97
  expect(getByText('Gallery')).toBeInTheDocument();
97
98
  });
98
99
  });
@@ -10,7 +10,6 @@ export const ERROR = 'ERROR';
10
10
  export const STRING = 'STRING';
11
11
  export const NUMBER = 'NUMBER';
12
12
  export const DATE = 'DATE';
13
- export const ENABLE = 'ENABLE';
14
13
 
15
14
  export const TAG = 'TAG';
16
15
  export const EMBEDDED = 'embedded';