diff --git a/src/app/intake/[token]/sent/[cardId]/page.tsx b/src/app/intake/[token]/sent/[cardId]/page.tsx new file mode 100644 index 0000000..2429b6e --- /dev/null +++ b/src/app/intake/[token]/sent/[cardId]/page.tsx @@ -0,0 +1,61 @@ +import Link from "next/link"; + +import { resolveIntakeLink } from "@/lib/intake-links"; + +/** + * The "thanks" page after a public submission. + * + * Intentionally static: it does not read the card, does not show the brief, + * does not link to the board. An anonymous submitter should see a clear + * acknowledgement and a way to file another request; nothing more. The card + * detail page is signed-in only, and linking to it from here would either + * 404 or force a session we deliberately do not require. + */ +export default async function IntakeSentPage({ + params, +}: { + params: Promise<{ token: string; cardId: string }>; +}) { + const { token } = await params; + + // We don't actually need the card or the link to render this page; we + // resolve the link only to confirm the token is still alive. A revoked + // token landing on /sent/ would otherwise confirm the submission + // happened — same "doesn't shout" property as the intake page. + const link = await resolveIntakeLink(token); + if (!link || !link.active) { + return ( +
+

Thanks

+

+ Your message was sent. +

+
+ ); + } + + return ( +
+
+

Thanks

+

+ Your request has been sent to the developer. +

+
+ +

+ They will see it on their board and get back to you about what + happens next. There is no notification for you to wait on here. +

+ +
+ + Send another request + +
+
+ ); +}