Yimaru-Admin/src/api/emailTemplates.api.ts
Yared Yemane e75420e756 feat(admin): analytics user breakdowns, email templates, and team invites
Surface education, occupation, learning goals, and language challenges on the analytics page with normalized dashboard API parsing. Add email template management, accept-invite onboarding, and role-based team invitations.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-05-22 10:21:55 -07:00

70 lines
2.3 KiB
TypeScript

import http from "./http"
import type {
CreateEmailTemplateRequest,
CreateEmailTemplateResponse,
DeleteEmailTemplateResponse,
EmailTemplate,
GetEmailTemplateBySlugResponse,
GetEmailTemplatesResponse,
UpdateEmailTemplateRequest,
UpdateEmailTemplateResponse,
} from "../types/emailTemplate.types"
/** GET /admin/email-templates — list all email templates. */
export const getEmailTemplates = () =>
http.get<GetEmailTemplatesResponse>("/admin/email-templates")
/** GET /admin/email-templates/slug/:slug — single template by slug. */
export const getEmailTemplateBySlug = (slug: string) =>
http.get<GetEmailTemplateBySlugResponse>(
`/admin/email-templates/slug/${encodeURIComponent(slug)}`,
)
function normalizeEmailTemplate(row: unknown): EmailTemplate | null {
if (!row || typeof row !== "object" || !("slug" in row)) return null
const t = row as EmailTemplate
return {
...t,
variables: Array.isArray(t.variables) ? t.variables : [],
status: t.status ?? "ACTIVE",
updated_at: t.updated_at ?? t.created_at ?? "",
}
}
export function parseEmailTemplatesResponse(
response: Awaited<ReturnType<typeof getEmailTemplates>>,
): EmailTemplate[] {
const data = response.data?.data
const rows = Array.isArray(data)
? data
: Array.isArray(data?.templates)
? data.templates
: []
return rows
.map(normalizeEmailTemplate)
.filter((row): row is EmailTemplate => row != null)
}
/** PUT /admin/email-templates/:id — update subject and bodies. */
export const updateEmailTemplate = (
id: number,
data: UpdateEmailTemplateRequest,
) => http.put<UpdateEmailTemplateResponse>(`/admin/email-templates/${id}`, data)
/** POST /admin/email-templates — create a custom template. */
export const createEmailTemplate = (data: CreateEmailTemplateRequest) =>
http.post<CreateEmailTemplateResponse>("/admin/email-templates", data)
/** DELETE /admin/email-templates/:id — delete a custom template. */
export const deleteEmailTemplate = (id: number) =>
http.delete<DeleteEmailTemplateResponse>(`/admin/email-templates/${id}`)
export function parseEmailTemplateResponse(
response:
| Awaited<ReturnType<typeof getEmailTemplateBySlug>>
| Awaited<ReturnType<typeof updateEmailTemplate>>
| Awaited<ReturnType<typeof createEmailTemplate>>,
): EmailTemplate | null {
return normalizeEmailTemplate(response.data?.data)
}