diff --git a/src/Platform/Hosted/Components/ConnectExplorer.tsx b/src/Platform/Hosted/Components/ConnectExplorer.tsx index 3639bd113..575093bc2 100644 --- a/src/Platform/Hosted/Components/ConnectExplorer.tsx +++ b/src/Platform/Hosted/Components/ConnectExplorer.tsx @@ -1,7 +1,7 @@ import { useBoolean } from "@fluentui/react-hooks"; import * as React from "react"; -import ErrorImage from "../../../../images/error.svg"; import ConnectImage from "../../../../images/HdeConnectCosmosDB.svg"; +import ErrorImage from "../../../../images/error.svg"; import { AuthType } from "../../../AuthType"; import { HttpHeaders } from "../../../Common/Constants"; import { configContext } from "../../../ConfigContext"; @@ -16,6 +16,19 @@ interface Props { setAuthType: (authType: AuthType) => void; } +export const fetchEncryptedToken = async (connectionString: string): Promise => { + const headers = new Headers(); + headers.append(HttpHeaders.connectionString, connectionString); + const url = configContext.BACKEND_ENDPOINT + "/api/guest/tokens/generateToken"; + const response = await fetch(url, { headers, method: "POST" }); + if (!response.ok) { + throw response; + } + // This API has a quirk where it must be parsed twice + const result: GenerateTokenResponse = JSON.parse(await response.json()); + return decodeURIComponent(result.readWrite || result.read); +}; + export const ConnectExplorer: React.FunctionComponent = ({ setEncryptedToken, login, @@ -44,16 +57,8 @@ export const ConnectExplorer: React.FunctionComponent = ({ return; } - const headers = new Headers(); - headers.append(HttpHeaders.connectionString, connectionString); - const url = configContext.BACKEND_ENDPOINT + "/api/guest/tokens/generateToken"; - const response = await fetch(url, { headers, method: "POST" }); - if (!response.ok) { - throw response; - } - // This API has a quirk where it must be parsed twice - const result: GenerateTokenResponse = JSON.parse(await response.json()); - setEncryptedToken(decodeURIComponent(result.readWrite || result.read)); + const encryptedToken = await fetchEncryptedToken(connectionString); + setEncryptedToken(encryptedToken); setAuthType(AuthType.ConnectionString); }} > diff --git a/src/hooks/useKnockoutExplorer.ts b/src/hooks/useKnockoutExplorer.ts index b907bc3cc..814f53e7c 100644 --- a/src/hooks/useKnockoutExplorer.ts +++ b/src/hooks/useKnockoutExplorer.ts @@ -1,6 +1,8 @@ import { createUri } from "Common/UrlUtility"; import Explorer from "Explorer/Explorer"; +import { fetchEncryptedToken } from "Platform/Hosted/Components/ConnectExplorer"; import { getNetworkSettingsWarningMessage } from "Utils/NetworkUtility"; +import { fetchAccessData } from "hooks/usePortalAccessToken"; import { ReactTabKind, useTabs } from "hooks/useTabs"; import { useEffect, useState } from "react"; import { AuthType } from "../AuthType"; @@ -61,7 +63,23 @@ export function useKnockoutExplorer(platform: Platform): Explorer { const explorer = await configurePortal(); setExplorer(explorer); } else if (platform === Platform.Fabric) { - //TODO: need Fabric specific implementation similar to portal + // TODO For now, retrieve info from session storage. Replace with info injected into Data Explorer + const connectionString = sessionStorage.getItem('connectionString'); + if (!connectionString) { + console.error('No connection string found in session storage'); + return; + } + const encryptedToken = await fetchEncryptedToken(connectionString); + // TODO Duplicated from useTokenMetadata + const encryptedTokenMetadata = await fetchAccessData(encryptedToken); + + const win = (window as unknown) as HostedExplorerChildFrame; + win.hostedConfig = { + authType: AuthType.EncryptedToken, + encryptedToken, + encryptedTokenMetadata + }; + const explorer = await configureHosted(); setExplorer(explorer); }