'Context doesn't update in React.js. how to implement a solution?

in react i have tried to implement a solution to forward values with context. but my context doesn't work in another page(component)

this is my MainPage where user logins in login part what i want is ; i want to check login here and if login res != null then i want to set these res data into context values and use them in the bookPage

  import React from  "react"; 
import{ useContext, useEffect, useState } from "react";
import { TextField } from "@mui/material";
import { Button } from "@mui/material";
import "./Pages.css";
import { AccountContext } from "./AccountProvider";
import { useHistory } from "react-router-dom";
import axios from "axios";


function MainPage() {
  const [email, setEmail1] = useState("");
  const [password, setPassword1] = useState("");
  const [name, setName1] = useState("");


  const [loginemail, setloginEmail] = useState("");
  const [loginpassword, setloginPassword] = useState("");
  

  const [registeremail, setregisterEmail] = useState("");
  const [registerpassword, setregisterPassword] = useState("");
  const [registername, setregisterName] = useState("");

  const {
    Name,
    Mail,
    Password,
    UID,
 
    setName,
    setPassword,
    setMail,
    setUID,
 
  } = useContext(AccountContext);

 
  let history = useHistory();

  const [data,setData] = useState([]);


  const LoginClick =  () => {
    
      setEmail1(loginemail);
      setPassword1(loginpassword);


      axios
      .get( `http://localhost:5000/getLogin/?email=${email}&password=${password}`)
      .then((resp) => {

        
          setUID(resp.data[0]._id)
          setName(resp.data[0].name)
          setMail(resp.data[0].email)
          setPassword(resp.data[0].password)

          console.log(UID)
          if (resp.data[0]._id != null) {
          
            history.push("/BookPage")
            history.go()
          }
        

          })
          .catch((e) => {
            alert(e);
          });

  

    
    };

 


  const RegisterClick = async (e) => {

     setEmail1(registeremail);
     setName1(registername);
     setPassword1(registerpassword);

     console.log(email,  password)

    let res = await fetch("http://localhost:5000/registerUser", {
      method: "post",
      body: JSON.stringify({ name, email, password }),
      headers: {
        "Content-Type": "application/json",
      },
    });
    res = await res.json();
    console.warn(res);
    if (res) {
      alert("Registered success");
      setName1("");
      setPassword1("");
      setEmail1("");
      history.push("/BookPage");
    }
    if (!res) {
      alert("registered failed");
    }
  };

  return (
    <>
      <div class="main-page">
        <h1>Welcome to the Library Management System!!! </h1>
        <div class="user-form">
          <div class="login-form">
            <h2>User Login </h2>
            <TextField
              id="loginemail"
              label="email"
              variant="filled"
              type="email"
              value={loginemail}
              onChange={(e) => {setloginEmail(e.target.value)
                setEmail1(e.target.value)
                setMail(e.target.value)
              }}
            />
            <TextField
              id="loginpassword"
              label="password"
              variant="filled"
              type="password"
              value={loginpassword}
              onChange={(e) => {setloginPassword(e.target.value) 
                setPassword1(e.target.value)
                setPassword(e.target.value)
              }}
            />
            <Button variant="outlined" onClick={LoginClick 
            
            }>
              {" "}
              Login
            </Button>
          </div>
          <div class="register-form">
            <h2>New User? Register Here!</h2>
            <TextField
              id="registername"
              label="name"
              variant="filled"
              value={registername}
              onChange={(e) => {setregisterName(e.target.value)
              setName1(e.target.value)}}
            />
            <TextField
              id="regsiteremail"
              label="email"
              variant="filled"
              type="email"
              value={registeremail}
              onChange={(e) => {setregisterEmail(e.target.value)
                setEmail1(e.target.value)
              }}
            />
            <TextField
              id="registerpassword"
              label="password"
              variant="filled"
              value={registerpassword}
              onChange={(e) => {setregisterPassword(e.target.value)
                setPassword1(e.target.value)
              }}
            />
            <Button variant="outlined" onClick={RegisterClick}>
              {" "}
              Register
            </Button>
          </div>
        </div>
      </div>
    </>
  );
}

export default MainPage;




this is my bookPage and here i want to use my user data even on title (h1) it doesn't shown in there i tried to console.log but it doesn't worked either somehow these values doesn't change or update

import React from "react";
import { AccountContext } from "./AccountProvider";

export default function BookPage() {

const { Id, Name, Email, Password, setID, setName, setEmail, setPassword } =
    useContext(AccountContext);  //this is where i expect to get values from mainPage

 return (
    <>
      <div className="book-page">
        <h1>
          Welcome , {Id} {Email} {Name}
        </h1>
    </>
)


}

this is the context i try to use



import { createContext, useState } from "react";
import React from "react";

const AccountContext = createContext();

function AccountProvider(props) {
  const [Mail, setMail] = useState("");
  const [Password, setPassword] = useState("");
  const [UID, setUID] = useState("");
  const [Name,setName] = useState("");  
  return (
    <AccountContext.Provider
      value={{
        Mail: Mail,
        Password: Password,  
        UID: UID,
        Name:Name,

        setMail,
        setPassword,

        setUID,
        setName,
        
      }}
    >
      {props.children}
    </AccountContext.Provider>
  );
}

export {AccountContext, AccountProvider};


and this is the index.js

import React from "react";
import ReactDOM from "react-dom/client";
import "./index.css";
import App from "./App";
import reportWebVitals from "./reportWebVitals";
import { AccountProvider } from "./PAGES/AccountProvider";


const root = ReactDOM.createRoot(document.getElementById("root"));
root.render(
  <React.StrictMode>
   <AccountProvider>
      <App />
   </AccountProvider>
  </React.StrictMode>
);


i have tried many solutions but i couldn't found any of them work

edit(1)

this is my routerPage


import React from "react";
import MainPage from "./MainPage";
import Deneme from "./deneme";

import { Router, Switch, Route } from "react-router-dom";
import BookPage from "./BookPage";
import { createBrowserHistory } from "history";


export default function RouterPage() {
  let history= createBrowserHistory();

  return (
    <div>
      <Router history={history}>
        <Switch>
          <Route exact path="/">
            <MainPage />
          </Route>
          <Route exact path="/BookPage">
            <BookPage />
          </Route>
          <Route path="/deneme">
            <Deneme />
          </Route>
        </Switch>
      </Router>
    </div>
  );
}


and in the app component


import React from 'react';
import RouterPage from "./PAGES/RouterPage.js";



function App() {
  return (
   
    <RouterPage/>
   
  );
}

export default App;





Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source