Skip to content

Commit 29fbf47

Browse files
committed
fix: modal router crash, dual permission gate and absolute provider URLs
1 parent 5dba9df commit 29fbf47

4 files changed

Lines changed: 46 additions & 10 deletions

File tree

frontend/web/components/modals/ConnectCohortProviderModal/CohortSyncKeyStep.tsx

Lines changed: 21 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,15 @@
11
import React, { FC, useState } from 'react'
22
import moment from 'moment'
3-
import { Link } from 'react-router-dom'
43
import Constants from 'common/constants'
54
import { useHasPermission } from 'common/providers/Permission'
65
import {
76
useCreateCohortSyncKeyMutation,
87
useGetCohortSyncKeysQuery,
98
} from 'common/services/useCohort'
10-
import { EnvironmentPermission } from 'common/types/permissions.types'
9+
import {
10+
EnvironmentPermission,
11+
ProjectPermission,
12+
} from 'common/types/permissions.types'
1113
import { CohortSyncKey } from 'common/types/responses'
1214
import Button from 'components/base/forms/Button'
1315
import InputGroup from 'components/base/forms/InputGroup'
@@ -36,12 +38,24 @@ const CohortSyncKeyStep: FC<CohortSyncKeyStepProps> = ({
3638
const [createdKey, setCreatedKey] = useState<string | null>(null)
3739
const [isCreateFormOpen, setIsCreateFormOpen] = useState(false)
3840

39-
const { isLoading: isLoadingPermission, permission: canManage } =
41+
// Key writes need both permissions; mirrors the API's CohortPermission.
42+
const { isLoading: isLoadingEnvPermission, permission: canManageOverrides } =
4043
useHasPermission({
4144
id: environmentApiKey,
4245
level: 'environment',
4346
permission: EnvironmentPermission.MANAGE_SEGMENT_OVERRIDES,
4447
})
48+
const {
49+
isLoading: isLoadingProjectPermission,
50+
permission: canManageSegments,
51+
} = useHasPermission({
52+
id: `${projectId}`,
53+
level: 'project',
54+
permission: ProjectPermission.MANAGE_SEGMENTS,
55+
})
56+
const isLoadingPermission =
57+
isLoadingEnvPermission || isLoadingProjectPermission
58+
const canManage = !!canManageOverrides && !!canManageSegments
4559

4660
const { data: syncKeys, isLoading } = useGetCohortSyncKeysQuery(
4761
{ environmentApiKey },
@@ -152,12 +166,13 @@ const CohortSyncKeyStep: FC<CohortSyncKeyStepProps> = ({
152166
</div>
153167
<div className='fs-small text-secondary'>
154168
You can revoke keys in{' '}
155-
<Link
156-
to={`/project/${projectId}/environment/${environmentApiKey}/settings?tab=cohort-synchronisation`}
169+
{/* Plain anchor: this renders in the modal root, outside the Router. */}
170+
<a
171+
href={`/project/${projectId}/environment/${environmentApiKey}/settings?tab=cohort-synchronisation`}
157172
onClick={() => closeModal()}
158173
>
159174
Environment Settings
160-
</Link>
175+
</a>
161176
.
162177
</div>
163178
{canManage ? (

frontend/web/components/modals/ConnectCohortProviderModal/providers.ts

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,12 @@ export const COHORT_PROVIDERS: Record<CohortProviderKey, CohortProviderConfig> =
5151
},
5252
}
5353

54+
// Proxied self-hosted deployments configure a relative Project.api ('/api/v1/');
55+
// providers need an absolute callback URL, so resolve against the page origin.
5456
export const getCohortProviderEndpoint = (
5557
provider: CohortProviderKey,
56-
): string => `${Project.api}${COHORT_PROVIDERS[provider].endpointPath}`
58+
): string =>
59+
new URL(
60+
COHORT_PROVIDERS[provider].endpointPath,
61+
new URL(Project.api, window.location.origin),
62+
).toString()

frontend/web/components/pages/environment-settings/EnvironmentSettingsPage.tsx

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -932,6 +932,7 @@ const EnvironmentSettingsPage: React.FC = () => {
932932
<div className='mt-4'>
933933
<CohortSyncTab
934934
environmentApiKey={match.params.environmentId}
935+
projectId={projectId ?? ''}
935936
/>
936937
</div>
937938
</TabItem>

frontend/web/components/pages/environment-settings/tabs/cohort-sync-tab/CohortSyncTab.tsx

Lines changed: 17 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,10 @@ import {
66
useGetCohortSyncKeysQuery,
77
useRevokeCohortSyncKeyMutation,
88
} from 'common/services/useCohort'
9-
import { EnvironmentPermission } from 'common/types/permissions.types'
9+
import {
10+
EnvironmentPermission,
11+
ProjectPermission,
12+
} from 'common/types/permissions.types'
1013
import { CohortSyncKey } from 'common/types/responses'
1114
import Button from 'components/base/forms/Button'
1215
import Flex from 'components/base/grid/Flex'
@@ -20,14 +23,25 @@ import CreateCohortSyncKeyModal from './CreateCohortSyncKeyModal'
2023

2124
type CohortSyncTabProps = {
2225
environmentApiKey: string
26+
projectId: number | string
2327
}
2428

25-
const CohortSyncTab: FC<CohortSyncTabProps> = ({ environmentApiKey }) => {
26-
const { permission: canManage } = useHasPermission({
29+
const CohortSyncTab: FC<CohortSyncTabProps> = ({
30+
environmentApiKey,
31+
projectId,
32+
}) => {
33+
// Key writes need both permissions; mirrors the API's CohortPermission.
34+
const { permission: canManageOverrides } = useHasPermission({
2735
id: environmentApiKey,
2836
level: 'environment',
2937
permission: EnvironmentPermission.MANAGE_SEGMENT_OVERRIDES,
3038
})
39+
const { permission: canManageSegments } = useHasPermission({
40+
id: `${projectId}`,
41+
level: 'project',
42+
permission: ProjectPermission.MANAGE_SEGMENTS,
43+
})
44+
const canManage = !!canManageOverrides && !!canManageSegments
3145

3246
const { data: syncKeys, isLoading } = useGetCohortSyncKeysQuery(
3347
{ environmentApiKey },

0 commit comments

Comments
 (0)