• Stars
    star
    2,545
  • Rank 18,032 (Top 0.4 %)
  • Language
    JavaScript
  • License
    MIT License
  • Created about 8 years ago
  • Updated 5 months ago

Reviews

There are no reviews yet. Be the first to send feedback to the community and the maintainers!

Repository Details

Redux bindings for Firebase. Includes React Hooks and Higher Order Components.

react-redux-firebase

NPM version NPM downloads Quality Code Coverage Code Style License Build Status

Gitter

Redux bindings for Firebase. Includes Higher Order Component (HOC) for use with React.

Usage Note

If you are starting a new project and/or are not required to have your Firebase data loaded into redux, you might want to give reactfire a try before trying react-redux-firebase. I wrote up a quick medium article explaining a bit about how, why, and showing how to start a new project with these tools.

Simple Example

Edit Simple Example

The Material Example is deployed to demo.react-redux-firebase.com.

Features

  • Out of the box support for authentication (with auto loading user profile from database/firestore)
  • Full Firebase Platform Support Including Real Time Database, Firestore, and Storage
  • Automatic binding/unbinding of listeners through React Hooks (useFirebaseConnect, useFirestoreConnect) or Higher Order Components (firebaseConnect and firestoreConnect)
  • Population capability (similar to mongoose's populate or SQL's JOIN)
  • Support small data ( using value ) or large datasets ( using child_added, child_removed, child_changed )
  • Multiple queries types supported including orderByChild, orderByKey, orderByValue, orderByPriority, limitToLast, limitToFirst, startAt, endAt, equalTo
  • Tons of examples of integrations including redux-thunk and redux-observable
  • Server Side Rendering Support
  • react-native support using native modules or web sdk

Installation

npm install --save react-redux-firebase

This assumes you are using npm as your package manager.

If you're not, you can access the library on unpkg, download it, or point your package manager to it. Theres more on this in the Builds section below.

Older Versions

Interested in support for versions of react-redux before v6 or the new react context API? Checkout the v2.*.* versions (installed through npm i --save react-redux-firebase^@2.5.0).

Use

Include firebaseReducer (reducer) while creating your redux store then pass dispatch and your firebase instance to ReactReduxFirebaseProvider (context provider):

import React from 'react'
import { render } from 'react-dom'
import { Provider } from 'react-redux'
import firebase from 'firebase/app'
import 'firebase/database'
import 'firebase/auth'
// import 'firebase/firestore' // <- needed if using firestore
// import 'firebase/functions' // <- needed if using httpsCallable
import { createStore, combineReducers, compose } from 'redux'
import {
  ReactReduxFirebaseProvider,
  firebaseReducer
} from 'react-redux-firebase'
// import { createFirestoreInstance, firestoreReducer } from 'redux-firestore' // <- needed if using firestore

const fbConfig = {}

// react-redux-firebase config
const rrfConfig = {
  userProfile: 'users'
  // useFirestoreForProfile: true // Firestore for Profile instead of Realtime DB
}

// Initialize firebase instance
firebase.initializeApp(fbConfig)

// Initialize other services on firebase instance
// firebase.firestore() // <- needed if using firestore
// firebase.functions() // <- needed if using httpsCallable

// Add firebase to reducers
const rootReducer = combineReducers({
  firebase: firebaseReducer
  // firestore: firestoreReducer // <- needed if using firestore
})

// Create store with reducers and initial state
const initialState = {}
const store = createStore(rootReducer, initialState)

const rrfProps = {
  firebase,
  config: rrfConfig,
  dispatch: store.dispatch
  // createFirestoreInstance // <- needed if using firestore
}

// Setup react-redux so that connect HOC can be used
function App() {
  return (
    <Provider store={store}>
      <ReactReduxFirebaseProvider {...rrfProps}>
        <Todos />
      </ReactReduxFirebaseProvider>
    </Provider>
  )
}

render(<App />, document.getElementById('root'))

The Firebase instance can then be grabbed from context within your components (withFirebase and firebaseConnect Higher Order Components provided to help):

Add Data

import React from 'react'
import { useFirebase } from 'react-redux-firebase'

export default function Todos() {
  const firebase = useFirebase()

  function addSampleTodo() {
    const sampleTodo = { text: 'Sample', done: false }
    return firebase.push('todos', sampleTodo)
  }

  return (
    <div>
      <h1>New Sample Todo</h1>
      <button onClick={addSampleTodo}>Add</button>
    </div>
  )
}

Load Data (listeners automatically managed on mount/unmount)

import React from 'react'
import PropTypes from 'prop-types'
import { useSelector } from 'react-redux'
import { useFirebaseConnect, isLoaded, isEmpty } from 'react-redux-firebase'

export default function Todos() {
  useFirebaseConnect([
    'todos' // { path: '/todos' } // object notation
  ])

  const todos = useSelector((state) => state.firebase.ordered.todos)

  if (!isLoaded(todos)) {
    return <div>Loading...</div>
  }

  if (isEmpty(todos)) {
    return <div>Todos List Is Empty</div>
  }

  return (
    <div>
      <ul>
        {Object.keys(todos).map((key, id) => (
          <TodoItem key={key} id={id} todo={todos[key]} />
        ))}
      </ul>
    </div>
  )
}

Queries Based On Route Params

It is common to make a detail page that loads a single item instead of a whole list of items. A query for a specific Todos can be created using

import React from 'react'
import PropTypes from 'prop-types'
import { get } from 'lodash'
import { useSelector } from 'react-redux'
import { useFirebaseConnect, useFirebase } from 'react-redux-firebase'
import { useParams } from 'react-router-dom'

export default function Todo() {
  const { todoId } = useParams() // matches todos/:todoId in route
  const firebase = useFirebase()

  useFirebaseConnect([
    { path: `todos/${todoId}` } // create todo listener
    // `todos/${todoId}` // equivalent string notation
  ])

  const todo = useSelector(
    ({ firebase: { data } }) => data.todos && data.todos[todoId]
  )

  function updateTodo() {
    return firebase.update(`todos/${params.todoId}`, { done: !todo.isDone })
  }

  return (
    <div>
      <input
        name="isDone"
        type="checkbox"
        checked={todo.isDone}
        onChange={updateTodo}
      />
      <span>{todo.label}</span>
    </div>
  )
}

Load Data On Click

import React from 'react'
import { useSelector } from 'react-redux'
import { useFirebase, isLoaded, isEmpty } from 'react-redux-firebase'

function TodosList() {
  const todos = useSelector((state) => state.firebase.ordered.todos)

  if (!isLoaded(todos)) {
    return <div>Loading...</div>
  }

  if (isEmpty(todos)) {
    return <div>Todos List Is Empty</div>
  }

  return (
    <ul>
      {Object.keys(todos).map((key, id) => (
        <TodoItem key={key} id={id} todo={todos[key]} />
      ))}
    </ul>
  )
}

export default function Todos() {
  const firebase = useFirebase()

  return (
    <div>
      <h1>Todos</h1>
      <EnhancedTodosList />
      <button onClick={() => firebase.watchEvent('value', 'todos')}>
        Load Todos
      </button>
    </div>
  )
}

Firestore

If you plan to use Firestore, you should checkout redux-firestore. It integrates nicely with react-redux-firebase and it allows you to run Real Time Database and Firestore along side each other.

react-redux-firebase provides the firestoreConnect HOC (similar to firebaseConnect) for easy setting/unsetting of listeners.

Currently react-redux-firebase still handles auth when using redux-firestore - The future plan is to also have auth standalone auth library that will allow the developer to choose which pieces they do/do not want.

Docs

See full documentation at react-redux-firebase.com

Examples

Examples Folder

Examples folder is broken into two categories snippets and complete. /complete contains full applications that can be run as is, where as /snippets contains small amounts of code to highlight specific functionality (dev tools and deps not included).

State Based Query Snippet

Snippet showing querying based on data in redux state. One of the more common examples is querying based on the current users auth UID.

Decorators Snippet

Snippet showing how to use decorators to simplify connect functions (redux's connect and react-redux-firebase's firebaseConnect)

Simple App Example

A simple example that was created using create-react-app's. Shows a list of todo items and allows you to add to them.

Material App Example

An example that user Material UI built on top of the output of create-react-app's eject command. Shows a list of todo items and allows you to add to them. This is what is deployed to redux-firebasev3.firebaseapp.com.

Discussion

Join us on the redux-firebase gitter.

Integrations

View docs for recipes on integrations with:

Starting A Project

Generator

generator-react-firebase is a yeoman generator uses react-redux-firebase when opting to include redux.

CRA Template

cra-template-rrf is a create-react-app template with react-redux-firebase included

Complete Examples

The examples folder contains full applications that can be copied/adapted and used as a new project.

FAQ

Please visit the FAQ section of the docs

Builds

Most commonly people consume Redux Firestore as a CommonJS module. This module is what you get when you import redux in a Webpack, Browserify, or a Node environment.

If you don't use a module bundler, it's also fine. The redux-firestore npm package includes precompiled production and development UMD builds in the dist folder. They can be used directly without a bundler and are thus compatible with many popular JavaScript module loaders and environments. For example, you can drop a UMD build as a <script> tag on the page. The UMD builds make Redux Firestore available as a window.ReactReduxFirebase global variable.

It can be imported like so:

<script src="../node_modules/react-redux-firebase/dist/react-redux-firebase.min.js"></script>
<script src="../node_modules/redux-firestore/dist/redux-firestore.min.js"></script>
<!-- or through cdn: <script src="https://unpkg.com/react-redux-firebase@latest/dist/react-redux-firebase.min.js"></script> -->
<!-- or through cdn: <script src="https://unpkg.com/redux-firestore@latest/dist/redux-firestore.min.js"></script> -->
<script>
  console.log('react redux firebase:', window.ReactReduxFirebase)
</script>

Note: In an effort to keep things simple, the wording from this explanation was modeled after the installation section of the Redux Docs.

Contributors

This project exists thanks to all the people who contribute.

More Repositories

1

redux-firestore

Redux bindings for Firestore
JavaScript
574
star
2

generator-react-firebase

React Firebase (Redux optional) yeoman generator
JavaScript
296
star
3

cypress-firebase

Cypress plugin and custom commands for testing Firebase projects
TypeScript
255
star
4

fireadmin

Application for Managing Firebase Applications. Includes support for multiple environments and data migrations
JavaScript
240
star
5

react-google-button

Simple google button for React that follows Google's style guidelines (https://developers.google.com/identity/sign-in/web/build-button)
JavaScript
74
star
6

firebase-ci

Simplified Firebase interaction for continuous integration
JavaScript
72
star
7

redux-firebasev3

Actions/Reducer with HOC for using redux with Firebase v3
JavaScript
36
star
8

gitbook-plugin-versions-select

A gitbook plugin that provides a version dropdown. Works with multiple versions on one domain.
JavaScript
12
star
9

redux-firebase

Redux bindings for Firebase
JavaScript
7
star
10

tsheets-sdk

Javascript SDK for TSheets API
JavaScript
6
star
11

ng-reveal

Angular Directive wrapper for RevealJS presentation library.
JavaScript
6
star
12

cra-template-rrf

JavaScript
4
star
13

authrocket

Javascript library to interact with Auth Rocket service
JavaScript
3
star
14

generator-firebase-functions

Yeoman generator for creating Cloud Functions For Firebase within a Firebase project
JavaScript
3
star
15

renovate-config

My personal renovate config presets
3
star
16

functions-queue

Task Queuing for use with Cloud Functions for Firebase. Similar to firebase-queue but handles Functions events.
JavaScript
3
star
17

fireadmin-site

App for managing Firebase instances (including data migrations and analytics)
JavaScript
2
star
18

parsePush

DEPRECATED. Parse no longer exists
Go
2
star
19

devshare

JS library on which devshare.io is built and extended
JavaScript
2
star
20

redux-devshare

Redux connector for devshare library
JavaScript
2
star
21

generator-next-firebase

NextJS and Firebase project generator
JavaScript
2
star
22

tessellate

Application building/sharing API
JavaScript
2
star
23

machinepack-spotify

A machinepack to interact with the Spotify API
JavaScript
2
star
24

spanner-graphql-example

Example of React App which interacts with a Cloud Spanner instance using GraphQL (hosted on Cloud Functions)
TypeScript
2
star
25

firebase-tools-extra

Extra methods for firebase-tools which support using a service account.
TypeScript
1
star
26

AngularFireAdmin

Angular integration for FireAdmin library.
CSS
1
star
27

firething

JavaScript
1
star
28

deploy-changed-functions

TypeScript
1
star
29

portfolio

Personal website
JavaScript
1
star
30

PiOpenLighting

Open Lighting Library modified to be used on a pi that is placed in the amplifier rack that I build for my fraternity. Originally from open-lighting-24ba77cc10d1.
C++
1
star
31

Dyml

CSS
1
star
32

revealPortfolio

Portfolio sample built with RevealJS and AngularJS.
JavaScript
1
star
33

s3Upload

Go package to simplify file uploads to s3
Go
1
star
34

machinepack-jwtauth

Handle JSON Web Tokens from request headers.
JavaScript
1
star
35

devshare-cli

Command line interface for devshare
JavaScript
1
star
36

blues-mui-stack

Remix blues stack with material-ui
TypeScript
1
star
37

fireuser

User/Session management for Firebase
JavaScript
1
star
38

react-es6-basic

Basic React hello world app with ES6 and Babel.
HTML
1
star
39

new-project-tutorial

HTML
1
star
40

hypercube-server

CSS
1
star