summaryrefslogtreecommitdiffhomepage
path: root/packages/console/app/src/routes/workspace.tsx
diff options
context:
space:
mode:
authorFrank <[email protected]>2025-09-18 10:59:01 -0400
committerFrank <[email protected]>2025-09-18 10:59:01 -0400
commit4ceabdffa07b1af8d99eb73622a4d549d99ec6d2 (patch)
tree72e2ae62084a9e24cc76caffbd1f30dafc69ea56 /packages/console/app/src/routes/workspace.tsx
parentc87480cf931a6f8f8b55552558ef521f1918b578 (diff)
downloadopencode-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.tsx67
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>
+ )
+}