Есть некая очередь в которую могут добавляться пользователи, в Firebase Cloud Firestore она выглядит так:
Collection(users) => document(users) => field(queue[arr])
Для отличия пользователей используется id который сохраняется в localStorage, но когда пользователи пытаются войти одновременно то входит только кто-то один.
Вот код:
const [users, setUsers] = useState([]);
const [name, setName] = useState("");
useEffect(() => {
const fetchQueue = async () => {
const db = getFirestore();
const usersRef = doc(db, "autocommitQueue", "users");
const unsubscribe = onSnapshot(usersRef, (doc) => {
if (doc.exists()) {
setUsers(doc.data().queue || []);
}
});
return () => unsubscribe();
};
fetchQueue();
}, []);
const setFirebase = async (arr) => {
const refDb = doc(getFirestore(), "autocommitQueue", "users");
await setDoc(refDb, {
queue: arr,
});
};
const addUser = () => {
const id = uuid4();
if (name.length > 0) {
if (localStorage.getItem("id") === null) {
if (!users) {
localStorage.setItem("id", id);
setFirebase([{ name: name, id: id }])
} else {
localStorage.setItem("id", id);
setFirebase([...users, { name: name, id: id }])
}
}
}
};
return(
<Box
sx={{
display:
localStorage.getItem("id") !== null
? "none"
: "flex",
alignItems: "center",
}}
>
<TextField
type={"text"}
id="outlined-number"
label={"Name"}
onChange={(event) => {
setName(event.target.value);
}}
/>
<Button
onClick={addUser}
variant={"outlined"}
sx={{ "&.MuiButton-root": { height: "56px" } }}
>
Push
</Button>
</Box>
)