1+ import { useMutation , useQueryClient } from "@tanstack/react-query" ;
12import {
23 useAddDocumentMutation ,
34 useCollectionQuery ,
89 doc ,
910 getFirestore ,
1011 query ,
12+ Timestamp ,
1113 where ,
1214} from "firebase/firestore" ;
1315import { useState } from "react" ;
@@ -17,7 +19,7 @@ interface Task {
1719 title : string ;
1820 completed : boolean ;
1921 priority : "low" | "medium" | "high" ;
20- createdAt : Date ;
22+ createdAt : Timestamp | Date ;
2123}
2224
2325export function CollectionQueryExample ( ) {
@@ -26,6 +28,7 @@ export function CollectionQueryExample() {
2628 useState < Task [ "priority" ] > ( "medium" ) ;
2729 const [ filterCompleted , setFilterCompleted ] = useState < boolean | null > ( null ) ;
2830
31+ const queryClient = useQueryClient ( ) ;
2932 const firestore = getFirestore ( ) ;
3033 const tasksCollection = collection ( firestore , "tasks" ) ;
3134
@@ -45,8 +48,13 @@ export function CollectionQueryExample() {
4548 queryKey : [ "tasks" , filterCompleted ] ,
4649 } ) ;
4750
48- // Add task mutation
49- const addTaskMutation = useAddDocumentMutation ( tasksCollection ) ;
51+ // Add task mutation with query invalidation
52+ const addTaskMutation = useAddDocumentMutation ( tasksCollection , {
53+ onSuccess : ( ) => {
54+ // Invalidate all task queries after successful add
55+ queryClient . invalidateQueries ( { queryKey : [ "tasks" ] } ) ;
56+ } ,
57+ } ) ;
5058
5159 const handleAddTask = async ( ) => {
5260 if ( ! newTaskTitle . trim ( ) ) return ;
@@ -76,10 +84,21 @@ export function CollectionQueryExample() {
7684 console . log ( `Would toggle task ${ taskId } to ${ ! currentCompleted } ` ) ;
7785 } ;
7886
87+ // Use a mutation for delete with dynamic document reference TODO: why doesn't the library support dynamic document reference?
88+ const deleteTaskMutation = useMutation ( {
89+ mutationFn : async ( taskId : string ) => {
90+ const taskRef = doc ( firestore , "tasks" , taskId ) ;
91+ await deleteDoc ( taskRef ) ;
92+ } ,
93+ onSuccess : ( ) => {
94+ // Invalidate all task queries after successful delete
95+ queryClient . invalidateQueries ( { queryKey : [ "tasks" ] } ) ;
96+ } ,
97+ } ) ;
98+
7999 const handleDeleteTask = async ( taskId : string ) => {
80- const taskRef = doc ( firestore , "tasks" , taskId ) ;
81100 try {
82- await deleteDoc ( taskRef ) ;
101+ await deleteTaskMutation . mutateAsync ( taskId ) ;
83102 } catch ( error ) {
84103 console . error ( "Failed to delete task:" , error ) ;
85104 }
@@ -252,7 +271,12 @@ export function CollectionQueryExample() {
252271 { task . title }
253272 </ h4 >
254273 < p className = "text-sm text-gray-500" >
255- Created: { task . createdAt . toLocaleDateString ( ) }
274+ Created:{ " " }
275+ { task . createdAt instanceof Timestamp
276+ ? task . createdAt . toDate ( ) . toLocaleDateString ( )
277+ : task . createdAt instanceof Date
278+ ? task . createdAt . toLocaleDateString ( )
279+ : "Unknown date" }
256280 </ p >
257281 </ div >
258282 < span
0 commit comments