Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
mastodon
GitHub Repository: mastodon/joinmastodon
Path: blob/main/pages/donate/complete.tsx
1006 views
1
import Image from "next/image"
2
import { FormattedMessage } from "react-intl"
3
4
import { sendMessage, themeSchema } from "../../donate/utils"
5
import donatedImage from "../../public/illustrations/donation_successful.png"
6
import { Button } from "../../components/Button"
7
import { useCallback, useEffect } from "react"
8
import { DonateWrapper } from "../../components/donate/DonateWrapper"
9
import { Theme } from "../../donate/types"
10
import { GetServerSideProps, InferGetServerSidePropsType } from "next"
11
import z from "zod"
12
import { useRouter } from "next/navigation"
13
14
export default function DonateCompletePage({
15
theme,
16
redirectUrl,
17
}: InferGetServerSidePropsType<typeof getServerSideProps>) {
18
const router = useRouter()
19
const handleClose = useCallback(() => {
20
sendMessage("close")
21
if (redirectUrl) {
22
router.push(redirectUrl)
23
}
24
}, [redirectUrl, router])
25
useEffect(() => {
26
sendMessage("complete-loaded")
27
}, [])
28
29
return (
30
<DonateWrapper theme={theme}>
31
<div className="p-8 gap-2 justify-between">
32
<h1 className="sh1">
33
<FormattedMessage
34
id="donate_widget.success.header"
35
defaultMessage="Thank you for your contribution!"
36
/>
37
</h1>
38
<p className="text-gray-1 dark:text-gray-2">
39
<FormattedMessage
40
id="donate_widget.success.subtitle"
41
defaultMessage="You should receive an email confirming your donation soon."
42
/>
43
</p>
44
<Image
45
src={donatedImage}
46
alt=""
47
className="w-full max-w-80 mx-auto my-4"
48
/>
49
<Button onClick={handleClose} fullWidth dark>
50
<FormattedMessage
51
id="donate_widget.success.close"
52
defaultMessage="Close"
53
/>
54
</Button>
55
</div>
56
</DonateWrapper>
57
)
58
}
59
60
interface DonateCompletePageProps {
61
theme: Theme
62
redirectUrl: string | null
63
}
64
65
const querySchema = z.object({
66
theme: themeSchema,
67
redirectUrl: z.string().url().nullable().default(null),
68
})
69
70
export const getServerSideProps: GetServerSideProps<
71
DonateCompletePageProps
72
> = async ({ query }) => {
73
const { theme, redirectUrl } = querySchema.parse(query)
74
return {
75
props: {
76
theme,
77
redirectUrl,
78
},
79
}
80
}
81
82