@@ -5,8 +5,8 @@ import { Offer } from "@/lib/types";
55import { OfferCard } from "@/components/listings/offer/OfferCard" ;
66import { MyOfferCard } from "@/components/listings/offer/MyOfferCard" ;
77import { EditMyOfferModal } from "@/components/listings/offer/EditMyOfferModal" ;
8- import { deleteMyOfferForListing } from "@/lib/actions" ;
9- import { useMutation , useQueryClient } from "@tanstack/react-query" ;
8+ import { deleteMyOfferForListing , getMyOfferForListing } from "@/lib/actions" ;
9+ import { useMutation , useQuery , useQueryClient } from "@tanstack/react-query" ;
1010import { Button } from "@/components/ui/button" ;
1111import {
1212 Dialog ,
@@ -17,7 +17,7 @@ import {
1717 DialogTitle ,
1818} from "@/components/ui/dialog" ;
1919
20- export const OffersReceivedSection = ( {
20+ export const OffersReceived = ( {
2121 isOwner,
2222 offersReceived : initialOffersReceived ,
2323 myOfferGiven,
@@ -32,28 +32,47 @@ export const OffersReceivedSection = ({
3232 const [ isEditOfferOpen , setIsEditOfferOpen ] = useState ( false ) ;
3333 const [ isDeleteOfferOpen , setIsDeleteOfferOpen ] = useState ( false ) ;
3434 const queryClient = useQueryClient ( ) ;
35+ const { data : myOffer } = useQuery ( {
36+ queryKey : [ "myOffer" , listingId ] ,
37+ queryFn : ( ) => getMyOfferForListing ( listingId ) ,
38+ enabled : ! isOwner ,
39+ initialData : myOfferGiven ,
40+ } ) ;
3541
3642 const handleStatusChange = ( id : number , status : Offer [ "status" ] ) => {
3743 setOffersReceived ( ( prev ) => prev . map ( ( offer ) => ( offer . id === id ? { ...offer , status } : offer ) ) ) ;
3844 } ;
3945
4046 const deleteMyOfferMutation = useMutation ( {
4147 mutationFn : ( ) => deleteMyOfferForListing ( listingId ) ,
48+ onMutate : async ( ) => {
49+ await queryClient . cancelQueries ( { queryKey : [ "myOffer" , listingId ] } ) ;
50+ const previousOffer = queryClient . getQueryData < Offer | null > ( [ "myOffer" , listingId ] ) ;
51+ queryClient . setQueryData < Offer | null > ( [ "myOffer" , listingId ] , null ) ;
52+ return { previousOffer } ;
53+ } ,
4254 onSuccess : ( ) => {
4355 setIsDeleteOfferOpen ( false ) ;
56+ } ,
57+ onError : ( _error , _vars , context ) => {
58+ if ( context ?. previousOffer !== undefined ) {
59+ queryClient . setQueryData ( [ "myOffer" , listingId ] , context . previousOffer ) ;
60+ }
61+ } ,
62+ onSettled : ( ) => {
4463 queryClient . invalidateQueries ( { queryKey : [ "myOffer" , listingId ] } ) ;
4564 } ,
4665 } ) ;
4766
4867 if ( ! isOwner ) {
49- if ( ! myOfferGiven ) return null ;
68+ if ( ! myOffer ) return null ;
5069
5170 return (
5271 < >
5372 < div className = "space-y-3" >
5473 < h2 className = "text-lg font-semibold" > Your offer</ h2 >
5574 < MyOfferCard
56- offer = { myOfferGiven }
75+ offer = { myOffer }
5776 onEdit = { ( ) => setIsEditOfferOpen ( true ) }
5877 onDelete = { ( ) => setIsDeleteOfferOpen ( true ) }
5978 />
@@ -62,7 +81,7 @@ export const OffersReceivedSection = ({
6281 < EditMyOfferModal
6382 isOpen = { isEditOfferOpen }
6483 onClose = { ( ) => setIsEditOfferOpen ( false ) }
65- offer = { myOfferGiven }
84+ offer = { myOffer }
6685 onSaved = { ( ) => {
6786 queryClient . invalidateQueries ( { queryKey : [ "myOffer" , listingId ] } ) ;
6887 setIsEditOfferOpen ( false ) ;
@@ -116,4 +135,3 @@ export const OffersReceivedSection = ({
116135 </ div >
117136 ) ;
118137} ;
119-
0 commit comments