Skip to content

Conversation

@kevin-dp
Copy link
Contributor

Fix @tanstack/offline-transactions for React Native / Expo

This PR fixes #1013

Problem

The DefaultOnlineDetector attempted to use browser-specific APIs (window.addEventListener('online'), document.addEventListener('visibilitychange')) which don't exist in React Native. This caused errors when using the package in RN/Expo environments.

Solution

Introduced platform-specific OnlineDetector implementations:

  • WebOnlineDetector - Uses browser APIs (window.online/offline, document.visibilitychange)
  • ReactNativeOnlineDetector - Uses RN primitives (@react-native-community/netinfo for network status, AppState for foreground/background)

The RN implementation is exposed via a separate entrypoint to avoid bundling RN modules for web users.

Usage

Web (unchanged):

import { startOfflineExecutor } from '@tanstack/offline-transactions'

React Native / Expo:

import { startOfflineExecutor } from '@tanstack/offline-transactions/react-native'

The RN entrypoint automatically uses ReactNativeOnlineDetector. All other APIs remain the same.

Peer Dependencies (for RN users)

npm install @react-native-community/netinfo

The package declares react-native and @react-native-community/netinfo as optional peer dependencies.

@changeset-bot
Copy link

changeset-bot bot commented Jan 15, 2026

🦋 Changeset detected

Latest commit: f6203ce

The changes in this PR will be included in the next version bump.

This PR includes changesets to release 1 package
Name Type
@tanstack/offline-transactions Patch

Not sure what this means? Click here to learn what changesets are.

Click here if you're a maintainer who wants to add another changeset to this PR

@pkg-pr-new
Copy link

pkg-pr-new bot commented Jan 15, 2026

More templates

@tanstack/angular-db

npm i https://pkg.pr.new/@tanstack/angular-db@1137

@tanstack/db

npm i https://pkg.pr.new/@tanstack/db@1137

@tanstack/db-ivm

npm i https://pkg.pr.new/@tanstack/db-ivm@1137

@tanstack/electric-db-collection

npm i https://pkg.pr.new/@tanstack/electric-db-collection@1137

@tanstack/offline-transactions

npm i https://pkg.pr.new/@tanstack/offline-transactions@1137

@tanstack/powersync-db-collection

npm i https://pkg.pr.new/@tanstack/powersync-db-collection@1137

@tanstack/query-db-collection

npm i https://pkg.pr.new/@tanstack/query-db-collection@1137

@tanstack/react-db

npm i https://pkg.pr.new/@tanstack/react-db@1137

@tanstack/rxdb-db-collection

npm i https://pkg.pr.new/@tanstack/rxdb-db-collection@1137

@tanstack/solid-db

npm i https://pkg.pr.new/@tanstack/solid-db@1137

@tanstack/svelte-db

npm i https://pkg.pr.new/@tanstack/svelte-db@1137

@tanstack/trailbase-db-collection

npm i https://pkg.pr.new/@tanstack/trailbase-db-collection@1137

@tanstack/vue-db

npm i https://pkg.pr.new/@tanstack/vue-db@1137

commit: b42ffaf

@github-actions
Copy link
Contributor

Size Change: 0 B

Total Size: 90.5 kB

ℹ️ View Unchanged
Filename Size
./packages/db/dist/esm/collection/change-events.js 1.39 kB
./packages/db/dist/esm/collection/changes.js 1.19 kB
./packages/db/dist/esm/collection/events.js 388 B
./packages/db/dist/esm/collection/index.js 3.32 kB
./packages/db/dist/esm/collection/indexes.js 1.1 kB
./packages/db/dist/esm/collection/lifecycle.js 1.67 kB
./packages/db/dist/esm/collection/mutations.js 2.34 kB
./packages/db/dist/esm/collection/state.js 3.46 kB
./packages/db/dist/esm/collection/subscription.js 3.62 kB
./packages/db/dist/esm/collection/sync.js 2.38 kB
./packages/db/dist/esm/deferred.js 207 B
./packages/db/dist/esm/errors.js 4.49 kB
./packages/db/dist/esm/event-emitter.js 748 B
./packages/db/dist/esm/index.js 2.69 kB
./packages/db/dist/esm/indexes/auto-index.js 742 B
./packages/db/dist/esm/indexes/base-index.js 766 B
./packages/db/dist/esm/indexes/btree-index.js 1.93 kB
./packages/db/dist/esm/indexes/lazy-index.js 1.1 kB
./packages/db/dist/esm/indexes/reverse-index.js 513 B
./packages/db/dist/esm/local-only.js 837 B
./packages/db/dist/esm/local-storage.js 2.1 kB
./packages/db/dist/esm/optimistic-action.js 359 B
./packages/db/dist/esm/paced-mutations.js 496 B
./packages/db/dist/esm/proxy.js 3.75 kB
./packages/db/dist/esm/query/builder/functions.js 733 B
./packages/db/dist/esm/query/builder/index.js 4.08 kB
./packages/db/dist/esm/query/builder/ref-proxy.js 1.05 kB
./packages/db/dist/esm/query/compiler/evaluators.js 1.42 kB
./packages/db/dist/esm/query/compiler/expressions.js 430 B
./packages/db/dist/esm/query/compiler/group-by.js 1.87 kB
./packages/db/dist/esm/query/compiler/index.js 1.96 kB
./packages/db/dist/esm/query/compiler/joins.js 2 kB
./packages/db/dist/esm/query/compiler/order-by.js 1.45 kB
./packages/db/dist/esm/query/compiler/select.js 1.06 kB
./packages/db/dist/esm/query/expression-helpers.js 1.43 kB
./packages/db/dist/esm/query/ir.js 673 B
./packages/db/dist/esm/query/live-query-collection.js 360 B
./packages/db/dist/esm/query/live/collection-config-builder.js 5.4 kB
./packages/db/dist/esm/query/live/collection-registry.js 264 B
./packages/db/dist/esm/query/live/collection-subscriber.js 1.93 kB
./packages/db/dist/esm/query/live/internal.js 145 B
./packages/db/dist/esm/query/optimizer.js 2.56 kB
./packages/db/dist/esm/query/predicate-utils.js 2.97 kB
./packages/db/dist/esm/query/subset-dedupe.js 921 B
./packages/db/dist/esm/scheduler.js 1.3 kB
./packages/db/dist/esm/SortedMap.js 1.3 kB
./packages/db/dist/esm/strategies/debounceStrategy.js 247 B
./packages/db/dist/esm/strategies/queueStrategy.js 428 B
./packages/db/dist/esm/strategies/throttleStrategy.js 246 B
./packages/db/dist/esm/transactions.js 2.9 kB
./packages/db/dist/esm/utils.js 924 B
./packages/db/dist/esm/utils/browser-polyfills.js 304 B
./packages/db/dist/esm/utils/btree.js 5.61 kB
./packages/db/dist/esm/utils/comparison.js 852 B
./packages/db/dist/esm/utils/cursor.js 457 B
./packages/db/dist/esm/utils/index-optimization.js 1.51 kB
./packages/db/dist/esm/utils/type-guards.js 157 B

compressed-size-action::db-package-size

@github-actions
Copy link
Contributor

Size Change: 0 B

Total Size: 3.47 kB

ℹ️ View Unchanged
Filename Size
./packages/react-db/dist/esm/index.js 225 B
./packages/react-db/dist/esm/useLiveInfiniteQuery.js 1.17 kB
./packages/react-db/dist/esm/useLiveQuery.js 1.12 kB
./packages/react-db/dist/esm/useLiveSuspenseQuery.js 559 B
./packages/react-db/dist/esm/usePacedMutations.js 401 B

compressed-size-action::react-db-package-size

@KyleAMathews
Copy link
Collaborator

Can we document this in the readme?

@kevin-dp
Copy link
Contributor Author

@claude update the readme of the @tanstack/offline-transactions package to explain how to use that package for web vs for React Native as i did in this PR description.

@claude
Copy link

claude bot commented Jan 15, 2026

Claude finished @kevin-dp's task in 1m 22s —— View job


Documentation updated successfully

Tasks completed

  • Read current README to understand structure
  • Update README with platform-specific usage instructions (web vs React Native)
  • Commit and push changes

Summary

I've updated the @tanstack/offline-transactions README to document the platform-specific usage for web vs React Native. The changes include:

Installation Section

  • Split into separate sections for Web and React Native/Expo
  • Documented the required @react-native-community/netinfo peer dependency for React Native

Platform Support Section (new)

  • Explained the different underlying APIs used:
    • Web: Browser APIs (window.online/offline, document.visibilitychange)
    • React Native: React Native primitives (@react-native-community/netinfo, AppState)

Quick Start Section

  • Split into separate examples for Web and React Native
  • Showed the different import paths:
    • Web: import { ... } from '@tanstack/offline-transactions'
    • React Native: import { ... } from '@tanstack/offline-transactions/react-native'
  • Emphasized that all other APIs remain identical between platforms

Platform Support Section (bottom)

  • Updated from "Browser Support" to "Platform Support"
  • Added React Native/Expo version requirements and storage details

The documentation now clearly guides users on how to use the package in both web and React Native environments, matching the implementation details from this PR.

--- •

- Added separate installation instructions for web and React Native
- Documented platform-specific OnlineDetector implementations
- Clarified import path differences between platforms
- Added React Native platform support details

Co-authored-by: Kevin <[email protected]>
### React Native / Expo

```typescript
import { startOfflineExecutor } from '@tanstack/offline-transactions/react-native'
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@claude no need to repeat all the same code as we already show for the web example. Just show that the import is different.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

Status: Ready for review

Development

Successfully merging this pull request may close these issues.

Offline Transactions broken on React Native

3 participants