Skip to content

Commit f694b09

Browse files
authored
Filter out unavailable connectors in cloud connector settings, enable Snapchat in cloud (#13174)
* Filter out unavailable connectors in cloud connector settings * Move list of excluded connectors to connector constants * Add hook to filter out available connectors * Update settings connectorview component to filter out connectors * Add isCloudApp utility to check if the app is in cloud mode correctly * Remove Snapchat from filtered out list * Replace cloud check in index with util * Restore info about excluded connectors
1 parent ff4b789 commit f694b09

File tree

6 files changed

+53
-26
lines changed

6 files changed

+53
-26
lines changed
Original file line numberDiff line numberDiff line change
@@ -1 +1,26 @@
1+
import { isCloudApp } from "utils/app";
2+
13
export const DEV_IMAGE_TAG = "dev";
4+
5+
/**
6+
* Returns the list of excluded connections for cloud users.
7+
*
8+
* During the Cloud private beta, we let users pick any connector in our catalog.
9+
* Later on, we realized we shouldn't have allowed using connectors whose platforms required oauth
10+
* But by that point, some users were already leveraging them, so removing them would crash the app for users
11+
* instead we'll filter out those connectors from this drop down menu, and retain them in the backend
12+
* This way, they will not be available for usage in new connections, but they will be available for users
13+
* already leveraging them.
14+
15+
* @param {string} workspaceId The workspace Id
16+
* @returns {array} List of connectorIds that should be filtered out
17+
*/
18+
export const getExcludedConnectorIds = (workspaceId: string) =>
19+
isCloudApp()
20+
? [
21+
"2470e835-feaf-4db6-96f3-70fd645acc77", // Salesforce Singer
22+
...(workspaceId !== "54135667-ce73-4820-a93c-29fe1510d348" // Shopify workspace for review
23+
? ["9da77001-af33-4bcd-be46-6252bf9342b9"] // Shopify
24+
: []),
25+
]
26+
: [];
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
import { useMemo } from "react";
2+
3+
import { Connector, ConnectorDefinition } from "core/domain/connector";
4+
import { getExcludedConnectorIds } from "core/domain/connector/constants";
5+
import { WorkspaceRead } from "core/request/AirbyteClient";
6+
7+
export const useAvailableConnectorDefinitions = (
8+
connectionDefinitions: ConnectorDefinition[],
9+
workspace: WorkspaceRead
10+
) =>
11+
useMemo(() => {
12+
const excludedConnectorIds = getExcludedConnectorIds(workspace.workspaceId);
13+
return connectionDefinitions.filter(
14+
(connectorDefinition) => !excludedConnectorIds.includes(Connector.id(connectorDefinition))
15+
);
16+
}, [connectionDefinitions, workspace.workspaceId]);

airbyte-webapp/src/index.tsx

+3-3
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,9 @@ import * as Sentry from "@sentry/react";
22
import { Integrations } from "@sentry/tracing";
33
import { lazy, Suspense } from "react";
44
import ReactDOM from "react-dom";
5+
56
import "react-reflex/styles.css";
7+
import { isCloudApp } from "utils/app";
68

79
import "./globals";
810

@@ -18,8 +20,6 @@ const CloudApp = lazy(() => import(`packages/cloud/App`));
1820
const App = lazy(() => import(`./App`));
1921

2022
ReactDOM.render(
21-
<Suspense fallback={null}>
22-
{process.env.REACT_APP_CLOUD || window.CLOUD === "true" ? <CloudApp /> : <App />}
23-
</Suspense>,
23+
<Suspense fallback={null}>{isCloudApp() ? <CloudApp /> : <App />}</Suspense>,
2424
document.getElementById("root")
2525
);

airbyte-webapp/src/pages/SettingsPage/pages/ConnectorsPage/components/ConnectorsView.tsx

+5-1
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,9 @@ import Table from "components/Table";
77

88
import { Connector, ConnectorDefinition } from "core/domain/connector";
99
import { DestinationDefinitionRead, SourceDefinitionRead } from "core/request/AirbyteClient";
10+
import { useAvailableConnectorDefinitions } from "hooks/domain/connector/useAvailableConnectorDefinitions";
1011
import { FeatureItem, useFeatureService, WithFeature } from "hooks/services/Feature";
12+
import { useCurrentWorkspace } from "hooks/services/useWorkspace";
1113

1214
import ConnectorCell from "./ConnectorCell";
1315
import CreateConnector from "./CreateConnector";
@@ -45,6 +47,8 @@ const ConnectorsView: React.FC<ConnectorsViewProps> = ({
4547
}) => {
4648
const { hasFeature } = useFeatureService();
4749
const allowUpdateConnectors = hasFeature(FeatureItem.AllowUpdateConnectors);
50+
const workspace = useCurrentWorkspace();
51+
const availableConnectorDefinitions = useAvailableConnectorDefinitions(connectorsDefinitions, workspace);
4852

4953
const columns = React.useMemo(
5054
() => [
@@ -139,7 +143,7 @@ const ConnectorsView: React.FC<ConnectorsViewProps> = ({
139143
<FormattedMessage id={type === "sources" ? "admin.availableSource" : "admin.availableDestinations"} />
140144
{renderHeaderControls("available")}
141145
</Title>
142-
<Table columns={columns} data={connectorsDefinitions} sortBy={defaultSorting} />
146+
<Table columns={columns} data={availableConnectorDefinitions} sortBy={defaultSorting} />
143147
</Block>
144148
</>
145149
);

airbyte-webapp/src/utils/app.ts

+1
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
export const isCloudApp = () => process.env.REACT_APP_CLOUD || window.CLOUD === "true";

airbyte-webapp/src/views/Connector/ServiceForm/components/Controls/ConnectorServiceTypeControl.tsx

+3-22
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ import { GAIcon } from "components/icons/GAIcon";
1818
import { Connector, ConnectorDefinition } from "core/domain/connector";
1919
import { FormBaseItem } from "core/form/types";
2020
import { ReleaseStage } from "core/request/AirbyteClient";
21+
import { useAvailableConnectorDefinitions } from "hooks/domain/connector/useAvailableConnectorDefinitions";
2122
import { useAnalyticsService } from "hooks/services/Analytics";
2223
import { useExperiment } from "hooks/services/Experiment";
2324
import { useCurrentWorkspace } from "hooks/services/useWorkspace";
@@ -172,31 +173,11 @@ const ConnectorServiceTypeControl: React.FC<{
172173
const orderOverwrite = useExperiment("connector.orderOverwrite", {});
173174
const [field, fieldMeta, { setValue }] = useField(property.path);
174175
const analytics = useAnalyticsService();
175-
176-
// TODO Begin hack
177-
// During the Cloud private beta, we let users pick any connector in our catalog.
178-
// Later on, we realized we shouldn't have allowed using connectors whose platforms required oauth
179-
// But by that point, some users were already leveraging them, so removing them would crash the app for users
180-
// instead we'll filter out those connectors from this drop down menu, and retain them in the backend
181-
// This way, they will not be available for usage in new connections, but they will be available for users
182-
// already leveraging them.
183-
// TODO End hack
184176
const workspace = useCurrentWorkspace();
185-
const disallowedOauthConnectors =
186-
// I would prefer to use windowConfigProvider.cloud but that function is async
187-
window.CLOUD === "true"
188-
? [
189-
"200330b2-ea62-4d11-ac6d-cfe3e3f8ab2b", // Snapchat
190-
"2470e835-feaf-4db6-96f3-70fd645acc77", // Salesforce Singer
191-
...(workspace.workspaceId !== "54135667-ce73-4820-a93c-29fe1510d348" // Shopify workspace for review
192-
? ["9da77001-af33-4bcd-be46-6252bf9342b9"] // Shopify
193-
: []),
194-
]
195-
: [];
177+
const availableConnectorDefinitions = useAvailableConnectorDefinitions(availableServices, workspace);
196178
const sortedDropDownData = useMemo(
197179
() =>
198-
availableServices
199-
.filter((item) => !disallowedOauthConnectors.includes(Connector.id(item)))
180+
availableConnectorDefinitions
200181
.map((item) => ({
201182
label: item.name,
202183
value: Connector.id(item),

0 commit comments

Comments
 (0)