Add cache invalidation to all project/round mutations platform-wide
Build and Push Docker Image / build (push) Successful in 8m21s Details

Mutations for create, update, delete, import, filtering finalize,
override, and reinstate now properly invalidate related queries so
the UI updates without requiring a page refresh.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
Matt 2026-02-02 23:36:46 +01:00
parent 56a44049d3
commit db728830d4
6 changed files with 23 additions and 3 deletions

View File

@ -125,14 +125,19 @@ function EditProjectContent({ projectId }: { projectId: string }) {
})
// Mutations
const utils = trpc.useUtils()
const updateProject = trpc.project.update.useMutation({
onSuccess: () => {
utils.project.get.invalidate({ id: projectId })
utils.project.list.invalidate()
router.push(`/admin/projects/${projectId}`)
},
})
const deleteProject = trpc.project.delete.useMutation({
onSuccess: () => {
utils.project.list.invalidate()
utils.round.get.invalidate()
router.push('/admin/projects')
},
})

View File

@ -28,6 +28,7 @@ import { ArrowLeft, FileSpreadsheet, AlertCircle, Database, FileText } from 'luc
function ImportPageContent() {
const router = useRouter()
const utils = trpc.useUtils()
const searchParams = useSearchParams()
const roundIdParam = searchParams.get('round')
@ -175,7 +176,8 @@ function ImportPageContent() {
roundId={selectedRoundId}
roundName={selectedRound.name}
onSuccess={() => {
// Optionally redirect after success
utils.project.list.invalidate()
utils.round.get.invalidate()
}}
/>
</TabsContent>
@ -184,7 +186,8 @@ function ImportPageContent() {
roundId={selectedRoundId}
roundName={selectedRound.name}
onSuccess={() => {
// Optionally redirect after success
utils.project.list.invalidate()
utils.round.get.invalidate()
}}
/>
</TabsContent>
@ -193,7 +196,8 @@ function ImportPageContent() {
roundId={selectedRoundId}
roundName={selectedRound.name}
onSuccess={() => {
// Optionally redirect after success
utils.project.list.invalidate()
utils.round.get.invalidate()
}}
/>
</TabsContent>

View File

@ -59,9 +59,12 @@ function NewProjectPageContent() {
})
// Create mutation
const utils = trpc.useUtils()
const createProject = trpc.project.create.useMutation({
onSuccess: () => {
toast.success('Project created successfully')
utils.project.list.invalidate()
utils.round.get.invalidate()
router.push(`/admin/projects?round=${selectedRoundId}`)
},
onError: (error) => {

View File

@ -39,6 +39,7 @@ export default function FilteringDashboardPage({
trpc.filtering.getResultStats.useQuery({ roundId })
const { data: rules } = trpc.filtering.getRules.useQuery({ roundId })
const utils = trpc.useUtils()
const executeRules = trpc.filtering.executeRules.useMutation()
const finalizeResults = trpc.filtering.finalizeResults.useMutation()
@ -63,6 +64,8 @@ export default function FilteringDashboardPage({
`Finalized: ${result.passed} passed, ${result.filteredOut} filtered out`
)
refetchStats()
utils.project.list.invalidate()
utils.round.get.invalidate({ id: roundId })
} catch (error) {
toast.error(
error instanceof Error ? error.message : 'Failed to finalize'

View File

@ -105,6 +105,7 @@ export default function FilteringResultsPage({
perPage,
})
const utils = trpc.useUtils()
const overrideResult = trpc.filtering.overrideResult.useMutation()
const reinstateProject = trpc.filtering.reinstateProject.useMutation()
@ -127,6 +128,7 @@ export default function FilteringResultsPage({
setOverrideDialog(null)
setOverrideReason('')
refetch()
utils.project.list.invalidate()
} catch {
toast.error('Failed to override result')
}
@ -137,6 +139,7 @@ export default function FilteringResultsPage({
await reinstateProject.mutateAsync({ roundId, projectId })
toast.success('Project reinstated')
refetch()
utils.project.list.invalidate()
} catch {
toast.error('Failed to reinstate project')
}

View File

@ -76,6 +76,8 @@ function RoundDetailContent({ roundId }: { roundId: string }) {
const deleteRound = trpc.round.delete.useMutation({
onSuccess: () => {
toast.success('Round deleted')
utils.program.list.invalidate()
utils.round.list.invalidate()
router.push('/admin/rounds')
},
onError: () => {