Skip to content
This repository has been archived by the owner on Aug 10, 2023. It is now read-only.

Commit

Permalink
meta changes checkpoint
Browse files Browse the repository at this point in the history
  • Loading branch information
kentcdodds committed Mar 20, 2023
1 parent 2df892d commit a97cc71
Show file tree
Hide file tree
Showing 711 changed files with 33,253 additions and 582 deletions.
19 changes: 5 additions & 14 deletions exercises/02.routing/01-03.problem/app/routes/forgot-password.tsx
Original file line number Diff line number Diff line change
@@ -1,9 +1,4 @@
import {
json,
redirect,
type DataFunctionArgs,
type V2_MetaFunction,
} from '@remix-run/node'
import { json, redirect, type DataFunctionArgs } from '@remix-run/node'
import { Link, useFetcher, useLoaderData } from '@remix-run/react'
import { z } from 'zod'
import { GeneralErrorBoundary } from '~/components/error-boundary'
Expand All @@ -17,6 +12,7 @@ import {
preprocessFormData,
useForm,
} from '~/utils/forms'
import { mergeMeta } from '~/utils/misc'
import { getDomainUrl } from '~/utils/misc.server'
import { commitSession, getSession } from '~/utils/session.server'
import { emailSchema, usernameSchema } from '~/utils/user-validation'
Expand Down Expand Up @@ -109,14 +105,9 @@ async function sendPasswordResetEmail({
})
}

export const meta: V2_MetaFunction = ({ matches }) => {
let rootModule = matches.find(match => match.route.id === 'root')

return [
...(rootModule?.meta ?? [])?.filter(meta => !('title' in meta)),
{ title: 'Password Recovery for Rocket Rental' },
]
}
export const meta = mergeMeta(() => {
return [{ title: 'Password Recovery for Rocket Rental' }]
})

export default function SignupRoute() {
const data = useLoaderData<typeof loader>()
Expand Down
47 changes: 46 additions & 1 deletion exercises/02.routing/01-03.problem/app/utils/misc.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,9 @@
import { type SerializeFrom } from '@remix-run/node'
import {
type LoaderFunction,
type V2_HtmlMetaDescriptor,
type V2_MetaFunction,
type SerializeFrom,
} from '@remix-run/node'
import { useRouteLoaderData } from '@remix-run/react'
import { type loader as rootLoader } from '~/root'

Expand Down Expand Up @@ -81,3 +86,43 @@ export function getErrorMessage(error: unknown) {
console.error('Unable to get error message for error', error)
return 'Unknown Error'
}

export function mergeMeta<
Loader extends unknown = unknown,
ParentsLoaders extends Record<string, LoaderFunction> = {},
>(
overrideFn: V2_MetaFunction<Loader, ParentsLoaders>,
appendFn?: V2_MetaFunction<Loader, ParentsLoaders>,
): V2_MetaFunction<Loader, ParentsLoaders> {
return arg => {
// get meta from parent routes
let mergedMeta = arg.matches.reduce((acc, match) => {
return acc.concat(match.meta || [])
}, [] as V2_HtmlMetaDescriptor[])

// replace any parent meta with the same name or property with the override
let overrides = overrideFn(arg)
for (let override of overrides) {
let index = mergedMeta.findIndex(
meta =>
('name' in meta &&
'name' in override &&
meta.name === override.name) ||
('property' in meta &&
'property' in override &&
meta.property === override.property) ||
('title' in meta && 'title' in override),
)
if (index !== -1) {
mergedMeta.splice(index, 1, override)
}
}

// append any additional meta
if (appendFn) {
mergedMeta = mergedMeta.concat(appendFn(arg))
}

return mergedMeta
}
}
Original file line number Diff line number Diff line change
@@ -1,9 +1,4 @@
import {
json,
redirect,
type DataFunctionArgs,
type V2_MetaFunction,
} from '@remix-run/node'
import { json, redirect, type DataFunctionArgs } from '@remix-run/node'
import { Link, useFetcher, useLoaderData } from '@remix-run/react'
import { z } from 'zod'
import { GeneralErrorBoundary } from '~/components/error-boundary'
Expand All @@ -17,6 +12,7 @@ import {
preprocessFormData,
useForm,
} from '~/utils/forms'
import { mergeMeta } from '~/utils/misc'
import { getDomainUrl } from '~/utils/misc.server'
import { commitSession, getSession } from '~/utils/session.server'
import { emailSchema, usernameSchema } from '~/utils/user-validation'
Expand Down Expand Up @@ -109,14 +105,9 @@ async function sendPasswordResetEmail({
})
}

export const meta: V2_MetaFunction = ({ matches }) => {
let rootModule = matches.find(match => match.route.id === 'root')

return [
...(rootModule?.meta ?? [])?.filter(meta => !('title' in meta)),
{ title: 'Password Recovery for Rocket Rental' },
]
}
export const meta = mergeMeta(() => {
return [{ title: 'Password Recovery for Rocket Rental' }]
})

export default function SignupRoute() {
const data = useLoaderData<typeof loader>()
Expand Down
47 changes: 46 additions & 1 deletion exercises/02.routing/01.solution.routes/app/utils/misc.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,9 @@
import { type SerializeFrom } from '@remix-run/node'
import {
type LoaderFunction,
type V2_HtmlMetaDescriptor,
type V2_MetaFunction,
type SerializeFrom,
} from '@remix-run/node'
import { useRouteLoaderData } from '@remix-run/react'
import { type loader as rootLoader } from '~/root'

Expand Down Expand Up @@ -81,3 +86,43 @@ export function getErrorMessage(error: unknown) {
console.error('Unable to get error message for error', error)
return 'Unknown Error'
}

export function mergeMeta<
Loader extends unknown = unknown,
ParentsLoaders extends Record<string, LoaderFunction> = {},
>(
overrideFn: V2_MetaFunction<Loader, ParentsLoaders>,
appendFn?: V2_MetaFunction<Loader, ParentsLoaders>,
): V2_MetaFunction<Loader, ParentsLoaders> {
return arg => {
// get meta from parent routes
let mergedMeta = arg.matches.reduce((acc, match) => {
return acc.concat(match.meta || [])
}, [] as V2_HtmlMetaDescriptor[])

// replace any parent meta with the same name or property with the override
let overrides = overrideFn(arg)
for (let override of overrides) {
let index = mergedMeta.findIndex(
meta =>
('name' in meta &&
'name' in override &&
meta.name === override.name) ||
('property' in meta &&
'property' in override &&
meta.property === override.property) ||
('title' in meta && 'title' in override),
)
if (index !== -1) {
mergedMeta.splice(index, 1, override)
}
}

// append any additional meta
if (appendFn) {
mergedMeta = mergedMeta.concat(appendFn(arg))
}

return mergedMeta
}
}
Original file line number Diff line number Diff line change
@@ -1,9 +1,4 @@
import {
json,
redirect,
type DataFunctionArgs,
type V2_MetaFunction,
} from '@remix-run/node'
import { json, redirect, type DataFunctionArgs } from '@remix-run/node'
import { Link, useFetcher, useLoaderData } from '@remix-run/react'
import { z } from 'zod'
import { GeneralErrorBoundary } from '~/components/error-boundary'
Expand All @@ -17,6 +12,7 @@ import {
preprocessFormData,
useForm,
} from '~/utils/forms'
import { mergeMeta } from '~/utils/misc'
import { getDomainUrl } from '~/utils/misc.server'
import { commitSession, getSession } from '~/utils/session.server'
import { emailSchema, usernameSchema } from '~/utils/user-validation'
Expand Down Expand Up @@ -109,14 +105,9 @@ async function sendPasswordResetEmail({
})
}

export const meta: V2_MetaFunction = ({ matches }) => {
let rootModule = matches.find(match => match.route.id === 'root')

return [
...(rootModule?.meta ?? [])?.filter(meta => !('title' in meta)),
{ title: 'Password Recovery for Rocket Rental' },
]
}
export const meta = mergeMeta(() => {
return [{ title: 'Password Recovery for Rocket Rental' }]
})

export default function SignupRoute() {
const data = useLoaderData<typeof loader>()
Expand Down
47 changes: 46 additions & 1 deletion exercises/02.routing/02.solution.links/app/utils/misc.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,9 @@
import { type SerializeFrom } from '@remix-run/node'
import {
type LoaderFunction,
type V2_HtmlMetaDescriptor,
type V2_MetaFunction,
type SerializeFrom,
} from '@remix-run/node'
import { useRouteLoaderData } from '@remix-run/react'
import { type loader as rootLoader } from '~/root'

Expand Down Expand Up @@ -81,3 +86,43 @@ export function getErrorMessage(error: unknown) {
console.error('Unable to get error message for error', error)
return 'Unknown Error'
}

export function mergeMeta<
Loader extends unknown = unknown,
ParentsLoaders extends Record<string, LoaderFunction> = {},
>(
overrideFn: V2_MetaFunction<Loader, ParentsLoaders>,
appendFn?: V2_MetaFunction<Loader, ParentsLoaders>,
): V2_MetaFunction<Loader, ParentsLoaders> {
return arg => {
// get meta from parent routes
let mergedMeta = arg.matches.reduce((acc, match) => {
return acc.concat(match.meta || [])
}, [] as V2_HtmlMetaDescriptor[])

// replace any parent meta with the same name or property with the override
let overrides = overrideFn(arg)
for (let override of overrides) {
let index = mergedMeta.findIndex(
meta =>
('name' in meta &&
'name' in override &&
meta.name === override.name) ||
('property' in meta &&
'property' in override &&
meta.property === override.property) ||
('title' in meta && 'title' in override),
)
if (index !== -1) {
mergedMeta.splice(index, 1, override)
}
}

// append any additional meta
if (appendFn) {
mergedMeta = mergedMeta.concat(appendFn(arg))
}

return mergedMeta
}
}
Original file line number Diff line number Diff line change
@@ -1,9 +1,4 @@
import {
json,
redirect,
type DataFunctionArgs,
type V2_MetaFunction,
} from '@remix-run/node'
import { json, redirect, type DataFunctionArgs } from '@remix-run/node'
import { Link, useFetcher, useLoaderData } from '@remix-run/react'
import { z } from 'zod'
import { GeneralErrorBoundary } from '~/components/error-boundary'
Expand All @@ -17,6 +12,7 @@ import {
preprocessFormData,
useForm,
} from '~/utils/forms'
import { mergeMeta } from '~/utils/misc'
import { getDomainUrl } from '~/utils/misc.server'
import { commitSession, getSession } from '~/utils/session.server'
import { emailSchema, usernameSchema } from '~/utils/user-validation'
Expand Down Expand Up @@ -109,14 +105,9 @@ async function sendPasswordResetEmail({
})
}

export const meta: V2_MetaFunction = ({ matches }) => {
let rootModule = matches.find(match => match.route.id === 'root')

return [
...(rootModule?.meta ?? [])?.filter(meta => !('title' in meta)),
{ title: 'Password Recovery for Rocket Rental' },
]
}
export const meta = mergeMeta(() => {
return [{ title: 'Password Recovery for Rocket Rental' }]
})

export default function SignupRoute() {
const data = useLoaderData<typeof loader>()
Expand Down
47 changes: 46 additions & 1 deletion exercises/02.routing/03.solution.params/app/utils/misc.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,9 @@
import { type SerializeFrom } from '@remix-run/node'
import {
type LoaderFunction,
type V2_HtmlMetaDescriptor,
type V2_MetaFunction,
type SerializeFrom,
} from '@remix-run/node'
import { useRouteLoaderData } from '@remix-run/react'
import { type loader as rootLoader } from '~/root'

Expand Down Expand Up @@ -81,3 +86,43 @@ export function getErrorMessage(error: unknown) {
console.error('Unable to get error message for error', error)
return 'Unknown Error'
}

export function mergeMeta<
Loader extends unknown = unknown,
ParentsLoaders extends Record<string, LoaderFunction> = {},
>(
overrideFn: V2_MetaFunction<Loader, ParentsLoaders>,
appendFn?: V2_MetaFunction<Loader, ParentsLoaders>,
): V2_MetaFunction<Loader, ParentsLoaders> {
return arg => {
// get meta from parent routes
let mergedMeta = arg.matches.reduce((acc, match) => {
return acc.concat(match.meta || [])
}, [] as V2_HtmlMetaDescriptor[])

// replace any parent meta with the same name or property with the override
let overrides = overrideFn(arg)
for (let override of overrides) {
let index = mergedMeta.findIndex(
meta =>
('name' in meta &&
'name' in override &&
meta.name === override.name) ||
('property' in meta &&
'property' in override &&
meta.property === override.property) ||
('title' in meta && 'title' in override),
)
if (index !== -1) {
mergedMeta.splice(index, 1, override)
}
}

// append any additional meta
if (appendFn) {
mergedMeta = mergedMeta.concat(appendFn(arg))
}

return mergedMeta
}
}
Loading

0 comments on commit a97cc71

Please sign in to comment.