diff --git a/packages/console/app/src/component/header.tsx b/packages/console/app/src/component/header.tsx index d6b3e2a4..29b35bfa 100644 --- a/packages/console/app/src/component/header.tsx +++ b/packages/console/app/src/component/header.tsx @@ -4,11 +4,9 @@ import { A, createAsync } from "@solidjs/router" import { createMemo, Match, Show, Switch } from "solid-js" import { createStore } from "solid-js/store" import { github } from "~/lib/github" -import { queryIsLoggedIn } from "~/routes/workspace/common" export function Header(props: { zen?: boolean }) { const githubData = createAsync(() => github()) - const isLoggedIn = createAsync(() => queryIsLoggedIn()) const starCount = createMemo(() => githubData()?.stars ? new Intl.NumberFormat("en-US", { @@ -41,7 +39,7 @@ export function Header(props: { zen?: boolean }) {
  • - {isLoggedIn() ? "Workspace" : "Login"} + Login Zen @@ -112,7 +110,7 @@ export function Header(props: { zen?: boolean }) {
  • - {isLoggedIn() ? "Workspace" : "Login"} + Login Zen diff --git a/packages/console/app/src/routes/auth/index.ts b/packages/console/app/src/routes/auth/index.ts index 63430b77..5b49db15 100644 --- a/packages/console/app/src/routes/auth/index.ts +++ b/packages/console/app/src/routes/auth/index.ts @@ -1,32 +1,10 @@ -import { Actor } from "@opencode-ai/console-core/actor.js" -import { and, Database, desc, eq, isNull } from "@opencode-ai/console-core/drizzle/index.js" -import { UserTable } from "@opencode-ai/console-core/schema/user.sql.js" -import { WorkspaceTable } from "@opencode-ai/console-core/schema/workspace.sql.js" import { redirect } from "@solidjs/router" import type { APIEvent } from "@solidjs/start/server" -import { withActor } from "~/context/auth.withActor" +import { getLastSeenWorkspaceID } from "../workspace/common" export async function GET(input: APIEvent) { try { - const workspaceID = await withActor(async () => { - const actor = Actor.assert("account") - return Database.transaction(async (tx) => - tx - .select({ id: WorkspaceTable.id }) - .from(UserTable) - .innerJoin(WorkspaceTable, eq(UserTable.workspaceID, WorkspaceTable.id)) - .where( - and( - eq(UserTable.accountID, actor.properties.accountID), - isNull(UserTable.timeDeleted), - isNull(WorkspaceTable.timeDeleted), - ), - ) - .orderBy(desc(UserTable.timeSeen)) - .limit(1) - .then((x) => x[0]?.id), - ) - }) + const workspaceID = await getLastSeenWorkspaceID() return redirect(`/workspace/${workspaceID}`) } catch { return redirect("/auth/authorize") diff --git a/packages/console/app/src/routes/workspace/common.tsx b/packages/console/app/src/routes/workspace/common.tsx index 62569322..03a40b57 100644 --- a/packages/console/app/src/routes/workspace/common.tsx +++ b/packages/console/app/src/routes/workspace/common.tsx @@ -3,6 +3,10 @@ import { Actor } from "@opencode-ai/console-core/actor.js" import { action, query } from "@solidjs/router" import { withActor } from "~/context/auth.withActor" import { Billing } from "@opencode-ai/console-core/billing.js" +import { User } from "@opencode-ai/console-core/user.js" +import { and, Database, desc, eq, isNull } from "@opencode-ai/console-core/drizzle/index.js" +import { WorkspaceTable } from "@opencode-ai/console-core/schema/workspace.sql.js" +import { UserTable } from "@opencode-ai/console-core/schema/user.sql.js" export function formatDateForTable(date: Date) { const options: Intl.DateTimeFormatOptions = { @@ -30,17 +34,28 @@ export function formatDateUTC(date: Date) { return date.toLocaleDateString("en-US", options) } -export const queryIsLoggedIn = query(async () => { +export async function getLastSeenWorkspaceID() { "use server" - return withActor(() => { - try { - Actor.assert("account") - return true - } catch { - return false - } + return withActor(async () => { + const actor = Actor.assert("account") + return Database.use(async (tx) => + tx + .select({ id: WorkspaceTable.id }) + .from(UserTable) + .innerJoin(WorkspaceTable, eq(UserTable.workspaceID, WorkspaceTable.id)) + .where( + and( + eq(UserTable.accountID, actor.properties.accountID), + isNull(UserTable.timeDeleted), + isNull(WorkspaceTable.timeDeleted), + ), + ) + .orderBy(desc(UserTable.timeSeen)) + .limit(1) + .then((x) => x[0]?.id), + ) }) -}, "isLoggedIn.get") +} export const querySessionInfo = query(async (workspaceID: string) => { "use server" diff --git a/packages/console/app/src/routes/zen/index.tsx b/packages/console/app/src/routes/zen/index.tsx index 080070d4..08e58e16 100644 --- a/packages/console/app/src/routes/zen/index.tsx +++ b/packages/console/app/src/routes/zen/index.tsx @@ -1,5 +1,5 @@ import "./index.css" -import { createAsync } from "@solidjs/router" +import { createAsync, query, redirect } from "@solidjs/router" import { Title, Meta, Link } from "@solidjs/meta" import { HttpHeader } from "@solidjs/start" import zenLogoLight from "../../asset/zen-ornate-light.svg" @@ -16,10 +16,16 @@ import { Faq } from "~/component/faq" import { Legal } from "~/component/legal" import { Footer } from "~/component/footer" import { Header } from "~/component/header" -import { queryIsLoggedIn } from "~/routes/workspace/common" +import { getLastSeenWorkspaceID } from "../workspace/common" + +const checkLoggedIn = query(async () => { + "use server" + const workspaceID = await getLastSeenWorkspaceID() + if (workspaceID) throw redirect(`/workspace/${workspaceID}`) +}, "checkLoggedIn.get") export default function Home() { - const isLoggedIn = createAsync(() => queryIsLoggedIn()) + createAsync(() => checkLoggedIn()) return (
    @@ -105,7 +111,7 @@ export default function Home() { - {isLoggedIn() ? "Go to workspace " : "Get started with Zen "} + Get started with Zen