diff --git a/app/root.tsx b/app/root.tsx index 2be10b0ec..22103e59c 100644 --- a/app/root.tsx +++ b/app/root.tsx @@ -1,10 +1,6 @@ import { useRef } from 'react' import { data, - type LoaderFunctionArgs, - type HeadersFunction, - type LinksFunction, - type MetaFunction, Form, Link, Links, @@ -17,6 +13,7 @@ import { useSubmit, } from 'react-router' import { HoneypotProvider } from 'remix-utils/honeypot/react' +import { type Route } from './+types/root.ts' import appleTouchIconAssetUrl from './assets/favicons/apple-touch-icon.png' import faviconAssetUrl from './assets/favicons/favicon.svg' import { GeneralErrorBoundary } from './components/error-boundary.tsx' @@ -51,7 +48,7 @@ import { makeTimings, time } from './utils/timing.server.ts' import { getToast } from './utils/toast.server.ts' import { useOptionalUser, useUser } from './utils/user.ts' -export const links: LinksFunction = () => { +export const links: Route.LinksFunction = () => { return [ // Preload svg sprite as a resource to avoid render blocking { rel: 'preload', href: iconsHref, as: 'image' }, @@ -71,14 +68,14 @@ export const links: LinksFunction = () => { ].filter(Boolean) } -export const meta: MetaFunction = ({ data }) => { +export const meta: Route.MetaFunction = ({ data }) => { return [ { title: data ? 'Epic Notes' : 'Error | Epic Notes' }, { name: 'description', content: `Your own captain's log` }, ] } -export async function loader({ request }: LoaderFunctionArgs) { +export async function loader({ request }: Route.LoaderArgs) { const timings = makeTimings('root loader') const userId = await time(() => getUserId(request), { timings, @@ -142,7 +139,7 @@ export async function loader({ request }: LoaderFunctionArgs) { ) } -export const headers: HeadersFunction = ({ loaderHeaders }) => { +export const headers: Route.HeadersFunction = ({ loaderHeaders }) => { const headers = { 'Server-Timing': loaderHeaders.get('Server-Timing') ?? '', } diff --git a/app/routes/_auth+/auth.$provider.callback.ts b/app/routes/_auth+/auth.$provider.callback.ts index f7f141084..bbbe5643d 100644 --- a/app/routes/_auth+/auth.$provider.callback.ts +++ b/app/routes/_auth+/auth.$provider.callback.ts @@ -1,4 +1,4 @@ -import { redirect, type LoaderFunctionArgs } from 'react-router' +import { redirect } from 'react-router' import { authenticator, getSessionExpirationDate, @@ -21,13 +21,14 @@ import { redirectWithToast, } from '#app/utils/toast.server.ts' import { verifySessionStorage } from '#app/utils/verification.server.ts' +import { type Route } from './+types/auth.$provider.callback.ts' import { handleNewSession } from './login.server.ts' import { onboardingEmailSessionKey } from './onboarding.tsx' import { prefilledProfileKey, providerIdKey } from './onboarding_.$provider.tsx' const destroyRedirectTo = { 'set-cookie': destroyRedirectToHeader } -export async function loader({ request, params }: LoaderFunctionArgs) { +export async function loader({ request, params }: Route.LoaderArgs) { // this loader performs mutations, so we need to make sure we're on the // primary instance to avoid writing to a read-only replica await ensurePrimary() diff --git a/app/routes/_auth+/auth_.$provider.ts b/app/routes/_auth+/auth_.$provider.ts index ca80277a7..b604005e6 100644 --- a/app/routes/_auth+/auth_.$provider.ts +++ b/app/routes/_auth+/auth_.$provider.ts @@ -1,15 +1,16 @@ -import { redirect, type ActionFunctionArgs } from 'react-router' +import { redirect } from 'react-router' import { authenticator } from '#app/utils/auth.server.ts' import { handleMockAction } from '#app/utils/connections.server.ts' import { ProviderNameSchema } from '#app/utils/connections.tsx' import { getReferrerRoute } from '#app/utils/misc.tsx' import { getRedirectCookieHeader } from '#app/utils/redirect-cookie.server.ts' +import { type Route } from './+types/auth_.$provider.ts' export async function loader() { return redirect('/login') } -export async function action({ request, params }: ActionFunctionArgs) { +export async function action({ request, params }: Route.ActionArgs) { const providerName = ProviderNameSchema.parse(params.provider) try { diff --git a/app/routes/_auth+/forgot-password.tsx b/app/routes/_auth+/forgot-password.tsx index 5962bdb56..37fd2fd9f 100644 --- a/app/routes/_auth+/forgot-password.tsx +++ b/app/routes/_auth+/forgot-password.tsx @@ -2,14 +2,7 @@ import { getFormProps, getInputProps, useForm } from '@conform-to/react' import { getZodConstraint, parseWithZod } from '@conform-to/zod' import { type SEOHandle } from '@nasa-gcn/remix-seo' import * as E from '@react-email/components' -import { - data, - redirect, - type ActionFunctionArgs, - type MetaFunction, - Link, - useFetcher, -} from 'react-router' +import { data, redirect, Link, useFetcher } from 'react-router' import { HoneypotInputs } from 'remix-utils/honeypot/react' import { z } from 'zod' import { GeneralErrorBoundary } from '#app/components/error-boundary.tsx' @@ -19,6 +12,7 @@ import { prisma } from '#app/utils/db.server.ts' import { sendEmail } from '#app/utils/email.server.ts' import { checkHoneypot } from '#app/utils/honeypot.server.ts' import { EmailSchema, UsernameSchema } from '#app/utils/user-validation.ts' +import { type Route } from './+types/forgot-password.ts' import { prepareVerification } from './verify.server.ts' export const handle: SEOHandle = { @@ -29,7 +23,7 @@ const ForgotPasswordSchema = z.object({ usernameOrEmail: z.union([EmailSchema, UsernameSchema]), }) -export async function action({ request }: ActionFunctionArgs) { +export async function action({ request }: Route.ActionArgs) { const formData = await request.formData() checkHoneypot(formData) const submission = await parseWithZod(formData, { @@ -119,7 +113,7 @@ function ForgotPasswordEmail({ ) } -export const meta: MetaFunction = () => { +export const meta: Route.MetaFunction = () => { return [{ title: 'Password Recovery for Epic Notes' }] } diff --git a/app/routes/_auth+/login.tsx b/app/routes/_auth+/login.tsx index 11b42f9e4..1b0238eeb 100644 --- a/app/routes/_auth+/login.tsx +++ b/app/routes/_auth+/login.tsx @@ -1,16 +1,7 @@ import { getFormProps, getInputProps, useForm } from '@conform-to/react' import { getZodConstraint, parseWithZod } from '@conform-to/zod' import { type SEOHandle } from '@nasa-gcn/remix-seo' -import { - data, - type ActionFunctionArgs, - type LoaderFunctionArgs, - type MetaFunction, - Form, - Link, - useActionData, - useSearchParams, -} from 'react-router' +import { data, Form, Link, useSearchParams } from 'react-router' import { HoneypotInputs } from 'remix-utils/honeypot/react' import { z } from 'zod' import { GeneralErrorBoundary } from '#app/components/error-boundary.tsx' @@ -25,6 +16,7 @@ import { import { checkHoneypot } from '#app/utils/honeypot.server.ts' import { useIsPending } from '#app/utils/misc.tsx' import { PasswordSchema, UsernameSchema } from '#app/utils/user-validation.ts' +import { type Route } from './+types/login.ts' import { handleNewSession } from './login.server.ts' export const handle: SEOHandle = { @@ -38,12 +30,12 @@ const LoginFormSchema = z.object({ remember: z.boolean().optional(), }) -export async function loader({ request }: LoaderFunctionArgs) { +export async function loader({ request }: Route.LoaderArgs) { await requireAnonymous(request) return {} } -export async function action({ request }: ActionFunctionArgs) { +export async function action({ request }: Route.ActionArgs) { await requireAnonymous(request) const formData = await request.formData() checkHoneypot(formData) @@ -83,8 +75,7 @@ export async function action({ request }: ActionFunctionArgs) { }) } -export default function LoginPage() { - const actionData = useActionData() +export default function LoginPage({ actionData }: Route.ComponentProps) { const isPending = useIsPending() const [searchParams] = useSearchParams() const redirectTo = searchParams.get('redirectTo') @@ -204,7 +195,7 @@ export default function LoginPage() { ) } -export const meta: MetaFunction = () => { +export const meta: Route.MetaFunction = () => { return [{ title: 'Login to Epic Notes' }] } diff --git a/app/routes/_auth+/logout.tsx b/app/routes/_auth+/logout.tsx index 4793d9d3c..e99e67085 100644 --- a/app/routes/_auth+/logout.tsx +++ b/app/routes/_auth+/logout.tsx @@ -1,10 +1,11 @@ -import { redirect, type ActionFunctionArgs } from 'react-router' +import { redirect } from 'react-router' import { logout } from '#app/utils/auth.server.ts' +import { type Route } from './+types/logout.ts' export async function loader() { return redirect('/') } -export async function action({ request }: ActionFunctionArgs) { +export async function action({ request }: Route.ActionArgs) { return logout({ request }) } diff --git a/app/routes/_auth+/onboarding.tsx b/app/routes/_auth+/onboarding.tsx index a23667506..4d955a3dd 100644 --- a/app/routes/_auth+/onboarding.tsx +++ b/app/routes/_auth+/onboarding.tsx @@ -1,16 +1,6 @@ import { getFormProps, getInputProps, useForm } from '@conform-to/react' import { getZodConstraint, parseWithZod } from '@conform-to/zod' -import { - data, - redirect, - type LoaderFunctionArgs, - type ActionFunctionArgs, - type MetaFunction, - Form, - useActionData, - useLoaderData, - useSearchParams, -} from 'react-router' +import { data, redirect, Form, useSearchParams } from 'react-router' import { HoneypotInputs } from 'remix-utils/honeypot/react' import { safeRedirect } from 'remix-utils/safe-redirect' import { z } from 'zod' @@ -29,6 +19,7 @@ import { UsernameSchema, } from '#app/utils/user-validation.ts' import { verifySessionStorage } from '#app/utils/verification.server.ts' +import { type Route } from './+types/onboarding.ts' export const onboardingEmailSessionKey = 'onboardingEmail' @@ -57,12 +48,12 @@ async function requireOnboardingEmail(request: Request) { return email } -export async function loader({ request }: LoaderFunctionArgs) { +export async function loader({ request }: Route.LoaderArgs) { const email = await requireOnboardingEmail(request) return { email } } -export async function action({ request }: ActionFunctionArgs) { +export async function action({ request }: Route.ActionArgs) { const email = await requireOnboardingEmail(request) const formData = await request.formData() checkHoneypot(formData) @@ -123,13 +114,14 @@ export async function action({ request }: ActionFunctionArgs) { ) } -export const meta: MetaFunction = () => { +export const meta: Route.MetaFunction = () => { return [{ title: 'Setup Epic Notes Account' }] } -export default function OnboardingRoute() { - const data = useLoaderData() - const actionData = useActionData() +export default function OnboardingRoute({ + loaderData, + actionData, +}: Route.ComponentProps) { const isPending = useIsPending() const [searchParams] = useSearchParams() const redirectTo = searchParams.get('redirectTo') @@ -149,7 +141,7 @@ export default function OnboardingRoute() {
-

Welcome aboard {data.email}!

+

Welcome aboard {loaderData.email}!

Please enter your details.

diff --git a/app/routes/_auth+/onboarding_.$provider.tsx b/app/routes/_auth+/onboarding_.$provider.tsx index 7d68b7477..7d50398e5 100644 --- a/app/routes/_auth+/onboarding_.$provider.tsx +++ b/app/routes/_auth+/onboarding_.$provider.tsx @@ -8,13 +8,8 @@ import { getZodConstraint, parseWithZod } from '@conform-to/zod' import { redirect, data, - type ActionFunctionArgs, - type LoaderFunctionArgs, - type MetaFunction, type Params, Form, - useActionData, - useLoaderData, useSearchParams, } from 'react-router' import { safeRedirect } from 'remix-utils/safe-redirect' @@ -36,6 +31,7 @@ import { authSessionStorage } from '#app/utils/session.server.ts' import { redirectWithToast } from '#app/utils/toast.server.ts' import { NameSchema, UsernameSchema } from '#app/utils/user-validation.ts' import { verifySessionStorage } from '#app/utils/verification.server.ts' +import { type Route } from './+types/onboarding_.$provider.ts' import { onboardingEmailSessionKey } from './onboarding' export const providerIdKey = 'providerId' @@ -80,7 +76,7 @@ async function requireData({ } } -export async function loader({ request, params }: LoaderFunctionArgs) { +export async function loader({ request, params }: Route.LoaderArgs) { const { email } = await requireData({ request, params }) const connectionSession = await connectionSessionStorage.getSession( request.headers.get('cookie'), @@ -104,7 +100,7 @@ export async function loader({ request, params }: LoaderFunctionArgs) { } } -export async function action({ request, params }: ActionFunctionArgs) { +export async function action({ request, params }: Route.ActionArgs) { const { email, providerId, providerName } = await requireData({ request, params, @@ -172,13 +168,14 @@ export async function action({ request, params }: ActionFunctionArgs) { ) } -export const meta: MetaFunction = () => { +export const meta: Route.MetaFunction = () => { return [{ title: 'Setup Epic Notes Account' }] } -export default function OnboardingProviderRoute() { - const data = useLoaderData() - const actionData = useActionData() +export default function OnboardingProviderRoute({ + loaderData, + actionData, +}: Route.ComponentProps) { const isPending = useIsPending() const [searchParams] = useSearchParams() const redirectTo = searchParams.get('redirectTo') @@ -186,7 +183,7 @@ export default function OnboardingProviderRoute() { const [form, fields] = useForm({ id: 'onboarding-provider-form', constraint: getZodConstraint(SignupFormSchema), - lastResult: actionData?.result ?? data.submission, + lastResult: actionData?.result ?? loaderData.submission, onValidate({ formData }) { return parseWithZod(formData, { schema: SignupFormSchema }) }, @@ -197,7 +194,7 @@ export default function OnboardingProviderRoute() {
-

Welcome aboard {data.email}!

+

Welcome aboard {loaderData.email}!

Please enter your details.

diff --git a/app/routes/_auth+/reset-password.tsx b/app/routes/_auth+/reset-password.tsx index 095e18093..b8581a781 100644 --- a/app/routes/_auth+/reset-password.tsx +++ b/app/routes/_auth+/reset-password.tsx @@ -1,16 +1,7 @@ import { getFormProps, getInputProps, useForm } from '@conform-to/react' import { getZodConstraint, parseWithZod } from '@conform-to/zod' import { type SEOHandle } from '@nasa-gcn/remix-seo' -import { - data, - redirect, - type ActionFunctionArgs, - type LoaderFunctionArgs, - type MetaFunction, - Form, - useActionData, - useLoaderData, -} from 'react-router' +import { data, redirect, Form } from 'react-router' import { GeneralErrorBoundary } from '#app/components/error-boundary.tsx' import { ErrorList, Field } from '#app/components/forms.tsx' import { StatusButton } from '#app/components/ui/status-button.tsx' @@ -18,6 +9,7 @@ import { requireAnonymous, resetUserPassword } from '#app/utils/auth.server.ts' import { useIsPending } from '#app/utils/misc.tsx' import { PasswordAndConfirmPasswordSchema } from '#app/utils/user-validation.ts' import { verifySessionStorage } from '#app/utils/verification.server.ts' +import { type Route } from './+types/reset-password.ts' export const handle: SEOHandle = { getSitemapEntries: () => null, @@ -41,12 +33,12 @@ async function requireResetPasswordUsername(request: Request) { return resetPasswordUsername } -export async function loader({ request }: LoaderFunctionArgs) { +export async function loader({ request }: Route.LoaderArgs) { const resetPasswordUsername = await requireResetPasswordUsername(request) return { resetPasswordUsername } } -export async function action({ request }: ActionFunctionArgs) { +export async function action({ request }: Route.ActionArgs) { const resetPasswordUsername = await requireResetPasswordUsername(request) const formData = await request.formData() const submission = parseWithZod(formData, { @@ -69,13 +61,14 @@ export async function action({ request }: ActionFunctionArgs) { }) } -export const meta: MetaFunction = () => { +export const meta: Route.MetaFunction = () => { return [{ title: 'Reset Password | Epic Notes' }] } -export default function ResetPasswordPage() { - const data = useLoaderData() - const actionData = useActionData() +export default function ResetPasswordPage({ + loaderData, + actionData, +}: Route.ComponentProps) { const isPending = useIsPending() const [form, fields] = useForm({ @@ -93,7 +86,8 @@ export default function ResetPasswordPage() {

Password Reset

- Hi, {data.resetPasswordUsername}. No worries. It happens all the time. + Hi, {loaderData.resetPasswordUsername}. No worries. It happens all the + time.

diff --git a/app/routes/_auth+/signup.tsx b/app/routes/_auth+/signup.tsx index 6c62d0995..fdb030f91 100644 --- a/app/routes/_auth+/signup.tsx +++ b/app/routes/_auth+/signup.tsx @@ -2,15 +2,7 @@ import { getFormProps, getInputProps, useForm } from '@conform-to/react' import { getZodConstraint, parseWithZod } from '@conform-to/zod' import { type SEOHandle } from '@nasa-gcn/remix-seo' import * as E from '@react-email/components' -import { - data, - redirect, - type ActionFunctionArgs, - type MetaFunction, - Form, - useActionData, - useSearchParams, -} from 'react-router' +import { data, redirect, Form, useSearchParams } from 'react-router' import { HoneypotInputs } from 'remix-utils/honeypot/react' import { z } from 'zod' import { GeneralErrorBoundary } from '#app/components/error-boundary.tsx' @@ -25,6 +17,7 @@ import { sendEmail } from '#app/utils/email.server.ts' import { checkHoneypot } from '#app/utils/honeypot.server.ts' import { useIsPending } from '#app/utils/misc.tsx' import { EmailSchema } from '#app/utils/user-validation.ts' +import { type Route } from './+types/signup.ts' import { prepareVerification } from './verify.server.ts' export const handle: SEOHandle = { @@ -35,7 +28,7 @@ const SignupSchema = z.object({ email: EmailSchema, }) -export async function action({ request }: ActionFunctionArgs) { +export async function action({ request }: Route.ActionArgs) { const formData = await request.formData() checkHoneypot(formData) @@ -118,12 +111,11 @@ export function SignupEmail({ ) } -export const meta: MetaFunction = () => { +export const meta: Route.MetaFunction = () => { return [{ title: 'Sign Up | Epic Notes' }] } -export default function SignupRoute() { - const actionData = useActionData() +export default function SignupRoute({ actionData }: Route.ComponentProps) { const isPending = useIsPending() const [searchParams] = useSearchParams() const redirectTo = searchParams.get('redirectTo') diff --git a/app/routes/_auth+/verify.tsx b/app/routes/_auth+/verify.tsx index 7f5ae031d..7c33868f2 100644 --- a/app/routes/_auth+/verify.tsx +++ b/app/routes/_auth+/verify.tsx @@ -1,12 +1,7 @@ import { getFormProps, getInputProps, useForm } from '@conform-to/react' import { getZodConstraint, parseWithZod } from '@conform-to/zod' import { type SEOHandle } from '@nasa-gcn/remix-seo' -import { - type ActionFunctionArgs, - Form, - useActionData, - useSearchParams, -} from 'react-router' +import { Form, useSearchParams } from 'react-router' import { HoneypotInputs } from 'remix-utils/honeypot/react' import { z } from 'zod' import { GeneralErrorBoundary } from '#app/components/error-boundary.tsx' @@ -15,6 +10,7 @@ import { Spacer } from '#app/components/spacer.tsx' import { StatusButton } from '#app/components/ui/status-button.tsx' import { checkHoneypot } from '#app/utils/honeypot.server.ts' import { useIsPending } from '#app/utils/misc.tsx' +import { type Route } from './+types/verify.ts' import { validateRequest } from './verify.server.ts' export const handle: SEOHandle = { @@ -36,16 +32,15 @@ export const VerifySchema = z.object({ [redirectToQueryParam]: z.string().optional(), }) -export async function action({ request }: ActionFunctionArgs) { +export async function action({ request }: Route.ActionArgs) { const formData = await request.formData() checkHoneypot(formData) return validateRequest(request, formData) } -export default function VerifyRoute() { +export default function VerifyRoute({ actionData }: Route.ComponentProps) { const [searchParams] = useSearchParams() const isPending = useIsPending() - const actionData = useActionData() const parseWithZoddType = VerificationTypeSchema.safeParse( searchParams.get(typeQueryParam), ) diff --git a/app/routes/_marketing+/index.tsx b/app/routes/_marketing+/index.tsx index c734213f2..c5cc90f45 100644 --- a/app/routes/_marketing+/index.tsx +++ b/app/routes/_marketing+/index.tsx @@ -1,4 +1,3 @@ -import { type MetaFunction } from 'react-router' import { Tooltip, TooltipContent, @@ -6,9 +5,10 @@ import { TooltipTrigger, } from '#app/components/ui/tooltip.tsx' import { cn } from '#app/utils/misc.tsx' +import { type Route } from './+types/index.ts' import { logos } from './logos/logos.ts' -export const meta: MetaFunction = () => [{ title: 'Epic Notes' }] +export const meta: Route.MetaFunction = () => [{ title: 'Epic Notes' }] // Tailwind Grid cell classes lookup const columnClasses: Record<(typeof logos)[number]['column'], string> = { diff --git a/app/routes/_seo+/robots[.]txt.ts b/app/routes/_seo+/robots[.]txt.ts index 4622d7bf6..314f8ff87 100644 --- a/app/routes/_seo+/robots[.]txt.ts +++ b/app/routes/_seo+/robots[.]txt.ts @@ -1,8 +1,8 @@ import { generateRobotsTxt } from '@nasa-gcn/remix-seo' -import { type LoaderFunctionArgs } from 'react-router' import { getDomainUrl } from '#app/utils/misc.tsx' +import { type Route } from './+types/robots[.]txt.ts' -export function loader({ request }: LoaderFunctionArgs) { +export function loader({ request }: Route.LoaderArgs) { return generateRobotsTxt([ { type: 'sitemap', value: `${getDomainUrl(request)}/sitemap.xml` }, ]) diff --git a/app/routes/_seo+/sitemap[.]xml.ts b/app/routes/_seo+/sitemap[.]xml.ts index 5f04d9b2a..04d37c31e 100644 --- a/app/routes/_seo+/sitemap[.]xml.ts +++ b/app/routes/_seo+/sitemap[.]xml.ts @@ -1,8 +1,9 @@ import { generateSitemap } from '@nasa-gcn/remix-seo' -import { type ServerBuild, type LoaderFunctionArgs } from 'react-router' +import { type ServerBuild } from 'react-router' import { getDomainUrl } from '#app/utils/misc.tsx' +import { type Route } from './+types/sitemap[.]xml.ts' -export async function loader({ request, context }: LoaderFunctionArgs) { +export async function loader({ request, context }: Route.LoaderArgs) { const serverBuild = (await context.serverBuild) as { build: ServerBuild } // TODO: This is typeerror is coming up since of the remix-run/server-runtime package. We might need to remove/update that one. diff --git a/app/routes/admin+/cache.tsx b/app/routes/admin+/cache.tsx index 64e346e4a..8045a9cad 100644 --- a/app/routes/admin+/cache.tsx +++ b/app/routes/admin+/cache.tsx @@ -2,12 +2,9 @@ import { invariantResponse } from '@epic-web/invariant' import { type SEOHandle } from '@nasa-gcn/remix-seo' import { redirect, - type LoaderFunctionArgs, - type ActionFunctionArgs, Form, Link, useFetcher, - useLoaderData, useSearchParams, useSubmit, } from 'react-router' @@ -28,12 +25,13 @@ import { } from '#app/utils/litefs.server.ts' import { useDebounce, useDoubleCheck } from '#app/utils/misc.tsx' import { requireUserWithRole } from '#app/utils/permissions.server.ts' +import { type Route } from './+types/cache.ts' export const handle: SEOHandle = { getSitemapEntries: () => null, } -export async function loader({ request }: LoaderFunctionArgs) { +export async function loader({ request }: Route.LoaderArgs) { await requireUserWithRole(request, 'admin') const searchParams = new URL(request.url).searchParams const query = searchParams.get('query') @@ -58,7 +56,7 @@ export async function loader({ request }: LoaderFunctionArgs) { return { cacheKeys, instance, instances, currentInstanceInfo } } -export async function action({ request }: ActionFunctionArgs) { +export async function action({ request }: Route.ActionArgs) { await requireUserWithRole(request, 'admin') const formData = await request.formData() const key = formData.get('cacheKey') @@ -87,13 +85,12 @@ export async function action({ request }: ActionFunctionArgs) { return { success: true } } -export default function CacheAdminRoute() { - const data = useLoaderData() +export default function CacheAdminRoute({ loaderData }: Route.ComponentProps) { const [searchParams] = useSearchParams() const submit = useSubmit() const query = searchParams.get('query') ?? '' const limit = searchParams.get('limit') ?? '100' - const instance = searchParams.get('instance') ?? data.instance + const instance = searchParams.get('instance') ?? loaderData.instance const handleFormChange = useDebounce(async (form: HTMLFormElement) => { await submit(form) @@ -127,7 +124,8 @@ export default function CacheAdminRoute() { />
- {data.cacheKeys.sqlite.length + data.cacheKeys.lru.length} + {loaderData.cacheKeys.sqlite.length + + loaderData.cacheKeys.lru.length}
@@ -148,15 +146,15 @@ export default function CacheAdminRoute() { }} />