import * as z from "zod"; import { fitCodeBlock, PRISM_CODE_BLOCK_STYLES } from "./codeBlockFitting"; export const slideLayoutId = "api-request-response-slide"; export const slideLayoutName = "API Request Response Slide"; export const slideLayoutDescription = "An API-focused slide with endpoint metadata, request payload, and response payload."; export const Schema = z.object({ title: z.string().min(8).max(26).default("API Request / Response").meta({ description: "Main heading shown at the top-left.", }), method: z.enum(["GET", "POST", "PATCH", "DELETE"]).default("POST").meta({ description: "HTTP method badge text.", }), endpoint: z.string().min(8).max(48).default("/api/v1/users/authenticate").meta({ description: "Endpoint path text.", }), headers: z .array(z.string().max(10)) .min(2) .max(2) .default(["Content-Type: application/json", "Authorization: Bearer "]) .meta({ description: "Two header lines shown in the endpoint card.", }), requestSnippet: z.object({ language: z.string().min(2).max(10), fileName: z.string().min(3).max(24), content: z.string().min(20).max(500), }).default({ language: "json", fileName: "request.json", content: `{ "email": "user@example.com user@example.com user@example.com user@example.com user@example.com" , "password": "securepassword123" }`, }).meta({ description: "Request payload example.", }), responseSnippet: z.object({ language: z.string().min(2).max(10), fileName: z.string().min(3).max(24), content: z.string().min(20).max(620), }).default({ language: "json", fileName: "response.json", content: `{ "success": true, "user": { "id": "usr_1234567890", "email": "user@example.com", "name": "John Doe", "role": "admin" }, "token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...", "expiresIn": 3600 }`, }).meta({ description: "Response payload example.", }), }); export type SchemaType = z.infer; function normalizeApiJsonSnippet(content?: string) { return (content || "") .replace(/\r\n?/g, "\n") .replace(/^\s*\/\s*$/gm, ",") .replace(/\n\s*:\s*\n\s*/g, ": ") .replace(/\n\s*\/\s*\n/g, ",\n") .replace(/,\s*([}\]])/g, "$1") .trimEnd(); } const CodeSlide03ApiRequestResponse = ({ data, }: { data: Partial; }) => { const requestCode = fitCodeBlock({ language: "json", content: normalizeApiJsonSnippet(data.requestSnippet?.content), maxWidth: 540, maxHeight: 230, maxFontSize: 14, minFontSize: 8, }); const responseCode = fitCodeBlock({ language: "json", content: normalizeApiJsonSnippet(data.responseSnippet?.content), maxWidth: 540, maxHeight: 430, maxFontSize: 14, minFontSize: 8, }); return ( <>

{data.title}

{data.method}

{data.endpoint}

Headers

{data.headers?.map((item) => (

{item}

))}

{data.requestSnippet?.fileName}

                

{data.responseSnippet?.fileName}

              
); }; export default CodeSlide03ApiRequestResponse;