I’m trying to re-write my existing code which was making use of props chaining with the help of React Context API
I will include the context file and other important files aswell I have been stuck since an hour trying to figure out where I went wrong but unable to figure it out
App.js file
import "./App.css"; import { useContext } from "react"; import LoginPage from "./Login/LoginPage"; import NewPost from "./Posts/NewPost"; import PostList from "./Posts/PostList"; import Signup from "./Signup/Signup"; import AuthContext from "./store/auth-context"; import { AuthContextProvider } from "./store/auth-context"; const expenses = [ { name: "Lakshay Gupta", content: " Amet minim mollit non deserunt ullamco est sit aliqua dolor do amet sint. Velit officia consequat duis enim velit mollit. Exercitation veniam consequat sunt nostrud amet.", posted: "5mins ago", comments: "16 comments", }, { name: "Naman Sukhija", content: " Amet minim mollit non deserunt ullamco est sit aliqua dolor do amet sint. Velit officia consequat duis enim velit mollit. Exercitation veniam consequat sunt nostrud amet.", posted: "1hour ago", comments: "24 comments", }, { name: "William Harris", content: " Amet minim mollit non deserunt ullamco est sit aliqua dolor do amet sint. Velit officia consequat duis enim velit mollit. Exercitation veniam consequat sunt nostrud amet.", posted: "3mins ago", comments: "29 comments", }, ]; function App() { const ctx = useContext(AuthContext); return ( <AuthContextProvider className="App"> {!ctx.isLoggedIn && <LoginPage></LoginPage>} {ctx.isLoggedIn && ( <div className="posts-area"> {ctx.registerIsShown && <Signup></Signup>} <NewPost></NewPost> <PostList items={expenses}></PostList>{" "} </div> )} </AuthContextProvider> ); } export default App;
auth-context.js file
import React from "react"; import { useState } from "react"; const AuthContext = React.createContext({ isLoggedIn: false, registerIsShown: false, onLogin: (email,pass) => {}, onShow: () => {} , onHide: () => {} }); export const AuthContextProvider = (props) => { const [isLoggedIn, setLogin] = useState(false); const submitLoginHandler = () => { setLogin(!isLoggedIn); }; const [registerIsShown, setRegisterIsShown] = useState(false); const showRegisterHandler = () => { setRegisterIsShown(true); }; const hideRegisterHandler = () => { setRegisterIsShown(false); }; return ( <AuthContext.Provider value={{ isLoggedIn: isLoggedIn, registerIsShown: registerIsShown, onLogin: submitLoginHandler, onShow: showRegisterHandler, onHide: hideRegisterHandler }} /> ); }; export default AuthContext;
Login.js file
import React from "react"; import "./LoginPage.css"; import AuthContext from "../store/auth-context"; import { useContext } from "react"; export default function LoginPage(props) { const loginCtx = useContext(AuthContext); return ( <div className="loginpage"> <form className="form-dimensions"> <div className="mb-4 custom-heading"> WELCOME BACK </div> <div className="mb-4 custom-subheading"> Login into your account </div> <div className="mb-3"> <label htmlFor="exampleInputEmail1" className="form-label email-custom-login form-color"> Email or Username </label> <input type="email" className="form-control" id="exampleInputEmail1" aria-describedby="emailHelp" placeholder="Enter your email or username" /> </div> <div className="mb-3"> <div className="label-inline"> <label htmlFor="exampleInputPassword1" className="form-label form-color password-custom-login label-inline"> Password </label> <label htmlFor="exampleInputPassword2" className="forgot-password-custom form-label form-color label-inline"> Forgot password? </label> </div> <input type="password" className="form-control" id="exampleInputPassword1" placeholder="Enter your password" /> </div> {console.log(loginCtx)} <button type="submit" className="btn btn-primary" onClick={loginCtx.onLogin} > Login now </button> <div className="custom-ending"> Not registered yet? <span>Register →</span> </div> </form> </div> ); }
Advertisement
Answer
I believe this is because your Auth Context provider does not render its children at all. You should render children in your return statement, like so:
return ( <AuthContext.Provider value={{ isLoggedIn: isLoggedIn, registerIsShown: registerIsShown, onLogin: submitLoginHandler, onShow: showRegisterHandler, onHide: hideRegisterHandler }} >{props.children}</AuthContext.Provider> );