workspace.tsx 1.3 KB

1234567891011121314151617181920212223242526272829303132333435363738
  1. import { query, createAsync, RouteSectionProps, useParams, A } from "@solidjs/router"
  2. import "./workspace.css"
  3. import { IconWorkspaceLogo } from "../component/icon"
  4. import { WorkspacePicker } from "./workspace-picker"
  5. import { UserMenu } from "./user-menu"
  6. import { withActor } from "~/context/auth.withActor"
  7. import { User } from "@opencode-ai/console-core/user.js"
  8. import { Actor } from "@opencode-ai/console-core/actor.js"
  9. const getUserEmail = query(async (workspaceID: string) => {
  10. "use server"
  11. return withActor(async () => {
  12. const actor = Actor.assert("user")
  13. const email = await User.getAuthEmail(actor.properties.userID)
  14. return email
  15. }, workspaceID)
  16. }, "userEmail")
  17. export default function WorkspaceLayout(props: RouteSectionProps) {
  18. const params = useParams()
  19. const userEmail = createAsync(() => getUserEmail(params.id!))
  20. return (
  21. <main data-page="workspace">
  22. <header data-component="workspace-header">
  23. <div data-slot="header-brand">
  24. <A href="/" data-component="site-title">
  25. <IconWorkspaceLogo />
  26. </A>
  27. <WorkspacePicker />
  28. </div>
  29. <div data-slot="header-actions">
  30. <UserMenu email={userEmail()} />
  31. </div>
  32. </header>
  33. <div>{props.children}</div>
  34. </main>
  35. )
  36. }