Skip to content

Commit

Permalink
lazy routes
Browse files Browse the repository at this point in the history
  • Loading branch information
Sheraff committed Jul 8, 2024
1 parent 7d7d1c6 commit b7cdfb7
Show file tree
Hide file tree
Showing 9 changed files with 128 additions and 82 deletions.
45 changes: 29 additions & 16 deletions admin/client/routeTree.gen.ts
Original file line number Diff line number Diff line change
Expand Up @@ -15,14 +15,18 @@ import { createFileRoute } from '@tanstack/react-router'
import { Route as rootRoute } from './routes/__root'
import { Route as QueueIdIndexImport } from './routes/$queueId/index'
import { Route as QueueIdJobIdJobImport } from './routes/$queueId/$jobId/_job'
import { Route as QueueIdJobIdJobIndexImport } from './routes/$queueId/$jobId/_job.index'
import { Route as QueueIdJobIdJobTaskIdIndexImport } from './routes/$queueId/$jobId/_job.$taskId/index'

// Create Virtual Routes

const AboutLazyImport = createFileRoute('/about')()
const IndexLazyImport = createFileRoute('/')()
const QueueIdJobIdImport = createFileRoute('/$queueId/$jobId')()
const QueueIdJobIdJobIndexLazyImport = createFileRoute(
'/$queueId/$jobId/_job/',
)()
const QueueIdJobIdJobTaskIdIndexLazyImport = createFileRoute(
'/$queueId/$jobId/_job/$taskId/',
)()

// Create/Update Routes

Expand All @@ -44,24 +48,33 @@ const QueueIdJobIdRoute = QueueIdJobIdImport.update({
const QueueIdIndexRoute = QueueIdIndexImport.update({
path: '/$queueId/',
getParentRoute: () => rootRoute,
} as any)
} as any).lazy(() =>
import('./routes/$queueId/index.lazy').then((d) => d.Route),
)

const QueueIdJobIdJobRoute = QueueIdJobIdJobImport.update({
id: '/_job',
getParentRoute: () => QueueIdJobIdRoute,
} as any)
} as any).lazy(() =>
import('./routes/$queueId/$jobId/_job.lazy').then((d) => d.Route),
)

const QueueIdJobIdJobIndexRoute = QueueIdJobIdJobIndexImport.update({
const QueueIdJobIdJobIndexLazyRoute = QueueIdJobIdJobIndexLazyImport.update({
path: '/',
getParentRoute: () => QueueIdJobIdJobRoute,
} as any)
} as any).lazy(() =>
import('./routes/$queueId/$jobId/_job.index.lazy').then((d) => d.Route),
)

const QueueIdJobIdJobTaskIdIndexRoute = QueueIdJobIdJobTaskIdIndexImport.update(
{
const QueueIdJobIdJobTaskIdIndexLazyRoute =
QueueIdJobIdJobTaskIdIndexLazyImport.update({
path: '/$taskId/',
getParentRoute: () => QueueIdJobIdJobRoute,
} as any,
)
} as any).lazy(() =>
import('./routes/$queueId/$jobId/_job.$taskId/index.lazy').then(
(d) => d.Route,
),
)

// Populate the FileRoutesByPath interface

Expand Down Expand Up @@ -106,14 +119,14 @@ declare module '@tanstack/react-router' {
id: '/$queueId/$jobId/_job/'
path: '/'
fullPath: '/$queueId/$jobId/'
preLoaderRoute: typeof QueueIdJobIdJobIndexImport
preLoaderRoute: typeof QueueIdJobIdJobIndexLazyImport
parentRoute: typeof QueueIdJobIdJobImport
}
'/$queueId/$jobId/_job/$taskId/': {
id: '/$queueId/$jobId/_job/$taskId/'
path: '/$taskId'
fullPath: '/$queueId/$jobId/$taskId'
preLoaderRoute: typeof QueueIdJobIdJobTaskIdIndexImport
preLoaderRoute: typeof QueueIdJobIdJobTaskIdIndexLazyImport
parentRoute: typeof QueueIdJobIdJobImport
}
}
Expand All @@ -127,8 +140,8 @@ export const routeTree = rootRoute.addChildren({
QueueIdIndexRoute,
QueueIdJobIdRoute: QueueIdJobIdRoute.addChildren({
QueueIdJobIdJobRoute: QueueIdJobIdJobRoute.addChildren({
QueueIdJobIdJobIndexRoute,
QueueIdJobIdJobTaskIdIndexRoute,
QueueIdJobIdJobIndexLazyRoute,
QueueIdJobIdJobTaskIdIndexLazyRoute,
}),
}),
})
Expand Down Expand Up @@ -171,11 +184,11 @@ export const routeTree = rootRoute.addChildren({
]
},
"/$queueId/$jobId/_job/": {
"filePath": "$queueId/$jobId/_job.index.tsx",
"filePath": "$queueId/$jobId/_job.index.lazy.tsx",
"parent": "/$queueId/$jobId/_job"
},
"/$queueId/$jobId/_job/$taskId/": {
"filePath": "$queueId/$jobId/_job.$taskId/index.tsx",
"filePath": "$queueId/$jobId/_job.$taskId/index.lazy.tsx",
"parent": "/$queueId/$jobId/_job"
}
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { createFileRoute, Link, notFound } from '@tanstack/react-router'
import { createLazyFileRoute, Link, notFound } from '@tanstack/react-router'
import { useJobContext } from "../-components/job-context"
import { useQuery } from "@tanstack/react-query"
import type { Event, Step, Task } from "queue"
Expand All @@ -8,7 +8,7 @@ import { Events } from "client/routes/$queueId/$jobId/_job.$taskId/-components/E
import { Button } from "client/components/ui/button"
import { Code } from "client/components/syntax-highlighter"

export const Route = createFileRoute('/$queueId/$jobId/_job/$taskId/')({
export const Route = createLazyFileRoute('/$queueId/$jobId/_job/$taskId/')({
component: Task
})

Expand Down
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
import { createFileRoute } from '@tanstack/react-router'
import { createLazyFileRoute } from '@tanstack/react-router'
import { DataTable } from "./-components/data-table"
import { useMemo } from "react"
import { columns } from "./-components/columns"
import { useJobContext } from "./-components/job-context"

export const Route = createFileRoute('/$queueId/$jobId/_job/')({
export const Route = createLazyFileRoute('/$queueId/$jobId/_job/')({
component: Job
})

Expand Down
37 changes: 37 additions & 0 deletions admin/client/routes/$queueId/$jobId/_job.lazy.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
import { createLazyFileRoute, Link, Outlet, useParams } from '@tanstack/react-router'
import { JobContext, jobQueryOpts } from "./-components/job-context"
import { useSuspenseQuery } from "@tanstack/react-query"
import { useState } from "react"

export const Route = createLazyFileRoute('/$queueId/$jobId/_job')({
component: Layout
})

function Layout() {
const { jobId, queueId } = Route.useParams()
const { taskId } = useParams({ strict: false })
const [liveRefresh, setLiveRefresh] = useState(true)

const { data: tasks, refetch, isFetching } = useSuspenseQuery(jobQueryOpts(queueId, jobId, Boolean(liveRefresh || taskId)))

return (
<>
<h1 className="text-2xl p-8 pb-0">
<Link to="/$queueId/$jobId" params={{ jobId, queueId }}>{jobId}</Link>
{isFetching && ' - fetching'}
</h1>
<div className="p-8">
<JobContext.Provider value={{
tasks,
liveRefresh,
setLiveRefresh: (value) => {
setLiveRefresh(value)
if (value) refetch()
}
}}>
<Outlet />
</JobContext.Provider>
</div>
</>
)
}
36 changes: 2 additions & 34 deletions admin/client/routes/$queueId/$jobId/_job.tsx
Original file line number Diff line number Diff line change
@@ -1,41 +1,9 @@
import { createFileRoute, Link, Outlet, useParams } from '@tanstack/react-router'
import { JobContext, jobQueryOpts } from "./-components/job-context"
import { useSuspenseQuery } from "@tanstack/react-query"
import { useState } from "react"
import { createFileRoute } from '@tanstack/react-router'
import { jobQueryOpts } from "./-components/job-context"

export const Route = createFileRoute('/$queueId/$jobId/_job')({
loader: async ({ context, params }) => {
const tasks = await context.client.ensureQueryData(jobQueryOpts(params.queueId, params.jobId, true))
return { tasks }
},
component: Layout
})

function Layout() {
const { jobId, queueId } = Route.useParams()
const { taskId } = useParams({ strict: false })
const [liveRefresh, setLiveRefresh] = useState(true)

const { data: tasks, refetch, isFetching } = useSuspenseQuery(jobQueryOpts(queueId, jobId, Boolean(liveRefresh || taskId)))

return (
<>
<h1 className="text-2xl p-8 pb-0">
<Link to="/$queueId/$jobId" params={{ jobId, queueId }}>{jobId}</Link>
{isFetching && ' - fetching'}
</h1>
<div className="p-8">
<JobContext.Provider value={{
tasks,
liveRefresh,
setLiveRefresh: (value) => {
setLiveRefresh(value)
if (value) refetch()
}
}}>
<Outlet />
</JobContext.Provider>
</div>
</>
)
}
29 changes: 29 additions & 0 deletions admin/client/routes/$queueId/index.lazy.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
import { useQuery } from "@tanstack/react-query"
import { createLazyFileRoute, Outlet } from '@tanstack/react-router'
import { Link } from '@tanstack/react-router'
import { Button } from "client/components/ui/button"
import { jobsQueryOpts } from "client/routes/$queueId"

export const Route = createLazyFileRoute('/$queueId/')({
component: Queue
})

function Queue() {
const { queueId } = Route.useParams()

const { data } = useQuery(jobsQueryOpts(queueId))

return <>
<div>Queue ID: {queueId}</div>
<ul className="flex flex-col gap-1">
{data?.map((job) => (
<li key={job}>
<Button asChild>
<Link to="/$queueId/$jobId" params={{ queueId, jobId: job }} onMouseEnter={() => console.log("/$queueId/$jobId", { queueId, jobId: job })}>{job}</Link>
</Button>
</li>
))}
</ul>
<Outlet />
</>
}
27 changes: 2 additions & 25 deletions admin/client/routes/$queueId/index.tsx
Original file line number Diff line number Diff line change
@@ -1,7 +1,5 @@
import { useQuery, type UseQueryOptions } from "@tanstack/react-query"
import { createFileRoute, Outlet } from '@tanstack/react-router'
import { Link } from '@tanstack/react-router'
import { Button } from "client/components/ui/button"
import { type UseQueryOptions } from "@tanstack/react-query"
import { createFileRoute } from '@tanstack/react-router'

export const jobsQueryOpts = (queueId?: string) => ({
queryKey: [queueId, 'jobs'],
Expand All @@ -18,25 +16,4 @@ export const Route = createFileRoute('/$queueId/')({
const jobs = await context.client.ensureQueryData(jobsQueryOpts(params.queueId))
return { jobs }
},
component: Queue
})

function Queue() {
const { queueId } = Route.useParams()

const { data } = useQuery(jobsQueryOpts(queueId))

return <>
<div>Queue ID: {queueId}</div>
<ul className="flex flex-col gap-1">
{data?.map((job) => (
<li key={job}>
<Button asChild>
<Link to="/$queueId/$jobId" params={{ queueId, jobId: job }} onMouseEnter={() => console.log("/$queueId/$jobId", { queueId, jobId: job })}>{job}</Link>
</Button>
</li>
))}
</ul>
<Outlet />
</>
}
10 changes: 9 additions & 1 deletion admin/client/routes/__root.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ import { jobsQueryOpts } from "client/routes/$queueId"
import { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuSeparator, DropdownMenuTrigger } from "client/components/ui/dropdown-menu"
import { ChevronRight, Home } from "lucide-react"

const queueOptions = {
export const queueOptions = {
queryKey: ['queues'],
queryFn: async () => {
const res = await fetch('/api/queues')
Expand Down Expand Up @@ -44,6 +44,14 @@ function SelectNav() {
{queue}
</DropdownMenuItem>
))}
{queueId && (
<>
<DropdownMenuSeparator />
<DropdownMenuItem onClick={() => nav({ to: "/" })}>
See all queues
</DropdownMenuItem>
</>
)}
</DropdownMenuContent>
</DropdownMenu>
{queueId && <ChevronRight className="h-4 w-4" />}
Expand Down
18 changes: 16 additions & 2 deletions admin/client/routes/index.lazy.tsx
Original file line number Diff line number Diff line change
@@ -1,13 +1,27 @@
import { createLazyFileRoute } from '@tanstack/react-router'
import { useSuspenseQuery } from "@tanstack/react-query"
import { createLazyFileRoute, Link } from '@tanstack/react-router'
import { Button } from "client/components/ui/button"
import { queueOptions } from "client/routes/__root"

export const Route = createLazyFileRoute('/')({
component: Index,
})

function Index() {
const { data } = useSuspenseQuery(queueOptions)

return (
<div className="p-2">
<div className="p-8">
<h3>Welcome Home!</h3>
<ul className="mt-8 flex flex-col gap-2">
{data.map((queue) => (
<li key={queue}>
<Button asChild>
<Link to="/$queueId" params={{ queueId: queue }}>{queue}</Link>
</Button>
</li>
))}
</ul>
</div>
)
}

0 comments on commit b7cdfb7

Please sign in to comment.