@capillarytech/creatives-library 8.0.126 → 8.0.127-alpha.1

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 (78) hide show
  1. package/containers/App/constants.js +1 -0
  2. package/index.html +3 -1
  3. package/package.json +1 -1
  4. package/services/api.js +4 -4
  5. package/tests/integration/TemplateCreation/TemplateCreation.integration.test.js +8 -3
  6. package/tests/integration/TemplateCreation/api-response.js +5 -0
  7. package/tests/integration/TemplateCreation/msw-handler.js +42 -63
  8. package/utils/common.js +7 -0
  9. package/utils/commonUtils.js +2 -6
  10. package/utils/createPayload.js +272 -0
  11. package/utils/tests/createPayload.test.js +761 -0
  12. package/v2Components/CapImageUpload/index.js +59 -46
  13. package/v2Components/CapInAppCTA/index.js +1 -0
  14. package/v2Components/CapMpushCTA/constants.js +25 -0
  15. package/v2Components/CapMpushCTA/index.js +332 -0
  16. package/v2Components/CapMpushCTA/index.scss +95 -0
  17. package/v2Components/CapMpushCTA/messages.js +89 -0
  18. package/v2Components/CapTagList/index.js +177 -120
  19. package/v2Components/CapVideoUpload/constants.js +3 -0
  20. package/v2Components/CapVideoUpload/index.js +167 -110
  21. package/v2Components/CapVideoUpload/messages.js +16 -0
  22. package/v2Components/Carousel/index.js +15 -13
  23. package/v2Components/CustomerSearchSection/index.js +12 -7
  24. package/v2Components/ErrorInfoNote/style.scss +1 -0
  25. package/v2Components/MobilePushPreviewV2/index.js +37 -5
  26. package/v2Components/TemplatePreview/_templatePreview.scss +114 -72
  27. package/v2Components/TemplatePreview/assets/images/Android _ With date and time.svg +29 -0
  28. package/v2Components/TemplatePreview/assets/images/android.svg +9 -0
  29. package/v2Components/TemplatePreview/assets/images/iOS _ With date and time.svg +26 -0
  30. package/v2Components/TemplatePreview/assets/images/ios.svg +9 -0
  31. package/v2Components/TemplatePreview/index.js +178 -50
  32. package/v2Components/TemplatePreview/messages.js +4 -0
  33. package/v2Components/TestAndPreviewSlidebox/CustomValuesEditor.js +169 -0
  34. package/v2Components/TestAndPreviewSlidebox/LeftPanelContent.js +95 -0
  35. package/v2Components/TestAndPreviewSlidebox/PreviewSection.js +69 -0
  36. package/v2Components/TestAndPreviewSlidebox/SendTestMessage.js +68 -0
  37. package/v2Components/TestAndPreviewSlidebox/index.js +67 -246
  38. package/v2Components/TestAndPreviewSlidebox/tests/CustomValuesEditor.test.js +425 -0
  39. package/v2Components/TestAndPreviewSlidebox/tests/LeftPanelContent.test.js +400 -0
  40. package/v2Components/TestAndPreviewSlidebox/tests/SendTestMessage.test.js +448 -0
  41. package/v2Containers/CreativesContainer/SlideBoxContent.js +9 -9
  42. package/v2Containers/CreativesContainer/index.js +191 -136
  43. package/v2Containers/Email/index.js +15 -2
  44. package/v2Containers/InApp/constants.js +1 -0
  45. package/v2Containers/InApp/index.js +13 -13
  46. package/v2Containers/MobilePush/Create/index.js +1 -0
  47. package/v2Containers/MobilePush/commonMethods.js +7 -14
  48. package/v2Containers/MobilePushNew/actions.js +116 -0
  49. package/v2Containers/MobilePushNew/components/CtaButtons.js +170 -0
  50. package/v2Containers/MobilePushNew/components/MediaUploaders.js +754 -0
  51. package/v2Containers/MobilePushNew/components/PlatformContentFields.js +279 -0
  52. package/v2Containers/MobilePushNew/components/index.js +5 -0
  53. package/v2Containers/MobilePushNew/components/tests/CtaButtons.test.js +779 -0
  54. package/v2Containers/MobilePushNew/components/tests/MediaUploaders.test.js +2114 -0
  55. package/v2Containers/MobilePushNew/components/tests/PlatformContentFields.test.js +343 -0
  56. package/v2Containers/MobilePushNew/constants.js +115 -0
  57. package/v2Containers/MobilePushNew/hooks/tests/usePlatformSync.test.js +1299 -0
  58. package/v2Containers/MobilePushNew/hooks/tests/useUpload.test.js +1223 -0
  59. package/v2Containers/MobilePushNew/hooks/usePlatformSync.js +246 -0
  60. package/v2Containers/MobilePushNew/hooks/useUpload.js +726 -0
  61. package/v2Containers/MobilePushNew/index.js +2280 -0
  62. package/v2Containers/MobilePushNew/index.scss +308 -0
  63. package/v2Containers/MobilePushNew/messages.js +226 -0
  64. package/v2Containers/MobilePushNew/reducer.js +160 -0
  65. package/v2Containers/MobilePushNew/sagas.js +198 -0
  66. package/v2Containers/MobilePushNew/selectors.js +55 -0
  67. package/v2Containers/MobilePushNew/tests/reducer.test.js +741 -0
  68. package/v2Containers/MobilePushNew/tests/sagas.test.js +863 -0
  69. package/v2Containers/MobilePushNew/tests/selectors.test.js +425 -0
  70. package/v2Containers/MobilePushNew/tests/utils.test.js +322 -0
  71. package/v2Containers/MobilePushNew/utils.js +33 -0
  72. package/v2Containers/Rcs/tests/__snapshots__/index.test.js.snap +5 -5
  73. package/v2Containers/TagList/index.js +56 -10
  74. package/v2Containers/Templates/_templates.scss +101 -1
  75. package/v2Containers/Templates/index.js +147 -35
  76. package/v2Containers/Templates/messages.js +8 -0
  77. package/v2Containers/Templates/sagas.js +2 -0
  78. package/v2Containers/Whatsapp/constants.js +1 -0
@@ -0,0 +1,198 @@
1
+ import {
2
+ call, put, takeLatest, all,
3
+ } from "redux-saga/effects";
4
+ // import { schema, normalize } from 'normalizr';
5
+ import * as Api from "../../services/api";
6
+ import * as types from "./constants";
7
+
8
+ // Individual exports for testing
9
+ export function* createTemplate({template, callback}) {
10
+ let errorMsg;
11
+ try {
12
+ const result = yield call(Api.createMobilePushTemplate, template);
13
+ if (result.message) {
14
+ errorMsg = result.message;
15
+ if (result.status && result.status.code >= 400) {
16
+ throw errorMsg;
17
+ }
18
+ }
19
+ if (callback) {
20
+ yield call(callback, result.response);
21
+ }
22
+ yield put({
23
+ type: types.CREATE_TEMPLATE_SUCCESS,
24
+ data: result.response,
25
+ statusCode: result.status ? result.status.code : "",
26
+ errorMsg,
27
+ });
28
+ } catch (error) {
29
+ yield put({ type: types.CREATE_TEMPLATE_FAILURE, error, errorMsg });
30
+ }
31
+ }
32
+ export function* uploadAsset(action) {
33
+ try {
34
+ const {
35
+ file, assetType, fileParams, index, mobilePushParams = {},
36
+ } = action;
37
+ const uploadParams = {
38
+ file,
39
+ assetType,
40
+ fileParams,
41
+ ...mobilePushParams,
42
+ };
43
+ const result = yield call(Api.uploadFile, uploadParams);
44
+
45
+ yield put({
46
+ type: types.UPLOAD_ASSET_SUCCESS,
47
+ data: result.response.asset,
48
+ statusCode: result.status ? result.status.code : "",
49
+ index,
50
+ });
51
+ } catch (error) {
52
+ yield put({ type: types.UPLOAD_ASSET_FAILURE, error });
53
+ }
54
+ }
55
+
56
+ export function* watchCreateTemplate() {
57
+ yield takeLatest(types.CREATE_TEMPLATE_REQUEST, createTemplate);
58
+ }
59
+ export function* watchUploadAsset() {
60
+ yield takeLatest(types.UPLOAD_ASSET_REQUEST, uploadAsset);
61
+ }
62
+ export function* watchGetIosCtas() {
63
+ yield takeLatest(types.GET_IOS_CTAS, getIosCtas);
64
+ }
65
+
66
+ // Individual exports for testing
67
+ export function* editTemplate({ template, callback }) {
68
+ let errorMsg;
69
+ try {
70
+ // Use the same API endpoint as create - backend determines create vs edit based on _id presence
71
+ const result = yield call(Api.createMobilePushTemplate, template);
72
+ // Check for error status codes (400+)
73
+ if (result.status.code >= 400) {
74
+ errorMsg = result.message || `HTTP Error ${result.status.code}`;
75
+ throw errorMsg;
76
+ }
77
+
78
+ // For edit operations, we need to structure the response similar to create
79
+ // The Templates container expects a templateId field
80
+ const editResponseData = {
81
+ ...result.response,
82
+ templateId: result?.response?.templateId?._id || result?.response?._id || template._id,
83
+ };
84
+
85
+ yield put({
86
+ type: types.EDIT_TEMPLATE_SUCCESS,
87
+ data: editResponseData,
88
+ statusCode: result.status ? result.status.code : "",
89
+ errorMsg,
90
+ });
91
+
92
+ // Call callback with proper response structure
93
+ if (callback) {
94
+ yield call(callback, editResponseData);
95
+ }
96
+ } catch (error) {
97
+ yield put({ type: types.EDIT_TEMPLATE_FAILURE, error, errorMsg });
98
+ }
99
+ }
100
+
101
+ export function* getTemplateDetails(id) {
102
+ try {
103
+ const result = yield call(Api.getTemplateDetails, id);
104
+ // const sidebar = result.response.sidebar;
105
+ yield put({
106
+ type: types.GET_TEMPLATE_DETAILS_SUCCESS,
107
+ data: result.response,
108
+ });
109
+ } catch (error) {
110
+ yield put({ type: types.GET_TEMPLATE_DETAILS_FAILURE, error });
111
+ }
112
+ }
113
+
114
+ export function* getIosCtas(licenseCode) {
115
+ try {
116
+ const result = yield call(Api.getIosCtas, licenseCode);
117
+ yield put({
118
+ type: types.GET_IOS_CTAS_SUCCESS,
119
+ data: result.response.metaEntities.data,
120
+ statusCode: result.status ? result.status.code : "",
121
+ });
122
+ } catch (error) {
123
+ yield put({ type: types.GET_IOS_CTAS_FAILURE, error });
124
+ }
125
+ }
126
+
127
+ export function* getMobilepushTemplatesList(params) {
128
+ try {
129
+ const result = yield call(Api.getAllTemplates, {
130
+ channel: params.channel,
131
+ queryParams: params.queryParams,
132
+ });
133
+ yield put({
134
+ type: types.GET_MOBILEPUSH_TEMPLATES_LIST_SUCCESS,
135
+ data: result.response.templates,
136
+ templateData: result.response.mapped,
137
+ });
138
+ } catch (error) {
139
+ yield put({ type: types.GET_MOBILEPUSH_TEMPLATES_LIST_FAILURE, error });
140
+ }
141
+ }
142
+
143
+ export function* fetchWeCrmAccounts(action) {
144
+ try {
145
+ const result = yield call(Api.fetchWeCrmAccounts, action.source);
146
+ yield put({
147
+ type: types.GET_WECRM_ACCOUNTS_SUCCESS,
148
+ data: result.response,
149
+ });
150
+ } catch (error) {
151
+ yield put({
152
+ type: types.GET_WECRM_ACCOUNTS_FAILURE,
153
+ data: error,
154
+ });
155
+ }
156
+ }
157
+
158
+ export function* watchFetchWeCrmAccounts() {
159
+ yield takeLatest(types.GET_WECRM_ACCOUNTS_REQUEST, fetchWeCrmAccounts);
160
+ }
161
+
162
+ export function* watchEditTemplate() {
163
+ yield takeLatest(types.EDIT_TEMPLATE_REQUEST, editTemplate);
164
+ }
165
+
166
+ export function* watchGetTemplateDetails() {
167
+ yield takeLatest(types.GET_TEMPLATE_DETAILS_REQUEST, getTemplateDetails);
168
+ }
169
+
170
+ export function* watchMobilepushTemplatesList() {
171
+ yield takeLatest(
172
+ types.GET_MOBILEPUSH_TEMPLATES_LIST_REQUEST,
173
+ getMobilepushTemplatesList
174
+ );
175
+ }
176
+
177
+ // All sagas to be loaded
178
+ export default [
179
+ watchEditTemplate,
180
+ watchCreateTemplate,
181
+ watchGetTemplateDetails,
182
+ watchFetchWeCrmAccounts,
183
+ watchMobilepushTemplatesList,
184
+ watchUploadAsset,
185
+ watchGetIosCtas,
186
+ ];
187
+
188
+ export function* v2MobilePushSagas() {
189
+ yield all([
190
+ watchCreateTemplate(),
191
+ watchEditTemplate(),
192
+ watchGetTemplateDetails(),
193
+ watchFetchWeCrmAccounts(),
194
+ watchMobilepushTemplatesList(),
195
+ watchUploadAsset(),
196
+ watchGetIosCtas(),
197
+ ]);
198
+ }
@@ -0,0 +1,55 @@
1
+ import { createSelector } from 'reselect';
2
+ import { fromJS } from 'immutable';
3
+
4
+ // New selectors for MobilePushNew
5
+ const selectMobilePushNewDomain = () => (state) => state.get('mobilePushNew') || fromJS({});
6
+
7
+ const makeSelectMobilePushNew = () => createSelector(
8
+ selectMobilePushNewDomain(),
9
+ (substate) => substate.toJS()
10
+ );
11
+
12
+ const makeSelectUploadedAssetData = () => createSelector(
13
+ selectMobilePushNewDomain(),
14
+ (substate) => substate.get('uploadedAssetData') || {}
15
+ );
16
+
17
+ const makeSelectUploadedAssetData0 = () => createSelector(
18
+ selectMobilePushNewDomain(),
19
+ (substate) => substate.get('uploadedAssetData0') || {}
20
+ );
21
+
22
+ const makeSelectUploadedAssetData1 = () => createSelector(
23
+ selectMobilePushNewDomain(),
24
+ (substate) => substate.get('uploadedAssetData1') || {}
25
+ );
26
+
27
+ const makeSelectUploadAssetSuccess = () => createSelector(
28
+ selectMobilePushNewDomain(),
29
+ (substate) => substate.get('uploadAssetSuccess') || false
30
+ );
31
+
32
+ const makeSelectCreateError = () => createSelector(
33
+ selectMobilePushNewDomain(), (dimensionState) => dimensionState.get('createTemplateErrorMessage') || ""
34
+ );
35
+
36
+ const makeSelectAssetUploading = () => createSelector(
37
+ selectMobilePushNewDomain(),
38
+ (substate) => substate.get('assetUploading') || false
39
+ );
40
+
41
+ const makeSelectGetTemplateDetailsInProgress = () => createSelector(
42
+ selectMobilePushNewDomain(),
43
+ (substate) => substate.get('getTemplateDetailsInProgress') || false
44
+ );
45
+
46
+ export {
47
+ makeSelectMobilePushNew,
48
+ makeSelectUploadedAssetData,
49
+ makeSelectUploadedAssetData0,
50
+ makeSelectUploadedAssetData1,
51
+ makeSelectUploadAssetSuccess,
52
+ makeSelectCreateError,
53
+ makeSelectAssetUploading,
54
+ makeSelectGetTemplateDetailsInProgress,
55
+ };