diff options
| author | Frank <[email protected]> | 2025-09-18 10:59:01 -0400 |
|---|---|---|
| committer | Frank <[email protected]> | 2025-09-18 10:59:01 -0400 |
| commit | 4ceabdffa07b1af8d99eb73622a4d549d99ec6d2 (patch) | |
| tree | 72e2ae62084a9e24cc76caffbd1f30dafc69ea56 /packages/console/app/src/routes/workspace.tsx | |
| parent | c87480cf931a6f8f8b55552558ef521f1918b578 (diff) | |
| download | opencode-4ceabdffa07b1af8d99eb73622a4d549d99ec6d2.tar.gz opencode-4ceabdffa07b1af8d99eb73622a4d549d99ec6d2.zip | |
wip: zen
Diffstat (limited to 'packages/console/app/src/routes/workspace.tsx')
| -rw-r--r-- | packages/console/app/src/routes/workspace.tsx | 67 |
1 files changed, 67 insertions, 0 deletions
diff --git a/packages/console/app/src/routes/workspace.tsx b/packages/console/app/src/routes/workspace.tsx new file mode 100644 index 000000000..3aa3f20d3 --- /dev/null +++ b/packages/console/app/src/routes/workspace.tsx @@ -0,0 +1,67 @@ +import "./workspace.css" +import { useAuthSession } from "~/context/auth.session" +import { IconLogo } from "../component/icon" +import { withActor } from "~/context/auth.withActor" +import { + query, + action, + redirect, + createAsync, + RouteSectionProps, + Navigate, + useNavigate, + useParams, + A, +} from "@solidjs/router" +import { User } from "@opencode/console-core/user.js" +import { Actor } from "@opencode/console-core/actor.js" +import { getRequestEvent } from "solid-js/web" + +const getUserInfo = query(async (workspaceID: string) => { + "use server" + return withActor(async () => { + const actor = Actor.assert("user") + return await User.fromID(actor.properties.userID) + }, workspaceID) +}, "userInfo") + +const logout = action(async () => { + "use server" + const auth = await useAuthSession() + const event = getRequestEvent() + const current = auth.data.current + if (current) + await auth.update((val) => { + delete val.account?.[current] + const first = Object.keys(val.account ?? {})[0] + val.current = first + event!.locals.actor = undefined + return val + }) + throw redirect("/") +}) + +export default function WorkspaceLayout(props: RouteSectionProps) { + const params = useParams() + const userInfo = createAsync(() => getUserInfo(params.id)) + return ( + <main data-page="workspace"> + <header data-component="workspace-header"> + <div data-slot="header-brand"> + <A href="/" data-component="site-title"> + <IconLogo /> + </A> + </div> + <div data-slot="header-actions"> + <span data-slot="user">{userInfo()?.email}</span> + <form action={logout} method="post"> + <button type="submit" formaction={logout}> + Logout + </button> + </form> + </div> + </header> + <div>{props.children}</div> + </main> + ) +} |
