811d4cad42
Users can now report bugs, suggestions, or questions from a new /support page. Each submission sends a confirmation email and, when GITEA_URL/ GITEA_TOKEN/GITEA_REPO are configured in admin Settings, opens a labeled issue on that repo automatically (best-effort — failure doesn't block the ticket). Admins get a Support section to triage status and retry failed Gitea issue creation. New support_tickets table, gitea.ts client, site-settings entries for the three new secrets, and OpenAPI docs for the two user-facing endpoints. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
41 lines
1.3 KiB
TypeScript
41 lines
1.3 KiB
TypeScript
import type { Metadata } from "next";
|
|
import { headers } from "next/headers";
|
|
import { auth } from "@/lib/auth/server";
|
|
import { db, supportTickets, eq, desc } from "@epicure/db";
|
|
import { SupportManager } from "@/components/support/support-manager";
|
|
import { getMessages } from "@/lib/i18n/server";
|
|
|
|
export const metadata: Metadata = {};
|
|
|
|
export default async function SupportPage() {
|
|
const session = await auth.api.getSession({ headers: await headers() });
|
|
if (!session) return null;
|
|
const m = getMessages((session.user as { locale?: string }).locale);
|
|
|
|
const rows = await db
|
|
.select()
|
|
.from(supportTickets)
|
|
.where(eq(supportTickets.userId, session.user.id))
|
|
.orderBy(desc(supportTickets.createdAt));
|
|
|
|
return (
|
|
<div className="space-y-8 max-w-3xl">
|
|
<div>
|
|
<h1 className="text-2xl font-bold tracking-tight">{m.support.title}</h1>
|
|
<p className="text-muted-foreground text-sm mt-1">{m.support.subtitle}</p>
|
|
</div>
|
|
<SupportManager
|
|
initialTickets={rows.map((r) => ({
|
|
id: r.id,
|
|
type: r.type,
|
|
title: r.title,
|
|
description: r.description,
|
|
status: r.status,
|
|
giteaIssueUrl: r.giteaIssueUrl,
|
|
createdAt: r.createdAt.toISOString(),
|
|
}))}
|
|
/>
|
|
</div>
|
|
);
|
|
}
|