{"id":3971,"url":"https://github.com/rgommezz/react-native-offline","last_synced_at":"2025-05-14T07:08:04.737Z","repository":{"id":37664510,"uuid":"86369462","full_name":"rgommezz/react-native-offline","owner":"rgommezz","description":"Handy toolbelt to deal nicely with offline/online connectivity in a React Native app. Smooth redux integration ✈️","archived":false,"fork":false,"pushed_at":"2023-03-04T11:06:55.000Z","size":2499,"stargazers_count":2351,"open_issues_count":19,"forks_count":270,"subscribers_count":23,"default_branch":"master","last_synced_at":"2025-05-12T23:39:09.424Z","etag":null,"topics":["offline","react","react-native","reactnative","redux"],"latest_commit_sha":null,"homepage":"","language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/rgommezz.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null}},"created_at":"2017-03-27T18:21:49.000Z","updated_at":"2025-05-12T12:34:27.000Z","dependencies_parsed_at":"2023-02-14T02:15:25.633Z","dependency_job_id":"8a821931-e13b-4815-8557-a59e9065cca4","html_url":"https://github.com/rgommezz/react-native-offline","commit_stats":{"total_commits":213,"total_committers":46,"mean_commits":4.630434782608695,"dds":0.5633802816901409,"last_synced_commit":"673a2eb1864ed39194408a07e3a3612a39c89ced"},"previous_names":["rauliyohmc/react-native-offline"],"tags_count":28,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rgommezz%2Freact-native-offline","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rgommezz%2Freact-native-offline/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rgommezz%2Freact-native-offline/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rgommezz%2Freact-native-offline/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/rgommezz","download_url":"https://codeload.github.com/rgommezz/react-native-offline/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":254092652,"owners_count":22013290,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["offline","react","react-native","reactnative","redux"],"created_at":"2024-01-05T20:16:57.269Z","updated_at":"2025-05-14T07:08:04.676Z","avatar_url":"https://github.com/rgommezz.png","language":"TypeScript","funding_links":["https://issuehunt.io/repos/86369462"],"categories":["Components","TypeScript"],"sub_categories":["UI"],"readme":"\u003cp align=\"center\"\u003e\n  \u003cimg alt=\"Dashvar Logo Banner\" src=\"assets/cover_rn_offline.png\" /\u003e\n\u003c/p\u003e\n\n# react-native-offline\n\n[![All Contributors](https://img.shields.io/badge/all_contributors-34-orange.svg?style=flat-square)](#contributors)\n[![CircleCI](https://circleci.com/gh/rgommezz/react-native-offline.svg?style=shield)](https://circleci.com/gh/rgommezz/react-native-offline) [![npm version](https://badge.fury.io/js/react-native-offline.svg)](https://badge.fury.io/js/react-native-offline) [![Coverage Status](https://coveralls.io/repos/github/rauliyohmc/react-native-offline/badge.svg?branch=master)](https://coveralls.io/github/rauliyohmc/react-native-offline?branch=master)\n[![npm](https://img.shields.io/npm/dm/react-native-offline.svg)]()\n\nHandful of utilities you should keep in your toolbelt to handle offline/online connectivity in React Native. It supports iOS, Android and Windows platforms. You can leverage all the functionalities provided or just the ones that suits your needs, the modules are conveniently decoupled.\n\n## Example app\n\nA comprehensive [example app](/example) is available within Expo to play with the library and better understand its different modules. [Go and check it out!](https://exp.host/@rgommezz/react-native-offline-example)\n\n## Contents\n\n- [Motivation](#motivation)\n- [Features](#features)\n- [Contributions](#contributions)\n- [Sponsors](#sponsors)\n- [Installation](#installation)\n- [API](#api)\n  - [Component Utilities](#component-utilities)\n    - [`NetworkProvider`](#networkprovider)\n    - [`NetworkConsumer`](#networkconsumer)\n  - [Hooks](#hooks)\n    - [`useIsConnected`](#useisconnected)\n  - [Integration with Redux](#integration-with-redux)\n    - [`Network reducer`](#network-reducer)\n    - [`ReduxNetworkProvider`](#reduxnetworkprovider)\n    - [`networkSaga`](#networksaga)\n    - [`createNetworkMiddleware`](#createnetworkmiddleware)\n    - [`Offline Queue`](#offline-queue)\n  - [Other Utilities](#other-utilities)\n    - [`checkInternetConnection`](#checkinternetconnection)\n- [Miscellanea](#miscellanea)\n  - [FAQ](#faq)\n    - [Testing offline behaviour](#how-to-test-offline-behavior-while-actually-being-online)\n    - [Dispatching CONNECTION_CHANGE as 1st action on app startup](#how-to-orchestrate-redux-to-dispatch-connection_change-as-the-first-action-when-the-app-starts-up)\n    - [Intercept and queue actions based off server errors](#how-to-intercept-and-queue-actions-when-the-server-responds-with-client-4xx-or-server-5xx-errors)\n    - [Persist and rehydrate thunks in the offline queue](#how-to-persist-and-rehydrate-thunks-in-the-offline-queue-with-redux-persist)\n    - [Using redux-saga 1.0.0-beta.x](#using-redux-saga-100-betax)\n  - [Credits](#credits)\n  - [License](#license)\n  - [Contributors](#contributors)\n\n## Motivation\n\nWhen you are building your React Native app, you have to expect that some users may use your application in offline mode, for instance when travelling on a Plane (airplane mode) or the underground (no signal). How does your app behave in that situation? Does it show an infinite loader? Can the user still use it seamlessly?\n\nHaving an offline first class citizen app is very important for a successful user experience. React Native ships with the `NetInfo` module in order to detect internet connectivity. The API is pretty basic and it may be sufficient for small apps but its usage gets cumbersome as your app grows. Besides that, it only detects network connectivity and does not guarantee internet access so it can provide false positives.\n\nThis library aims to gather a variety of modules that follow React and Redux best practises, in order to make your life easier when it comes to deal with internet connectivity in your React Native application.\n\n## Features\n\n- Offline/online conditional rendering through **Provider/Consumer** components that leverage the **new React Context API**\n- Reducer to keep your connectivity state in the Redux store\n- **Redux middleware to intercept internet request actions in offline mode and apply DRY principle**\n- Compatibility with async middleware libraries like redux-thunk, redux-saga and redux-observable\n- A **saga** to place the network event subscriptions **outside of your components**\n- A step further than `NetInfo` **detecting internet access besides network connectivity**\n- **Offline queue support to automatically re-dispatch actions when connection is back online** or dismiss actions based on other actions dispatched (i.e navigation related)\n- Ability to check connectivity regularly\n- **100% unit test coverage**\n\n## Contributions\n\nPRs are more than welcome. If you're planning to contribute please make sure to read the contributing guide: [CONTRIBUTING.md](https://github.com/rgommezz/react-native-offline/blob/master/CONTRIBUTING.md)\n\n## Sponsors\n\nIf you use this library on your commercial/personal projects, you can help us by funding the work on specific issues that you choose by using IssueHunt.io!\n\nThis gives you the power to prioritize our work and support the project contributors. Moreover it'll guarantee the project will be updated and maintained in the long run.\n\n\u003e Sponsors will be listed in the contributors section at the bottom. If you want to be removed please contact me at: rauliyohmc@gmail.com\n\n[![issuehunt-image](https://camo.githubusercontent.com/f5f88939f6c627454b7c5d0eaef9f7cc40cc9586/68747470733a2f2f697373756568756e742e696f2f7374617469632f656d6265642f697373756568756e742d627574746f6e2d76312e737667)](https://issuehunt.io/repos/86369462)\n\n## Installation\n\n### RN \u003e= 0.60\n\nThis library uses [@react-native-community/netinfo](https://github.com/react-native-community/react-native-netinfo) behind the scenes, which contains native code, so you need to install it and link it as well. Follow the next steps in order:\n\n```bash\n$ yarn add react-native-offline\n$ yarn add @react-native-community/netinfo\n# extra step for iOS\n$ (cd ios \u0026\u0026 pod install)\n\n# Or if you use npm\n$ npm i react-native-offline\n$ npm i @react-native-community/netinfo\n# extra step for iOS\n$ (cd ios \u0026\u0026 pod install)\n```\n\nOn RN 0.60, for Android, you may need to use [jetifier](https://github.com/mikehardy/jetifier) to convert the native dependency to AndroidX.\n\n#### Android\n\nTo request network info in Android an extra step is required, so you should add the following line to your app's `AndroidManifest.xml` as well:\n\n`\u003cuses-permission android:name=\"android.permission.ACCESS_NETWORK_STATE\" /\u003e`\n\n### Version Compatibility table\n| react-native-offline                      | Netinfo | Expo SDK    | Web support |\n| -------------------------    | --------  | -------     | ----- |\n| 5.8.0                 | 5.x.x       |      \u003c 41     | No |\n| 6.0.0 | 6.x.x  | 41+ | Yes |\n\nIf you are using the [managed workflow](https://docs.expo.io/versions/latest/introduction/managed-vs-bare/#managed-workflow), you don't need to install any extra dependency. Expo SDK already ships in with `NetInfo`.\n\n```bash\n$ yarn add react-native-offline\n\n# Or if you use npm\n$ npm i react-native-offline\n```\n\n## API\n\n### Component Utilities\n\nIn order to render stuff conditionally with ease. They internally listen to connection changes and also provide an extra layer of reliability by ensuring there is internet access when reporting online. For that, an extra request is made to a remote server.\n\n#### `NetworkProvider`\n\nProvider component that injects the network state to children components via [React Context](https://reactjs.org/docs/context.html). Only children prop is required, the rest are optional. It should be used on top of your components hierarchy, ideally in (or close to) the entry point.\n\n```js\n\ntype Props = {\n    children: React.Node,\n    pingTimeout?: number = 10000,\n    pingServerUrl?: string = 'https://www.google.com/',\n    shouldPing?: boolean = true,\n    pingInterval?: number = 0,\n    pingOnlyIfOffline?: boolean = false,\n    pingInBackground?: boolean = false,\n    httpMethod?: HTTPMethod = 'HEAD',\n    customHeaders?: HTTPHeaders = {},\n}\n```\n\n##### Config\n\n`children`: a React Element. This is the only required prop.\n\n`pingTimeout`: amount of time (in ms) that the component should wait for the ping response. Defaults to `10000` ms. If you want to use a different value, it's recommended to use a higher one.\n\n`pingServerUrl`: remote server to ping to. Defaults to `https://www.google.com/` since it's probably one the most stable servers out there, but you can provide your own if needed. Warning: www.google.com is a blocked domain in China, so if you need your app to be accessible from there, you MUST use another domain.\n\n`shouldPing`: flag that denotes whether the extra ping check will be performed or not. Defaults to `true`.\n\n`pingInterval`: the interval (in ms) you want to ping the server at. Defaults to `0`, and that means it is not going to check connectivity regularly. If opted in, it's advised not to choose a very small value, because that may drain your battery. Choose wisely. Something around 30000 ms should be fine.\n\n`pingOnlyIfOffline`: when set to `true` and `pingInterval` \u003e 0, it will ping the remote server regularly only if offline. Defaults to `false`.\n\n`pingInBackground`: whether or not to check connectivity when app isn't in the foreground. Defaults to `false`.\n\n`httpMethod`: http method used to ping the server. Supports HEAD or OPTIONS. Defaults to `HEAD`.\n\n`customHeaders`: optional custom headers to add for ping request.\n\n##### Usage\n\n```js\n// index.js\nimport React from 'react';\nimport { NetworkProvider } from 'react-native-offline';\nimport App from './App';\n\nconst Root = () =\u003e (\n  \u003cNetworkProvider\u003e\n    \u003cApp /\u003e\n  \u003c/NetworkProvider\u003e\n);\n\nexport default Root;\n```\n\n#### `NetworkConsumer`\n\nReact component that subscribes to connectivity changes. It requires a function as a child. The function receives the current connectivity status and returns a React node. **This component should be rendered within a NetworkProvider in order to work properly**.\n\n##### Props\n\n```js\ntype NetworkState = {\n  isConnected: boolean,\n}\n\ntype Props = {\n  children: ({ isConnected }: NetworkState) =\u003e React.Node\n}\n```\n\n##### Usage\n\n```js\nimport React from 'react';\nimport { Image, Button, Text } from 'react-native';\nimport { NetworkConsumer } from 'react-native-offline';\n\nconst ImageViewer = () =\u003e (\n  \u003cView\u003e\n    \u003cImage src=\"foo.com\" /\u003e\n    \u003cNetworkConsumer\u003e\n      {({ isConnected }) =\u003e\n        isConnected ? (\n          \u003cButton title=\"Download image\" onPress={downloadImage} /\u003e\n        ) : (\n          \u003cText\u003eDownloading images is disabled since you are offline\u003c/Text\u003e\n        )\n      }\n    \u003c/NetworkConsumer\u003e\n  \u003c/View\u003e\n);\n```\n\n### Hooks\n\n#### `useIsConnected`\n\nReturns a boolean indicating whether you are connected to the network or not.\n\n##### Usage\n\n```js\nimport React from 'react';\nimport { Image, Button, Text } from 'react-native';\nimport { useIsConnected } from 'react-native-offline';\n\nconst ImageViewer = () =\u003e {\n  const isConnected = useIsConnected();\n  return (\n    \u003cView\u003e\n      \u003cImage src=\"foo.com\" /\u003e\n      {isConnected ? (\n        \u003cButton title=\"Download image\" onPress={downloadImage} /\u003e\n      ) : (\n        \u003cText\u003eDownloading images is disabled since you are offline\u003c/Text\u003e\n      )}\n    \u003c/View\u003e\n  );\n};\n```\n\n## Integration with Redux\n\nThere are 3 features that this library provides in order to leverage offline capabilities in your Redux store: a reducer, a middleware and an offline queue system. You can use all of them or just the ones that suits your needs.\n\n### Network reducer\n\nA network reducer to be provided to the store.\n\n#### State\n\n```js\ntype NetworkState = {\n  isConnected: boolean,\n  actionQueue: Array\u003c*\u003e,\n};\n```\n\n#### Usage\n\n##### 1.- Give the network reducer to Redux\n\n```js\n// configureStore.js\nimport { createStore, combineReducers } from 'redux';\nimport { reducer as network } from 'react-native-offline';\n\nconst rootReducer = combineReducers({\n  // ... your other reducers here ...\n  network,\n});\n\nconst store = createStore(rootReducer);\nexport default store;\n```\n\n##### 2.- Here you have 2 options:\n\n##### `ReduxNetworkProvider`\n\nUses a provider component mechanism. The same [props](#config) as for `NetworkProvider` apply. Make sure your component is a descendant of the react-redux `\u003cProvider\u003e` component, so that `ReduxNetworkProvider` has access to the store.\n\n```js\n// Root.js\nimport store from './reduxStore';\nimport React from 'react';\nimport { Provider } from 'react-redux';\nimport { ReduxNetworkProvider } from 'react-native-offline';\n\nlet App = () =\u003e (\n  \u003cNavigator\u003e\n    \u003cMainScreen /\u003e\n    \u003cOtherScreen /\u003e\n  \u003c/Navigator\u003e\n);\n\nconst Root = () =\u003e (\n  \u003cProvider store={store}\u003e\n    \u003cReduxNetworkProvider\u003e\n      \u003cApp /\u003e\n    \u003c/ReduxNetworkProvider\u003e\n  \u003c/Provider\u003e\n);\n```\n\n##### `networkSaga`\n\nJust fork this saga from your root saga. It accepts the same [config](#config) options as `NetworkProvider` and `ReduxNetworkProvider`. Recommended if you are using redux-saga, since it's a very elegant way to deal with global connectivity changes, without having to wrap your components with extra functionality.\n\n```js\n// rootSaga.js\nimport { all } from 'redux-saga/effects';\nimport saga1 from './saga1';\nimport saga2 from './saga2';\nimport { networkSaga } from 'react-native-offline';\n\nexport default function* rootSaga(): Generator\u003c*, *, *\u003e {\n  yield all([\n    fork(saga1),\n    fork(saga2),\n    fork(networkSaga, { pingInterval: 20000 }),\n  ]);\n}\n```\n\n##### 3.- Access your network state in your components using `mapStateToProps()`, as `state.network.isConnected`.\n\n**Note**: If you wanna listen to the action dispatched internally in your reducers, import the offline action types and reference `CONNECTION_CHANGE`:\n\n```js\nimport { offlineActionTypes } from 'react-native-offline';\n...\nif(action.type === offlineActionTypes.CONNECTION_CHANGE) // do something in your reducer\n...\n```\n\n#### `createNetworkMiddleware()`\n\nFunction that returns a Redux middleware which listens to specific actions targeting API calls in online/offline mode.\n\n```js\ncreateNetworkMiddleware(config: MiddlewareConfig): ReduxMiddleware\n\ntype MiddlewareConfig = {\n  regexActionType?: RegExp = /FETCH.*REQUEST/,\n  actionTypes?: Array\u003cstring\u003e = [],\n  queueReleaseThrottle?: number = 50,\n  shouldDequeueSelector: (state: RootReduxState) =\u003e boolean = () =\u003e true\n}\n```\n\n##### PO Config\n\nThis is the setup you need to put in place for libraries such as `redux-saga` or `redux-observable`, which rely on plain actions being dispatched to trigger async flow:\n\n`regexActionType`: regular expression to indicate the action types to be intercepted in offline mode.\nBy default it's configured to intercept actions for fetching data following the Redux [convention](https://redux.js.org/advanced/async-actions). That means that it will intercept actions with types such as `FETCH_USER_ID_REQUEST`, `FETCH_PRODUCTS_REQUEST` etc.\n\n`actionTypes`: array with additional action types to intercept that don't fulfil the RegExp criteria. For instance, it's useful for actions that carry along refreshing data, such as `REFRESH_LIST`.\n\n`queueReleaseThrottle`: waiting time in ms between dispatches when flushing the offline queue. Useful to reduce the server pressure when coming back online. Defaults to 50ms.\n\n`shouldDequeueSelector`: function that receives the redux application state and returns a boolean. It'll be executed every time an action is dispatched, before it reaches the reducer. This is useful to control if the queue should be released when the connection is regained and there were actions queued up. Returning `true` (the default behaviour) releases the queue, whereas returning `false` prevents queue release. For example, you may wanna perform some authentication checks, prior to releasing the queue. Note, if the result of `shouldDequeueSelector` changes _while_ the queue is being released, the queue will not halt. If you want to halt the queue _while_ is being released, please see relevant FAQ section.\n\n##### Thunks Config\n\nFor `redux-thunk` library, the async flow is wrapped inside functions that will be lazily evaluated when dispatched, so our store is able to dispatch functions as well. Therefore, the configuration differs:\n\n- Make sure to use a named function instead of an anonymous arrow function for the thunk returned by your action creator.\n- Use `interceptInOffline` property in your thunk and set it to `true`.\n\nExample:\n\n```javascript\nexport const fetchUser = url =\u003e {\n  function thunk(dispatch) {\n    fetch(url)\n      .then(response =\u003e response.json())\n      .then(responseJson =\u003e {\n        dispatch({ type: FETCH_USER_SUCCESS, payload: responseJson });\n      })\n      .catch(error =\u003e {\n        console.error(error);\n      });\n  }\n\n  thunk.interceptInOffline = true; // This is the important part\n  return thunk; // Return it afterwards\n};\n```\n\n##### Usage\n\nYou should apply the middleware to the store using `applyMiddleware`. **The network middleware should be the first on the chain**, before any other middleware used for handling async actions, such as [redux-thunk](https://github.com/gaearon/redux-thunk), [redux-saga](https://github.com/redux-saga/redux-saga) or [redux-observable](https://github.com/redux-observable/redux-observable).\n\n```js\nimport { createStore, applyMiddleware } from 'redux';\nimport { createNetworkMiddleware } from 'react-native-offline';\nimport createSagaMiddleware from 'redux-saga';\n\nconst sagaMiddleware = createSagaMiddleware();\nconst networkMiddleware = createNetworkMiddleware({\n  queueReleaseThrottle: 200,\n});\n\nconst store = createStore(\n  rootReducer,\n  applyMiddleware(networkMiddleware, sagaMiddleware),\n);\n```\n\nWhen you attempt to fetch data on the internet by means of dispatching a plain action or a thunk in offline mode, the middleware blocks the action and dispatches an action of type `@@network-connectivity/FETCH_OFFLINE_MODE` instead, containing useful information about \"what you attempted to do\". The action dispatched signature for plain objects is as follows:\n\n```js\ntype FetchOfflineModeActionForPO = {\n  type: '@@network-connectivity/FETCH_OFFLINE_MODE',\n  payload: {\n    prevAction: {\n      type: string, // Your previous action type\n      payload?: any, // Your previous payload\n    },\n  },\n};\n```\n\nAnd for thunks it attaches it under `prevThunk` property:\n\n```js\ntype FetchOfflineModeActionForThunks = {\n  type: '@@network-connectivity/FETCH_OFFLINE_MODE',\n  payload: {\n    prevThunk: Function,\n  },\n};\n```\n\nThat allows you to react conveniently and update your state in the way you desire, based on your previous intent. Just reference `FETCH_OFFLINE_MODE` action type in your reducer:\n\n```js\nimport { offlineActionTypes } from 'react-native-offline';\n...\nif(action.type === offlineActionTypes.FETCH_OFFLINE_MODE) // do something in your reducer\n...\n```\n\nSnackBars, Dialog, Popups, or simple informative text are good means of conveying to the user that the operation failed due to lack of internet connection.\n\n### Offline Queue\n\nA queue system to store actions that failed due to lack of connectivity. It works for both plain object actions and thunks. It allows you to:\n\n- Re-dispatch the action/thunk as soon as the internet connection is back online again\n- Dismiss the action from the queue based on a different action dispatched (i.e. navigating to a different screen, the fetch action is no longer relevant)\n\n#### Managing duplicate actions\n\nIf a similar action already exists on the queue, we remove it and push it again to the end, so it has an overriding effect.\nThe default criteria to detect duplicates is by using `lodash.isEqual` for plain actions and `thunk.toString()` for thunks/functions. However, you can customise the comparison function to acommodate it to your needs. For that, you need to use the factory version for your network reducer. **Please remember to name `network` the key of your reducer**.\n\n```js\n// configureStore.js\nimport { createStore, combineReducers } from 'redux';\nimport { createReducer as createNetworkReducer } from 'react-native-offline';\nimport { comparisonFn } from './utils';\n\nconst rootReducer = combineReducers({\n  // ... your other reducers here ...\n  // Use network key, that's important!\n  network: createNetworkReducer(comparisonFn),\n});\n\nconst store = createStore(rootReducer);\nexport default store;\n```\n\nThe comparison function receives the action dispatched when offline and the current `actionQueue`. The result of the function will be either `undefined`, meaning no match found, or the action that matches the passed in action. So basically, you need to return the upcoming action if you wish to replace an existing one. An example of how to use it can be found [here](https://github.com/rgommezz/react-native-offline/blob/master/test/reducer.test.ts#L124).\n\n```js\nfunction comparisonFn(\n  action: ReduxAction | ReduxThunk,\n  actionQueue: Array\u003cReduxAction | ReduxThunk\u003e,\n): ?(ReduxAction | ReduxThunk)\n```\n\n#### Plain Objects\n\nIn order to configure your PO actions to interact with the offline queue you need to use the `meta` property in your actions, following [flux standard actions convention](https://github.com/acdlite/flux-standard-action#meta). They need to adhere to the below API:\n\n```js\ntype ActionToBeQueued = {\n  type: string,\n  payload?: any,\n  meta: {\n    retry?: boolean, // By passing true, your action will be enqueued on offline mode\n    dismiss?: Array\u003cstring\u003e, // Array of actions which, once dispatched, will trigger a dismissal from the queue\n  },\n};\n```\n\n##### Examples\n\n- Action that will be added to the queue on offline mode and that will be re-dispatched as soon as the connection is back online again\n\n```js\nconst action = {\n  type: 'FETCH_USER_ID',\n  payload: {\n    id: 2,\n  },\n  meta: {\n    retry: true,\n  },\n};\n```\n\n- Action that will be added to the queue on offline mode and that will be re-dispatched as soon as the connection is back online again, as long as a `NAVIGATE_BACK` action type hasn't been dispatched in between, in which case the action would be removed from the queue.\n\n```js\nconst action = {\n  type: 'FETCH_USER_ID',\n  payload: {\n    id: 2,\n  },\n  meta: {\n    retry: true,\n    dismiss: ['NAVIGATE_BACK'],\n  },\n};\n```\n\n#### Thunks\n\n- For thunks, append `interceptInOffline` and `meta` properties to the function returned by the action creator, where `meta` has the same shape as for Flux actions:\n\n```js\nfunction fetchData(dispatch, getState) {\n  dispatch({ type: FETCH_USER_ID_REQUEST, payload: { id: '3' } });\n  ...\n}\n\nfetchData.interceptInOffline = true; // In order to be intercepted by the middleware\nfetchData.meta = {\n  retry?: boolean, // By passing true, your thunk will be enqueued on offline mode\n  dismiss?: Array\u003cstring\u003e // Array of actions which, once dispatched, will trigger a dismissal from the queue\n}\n```\n\n### Other utilities\n\n#### `checkInternetConnection()`\n\nUtility function that allows you to query for internet connectivity on demand. If you have integrated this library with redux, you can then dispatch a `CONNECTION_CHANGE` action type to inform the `network` reducer accordingly and keep it up to date. Check the example below.\n\n**Note**: It's recommended to always set `shouldPing` to `true` (the default behaviour), in order to prevent inconsistent behaviour on iOS for RN \u003c 0.57.\n\n```js\ncheckInternetConnection(\n  url?: string = 'https://www.google.com/',\n  pingTimeout?: number = 10000,\n  shouldPing?: boolean = true,\n  method?: HTTPMethod = 'HEAD'\n): Promise\u003cboolean\u003e\n```\n\n##### Example\n\n```js\nimport {\n  checkInternetConnection,\n  offlineActionCreators,\n} from 'react-native-offline';\n\nasync function internetChecker(dispatch) {\n  const isConnected = await checkInternetConnection();\n  const { connectionChange } = offlineActionCreators;\n  // Dispatching can be done inside a connected component, a thunk (where dispatch is injected), saga, or any sort of middleware\n  // In this example we are using a thunk\n  dispatch(connectionChange(isConnected));\n}\n```\n\n## Miscellanea\n\n### FAQ\n\n#### How to test offline behavior while actually being online\n\nYou can use `pingServerUrl` and set it to a non existing url or point to some server that is down. Don't forget to also set `shouldPing` to `true` (which is the default behaviour).\n\nDon't rely too much on iOS simulators and switching on/off the internet connection on your computer, they are quite buggy and report inconsistent connectivity information. On the other hand, testing on real devices should be fine.\n\n#### How to orchestrate Redux to dispatch `CONNECTION_CHANGE` as the first action when the app starts up\n\nThe solution assumes you are using Redux Persist v5.x and involves using some local state in your top most component and tweaking the `configureStore` function a bit, so that it can notify your root React component to render the whole application when the required initialisation has taken place. In this case, by initialisation, we are talking about rehydrating the store from disk and detecting initial internet connection.\n\nAs you can see in the snippets below, we create the `store` instance as usual and return it in our `configureStore` function. The only difference is that the function is still _alive_ and will invoke the callback as soon as 2 actions are dispatched into the store (in order):\n\n- `REHYDRATE` from `redux-persist`\n- `CONNECTION_CHANGE` from `react-native-offline`\n\n```js\n// configureStore.js\nimport { createStore, applyMiddleware } from 'redux';\nimport { persistStore } from 'redux-persist';\nimport AsyncStorage from '@react-native-community/async-storage';\nimport {\n  createNetworkMiddleware,\n  offlineActionCreators,\n  checkInternetConnection,\n} from 'react-native-offline';\nimport rootReducer from '../reducers';\n\nconst networkMiddleware = createNetworkMiddleware();\n\nexport default function configureStore(callback) {\n  const store = createStore(rootReducer, applyMiddleware(networkMiddleware));\n  const { connectionChange } = offlineActionCreators;\n  // https://github.com/rt2zz/redux-persist#persiststorestore-config-callback\n  persistStore(store, null, () =\u003e {\n    // After rehydration completes, we detect initial connection\n    checkInternetConnection().then(isConnected =\u003e {\n      store.dispatch(connectionChange(isConnected));\n      callback(); // Notify our root component we are good to go, so that we can render our app\n    });\n  });\n\n  return store;\n}\n```\n\nThen, our root React component will have some local state, that initially will impose the component to return `null`, waiting until the async operations complete. Then, we trigger a `setState` to render the application.\n\n```js\n// App.js\nimport React, { Component } from 'react';\nimport { Provider } from 'react-redux';\nimport configureStore from './store';\nimport Root from './Root';\n\nclass App extends Component {\n  constructor(props) {\n    super(props);\n    this.state = {\n      isLoading: true,\n      store: configureStore(() =\u003e this.setState({ isLoading: false })),\n    };\n  }\n\n  render() {\n    if (this.state.isLoading) return null;\n\n    return (\n      \u003cProvider store={this.state.store}\u003e\n        \u003cRoot /\u003e\n      \u003c/Provider\u003e\n    );\n  }\n}\n\nexport default App;\n```\n\nThis way, we make sure the right actions are dispatched before anything else can be.\n\n#### How do I stop the queue _while_ it is being released?\n\nYou can do that by dispatching a `CHANGE_QUEUE_SEMAPHORE` action using `changeQueueSemaphore` action creator. This action is used to manually stop and resume the queue even if it's being released.\n\nIt works in the following way: if a `changeQueueSemaphore('RED')` action is dispatched, queue release is now halted. It will only resume if another if `changeQueueSemaphore('GREEN')` is dispatched.\n\n```js\nimport { offlineActionCreators } from 'react-native-offline';\n...\nasync function weHaltQueueReleaseHere(){\n  const { changeQueueSemaphore } = offlineActionCreators;\n  dispatch(changeQueueSemaphore('RED')) // The queue is now halted and it won't continue dispatching actions\n  await somePromise();\n  dispatch(changeQueueSemaphore('GREEN')) // The queue is now resumed and it will continue dispatching actions\n}\n```\n\n#### How to intercept and queue actions when the server responds with client (4xx) or server (5xx) errors\n\nYou can do that by dispatching a `FETCH_OFFLINE_MODE` action using `fetchOfflineMode` action creator.\n\n```js\nimport { offlineActionCreators } from 'react-native-offline';\n...\nfetch('someurl/data').catch(error =\u003e {\n  dispatch(offlineActionCreators.fetchOfflineMode(action)) // \u003c-- action is the one that triggered your api call\n);\n```\n\n##### A sample using redux-thunk\n\n```js\nconst fetchApi = params =\u003e {\n  function thunk(dispatch, getState) {\n    YourService.save(params)\n      .then(response =\u003e {\n        console.log('[success]:', response);\n      })\n      .catch(error =\u003e {\n        console.error('[error]:', error);\n        dispatch(offlineActionCreators.fetchOfflineMode(thunk));\n      });\n  }\n\n  thunk.interceptInOffline = true;\n\n  thunk.meta = {\n    retry: true,\n    name: 'fetchApi',\n    args: [params],\n  };\n  return thunk;\n};\n```\n\n#### How to persist and rehydrate thunks in the offline queue with Redux Persist\n\nDue to the way Redux Persist serializes the store, persisting and rehydrating thunks will return an invalid action. Fortunately, there is a workaround.\n\nIn your action creator, make sure to format it as specified from the [thunks config](https://github.com/rgommezz/react-native-offline#thunks-config) with a couple of additions.\n\n```javascript\n// actions.js\n\nexport const fetchUser = url =\u003e {\n  function thunk(dispatch) {\n    fetch(url)\n      .then(response =\u003e response.json())\n      .then(responseJson =\u003e {\n        dispatch({ type: FETCH_USER_SUCCESS, payload: responseJson });\n      })\n      .catch(error =\u003e {\n        console.error(error);\n      });\n  }\n\n  thunk.interceptInOffline = true;\n\n  // Add these\n  thunk.meta = {\n    retry: true,\n    name: 'fetchUser', // This should be the name of your function\n    args: [url], // These are the arguments for the function. Add more as needed.\n  };\n  return thunk;\n};\n```\n\nAdd the following into your redux store. Refer to the [transforms](https://github.com/rt2zz/redux-persist#transforms) section for more information on how Redux Persist transforms data.\n\n```javascript\n// store.js\n\nimport { fetchUser } from './actions.js';\nimport { fetchOtherUsers } from './otherActions.js';\n\n// We have to map our actions to an object\nconst actions = {\n  fetchUser,\n  fetchOtherUsers,\n};\n\n// Transform how the persistor reads the network state\nconst networkTransform = createTransform(\n  (inboundState, key) =\u003e {\n    const actionQueue = [];\n\n    inboundState.actionQueue.forEach(action =\u003e {\n      if (typeof action === 'function') {\n        actionQueue.push({\n          function: action.meta.name,\n          args: action.meta.args,\n        });\n      } else if (typeof action === 'object') {\n        actionQueue.push(action);\n      }\n    });\n\n    return {\n      ...inboundState,\n      actionQueue,\n    };\n  },\n  (outboundState, key) =\u003e {\n    const actionQueue = [];\n\n    outboundState.actionQueue.forEach(action =\u003e {\n      if (action.function) {\n        const actionFunction = actions[action.function];\n        actionQueue.push(actionFunction(...action.args));\n      } else {\n        actionQueue.push(action);\n      }\n    });\n\n    return { ...outboundState, actionQueue };\n  },\n  // The 'network' key may change depending on what you\n  // named your network reducer.\n  { whitelist: ['network'] },\n);\n\nconst persistConfig = {\n  key: 'root',\n  storage,\n  transforms: [networkTransform], // Add the transform into the persist config\n};\n```\n\n#### Using redux-saga 1.0.0-beta.x\n\nIf you are using a `1.0.0-beta.x` version for redux-saga in your application, you may have some conflicts when yarn install dependencies, since this library relies on the latest stable version `0.16.2` and that could take precedence on your `node_modules`. In order to fix it, you can use [yarn resolutions](https://yarnpkg.com/lang/en/docs/selective-version-resolutions) by adding the next lines of code to your `package.json`, where `x` is the beta version number:\n\n```json\n  \"resolutions\": {\n    \"react-native-offline/redux-saga\": \"^1.0.0-beta.x\"\n  },\n```\n\n### Credits\n\nThanks to Spencer Carli for his awesome article about [Handling Offline actions in React Native](https://medium.com/differential/handling-offline-actions-in-react-native-74949cbfabf2), which served me as inspiration for the offline queue implementation.\n\n### License\n\nMIT © [Raul Gomez Acuna](https://raulgomez.io/)\n\nIf you found this project interesting, please consider following me on [twitter](https://twitter.com/rgommezz)\n\n## Contributors\n\nThanks goes to these wonderful people ([emoji key](https://github.com/kentcdodds/all-contributors#emoji-key)):\n\n\u003c!-- ALL-CONTRIBUTORS-LIST:START - Do not remove or modify this section --\u003e\n\u003c!-- prettier-ignore-start --\u003e\n\u003c!-- markdownlint-disable --\u003e\n\u003ctable\u003e\n  \u003ctr\u003e\n    \u003ctd align=\"center\"\u003e\u003ca href=\"https://twitter.com/rgommezz\"\u003e\u003cimg src=\"https://avatars0.githubusercontent.com/u/4982414?v=4?s=100\" width=\"100px;\" alt=\"\"/\u003e\u003cbr /\u003e\u003csub\u003e\u003cb\u003eRaúl Gómez Acuña\u003c/b\u003e\u003c/sub\u003e\u003c/a\u003e\u003cbr /\u003e\u003ca href=\"https://github.com/rgommezz/react-native-offline/commits?author=rgommezz\" title=\"Code\"\u003e💻\u003c/a\u003e \u003ca href=\"https://github.com/rgommezz/react-native-offline/commits?author=rgommezz\" title=\"Documentation\"\u003e📖\u003c/a\u003e \u003ca href=\"#example-rgommezz\" title=\"Examples\"\u003e💡\u003c/a\u003e \u003ca href=\"#ideas-rgommezz\" title=\"Ideas, Planning, \u0026 Feedback\"\u003e🤔\u003c/a\u003e \u003ca href=\"https://github.com/rgommezz/react-native-offline/pulls?q=is%3Apr+reviewed-by%3Argommezz\" title=\"Reviewed Pull Requests\"\u003e👀\u003c/a\u003e \u003ca href=\"#question-rgommezz\" title=\"Answering Questions\"\u003e💬\u003c/a\u003e\u003c/td\u003e\n    \u003ctd align=\"center\"\u003e\u003ca href=\"https://github.com/piotrwitek\"\u003e\u003cimg src=\"https://avatars0.githubusercontent.com/u/739075?v=4?s=100\" width=\"100px;\" alt=\"\"/\u003e\u003cbr /\u003e\u003csub\u003e\u003cb\u003ePiotrek Witek\u003c/b\u003e\u003c/sub\u003e\u003c/a\u003e\u003cbr /\u003e\u003ca href=\"https://github.com/rgommezz/react-native-offline/commits?author=piotrwitek\" title=\"Documentation\"\u003e📖\u003c/a\u003e\u003c/td\u003e\n    \u003ctd align=\"center\"\u003e\u003ca href=\"http://www.thiery.io\"\u003e\u003cimg src=\"https://avatars3.githubusercontent.com/u/2392118?v=4?s=100\" width=\"100px;\" alt=\"\"/\u003e\u003cbr /\u003e\u003csub\u003e\u003cb\u003eAdrien Thiery\u003c/b\u003e\u003c/sub\u003e\u003c/a\u003e\u003cbr /\u003e\u003ca href=\"https://github.com/rgommezz/react-native-offline/commits?author=adrienthiery\" title=\"Code\"\u003e💻\u003c/a\u003e \u003ca href=\"https://github.com/rgommezz/react-native-offline/commits?author=adrienthiery\" title=\"Documentation\"\u003e📖\u003c/a\u003e\u003c/td\u003e\n    \u003ctd align=\"center\"\u003e\u003ca href=\"https://github.com/hasibsahibzada\"\u003e\u003cimg src=\"https://avatars0.githubusercontent.com/u/6321988?v=4?s=100\" width=\"100px;\" alt=\"\"/\u003e\u003cbr /\u003e\u003csub\u003e\u003cb\u003eHasibullah Sahibzada\u003c/b\u003e\u003c/sub\u003e\u003c/a\u003e\u003cbr /\u003e\u003ca href=\"https://github.com/rgommezz/react-native-offline/commits?author=hasibsahibzada\" title=\"Code\"\u003e💻\u003c/a\u003e\u003c/td\u003e\n    \u003ctd align=\"center\"\u003e\u003ca href=\"https://www.linkedin.com/in/marco-wettstein-b1b8938b?trk=hp-identity-name\"\u003e\u003cimg src=\"https://avatars3.githubusercontent.com/u/1972353?v=4?s=100\" width=\"100px;\" alt=\"\"/\u003e\u003cbr /\u003e\u003csub\u003e\u003cb\u003eMarco Wettstein\u003c/b\u003e\u003c/sub\u003e\u003c/a\u003e\u003cbr /\u003e\u003ca href=\"https://github.com/rgommezz/react-native-offline/commits?author=macrozone\" title=\"Code\"\u003e💻\u003c/a\u003e\u003c/td\u003e\n    \u003ctd align=\"center\"\u003e\u003ca href=\"http://kentcederstrom.se\"\u003e\u003cimg src=\"https://avatars1.githubusercontent.com/u/1098636?v=4?s=100\" width=\"100px;\" alt=\"\"/\u003e\u003cbr /\u003e\u003csub\u003e\u003cb\u003eKent Cederström\u003c/b\u003e\u003c/sub\u003e\u003c/a\u003e\u003cbr /\u003e\u003ca href=\"https://github.com/rgommezz/react-native-offline/commits?author=kentos\" title=\"Code\"\u003e💻\u003c/a\u003e\u003c/td\u003e\n    \u003ctd align=\"center\"\u003e\u003ca href=\"https://richardvclam.github.io\"\u003e\u003cimg src=\"https://avatars0.githubusercontent.com/u/16093452?v=4?s=100\" width=\"100px;\" alt=\"\"/\u003e\u003cbr /\u003e\u003csub\u003e\u003cb\u003eRichard V. Lam\u003c/b\u003e\u003c/sub\u003e\u003c/a\u003e\u003cbr /\u003e\u003ca href=\"https://github.com/rgommezz/react-native-offline/commits?author=richardvclam\" title=\"Documentation\"\u003e📖\u003c/a\u003e\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd align=\"center\"\u003e\u003ca href=\"http://www.codecentric.de\"\u003e\u003cimg src=\"https://avatars1.githubusercontent.com/u/1300393?v=4?s=100\" width=\"100px;\" alt=\"\"/\u003e\u003cbr /\u003e\u003csub\u003e\u003cb\u003eThomas Bosch\u003c/b\u003e\u003c/sub\u003e\u003c/a\u003e\u003cbr /\u003e\u003ca href=\"https://github.com/rgommezz/react-native-offline/commits?author=dickerpulli\" title=\"Code\"\u003e💻\u003c/a\u003e \u003ca href=\"https://github.com/rgommezz/react-native-offline/commits?author=dickerpulli\" title=\"Documentation\"\u003e📖\u003c/a\u003e\u003c/td\u003e\n    \u003ctd align=\"center\"\u003e\u003ca href=\"http://blog.cinan.sk\"\u003e\u003cimg src=\"https://avatars2.githubusercontent.com/u/1828134?v=4?s=100\" width=\"100px;\" alt=\"\"/\u003e\u003cbr /\u003e\u003csub\u003e\u003cb\u003ecinan\u003c/b\u003e\u003c/sub\u003e\u003c/a\u003e\u003cbr /\u003e\u003ca href=\"https://github.com/rgommezz/react-native-offline/commits?author=cinan\" title=\"Code\"\u003e💻\u003c/a\u003e\u003c/td\u003e\n    \u003ctd align=\"center\"\u003e\u003ca href=\"https://github.com/YKSing\"\u003e\u003cimg src=\"https://avatars2.githubusercontent.com/u/3830084?v=4?s=100\" width=\"100px;\" alt=\"\"/\u003e\u003cbr /\u003e\u003csub\u003e\u003cb\u003eColon D\u003c/b\u003e\u003c/sub\u003e\u003c/a\u003e\u003cbr /\u003e\u003ca href=\"https://github.com/rgommezz/react-native-offline/commits?author=YKSing\" title=\"Code\"\u003e💻\u003c/a\u003e\u003c/td\u003e\n    \u003ctd align=\"center\"\u003e\u003ca href=\"http://www.stephenkempin.co.uk\"\u003e\u003cimg src=\"https://avatars1.githubusercontent.com/u/10877466?v=4?s=100\" width=\"100px;\" alt=\"\"/\u003e\u003cbr /\u003e\u003csub\u003e\u003cb\u003eStephen Kempin\u003c/b\u003e\u003c/sub\u003e\u003c/a\u003e\u003cbr /\u003e\u003ca href=\"https://github.com/rgommezz/react-native-offline/commits?author=SKempin\" title=\"Documentation\"\u003e📖\u003c/a\u003e\u003c/td\u003e\n    \u003ctd align=\"center\"\u003e\u003ca href=\"https://www.linkedin.com/in/tscharke/\"\u003e\u003cimg src=\"https://avatars0.githubusercontent.com/u/5890860?v=4?s=100\" width=\"100px;\" alt=\"\"/\u003e\u003cbr /\u003e\u003csub\u003e\u003cb\u003eThomas Scharke\u003c/b\u003e\u003c/sub\u003e\u003c/a\u003e\u003cbr /\u003e\u003ca href=\"https://github.com/rgommezz/react-native-offline/commits?author=tscharke\" title=\"Code\"\u003e💻\u003c/a\u003e \u003ca href=\"https://github.com/rgommezz/react-native-offline/commits?author=tscharke\" title=\"Documentation\"\u003e📖\u003c/a\u003e\u003c/td\u003e\n    \u003ctd align=\"center\"\u003e\u003ca href=\"https://github.com/felipemartim\"\u003e\u003cimg src=\"https://avatars3.githubusercontent.com/u/570829?v=4?s=100\" width=\"100px;\" alt=\"\"/\u003e\u003cbr /\u003e\u003csub\u003e\u003cb\u003efelipemartim\u003c/b\u003e\u003c/sub\u003e\u003c/a\u003e\u003cbr /\u003e\u003ca href=\"https://github.com/rgommezz/react-native-offline/commits?author=felipemartim\" title=\"Code\"\u003e💻\u003c/a\u003e \u003ca href=\"https://github.com/rgommezz/react-native-offline/commits?author=felipemartim\" title=\"Documentation\"\u003e📖\u003c/a\u003e\u003c/td\u003e\n    \u003ctd align=\"center\"\u003e\u003ca href=\"http://WIP\"\u003e\u003cimg src=\"https://avatars1.githubusercontent.com/u/16226376?v=4?s=100\" width=\"100px;\" alt=\"\"/\u003e\u003cbr /\u003e\u003csub\u003e\u003cb\u003eMehdi A.\u003c/b\u003e\u003c/sub\u003e\u003c/a\u003e\u003cbr /\u003e\u003ca href=\"https://github.com/rgommezz/react-native-offline/commits?author=maieonbrix\" title=\"Code\"\u003e💻\u003c/a\u003e\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd align=\"center\"\u003e\u003ca href=\"https://github.com/comur\"\u003e\u003cimg src=\"https://avatars0.githubusercontent.com/u/1212381?v=4?s=100\" width=\"100px;\" alt=\"\"/\u003e\u003cbr /\u003e\u003csub\u003e\u003cb\u003eCan OMUR\u003c/b\u003e\u003c/sub\u003e\u003c/a\u003e\u003cbr /\u003e\u003ca href=\"https://github.com/rgommezz/react-native-offline/commits?author=comur\" title=\"Code\"\u003e💻\u003c/a\u003e\u003c/td\u003e\n    \u003ctd align=\"center\"\u003e\u003ca href=\"http://nijhuisenvanlagen.nl\"\u003e\u003cimg src=\"https://avatars3.githubusercontent.com/u/5470392?v=4?s=100\" width=\"100px;\" alt=\"\"/\u003e\u003cbr /\u003e\u003csub\u003e\u003cb\u003eMark van Lagen\u003c/b\u003e\u003c/sub\u003e\u003c/a\u003e\u003cbr /\u003e\u003ca href=\"https://github.com/rgommezz/react-native-offline/commits?author=markvl91\" title=\"Code\"\u003e💻\u003c/a\u003e\u003c/td\u003e\n    \u003ctd align=\"center\"\u003e\u003ca href=\"https://github.com/gtfargo\"\u003e\u003cimg src=\"https://avatars2.githubusercontent.com/u/2320535?v=4?s=100\" width=\"100px;\" alt=\"\"/\u003e\u003cbr /\u003e\u003csub\u003e\u003cb\u003eGeorge Farro\u003c/b\u003e\u003c/sub\u003e\u003c/a\u003e\u003cbr /\u003e\u003ca href=\"https://github.com/rgommezz/react-native-offline/commits?author=gtfargo\" title=\"Code\"\u003e💻\u003c/a\u003e\u003c/td\u003e\n    \u003ctd align=\"center\"\u003e\u003ca href=\"https://github.com/mleduque\"\u003e\u003cimg src=\"https://avatars2.githubusercontent.com/u/444063?v=4?s=100\" width=\"100px;\" alt=\"\"/\u003e\u003cbr /\u003e\u003csub\u003e\u003cb\u003eMickaël Leduque\u003c/b\u003e\u003c/sub\u003e\u003c/a\u003e\u003cbr /\u003e\u003ca href=\"https://github.com/rgommezz/react-native-offline/commits?author=mleduque\" title=\"Code\"\u003e💻\u003c/a\u003e\u003c/td\u003e\n    \u003ctd align=\"center\"\u003e\u003ca href=\"https://stackoverflow.com/users/1152843/florent-roques?tab=profile\"\u003e\u003cimg src=\"https://avatars3.githubusercontent.com/u/1901827?v=4?s=100\" width=\"100px;\" alt=\"\"/\u003e\u003cbr /\u003e\u003csub\u003e\u003cb\u003eFlorent Roques\u003c/b\u003e\u003c/sub\u003e\u003c/a\u003e\u003cbr /\u003e\u003ca href=\"https://github.com/rgommezz/react-native-offline/commits?author=florentroques\" title=\"Documentation\"\u003e📖\u003c/a\u003e\u003c/td\u003e\n    \u003ctd align=\"center\"\u003e\u003ca href=\"https://github.com/Krizzu\"\u003e\u003cimg src=\"https://avatars2.githubusercontent.com/u/6444719?v=4?s=100\" width=\"100px;\" alt=\"\"/\u003e\u003cbr /\u003e\u003csub\u003e\u003cb\u003eKrzysztof Borowy\u003c/b\u003e\u003c/sub\u003e\u003c/a\u003e\u003cbr /\u003e\u003ca href=\"https://github.com/rgommezz/react-native-offline/commits?author=Krizzu\" title=\"Code\"\u003e💻\u003c/a\u003e \u003ca href=\"https://github.com/rgommezz/react-native-offline/commits?author=Krizzu\" title=\"Documentation\"\u003e📖\u003c/a\u003e\u003c/td\u003e\n    \u003ctd align=\"center\"\u003e\u003ca href=\"http://www.thomasdeconinck.fr\"\u003e\u003cimg src=\"https://avatars2.githubusercontent.com/u/1548421?v=4?s=100\" width=\"100px;\" alt=\"\"/\u003e\u003cbr /\u003e\u003csub\u003e\u003cb\u003eThomas Deconinck\u003c/b\u003e\u003c/sub\u003e\u003c/a\u003e\u003cbr /\u003e\u003ca href=\"https://github.com/rgommezz/react-native-offline/commits?author=DCKT\" title=\"Code\"\u003e💻\u003c/a\u003e \u003ca href=\"https://github.com/rgommezz/react-native-offline/commits?author=DCKT\" title=\"Documentation\"\u003e📖\u003c/a\u003e\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd align=\"center\"\u003e\u003ca href=\"https://buymeacoff.ee/thymikee\"\u003e\u003cimg src=\"https://avatars2.githubusercontent.com/u/5106466?v=4?s=100\" width=\"100px;\" alt=\"\"/\u003e\u003cbr /\u003e\u003csub\u003e\u003cb\u003eMichał Pierzchała\u003c/b\u003e\u003c/sub\u003e\u003c/a\u003e\u003cbr /\u003e\u003ca href=\"https://github.com/rgommezz/react-native-offline/commits?author=thymikee\" title=\"Code\"\u003e💻\u003c/a\u003e\u003c/td\u003e\n    \u003ctd align=\"center\"\u003e\u003ca href=\"https://github.com/imartingraham\"\u003e\u003cimg src=\"https://avatars3.githubusercontent.com/u/119142?v=4?s=100\" width=\"100px;\" alt=\"\"/\u003e\u003cbr /\u003e\u003csub\u003e\u003cb\u003eIan Graham\u003c/b\u003e\u003c/sub\u003e\u003c/a\u003e\u003cbr /\u003e\u003ca href=\"https://github.com/rgommezz/react-native-offline/commits?author=imartingraham\" title=\"Code\"\u003e💻\u003c/a\u003e\u003c/td\u003e\n    \u003ctd align=\"center\"\u003e\u003ca href=\"http://www.pettersamuelsen.com\"\u003e\u003cimg src=\"https://avatars2.githubusercontent.com/u/1244867?v=4?s=100\" width=\"100px;\" alt=\"\"/\u003e\u003cbr /\u003e\u003csub\u003e\u003cb\u003ePetter Samuelsen\u003c/b\u003e\u003c/sub\u003e\u003c/a\u003e\u003cbr /\u003e\u003ca href=\"https://github.com/rgommezz/react-native-offline/commits?author=pettersamuelsen\" title=\"Code\"\u003e💻\u003c/a\u003e\u003c/td\u003e\n    \u003ctd align=\"center\"\u003e\u003ca href=\"https://github.com/usrbowe\"\u003e\u003cimg src=\"https://avatars1.githubusercontent.com/u/5339061?v=4?s=100\" width=\"100px;\" alt=\"\"/\u003e\u003cbr /\u003e\u003csub\u003e\u003cb\u003eLukas Kurucz\u003c/b\u003e\u003c/sub\u003e\u003c/a\u003e\u003cbr /\u003e\u003ca href=\"https://github.com/rgommezz/react-native-offline/commits?author=usrbowe\" title=\"Code\"\u003e💻\u003c/a\u003e\u003c/td\u003e\n    \u003ctd align=\"center\"\u003e\u003ca href=\"https://twitter.com/norris1z\"\u003e\u003cimg src=\"https://avatars1.githubusercontent.com/u/18237132?v=4?s=100\" width=\"100px;\" alt=\"\"/\u003e\u003cbr /\u003e\u003csub\u003e\u003cb\u003eNorris Oduro\u003c/b\u003e\u003c/sub\u003e\u003c/a\u003e\u003cbr /\u003e\u003ca href=\"https://github.com/rgommezz/react-native-offline/commits?author=Norris1z\" title=\"Code\"\u003e💻\u003c/a\u003e\u003c/td\u003e\n    \u003ctd align=\"center\"\u003e\u003ca href=\"https://github.com/richardtks\"\u003e\u003cimg src=\"https://avatars3.githubusercontent.com/u/43637878?v=4?s=100\" width=\"100px;\" alt=\"\"/\u003e\u003cbr /\u003e\u003csub\u003e\u003cb\u003eRichard Tan\u003c/b\u003e\u003c/sub\u003e\u003c/a\u003e\u003cbr /\u003e\u003ca href=\"#ideas-richardtks\" title=\"Ideas, Planning, \u0026 Feedback\"\u003e🤔\u003c/a\u003e\u003c/td\u003e\n    \u003ctd align=\"center\"\u003e\u003ca href=\"https://twitter.com/tysh_pysh\"\u003e\u003cimg src=\"https://avatars3.githubusercontent.com/u/17765105?v=4?s=100\" width=\"100px;\" alt=\"\"/\u003e\u003cbr /\u003e\u003csub\u003e\u003cb\u003eOleg Kupriianov\u003c/b\u003e\u003c/sub\u003e\u003c/a\u003e\u003cbr /\u003e\u003ca href=\"https://github.com/rgommezz/react-native-offline/commits?author=Jimbomaniak\" title=\"Code\"\u003e💻\u003c/a\u003e\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd align=\"center\"\u003e\u003ca href=\"https://github.com/reilem\"\u003e\u003cimg src=\"https://avatars1.githubusercontent.com/u/11155505?v=4?s=100\" width=\"100px;\" alt=\"\"/\u003e\u003cbr /\u003e\u003csub\u003e\u003cb\u003ereilem\u003c/b\u003e\u003c/sub\u003e\u003c/a\u003e\u003cbr /\u003e\u003ca href=\"#ideas-reilem\" title=\"Ideas, Planning, \u0026 Feedback\"\u003e🤔\u003c/a\u003e\u003c/td\u003e\n    \u003ctd align=\"center\"\u003e\u003ca href=\"https://github.com/jozr\"\u003e\u003cimg src=\"https://avatars1.githubusercontent.com/u/8154741?v=4?s=100\" width=\"100px;\" alt=\"\"/\u003e\u003cbr /\u003e\u003csub\u003e\u003cb\u003eJosephine Wright\u003c/b\u003e\u003c/sub\u003e\u003c/a\u003e\u003cbr /\u003e\u003ca href=\"https://github.com/rgommezz/react-native-offline/commits?author=jozr\" title=\"Documentation\"\u003e📖\u003c/a\u003e\u003c/td\u003e\n    \u003ctd align=\"center\"\u003e\u003ca href=\"http://umbrellait.com\"\u003e\u003cimg src=\"https://avatars0.githubusercontent.com/u/16078455?v=4?s=100\" width=\"100px;\" alt=\"\"/\u003e\u003cbr /\u003e\u003csub\u003e\u003cb\u003eKirill Karpov\u003c/b\u003e\u003c/sub\u003e\u003c/a\u003e\u003cbr /\u003e\u003ca href=\"https://github.com/rgommezz/react-native-offline/commits?author=umbrella-kirill-karpov\" title=\"Code\"\u003e💻\u003c/a\u003e\u003c/td\u003e\n    \u003ctd align=\"center\"\u003e\u003ca href=\"https://github.com/LiquidSean\"\u003e\u003cimg src=\"https://avatars3.githubusercontent.com/u/1811319?v=4?s=100\" width=\"100px;\" alt=\"\"/\u003e\u003cbr /\u003e\u003csub\u003e\u003cb\u003eSean Luthjohn\u003c/b\u003e\u003c/sub\u003e\u003c/a\u003e\u003cbr /\u003e\u003ca href=\"https://github.com/rgommezz/react-native-offline/commits?author=LiquidSean\" title=\"Code\"\u003e💻\u003c/a\u003e \u003ca href=\"https://github.com/rgommezz/react-native-offline/commits?author=LiquidSean\" title=\"Documentation\"\u003e📖\u003c/a\u003e\u003c/td\u003e\n    \u003ctd align=\"center\"\u003e\u003ca href=\"https://github.com/cuttlas\"\u003e\u003cimg src=\"https://avatars2.githubusercontent.com/u/1228574?v=4?s=100\" width=\"100px;\" alt=\"\"/\u003e\u003cbr /\u003e\u003csub\u003e\u003cb\u003ecuttlas\u003c/b\u003e\u003c/sub\u003e\u003c/a\u003e\u003cbr /\u003e\u003ca href=\"https://github.com/rgommezz/react-native-offline/commits?author=cuttlas\" title=\"Documentation\"\u003e📖\u003c/a\u003e\u003c/td\u003e\n    \u003ctd align=\"center\"\u003e\u003ca href=\"https://github.com/emanueleDiVizio\"\u003e\u003cimg src=\"https://avatars0.githubusercontent.com/u/9089203?v=4?s=100\" width=\"100px;\" alt=\"\"/\u003e\u003cbr /\u003e\u003csub\u003e\u003cb\u003eEmanuele\u003c/b\u003e\u003c/sub\u003e\u003c/a\u003e\u003cbr /\u003e\u003ca href=\"https://github.com/rgommezz/react-native-offline/commits?author=emanueleDiVizio\" title=\"Code\"\u003e💻\u003c/a\u003e \u003ca href=\"https://github.com/rgommezz/react-native-offline/commits?author=emanueleDiVizio\" title=\"Documentation\"\u003e📖\u003c/a\u003e\u003c/td\u003e\n    \u003ctd align=\"center\"\u003e\u003ca href=\"https://helder.dev\"\u003e\u003cimg src=\"https://avatars3.githubusercontent.com/u/862575?v=4?s=100\" width=\"100px;\" alt=\"\"/\u003e\u003cbr /\u003e\u003csub\u003e\u003cb\u003eHelder Burato Berto\u003c/b\u003e\u003c/sub\u003e\u003c/a\u003e\u003cbr /\u003e\u003ca href=\"https://github.com/rgommezz/react-native-offline/commits?author=helderburato\" title=\"Documentation\"\u003e📖\u003c/a\u003e\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd align=\"center\"\u003e\u003ca href=\"http://ankeetmaini.github.io/\"\u003e\u003cimg src=\"https://avatars1.githubusercontent.com/u/6652823?v=4?s=100\" width=\"100px;\" alt=\"\"/\u003e\u003cbr /\u003e\u003csub\u003e\u003cb\u003eAnkeet Maini\u003c/b\u003e\u003c/sub\u003e\u003c/a\u003e\u003cbr /\u003e\u003ca href=\"https://github.com/rgommezz/react-native-offline/commits?author=ankeetmaini\" title=\"Code\"\u003e💻\u003c/a\u003e\u003c/td\u003e\n    \u003ctd align=\"center\"\u003e\u003ca href=\"http://www.nipuna777.com\"\u003e\u003cimg src=\"https://avatars0.githubusercontent.com/u/5859290?v=4?s=100\" width=\"100px;\" alt=\"\"/\u003e\u003cbr /\u003e\u003csub\u003e\u003cb\u003eNipuna Gunathilake\u003c/b\u003e\u003c/sub\u003e\u003c/a\u003e\u003cbr /\u003e\u003ca href=\"https://github.com/rgommezz/react-native-offline/commits?author=nipuna777\" title=\"Documentation\"\u003e📖\u003c/a\u003e\u003c/td\u003e\n    \u003ctd align=\"center\"\u003e\u003ca href=\"https://github.com/1ike\"\u003e\u003cimg src=\"https://avatars1.githubusercontent.com/u/10694949?v=4?s=100\" width=\"100px;\" alt=\"\"/\u003e\u003cbr /\u003e\u003csub\u003e\u003cb\u003e1ike\u003c/b\u003e\u003c/sub\u003e\u003c/a\u003e\u003cbr /\u003e\u003ca href=\"https://github.com/rgommezz/react-native-offline/commits?author=1ike\" title=\"Code\"\u003e💻\u003c/a\u003e\u003c/td\u003e\n    \u003ctd align=\"center\"\u003e\u003ca href=\"https://github.com/JH108\"\u003e\u003cimg src=\"https://avatars1.githubusercontent.com/u/14010157?v=4?s=100\" width=\"100px;\" alt=\"\"/\u003e\u003cbr /\u003e\u003csub\u003e\u003cb\u003eJesse Hill\u003c/b\u003e\u003c/sub\u003e\u003c/a\u003e\u003cbr /\u003e\u003ca href=\"https://github.com/rgommezz/react-native-offline/commits?author=JH108\" title=\"Documentation\"\u003e📖\u003c/a\u003e\u003c/td\u003e\n    \u003ctd align=\"center\"\u003e\u003ca href=\"https://github.com/ugurakkurt\"\u003e\u003cimg src=\"https://avatars0.githubusercontent.com/u/12188837?v=4?s=100\" width=\"100px;\" alt=\"\"/\u003e\u003cbr /\u003e\u003csub\u003e\u003cb\u003eugur akkurt\u003c/b\u003e\u003c/sub\u003e\u003c/a\u003e\u003cbr /\u003e\u003ca href=\"https://github.com/rgommezz/react-native-offline/commits?author=ugurakkurt\" title=\"Code\"\u003e💻\u003c/a\u003e \u003ca href=\"https://github.com/rgommezz/react-native-offline/commits?author=ugurakkurt\" title=\"Documentation\"\u003e📖\u003c/a\u003e\u003c/td\u003e\n    \u003ctd align=\"center\"\u003e\u003ca href=\"https://github.com/caiangums\"\u003e\u003cimg src=\"https://avatars2.githubusercontent.com/u/7551787?v=4?s=100\" width=\"100px;\" alt=\"\"/\u003e\u003cbr /\u003e\u003csub\u003e\u003cb\u003eIlê Caian\u003c/b\u003e\u003c/sub\u003e\u003c/a\u003e\u003cbr /\u003e\u003ca href=\"https://github.com/rgommezz/react-native-offline/commits?author=caiangums\" title=\"Documentation\"\u003e📖\u003c/a\u003e\u003c/td\u003e\n    \u003ctd align=\"center\"\u003e\u003ca href=\"https://github.com/sbelzile-nexapp\"\u003e\u003cimg src=\"https://avatars.githubusercontent.com/u/67745993?v=4?s=100\" width=\"100px;\" alt=\"\"/\u003e\u003cbr /\u003e\u003csub\u003e\u003cb\u003eSébastien Belzile\u003c/b\u003e\u003c/sub\u003e\u003c/a\u003e\u003cbr /\u003e\u003ca href=\"https://github.com/rgommezz/react-native-offline/commits?author=sbelzile-nexapp\" title=\"Documentation\"\u003e📖\u003c/a\u003e \u003ca href=\"#ideas-sbelzile-nexapp\" title=\"Ideas, Planning, \u0026 Feedback\"\u003e🤔\u003c/a\u003e\u003c/td\u003e\n  \u003c/tr\u003e\n\u003c/table\u003e\n\n\u003c!-- markdownlint-restore --\u003e\n\u003c!-- prettier-ignore-end --\u003e\n\n\u003c!-- ALL-CONTRIBUTORS-LIST:END --\u003e\n\nThis project follows the [all-contributors](https://github.com/kentcdodds/all-contributors) specification. Contributions of any kind welcome!\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Frgommezz%2Freact-native-offline","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Frgommezz%2Freact-native-offline","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Frgommezz%2Freact-native-offline/lists"}