From 06ee3d9cc28579e221b789431c9ea2949b7aae49 Mon Sep 17 00:00:00 2001 From: Maximilian Kaske Date: Fri, 3 Jan 2025 15:48:18 +0100 Subject: [PATCH] chore: add zod schema --- packages/emails/emails/monitor-alert.tsx | 25 +++++++++++--------- packages/emails/emails/page-subscription.tsx | 23 +++++++++++------- packages/emails/emails/status-report.tsx | 19 ++++++++------- packages/emails/emails/team-invitation.tsx | 13 ++++++---- 4 files changed, 47 insertions(+), 33 deletions(-) diff --git a/packages/emails/emails/monitor-alert.tsx b/packages/emails/emails/monitor-alert.tsx index 646dbd4e..9c2d6d07 100644 --- a/packages/emails/emails/monitor-alert.tsx +++ b/packages/emails/emails/monitor-alert.tsx @@ -14,19 +14,22 @@ import { Row, Text, } from "@react-email/components"; +import { z } from "zod"; import { Layout } from "./_components/layout"; import { colors, styles } from "./_components/styles"; -export interface MonitorAlertProps { - type: "degraded" | "up" | "down"; - name?: string; - url?: string; - method?: string; - status?: string; - latency?: string; - location?: string; - timestamp?: string; -} +const MonitorAlertSchema = z.object({ + type: z.enum(["degraded", "up", "down"]), + name: z.string().optional(), + url: z.string().optional(), + method: z.string().optional(), + status: z.string().optional(), + latency: z.string().optional(), + location: z.string().optional(), + timestamp: z.string().optional(), +}); + +export type MonitorAlertProps = z.infer; function getIcon(type: MonitorAlertProps["type"]): { src: string; @@ -149,7 +152,7 @@ export const MonitorAlertEmail = (props: MonitorAlertProps) => ( ); MonitorAlertEmail.PreviewProps = { - type: "down", + type: "up", name: "Ping Pong", url: "https://openstatus.dev/ping", method: "GET", diff --git a/packages/emails/emails/page-subscription.tsx b/packages/emails/emails/page-subscription.tsx index 6452efee..a237b36e 100644 --- a/packages/emails/emails/page-subscription.tsx +++ b/packages/emails/emails/page-subscription.tsx @@ -9,18 +9,23 @@ import { Preview, Text, } from "@react-email/components"; +import { z } from "zod"; import { Layout } from "./_components/layout"; import { styles } from "./_components/styles"; -export interface PageSubscriptionProps { - token: string; - page: string; - domain: string; - img?: { - src: string; - alt: string; - }; -} +export const PageSubscriptionSchema = z.object({ + token: z.string(), + page: z.string(), + domain: z.string(), + img: z + .object({ + src: z.string(), + alt: z.string(), + }) + .optional(), +}); + +export type PageSubscriptionProps = z.infer; const PageSubscriptionEmail = ({ token, diff --git a/packages/emails/emails/status-report.tsx b/packages/emails/emails/status-report.tsx index d90bd5ab..1cc611d3 100644 --- a/packages/emails/emails/status-report.tsx +++ b/packages/emails/emails/status-report.tsx @@ -10,17 +10,20 @@ import { Row, Text, } from "@react-email/components"; +import { z } from "zod"; import { Layout } from "./_components/layout"; import { colors, styles } from "./_components/styles"; -export interface StatusReportProps { - pageTitle: string; - status: "investigating" | "identified" | "monitoring" | "resolved"; - date: string; - message: string; - reportTitle: string; - monitors: string[]; // array of monitor names -} +export const StatusReportSchema = z.object({ + pageTitle: z.string(), + status: z.enum(["investigating", "identified", "monitoring", "resolved"]), + date: z.string(), + message: z.string(), + reportTitle: z.string(), + monitors: z.array(z.string()), +}); + +export type StatusReportProps = z.infer; function getStatusColor(status: string) { switch (status) { diff --git a/packages/emails/emails/team-invitation.tsx b/packages/emails/emails/team-invitation.tsx index 14b8c518..23a11d36 100644 --- a/packages/emails/emails/team-invitation.tsx +++ b/packages/emails/emails/team-invitation.tsx @@ -9,14 +9,17 @@ import { Preview, Text, } from "@react-email/components"; +import { z } from "zod"; import { Layout } from "./_components/layout"; import { styles } from "./_components/styles"; -export interface TeamInvitationProps { - invitedBy: string; // email address - workspaceName?: string; - token: string; -} +export const TeamInvitationSchema = z.object({ + invitedBy: z.string(), + workspaceName: z.string().optional().nullable(), + token: z.string(), +}); + +export type TeamInvitationProps = z.infer; const TeamInvitationEmail = ({ token, -- 2.51.2