Привет! Я создал Аутентификатор для личного журнала, который проверяет, есть ли пользователь.
Аут. js:
import React, { useEffect, useState } from 'react';
import { Authentication } from './components/firebase';
import { getDefaultNormalizer } from '@testing-library/react';
export const AuthContext = React.createContext();
export const AuthProvider = ({ children }) => {
const [currentUser, setCurrentUser] = useState(null);
const [pending, setpending] = useState(true);
const [userData, setuserData] = useState(null);
useEffect(() => {
Authentication.auth().onAuthStateChanged((user) => {
setCurrentUser(user)
setpending(false)
localStorage.setItem('user', user.uid);
console.log(localStorage.getItem('user'));
});
}, []);
if(userData !== null) {
console.log(userData)
}
if (pending) {
return <></>
}
return (
<AuthContext.Provider
value={{
currentUser
}}
>
{children}
</AuthContext.Provider>
);
};
PrivateRoute.js:
import React, { useContext } from 'react';
import { Route, Redirect } from 'react-router-dom';
import { AuthContext, AuthProvider } from './Auth';
const PrivateRoute = ({ component: RouterComponent, ...rest }) => {
const {currentUser} = useContext(AuthContext);
return (
<Route
{...rest}
render={routeProps =>
!!currentUser ? (
<RouterComponent {...routeProps} />
) : (
<Redirect to={'/login_page'} />
)
}
/>
);
};
export default PrivateRoute;
Я просто обвиваю <PrivateRoute />
вокруг путей Я не хочу, чтобы пользователь получил доступ. Используя ту же информацию из Auth, как лучше всего извлечь данные из данных моего fireStore, используя uid, как я могу пройти через uid? Я хотел бы, чтобы я получал информацию каждый раз, когда база данных обновляется. Я слышал, что могу использовать onSnapshot, но на самом деле не уверен,
Я написал что-то подобное на моем рабочем столе. js:
const getData = () => {
Authentication.firestore().collection('Health_data')
.doc('how do I get the uid?')
.get()
.then(doc => {
const data = doc.data();
localStorage.setItem('user_data', JSON.stringify(data));
setuserData(data)
console.log(data)
}).catch(function (error) {
console.error("Error reading health", error);
});
}
Код заключения:
const [healthData, healthDataSet] = useState(null)
useEffect(() => {
const userId = Authentication.auth().currentUser.uid;
Authentication.firestore().collection('Health_data')
.doc(userId)
.get()
.then(doc => {
healthDataSet(doc.data())
}).catch(function (error) {
console.error("Error reading health", error);
});
}, []);
Это код, который я придумал, и он работает, но мне интересно, есть ли лучший код, который я мог бы использовать, так как он будет извлечен из база данных глупое количество раз?