npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2024 – Pkg Stats / Ryan Hefner

redux-firestore-hooks

v0.4.1

Published

Very simple React Hooks for Firestore to Redux

Downloads

11

Readme

redux-firestore-hooks

A simple tool for subscribing to Firestore and reflecting it in Redux.

It provides:

  • Two custom hooks dispatching an action for Firestore data.
  • Reducer receiving these actions.

Motivation

A similar Library is redux-firestore, which provides an API that wraps Firestore. So you have to learn those APIs anew. Therefore, even if you have knowledge of Firebase SDK I/F, it is difficult to understand. In addition, the bundle size is large.

redux-firestore-hooks adopt the design that directly use Firebase SDK I/F. So you can learn easily and keep code simple.

Install

npm install redux-firestore-hooks

Usage

store.ts

// Writing for Redux Toolkit, but you can write other type store.

import { configureStore } from '@reduxjs/toolkit'
import { createReducer } from 'redux-firestore-hooks'

// type for Firestore document
export type User = {
  displayName: string
  photoURL: string
}

// type for Firestore document
export type Chat = {
  userId: string
  text: string
}

// id is document ID
type FirestoreState = {
  users?: { [id in string]: User }
  chats?: { [id in string]: Chat }
}

const store = configureStore({
  reducer: {
    // To work firestore state type, put the type here.
    firestore: createReducer<FirestoreState>(),
  },
})

export type RootState = ReturnType<typeof store.getState>

export default store

App.tsx

// App.tsx
import { collection, doc, onSnapshot, query } from 'firebase/firestore'
import { useDispatch, useSelector } from 'react-redux'
import { useApplyCollection, useApplyDocument, clear } from 'redux-firestore-hooks'

const App = ({ userId }) => {
  const dispatch = useDispatch()
  const applyDocument = useApplyDocument(dispatch)
  const applyCollection = useApplyCollection(dispatch)

  // When App is mounted, subscribing chats and reflecting it in firestore.chats state
  useEffect(() => {
    const unsubscribeChats = onSnapshot(query(collection(db, 'chats')), applyCollection('chats'))
    return () => {
      unsubscribeChats()
      // clear chats data
      dispatch(clear('chats'))
    }
  }, [applyCollection])

  // Subscribe to the user document as the userId changes and reflect it in firestore.users state
  useEffect(() => {
    const unsubscribeUser = onSnapshot(doc(db, `users/${userId}`), applyDocument('users'))
    return () => {
      unsubscribe()
      // clear user data by userId
      dispatch(clear(['users', userId]))
    }
  }, [userId, applyDocument])

  return null
}

When the App component is mounted and the subscription to the Firestore is complete, Redux's state will be:

{
  firestore: {
    users: {
      xj0cjs: {
        displayName: 'Alice'
        photoURL: 'https://example.com/alice.png'
      },
    }
    chats: {
      fajei8: {
        userId: 'xj0cjs',
        text: 'Hello, Bob',
      },
      d8cjs2: {
        userId: 'f82bma',
        text: 'Hello, Alice',
      }
    }
  }
}

Tips

If It's annoying to write useDispatch at each component, write this wrapper functions.

import {
  useApplyCollection as useApplyCollection_,
  useApplyDocument as useApplyDocument_,
} from 'redux-firestore-hooks'

import { useDispatch } from 'react-redux'

export function useApplyCollection() {
  const dispatch = useDispatch()
  return useApplyCollection_(dispatch)
}

export function useApplyDocument() {
  const dispatch = useDispatch()
  return useApplyDocument_(dispatch)
}