@capillarytech/creatives-library 8.0.21 → 8.0.22

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 (32) hide show
  1. package/containers/TestPage/constants.js +7 -0
  2. package/containers/TestPage/index.js +31 -0
  3. package/containers/TestPage/messages.js +13 -0
  4. package/containers/TestPage/reducer.js +21 -0
  5. package/containers/TestPage/sagas.js +11 -0
  6. package/containers/Testv2/actions.js +15 -0
  7. package/containers/Testv2/constants.js +7 -0
  8. package/containers/Testv2/index.js +47 -0
  9. package/containers/Testv2/messages.js +21 -0
  10. package/containers/Testv2/reducer.js +23 -0
  11. package/containers/Testv2/sagas.js +11 -0
  12. package/containers/Testv2/selectors.js +25 -0
  13. package/package.json +1 -1
  14. package/reducers.js +77 -0
  15. package/store.js +61 -0
  16. package/utils/tests/asyncInjectors.test.js +173 -0
  17. package/v2Containers/CreativesContainer/SlideBoxContent.js +3 -0
  18. package/v2Containers/CreativesContainer/index.js +2 -0
  19. package/v2Containers/CreativesContainer/tests/__snapshots__/index.test.js.snap +5 -0
  20. package/v2Containers/TestPage/constants.js +7 -0
  21. package/v2Containers/TestPage/index.js +31 -0
  22. package/v2Containers/TestPage/messages.js +13 -0
  23. package/v2Containers/TestPage/reducer.js +21 -0
  24. package/v2Containers/TestPage/sagas.js +11 -0
  25. package/v2Containers/Testv2/actions.js +15 -0
  26. package/v2Containers/Testv2/constants.js +7 -0
  27. package/v2Containers/Testv2/index.js +47 -0
  28. package/v2Containers/Testv2/messages.js +21 -0
  29. package/v2Containers/Testv2/reducer.js +23 -0
  30. package/v2Containers/Testv2/sagas.js +11 -0
  31. package/v2Containers/Testv2/selectors.js +25 -0
  32. package/v2Containers/Zalo/index.js +2 -1
@@ -0,0 +1,7 @@
1
+ /*
2
+ *
3
+ * Dashboard constants
4
+ *
5
+ */
6
+
7
+ export const DEFAULT_ACTION = 'app/containers/TestPage/DEFAULT_ACTION';
@@ -0,0 +1,31 @@
1
+
2
+ import React from "react";
3
+ import SmsTest from '../../components/SmsTest';
4
+
5
+ export default class TestPage extends React.PureComponent { // eslint-disable-line react/prefer-stateless-function
6
+ render() {
7
+ return (
8
+ <SmsTest />
9
+ );
10
+ }
11
+ }
12
+
13
+ // const schema = {
14
+ // title: "Todo",
15
+ // type: "object",
16
+ // required: ["title"],
17
+ // properties: {
18
+ // title: {type: "string", title: "Title", default: "A new task"},
19
+ // done: {type: "boolean", title: "Done?", default: false},
20
+ // },
21
+ // };
22
+
23
+ // const log = (type) => console.log.bind(console, type);
24
+
25
+ // render((
26
+ // <div>
27
+ // <SmsTest
28
+ // />
29
+ // </div>
30
+ // ), document.getElementById("app"));
31
+ //export default TestPage;
@@ -0,0 +1,13 @@
1
+ /*
2
+ * NotFoundPage Messages
3
+ *
4
+ * This contains all the text for the NotFoundPage component.
5
+ */
6
+ import { defineMessages } from 'react-intl';
7
+
8
+ export default defineMessages({
9
+ header: {
10
+ id: 'creatives.components.TestPage.header',
11
+ defaultMessage: 'Looks like youas are lost!',
12
+ },
13
+ });
@@ -0,0 +1,21 @@
1
+ /*
2
+ *
3
+ * Dashboard reducer
4
+ *
5
+ */
6
+
7
+ import { fromJS } from 'immutable';
8
+ import { DEFAULT_ACTION } from './constants';
9
+
10
+ const initialState = fromJS({});
11
+
12
+ function TestPageReducer(state = initialState, action) {
13
+ switch (action.type) {
14
+ case DEFAULT_ACTION:
15
+ return state;
16
+ default:
17
+ return state;
18
+ }
19
+ }
20
+
21
+ export default TestPageReducer;
@@ -0,0 +1,11 @@
1
+ // import { take, call, put, select } from 'redux-saga/effects';
2
+
3
+ // Individual exports for testing
4
+ export function* defaultSaga() {
5
+ // See example in containers/HomePage/sagas.js
6
+ }
7
+
8
+ // All sagas to be loaded
9
+ export default [
10
+ defaultSaga,
11
+ ];
@@ -0,0 +1,15 @@
1
+ /*
2
+ *
3
+ * Testv2 actions
4
+ *
5
+ */
6
+
7
+ import {
8
+ DEFAULT_ACTION,
9
+ } from './constants';
10
+
11
+ export function defaultAction() {
12
+ return {
13
+ type: DEFAULT_ACTION,
14
+ };
15
+ }
@@ -0,0 +1,7 @@
1
+ /*
2
+ *
3
+ * Testv2 constants
4
+ *
5
+ */
6
+
7
+ export const DEFAULT_ACTION = 'app/Testv2/DEFAULT_ACTION';
@@ -0,0 +1,47 @@
1
+ /*
2
+ *
3
+ * Testv2
4
+ *
5
+ */
6
+
7
+ import PropTypes from 'prop-types';
8
+
9
+ import React from 'react';
10
+ import { connect } from 'react-redux';
11
+ import Helmet from 'react-helmet';
12
+ import { FormattedMessage } from 'react-intl';
13
+ import { createStructuredSelector } from 'reselect';
14
+ import makeSelectTestv2 from './selectors';
15
+ import messages from './messages';
16
+
17
+ export class Testv2 extends React.Component { // eslint-disable-line react/prefer-stateless-function
18
+ render() {
19
+ return (
20
+ <div>
21
+ <Helmet
22
+ title={<FormattedMessage {...messages.testv2} />}
23
+ meta={[
24
+ { name: 'description', content: <FormattedMessage {...messages.descriptionTestv2} /> },
25
+ ]}
26
+ />
27
+ <FormattedMessage {...messages.header} />
28
+ </div>
29
+ );
30
+ }
31
+ }
32
+
33
+ Testv2.propTypes = {
34
+ dispatch: PropTypes.func.isRequired,
35
+ };
36
+
37
+ const mapStateToProps = createStructuredSelector({
38
+ Testv2: makeSelectTestv2(),
39
+ });
40
+
41
+ function mapDispatchToProps(dispatch) {
42
+ return {
43
+ dispatch,
44
+ };
45
+ }
46
+
47
+ export default connect(mapStateToProps, mapDispatchToProps)(Testv2);
@@ -0,0 +1,21 @@
1
+ /*
2
+ * Testv2 Messages
3
+ *
4
+ * This contains all the text for the Testv2 component.
5
+ */
6
+ import { defineMessages } from 'react-intl';
7
+
8
+ export default defineMessages({
9
+ header: {
10
+ id: 'creatives.containers.Testv2.header',
11
+ defaultMessage: 'This is Testv2 container !',
12
+ },
13
+ testv2: {
14
+ id: 'creatives.containers.Testv2.testv2',
15
+ defaultMessage: 'Testv2',
16
+ },
17
+ descriptionTestv2: {
18
+ id: 'creatives.containers.Testv2.descriptionTestv2',
19
+ defaultMessage: 'Description of Testv2',
20
+ },
21
+ });
@@ -0,0 +1,23 @@
1
+ /*
2
+ *
3
+ * Testv2 reducer
4
+ *
5
+ */
6
+
7
+ import { fromJS } from 'immutable';
8
+ import {
9
+ DEFAULT_ACTION,
10
+ } from './constants';
11
+
12
+ const initialState = fromJS({});
13
+
14
+ function testv2Reducer(state = initialState, action) {
15
+ switch (action.type) {
16
+ case DEFAULT_ACTION:
17
+ return state;
18
+ default:
19
+ return state;
20
+ }
21
+ }
22
+
23
+ export default testv2Reducer;
@@ -0,0 +1,11 @@
1
+ // import { take, call, put, select } from 'redux-saga/effects';
2
+
3
+ // Individual exports for testing
4
+ export function* defaultSaga() {
5
+ // See example in containers/HomePage/sagas.js
6
+ }
7
+
8
+ // All sagas to be loaded
9
+ export default [
10
+ defaultSaga,
11
+ ];
@@ -0,0 +1,25 @@
1
+ import { createSelector } from 'reselect';
2
+
3
+ /**
4
+ * Direct selector to the testv2 state domain
5
+ */
6
+ const selectTestv2Domain = () => (state) => state.get('testv2');
7
+
8
+ /**
9
+ * Other specific selectors
10
+ */
11
+
12
+
13
+ /**
14
+ * Default selector used by Testv2
15
+ */
16
+
17
+ const makeSelectTestv2 = () => createSelector(
18
+ selectTestv2Domain(),
19
+ (substate) => substate.toJS()
20
+ );
21
+
22
+ export default makeSelectTestv2;
23
+ export {
24
+ selectTestv2Domain,
25
+ };
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@capillarytech/creatives-library",
3
3
  "author": "meharaj",
4
- "version": "8.0.21",
4
+ "version": "8.0.22",
5
5
  "description": "Capillary creatives ui",
6
6
  "main": "./index.js",
7
7
  "module": "./index.es.js",
package/reducers.js ADDED
@@ -0,0 +1,77 @@
1
+ /**
2
+ * Combine all reducers in this file and export the combined reducers.
3
+ * If we were to do this in store.js, reducers wouldn't be hot reloadable.
4
+ */
5
+
6
+ import { combineReducers } from 'redux-immutable';
7
+ import { fromJS } from 'immutable';
8
+ import { LOCATION_CHANGE } from 'react-router-redux';
9
+
10
+ import languageProviderReducer from 'v2Containers/LanguageProvider/reducer';
11
+ import beeEditorReducer from 'v2Containers/BeeEditor/reducer';
12
+ import CapFacebookPreviewReducer from 'v2Containers/CapFacebookPreview/reducer';
13
+
14
+ import capReducer from 'containers/Cap/reducer';
15
+ import appReducer from 'containers/App/reducer';
16
+ import createSmsReducer from 'containers/Sms/Create/reducer';
17
+ import editSmsReducer from 'containers/Sms/Edit/reducer';
18
+ import templateReducer from 'containers/Templates/reducer';
19
+ import tagsReducer from 'containers/TagList/reducer';
20
+ import emailReducer from 'containers/Email/reducer';
21
+ import ebillReducer from 'containers/Ebill/reducer';
22
+ import ftpReducer from 'v2Containers/FTP/reducer';
23
+ import galleryReducer from './v2Containers/Assets/Gallery/reducer';
24
+ import { AIRA_REDUCER_DOMAIN, askAiraReducer } from '@capillarytech/cap-ui-library/CapAskAira';
25
+ import CapCollapsibleLeftNavigationReducer from '@capillarytech/cap-ui-library/CapCollapsibleLeftNavigation/reducer';
26
+ /*
27
+ * routeReducer
28
+ *
29
+ * The reducer merges route location changes into our immutable state.
30
+ * The change is necessitated by moving to react-router-redux@4
31
+ *
32
+ */
33
+
34
+ // Initial routing state
35
+ const routeInitialState = fromJS({
36
+ locationBeforeTransitions: null,
37
+ });
38
+
39
+ /**
40
+ * Merge route into the global application state
41
+ */
42
+ function routeReducer(state = routeInitialState, action) {
43
+ switch (action.type) {
44
+ /* istanbul ignore next */
45
+ case LOCATION_CHANGE:
46
+ return state.merge({
47
+ locationBeforeTransitions: action.payload,
48
+ });
49
+ default:
50
+ return state;
51
+ }
52
+ }
53
+
54
+ /**
55
+ * Creates the main reducer with the asynchronously loaded ones
56
+ */
57
+ export default function createReducer(asyncReducers) {
58
+ return combineReducers({
59
+ route: routeReducer,
60
+ language: languageProviderReducer,
61
+ cap: capReducer,
62
+ app: appReducer,
63
+ create: createSmsReducer,
64
+ edit: editSmsReducer,
65
+ templates: templateReducer,
66
+ tagList: tagsReducer,
67
+ email: emailReducer,
68
+ ebill: ebillReducer,
69
+ beeEditor: beeEditorReducer,
70
+ facebookPreview: CapFacebookPreviewReducer,
71
+ FTP: ftpReducer,
72
+ gallery: galleryReducer,
73
+ navigationConfig: CapCollapsibleLeftNavigationReducer,
74
+ [AIRA_REDUCER_DOMAIN]: askAiraReducer,
75
+ ...asyncReducers,
76
+ });
77
+ }
package/store.js ADDED
@@ -0,0 +1,61 @@
1
+ /**
2
+ * Create the store with asynchronously loaded reducers
3
+ */
4
+
5
+ import { createStore, applyMiddleware, compose } from 'redux';
6
+ import { fromJS } from 'immutable';
7
+ import { routerMiddleware } from 'react-router-redux';
8
+ import createSagaMiddleware from 'redux-saga';
9
+ // import { createMiddleware } from 'redux-beacon';
10
+ // import { logger } from 'redux-beacon/extensions/logger';
11
+ // import { GoogleTagManager } from 'redux-beacon/targets/google-tag-manager';
12
+ import createReducer from './reducers';
13
+ // import eventsMap from './gtm/eventDefinitionsMap';
14
+
15
+ const sagaMiddleware = createSagaMiddleware();
16
+ // const gtmMiddleware = createMiddleware(eventsMap, GoogleTagManager());
17
+
18
+ export default function configureStore(initialState = {}, history) {
19
+ const middlewares = [
20
+ sagaMiddleware,
21
+ routerMiddleware(history),
22
+ ];
23
+
24
+ const enhancers = [
25
+ applyMiddleware(...middlewares),
26
+ ];
27
+
28
+ // If Redux DevTools Extension is installed use it, otherwise use Redux compose
29
+ /* eslint-disable no-underscore-dangle */
30
+ const composeEnhancers =
31
+ process.env.NODE_ENV !== 'production' &&
32
+ typeof window === 'object' &&
33
+ window.__REDUX_DEVTOOLS_EXTENSION_COMPOSE__ ?
34
+ window.__REDUX_DEVTOOLS_EXTENSION_COMPOSE__ : compose;
35
+ /* eslint-enable */
36
+
37
+ const store = createStore(
38
+ createReducer(),
39
+ fromJS(initialState),
40
+ composeEnhancers(...enhancers)
41
+ );
42
+
43
+ // Extensions
44
+ store.runSaga = sagaMiddleware.run;
45
+ store.asyncReducers = {}; // Async reducer registry
46
+
47
+ // Make reducers hot reloadable, see http://mxs.is/googmo
48
+ /* istanbul ignore next */
49
+ if (module.hot) {
50
+ module.hot.accept('./reducers', () => {
51
+ import('./reducers').then((reducerModule) => {
52
+ const createReducers = reducerModule.default;
53
+ const nextReducers = createReducers(store.asyncReducers);
54
+
55
+ store.replaceReducer(nextReducers);
56
+ });
57
+ });
58
+ }
59
+
60
+ return store;
61
+ }
@@ -0,0 +1,173 @@
1
+ /**
2
+ * Test async injectors
3
+ */
4
+
5
+ import { memoryHistory } from 'react-router';
6
+ import { put } from 'redux-saga/effects';
7
+ import { fromJS } from 'immutable';
8
+
9
+ import configureStore from 'store';
10
+
11
+ import {
12
+ injectAsyncReducer,
13
+ injectAsyncSagas,
14
+ getAsyncInjectors,
15
+ } from '../asyncInjectors';
16
+
17
+ // Fixtures
18
+
19
+ const initialState = fromJS({ reduced: 'soon' });
20
+
21
+ const reducer = (state = initialState, action) => {
22
+ switch (action.type) {
23
+ case 'TEST':
24
+ return state.set('reduced', action.payload);
25
+ default:
26
+ return state;
27
+ }
28
+ };
29
+
30
+ function* testSaga() {
31
+ yield put({ type: 'TEST', payload: 'yup' });
32
+ }
33
+
34
+ const sagas = [
35
+ testSaga,
36
+ ];
37
+
38
+ describe('asyncInjectors', () => {
39
+ let store;
40
+
41
+ describe('getAsyncInjectors', () => {
42
+ beforeAll(() => {
43
+ store = configureStore({}, memoryHistory);
44
+ });
45
+
46
+ it('given a store, should return all async injectors', () => {
47
+ const { injectReducer, injectSagas } = getAsyncInjectors(store);
48
+
49
+ injectReducer('test', reducer);
50
+ injectSagas(sagas);
51
+
52
+ const actual = store.getState().get('test');
53
+ const expected = initialState.merge({ reduced: 'yup' });
54
+
55
+ expect(actual.toJS()).toEqual(expected.toJS());
56
+ });
57
+
58
+ it('should throw if passed invalid store shape', () => {
59
+ let result = false;
60
+
61
+ Reflect.deleteProperty(store, 'dispatch');
62
+
63
+ try {
64
+ getAsyncInjectors(store);
65
+ } catch (err) {
66
+ result = err.name === 'Invariant Violation';
67
+ }
68
+
69
+ expect(result).toEqual(true);
70
+ });
71
+ });
72
+
73
+ describe('helpers', () => {
74
+ beforeAll(() => {
75
+ store = configureStore({}, memoryHistory);
76
+ });
77
+
78
+ describe('injectAsyncReducer', () => {
79
+ it('given a store, it should provide a function to inject a reducer', () => {
80
+ const injectReducer = injectAsyncReducer(store);
81
+
82
+ injectReducer('test', reducer);
83
+
84
+ const actual = store.getState().get('test');
85
+ const expected = initialState;
86
+
87
+ expect(actual.toJS()).toEqual(expected.toJS());
88
+ });
89
+
90
+ it('should not assign reducer if already existing', () => {
91
+ const injectReducer = injectAsyncReducer(store);
92
+
93
+ injectReducer('test', reducer);
94
+ injectReducer('test', () => {});
95
+
96
+ expect(store.asyncReducers.test.toString()).toEqual(reducer.toString());
97
+ });
98
+
99
+ it('should throw if passed invalid name', () => {
100
+ let result = false;
101
+
102
+ const injectReducer = injectAsyncReducer(store);
103
+
104
+ try {
105
+ injectReducer('', reducer);
106
+ } catch (err) {
107
+ result = err.name === 'Invariant Violation';
108
+ }
109
+
110
+ try {
111
+ injectReducer(999, reducer);
112
+ } catch (err) {
113
+ result = err.name === 'Invariant Violation';
114
+ }
115
+
116
+ expect(result).toEqual(true);
117
+ });
118
+
119
+ it('should throw if passed invalid reducer', () => {
120
+ let result = false;
121
+
122
+ const injectReducer = injectAsyncReducer(store);
123
+
124
+ try {
125
+ injectReducer('bad', 'nope');
126
+ } catch (err) {
127
+ result = err.name === 'Invariant Violation';
128
+ }
129
+
130
+ try {
131
+ injectReducer('coolio', 12345);
132
+ } catch (err) {
133
+ result = err.name === 'Invariant Violation';
134
+ }
135
+
136
+ expect(result).toEqual(true);
137
+ });
138
+ });
139
+
140
+ describe('injectAsyncSagas', () => {
141
+ it('given a store, it should provide a function to inject a saga', () => {
142
+ const injectSagas = injectAsyncSagas(store);
143
+
144
+ injectSagas(sagas);
145
+
146
+ const actual = store.getState().get('test');
147
+ const expected = initialState.merge({ reduced: 'yup' });
148
+
149
+ expect(actual.toJS()).toEqual(expected.toJS());
150
+ });
151
+
152
+ it('should throw if passed invalid saga', () => {
153
+ let result = false;
154
+
155
+ const injectSagas = injectAsyncSagas(store);
156
+
157
+ try {
158
+ injectSagas({ testSaga });
159
+ } catch (err) {
160
+ result = err.name === 'Invariant Violation';
161
+ }
162
+
163
+ try {
164
+ injectSagas(testSaga);
165
+ } catch (err) {
166
+ result = err.name === 'Invariant Violation';
167
+ }
168
+
169
+ expect(result).toEqual(true);
170
+ });
171
+ });
172
+ });
173
+ });
@@ -155,6 +155,7 @@ export function SlideBoxContent(props) {
155
155
  moduleType,
156
156
  showLiquidErrorInFooter,
157
157
  creativesMode,
158
+ hostName = '',
158
159
  } = props;
159
160
  const type = (messageDetails.type || '').toLowerCase(); // type is context in get tags values : outbound | dvs | referral | loyalty | coupons
160
161
  const query = { type: !isFullMode && 'embedded', module: isFullMode ? 'default' : 'library', isEditFromCampaigns: (templateData || {}).isEditFromCampaigns};
@@ -543,6 +544,7 @@ export function SlideBoxContent(props) {
543
544
  query,
544
545
  search: '',
545
546
  }}
547
+ hostName={hostName}
546
548
  />
547
549
  }
548
550
  {
@@ -924,5 +926,6 @@ SlideBoxContent.propTypes = {
924
926
  moduleType: PropTypes.string,
925
927
  showLiquidErrorInFooter: PropTypes.bool,
926
928
  creativesMode: PropTypes.string,
929
+ hostName: PropTypes.string,
927
930
  };
928
931
  export default SlideBoxContent;
@@ -1319,6 +1319,7 @@ export class Creatives extends React.Component {
1319
1319
  moduleType={this.props.messageDetails?.type}
1320
1320
  showLiquidErrorInFooter={this.showLiquidErrorInFooter}
1321
1321
  creativesMode={creativesMode} // An existing prop that we're using here. Required to ensure correct account details in Edit or Preview in case of Embedded mode.
1322
+ hostName={this.props?.hostName || ''}
1322
1323
  />
1323
1324
  }
1324
1325
  footer={this.shouldShowFooter() &&
@@ -1377,6 +1378,7 @@ Creatives.propTypes = {
1377
1378
  selectedAccount: PropTypes.object,
1378
1379
  strategy: PropTypes.string,
1379
1380
  orgUnitId: PropTypes.number,
1381
+ hostName: PropTypes.string,
1380
1382
  };
1381
1383
  const mapStatesToProps = () => createStructuredSelector({
1382
1384
  isLoading: isLoadingSelector(),
@@ -14,6 +14,7 @@ exports[`Test SlideBoxContent container campaign message, add creative click rcs
14
14
  currentChannel="RCS"
15
15
  getFormData={[Function]}
16
16
  handleClose={[Function]}
17
+ hostName=""
17
18
  onCallTaskSubmit={[Function]}
18
19
  onChannelChange={[Function]}
19
20
  onCreateComplete={[MockFunction]}
@@ -90,6 +91,7 @@ exports[`Test SlideBoxContent container campaign message, add creative click wha
90
91
  currentChannel="WHATSAPP"
91
92
  getFormData={[Function]}
92
93
  handleClose={[Function]}
94
+ hostName=""
93
95
  onCallTaskSubmit={[Function]}
94
96
  onChannelChange={[Function]}
95
97
  onCreateComplete={[MockFunction]}
@@ -166,6 +168,7 @@ exports[`Test SlideBoxContent container campaign message, whatsapp edit all data
166
168
  currentChannel="WHATSAPP"
167
169
  getFormData={[Function]}
168
170
  handleClose={[Function]}
171
+ hostName=""
169
172
  onCallTaskSubmit={[Function]}
170
173
  onChannelChange={[Function]}
171
174
  onCreateComplete={[MockFunction]}
@@ -246,6 +249,7 @@ exports[`Test SlideBoxContent container campaign message, whatsapp edit min data
246
249
  currentChannel="WHATSAPP"
247
250
  getFormData={[Function]}
248
251
  handleClose={[Function]}
252
+ hostName=""
249
253
  onCallTaskSubmit={[Function]}
250
254
  onChannelChange={[Function]}
251
255
  onCreateComplete={[MockFunction]}
@@ -326,6 +330,7 @@ exports[`Test SlideBoxContent container it should clear the url, on channel chan
326
330
  currentChannel="WHATSAPP"
327
331
  getFormData={[Function]}
328
332
  handleClose={[Function]}
333
+ hostName=""
329
334
  onCallTaskSubmit={[Function]}
330
335
  onChannelChange={[Function]}
331
336
  onCreateComplete={[MockFunction]}
@@ -0,0 +1,7 @@
1
+ /*
2
+ *
3
+ * Dashboard constants
4
+ *
5
+ */
6
+
7
+ export const DEFAULT_ACTION = 'app/v2Containers/TestPage/DEFAULT_ACTION';
@@ -0,0 +1,31 @@
1
+
2
+ import React from "react";
3
+ import SmsTest from '../../v2Components/SmsTest';
4
+
5
+ export default class TestPage extends React.PureComponent { // eslint-disable-line react/prefer-stateless-function
6
+ render() {
7
+ return (
8
+ <SmsTest />
9
+ );
10
+ }
11
+ }
12
+
13
+ // const schema = {
14
+ // title: "Todo",
15
+ // type: "object",
16
+ // required: ["title"],
17
+ // properties: {
18
+ // title: {type: "string", title: "Title", default: "A new task"},
19
+ // done: {type: "boolean", title: "Done?", default: false},
20
+ // },
21
+ // };
22
+
23
+ // const log = (type) => console.log.bind(console, type);
24
+
25
+ // render((
26
+ // <div>
27
+ // <SmsTest
28
+ // />
29
+ // </div>
30
+ // ), document.getElementById("app"));
31
+ //export default TestPage;
@@ -0,0 +1,13 @@
1
+ /*
2
+ * NotFoundPage Messages
3
+ *
4
+ * This contains all the text for the NotFoundPage component.
5
+ */
6
+ import { defineMessages } from 'react-intl';
7
+
8
+ export default defineMessages({
9
+ header: {
10
+ id: 'creatives.containersV2.TestPage.header',
11
+ defaultMessage: 'Looks like youas are lost!',
12
+ },
13
+ });
@@ -0,0 +1,21 @@
1
+ /*
2
+ *
3
+ * Dashboard reducer
4
+ *
5
+ */
6
+
7
+ import { fromJS } from 'immutable';
8
+ import { DEFAULT_ACTION } from './constants';
9
+
10
+ const initialState = fromJS({});
11
+
12
+ function TestPageReducer(state = initialState, action) {
13
+ switch (action.type) {
14
+ case DEFAULT_ACTION:
15
+ return state;
16
+ default:
17
+ return state;
18
+ }
19
+ }
20
+
21
+ export default TestPageReducer;
@@ -0,0 +1,11 @@
1
+ // import { take, call, put, select } from 'redux-saga/effects';
2
+
3
+ // Individual exports for testing
4
+ export function* defaultSaga() {
5
+ // See example in v2Containers/HomePage/sagas.js
6
+ }
7
+
8
+ // All sagas to be loaded
9
+ export default [
10
+ defaultSaga,
11
+ ];
@@ -0,0 +1,15 @@
1
+ /*
2
+ *
3
+ * Testv2 actions
4
+ *
5
+ */
6
+
7
+ import {
8
+ DEFAULT_ACTION,
9
+ } from './constants';
10
+
11
+ export function defaultAction() {
12
+ return {
13
+ type: DEFAULT_ACTION,
14
+ };
15
+ }
@@ -0,0 +1,7 @@
1
+ /*
2
+ *
3
+ * Testv2 constants
4
+ *
5
+ */
6
+
7
+ export const DEFAULT_ACTION = 'app/Testv2/DEFAULT_ACTION';
@@ -0,0 +1,47 @@
1
+ /*
2
+ *
3
+ * Testv2
4
+ *
5
+ */
6
+
7
+ import PropTypes from 'prop-types';
8
+
9
+ import React from 'react';
10
+ import { connect } from 'react-redux';
11
+ import Helmet from 'react-helmet';
12
+ import { FormattedMessage } from 'react-intl';
13
+ import { createStructuredSelector } from 'reselect';
14
+ import makeSelectTestv2 from './selectors';
15
+ import messages from './messages';
16
+
17
+ export class Testv2 extends React.Component { // eslint-disable-line react/prefer-stateless-function
18
+ render() {
19
+ return (
20
+ <div>
21
+ <Helmet
22
+ title={<FormattedMessage {...messages.testv2} />}
23
+ meta={[
24
+ { name: 'description', content: <FormattedMessage {...messages.descriptionTestv2} /> },
25
+ ]}
26
+ />
27
+ <FormattedMessage {...messages.header} />
28
+ </div>
29
+ );
30
+ }
31
+ }
32
+
33
+ Testv2.propTypes = {
34
+ dispatch: PropTypes.func.isRequired,
35
+ };
36
+
37
+ const mapStateToProps = createStructuredSelector({
38
+ Testv2: makeSelectTestv2(),
39
+ });
40
+
41
+ function mapDispatchToProps(dispatch) {
42
+ return {
43
+ dispatch,
44
+ };
45
+ }
46
+
47
+ export default connect(mapStateToProps, mapDispatchToProps)(Testv2);
@@ -0,0 +1,21 @@
1
+ /*
2
+ * Testv2 Messages
3
+ *
4
+ * This contains all the text for the Testv2 component.
5
+ */
6
+ import { defineMessages } from 'react-intl';
7
+
8
+ export default defineMessages({
9
+ header: {
10
+ id: 'creatives.containersV2.Testv2.header',
11
+ defaultMessage: 'This is Testv2 container !',
12
+ },
13
+ testv2: {
14
+ id: 'creatives.containersV2.Testv2.testv2',
15
+ defaultMessage: 'Testv2',
16
+ },
17
+ descriptionTestv2: {
18
+ id: 'creatives.containersV2.Testv2.descriptionTestv2',
19
+ defaultMessage: 'Description of Testv2',
20
+ },
21
+ });
@@ -0,0 +1,23 @@
1
+ /*
2
+ *
3
+ * Testv2 reducer
4
+ *
5
+ */
6
+
7
+ import { fromJS } from 'immutable';
8
+ import {
9
+ DEFAULT_ACTION,
10
+ } from './constants';
11
+
12
+ const initialState = fromJS({});
13
+
14
+ function testv2Reducer(state = initialState, action) {
15
+ switch (action.type) {
16
+ case DEFAULT_ACTION:
17
+ return state;
18
+ default:
19
+ return state;
20
+ }
21
+ }
22
+
23
+ export default testv2Reducer;
@@ -0,0 +1,11 @@
1
+ // import { take, call, put, select } from 'redux-saga/effects';
2
+
3
+ // Individual exports for testing
4
+ export function* defaultSaga() {
5
+ // See example in v2Containers/HomePage/sagas.js
6
+ }
7
+
8
+ // All sagas to be loaded
9
+ export default [
10
+ defaultSaga,
11
+ ];
@@ -0,0 +1,25 @@
1
+ import { createSelector } from 'reselect';
2
+
3
+ /**
4
+ * Direct selector to the testv2 state domain
5
+ */
6
+ const selectTestv2Domain = () => (state) => state.get('testv2');
7
+
8
+ /**
9
+ * Other specific selectors
10
+ */
11
+
12
+
13
+ /**
14
+ * Default selector used by Testv2
15
+ */
16
+
17
+ const makeSelectTestv2 = () => createSelector(
18
+ selectTestv2Domain(),
19
+ (substate) => substate.toJS()
20
+ );
21
+
22
+ export default makeSelectTestv2;
23
+ export {
24
+ selectTestv2Domain,
25
+ };
@@ -69,8 +69,9 @@ export const Zalo = (props) => {
69
69
  injectedTags,
70
70
  getFormData,
71
71
  selectedOfferDetails,
72
+ hostName: zaloHostName = '',
72
73
  } = props || {};
73
- const {hostName = ''} = senderDetails;
74
+ const {hostName = zaloHostName || ''} = senderDetails;
74
75
  const { formatMessage } = intl;
75
76
  const [oa_id, setOaId] = useState('');
76
77
  const [token, setToken] = useState('');