From 7b2f98b823ce51609edea6b4088b0447d70a3040 Mon Sep 17 00:00:00 2001 From: ibraheemshaikh5 Date: Thu, 5 Feb 2026 20:36:59 -0500 Subject: [PATCH 1/2] feat(email): enhance email ui --- public/email-logo.png | Bin 0 -> 10838 bytes public/email-logo.svg | 12 ++ .../workspaces/[id]/collaborators/route.ts | 9 +- src/components/email/invite-email.tsx | 184 +++++++++++++++--- 4 files changed, 175 insertions(+), 30 deletions(-) create mode 100644 public/email-logo.png create mode 100644 public/email-logo.svg diff --git a/public/email-logo.png b/public/email-logo.png new file mode 100644 index 0000000000000000000000000000000000000000..8c5d0e92638fb023322449fdc1356b4901a8b169 GIT binary patch literal 10838 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 E00n$(r~m)} literal 0 HcmV?d00001 diff --git a/public/email-logo.svg b/public/email-logo.svg new file mode 100644 index 00000000..5c6349da --- /dev/null +++ b/public/email-logo.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/src/app/api/workspaces/[id]/collaborators/route.ts b/src/app/api/workspaces/[id]/collaborators/route.ts index a6276e71..baec3b27 100644 --- a/src/app/api/workspaces/[id]/collaborators/route.ts +++ b/src/app/api/workspaces/[id]/collaborators/route.ts @@ -156,7 +156,8 @@ async function handlePOST( .select({ userId: workspaces.userId, name: workspaces.name, - slug: workspaces.slug + slug: workspaces.slug, + color: workspaces.color }) .from(workspaces) .where(eq(workspaces.id, workspaceId)) @@ -202,7 +203,10 @@ async function handlePOST( inviterName: currentUser.name || 'A user', workspaceName: ws.name || 'Workspace', workspaceUrl, + workspaceColor: ws.color || undefined, + permissionLevel, }), + }); if (error) console.error("Failed to send invitation email:", error); } catch (emailError) { @@ -269,7 +273,10 @@ async function handlePOST( inviterName: currentUser.name || 'A user', workspaceName: ws.name || 'Workspace', workspaceUrl, + workspaceColor: ws.color || undefined, + permissionLevel, }), + attachments: [logoAttachment], }); } catch (emailError) { console.error("Error sending pending invitation email:", emailError); diff --git a/src/components/email/invite-email.tsx b/src/components/email/invite-email.tsx index bdf693e5..382f50bc 100644 --- a/src/components/email/invite-email.tsx +++ b/src/components/email/invite-email.tsx @@ -1,46 +1,172 @@ import * as React from 'react'; +const FONT = + 'Inter, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif'; +const BRAND_FONT = + 'Outfit, Inter, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif'; +const BG = '#111113'; + interface InviteEmailTemplateProps { inviterName?: string; workspaceName: string; workspaceUrl: string; + workspaceColor?: string; + permissionLevel?: string; } export function InviteEmailTemplate({ inviterName, workspaceName, workspaceUrl, + permissionLevel, }: Readonly): React.ReactElement { + const roleText = permissionLevel === 'viewer' ? 'a viewer' : 'an editor'; + return ( -
-

- You've been invited to collaborate! -

-

- {inviterName || 'Someone'} has invited you to collaborate on the workspace {workspaceName}. -

- -

- or copy and paste this link into your browser:
- - {workspaceUrl} - -

+
+ + + + +
+ + {/* Heading + Body text */} + + + + + {/* CTA Button */} + + + + + {/* Fallback URL */} + + + + + {/* Footer */} + + + +
+

+ You're invited to collaborate! +

+

+ {inviterName || 'Someone'} has invited you to join the workspace{' '} + “{workspaceName}” + {permissionLevel ? ` as ${roleText}` : ''}. +

+
+ + Join Workspace + +
+

+ or copy and paste this link into your browser: +
+ + {workspaceUrl} + +

+
+

+ The Workspace That Thinks With You +

+

+ You received this email because {inviterName || 'someone'} invited you to collaborate on ThinkEx. If you believe this was sent in error, you can safely ignore this email. +

+

+ © {new Date().getFullYear()} ThinkEx +

+
+
); } From 22ab82482d06827ec03e196be5a33cc5f90699b1 Mon Sep 17 00:00:00 2001 From: ibraheemshaikh5 Date: Fri, 6 Feb 2026 19:48:28 -0500 Subject: [PATCH 2/2] fix: clean up email invite template and rm unused references --- src/app/api/workspaces/[id]/collaborators/route.ts | 7 +------ src/components/email/invite-email.tsx | 3 +-- 2 files changed, 2 insertions(+), 8 deletions(-) diff --git a/src/app/api/workspaces/[id]/collaborators/route.ts b/src/app/api/workspaces/[id]/collaborators/route.ts index baec3b27..332b81be 100644 --- a/src/app/api/workspaces/[id]/collaborators/route.ts +++ b/src/app/api/workspaces/[id]/collaborators/route.ts @@ -156,8 +156,7 @@ async function handlePOST( .select({ userId: workspaces.userId, name: workspaces.name, - slug: workspaces.slug, - color: workspaces.color + slug: workspaces.slug }) .from(workspaces) .where(eq(workspaces.id, workspaceId)) @@ -203,7 +202,6 @@ async function handlePOST( inviterName: currentUser.name || 'A user', workspaceName: ws.name || 'Workspace', workspaceUrl, - workspaceColor: ws.color || undefined, permissionLevel, }), @@ -273,10 +271,7 @@ async function handlePOST( inviterName: currentUser.name || 'A user', workspaceName: ws.name || 'Workspace', workspaceUrl, - workspaceColor: ws.color || undefined, - permissionLevel, }), - attachments: [logoAttachment], }); } catch (emailError) { console.error("Error sending pending invitation email:", emailError); diff --git a/src/components/email/invite-email.tsx b/src/components/email/invite-email.tsx index 382f50bc..ce84594c 100644 --- a/src/components/email/invite-email.tsx +++ b/src/components/email/invite-email.tsx @@ -10,7 +10,6 @@ interface InviteEmailTemplateProps { inviterName?: string; workspaceName: string; workspaceUrl: string; - workspaceColor?: string; permissionLevel?: string; } @@ -20,7 +19,7 @@ export function InviteEmailTemplate({ workspaceUrl, permissionLevel, }: Readonly): React.ReactElement { - const roleText = permissionLevel === 'viewer' ? 'a viewer' : 'an editor'; + const roleText = permissionLevel === 'viewer' ? 'a Viewer' : 'an Editor'; return (