Estoy usando Firebase Auth con TS en una aplicación nextJS.
Estoy tratando de configurar AuthProvider y usar el contexto.
interface IAuth { user: User | null; login: (data: FormData) => Promise<firebase.auth.UserCredential>; logout: () => void; } type FormData = { email: string; password: string; }; type User = firebase.User; // type UserCredential=firebase.auth.UserCredential const AuthContext = createContext<IAuth>({ user: null, login:(data: FormData) => Promise<firebase.auth.UserCredential>, logout: () => {}, }); Recibo esta advertencia en la función de inicio de login que dice:
Type '(data: FormData) => boolean' is not assignable to type '(data: FormData) => Promise<UserCredential>'. Type 'boolean' is not assignable to type 'Promise<UserCredential>'. Aquí está mi auth.tsx
export const AuthProvider = ({ children }: AuthProviderProps): JSX.Element => { firebaseClient(); const [user, setUser] = useState<User | null>(null); useEffect(() => { return firebase.auth().onIdTokenChanged(async (user) => { console.log('auth changed'); console.log(user ? user.getIdToken : 'Nothing'); if (!user) { setUser(null); nookies.set(undefined, 'token', '', {}); return; } const token = await user.getIdToken(); setUser(user); nookies.set(undefined, 'token', token, {}); }); }, []); const login = async (data: FormData): Promise<firebase.auth.UserCredential> => { return await firebase.auth().signInWithEmailAndPassword(data.email, data.password); }; const logout = async () => { console.log('Logging out'); return await firebase.auth().signOut() }; return <AuthContext.Provider value={{ user, login, logout }}>{children}</AuthContext.Provider>; }; export const useAuth = () => useContext(AuthContext);¿Cómo menciono el tipo de devolución en AuthContext?
const AuthContext = createContext<IAuth>({ user: null, login:(data: FormData) => Promise<firebase.auth.UserCredential>, logout: () => {}, });Debe devolver una Promise<firebase.auth.UserCredential> del método de inicio de sesión, pero solo tiene el tipo escrito atm. Intenta refactorizar el código para:
const login = async (data: FormData) => { return await firebase.auth().signInWithEmailAndPassword(data.email, data.password); }; const AuthContext = createContext<IAuth>({ user: null, login:(data: FormData) => login, // <-- add the function here logout: () => {}, });