I am making an app that tracks the number of users’ tardiness using Firestore, but I can’t figure out how to order the list of results by number of tardy.
I’ve tried using the orderBy() function from Firebase docs, but I haven’t been able to implement it correctly with my existing code yet.
import { useState, useEffect } from 'react'; import './App.css'; import { db } from './firebase-config'; import { collection, getDocs, addDoc, doc, } from 'firebase/firestore'; export default function App() { const [newName, setNewName] = useState(''); const [newTardy, setNewTardy] = useState(0); const [users, setUsers] = useState([]); const usersCollectionRef = collection(db, 'users'); const createUser = async () => { await addDoc(usersCollectionRef, { name: newName, tardy: Number(newTardy), }).then(() => { alert('User Created'); }); }; useEffect(() => { const getUsers = async () => { const data = await getDocs(usersCollectionRef); setUsers(data.docs.map((doc) => ({ ...doc.data(), id: doc.id }))); }; getUsers(); }, []); return ( <div className="App"> <h1>Tardy List</h1> <input placeholder="Name..." onChange={(event) => { setNewName(event.target.value); }} /> <input type="number" placeholder="Number of Tardies..." onChange={(event) => { setNewTardy(event.target.value); }} /> <br /> <button onClick={createUser}> Create User</button> {users.map((user) => { return ( <div> <h2>Name: {user.name}</h2> <h2>Tardies: {user.tardy}</h2> </div> ); })} </div> ); }
Advertisement
Answer
From reading the documentation on ordering data, something like this should do the trick:
const data = await getDocs(query(usersCollectionRef, orderBy("tardy"))); setUsers(data.docs.map((doc) => ({ ...doc.data(), id: doc.id })));