From 5ce37dfaaf70410e1fbe44990da74155d1d92c9f Mon Sep 17 00:00:00 2001 From: Kerem Yilmaz Date: Tue, 7 May 2024 11:31:05 -0700 Subject: [PATCH] FE Auth vendor changes (#270) --- skyvern-frontend/src/api/AxiosClient.ts | 25 ++++++++++++++++--- .../src/components/useThemeAsDarkOrLight.ts | 15 +++++++++++ .../src/hooks/useCredentialGetter.ts | 9 +++++++ skyvern-frontend/src/routes/root/Profile.tsx | 11 ++------ .../src/routes/root/RootLayout.tsx | 8 ++---- skyvern-frontend/src/routes/root/SideNav.tsx | 8 +++--- .../routes/tasks/create/CreateNewTaskForm.tsx | 7 ++++-- .../src/routes/tasks/detail/StepArtifacts.tsx | 5 +++- .../tasks/detail/StepArtifactsLayout.tsx | 5 +++- .../routes/tasks/detail/StepNavigation.tsx | 5 +++- .../src/routes/tasks/detail/TaskDetails.tsx | 5 +++- .../src/routes/tasks/list/TaskList.tsx | 5 +++- .../routes/tasks/running/LatestScreenshot.tsx | 6 ++++- .../src/routes/tasks/running/QueuedTasks.tsx | 6 ++++- .../src/routes/tasks/running/RunningTasks.tsx | 5 +++- .../src/store/CredentialGetterContext.ts | 6 +++++ 16 files changed, 99 insertions(+), 32 deletions(-) create mode 100644 skyvern-frontend/src/components/useThemeAsDarkOrLight.ts create mode 100644 skyvern-frontend/src/hooks/useCredentialGetter.ts create mode 100644 skyvern-frontend/src/store/CredentialGetterContext.ts diff --git a/skyvern-frontend/src/api/AxiosClient.ts b/skyvern-frontend/src/api/AxiosClient.ts index ae54a783..2d678870 100644 --- a/skyvern-frontend/src/api/AxiosClient.ts +++ b/skyvern-frontend/src/api/AxiosClient.ts @@ -18,7 +18,9 @@ export function setAuthorizationHeader(token: string) { } export function removeAuthorizationHeader() { - delete client.defaults.headers.common["Authorization"]; + if (client.defaults.headers.common["Authorization"]) { + delete client.defaults.headers.common["Authorization"]; + } } export function setApiKeyHeader(apiKey: string) { @@ -26,7 +28,24 @@ export function setApiKeyHeader(apiKey: string) { } export function removeApiKeyHeader() { - delete client.defaults.headers.common["X-API-Key"]; + if (client.defaults.headers.common["X-API-Key"]) { + delete client.defaults.headers.common["X-API-Key"]; + } } -export { client, artifactApiClient }; +async function getClient(credentialGetter: CredentialGetter | null) { + if (credentialGetter) { + removeApiKeyHeader(); + const credential = await credentialGetter(); + if (!credential) { + console.warn("No credential found"); + return client; + } + setAuthorizationHeader(credential); + } + return client; +} + +export type CredentialGetter = () => Promise; + +export { getClient, artifactApiClient }; diff --git a/skyvern-frontend/src/components/useThemeAsDarkOrLight.ts b/skyvern-frontend/src/components/useThemeAsDarkOrLight.ts new file mode 100644 index 00000000..1a8eac93 --- /dev/null +++ b/skyvern-frontend/src/components/useThemeAsDarkOrLight.ts @@ -0,0 +1,15 @@ +import { useTheme } from "./useTheme"; + +function useThemeAsDarkOrLight(): "light" | "dark" { + const { theme: baseTheme } = useTheme(); + + if (baseTheme === "dark" || baseTheme === "light") { + return baseTheme; + } + + return window.matchMedia("(prefers-color-scheme: dark)").matches + ? "dark" + : "light"; +} + +export { useThemeAsDarkOrLight }; diff --git a/skyvern-frontend/src/hooks/useCredentialGetter.ts b/skyvern-frontend/src/hooks/useCredentialGetter.ts new file mode 100644 index 00000000..0b0689bf --- /dev/null +++ b/skyvern-frontend/src/hooks/useCredentialGetter.ts @@ -0,0 +1,9 @@ +import { CredentialGetterContext } from "@/store/CredentialGetterContext"; +import { useContext } from "react"; + +function useCredentialGetter() { + const credentialGetter = useContext(CredentialGetterContext); + return credentialGetter; +} + +export { useCredentialGetter }; diff --git a/skyvern-frontend/src/routes/root/Profile.tsx b/skyvern-frontend/src/routes/root/Profile.tsx index a4e38d9a..00de292c 100644 --- a/skyvern-frontend/src/routes/root/Profile.tsx +++ b/skyvern-frontend/src/routes/root/Profile.tsx @@ -3,10 +3,9 @@ import { ExitIcon, PersonIcon } from "@radix-ui/react-icons"; type Props = { name: string; - onLogout?: () => void; }; -function Profile({ name, onLogout }: Props) { +function Profile({ name }: Props) { return (
@@ -14,13 +13,7 @@ function Profile({ name, onLogout }: Props) {

{name}

-
diff --git a/skyvern-frontend/src/routes/root/RootLayout.tsx b/skyvern-frontend/src/routes/root/RootLayout.tsx index db2d0975..c334cc3f 100644 --- a/skyvern-frontend/src/routes/root/RootLayout.tsx +++ b/skyvern-frontend/src/routes/root/RootLayout.tsx @@ -7,11 +7,7 @@ import { Profile } from "./Profile"; import { useContext } from "react"; import { UserContext } from "@/store/UserContext"; -type Props = { - onLogout?: () => void; -}; - -function RootLayout({ onLogout }: Props) { +function RootLayout() { const user = useContext(UserContext); return ( @@ -30,7 +26,7 @@ function RootLayout({ onLogout }: Props) { {user ? (
- +
) : null} diff --git a/skyvern-frontend/src/routes/root/SideNav.tsx b/skyvern-frontend/src/routes/root/SideNav.tsx index 0fe46c5a..c997201e 100644 --- a/skyvern-frontend/src/routes/root/SideNav.tsx +++ b/skyvern-frontend/src/routes/root/SideNav.tsx @@ -8,12 +8,12 @@ import { NavLink } from "react-router-dom"; function SideNav() { return ( -