| 188 | * ``` |
| 189 | */ |
| 190 | export function useMutation< |
| 191 | TData = unknown, |
| 192 | TError = DefaultError, |
| 193 | TVariables = void, |
| 194 | TOnMutateResult = unknown, |
| 195 | >( |
| 196 | options: UseMutationOptions<TData, TError, TVariables, TOnMutateResult>, |
| 197 | queryClient?: QueryClient, |
| 198 | ): UseMutationResult<TData, TError, TVariables, TOnMutateResult> { |
| 199 | const client = useQueryClient(queryClient) |
| 200 | |
| 201 | const [observer] = useState( |
| 202 | () => |
| 203 | new MutationObserver<TData, TError, TVariables, TOnMutateResult>( |
| 204 | client, |
| 205 | options, |
| 206 | ), |
| 207 | ) |
| 208 | |
| 209 | useEffect(() => { |
| 210 | observer.setOptions(options) |
| 211 | }, [observer, options]) |
| 212 | |
| 213 | const result = useSyncExternalStore( |
| 214 | useCallback( |
| 215 | (onStoreChange) => |
| 216 | observer.subscribe(notifyManager.batchCalls(onStoreChange)), |
| 217 | [observer], |
| 218 | ), |
| 219 | () => observer.getCurrentResult(), |
| 220 | ) |
| 221 | |
| 222 | const mutate = useCallback< |
| 223 | UseMutateFunction<TData, TError, TVariables, TOnMutateResult> |
| 224 | >( |
| 225 | ( |
| 226 | ...args: Parameters< |
| 227 | UseMutateFunction<TData, TError, TVariables, TOnMutateResult> |
| 228 | > |
| 229 | ) => { |
| 230 | observer.mutate(args[0] as TVariables, args[1]).catch(noop) |
| 231 | }, |
| 232 | [observer], |
| 233 | ) |
| 234 | |
| 235 | if ( |
| 236 | result.error && |
| 237 | shouldThrowError(observer.options.throwOnError, [result.error]) |
| 238 | ) { |
| 239 | throw result.error |
| 240 | } |
| 241 | |
| 242 | return { ...result, mutate, mutateAsync: result.mutate } |
| 243 | } |