@PHPjedi

Ректные джедаи, где лучше всего разместить следующий код?

Добрый вечер!

У меня уже приложение готово! Ура-ура! Но есть следующий кусок кода, который я не могу найти "правильное" на интуитивном плане место.

if (localStorage.getItem('jwtToken')) {
    const decoded_jwt = jwt_decode(localStorage.getItem('jwtToken'));
    store.dispatch(setCurrentUser(decoded_jwt));

    const current_time = Date.now() / 1000;

    if (current_time > decoded_jwt.exp) {
        store.dispatch(refresh())
    }
}


Я проверяю, а нет ли у нас токен в localStorage? Если есть, то сообщаем об этом (dispatch`им), а что если вдруг токен уже сгорел(протух), сообщаем об этом (сучим).

Вот можно вставить этот код где-то здесь (index.js):

import React from 'react';
import ReactDOM from 'react-dom';
import { Provider } from 'react-redux';
import store from './redux/store';
import { BrowserRouter } from 'react-router-dom';
import App from './components/App';

ReactDOM.render(<Provider store={store}><BrowserRouter><App /></BrowserRouter></Provider>, document.getElementById('app'));


Сейчас он вот здесь (App.js - Component):

import React, { Component } from 'react';
import NavigationBar from "./NavigationBar";
import { Switch, Route } from 'react-router-dom';
import Home from "./Home.page";
import Login from "./Login.page";
import Register from "./Register.page";
import Profile from "./Profile.page";
import NotFound from "./NotFound.page";

import jwt_decode from 'jwt-decode';
import store from '../redux/store';
import { setCurrentUser, refresh } from '../redux/actions/authActions';

if (localStorage.getItem('jwtToken')) {
    const decoded_jwt = jwt_decode(localStorage.getItem('jwtToken'));
    store.dispatch(setCurrentUser(decoded_jwt));

    const current_time = Date.now() / 1000;

    if (current_time > decoded_jwt.exp) {
        store.dispatch(refresh())
    }
}

class App extends Component {
    render() {
        return (
            <div>
                <header>
                    <NavigationBar/>
                </header>
                <main>
                    <Switch>
                        <Route exact path="/" component={Home}/>
                        <Route exact path="/login" component={Login}/>
                        <Route exact path="/register" component={Register}/>
                        <Route exact path="/profile" component={Profile}/>
                        <Route component={NotFound}/>
                    </Switch>
                </main>
            </div>
        );
    }
}

export default App;


1. Как вам идея разместить самый первый код (код проверки токена) в ComponentWillMount() в компоненте App (App.js)?

Посоветуйте, пожалуйста, куда грамотнее будет это вставить?

Заранее большое спасибо!
  • Вопрос задан
  • 74 просмотра
Решения вопроса 1
kshshe
@kshshe
Frontend developer
Предложение больше не по месту проверки, а по файловой структуре.
Можно завести файл вроде jwtTokenChecker.js, поместить туда функцию для проверки (чтобы не смешивать ее с другим файлом):
import jwt_decode from 'jwt-decode';

import store from './redux/store';
import { setCurrentUser, refresh } from './redux/actions/authActions';

export default () => {
	if (localStorage.getItem('jwtToken')) {
	    const decoded_jwt = jwt_decode(localStorage.getItem('jwtToken'));
	    store.dispatch(setCurrentUser(decoded_jwt));

	    const current_time = Date.now() / 1000;

	    if (current_time > decoded_jwt.exp) {
	        store.dispatch(refresh())
	    }
	}
}


Потом где-нибудь при ините, например, в index.js, когда стор уже готов, сделать так:
import checkJwtToken from './jwtTokenChecker';

checkJwtToken();


Что касается расположения, я бы поместил в index или в инит стора, потому что кажется, что без этих данных еще нет смысла рендерить приложение.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы