-
Notifications
You must be signed in to change notification settings - Fork 369
/
toast.server.ts
62 lines (55 loc) · 1.67 KB
/
toast.server.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
import { createId as cuid } from '@paralleldrive/cuid2'
import { createCookieSessionStorage, redirect } from '@remix-run/node'
import { z } from 'zod'
import { combineHeaders } from './misc.tsx'
export const toastKey = 'toast'
const ToastSchema = z.object({
description: z.string(),
id: z.string().default(() => cuid()),
title: z.string().optional(),
type: z.enum(['message', 'success', 'error']).default('message'),
})
export type Toast = z.infer<typeof ToastSchema>
export type ToastInput = z.input<typeof ToastSchema>
export const toastSessionStorage = createCookieSessionStorage({
cookie: {
name: 'en_toast',
sameSite: 'lax',
path: '/',
httpOnly: true,
secrets: process.env.SESSION_SECRET.split(','),
secure: process.env.NODE_ENV === 'production',
},
})
export async function redirectWithToast(
url: string,
toast: ToastInput,
init?: ResponseInit,
) {
return redirect(url, {
...init,
headers: combineHeaders(init?.headers, await createToastHeaders(toast)),
})
}
export async function createToastHeaders(toastInput: ToastInput) {
const session = await toastSessionStorage.getSession()
const toast = ToastSchema.parse(toastInput)
session.flash(toastKey, toast)
const cookie = await toastSessionStorage.commitSession(session)
return new Headers({ 'set-cookie': cookie })
}
export async function getToast(request: Request) {
const session = await toastSessionStorage.getSession(
request.headers.get('cookie'),
)
const result = ToastSchema.safeParse(session.get(toastKey))
const toast = result.success ? result.data : null
return {
toast,
headers: toast
? new Headers({
'set-cookie': await toastSessionStorage.destroySession(session),
})
: null,
}
}