@imposium-hub/components 2.6.0-0 → 2.6.0-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 (137) hide show
  1. package/dist/cjs/components/app-wrapper/AppWrapper.d.ts +24 -5
  2. package/dist/cjs/components/app-wrapper/AppWrapper.js +104 -22
  3. package/dist/cjs/components/app-wrapper/AppWrapper.js.map +1 -1
  4. package/dist/cjs/components/assets/StoryTableNameFilter.d.ts +9 -2
  5. package/dist/cjs/components/assets/StoryTableNameFilter.js +3 -13
  6. package/dist/cjs/components/assets/StoryTableNameFilter.js.map +1 -1
  7. package/dist/cjs/components/context-menu/AnimateComponent.d.ts +6 -6
  8. package/dist/cjs/components/context-menu/AnimateComponent.js.map +1 -1
  9. package/dist/cjs/components/context-menu/ContextMenu.d.ts +12 -27
  10. package/dist/cjs/components/context-menu/ContextMenu.js +2 -15
  11. package/dist/cjs/components/context-menu/ContextMenu.js.map +1 -1
  12. package/dist/cjs/components/context-menu/ContextMenuItem.d.ts +6 -18
  13. package/dist/cjs/components/context-menu/ContextMenuItem.js +2 -21
  14. package/dist/cjs/components/context-menu/ContextMenuItem.js.map +1 -1
  15. package/dist/cjs/components/context-menu/ContextMenuTrigger.d.ts +6 -16
  16. package/dist/cjs/components/context-menu/ContextMenuTrigger.js +2 -20
  17. package/dist/cjs/components/context-menu/ContextMenuTrigger.js.map +1 -1
  18. package/dist/cjs/components/context-menu/SubMenu.d.ts +4 -12
  19. package/dist/cjs/components/context-menu/SubMenu.js +2 -17
  20. package/dist/cjs/components/context-menu/SubMenu.js.map +1 -1
  21. package/dist/cjs/components/data-table/Paginator.d.ts +16 -1
  22. package/dist/cjs/components/data-table/Paginator.js +1 -1
  23. package/dist/cjs/components/data-table/Paginator.js.map +1 -1
  24. package/dist/cjs/components/font-picker/font-manager/constants.d.ts +4 -0
  25. package/dist/cjs/components/font-picker/font-manager/constants.js +5 -1
  26. package/dist/cjs/components/font-picker/font-manager/constants.js.map +1 -1
  27. package/dist/cjs/components/header/Header.d.ts +3 -5
  28. package/dist/cjs/components/header/Header.js +77 -126
  29. package/dist/cjs/components/header/Header.js.map +1 -1
  30. package/dist/cjs/components/header/ProjectDropdown.d.ts +13 -0
  31. package/dist/cjs/components/header/ProjectDropdown.js +128 -0
  32. package/dist/cjs/components/header/ProjectDropdown.js.map +1 -0
  33. package/dist/cjs/components/header/StoryDropdown.d.ts +6 -0
  34. package/dist/cjs/components/header/StoryDropdown.js +111 -0
  35. package/dist/cjs/components/header/StoryDropdown.js.map +1 -0
  36. package/dist/cjs/components/portal/Portal.d.ts +0 -2
  37. package/dist/cjs/components/portal/Portal.js.map +1 -1
  38. package/dist/cjs/components/publish-wizard/PublishWizard.d.ts +1 -3
  39. package/dist/cjs/components/publish-wizard/PublishWizard.js.map +1 -1
  40. package/dist/cjs/components/publish-wizard/publish/EmailWorkflow.js.map +1 -1
  41. package/dist/cjs/constants/copy.d.ts +3 -0
  42. package/dist/cjs/constants/copy.js +3 -0
  43. package/dist/cjs/constants/copy.js.map +1 -1
  44. package/dist/cjs/index.d.ts +3 -1
  45. package/dist/cjs/index.js +9 -3
  46. package/dist/cjs/index.js.map +1 -1
  47. package/dist/cjs/services/API.d.ts +5 -2
  48. package/dist/cjs/services/API.js +198 -75
  49. package/dist/cjs/services/API.js.map +1 -1
  50. package/dist/cjs/utils/modal.d.ts +2 -0
  51. package/dist/cjs/utils/modal.js +11 -0
  52. package/dist/cjs/utils/modal.js.map +1 -0
  53. package/dist/cjs/utils/pendo.d.ts +24 -0
  54. package/dist/cjs/utils/pendo.js +62 -0
  55. package/dist/cjs/utils/pendo.js.map +1 -0
  56. package/dist/cjs/utils/routing.d.ts +2 -0
  57. package/dist/cjs/utils/routing.js +10 -1
  58. package/dist/cjs/utils/routing.js.map +1 -1
  59. package/dist/esm/components/app-wrapper/AppWrapper.d.ts +24 -5
  60. package/dist/esm/components/app-wrapper/AppWrapper.js +97 -19
  61. package/dist/esm/components/app-wrapper/AppWrapper.js.map +1 -1
  62. package/dist/esm/components/assets/StoryTableNameFilter.d.ts +9 -2
  63. package/dist/esm/components/assets/StoryTableNameFilter.js +3 -13
  64. package/dist/esm/components/assets/StoryTableNameFilter.js.map +1 -1
  65. package/dist/esm/components/context-menu/AnimateComponent.d.ts +6 -6
  66. package/dist/esm/components/context-menu/AnimateComponent.js.map +1 -1
  67. package/dist/esm/components/context-menu/ContextMenu.d.ts +12 -27
  68. package/dist/esm/components/context-menu/ContextMenu.js +2 -4
  69. package/dist/esm/components/context-menu/ContextMenu.js.map +1 -1
  70. package/dist/esm/components/context-menu/ContextMenuItem.d.ts +6 -18
  71. package/dist/esm/components/context-menu/ContextMenuItem.js +2 -10
  72. package/dist/esm/components/context-menu/ContextMenuItem.js.map +1 -1
  73. package/dist/esm/components/context-menu/ContextMenuTrigger.d.ts +6 -16
  74. package/dist/esm/components/context-menu/ContextMenuTrigger.js +2 -9
  75. package/dist/esm/components/context-menu/ContextMenuTrigger.js.map +1 -1
  76. package/dist/esm/components/context-menu/SubMenu.d.ts +4 -12
  77. package/dist/esm/components/context-menu/SubMenu.js +2 -6
  78. package/dist/esm/components/context-menu/SubMenu.js.map +1 -1
  79. package/dist/esm/components/data-table/Paginator.d.ts +16 -1
  80. package/dist/esm/components/data-table/Paginator.js +1 -1
  81. package/dist/esm/components/data-table/Paginator.js.map +1 -1
  82. package/dist/esm/components/font-picker/font-manager/constants.d.ts +4 -0
  83. package/dist/esm/components/font-picker/font-manager/constants.js +4 -0
  84. package/dist/esm/components/font-picker/font-manager/constants.js.map +1 -1
  85. package/dist/esm/components/header/Header.d.ts +3 -5
  86. package/dist/esm/components/header/Header.js +75 -115
  87. package/dist/esm/components/header/Header.js.map +1 -1
  88. package/dist/esm/components/header/ProjectDropdown.d.ts +13 -0
  89. package/dist/esm/components/header/ProjectDropdown.js +101 -0
  90. package/dist/esm/components/header/ProjectDropdown.js.map +1 -0
  91. package/dist/esm/components/header/StoryDropdown.d.ts +6 -0
  92. package/dist/esm/components/header/StoryDropdown.js +82 -0
  93. package/dist/esm/components/header/StoryDropdown.js.map +1 -0
  94. package/dist/esm/components/portal/Portal.d.ts +0 -2
  95. package/dist/esm/components/portal/Portal.js.map +1 -1
  96. package/dist/esm/components/publish-wizard/PublishWizard.d.ts +1 -3
  97. package/dist/esm/components/publish-wizard/PublishWizard.js.map +1 -1
  98. package/dist/esm/components/publish-wizard/publish/EmailWorkflow.js.map +1 -1
  99. package/dist/esm/constants/copy.d.ts +3 -0
  100. package/dist/esm/constants/copy.js +3 -0
  101. package/dist/esm/constants/copy.js.map +1 -1
  102. package/dist/esm/index.d.ts +3 -1
  103. package/dist/esm/index.js +3 -1
  104. package/dist/esm/index.js.map +1 -1
  105. package/dist/esm/services/API.d.ts +5 -2
  106. package/dist/esm/services/API.js +43 -18
  107. package/dist/esm/services/API.js.map +1 -1
  108. package/dist/esm/utils/modal.d.ts +2 -0
  109. package/dist/esm/utils/modal.js +7 -0
  110. package/dist/esm/utils/modal.js.map +1 -0
  111. package/dist/esm/utils/pendo.d.ts +24 -0
  112. package/dist/esm/utils/pendo.js +52 -0
  113. package/dist/esm/utils/pendo.js.map +1 -0
  114. package/dist/esm/utils/routing.d.ts +2 -0
  115. package/dist/esm/utils/routing.js +7 -0
  116. package/dist/esm/utils/routing.js.map +1 -1
  117. package/package.json +3 -1
  118. package/src/components/app-wrapper/AppWrapper.tsx +155 -26
  119. package/src/components/assets/StoryTableNameFilter.tsx +6 -22
  120. package/src/components/context-menu/AnimateComponent.tsx +12 -1
  121. package/src/components/context-menu/ContextMenu.tsx +16 -8
  122. package/src/components/context-menu/ContextMenuItem.tsx +12 -11
  123. package/src/components/context-menu/ContextMenuTrigger.tsx +12 -10
  124. package/src/components/context-menu/SubMenu.tsx +6 -8
  125. package/src/components/data-table/Paginator.tsx +19 -6
  126. package/src/components/font-picker/font-manager/constants.ts +5 -0
  127. package/src/components/header/Header.tsx +103 -190
  128. package/src/components/header/ProjectDropdown.tsx +174 -0
  129. package/src/components/portal/Portal.tsx +1 -2
  130. package/src/components/publish-wizard/PublishWizard.tsx +1 -1
  131. package/src/components/publish-wizard/publish/EmailWorkflow.tsx +7 -1
  132. package/src/constants/copy.ts +3 -0
  133. package/src/index.ts +5 -0
  134. package/src/services/API.ts +51 -20
  135. package/src/utils/modal.ts +9 -0
  136. package/src/utils/pendo.ts +61 -0
  137. package/src/utils/routing.ts +10 -0
@@ -0,0 +1,174 @@
1
+ import { useEffect, useState } from 'react';
2
+ import ImposiumDropdown from '../dropdown/Dropdown';
3
+ import StoryTableNameFilter from '../assets/StoryTableNameFilter';
4
+ import { StoryTableTotalRendersCell } from '../assets/StoryTableTotalRendersCell';
5
+ import React from 'react';
6
+ import AssetsTableDateCell from '../assets/AssetsTableDateCell';
7
+ import DataTable from '../data-table/DataTable';
8
+ import { ImposiumHeader } from '../..';
9
+ import _ from 'lodash';
10
+
11
+ interface IProjectDropdownProps {
12
+ position: any;
13
+ api: any;
14
+ toggleRef: any;
15
+ show: boolean;
16
+ storiesArray: any;
17
+ changeStory(storyRow: any): void;
18
+ setAccessData(data): void;
19
+ onClose(): void;
20
+ }
21
+
22
+ export const ProjectDropdown = (props: IProjectDropdownProps) => {
23
+ const { toggleRef, changeStory, storiesArray, show, onClose, setAccessData, api, position } =
24
+ props;
25
+
26
+ const [storyFilter, setStoryFilter] = useState({
27
+ name: ''
28
+ });
29
+ const [totalRendersLoading, setTotalRendersLoading] = useState(false);
30
+ const [order] = useState('date_modified');
31
+ const [orderDirection] = useState('desc');
32
+
33
+ if (!storiesArray) {
34
+ return null;
35
+ }
36
+
37
+ useEffect(() => {
38
+ if (show) {
39
+ setTotalRendersLoading(true);
40
+ api.getAccessData(true).then((data) => {
41
+ setAccessData(data);
42
+ setTotalRendersLoading(false);
43
+ });
44
+ }
45
+ }, [show]);
46
+
47
+ const closeProjectDropdown = () => {
48
+ setStoryFilter({
49
+ name: ''
50
+ });
51
+ onClose();
52
+ };
53
+
54
+ const getStoriesColumns = () => {
55
+ return [
56
+ {
57
+ accessor: 'name',
58
+ Header: 'Name',
59
+ width: 115,
60
+ minWidth: 115,
61
+ Search: () => (
62
+ <StoryTableNameFilter
63
+ filter={storyFilter.name}
64
+ updateFilter={setStoryFilter}
65
+ />
66
+ ),
67
+ disableSortBy: false
68
+ },
69
+ {
70
+ accessor: 'total_renders',
71
+ Header: 'Total Renders',
72
+ width: 60,
73
+ minWidth: 60,
74
+ maxWidth: 60,
75
+ disableSortBy: false,
76
+ Cell: (cell: any) => (
77
+ <StoryTableTotalRendersCell
78
+ loading={totalRendersLoading}
79
+ cell={cell}
80
+ date_created={false}
81
+ />
82
+ )
83
+ },
84
+ {
85
+ accessor: 'last_modified_by',
86
+ Header: 'Last Modified By',
87
+ width: 60,
88
+ minWidth: 60,
89
+ maxWidth: 60,
90
+ disableSortBy: true
91
+ },
92
+ {
93
+ accessor: 'date_modified',
94
+ Header: 'Last Modified',
95
+ width: 65,
96
+ minWidth: 65,
97
+ maxWidth: 65,
98
+ disableSortBy: false,
99
+ Cell: (cell: any) => (
100
+ <AssetsTableDateCell
101
+ cell={cell}
102
+ date_created={false}
103
+ />
104
+ )
105
+ },
106
+ {
107
+ accessor: 'date_created',
108
+ Header: 'Created Date',
109
+ width: 65,
110
+ minWidth: 65,
111
+ maxWidth: 65,
112
+ disableSortBy: false,
113
+ Cell: (cell: any) => (
114
+ <AssetsTableDateCell
115
+ cell={cell}
116
+ date_created={true}
117
+ />
118
+ )
119
+ }
120
+ ];
121
+ };
122
+
123
+ const sortBy =
124
+ order && orderDirection ? [{ id: order, desc: orderDirection === 'desc' }] : undefined;
125
+
126
+ let sortedStories = _.orderBy(storiesArray, ['date_modified'], ['desc']);
127
+
128
+ if (storyFilter.name) {
129
+ const storyFilterLowercase = storyFilter.name.toLowerCase();
130
+
131
+ sortedStories = sortedStories.filter((stories) =>
132
+ stories.name.toLowerCase().includes(storyFilterLowercase)
133
+ );
134
+
135
+ const sortById = sortedStories.filter((stories) =>
136
+ stories.id.includes(storyFilterLowercase)
137
+ );
138
+
139
+ if (sortById.length > 0) {
140
+ sortedStories = sortById;
141
+ }
142
+ }
143
+
144
+ const onRowClick = (r: any) => {
145
+ onClose();
146
+ changeStory(r);
147
+ };
148
+
149
+ return (
150
+ <>
151
+ <ImposiumDropdown
152
+ key='stories-dropdown'
153
+ position={position}
154
+ show={show}
155
+ toggleRef={toggleRef}
156
+ onOutsideClick={closeProjectDropdown}>
157
+ <div className='stories-menu'>
158
+ {
159
+ <DataTable
160
+ columns={getStoriesColumns()}
161
+ data={sortedStories}
162
+ sortBy={sortBy}
163
+ noDataText={ImposiumHeader.NO_STORIES_COPY}
164
+ itemsPerPage={storiesArray.length}
165
+ hidePaginator={true}
166
+ onRowClick={onRowClick}
167
+ keyboardNav={true}
168
+ />
169
+ }
170
+ </div>
171
+ </ImposiumDropdown>
172
+ </>
173
+ );
174
+ };
@@ -1,4 +1,4 @@
1
- import { ReactNode, ReactPortal } from 'react';
1
+ import { ReactPortal } from 'react';
2
2
  import { useEffect } from 'react';
3
3
  import { createPortal } from 'react-dom';
4
4
 
@@ -7,7 +7,6 @@ import { createPortal } from 'react-dom';
7
7
  // Just wrap desired element in <Portal>{YourElement}</Portal>
8
8
 
9
9
  interface IPortalProps {
10
- children: ReactNode;
11
10
  id: string;
12
11
  }
13
12
 
@@ -779,7 +779,7 @@ export const BigButton: React.FC<IBigButtonProps> = (p) => (
779
779
  </div>
780
780
  );
781
781
 
782
- export const TabContent = ({ children }) => (
782
+ export const TabContent: React.FC = ({ children }) => (
783
783
  <div className='tab-content'>
784
784
  <div className='settings-tab'>
785
785
  <div className='integration-details'>{children}</div>
@@ -876,7 +876,13 @@ const mapStateToProps = (state): any => {
876
876
  };
877
877
  };
878
878
 
879
- const CrMOptions = ({ options, onChange, errorCopy = '' }) => {
879
+ interface ICrMOptionsProps {
880
+ options: any;
881
+ onChange(options: any): void;
882
+ errorCopy: string;
883
+ }
884
+
885
+ const CrMOptions: React.FC<ICrMOptionsProps> = ({ options, onChange, errorCopy = '' }) => {
880
886
  const onInputChange = (key, val) => {
881
887
  const newOpts = { ...options };
882
888
  newOpts[key] = val;
@@ -238,6 +238,9 @@ export const integration = {
238
238
  };
239
239
 
240
240
  export const header = {
241
+ noSave: `Don't Save`,
242
+ onSave: 'Save',
243
+ checkUnsaved: 'You have unsaved changes, would you like to save and continue?',
241
244
  publishing: 'Publishing...',
242
245
  working: 'Using Working Copy',
243
246
  statusError: 'Error getting project status',
package/src/index.ts CHANGED
@@ -159,8 +159,13 @@ import { resetStoryFilter, updateStoryFilter } from './redux/actions/story-filte
159
159
  import storyFilter from './redux/reducers/story-filter';
160
160
  import StoryTableNameFilter from './components/assets/StoryTableNameFilter';
161
161
  import { AppWrapper } from './components/app-wrapper/AppWrapper';
162
+ import { pushRoute, replaceRoute } from './utils/routing';
163
+ import { ProjectDropdown } from './components/header/ProjectDropdown';
162
164
 
163
165
  export {
166
+ ProjectDropdown,
167
+ pushRoute,
168
+ replaceRoute,
164
169
  AppWrapper,
165
170
  ImposiumHeader,
166
171
  ImposiumDropdown,
@@ -8,8 +8,10 @@ import axios, {
8
8
  } from 'axios';
9
9
  import { isObjEmpty } from '../Util';
10
10
  import { JOB_TYPES } from '../constants/api';
11
+ import { API_AUTH_TYPES } from '../components/font-picker/font-manager/constants';
11
12
 
12
13
  export interface IImposiumAPI {
14
+ init(baseUrl: string, credentials: any, orgId?: string);
13
15
  getAssets(filters: any, storyId: string, unprocessed?: boolean, showVariables?: boolean);
14
16
  getAssetItem(assetId: string);
15
17
  uploadAsset(
@@ -145,7 +147,7 @@ export interface IImposiumAPI {
145
147
  getAssetMap(storyId: string);
146
148
  clearStoryCache(storyId: string);
147
149
  debugId(id: string);
148
- cacheActiveStory(serviceId: string, orgId: string, storyId: string);
150
+ cacheActiveStory(serviceId: any, orgId: string, storyId: string);
149
151
  getCachedStoryForOrg(serviceId: string, orgId: string);
150
152
  getAccessData(includeTotalRenders?: boolean, orgId?: string);
151
153
  }
@@ -183,38 +185,51 @@ export default class API {
183
185
 
184
186
  private cancelTokens: object = {};
185
187
 
186
- constructor(baseURL: string, idToken: string, organizationId?: string) {
188
+ private getToken;
189
+
190
+ private authType;
191
+
192
+ public init(baseURL: string, credentials: any, organizationId?: string): void {
187
193
  // JWT
188
194
  const headers = {
189
- 'Authorization': `Bearer ${idToken}`,
190
195
  'X-Imposium-API-Version': '2.0.2'
191
- // 'X-Imposium-Account-Id': organizationId || ''
192
196
  };
193
197
 
194
198
  if (organizationId) {
195
199
  headers['X-Imposium-Account-Id'] = organizationId;
196
200
  }
197
- if (idToken) {
198
- this.http = axios.create({
199
- baseURL,
200
- headers
201
- });
202
201
 
203
- // Basic Access Key
204
- } else {
202
+ // If the token is a string, it's an accessKey, so use the X-Imposium-Access-Key header
203
+ if (typeof credentials === 'string') {
204
+ this.authType = API_AUTH_TYPES.ACCESS_KEY;
205
205
  this.http = axios.create({
206
206
  baseURL,
207
207
  headers: {
208
- 'X-Imposium-Access-Key': `${idToken}`,
208
+ 'X-Imposium-Access-Key': `${credentials}`,
209
209
  'X-Imposium-API-Version': '2.0.0'
210
210
  }
211
211
  });
212
+ } else {
213
+ this.authType = API_AUTH_TYPES.TOKEN;
214
+ this.http = axios.create({
215
+ baseURL,
216
+ headers
217
+ });
212
218
  }
213
219
 
220
+ this.getToken = credentials;
214
221
  this.awsHttp = axios.create();
215
222
  }
216
223
 
217
- private doRequest = (config: AxiosRequestConfig, reqAlias: string = ''): Promise<any> => {
224
+ private doRequest = async (config: AxiosRequestConfig, reqAlias: string = ''): Promise<any> => {
225
+ if (this.authType === API_AUTH_TYPES.TOKEN) {
226
+ const token = await this.getToken();
227
+ const headers = {
228
+ Authorization: `Bearer ${token}`
229
+ };
230
+ config.headers = headers;
231
+ }
232
+
218
233
  return new Promise((resolve, reject) => {
219
234
  this.http(config)
220
235
  .then((res: AxiosResponse) => {
@@ -1024,11 +1039,19 @@ export default class API {
1024
1039
  };
1025
1040
 
1026
1041
  return new Promise((resolve, reject) => {
1027
- this.pollForJob(config, resolve, reject);
1042
+ void this.pollForJob(config, resolve, reject);
1028
1043
  });
1029
1044
  };
1030
1045
 
1031
- private pollForJob = (config, resolve, reject) => {
1046
+ private pollForJob = async (config, resolve, reject) => {
1047
+ if (this.authType === API_AUTH_TYPES.TOKEN) {
1048
+ const token = await this.getToken();
1049
+ const headers = {
1050
+ Authorization: `Bearer ${token}`
1051
+ };
1052
+ config.headers = headers;
1053
+ }
1054
+
1032
1055
  this.http(config)
1033
1056
  .then((res: AxiosResponse) => {
1034
1057
  const {
@@ -1041,7 +1064,7 @@ export default class API {
1041
1064
  resolve(res.data);
1042
1065
  } else {
1043
1066
  this.jobPollTimer = setTimeout(() => {
1044
- this.pollForJob(config, resolve, reject);
1067
+ void this.pollForJob(config, resolve, reject);
1045
1068
  }, this.pollingInterval);
1046
1069
  }
1047
1070
  })
@@ -1050,7 +1073,15 @@ export default class API {
1050
1073
  });
1051
1074
  };
1052
1075
 
1053
- private pollForExperience = (config, resolve, reject) => {
1076
+ private pollForExperience = async (config, resolve, reject) => {
1077
+ if (this.authType === API_AUTH_TYPES.TOKEN) {
1078
+ const token = await this.getToken();
1079
+ const headers = {
1080
+ Authorization: `Bearer ${token}`
1081
+ };
1082
+ config.headers = headers;
1083
+ }
1084
+
1054
1085
  this.http(config)
1055
1086
  .then((res: AxiosResponse) => {
1056
1087
  if (res.data.status === 'failed') {
@@ -1060,14 +1091,14 @@ export default class API {
1060
1091
  } else if (res.data.output !== undefined) {
1061
1092
  if (isObjEmpty(res.data.output)) {
1062
1093
  this.experiencePollTimer = setTimeout(() => {
1063
- this.pollForExperience(config, resolve, reject);
1094
+ void this.pollForExperience(config, resolve, reject);
1064
1095
  }, this.pollingInterval);
1065
1096
  } else {
1066
1097
  resolve(res.data);
1067
1098
  }
1068
1099
  } else {
1069
1100
  this.experiencePollTimer = setTimeout(() => {
1070
- this.pollForExperience(config, resolve, reject);
1101
+ void this.pollForExperience(config, resolve, reject);
1071
1102
  }, this.pollingInterval);
1072
1103
  }
1073
1104
  })
@@ -1189,7 +1220,7 @@ export default class API {
1189
1220
  return this.doRequest(config);
1190
1221
  } else {
1191
1222
  return new Promise((resolve, reject) => {
1192
- this.pollForExperience(config, resolve, reject);
1223
+ void this.pollForExperience(config, resolve, reject);
1193
1224
  });
1194
1225
  }
1195
1226
  };
@@ -0,0 +1,9 @@
1
+ import { IConfirmModalProps } from '../components/confirm-modal/ConfirmModal';
2
+
3
+ export const openConfirmModal = (detail: IConfirmModalProps) => {
4
+ const event = new CustomEvent('openconfirmmodal', {
5
+ detail
6
+ });
7
+
8
+ window.dispatchEvent(event);
9
+ };
@@ -0,0 +1,61 @@
1
+ /**
2
+ * [initPendo description]
3
+ * This initalizes the Pendo Help system in the application
4
+ * The Pendo script should be added to the DOM in `index.html`
5
+ * This function takes the user object and sets some initial information on Pendo for tracking
6
+ * For full documentation of Pendo object please see Pendo Docs
7
+ *
8
+ * To prevent application breaking things, we wrap both groups in a try/catch
9
+ * This allows our Application to work regardless of the status of Pendo
10
+ * *************************************************************
11
+ * We DO NOT WANT TO BREAK OUR APP if a 3rd party script fails
12
+ * *************************************************************
13
+ *
14
+ * @param {object} userInfo User object from crm/v1/user
15
+ * Each application's `user/` endpoint returns slightly different data
16
+ * The `visitor` object will need to be adjusted based on the data returned
17
+ * We should always have access to:
18
+ * id
19
+ * email
20
+ * full_name
21
+ *
22
+ * @return {undefined} Nothing
23
+ */
24
+
25
+ declare const pendo;
26
+
27
+ export const initPendo = (environment, userInfo) => {
28
+ if (/dev/gi.test(environment)) {
29
+ console.info(
30
+ '%cPendo%c is %cdisabled%c for local testing',
31
+ 'color: #e247e5; font-weight:bold;',
32
+ 'color:#fff; font-weight:normal;',
33
+ 'color:red; font-weight:bold;',
34
+ 'color:#fff; font-weight:normal;'
35
+ );
36
+ return;
37
+ }
38
+
39
+ try {
40
+ const visitor = {
41
+ id: userInfo.sub,
42
+ email: userInfo['https://imposium.com/email']
43
+ };
44
+
45
+ /* eslint-disable no-undef */
46
+ pendo.initialize({
47
+ visitor: {
48
+ ...visitor,
49
+ environment,
50
+ product: 'Imposium Project Editor',
51
+ language: navigator.language
52
+ }
53
+ });
54
+ /* eslint-enable no-undef */
55
+ } catch (err) {
56
+ console.groupCollapsed('Pendo Init Problem');
57
+ console.error('Problem Starting up Pendo');
58
+ console.error(err);
59
+ console.groupEnd();
60
+ }
61
+ };
@@ -1,3 +1,13 @@
1
+ import { browserHistory } from 'react-router';
2
+
3
+ export const pushRoute = (route): void => {
4
+ browserHistory.push(route);
5
+ };
6
+
7
+ export const replaceRoute = (route): void => {
8
+ browserHistory.replace(route);
9
+ };
10
+
1
11
  export const getDemoURL = (): string => {
2
12
  const {
3
13
  location: { href }