Skip to content

Instantly share code, notes, and snippets.

@rahsheen
Created March 1, 2020 16:52
Show Gist options
  • Select an option

  • Save rahsheen/6da6a2fcb6e86170bcda9b9420ef4191 to your computer and use it in GitHub Desktop.

Select an option

Save rahsheen/6da6a2fcb6e86170bcda9b9420ef4191 to your computer and use it in GitHub Desktop.
import React, { useEffect, useState } from "react";
import SignUp from "../components/SignUp";
import { useAuth } from "./auth-context";
const getUserData = async (idToken: string) => {
const response = await fetch(`http://localhost:4000/user`, {
headers: {
Accept: "application/json",
Authorization: "Bearer " + idToken
}
});
if (response.ok) {
const { data } = await response.json();
return data;
} else {
console.log("Response was bad", response);
throw response;
}
};
interface UserContextType {
userData: any[];
idToken?: string;
}
const UserContext = React.createContext<UserContextType>({
userData: [],
idToken: ""
});
function UserProvider(props) {
const [idToken, setIdToken] = useState("");
const [userData, setUserData] = useState([]);
const { user } = useAuth();
useEffect(() => {
if (!user) return;
user
.getIdToken()
.then(setIdToken)
.catch(console.error);
}, [user]);
useEffect(() => {
if (!idToken) return;
getUserData(idToken).then(setUserData);
}, [idToken]);
if (user && !userData.length) {
return <SignUp user={user} setUserData={setUserData} />;
}
return (
<UserContext.Provider value={{ user, userData, idToken }} {...props} />
);
}
function useUser() {
const context = React.useContext(UserContext);
if (context === undefined) {
throw new Error(`useUser must be used within a UserProvider`);
}
return context;
}
export { UserProvider, useUser };
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment