@@ -55,6 +55,7 @@ import {
55
55
createImperativeFetch ,
56
56
getMiliseconds ,
57
57
getTimePassed ,
58
+ mutateData ,
58
59
revalidate ,
59
60
useIsomorphicLayoutEffect
60
61
} from '../utils'
@@ -1040,98 +1041,53 @@ export function useFetch<FetchDataType = any, TransformData = any>(
1040
1041
]
1041
1042
)
1042
1043
1043
- // At the top of your component, create a ref to hold all dependencies for the listener.
1044
- const listenerDeps = useRef ( {
1045
- thisDeps,
1046
- idString,
1047
- requestCallId,
1048
- forceMutate,
1049
- imperativeFetch,
1050
- setData,
1051
- setOnline,
1052
- setLoading,
1053
- setError,
1054
- setCompletedAttempts,
1055
- handleMutate,
1056
- url,
1057
- onMutate
1058
- } )
1059
-
1060
- // On every render, update the ref's current value to ensure the listener always has the latest functions and props.
1061
- // This does not trigger the effect below.
1062
- listenerDeps . current = {
1063
- thisDeps,
1064
- idString,
1065
- requestCallId,
1066
- forceMutate,
1067
- imperativeFetch,
1068
- setData,
1069
- setOnline,
1070
- setLoading,
1071
- setError,
1072
- setCompletedAttempts,
1073
- handleMutate,
1074
- url,
1075
- onMutate
1076
- }
1077
-
1078
1044
useEffect ( ( ) => {
1079
- function waitFormUpdates ( event : any ) {
1080
- // Destructure the latest dependencies from the ref inside the listener
1081
- const deps = listenerDeps . current
1045
+ function waitFormUpdates ( v : any ) {
1082
1046
const {
1083
1047
isMutating,
1084
1048
data : $data ,
1085
1049
error : $error ,
1086
1050
online,
1087
1051
loading,
1088
1052
completedAttempts
1089
- } = event || { }
1053
+ } = v || { }
1090
1054
1091
- // 1. Handle mutations with cleaner logic
1092
- if (
1093
- isMutating &&
1094
- serialize ( $data ) !== serialize ( cacheForMutation . get ( resolvedKey ) )
1095
- ) {
1096
- cacheForMutation . set ( deps . idString , $data )
1097
- deps . forceMutate ( $data )
1098
-
1099
- if ( deps . handleMutate ) {
1100
- const canCallOnMutate =
1101
- deps . url === '' || ! runningMutate . get ( resolvedKey )
1102
- if ( canCallOnMutate ) {
1103
- if ( deps . url !== '' ) runningMutate . set ( resolvedKey , true )
1104
- ; ( deps . onMutate as any ) ( $data , deps . imperativeFetch )
1105
- }
1106
- }
1107
- }
1055
+ if ( isMutating ) {
1056
+ if ( ! jsonCompare ( $data , cacheForMutation . get ( resolvedKey ) ) ) {
1057
+ cacheForMutation . set ( idString , $data )
1108
1058
1109
- // 2. Handle state synchronization from other hooks
1110
- if (
1111
- event . requestCallId !== deps . requestCallId &&
1112
- ! willSuspend . get ( resolvedKey )
1113
- ) {
1114
- // Create a map to avoid the long if-chain
1115
- const stateUpdates = {
1116
- data : { value : $data , setter : deps . setData } ,
1117
- online : { value : online , setter : deps . setOnline } ,
1118
- loading : { value : loading , setter : deps . setLoading } ,
1119
- error : { value : $error , setter : deps . setError } ,
1120
- completedAttempts : {
1121
- value : completedAttempts ,
1122
- setter : deps . setCompletedAttempts
1059
+ if ( isMutating ) {
1060
+ if ( handleMutate ) {
1061
+ if ( url === '' ) {
1062
+ ; ( onMutate as any ) ( $data , imperativeFetch )
1063
+ } else {
1064
+ if ( ! runningMutate . get ( resolvedKey ) ) {
1065
+ runningMutate . set ( resolvedKey , true )
1066
+ ; ( onMutate as any ) ( $data , imperativeFetch )
1067
+ }
1068
+ }
1069
+ }
1123
1070
}
1124
1071
}
1072
+ }
1125
1073
1126
- // Loop through the map to update state concisely using a transition
1127
- startTransition ( ( ) => {
1128
- for ( const key in stateUpdates ) {
1129
- const update = stateUpdates [ key as keyof typeof stateUpdates ]
1130
- if (
1131
- deps . thisDeps [ key as keyof typeof stateUpdates ] &&
1132
- isDefined ( update . value )
1133
- ) {
1134
- update . setter ( update . value )
1074
+ if ( v . requestCallId !== requestCallId ) {
1075
+ queue ( ( ) => {
1076
+ if ( ! willSuspend . get ( resolvedKey ) ) {
1077
+ if ( inDeps ( 'data' ) && isDefined ( $data ) ) {
1078
+ setData ( $data )
1079
+ }
1080
+ if ( inDeps ( 'online' ) && isDefined ( online ) ) {
1081
+ setOnline ( online )
1082
+ }
1083
+ if ( inDeps ( 'loading' ) && isDefined ( loading ) ) {
1084
+ setLoading ( loading )
1085
+ }
1086
+ if ( inDeps ( 'error' ) && isDefined ( $error ) ) {
1087
+ setError ( $error )
1088
+ }
1089
+ if ( inDeps ( 'completedAttempts' ) && isDefined ( completedAttempts ) ) {
1090
+ setCompletedAttempts ( completedAttempts )
1135
1091
}
1136
1092
}
1137
1093
} )
@@ -1143,7 +1099,22 @@ export function useFetch<FetchDataType = any, TransformData = any>(
1143
1099
return ( ) => {
1144
1100
requestsProvider . removeListener ( resolvedKey , waitFormUpdates )
1145
1101
}
1146
- } , [ resolvedKey ] )
1102
+ } , [
1103
+ // thisDeps,
1104
+ resolvedKey ,
1105
+ idString ,
1106
+ requestCallId ,
1107
+ forceMutate ,
1108
+ imperativeFetch ,
1109
+ setData ,
1110
+ setOnline ,
1111
+ setLoading ,
1112
+ setError ,
1113
+ setCompletedAttempts ,
1114
+ handleMutate ,
1115
+ url ,
1116
+ onMutate
1117
+ ] )
1147
1118
1148
1119
const reValidate = useCallback (
1149
1120
async function reValidate ( ) {
@@ -1307,6 +1278,7 @@ export function useFetch<FetchDataType = any, TransformData = any>(
1307
1278
1308
1279
useEffect ( ( ) => {
1309
1280
// Attempts will be made after a request fails
1281
+
1310
1282
const tm = setTimeout ( ( ) => {
1311
1283
if ( ! gettingAttempts . get ( resolvedKey ) ) {
1312
1284
gettingAttempts . set ( resolvedKey , true )
@@ -1727,6 +1699,7 @@ Learn more: https://httpr.vercel.app/docs/api#suspense
1727
1699
submit,
1728
1700
get mutate ( ) {
1729
1701
thisDeps . data = true
1702
+
1730
1703
return forceMutate
1731
1704
} ,
1732
1705
get fetcher ( ) {
0 commit comments