Skip to content

Commit

Permalink
improve redirect exercise
Browse files Browse the repository at this point in the history
  • Loading branch information
kentcdodds committed Aug 3, 2023
1 parent f3bd28c commit 8141e0d
Show file tree
Hide file tree
Showing 112 changed files with 232 additions and 121 deletions.
3 changes: 3 additions & 0 deletions exercises/07.protecting-routes/03.problem.redirect/README.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,9 @@ That way, our `requireUserId` utility can take the `request.url` and create an
appropriate `redirectTo` query param automatically when it redirects to the
login page.

🧝‍♂️ Supporting `redirectTo` in `/login` and `/signup` is exactly the same, so
I'll do the `/signup` route for you. Deal? Cool 👍

We'll also want to update the link from our `/login` page to the `/signup` page
so if the user needs to create an account instead, the `redirectTo` will carry
over to that page too.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,8 @@ import {
type DataFunctionArgs,
type V2_MetaFunction,
} from '@remix-run/node'
import { Form, useActionData } from '@remix-run/react'
import { Form, useActionData, useSearchParams } from '@remix-run/react'
import { safeRedirect } from 'remix-utils'
import { z } from 'zod'
import { CheckboxField, ErrorList, Field } from '~/components/forms.tsx'
import { Spacer } from '~/components/spacer.tsx'
Expand Down Expand Up @@ -38,8 +39,8 @@ const SignupFormSchema = z
agreeToTermsOfServiceAndPrivacyPolicy: checkboxSchema(
'You must agree to the terms of service and privacy policy',
),
// 🐨 add config for a redirectTo (optional string)
remember: checkboxSchema(),
redirectTo: z.string().optional(),
})
.superRefine(({ confirmPassword, password }, ctx) => {
if (confirmPassword !== password) {
Expand Down Expand Up @@ -87,15 +88,12 @@ export async function action({ request }: DataFunctionArgs) {
return json({ status: 'error', submission } as const, { status: 400 })
}

// 🐨 get the redirectTo from the submission
const { user, remember } = submission.value
const { user, remember, redirectTo } = submission.value

const cookieSession = await getSession(request.headers.get('cookie'))
cookieSession.set(userIdKey, user.id)

// 🐨 redirect to the redirectTo
// 🦉 Make sure to use the safeRedirect utility from remix-utils
return redirect('/', {
return redirect(safeRedirect(redirectTo), {
headers: {
'set-cookie': await commitSession(cookieSession, {
expires: remember
Expand All @@ -113,13 +111,13 @@ export const meta: V2_MetaFunction = () => {
export default function SignupRoute() {
const actionData = useActionData<typeof action>()
const isSubmitting = useIsSubmitting()
// 🐨 get the search params via useSearchParams from @remix-run/react
// 🐨 get the redirectTo from the search params
const [searchParams] = useSearchParams()
const redirectTo = searchParams.get('redirectTo')

const [form, fields] = useForm({
id: 'signup-form',
constraint: getFieldsetConstraint(SignupFormSchema),
// 🐨 add a defaultValues object with the redirectTo
defaultValue: { redirectTo },
lastSubmission: actionData?.submission,
onValidate({ formData }) {
return parse(formData, { schema: SignupFormSchema })
Expand Down Expand Up @@ -211,7 +209,7 @@ export default function SignupRoute() {
errors={fields.remember.errors}
/>

{/* 🐨 add a hidden input here for the redirectTo */}
<input {...conform.input(fields.redirectTo, { type: 'hidden' })} />

<ErrorList errors={form.errors} id={form.errorId} />

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -156,7 +156,9 @@ export default function LoginPage() {
</div>
</div>

<input {...conform.input(fields.redirectTo)} type="hidden" />
<input
{...conform.input(fields.redirectTo, { type: 'hidden' })}
/>
<ErrorList errors={form.errors} id={form.errorId} />

<div className="flex items-center justify-between gap-6 pt-3">
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -209,7 +209,7 @@ export default function SignupRoute() {
errors={fields.remember.errors}
/>

<input {...conform.input(fields.redirectTo)} type="hidden" />
<input {...conform.input(fields.redirectTo, { type: 'hidden' })} />
<ErrorList errors={form.errors} id={form.errorId} />

<div className="flex items-center justify-between gap-6">
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -156,7 +156,9 @@ export default function LoginPage() {
</div>
</div>

<input {...conform.input(fields.redirectTo)} type="hidden" />
<input
{...conform.input(fields.redirectTo, { type: 'hidden' })}
/>
<ErrorList errors={form.errors} id={form.errorId} />

<div className="flex items-center justify-between gap-6 pt-3">
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -209,7 +209,7 @@ export default function SignupRoute() {
errors={fields.remember.errors}
/>

<input {...conform.input(fields.redirectTo)} type="hidden" />
<input {...conform.input(fields.redirectTo, { type: 'hidden' })} />
<ErrorList errors={form.errors} id={form.errorId} />

<div className="flex items-center justify-between gap-6">
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -156,7 +156,9 @@ export default function LoginPage() {
</div>
</div>

<input {...conform.input(fields.redirectTo)} type="hidden" />
<input
{...conform.input(fields.redirectTo, { type: 'hidden' })}
/>
<ErrorList errors={form.errors} id={form.errorId} />

<div className="flex items-center justify-between gap-6 pt-3">
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -209,7 +209,7 @@ export default function SignupRoute() {
errors={fields.remember.errors}
/>

<input {...conform.input(fields.redirectTo)} type="hidden" />
<input {...conform.input(fields.redirectTo, { type: 'hidden' })} />
<ErrorList errors={form.errors} id={form.errorId} />

<div className="flex items-center justify-between gap-6">
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -156,7 +156,9 @@ export default function LoginPage() {
</div>
</div>

<input {...conform.input(fields.redirectTo)} type="hidden" />
<input
{...conform.input(fields.redirectTo, { type: 'hidden' })}
/>
<ErrorList errors={form.errors} id={form.errorId} />

<div className="flex items-center justify-between gap-6 pt-3">
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -209,7 +209,7 @@ export default function SignupRoute() {
errors={fields.remember.errors}
/>

<input {...conform.input(fields.redirectTo)} type="hidden" />
<input {...conform.input(fields.redirectTo, { type: 'hidden' })} />
<ErrorList errors={form.errors} id={form.errorId} />

<div className="flex items-center justify-between gap-6">
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -156,7 +156,9 @@ export default function LoginPage() {
</div>
</div>

<input {...conform.input(fields.redirectTo)} type="hidden" />
<input
{...conform.input(fields.redirectTo, { type: 'hidden' })}
/>
<ErrorList errors={form.errors} id={form.errorId} />

<div className="flex items-center justify-between gap-6 pt-3">
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -209,7 +209,7 @@ export default function SignupRoute() {
errors={fields.remember.errors}
/>

<input {...conform.input(fields.redirectTo)} type="hidden" />
<input {...conform.input(fields.redirectTo, { type: 'hidden' })} />
<ErrorList errors={form.errors} id={form.errorId} />

<div className="flex items-center justify-between gap-6">
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -156,7 +156,9 @@ export default function LoginPage() {
</div>
</div>

<input {...conform.input(fields.redirectTo)} type="hidden" />
<input
{...conform.input(fields.redirectTo, { type: 'hidden' })}
/>
<ErrorList errors={form.errors} id={form.errorId} />

<div className="flex items-center justify-between gap-6 pt-3">
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -209,7 +209,7 @@ export default function SignupRoute() {
errors={fields.remember.errors}
/>

<input {...conform.input(fields.redirectTo)} type="hidden" />
<input {...conform.input(fields.redirectTo, { type: 'hidden' })} />
<ErrorList errors={form.errors} id={form.errorId} />

<div className="flex items-center justify-between gap-6">
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -156,7 +156,9 @@ export default function LoginPage() {
</div>
</div>

<input {...conform.input(fields.redirectTo)} type="hidden" />
<input
{...conform.input(fields.redirectTo, { type: 'hidden' })}
/>
<ErrorList errors={form.errors} id={form.errorId} />

<div className="flex items-center justify-between gap-6 pt-3">
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -209,7 +209,7 @@ export default function SignupRoute() {
errors={fields.remember.errors}
/>

<input {...conform.input(fields.redirectTo)} type="hidden" />
<input {...conform.input(fields.redirectTo, { type: 'hidden' })} />
<ErrorList errors={form.errors} id={form.errorId} />

<div className="flex items-center justify-between gap-6">
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -156,7 +156,9 @@ export default function LoginPage() {
</div>
</div>

<input {...conform.input(fields.redirectTo)} type="hidden" />
<input
{...conform.input(fields.redirectTo, { type: 'hidden' })}
/>
<ErrorList errors={form.errors} id={form.errorId} />

<div className="flex items-center justify-between gap-6 pt-3">
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -209,7 +209,7 @@ export default function SignupRoute() {
errors={fields.remember.errors}
/>

<input {...conform.input(fields.redirectTo)} type="hidden" />
<input {...conform.input(fields.redirectTo, { type: 'hidden' })} />
<ErrorList errors={form.errors} id={form.errorId} />

<div className="flex items-center justify-between gap-6">
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -156,7 +156,9 @@ export default function LoginPage() {
</div>
</div>

<input {...conform.input(fields.redirectTo)} type="hidden" />
<input
{...conform.input(fields.redirectTo, { type: 'hidden' })}
/>
<ErrorList errors={form.errors} id={form.errorId} />

<div className="flex items-center justify-between gap-6 pt-3">
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -209,7 +209,7 @@ export default function SignupRoute() {
errors={fields.remember.errors}
/>

<input {...conform.input(fields.redirectTo)} type="hidden" />
<input {...conform.input(fields.redirectTo, { type: 'hidden' })} />
<ErrorList errors={form.errors} id={form.errorId} />

<div className="flex items-center justify-between gap-6">
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -156,7 +156,9 @@ export default function LoginPage() {
</div>
</div>

<input {...conform.input(fields.redirectTo)} type="hidden" />
<input
{...conform.input(fields.redirectTo, { type: 'hidden' })}
/>
<ErrorList errors={form.errors} id={form.errorId} />

<div className="flex items-center justify-between gap-6 pt-3">
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -209,7 +209,7 @@ export default function SignupRoute() {
errors={fields.remember.errors}
/>

<input {...conform.input(fields.redirectTo)} type="hidden" />
<input {...conform.input(fields.redirectTo, { type: 'hidden' })} />
<ErrorList errors={form.errors} id={form.errorId} />

<div className="flex items-center justify-between gap-6">
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -156,7 +156,9 @@ export default function LoginPage() {
</div>
</div>

<input {...conform.input(fields.redirectTo)} type="hidden" />
<input
{...conform.input(fields.redirectTo, { type: 'hidden' })}
/>
<ErrorList errors={form.errors} id={form.errorId} />

<div className="flex items-center justify-between gap-6 pt-3">
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -209,7 +209,7 @@ export default function SignupRoute() {
errors={fields.remember.errors}
/>

<input {...conform.input(fields.redirectTo)} type="hidden" />
<input {...conform.input(fields.redirectTo, { type: 'hidden' })} />
<ErrorList errors={form.errors} id={form.errorId} />

<div className="flex items-center justify-between gap-6">
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -156,7 +156,9 @@ export default function LoginPage() {
</div>
</div>

<input {...conform.input(fields.redirectTo)} type="hidden" />
<input
{...conform.input(fields.redirectTo, { type: 'hidden' })}
/>
<ErrorList errors={form.errors} id={form.errorId} />

<div className="flex items-center justify-between gap-6 pt-3">
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -209,7 +209,7 @@ export default function SignupRoute() {
errors={fields.remember.errors}
/>

<input {...conform.input(fields.redirectTo)} type="hidden" />
<input {...conform.input(fields.redirectTo, { type: 'hidden' })} />
<ErrorList errors={form.errors} id={form.errorId} />

<div className="flex items-center justify-between gap-6">
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -156,7 +156,9 @@ export default function LoginPage() {
</div>
</div>

<input {...conform.input(fields.redirectTo)} type="hidden" />
<input
{...conform.input(fields.redirectTo, { type: 'hidden' })}
/>
<ErrorList errors={form.errors} id={form.errorId} />

<div className="flex items-center justify-between gap-6 pt-3">
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -209,7 +209,7 @@ export default function SignupRoute() {
errors={fields.remember.errors}
/>

<input {...conform.input(fields.redirectTo)} type="hidden" />
<input {...conform.input(fields.redirectTo, { type: 'hidden' })} />
<ErrorList errors={form.errors} id={form.errorId} />

<div className="flex items-center justify-between gap-6">
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -164,7 +164,9 @@ export default function LoginPage() {
</div>
</div>

<input {...conform.input(fields.redirectTo)} type="hidden" />
<input
{...conform.input(fields.redirectTo, { type: 'hidden' })}
/>
<ErrorList errors={form.errors} id={form.errorId} />

<div className="flex items-center justify-between gap-6 pt-3">
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -216,7 +216,7 @@ export default function SignupRoute() {
errors={fields.remember.errors}
/>

<input {...conform.input(fields.redirectTo)} type="hidden" />
<input {...conform.input(fields.redirectTo, { type: 'hidden' })} />
<ErrorList errors={form.errors} id={form.errorId} />

<div className="flex items-center justify-between gap-6">
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -149,7 +149,9 @@ export default function LoginPage() {
</div>
</div>

<input {...conform.input(fields.redirectTo)} type="hidden" />
<input
{...conform.input(fields.redirectTo, { type: 'hidden' })}
/>
<ErrorList errors={form.errors} id={form.errorId} />

<div className="flex items-center justify-between gap-6 pt-3">
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -202,7 +202,7 @@ export default function SignupRoute() {
errors={fields.remember.errors}
/>

<input {...conform.input(fields.redirectTo)} type="hidden" />
<input {...conform.input(fields.redirectTo, { type: 'hidden' })} />
<ErrorList errors={form.errors} id={form.errorId} />

<div className="flex items-center justify-between gap-6">
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -149,7 +149,9 @@ export default function LoginPage() {
</div>
</div>

<input {...conform.input(fields.redirectTo)} type="hidden" />
<input
{...conform.input(fields.redirectTo, { type: 'hidden' })}
/>
<ErrorList errors={form.errors} id={form.errorId} />

<div className="flex items-center justify-between gap-6 pt-3">
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -202,7 +202,7 @@ export default function SignupRoute() {
errors={fields.remember.errors}
/>

<input {...conform.input(fields.redirectTo)} type="hidden" />
<input {...conform.input(fields.redirectTo, { type: 'hidden' })} />
<ErrorList errors={form.errors} id={form.errorId} />

<div className="flex items-center justify-between gap-6">
Expand Down
Loading

0 comments on commit 8141e0d

Please sign in to comment.