@amp-labs/react 1.0.0 → 1.0.2

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 (190) hide show
  1. package/README.md +6 -105
  2. package/build/generated-sources/api/src/apis/DefaultApi.d.ts +48 -2
  3. package/build/generated-sources/api/src/apis/DefaultApi.js +51 -1
  4. package/build/generated-sources/api/src/models/BaseConfigContent.d.ts +8 -1
  5. package/build/generated-sources/api/src/models/BaseConfigContent.js +4 -1
  6. package/build/generated-sources/api/src/models/BaseReadConfig.d.ts +1 -1
  7. package/build/generated-sources/api/src/models/BaseReadConfig.js +1 -1
  8. package/build/generated-sources/api/src/models/BaseReadConfigStandardObject.d.ts +2 -2
  9. package/build/generated-sources/api/src/models/BaseReadConfigStandardObject.js +1 -1
  10. package/build/generated-sources/api/src/models/BaseWriteConfig.d.ts +34 -0
  11. package/build/generated-sources/api/src/models/BaseWriteConfig.js +51 -0
  12. package/build/generated-sources/api/src/models/BaseWriteConfigObject.d.ts +31 -0
  13. package/build/generated-sources/api/src/models/BaseWriteConfigObject.js +50 -0
  14. package/build/generated-sources/api/src/models/BatchUpsertIntegrationsRequest.d.ts +1 -1
  15. package/build/generated-sources/api/src/models/BatchUpsertIntegrationsRequest.js +1 -1
  16. package/build/generated-sources/api/src/models/Config.d.ts +1 -1
  17. package/build/generated-sources/api/src/models/Config.js +1 -1
  18. package/build/generated-sources/api/src/models/ConfigContent.d.ts +7 -1
  19. package/build/generated-sources/api/src/models/ConfigContent.js +3 -1
  20. package/build/generated-sources/api/src/models/ConfigContentAllOf.d.ts +7 -1
  21. package/build/generated-sources/api/src/models/ConfigContentAllOf.js +3 -1
  22. package/build/generated-sources/api/src/models/Connection.d.ts +1 -1
  23. package/build/generated-sources/api/src/models/Connection.js +1 -1
  24. package/build/generated-sources/api/src/models/Consumer.d.ts +1 -1
  25. package/build/generated-sources/api/src/models/Consumer.js +1 -1
  26. package/build/generated-sources/api/src/models/CreateConsumerRequest.d.ts +1 -1
  27. package/build/generated-sources/api/src/models/CreateConsumerRequest.js +1 -1
  28. package/build/generated-sources/api/src/models/CreateDestinationRequest.d.ts +1 -1
  29. package/build/generated-sources/api/src/models/CreateDestinationRequest.js +1 -1
  30. package/build/generated-sources/api/src/models/CreateDestinationRequestMetadata.d.ts +1 -1
  31. package/build/generated-sources/api/src/models/CreateDestinationRequestMetadata.js +1 -1
  32. package/build/generated-sources/api/src/models/CreateGroupRequest.d.ts +1 -1
  33. package/build/generated-sources/api/src/models/CreateGroupRequest.js +1 -1
  34. package/build/generated-sources/api/src/models/CreateInstallationRequest.d.ts +1 -1
  35. package/build/generated-sources/api/src/models/CreateInstallationRequest.js +1 -1
  36. package/build/generated-sources/api/src/models/CreateInstallationRequestConfig.d.ts +1 -1
  37. package/build/generated-sources/api/src/models/CreateInstallationRequestConfig.js +1 -1
  38. package/build/generated-sources/api/src/models/CreateIntegrationRequest.d.ts +1 -1
  39. package/build/generated-sources/api/src/models/CreateIntegrationRequest.js +1 -1
  40. package/build/generated-sources/api/src/models/CreateIntegrationRequestLatestRevision.d.ts +1 -1
  41. package/build/generated-sources/api/src/models/CreateIntegrationRequestLatestRevision.js +1 -1
  42. package/build/generated-sources/api/src/models/CreateProjectRequest.d.ts +1 -1
  43. package/build/generated-sources/api/src/models/CreateProjectRequest.js +1 -1
  44. package/build/generated-sources/api/src/models/CreateProviderAppRequest.d.ts +7 -1
  45. package/build/generated-sources/api/src/models/CreateProviderAppRequest.js +3 -1
  46. package/build/generated-sources/api/src/models/Group.d.ts +1 -1
  47. package/build/generated-sources/api/src/models/Group.js +1 -1
  48. package/build/generated-sources/api/src/models/HydratedIntegration.d.ts +8 -1
  49. package/build/generated-sources/api/src/models/HydratedIntegration.js +4 -1
  50. package/build/generated-sources/api/src/models/HydratedIntegrationField.d.ts +1 -1
  51. package/build/generated-sources/api/src/models/HydratedIntegrationField.js +1 -1
  52. package/build/generated-sources/api/src/models/HydratedIntegrationFieldExistent.d.ts +1 -1
  53. package/build/generated-sources/api/src/models/HydratedIntegrationFieldExistent.js +1 -1
  54. package/build/generated-sources/api/src/models/HydratedIntegrationObject.d.ts +1 -1
  55. package/build/generated-sources/api/src/models/HydratedIntegrationObject.js +1 -1
  56. package/build/generated-sources/api/src/models/HydratedIntegrationRead.d.ts +1 -1
  57. package/build/generated-sources/api/src/models/HydratedIntegrationRead.js +1 -1
  58. package/build/generated-sources/api/src/models/HydratedIntegrationWrite.d.ts +32 -0
  59. package/build/generated-sources/api/src/models/HydratedIntegrationWrite.js +51 -0
  60. package/build/generated-sources/api/src/models/HydratedIntegrationWriteObject.d.ts +37 -0
  61. package/build/generated-sources/api/src/models/HydratedIntegrationWriteObject.js +53 -0
  62. package/build/generated-sources/api/src/models/HydratedRevision.d.ts +1 -1
  63. package/build/generated-sources/api/src/models/HydratedRevision.js +1 -1
  64. package/build/generated-sources/api/src/models/ImportConnectionRequest.d.ts +1 -7
  65. package/build/generated-sources/api/src/models/ImportConnectionRequest.js +1 -4
  66. package/build/generated-sources/api/src/models/ImportInstallationRequest.d.ts +7 -1
  67. package/build/generated-sources/api/src/models/ImportInstallationRequest.js +4 -1
  68. package/build/generated-sources/api/src/models/ImportInstallationRequestConfig.d.ts +1 -1
  69. package/build/generated-sources/api/src/models/ImportInstallationRequestConfig.js +1 -1
  70. package/build/generated-sources/api/src/models/Installation.d.ts +1 -1
  71. package/build/generated-sources/api/src/models/Installation.js +1 -1
  72. package/build/generated-sources/api/src/models/Integration.d.ts +1 -1
  73. package/build/generated-sources/api/src/models/Integration.js +1 -1
  74. package/build/generated-sources/api/src/models/Integration1.d.ts +8 -1
  75. package/build/generated-sources/api/src/models/Integration1.js +4 -1
  76. package/build/generated-sources/api/src/models/IntegrationField.d.ts +1 -1
  77. package/build/generated-sources/api/src/models/IntegrationField.js +1 -1
  78. package/build/generated-sources/api/src/models/IntegrationFieldExistent.d.ts +1 -1
  79. package/build/generated-sources/api/src/models/IntegrationFieldExistent.js +1 -1
  80. package/build/generated-sources/api/src/models/IntegrationFieldMapping.d.ts +1 -1
  81. package/build/generated-sources/api/src/models/IntegrationFieldMapping.js +1 -1
  82. package/build/generated-sources/api/src/models/IntegrationObject.d.ts +1 -1
  83. package/build/generated-sources/api/src/models/IntegrationObject.js +1 -1
  84. package/build/generated-sources/api/src/models/IntegrationRead.d.ts +1 -1
  85. package/build/generated-sources/api/src/models/IntegrationRead.js +1 -1
  86. package/build/generated-sources/api/src/models/IntegrationWrite.d.ts +32 -0
  87. package/build/generated-sources/api/src/models/IntegrationWrite.js +51 -0
  88. package/build/generated-sources/api/src/models/IntegrationWriteObject.d.ts +31 -0
  89. package/build/generated-sources/api/src/models/IntegrationWriteObject.js +50 -0
  90. package/build/generated-sources/api/src/models/OauthConnectRequest.d.ts +1 -1
  91. package/build/generated-sources/api/src/models/OauthConnectRequest.js +1 -1
  92. package/build/generated-sources/api/src/models/Operation.d.ts +1 -1
  93. package/build/generated-sources/api/src/models/Operation.js +1 -1
  94. package/build/generated-sources/api/src/models/OperationError.d.ts +1 -1
  95. package/build/generated-sources/api/src/models/OperationError.js +1 -1
  96. package/build/generated-sources/api/src/models/OptionalFieldsAutoOption.d.ts +1 -1
  97. package/build/generated-sources/api/src/models/OptionalFieldsAutoOption.js +1 -1
  98. package/build/generated-sources/api/src/models/Project.d.ts +1 -1
  99. package/build/generated-sources/api/src/models/Project.js +1 -1
  100. package/build/generated-sources/api/src/models/ProjectMembership.d.ts +1 -1
  101. package/build/generated-sources/api/src/models/ProjectMembership.js +1 -1
  102. package/build/generated-sources/api/src/models/ProviderApp.d.ts +1 -1
  103. package/build/generated-sources/api/src/models/ProviderApp.js +1 -1
  104. package/build/generated-sources/api/src/models/Revision.d.ts +1 -1
  105. package/build/generated-sources/api/src/models/Revision.js +1 -1
  106. package/build/generated-sources/api/src/models/SignedUrl.d.ts +43 -0
  107. package/build/generated-sources/api/src/models/SignedUrl.js +56 -0
  108. package/build/generated-sources/api/src/models/UpdateInstallationConfigContent.d.ts +8 -1
  109. package/build/generated-sources/api/src/models/UpdateInstallationConfigContent.js +4 -1
  110. package/build/generated-sources/api/src/models/UpdateInstallationRequest.d.ts +1 -1
  111. package/build/generated-sources/api/src/models/UpdateInstallationRequest.js +1 -1
  112. package/build/generated-sources/api/src/models/UpdateInstallationRequestInstallation.d.ts +1 -1
  113. package/build/generated-sources/api/src/models/UpdateInstallationRequestInstallation.js +1 -1
  114. package/build/generated-sources/api/src/models/UpdateInstallationRequestInstallationConfig.d.ts +1 -1
  115. package/build/generated-sources/api/src/models/UpdateInstallationRequestInstallationConfig.js +1 -1
  116. package/build/generated-sources/api/src/models/UpdateProjectRequest.d.ts +1 -1
  117. package/build/generated-sources/api/src/models/UpdateProjectRequest.js +1 -1
  118. package/build/generated-sources/api/src/models/UpdateProjectRequestProject.d.ts +1 -1
  119. package/build/generated-sources/api/src/models/UpdateProjectRequestProject.js +1 -1
  120. package/build/generated-sources/api/src/models/UpdateProviderAppRequest.d.ts +1 -1
  121. package/build/generated-sources/api/src/models/UpdateProviderAppRequest.js +1 -1
  122. package/build/generated-sources/api/src/models/UpdateProviderAppRequestProviderApp.d.ts +7 -1
  123. package/build/generated-sources/api/src/models/UpdateProviderAppRequestProviderApp.js +3 -1
  124. package/build/generated-sources/api/src/models/UpsertProjectMembershipRequest.d.ts +1 -1
  125. package/build/generated-sources/api/src/models/UpsertProjectMembershipRequest.js +1 -1
  126. package/build/generated-sources/api/src/models/index.d.ts +7 -0
  127. package/build/generated-sources/api/src/models/index.js +7 -0
  128. package/build/generated-sources/api/src/runtime.d.ts +1 -1
  129. package/build/generated-sources/api/src/runtime.js +1 -1
  130. package/build/src/assets/NavIcon.d.ts +1 -0
  131. package/build/src/assets/NavIcon.js +3 -2
  132. package/build/src/assets/TrashIcon.d.ts +1 -0
  133. package/build/src/assets/TrashIcon.js +9 -0
  134. package/build/src/components/AmpersandProvider/AmpersandProvider.js +2 -2
  135. package/build/src/components/Configure/ConfigureInstallationBase.js +14 -2
  136. package/build/src/components/Configure/CreateInstallation.js +11 -14
  137. package/build/src/components/Configure/InstallIntegration.js +1 -2
  138. package/build/src/components/Configure/ObjectManagementNav/UninstallInstallation.d.ts +7 -0
  139. package/build/src/components/Configure/ObjectManagementNav/UninstallInstallation.js +15 -0
  140. package/build/src/components/Configure/ObjectManagementNav/index.js +13 -6
  141. package/build/src/components/Configure/ProtectedConnectionLayout.d.ts +7 -2
  142. package/build/src/components/Configure/ProtectedConnectionLayout.js +10 -5
  143. package/build/src/components/Configure/UninstallContent.d.ts +1 -0
  144. package/build/src/components/Configure/UninstallContent.js +37 -0
  145. package/build/src/components/Configure/UpdateInstallation.js +10 -21
  146. package/build/src/components/Configure/fields/{FieldMapping.d.ts → FieldMappings/FieldMapping.d.ts} +2 -3
  147. package/build/src/components/Configure/fields/{FieldMapping.js → FieldMappings/FieldMapping.js} +12 -11
  148. package/build/src/components/Configure/fields/{RequiredFieldMappings.js → FieldMappings/RequiredFieldMappings.js} +9 -9
  149. package/build/src/components/Configure/fields/FieldMappings/index.d.ts +3 -0
  150. package/build/src/components/Configure/fields/FieldMappings/index.js +7 -0
  151. package/build/src/components/Configure/fields/FieldMappings/setFieldMapping.d.ts +3 -0
  152. package/build/src/components/Configure/fields/FieldMappings/setFieldMapping.js +18 -0
  153. package/build/src/components/Configure/fields/{OptionalFields.js → OptionalFields/OptionalFields.js} +8 -19
  154. package/build/src/components/Configure/fields/OptionalFields/index.d.ts +2 -0
  155. package/build/src/components/Configure/fields/OptionalFields/index.js +5 -0
  156. package/build/src/components/Configure/fields/OptionalFields/setOptionalField.d.ts +3 -0
  157. package/build/src/components/Configure/fields/OptionalFields/setOptionalField.js +21 -0
  158. package/build/src/components/Configure/state/ConfigurationStateProvider.d.ts +47 -1
  159. package/build/src/components/Configure/state/ConfigurationStateProvider.js +28 -6
  160. package/build/src/components/Configure/state/HydratedRevisionContext.js +3 -6
  161. package/build/src/components/Configure/state/utils.d.ts +4 -16
  162. package/build/src/components/Configure/state/utils.js +28 -63
  163. package/build/src/components/Configure/types.d.ts +6 -9
  164. package/build/src/components/Configure/utils.d.ts +6 -4
  165. package/build/src/components/Configure/utils.js +17 -16
  166. package/build/src/components/Connect/ConnectProvider.d.ts +9 -0
  167. package/build/src/components/Connect/ConnectProvider.js +18 -0
  168. package/build/src/components/{OAuthPopup → Connect}/OAuthPopup.js +3 -3
  169. package/build/src/components/Salesforce/SalesforceOauthFlow.js +41 -30
  170. package/build/src/components/ThemeProvider/Button/buttonTheme.d.ts +13 -0
  171. package/build/src/components/ThemeProvider/Button/buttonTheme.js +17 -0
  172. package/build/src/components/ThemeProvider/Button/index.d.ts +2 -0
  173. package/build/src/components/ThemeProvider/Button/index.js +5 -0
  174. package/build/src/components/ThemeProvider/index.js +21 -0
  175. package/build/src/components/index.d.ts +1 -0
  176. package/build/src/components/index.js +1 -0
  177. package/build/src/context/{ApiKeyContext.d.ts → ApiKeyProvider.d.ts} +1 -0
  178. package/build/src/context/ApiKeyProvider.js +14 -0
  179. package/build/src/context/ConnectionsContext.d.ts +5 -4
  180. package/build/src/context/ConnectionsContext.js +13 -5
  181. package/build/src/context/InstallIntegrationContext.d.ts +1 -0
  182. package/build/src/context/InstallIntegrationContext.js +15 -10
  183. package/build/src/context/IntegrationListContext.js +3 -3
  184. package/build/src/context/ProjectContext.js +3 -3
  185. package/build/src/hooks/useIsIntegrationInstalled.js +2 -2
  186. package/package.json +4 -3
  187. package/build/src/context/ApiKeyContext.js +0 -6
  188. /package/build/src/components/Configure/fields/{RequiredFieldMappings.d.ts → FieldMappings/RequiredFieldMappings.d.ts} +0 -0
  189. /package/build/src/components/Configure/fields/{OptionalFields.d.ts → OptionalFields/OptionalFields.d.ts} +0 -0
  190. /package/build/src/components/{OAuthPopup → Connect}/OAuthPopup.d.ts +0 -0
@@ -3,6 +3,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.ConfigurationProvider = exports.useConfigureState = void 0;
4
4
  const jsx_runtime_1 = require("react/jsx-runtime");
5
5
  const react_1 = require("react");
6
+ const immer_1 = require("immer");
6
7
  const InstallIntegrationContext_1 = require("../../../context/InstallIntegrationContext");
7
8
  const HydratedRevisionContext_1 = require("./HydratedRevisionContext");
8
9
  const utils_1 = require("./utils");
@@ -30,25 +31,46 @@ function ConfigurationProvider({ children }) {
30
31
  (0, react_1.useEffect)(() => {
31
32
  // set configurationState when hydratedRevision is loaded
32
33
  // only reset when objectConfigurationsState does not exist
33
- if ((hydratedRevision === null || hydratedRevision === void 0 ? void 0 : hydratedRevision.content) && !loading && config && !objectConfigurationsState) {
34
+ if ((hydratedRevision === null || hydratedRevision === void 0 ? void 0 : hydratedRevision.content) && !loading
35
+ && config && !(Object.entries(objectConfigurationsState).length > 0)) {
34
36
  (0, utils_1.resetAllObjectsConfigurationState)(hydratedRevision, config, setObjectConfigurationsState);
35
37
  }
36
38
  }, [hydratedRevision, loading, config, objectConfigurationsState]);
37
- // set configure state of single object
38
- const setConfigureState = (0, react_1.useCallback)((objectName, configureState) => {
39
+ // mutate configure state of single object using a producer method
40
+ const setConfigureState = (0, react_1.useCallback)((objectName, producer) => {
39
41
  // consider moving check modified state here
40
- setObjectConfigurationsState((prevState) => (Object.assign(Object.assign({}, prevState), { [objectName]: configureState })));
42
+ setObjectConfigurationsState((currentState) => (0, immer_1.produce)(currentState, (draft) => {
43
+ // immer exception when mutating a draft
44
+ // eslint-disable-next-line no-param-reassign
45
+ draft[objectName] = (0, immer_1.produce)(draft[objectName], producer);
46
+ }));
47
+ }, [setObjectConfigurationsState]);
48
+ // set configure state of single object by assigning a new state
49
+ const resetConfigureState = (0, react_1.useCallback)((objectName, configureState) => {
50
+ setObjectConfigurationsState((currentState) => (0, immer_1.produce)(currentState, (draft) => {
51
+ // immer exception when mutating a draft
52
+ // eslint-disable-next-line no-param-reassign
53
+ draft[objectName] = configureState;
54
+ }));
41
55
  }, [setObjectConfigurationsState]);
42
56
  // set configure state of single object
43
57
  const resetPendingConfigurationState = (0, react_1.useCallback)((objectName) => {
44
- setObjectConfigurationsState((prevObjectsConfigurationsState) => (Object.assign(Object.assign({}, prevObjectsConfigurationsState), { [objectName]: Object.assign(Object.assign({}, prevObjectsConfigurationsState[objectName]), { isOptionalFieldsModified: false, isRequiredMapFieldsModified: false }) })));
58
+ setObjectConfigurationsState((0, immer_1.produce)((draft) => {
59
+ // immer exception when mutating a draft
60
+ // eslint-disable-next-line no-param-reassign
61
+ draft[objectName].isOptionalFieldsModified = false;
62
+ // eslint-disable-next-line no-param-reassign
63
+ draft[objectName].isRequiredMapFieldsModified = false;
64
+ }));
45
65
  }, [setObjectConfigurationsState]);
46
66
  const contextValue = (0, react_1.useMemo)(() => ({
47
67
  objectConfigurationsState,
48
68
  setObjectConfigurationsState,
49
69
  setConfigureState,
70
+ resetConfigureState,
50
71
  resetPendingConfigurationState,
51
- }), [objectConfigurationsState, resetPendingConfigurationState, setConfigureState]);
72
+ }), [objectConfigurationsState,
73
+ resetConfigureState, resetPendingConfigurationState, setConfigureState]);
52
74
  return ((0, jsx_runtime_1.jsx)(ConfigurationContext.Provider, { value: contextValue, children: children }));
53
75
  }
54
76
  exports.ConfigurationProvider = ConfigurationProvider;
@@ -3,11 +3,10 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.HydratedRevisionProvider = exports.useHydratedRevision = exports.HydratedRevisionContext = void 0;
4
4
  const jsx_runtime_1 = require("react/jsx-runtime");
5
5
  const react_1 = require("react");
6
- const ApiKeyContext_1 = require("../../../context/ApiKeyContext");
6
+ const ApiKeyProvider_1 = require("../../../context/ApiKeyProvider");
7
7
  const ConnectionsContext_1 = require("../../../context/ConnectionsContext");
8
8
  const ErrorContextProvider_1 = require("../../../context/ErrorContextProvider");
9
9
  const InstallIntegrationContext_1 = require("../../../context/InstallIntegrationContext");
10
- const IntegrationListContext_1 = require("../../../context/IntegrationListContext");
11
10
  const api_1 = require("../../../services/api");
12
11
  const ErrorTextBox_1 = require("../ErrorTextBox");
13
12
  exports.HydratedRevisionContext = (0, react_1.createContext)({
@@ -24,13 +23,12 @@ const useHydratedRevision = () => {
24
23
  exports.useHydratedRevision = useHydratedRevision;
25
24
  function HydratedRevisionProvider({ projectId, children, }) {
26
25
  var _a;
26
+ const { selectedConnection } = (0, ConnectionsContext_1.useConnections)();
27
27
  const { integrationId, integrationObj } = (0, InstallIntegrationContext_1.useInstallIntegrationProps)();
28
- const { integrations } = (0, IntegrationListContext_1.useIntegrationList)();
29
28
  const [hydratedRevision, setHydratedRevision] = (0, react_1.useState)(null);
30
29
  const [loading, setLoading] = (0, react_1.useState)(true);
31
30
  const { isError, removeError, setError } = (0, ErrorContextProvider_1.useErrorState)();
32
- const apiKey = (0, react_1.useContext)(ApiKeyContext_1.ApiKeyContext);
33
- const { selectedConnection } = (0, ConnectionsContext_1.useConnections)();
31
+ const apiKey = (0, ApiKeyProvider_1.useApiKey)();
34
32
  const connectionId = selectedConnection === null || selectedConnection === void 0 ? void 0 : selectedConnection.id;
35
33
  const revisionId = (_a = integrationObj === null || integrationObj === void 0 ? void 0 : integrationObj.latestRevision) === null || _a === void 0 ? void 0 : _a.id;
36
34
  const errorIntegrationIdentifier = (integrationObj === null || integrationObj === void 0 ? void 0 : integrationObj.name) || integrationId;
@@ -68,7 +66,6 @@ function HydratedRevisionProvider({ projectId, children, }) {
68
66
  revisionId,
69
67
  connectionId,
70
68
  apiKey,
71
- integrations,
72
69
  removeError,
73
70
  setError,
74
71
  errorIntegrationIdentifier
@@ -1,9 +1,8 @@
1
1
  import { Config, HydratedIntegrationRead, HydratedRevision } from '../../../services/api';
2
- import { ConfigureState, ConfigureStateMappingIntegrationField, ObjectConfigurationsState, SavedConfigureFields } from '../types';
3
- export declare function createSavedFields(fields: ConfigureStateMappingIntegrationField[] | null | undefined): SavedConfigureFields;
4
- export declare function checkFieldsEquality(prevFields: SavedConfigureFields, currentFields: SavedConfigureFields): boolean;
2
+ import { ConfigureState, ObjectConfigurationsState, SelectMappingFields, SelectOptionalFields } from '../types';
3
+ export declare function isFieldObjectEqual(prevFields: SelectMappingFields | SelectOptionalFields, currentFields: SelectMappingFields | SelectOptionalFields): boolean;
5
4
  export declare function generateConfigurationState(action: HydratedIntegrationRead, objectName: string, config?: Config): ConfigureState;
6
- export declare const resetConfigurationState: (hydratedRevision: HydratedRevision, config: Config | undefined, selectedObjectName: string, setConfigureState: (objectName: string, configureState: ConfigureState) => void) => void;
5
+ export declare const setHydrateConfigState: (hydratedRevision: HydratedRevision, config: Config | undefined, selectedObjectName: string, setConfigureState: (objectName: string, configureState: ConfigureState) => void) => void;
7
6
  /**
8
7
  * resets configure state for all objects in hydrated revision to hydrated revision values
9
8
  */
@@ -19,16 +18,5 @@ export declare const generateSelectedFieldsFromConfigureState: (configureState:
19
18
  * @param configureState
20
19
  * @returns
21
20
  */
22
- export declare const generateSelectedFieldMappingsFromConfigureState: (configureState: ConfigureState) => {};
23
- /**
24
- * returns a new configure state with one of its FieldMappings updated with a new value.
25
- * @param fieldKey
26
- * @param value
27
- * @param configureState
28
- * @returns
29
- */
30
- export declare const setRequiredCustomMapFieldValue: (fieldKey: string, value: string, configureState: ConfigureState) => {
31
- isUpdated: boolean;
32
- newState: ConfigureState;
33
- };
21
+ export declare const generateSelectedFieldMappingsFromConfigureState: (configureState: ConfigureState) => Record<string, string>;
34
22
  export declare function getConfigureState(objectName: string, objectConfigurationsState: ObjectConfigurationsState): ConfigureState;
@@ -3,45 +3,35 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
3
3
  return (mod && mod.__esModule) ? mod : { "default": mod };
4
4
  };
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
- exports.getConfigureState = exports.setRequiredCustomMapFieldValue = exports.generateSelectedFieldMappingsFromConfigureState = exports.generateSelectedFieldsFromConfigureState = exports.resetAllObjectsConfigurationState = exports.resetConfigurationState = exports.generateConfigurationState = exports.checkFieldsEquality = exports.createSavedFields = void 0;
6
+ exports.getConfigureState = exports.generateSelectedFieldMappingsFromConfigureState = exports.generateSelectedFieldsFromConfigureState = exports.resetAllObjectsConfigurationState = exports.setHydrateConfigState = exports.generateConfigurationState = exports.isFieldObjectEqual = void 0;
7
7
  const lodash_isequal_1 = __importDefault(require("lodash.isequal"));
8
8
  const utils_1 = require("../utils");
9
- function createSavedFields(fields) {
10
- const savedFields = {};
11
- fields === null || fields === void 0 ? void 0 : fields.forEach((field) => {
12
- const { value } = field;
13
- if (value) {
14
- savedFields[field.mapToName] = value;
15
- }
16
- });
17
- return savedFields;
18
- }
19
- exports.createSavedFields = createSavedFields;
20
9
  // uses lodash deep equality check to compare two saved fields objects
21
- function checkFieldsEquality(prevFields, currentFields) {
10
+ function isFieldObjectEqual(prevFields, currentFields) {
22
11
  return (0, lodash_isequal_1.default)(prevFields, currentFields);
23
12
  }
24
- exports.checkFieldsEquality = checkFieldsEquality;
13
+ exports.isFieldObjectEqual = isFieldObjectEqual;
25
14
  function generateConfigurationState(action, objectName, config) {
26
- var _a, _b, _c, _d, _e;
15
+ var _a, _b, _c, _d, _e, _f, _g, _h;
16
+ // refactor this section to be immutable at hydrated revision level
27
17
  const object = (0, utils_1.getStandardObjectFromAction)(action, objectName);
28
18
  const requiredFields = object && (0, utils_1.getRequiredFieldsFromObject)(object);
29
19
  const optionalFields = object && (0, utils_1.getOptionalFieldsFromObject)(object);
30
- // todo refactor requiredMapFields to separate form state from hydrated revision
31
- // map over requiredMapFields and get value from config
32
- const requiredMapFields = object ? (_a = (0, utils_1.getRequiredMapFieldsFromObject)(object)) === null || _a === void 0 ? void 0 : _a.map((field) => (Object.assign(Object.assign({}, field), { value: config ? (0, utils_1.getValueFromConfigCustomMapping)(config, objectName,
33
- // should only use mapToName for custom mapping fields
34
- (0, utils_1.getFieldKeyValue)(field)) : '' }))) : null; // type hack - TODO fix
20
+ const requiredMapFields = object && (0, utils_1.getRequiredMapFieldsFromObject)(object);
21
+ /// //////////////////////////////////////////////////////////////////////
35
22
  const allFields = (object === null || object === void 0 ? void 0 : object.allFields) || [];
36
- const selectedFields = ((_e = (_d = (_c = (_b = config === null || config === void 0 ? void 0 : config.content) === null || _b === void 0 ? void 0 : _b.read) === null || _c === void 0 ? void 0 : _c.standardObjects) === null || _d === void 0 ? void 0 : _d[objectName]) === null || _e === void 0 ? void 0 : _e.selectedFields) || {};
23
+ const selectedFields = ((_d = (_c = (_b = (_a = config === null || config === void 0 ? void 0 : config.content) === null || _a === void 0 ? void 0 : _a.read) === null || _b === void 0 ? void 0 : _b.standardObjects) === null || _c === void 0 ? void 0 : _c[objectName]) === null || _d === void 0 ? void 0 : _d.selectedFields) || {};
24
+ const selectedFieldMappings = ((_h = (_g = (_f = (_e = config === null || config === void 0 ? void 0 : config.content) === null || _e === void 0 ? void 0 : _e.read) === null || _f === void 0 ? void 0 : _f.standardObjects) === null || _g === void 0 ? void 0 : _g[objectName]) === null || _h === void 0 ? void 0 : _h.selectedFieldMappings) || {};
37
25
  const optionalFieldsSaved = Object.assign({}, selectedFields);
38
- const requiredMapFieldsSaved = createSavedFields(requiredMapFields);
26
+ const requiredMapFieldsSaved = Object.assign({}, selectedFieldMappings);
39
27
  return {
40
28
  allFields,
41
29
  requiredFields,
42
30
  optionalFields,
43
31
  requiredMapFields,
32
+ // selected state
44
33
  selectedOptionalFields: selectedFields,
34
+ selectedFieldMappings,
45
35
  isOptionalFieldsModified: false,
46
36
  isRequiredMapFieldsModified: false,
47
37
  savedConfig: {
@@ -52,7 +42,7 @@ function generateConfigurationState(action, objectName, config) {
52
42
  }
53
43
  exports.generateConfigurationState = generateConfigurationState;
54
44
  // resets configure state for single object to hydrated revision values
55
- const resetConfigurationState = (hydratedRevision, config, selectedObjectName, setConfigureState) => {
45
+ const setHydrateConfigState = (hydratedRevision, config, selectedObjectName, setConfigureState) => {
56
46
  var _a;
57
47
  const readAction = (_a = hydratedRevision === null || hydratedRevision === void 0 ? void 0 : hydratedRevision.content) === null || _a === void 0 ? void 0 : _a.read;
58
48
  if (!readAction) {
@@ -61,7 +51,7 @@ const resetConfigurationState = (hydratedRevision, config, selectedObjectName, s
61
51
  const state = generateConfigurationState(readAction, selectedObjectName, config);
62
52
  setConfigureState(selectedObjectName, state);
63
53
  };
64
- exports.resetConfigurationState = resetConfigurationState;
54
+ exports.setHydrateConfigState = setHydrateConfigState;
65
55
  /**
66
56
  * resets configure state for all objects in hydrated revision to hydrated revision values
67
57
  */
@@ -98,47 +88,22 @@ exports.generateSelectedFieldsFromConfigureState = generateSelectedFieldsFromCon
98
88
  * @returns
99
89
  */
100
90
  const generateSelectedFieldMappingsFromConfigureState = (configureState) => {
101
- const { requiredMapFields } = configureState;
102
- const requiredMapFieldsConfig = (requiredMapFields || []).reduce((acc, field) => {
103
- const key = (0, utils_1.getFieldKeyValue)(field);
104
- return Object.assign(Object.assign({}, acc), { [key]: field.value });
105
- }, {});
106
- return requiredMapFieldsConfig;
107
- };
108
- exports.generateSelectedFieldMappingsFromConfigureState = generateSelectedFieldMappingsFromConfigureState;
109
- /**
110
- * returns a new configure state with one of its FieldMappings updated with a new value.
111
- * @param fieldKey
112
- * @param value
113
- * @param configureState
114
- * @returns
115
- */
116
- const setRequiredCustomMapFieldValue = (fieldKey, value, configureState) => {
117
- const { requiredMapFields } = configureState;
118
- if (requiredMapFields === null) {
119
- return { isUpdated: false, newState: configureState };
120
- }
121
- // flag to know if field was updated
122
- let isUpdated = false;
123
- const updatedRequiredMapFields = requiredMapFields.map((field) => {
124
- // updated field
125
- if (field.mapToName === fieldKey) {
126
- isUpdated = true;
127
- return Object.assign(Object.assign({}, field), { value });
128
- }
129
- // else return a copy of the field
130
- return Object.assign({}, field);
131
- });
132
- if (isUpdated) {
133
- const savedFields = configureState.savedConfig.requiredMapFields;
134
- const updatedFields = createSavedFields(updatedRequiredMapFields);
135
- const isModified = !checkFieldsEquality(savedFields, updatedFields);
136
- const newState = Object.assign(Object.assign({}, configureState), { requiredMapFields: updatedRequiredMapFields, isRequiredMapFieldsModified: isModified });
137
- return { isUpdated, newState };
91
+ const { selectedFieldMappings: selectedRequiredMapFields } = configureState;
92
+ // filter out undefined values of selectedRequiredMapFields
93
+ const selectedRequiredMapFieldsSubmit = {};
94
+ if (selectedRequiredMapFields) {
95
+ Object.keys(selectedRequiredMapFields).forEach((key) => {
96
+ if (selectedRequiredMapFields[key] !== undefined) {
97
+ selectedRequiredMapFieldsSubmit[key] = selectedRequiredMapFields[key] || '';
98
+ }
99
+ else {
100
+ console.warn(`Error undefined when generating selectedRequiredMapFieldsSubmit for key: ${key}`);
101
+ }
102
+ });
138
103
  }
139
- return { isUpdated: false, newState: configureState };
104
+ return selectedRequiredMapFieldsSubmit;
140
105
  };
141
- exports.setRequiredCustomMapFieldValue = setRequiredCustomMapFieldValue;
106
+ exports.generateSelectedFieldMappingsFromConfigureState = generateSelectedFieldMappingsFromConfigureState;
142
107
  // get configure state of single object
143
108
  function getConfigureState(objectName, objectConfigurationsState) {
144
109
  return objectConfigurationsState[objectName] || undefined;
@@ -1,24 +1,21 @@
1
1
  import { HydratedIntegrationField, HydratedIntegrationFieldExistent, IntegrationFieldMapping } from '../../services/api';
2
- export type ConfigureStateIntegrationField = HydratedIntegrationFieldExistent & {
3
- value: string | number | boolean | null;
4
- };
5
- export type ConfigureStateMappingIntegrationField = IntegrationFieldMapping & {
6
- value: string | number | undefined;
7
- };
8
2
  export type SelectOptionalFields = {
9
3
  [key: string]: boolean;
10
4
  };
11
- export type SavedConfigureFields = Record<string, string | number | boolean | null>;
5
+ export type SelectMappingFields = {
6
+ [key: string]: string | undefined;
7
+ };
12
8
  type SavedConfigureState = {
13
9
  optionalFields: SelectOptionalFields;
14
- requiredMapFields: SavedConfigureFields;
10
+ requiredMapFields: SelectMappingFields;
15
11
  };
16
12
  export type ConfigureState = {
17
13
  allFields: HydratedIntegrationFieldExistent[] | null;
18
14
  requiredFields: HydratedIntegrationField[] | null;
19
15
  optionalFields: HydratedIntegrationField[] | null;
20
- requiredMapFields: ConfigureStateMappingIntegrationField[] | null;
16
+ requiredMapFields: IntegrationFieldMapping[] | null;
21
17
  selectedOptionalFields: SelectOptionalFields | null;
18
+ selectedFieldMappings: SelectMappingFields | null;
22
19
  isOptionalFieldsModified: boolean;
23
20
  isRequiredMapFieldsModified: boolean;
24
21
  savedConfig: SavedConfigureState;
@@ -1,5 +1,6 @@
1
+ import { ErrorBoundary } from '../../context/ErrorContextProvider';
1
2
  import { Config, HydratedIntegrationField, HydratedIntegrationObject, HydratedIntegrationRead, HydratedRevision, IntegrationFieldMapping } from '../../services/api';
2
- import { NavObject } from './types';
3
+ import { NavObject, SelectMappingFields } from './types';
3
4
  /**
4
5
  * type guard for IntegrationFieldMapping | IntegrationFieldExistent
5
6
  *
@@ -15,10 +16,11 @@ export declare function isIntegrationFieldMapping(field: HydratedIntegrationFiel
15
16
  */
16
17
  export declare function getStandardObjectFromAction(action: HydratedIntegrationRead, objectName: string): HydratedIntegrationObject | null;
17
18
  export declare function getRequiredFieldsFromObject(object: HydratedIntegrationObject): HydratedIntegrationField[] | null;
18
- export declare function getRequiredMapFieldsFromObject(object: HydratedIntegrationObject): HydratedIntegrationField[] | null;
19
+ export declare function getRequiredMapFieldsFromObject(object: HydratedIntegrationObject): IntegrationFieldMapping[] | null;
19
20
  export declare function getOptionalFieldsFromObject(object: HydratedIntegrationObject): HydratedIntegrationField[] | null;
20
21
  export declare const getReadObject: (config: Config, objectName: string) => any;
21
- export declare function getValueFromConfigExist(config: Config, objectName: string, key: string): boolean;
22
- export declare function getValueFromConfigCustomMapping(config: Config, objectName: string, key: string): string;
23
22
  export declare function getFieldKeyValue(field: HydratedIntegrationField): string;
24
23
  export declare function generateNavObjects(config: Config | undefined, hydratedRevision: HydratedRevision): NavObject[];
24
+ export declare function validateFieldMappings(requiredMapFields: IntegrationFieldMapping[] | null, selectedRequiredMapFields: SelectMappingFields | null, setErrors: (boundary: ErrorBoundary, errors: string[]) => void): {
25
+ errorList: string[];
26
+ };
@@ -1,6 +1,7 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.generateNavObjects = exports.getFieldKeyValue = exports.getValueFromConfigCustomMapping = exports.getValueFromConfigExist = exports.getReadObject = exports.getOptionalFieldsFromObject = exports.getRequiredMapFieldsFromObject = exports.getRequiredFieldsFromObject = exports.getStandardObjectFromAction = exports.isIntegrationFieldMapping = void 0;
3
+ exports.validateFieldMappings = exports.generateNavObjects = exports.getFieldKeyValue = exports.getReadObject = exports.getOptionalFieldsFromObject = exports.getRequiredMapFieldsFromObject = exports.getRequiredFieldsFromObject = exports.getStandardObjectFromAction = exports.isIntegrationFieldMapping = void 0;
4
+ const ErrorContextProvider_1 = require("../../context/ErrorContextProvider");
4
5
  /**
5
6
  * type guard for IntegrationFieldMapping | IntegrationFieldExistent
6
7
  *
@@ -32,7 +33,8 @@ exports.getRequiredFieldsFromObject = getRequiredFieldsFromObject;
32
33
  // 2b. get required custom mapping fields
33
34
  function getRequiredMapFieldsFromObject(object) {
34
35
  var _a;
35
- return ((_a = object === null || object === void 0 ? void 0 : object.requiredFields) === null || _a === void 0 ? void 0 : _a.filter((rf) => isIntegrationFieldMapping(rf) && !!rf.mapToName)) || null;
36
+ const requiredMapFields = ((_a = object === null || object === void 0 ? void 0 : object.requiredFields) === null || _a === void 0 ? void 0 : _a.filter((rf) => isIntegrationFieldMapping(rf) && !!rf.mapToName)) || [];
37
+ return requiredMapFields; // type hack
36
38
  }
37
39
  exports.getRequiredMapFieldsFromObject = getRequiredMapFieldsFromObject;
38
40
  // 3. get optional fields
@@ -43,20 +45,6 @@ function getOptionalFieldsFromObject(object) {
43
45
  exports.getOptionalFieldsFromObject = getOptionalFieldsFromObject;
44
46
  const getReadObject = (config, objectName) => { var _a, _b, _c; return (_c = (_b = (_a = config === null || config === void 0 ? void 0 : config.content) === null || _a === void 0 ? void 0 : _a.read) === null || _b === void 0 ? void 0 : _b.standardObjects) === null || _c === void 0 ? void 0 : _c[objectName]; };
45
47
  exports.getReadObject = getReadObject;
46
- // 4a. get value for field
47
- function getValueFromConfigExist(config, objectName, key) {
48
- var _a;
49
- const object = (0, exports.getReadObject)(config, objectName);
50
- return ((_a = object === null || object === void 0 ? void 0 : object.selectedFields) === null || _a === void 0 ? void 0 : _a[key]) || false;
51
- }
52
- exports.getValueFromConfigExist = getValueFromConfigExist;
53
- // 4b. get value for custom mapping field
54
- function getValueFromConfigCustomMapping(config, objectName, key) {
55
- var _a;
56
- const object = (0, exports.getReadObject)(config, objectName);
57
- return ((_a = object === null || object === void 0 ? void 0 : object.selectedFieldMappings) === null || _a === void 0 ? void 0 : _a[key]) || '';
58
- }
59
- exports.getValueFromConfigCustomMapping = getValueFromConfigCustomMapping;
60
48
  // aux. get field value based on type guard
61
49
  function getFieldKeyValue(field) {
62
50
  if (isIntegrationFieldMapping(field)) {
@@ -80,3 +68,16 @@ function generateNavObjects(config, hydratedRevision) {
80
68
  return navObjects;
81
69
  }
82
70
  exports.generateNavObjects = generateNavObjects;
71
+ // validates whether required fields are filled out or throws error
72
+ function validateFieldMappings(requiredMapFields, selectedRequiredMapFields, setErrors) {
73
+ // check if fields with requirements are met
74
+ const fieldsWithRequirementsNotMet = (requiredMapFields === null || requiredMapFields === void 0 ? void 0 : requiredMapFields.filter((field) => !(selectedRequiredMapFields === null || selectedRequiredMapFields === void 0 ? void 0 : selectedRequiredMapFields[field === null || field === void 0 ? void 0 : field.mapToName]))) || [];
75
+ const errorList = fieldsWithRequirementsNotMet.map((field) => field.mapToName);
76
+ setErrors(ErrorContextProvider_1.ErrorBoundary.MAPPING, errorList);
77
+ // if requires fields are not met, set error fields and return
78
+ if (fieldsWithRequirementsNotMet === null || fieldsWithRequirementsNotMet === void 0 ? void 0 : fieldsWithRequirementsNotMet.length) {
79
+ console.error('required fields not met', fieldsWithRequirementsNotMet.map((field) => field.mapToDisplayName));
80
+ }
81
+ return { errorList };
82
+ }
83
+ exports.validateFieldMappings = validateFieldMappings;
@@ -0,0 +1,9 @@
1
+ interface ConnectProviderProps {
2
+ provider: string;
3
+ consumerRef: string;
4
+ consumerName?: string;
5
+ groupRef: string;
6
+ groupName?: string;
7
+ }
8
+ export declare function ConnectProvider({ provider, consumerRef, consumerName, groupRef, groupName, }: ConnectProviderProps): import("react/jsx-runtime").JSX.Element;
9
+ export {};
@@ -0,0 +1,18 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ConnectProvider = void 0;
4
+ const jsx_runtime_1 = require("react/jsx-runtime");
5
+ const react_1 = require("@chakra-ui/react");
6
+ const NavIcon_1 = require("../../assets/NavIcon");
7
+ const ConnectionsContext_1 = require("../../context/ConnectionsContext");
8
+ const ProjectContext_1 = require("../../context/ProjectContext");
9
+ const utils_1 = require("../../utils");
10
+ const ProtectedConnectionLayout_1 = require("../Configure/ProtectedConnectionLayout");
11
+ function ConnectedSuccessBox({ provider }) {
12
+ const { appName } = (0, ProjectContext_1.useProject)();
13
+ return ((0, jsx_runtime_1.jsx)(react_1.Container, { children: (0, jsx_runtime_1.jsxs)(react_1.Box, { p: 8, maxWidth: "600px", minHeight: "290px", borderWidth: 1, borderRadius: 8, boxShadow: "lg", margin: "auto", marginTop: "40px", bgColor: "white", paddingTop: "100px", children: [(0, jsx_runtime_1.jsx)(react_1.Box, { width: "100%", display: "flex", alignContent: "center", justifyContent: "center", children: (0, jsx_runtime_1.jsx)(react_1.Box, { margin: "auto", children: NavIcon_1.CheckMarkIcon }) }), (0, jsx_runtime_1.jsx)(react_1.Box, { textAlign: "center", paddingTop: "25px", children: `You've successfully connected ${(0, utils_1.capitalize)(provider)} to ${appName}.` })] }) }));
14
+ }
15
+ function ConnectProvider({ provider, consumerRef, consumerName, groupRef, groupName, }) {
16
+ return ((0, jsx_runtime_1.jsx)(ConnectionsContext_1.ConnectionsProvider, { provider: provider, groupRef: groupRef, children: (0, jsx_runtime_1.jsx)(ProtectedConnectionLayout_1.ProtectedConnectionLayout, { provider: provider, consumerRef: consumerRef, consumerName: consumerName, groupRef: groupRef, groupName: groupName, children: (0, jsx_runtime_1.jsx)(ConnectedSuccessBox, { provider: provider }) }) }));
17
+ }
18
+ exports.ConnectProvider = ConnectProvider;
@@ -7,7 +7,7 @@ const jsx_runtime_1 = require("react/jsx-runtime");
7
7
  * Takes a URL and creates a popup showing that page.
8
8
  */
9
9
  const react_1 = require("react");
10
- const ApiKeyContext_1 = require("../../context/ApiKeyContext");
10
+ const ApiKeyProvider_1 = require("../../context/ApiKeyProvider");
11
11
  const ConnectionsContext_1 = require("../../context/ConnectionsContext");
12
12
  const ProjectContext_1 = require("../../context/ProjectContext");
13
13
  const api_1 = require("../../services/api");
@@ -23,12 +23,12 @@ const createPopup = ({ url, title, }) => {
23
23
  return popup;
24
24
  };
25
25
  function OAuthPopup({ title = '', url, children, onClose, }) {
26
+ const { projectId } = (0, ProjectContext_1.useProject)();
27
+ const apiKey = (0, ApiKeyProvider_1.useApiKey)();
26
28
  const [externalWindow, setExternalWindow] = (0, react_1.useState)();
27
29
  const intervalRef = (0, react_1.useRef)();
28
30
  const clearTimer = () => window.clearInterval(intervalRef.current);
29
31
  const { setSelectedConnection } = (0, ConnectionsContext_1.useConnections)();
30
- const { projectId } = (0, ProjectContext_1.useProject)();
31
- const apiKey = (0, react_1.useContext)(ApiKeyContext_1.ApiKeyContext);
32
32
  (0, react_1.useEffect)(() => {
33
33
  if (url)
34
34
  setExternalWindow(createPopup({ url, title }));
@@ -12,54 +12,63 @@ const react_1 = require("react");
12
12
  const icons_1 = require("@chakra-ui/icons");
13
13
  const react_2 = require("@chakra-ui/react");
14
14
  const constants_1 = require("../../constants");
15
- const ApiKeyContext_1 = require("../../context/ApiKeyContext");
15
+ const ApiKeyProvider_1 = require("../../context/ApiKeyProvider");
16
16
  const ProjectContext_1 = require("../../context/ProjectContext");
17
17
  const api_1 = require("../../services/api");
18
- const OAuthPopup_1 = __importDefault(require("../OAuthPopup/OAuthPopup"));
18
+ const OAuthPopup_1 = __importDefault(require("../Connect/OAuthPopup"));
19
19
  function OAuthErrorAlert({ error }) {
20
20
  if (error) {
21
21
  return ((0, jsx_runtime_1.jsxs)(react_2.Alert, { status: "error", marginTop: "2em", children: [(0, jsx_runtime_1.jsx)(react_2.AlertIcon, {}), (0, jsx_runtime_1.jsx)(react_2.AlertDescription, { children: error })] }));
22
22
  }
23
23
  return null;
24
24
  }
25
+ const SALESFORCE_HELP_URL = 'https://help.salesforce.com/articleView?id=domain_name_not_found.htm&type=5';
26
+ function SubdomainEntry({ handleSubmit, setWorkspace, error, isButtonDisabled, }) {
27
+ return ((0, jsx_runtime_1.jsx)(react_2.Container, { children: (0, jsx_runtime_1.jsx)(react_2.Box, { p: 8, maxWidth: "600px", borderWidth: 1, borderRadius: 8, boxShadow: "lg", textAlign: ['left'], margin: "auto", marginTop: "40px", bgColor: "white", children: (0, jsx_runtime_1.jsxs)(react_2.FormControl, { children: [(0, jsx_runtime_1.jsx)(react_2.FormLabel, { marginTop: "16", marginBottom: "0", children: (0, jsx_runtime_1.jsx)(react_2.Heading, { as: "h4", size: "md", children: "Enter your Salesforce subdomain" }) }), (0, jsx_runtime_1.jsxs)(react_2.Link, { href: SALESFORCE_HELP_URL, color: "blackAlpha.600", isExternal: true, children: ["What is my Salesforce subdomain?", (0, jsx_runtime_1.jsx)(icons_1.ExternalLinkIcon, { mx: "2px" })] }), (0, jsx_runtime_1.jsx)(OAuthErrorAlert, { error: error }), (0, jsx_runtime_1.jsxs)(react_2.Flex, { marginTop: "1em", children: [(0, jsx_runtime_1.jsx)(react_2.Input, { placeholder: "MyDomain", onChange: (event) => setWorkspace(event.currentTarget.value) }), (0, jsx_runtime_1.jsx)(react_2.Text, { lineHeight: "2.2em", marginLeft: "0.4em", children: ".my.salesforce.com" })] }), (0, jsx_runtime_1.jsx)("br", {}), (0, jsx_runtime_1.jsx)(react_2.Button, { isDisabled: isButtonDisabled, width: "100%", type: "submit", onClick: handleSubmit, children: "Next" })] }) }) }));
28
+ }
29
+ const fetchOAuthCallbackURL = async (projectId, workspace, consumerRef, groupRef, consumerName, groupName, apiKey, provider = constants_1.PROVIDER_SALESFORCE) => {
30
+ const providerApps = await (0, api_1.api)().listProviderApps({ projectId }, {
31
+ headers: { 'X-Api-Key': apiKey !== null && apiKey !== void 0 ? apiKey : '' },
32
+ });
33
+ const app = providerApps.find((a) => a.provider === provider);
34
+ if (!app) {
35
+ throw new Error(`You must first set up a ${provider} Connected App using the Ampersand Console.`);
36
+ }
37
+ const url = await (0, api_1.api)().oauthConnect({
38
+ connectOAuthParams: {
39
+ providerWorkspaceRef: workspace,
40
+ projectId,
41
+ groupRef,
42
+ groupName,
43
+ consumerRef,
44
+ consumerName,
45
+ providerAppId: app.id,
46
+ provider,
47
+ },
48
+ });
49
+ return url;
50
+ };
25
51
  /**
26
52
  * SalesforceOauthFlow first prompts user for their workspace ("subdomain" in Salesforce lingo),
27
53
  * then launches a popup with the OAuth flow.
28
54
  */
29
55
  function SalesforceOauthFlow({ consumerRef, consumerName, groupRef, groupName, }) {
56
+ const { projectId } = (0, ProjectContext_1.useProject)();
57
+ const apiKey = (0, ApiKeyProvider_1.useApiKey)();
30
58
  const [workspace, setWorkspace] = (0, react_1.useState)('');
31
59
  const [oAuthCallbackURL, setOAuthCallbackURL] = (0, react_1.useState)(null);
32
60
  const [error, setError] = (0, react_1.useState)(null);
33
- const { projectId } = (0, ProjectContext_1.useProject)();
34
- const apiKey = (0, react_1.useContext)(ApiKeyContext_1.ApiKeyContext);
61
+ const isButtonDisabled = workspace.length === 0;
62
+ const provider = constants_1.PROVIDER_SALESFORCE;
63
+ // 1. fetch provider apps
64
+ // 2. find matching app to provider
65
+ // 3. fetch OAuth callback URL from connection so that oath popup can be launched
35
66
  const handleSubmit = async () => {
36
67
  var _a;
37
68
  setError(null);
38
- if (workspace) {
69
+ if (workspace && consumerName && groupName && apiKey) {
39
70
  try {
40
- const providerApps = await (0, api_1.api)().listProviderApps({
41
- projectId,
42
- }, {
43
- headers: {
44
- 'X-Api-Key': apiKey !== null && apiKey !== void 0 ? apiKey : '',
45
- },
46
- });
47
- const app = providerApps.find((a) => a.provider === constants_1.PROVIDER_SALESFORCE);
48
- if (!app) {
49
- throw new Error('You must first set up a Salesforce Connected App using the Ampersand Console.');
50
- }
51
- const url = await (0, api_1.api)().oauthConnect({
52
- connectOAuthParams: {
53
- providerWorkspaceRef: workspace,
54
- projectId,
55
- groupRef,
56
- groupName,
57
- consumerRef,
58
- consumerName,
59
- providerAppId: app.id,
60
- provider: constants_1.PROVIDER_SALESFORCE,
61
- },
62
- });
71
+ const url = await fetchOAuthCallbackURL(projectId, workspace, consumerRef, groupRef, consumerName, groupName, apiKey, provider);
63
72
  setOAuthCallbackURL(url);
64
73
  }
65
74
  catch (err) {
@@ -67,12 +76,14 @@ function SalesforceOauthFlow({ consumerRef, consumerName, groupRef, groupName, }
67
76
  setError((_a = err.message) !== null && _a !== void 0 ? _a : 'Unexpected error');
68
77
  }
69
78
  }
79
+ else {
80
+ setError('missing required fields');
81
+ }
70
82
  };
71
83
  const onClose = (0, react_1.useCallback)((err) => {
72
84
  setError(err);
73
85
  setOAuthCallbackURL(null);
74
86
  }, []);
75
- const SubdomainEntry = ((0, jsx_runtime_1.jsx)(react_2.Container, { children: (0, jsx_runtime_1.jsx)(react_2.Box, { p: 8, maxWidth: "600px", borderWidth: 1, borderRadius: 8, boxShadow: "lg", textAlign: ['left'], margin: "auto", marginTop: "40px", bgColor: "white", children: (0, jsx_runtime_1.jsxs)(react_2.FormControl, { children: [(0, jsx_runtime_1.jsx)(react_2.FormLabel, { marginTop: "3em", marginBottom: "0", children: (0, jsx_runtime_1.jsx)(react_2.Heading, { as: "h4", size: "lg", children: "Enter your Salesforce subdomain" }) }), (0, jsx_runtime_1.jsxs)(react_2.Link, { href: "https://help.salesforce.com/s/articleView?id=sf.faq_domain_name_what.htm&type=5", color: "blackAlpha.600", isExternal: true, children: ["What is my Salesforce subdomain?", (0, jsx_runtime_1.jsx)(icons_1.ExternalLinkIcon, { mx: "2px" })] }), (0, jsx_runtime_1.jsx)(OAuthErrorAlert, { error: error }), (0, jsx_runtime_1.jsxs)(react_2.Flex, { marginTop: "1em", children: [(0, jsx_runtime_1.jsx)(react_2.Input, { placeholder: "MyDomain", onChange: (event) => setWorkspace(event.currentTarget.value) }), (0, jsx_runtime_1.jsx)(react_2.Text, { lineHeight: "2.2em", marginLeft: "0.4em", children: ".my.salesforce.com" })] }), (0, jsx_runtime_1.jsx)("br", {}), (0, jsx_runtime_1.jsx)(react_2.Button, { type: "submit", onClick: handleSubmit, children: "Submit" })] }) }) }));
76
- return ((0, jsx_runtime_1.jsx)(OAuthPopup_1.default, { title: "Connect to Salesforce", url: oAuthCallbackURL, onClose: onClose, children: SubdomainEntry }));
87
+ return ((0, jsx_runtime_1.jsx)(OAuthPopup_1.default, { title: "Connect to Salesforce", url: oAuthCallbackURL, onClose: onClose, children: (0, jsx_runtime_1.jsx)(SubdomainEntry, { handleSubmit: handleSubmit, setWorkspace: setWorkspace, error: error, isButtonDisabled: isButtonDisabled }) }));
77
88
  }
78
89
  exports.default = SalesforceOauthFlow;
@@ -0,0 +1,13 @@
1
+ export declare const buttonVariants: {
2
+ warning: {
3
+ bg: string;
4
+ outlineColor: string;
5
+ outline: string;
6
+ outlineOffset: string;
7
+ borderColor: string;
8
+ color: string;
9
+ _hover: {
10
+ bg: string;
11
+ };
12
+ };
13
+ };
@@ -0,0 +1,17 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.buttonVariants = void 0;
4
+ // define custom button variants
5
+ exports.buttonVariants = {
6
+ warning: {
7
+ bg: 'red.50',
8
+ outlineColor: 'red.800',
9
+ outline: '2px solid',
10
+ outlineOffset: '0',
11
+ borderColor: 'red.800',
12
+ color: 'red.800',
13
+ _hover: {
14
+ bg: 'red.100', // Background color on hover
15
+ },
16
+ },
17
+ };
@@ -0,0 +1,2 @@
1
+ import { buttonVariants } from './buttonTheme';
2
+ export { buttonVariants };
@@ -0,0 +1,5 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.buttonVariants = void 0;
4
+ const buttonTheme_1 = require("./buttonTheme");
5
+ Object.defineProperty(exports, "buttonVariants", { enumerable: true, get: function () { return buttonTheme_1.buttonVariants; } });
@@ -3,6 +3,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.ThemeProvider = void 0;
4
4
  const jsx_runtime_1 = require("react/jsx-runtime");
5
5
  const react_1 = require("@chakra-ui/react");
6
+ const Button_1 = require("./Button");
6
7
  const customTheme = (0, react_1.extendTheme)({
7
8
  components: {
8
9
  Tabs: {
@@ -23,8 +24,28 @@ const customTheme = (0, react_1.extendTheme)({
23
24
  },
24
25
  },
25
26
  },
27
+ // consider creating a warning variant tab
28
+ warningTab: {
29
+ width: '100%',
30
+ borderRadius: '4px',
31
+ _hover: {
32
+ bg: 'red.200',
33
+ },
34
+ _selected: {
35
+ color: 'red.800',
36
+ fontWeight: '500',
37
+ bg: 'red.100',
38
+ border: 'none',
39
+ _hover: {
40
+ bg: 'red.200',
41
+ },
42
+ },
43
+ },
26
44
  },
27
45
  },
46
+ Button: {
47
+ variants: Button_1.buttonVariants,
48
+ },
28
49
  },
29
50
  });
30
51
  const theme = (0, react_1.extendTheme)((0, react_1.withDefaultColorScheme)({