From 929bf81161bf6ba442668110df99bec208c9a4d3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Aur=C3=A9lien=20Sibiril?= <81782+aureliensibiril@users.noreply.github.com> Date: Fri, 29 May 2026 15:06:46 +0200 Subject: [PATCH] Add Datadog region selector to connect dialog MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Aurélien Sibiril <81782+aureliensibiril@users.noreply.github.com> --- .../dialogs/AddAccessSourceDialog.tsx | 71 ++++++++++++++++++- 1 file changed, 69 insertions(+), 2 deletions(-) diff --git a/apps/console/src/pages/organizations/access-reviews/dialogs/AddAccessSourceDialog.tsx b/apps/console/src/pages/organizations/access-reviews/dialogs/AddAccessSourceDialog.tsx index 0c056beb1..1d2b14729 100644 --- a/apps/console/src/pages/organizations/access-reviews/dialogs/AddAccessSourceDialog.tsx +++ b/apps/console/src/pages/organizations/access-reviews/dialogs/AddAccessSourceDialog.tsx @@ -66,6 +66,18 @@ export const addAccessSourceDialogConnectorProviderInfoFragment = graphql` export type ProviderInfo = AddAccessSourceDialogConnectorProviderInfoFragment$data[number]; +// DATADOG_SITES labels are technical identifiers (region code + hostname), +// intentionally not wrapped in __(). The dialog's prose strings are. +const DATADOG_SITES: { value: string; label: string }[] = [ + { value: "US1", label: "US1 (app.datadoghq.com)" }, + { value: "US3", label: "US3 (us3.datadoghq.com)" }, + { value: "US5", label: "US5 (us5.datadoghq.com)" }, + { value: "EU1", label: "EU1 (app.datadoghq.eu)" }, + { value: "AP1", label: "AP1 (ap1.datadoghq.com)" }, + { value: "AP2", label: "AP2 (ap2.datadoghq.com)" }, + { value: "US1-FED", label: "US1-FED (app.ddog-gov.com)" }, +]; + type Props = { children: ReactNode; organizationId: string; @@ -168,10 +180,14 @@ export function AddAccessSourceDialog({ const dialogRef = useDialogRef(); const apiKeyDialogRef = useDialogRef(); const clientCredentialsDialogRef = useDialogRef(); + const datadogDialogRef = useDialogRef(); const [searchQuery, setSearchQuery] = useState(""); const [activeProvider, setActiveProvider] = useState(null); + const [datadogSite, setDatadogSite] = useState("US1"); + const [datadogProvider, setDatadogProvider] = useState(null); + const [apiKeyValue, setApiKeyValue] = useState(""); const [extraSettingValues, setExtraSettingValues] = useState>({}); const [isConnectingAPIKey, setIsConnectingAPIKey] = useState(false); @@ -212,7 +228,10 @@ export function AddAccessSourceDialog({ createClientCredentialsConnectorMutation, ); - const connectOAuthProvider = (info: ProviderInfo) => { + const connectOAuthProvider = ( + info: ProviderInfo, + extras?: Record, + ) => { const baseURL = import.meta.env.VITE_API_URL || window.location.origin; const url = new URL("/api/console/v1/connectors/initiate", baseURL); url.searchParams.append("organization_id", organizationId); @@ -220,6 +239,11 @@ export function AddAccessSourceDialog({ for (const scope of info.oauth2Scopes) { url.searchParams.append("scope", scope); } + if (extras) { + for (const [k, v] of Object.entries(extras)) { + url.searchParams.append(k, v); + } + } url.searchParams.append( "continue", `/organizations/${organizationId}/access-reviews/sources`, @@ -244,6 +268,12 @@ export function AddAccessSourceDialog({ clientCredentialsDialogRef.current?.open(); }; + const openDatadogDialog = (info: ProviderInfo) => { + setDatadogProvider(info); + setDatadogSite("US1"); + datadogDialogRef.current?.open(); + }; + const createSourceAfterConnector = ( connectorId: string, displayName: string, @@ -437,7 +467,10 @@ export function AddAccessSourceDialog({ return ( @@ -738,6 +771,40 @@ export function AddAccessSourceDialog({ + + +
{ + e.preventDefault(); + if (datadogProvider) { + connectOAuthProvider(datadogProvider, { site: datadogSite }); + } + }} + > + +

+ {__("Select your Datadog site, then continue to authorize access.")} +

+
+ + +
+
+ + + +
+
); }