Skip to content

Commit

Permalink
feat(react-query-4): set network mode to always for suspense (#1458)
Browse files Browse the repository at this point in the history
# Overview

closed: #1442 

In React Query v4, the `OnlineManager` checks the client's network
status using `navigator.onLine`. However, this can sometimes cause bugs
in Chrome (Chromium-based browsers), where the network is incorrectly
detected as offline even when it is online.

To minimize this issue, React Query v5 no longer relies on
`navigator.onLine`.

In React Query v4, to minimize this issue, **networkMode is set to
always in Suspense Hooks**. This change ensures that TData in Suspense
remains guaranteed.

ref:

-
https://github.com/TanStack/query/blob/v4/packages/query-core/src/onlineManager.ts#L92
- TanStack/query#4753
- https://issues.chromium.org/issues/338514113

## PR Checklist

- [x] I did below actions if need

1. I read the [Contributing
Guide](https://github.com/toss/suspensive/blob/main/CONTRIBUTING.md)
2. I added documents and tests.

---------

Co-authored-by: Jonghyeon Ko <jonghyeon@toss.im>
  • Loading branch information
gwansikk and manudeli authored Mar 3, 2025
1 parent e370e67 commit c78cbfd
Show file tree
Hide file tree
Showing 10 changed files with 60 additions and 2 deletions.
5 changes: 5 additions & 0 deletions .changeset/unlucky-trees-kick.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
"@suspensive/react-query-4": major
---

feat(react-query-4): set network mode to always
18 changes: 18 additions & 0 deletions packages/react-query-4/src/SuspenseInfiniteQuery.test-d.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -98,6 +98,24 @@ describe('<SuspenseInfiniteQuery/>', () => {
)}
</SuspenseInfiniteQuery>
))()
;(() => (
<SuspenseInfiniteQuery
queryKey={queryKey}
queryFn={queryFn}
//@ts-expect-error no networkMode
networkMode="always"
>
{(query) => (
<>
{query.data.pages
.filter(({ text }) => text)
.map((item, index) => (
<div key={index}>{item.text}</div>
))}
</>
)}
</SuspenseInfiniteQuery>
))()
;(() => (
<SuspenseInfiniteQuery queryKey={queryKey} queryFn={queryFn}>
{(query) => {
Expand Down
10 changes: 10 additions & 0 deletions packages/react-query-4/src/SuspenseQuery.test-d.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -57,6 +57,16 @@ describe('<SuspenseQuery/>', () => {
{(query) => <>{query.data.text}</>}
</SuspenseQuery>
))()
;(() => (
<SuspenseQuery
queryKey={queryKey}
queryFn={queryFn}
//@ts-expect-error no networkMode
networkMode="always"
>
{(query) => <>{query.data.text}</>}
</SuspenseQuery>
))()
;(() => (
<SuspenseQuery queryKey={queryKey} queryFn={queryFn}>
{(query) => {
Expand Down
2 changes: 2 additions & 0 deletions packages/react-query-4/src/infiniteQueryOptions.ts
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@ export type SelectedInfiniteOptions<
| 'enabled'
| 'refetchInterval'
| 'initialData'
| 'networkMode'
>,
'queryKey' | 'queryFn'
> & {
Expand All @@ -45,6 +46,7 @@ export type UnSelectedInfiniteOptions<
| 'enabled'
| 'refetchInterval'
| 'initialData'
| 'networkMode'
>,
'queryKey' | 'queryFn'
> & {
Expand Down
2 changes: 2 additions & 0 deletions packages/react-query-4/src/queryOptions.ts
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@ export type SelectedQueryOptions<
| 'enabled'
| 'refetchInterval'
| 'initialData'
| 'networkMode'
>,
'queryKey' | 'queryFn'
> & {
Expand Down Expand Up @@ -49,6 +50,7 @@ export type UnSelectedQueryOptions<
| 'enabled'
| 'refetchInterval'
| 'initialData'
| 'networkMode'
>,
'queryKey' | 'queryFn'
> & {
Expand Down
6 changes: 6 additions & 0 deletions packages/react-query-4/src/useSuspenseInfiniteQuery.test-d.ts
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,12 @@ describe('useSuspenseInfiniteQuery', () => {
queryFn,
// @ts-expect-error no isPlaceholderData
}).isPlaceholderData
useSuspenseInfiniteQuery({
queryKey,
queryFn,
//@ts-expect-error no networkMode
networkMode: 'always',
})

const infiniteQuery = useSuspenseInfiniteQuery({ queryKey, queryFn })
expectTypeOf(infiniteQuery).toEqualTypeOf<UseSuspenseInfiniteQueryResult<{ text: string }>>()
Expand Down
3 changes: 2 additions & 1 deletion packages/react-query-4/src/useSuspenseInfiniteQuery.ts
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ export type UseSuspenseInfiniteQueryOptions<
TQueryKey extends QueryKey = QueryKey,
> = OmitKeyof<
UseInfiniteQueryOptions<TQueryFnData, TError, TData, TQueryFnData, TQueryKey>,
'suspense' | 'useErrorBoundary' | 'enabled' | 'placeholderData'
'suspense' | 'useErrorBoundary' | 'enabled' | 'placeholderData' | 'networkMode'
>

/**
Expand All @@ -43,5 +43,6 @@ export function useSuspenseInfiniteQuery<
enabled: true,
suspense: true,
useErrorBoundary: true,
networkMode: 'always',
}) as UseSuspenseInfiniteQueryResult<TData, TError>
}
7 changes: 7 additions & 0 deletions packages/react-query-4/src/useSuspenseQueries.test-d.ts
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,13 @@ describe('useSuspenseQueries', () => {
enabled: true,
select,
},
{
queryKey: [...queryKey, 4] as const,
queryFn,
// @ts-expect-error no networkMode
networkMode: 'always',
select,
},
queryOptions({
queryKey: [...queryKey, 4] as const,
queryFn: () => Promise.resolve({ field: 'success' }),
Expand Down
6 changes: 6 additions & 0 deletions packages/react-query-4/src/useSuspenseQuery.test-d.ts
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,12 @@ describe('useSuspenseQuery', () => {
queryFn,
//@ts-expect-error no isPlaceholderData
}).isPlaceholderData
useSuspenseQuery({
queryKey,
queryFn,
//@ts-expect-error no networkMode
networkMode: 'always',
})

const result = useSuspenseQuery({ queryKey, queryFn })
expectTypeOf(result).toEqualTypeOf<UseSuspenseQueryResult<{ text: string }>>()
Expand Down
3 changes: 2 additions & 1 deletion packages/react-query-4/src/useSuspenseQuery.ts
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ export type UseSuspenseQueryOptions<
TQueryKey extends QueryKey = QueryKey,
> = OmitKeyof<
UseQueryOptions<TQueryFnData, TError, TData, TQueryKey>,
'suspense' | 'useErrorBoundary' | 'enabled' | 'placeholderData'
'suspense' | 'useErrorBoundary' | 'enabled' | 'placeholderData' | 'networkMode'
>

/**
Expand All @@ -32,5 +32,6 @@ export function useSuspenseQuery<
enabled: true,
useErrorBoundary: true,
suspense: true,
networkMode: 'always',
}) as UseSuspenseQueryResult<TData, TError>
}

0 comments on commit c78cbfd

Please sign in to comment.