Skip to content

Instantly share code, notes, and snippets.

@belachkar
Last active November 8, 2021 11:15
Show Gist options
  • Save belachkar/27fff248ddcee444237a9dfd11a2cc6e to your computer and use it in GitHub Desktop.
Save belachkar/27fff248ddcee444237a9dfd11a2cc6e to your computer and use it in GitHub Desktop.

Firebase Custom Hooks

hooks/useUser.js:

import { useEffect, useState } from 'react';

export const useUser = (auth) => {
  const [user, setUser] = useState(null);
  const [isLoading, setIsLoading] = useState(true);
  const [err, setErr] = useState(null);

  useEffect(() => {
    auth.onAuthStateChanged(
      (userData) => {
        setIsLoading(false);

        if (userData) setUser(userData);
        else console.log('No user defined yet!');
      },
      (err) => {
        setIsLoading(false);
        setErr(err);
      }
    );
  }, []);

  return { user, isLoading, err };
};

hooks/useCollection.js:

import { onSnapshot } from 'firebase/firestore';
import { useEffect, useState } from 'react';

export const useCollection = (query) => {
  const [docs, setDocs] = useState([]);
  const [isLoading, setIsLoading] = useState(true);
  const [err, setErr] = useState(null);

  useEffect(() => {
    onSnapshot(
      query,
      (docsSnapshot) => {
        setIsLoading(false);

        let docs = [];
        docsSnapshot.forEach((doc) => docs.push({ ...doc.data(), id: doc.id }));

        setDocs(docs);
      },
      (err) => {
        setIsLoading(false);
        setErr(err);
      }
    );
  }, []);

  return { docs, isLoading, err };
};
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment