React useEffect executes before mobx store updates

41 Views Asked by At

I have an react app where I check user is authorized with useEffect and mobx. But when useEffect checks store.isAuth it is false and idk after 10 ms it is true, but I am already on another page. Please help me!

I don't want to React navigate me on another page when useEffect checks store.isAuth

App.js

import React, { FC, useContext, useEffect, useState } from 'react';
import { Context } from "./index";
import { observer } from "mobx-react-lite";
import {BrowserRouter, Routes, Route, Navigate, useNavigate} from 'react-router-dom';
import AppRouter from './components/AppRouter';

const App = () => {
    const { store } = useContext(Context);
    const navigate = useNavigate();

    useEffect(() => {
        console.log(process.env.REACT_APP_API_URL)
        if (localStorage.getItem('token')) {
            store.checkAuth();
        }

        // getOrders();
    }, []);

    useEffect(() => {
        store.checkOrdersInWork();
    }, []);
    

    useEffect(() => {
        if (!store.isAuth) {
            console.log('NAVIGATE TO /login');
            navigate('/login');
        }
    }, []) // [store.isAuth]


    if (store.isLoading) {
        return <div>Загрузка...</div>
    }


    return (
            <div>
                <AppRouter/>
            </div>

    );
};

export default observer(App);

store.js

import {makeAutoObservable} from "mobx";
import AuthService from "../services/AuthService";
import axios from 'axios';
import OrderService from "../services/OrderService";

export default class Store {
    user = {};
    isAuth = false;
    isLoading = false;
    orderId = '';
    ordersInWork = [];

    constructor() {
        makeAutoObservable(this);
    }

    setAuth(bool) {
        this.isAuth = bool;
    }

    setOrdersInWork(orders) {
        this.ordersInWork = orders;
    }

    setUser(user) {
        this.user = user;
    }

    // setSborshik(bool) {
    //     this.isSborshik = bool;
    // }

    setLoading(bool) {
        this.isLoading = bool;
    }

    setOrderId(orderId) {
        this.orderId = orderId;
    }

    async login(email, password) {
        try {
            const response = await AuthService.login(email, password);
            console.log(response)
            localStorage.setItem('token', response.data.accessToken);
            this.setAuth(true);
            this.setUser(response.data.user);
            // this.setSborshik(this.sborshiks.includes(response.data.user.email))
            // console.log(this.isSborshik);
            console.log("УСПЕШНО")
            // console.log(this.sborshiks.includes(response.data.user.email))
        } catch (e) {
            console.log("ОШИБКА")
            console.log(e.response?.data?.message);
            alert(e.response?.data?.message);
        }
    }

    async registration(email, password, position) {
        try {
            const response = await AuthService.registration(email, password, position);
            console.log(response)
            localStorage.setItem('token', response.data.accessToken);
            this.setAuth(true);
            this.setUser(response.data.user);
            // this.setSborshik(this.sborshiks.includes(response.data.user.email))
            alert("УСПЕШНО!")
        } catch (e) {
            console.log(e.response?.data?.message);
            alert(e.response?.data?.message)
        }
    }

    async logout() {
        try {
            const response = await AuthService.logout();
            localStorage.removeItem('token');
            this.setAuth(false);
            this.setUser({});
        } catch (e) {
            console.log(e.response?.data?.message);
        }
    }

    async checkOrdersInWork() {
        try {
            const ordersInWork = await OrderService.getOrdersInWorkByUser(false).then(data => JSON.parse(data.data));
            // console.log(ordersInWork);
            this.setOrdersInWork(ordersInWork);

        } catch (e) {
            console.log(e.response?.data?.message);
        }
    }

    async checkAuth() {
        this.setLoading(true);
        try {
            const response = await axios.get(`${process.env.REACT_APP_API_URL}/refresh`, {withCredentials: true})
            console.log(response);
            localStorage.setItem('token', response.data.accessToken);
            this.setAuth(true);
            this.setUser(response.data.user);
        } catch (e) {
            console.log({message: e.response?.data?.message, code: e.response?.status});
        } finally {
            this.setLoading(false);
        }
    }
}

index.js

import React, { createContext } from 'react';
import ReactDOM from 'react-dom/client';
import App from './App';
import Store from "./store/store";
import { BrowserRouter } from 'react-router-dom';

export const store = new Store();

export const Context = createContext({
    store,
})

const root = ReactDOM.createRoot(document.getElementById('root'));

root.render(
    <Context.Provider value={{
        store
    }}>
        <BrowserRouter>
            <App />
        </BrowserRouter>

    </Context.Provider>
);
0

There are 0 best solutions below