|
@@ -0,0 +1,131 @@
|
|
|
+import React, {Component, useState, useEffect} from 'react';
|
|
|
+import logo from './logo.svg';
|
|
|
+import {createStore} from 'redux';
|
|
|
+import {Provider, connect} from 'react-redux';
|
|
|
+import './App.css';
|
|
|
+import jwt_decode from "jwt-decode";
|
|
|
+
|
|
|
+
|
|
|
+const getGQL = url =>
|
|
|
+ (query, variables={}) =>
|
|
|
+ fetch(url,
|
|
|
+ {method: 'POST',
|
|
|
+ headers: {
|
|
|
+ 'Accept': 'application/json',
|
|
|
+ 'Content-Type': 'application/json',
|
|
|
+ ...(localStorage.authToken ? {Authorization: `Bearer ${localStorage.authToken}`} : {})
|
|
|
+ },
|
|
|
+ body: JSON.stringify({query,variables})})
|
|
|
+ .then(res => res.json())
|
|
|
+
|
|
|
+
|
|
|
+const gql = getGQL('http://shop-roles.asmer.fs.a-level.com.ua/graphql');
|
|
|
+
|
|
|
+const actionLogin = (login, password) => {
|
|
|
+ return gql(
|
|
|
+ `query login($login:String, $password:String) {
|
|
|
+ login(login:$login,password:$password)
|
|
|
+ }`,
|
|
|
+ {login, password}
|
|
|
+ );
|
|
|
+}
|
|
|
+
|
|
|
+function authReducer(state, action){
|
|
|
+ console.log('state', state);
|
|
|
+ console.log('action', action);
|
|
|
+
|
|
|
+ if (state === undefined){
|
|
|
+ if(localStorage.authToken && localStorage.authToken !== 'null') {
|
|
|
+ return {token: localStorage.authToken, payload: jwt_decode(localStorage.authToken)}
|
|
|
+ }
|
|
|
+
|
|
|
+ return {}
|
|
|
+ }
|
|
|
+
|
|
|
+ if (action.type === 'LOGIN'){
|
|
|
+ console.log('ЛОГИН');
|
|
|
+ localStorage.authToken = action.jwt;
|
|
|
+ return {token: action.jwt, payload: jwt_decode(action.jwt)};
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+ }
|
|
|
+ if (action.type === 'LOGOUT') {
|
|
|
+ console.log('ЛОГАУТ');
|
|
|
+ localStorage.authToken = "";
|
|
|
+ return {}
|
|
|
+ }
|
|
|
+ return state
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
+const actionAuthLogin = jwt => ({type: 'LOGIN', jwt})
|
|
|
+const actionAuthLogout = () => ({type: 'LOGOUT'})
|
|
|
+
|
|
|
+const ButtonLogout = ({onLogout}) => {
|
|
|
+ const [isLoggin, isLoginIn] = useState(!!store.getState().token)
|
|
|
+ store.subscribe(() => isLoginIn(store.getState().token))
|
|
|
+
|
|
|
+ return(
|
|
|
+ <>
|
|
|
+ <button onClick={onLogout}
|
|
|
+ disabled={!isLoggin}>Logout</button>
|
|
|
+ </>)
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+const FormLogin = ({onLogin}) => {
|
|
|
+ const [isLoggin, isLoginIn] = useState(!!store.getState().token);
|
|
|
+ const [pass1, setPass1] = useState("");
|
|
|
+ const [pass2, setPass2] = useState("");
|
|
|
+
|
|
|
+ store.subscribe(() => isLoginIn(store.getState().token))
|
|
|
+ return(
|
|
|
+ <>
|
|
|
+ <input type="text" placeholder = "login" onChange={(e) => {
|
|
|
+ setPass1(e.target.value);
|
|
|
+ }}/>
|
|
|
+ <input type="password" placeholder = "password"
|
|
|
+ onChange={(e) => {
|
|
|
+ setPass2(e.target.value);
|
|
|
+ }}/>
|
|
|
+ <button onClick={() => onLogin(pass1, pass2)}
|
|
|
+ disabled={isLoggin}>Login</button>
|
|
|
+ </>)}
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+const CButtonLogout = connect(s => ({isLoggedIn: s.login}),{onLogout: actionAuthLogout})(ButtonLogout);
|
|
|
+const CFormLogin = connect(s => ({isLoggedIn: s.login}),{onLogin: actionLogin,})(FormLogin);
|
|
|
+
|
|
|
+const store = createStore(authReducer)
|
|
|
+
|
|
|
+store.subscribe(() => console.log(store.getState()))
|
|
|
+
|
|
|
+
|
|
|
+const App = () =>
|
|
|
+<div>
|
|
|
+ <Provider store={store}>
|
|
|
+ <CFormLogin />
|
|
|
+ <CButtonLogout />
|
|
|
+ {
|
|
|
+ actionLogin(login, password).then(res => {
|
|
|
+ if(res.data.login) {
|
|
|
+ store.dispatch({type: 'LOGIN', jwt: res.data.login});
|
|
|
+ }
|
|
|
+
|
|
|
+ });
|
|
|
+ }}/>
|
|
|
+ <ButtonLogout onLogout={() => store.dispatch(actionAuthLogout())} /> */}
|
|
|
+ </Provider>
|
|
|
+</div>
|
|
|
+
|
|
|
+export default App;
|