Frank пре 4 месеци
родитељ
комит
c7dfbbeed0

+ 19 - 1
packages/console/core/src/user.ts

@@ -11,6 +11,7 @@ import { Account } from "./account"
 import { AccountTable } from "./schema/account.sql"
 import { Key } from "./key"
 import { KeyTable } from "./schema/key.sql"
+import { WorkspaceTable } from "./schema/workspace.sql"
 
 export namespace User {
   const assertNotSelf = (id: string) => {
@@ -115,6 +116,21 @@ export namespace User {
 
       // send email, ignore errors
       try {
+        const emailInfo = await Database.use((tx) =>
+          tx
+            .select({
+              email: AccountTable.email,
+              workspaceName: WorkspaceTable.name,
+            })
+            .from(UserTable)
+            .innerJoin(AccountTable, eq(UserTable.accountID, AccountTable.id))
+            .innerJoin(WorkspaceTable, eq(WorkspaceTable.id, workspaceID))
+            .where(
+              and(eq(UserTable.workspaceID, workspaceID), eq(UserTable.id, Actor.assert("user").properties.userID)),
+            )
+            .then((rows) => rows[0]),
+        )
+
         const { InviteEmail } = await import("@opencode-ai/console-mail/InviteEmail.jsx")
         await AWS.sendEmail({
           to: email,
@@ -122,8 +138,10 @@ export namespace User {
           body: render(
             // @ts-ignore
             InviteEmail({
+              inviter: emailInfo.email,
               assetsUrl: `https://opencode.ai/email`,
-              workspace: workspaceID,
+              workspaceID: workspaceID,
+              workspaceName: emailInfo.workspaceName,
             }),
           ),
         })

+ 4 - 0
packages/console/mail/emails/components.tsx

@@ -31,6 +31,10 @@ export function A({ children, ...props }: AProps) {
   return React.createElement("a", props, children)
 }
 
+export function B({ children, ...props }: AProps) {
+  return React.createElement("b", props, children)
+}
+
 export function Span({ children, ...props }: SpanProps) {
   return React.createElement("span", props, children)
 }

+ 28 - 32
packages/console/mail/emails/templates/InviteEmail.tsx

@@ -1,7 +1,7 @@
 // @ts-nocheck
 import React from "react"
 import { Img, Row, Html, Link, Body, Head, Button, Column, Preview, Section, Container } from "@jsx-email/all"
-import { Hr, Text, Fonts, SplitString, Title, A, Span } from "../components"
+import { Hr, Text, Fonts, SplitString, Title, A, Span, B } from "../components"
 import {
   unit,
   body,
@@ -23,17 +23,24 @@ const CONSOLE_URL = "https://opencode.ai/"
 const DOC_URL = "https://opencode.ai/docs/zen"
 
 interface InviteEmailProps {
-  workspace: string
+  inviter: string
+  workspaceID: string
+  workspaceName: string
   assetsUrl: string
 }
-export const InviteEmail = ({ workspace, assetsUrl = LOCAL_ASSETS_URL }: InviteEmailProps) => {
-  const subject = `Join the ${workspace} workspace`
-  const messagePlain = `You've been invited to join the ${workspace} workspace in the OpenCode Zen Console.`
-  const url = `${CONSOLE_URL}workspace/${workspace}`
+export const InviteEmail = ({
+  inviter = "[email protected]",
+  workspaceID = "wrk_01K6XFY7V53T8XN0A7X8G9BTN3",
+  workspaceName = "anomaly",
+  assetsUrl = LOCAL_ASSETS_URL,
+}: InviteEmailProps) => {
+  const subject = `You were invited to the OpenCode Console`
+  const messagePlain = `${inviter} invited you to join the ${workspaceName} workspace (${workspaceID}).`
+  const url = `${CONSOLE_URL}workspace/${workspaceID}`
   return (
     <Html lang="en">
       <Head>
-        <Title>{`OpenCode Zen — ${messagePlain}`}</Title>
+        <Title>{`OpenCode — ${messagePlain}`}</Title>
       </Head>
       <Fonts assetsUrl={assetsUrl} />
       <Preview>{messagePlain}</Preview>
@@ -42,15 +49,10 @@ export const InviteEmail = ({ workspace, assetsUrl = LOCAL_ASSETS_URL }: InviteE
           <Section style={frame}>
             <Row>
               <Column>
-                <A href={CONSOLE_URL}>
-                  <Img height="32" alt="OpenCode Zen Logo" src={`${assetsUrl}/zen-logo.png`} />
+                <A href={`${CONSOLE_URL}zen`}>
+                  <Img height="32" alt="OpenCode Logo" src={`${assetsUrl}/logo.png`} />
                 </A>
               </Column>
-              <Column align="right">
-                <Button style={buttonPrimary} href={url}>
-                  <Span style={code}>Join Workspace</Span>
-                </Button>
-              </Column>
             </Row>
 
             <Row style={headingHr}>
@@ -59,32 +61,26 @@ export const InviteEmail = ({ workspace, assetsUrl = LOCAL_ASSETS_URL }: InviteE
               </Column>
             </Row>
 
-            <Section>
-              <Text style={{ ...compactText, ...breadcrumb }}>
-                <Span>OpenCode Zen</Span>
-                <Span style={{ ...code, ...breadcrumbColonSeparator }}>:</Span>
-                <Span>{workspace}</Span>
-              </Text>
-              <Text style={{ ...heading, ...compactText }}>
-                <Link href={url}>
-                  <SplitString text={subject} split={40} />
-                </Link>
-              </Text>
-            </Section>
             <Section style={{ padding: `${unit}px 0 0 0` }}>
               <Text style={{ ...compactText }}>
-                You've been invited to join the{" "}
+                <B>{inviter}</B> invited you to join the{" "}
                 <Link style={medium} href={url}>
-                  {workspace}
+                  <B>{workspaceName}</B>
                 </Link>{" "}
-                workspace in the{" "}
-                <Link style={medium} href={CONSOLE_URL}>
-                  OpenCode Zen Console
+                workspace ({workspaceID}) in the{" "}
+                <Link style={medium} href={`${CONSOLE_URL}zen`}>
+                  OpenCode Console
                 </Link>
                 .
               </Text>
             </Section>
 
+            <Section style={{ padding: `${unit}px 0 0 0` }}>
+              <Button style={buttonPrimary} href={url}>
+                <Span style={code}>Join Workspace</Span>
+              </Button>
+            </Section>
+
             <Row style={headingHr}>
               <Column>
                 <Hr />
@@ -93,7 +89,7 @@ export const InviteEmail = ({ workspace, assetsUrl = LOCAL_ASSETS_URL }: InviteE
 
             <Row>
               <Column>
-                <Link href={CONSOLE_URL} style={footerLink}>
+                <Link href={`${CONSOLE_URL}zen`} style={footerLink}>
                   Console
                 </Link>
               </Column>

BIN
packages/console/mail/emails/templates/static/logo.png