diff --git a/src/app/(outerbase)/session-provider.tsx b/src/app/(outerbase)/session-provider.tsx index 8cbf1fd1..05159f47 100644 --- a/src/app/(outerbase)/session-provider.tsx +++ b/src/app/(outerbase)/session-provider.tsx @@ -1,6 +1,6 @@ "use client"; -import { useRouter } from "next/navigation"; -import { createContext, PropsWithChildren, useContext } from "react"; +import { usePathname, useRouter } from "next/navigation"; +import { createContext, PropsWithChildren, useContext, useEffect } from "react"; import useSWR from "swr"; import { getOuterbaseSession } from "../../outerbase-cloud/api"; import { @@ -24,9 +24,11 @@ export function useSession() { export function OuterbaseSessionProvider({ children }: PropsWithChildren) { const router = useRouter(); + const pathname = usePathname(); + const token = localStorage.getItem("ob-token"); const { data, isLoading } = useSWR( - "session", + token ? "session-" + localStorage.getItem("ob-token") : undefined, () => { return getOuterbaseSession(); }, @@ -37,13 +39,16 @@ export function OuterbaseSessionProvider({ children }: PropsWithChildren) { } ); - if (isLoading) { - return
Session Loading...
; - } + useEffect(() => { + if (isLoading) return; + if (!data?.session || !data?.user) { + localStorage.setItem("continue-redirect", pathname); + router.push("/signin"); + } + }, [isLoading, data, pathname, router]); - if (!data?.session || !data?.user) { - router.push("/signin"); - return
Redirecting...
; + if (isLoading || !data) { + return
Session Loading...
; } return ( diff --git a/src/app/signin/page.tsx b/src/app/signin/page.tsx index f49e66c2..d64871e1 100644 --- a/src/app/signin/page.tsx +++ b/src/app/signin/page.tsx @@ -5,11 +5,14 @@ import { getOuterbaseWorkspace, loginOuterbaseByPassword, } from "@/outerbase-cloud/api"; -import { OuterbaseAPIError } from "@/outerbase-cloud/api-type"; +import { + OuterbaseAPIError, + OuterbaseAPISession, +} from "@/outerbase-cloud/api-type"; import { LucideLoader } from "lucide-react"; import Link from "next/link"; import { useRouter } from "next/navigation"; -import { useCallback, useState } from "react"; +import { useCallback, useEffect, useState } from "react"; import ThemeLayout from "../(theme)/theme_layout"; import { LoginBaseSpaceship } from "./starbase-portal"; @@ -19,6 +22,7 @@ export default function SigninPage() { const [error, setError] = useState(""); const router = useRouter(); const [loading, setLoading] = useState(false); + const [session, setSession] = useState(); const onLoginClicked = useCallback(() => { setLoading(true); @@ -28,14 +32,7 @@ export default function SigninPage() { localStorage.setItem("session", JSON.stringify(session)); localStorage.setItem("ob-token", session.token); - getOuterbaseWorkspace() - .then((w) => { - router.push(`/w/${w.items[0].short_name}`); - }) - .catch(console.error) - .finally(() => { - setLoading(false); - }); + setSession(session); }) .catch((e) => { setLoading(false); @@ -43,7 +40,27 @@ export default function SigninPage() { setError(e.description); } }); - }, [email, password, router]); + }, [email, password]); + + useEffect(() => { + if (!session) return; + + const redirect = localStorage.getItem("continue-redirect"); + if (redirect) { + localStorage.removeItem("continue-redirect"); + router.push(redirect); + return; + } + + getOuterbaseWorkspace() + .then((w) => { + router.push(`/w/${w.items[0].short_name}`); + }) + .catch(console.error) + .finally(() => { + setLoading(false); + }); + }, [session, router]); return ( diff --git a/src/components/gui/json-editor/index.tsx b/src/components/gui/json-editor/index.tsx index 4efae351..89f84e8a 100644 --- a/src/components/gui/json-editor/index.tsx +++ b/src/components/gui/json-editor/index.tsx @@ -13,10 +13,10 @@ interface JsonEditorProps { } function useJsonTheme() { - const { resolvedTheme } = useTheme(); + const { resolvedTheme, forcedTheme } = useTheme(); return useMemo(() => { - if (resolvedTheme === "light") { + if ((forcedTheme ?? resolvedTheme) === "light") { return createTheme({ theme: "light", settings: { @@ -69,7 +69,7 @@ function useJsonTheme() { ], }); } - }, [resolvedTheme]); + }, [resolvedTheme, forcedTheme]); } const JsonEditor = forwardRef( diff --git a/src/components/gui/sql-editor/use-editor-theme.tsx b/src/components/gui/sql-editor/use-editor-theme.tsx index 62fe323b..df3f37ef 100644 --- a/src/components/gui/sql-editor/use-editor-theme.tsx +++ b/src/components/gui/sql-editor/use-editor-theme.tsx @@ -8,10 +8,10 @@ export default function useCodeEditorTheme({ }: { fontSize?: number; }) { - const { resolvedTheme } = useTheme(); + const { resolvedTheme, forcedTheme } = useTheme(); return useMemo(() => { - if (resolvedTheme === "light") { + if ((forcedTheme ?? resolvedTheme) === "light") { return createTheme({ theme: "light", settings: { @@ -73,5 +73,5 @@ export default function useCodeEditorTheme({ ], }); } - }, [resolvedTheme, fontSize]); + }, [resolvedTheme, forcedTheme, fontSize]); }