Skip to content

Commit babb8c0

Browse files
fix(integrations): preserve connect deep links
1 parent 0155a61 commit babb8c0

3 files changed

Lines changed: 70 additions & 3 deletions

File tree

apps/sim/app/workspace/[workspaceId]/integrations/[block]/integration-block-detail.tsx

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,10 @@ import {
2424
} from '@/app/workspace/[workspaceId]/integrations/components/connect-service-account-modal'
2525
import { IntegrationSection } from '@/app/workspace/[workspaceId]/integrations/components/integration-section'
2626
import { IntegrationTile } from '@/app/workspace/[workspaceId]/integrations/components/integrations-showcase'
27-
import { CONNECT_MODE } from '@/app/workspace/[workspaceId]/integrations/connect-route'
27+
import {
28+
CONNECT_MODE,
29+
resolveAvailableConnectMode,
30+
} from '@/app/workspace/[workspaceId]/integrations/connect-route'
2831
import { useScrollRestoration } from '@/app/workspace/[workspaceId]/integrations/hooks/use-scroll-restoration'
2932
import {
3033
RESOURCE_LIST_STACK,
@@ -109,9 +112,15 @@ export function IntegrationBlockDetail({ integration, workspaceId }: Integration
109112
useEffect(() => {
110113
if (hasHandledConnectQueryRef.current || !connectMode || permissionConfigLoading) return
111114

112-
if (connectMode === CONNECT_MODE.oauth && oauthService && oauthAvailable) {
115+
const availableConnectMode = resolveAvailableConnectMode(connectMode, {
116+
oauth: Boolean(oauthService) && oauthAvailable,
117+
serviceAccount: hasServiceAccount,
118+
})
119+
if (!availableConnectMode) return
120+
121+
if (availableConnectMode === CONNECT_MODE.oauth) {
113122
setOAuthOpen(true)
114-
} else if (connectMode === CONNECT_MODE.serviceAccount && hasServiceAccount) {
123+
} else {
115124
setServiceAccountOpen(true)
116125
}
117126

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
import { describe, expect, it } from 'vitest'
2+
import {
3+
CONNECT_MODE,
4+
resolveAvailableConnectMode,
5+
} from '@/app/workspace/[workspaceId]/integrations/connect-route'
6+
7+
describe('resolveAvailableConnectMode', () => {
8+
it('keeps a service-account deep link pending until its modal is available', () => {
9+
expect(
10+
resolveAvailableConnectMode(CONNECT_MODE.serviceAccount, {
11+
oauth: false,
12+
serviceAccount: false,
13+
})
14+
).toBeNull()
15+
16+
expect(
17+
resolveAvailableConnectMode(CONNECT_MODE.serviceAccount, {
18+
oauth: false,
19+
serviceAccount: true,
20+
})
21+
).toBe(CONNECT_MODE.serviceAccount)
22+
})
23+
24+
it('only resolves OAuth when OAuth is available', () => {
25+
expect(
26+
resolveAvailableConnectMode(CONNECT_MODE.oauth, {
27+
oauth: false,
28+
serviceAccount: true,
29+
})
30+
).toBeNull()
31+
32+
expect(
33+
resolveAvailableConnectMode(CONNECT_MODE.oauth, {
34+
oauth: true,
35+
serviceAccount: false,
36+
})
37+
).toBe(CONNECT_MODE.oauth)
38+
})
39+
})

apps/sim/app/workspace/[workspaceId]/integrations/connect-route.ts

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,3 +10,22 @@ export const CONNECT_MODE = {
1010
oauth: 'oauth',
1111
serviceAccount: 'service-account',
1212
} as const
13+
14+
export type ConnectMode = (typeof CONNECT_MODE)[keyof typeof CONNECT_MODE]
15+
16+
interface ConnectModeAvailability {
17+
oauth: boolean
18+
serviceAccount: boolean
19+
}
20+
21+
/** `null` lets callers preserve the deep-link while deployment and block visibility hydrate. */
22+
export function resolveAvailableConnectMode(
23+
connectMode: ConnectMode,
24+
availability: ConnectModeAvailability
25+
): ConnectMode | null {
26+
if (connectMode === CONNECT_MODE.oauth && availability.oauth) return connectMode
27+
if (connectMode === CONNECT_MODE.serviceAccount && availability.serviceAccount) {
28+
return connectMode
29+
}
30+
return null
31+
}

0 commit comments

Comments
 (0)