summaryrefslogtreecommitdiff
path: root/src/context/auth.js
blob: 59ccd82d66f69b0ed4a6d483e1d9ba5543c0cb77 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
import { createContext, useContext, useEffect, useState } from 'react';
import { CommonApi } from '../utils/mocks/api';

const AuthContext = createContext();

function AuthProvider(props) {
  const [state, setState] = useState({
    status: 'idle',
    user: null,
    error: null,
  });

  useEffect(() => {
    async function bootstrapUser() {
      const user = window.localStorage.getItem('$USER');
      if (user) {
        setState({ status: 'success', user: JSON.parse(user), error: null });
      }
    }
    bootstrapUser();
  }, []);

  const register = data => {
    setState({ ...state, status: 'pending' });

    return CommonApi.registerUser(data).then(data => {
      if (data.message) {
        return setState({ status: 'error', user: null, error: data });
      } else {
        return setState({ status: 'success', user: data, error: null });
      }
    });
  };

  const login = (email, password) => {
    setState({ ...state, status: 'pending' });

    return CommonApi.getUser(email, password).then(data => {
      if (data.message) {
        return setState({ status: 'error', user: null, error: data });
      } else {
        return setState({ status: 'success', user: data, error: null });
      }
    });
  };

  const logout = () => {
    setState({ status: 'success', user: null, error: null });
    window.localStorage.clear();
  };

  return (
    <AuthContext.Provider
      value={{ state, register, login, logout }}
      {...props}
    />
  );
}

function useAuthState() {
  const { state, register, login, logout } = useContext(AuthContext);
  const isPending = state.status === 'pending';
  const isError = state.status === 'error';
  const isSuccess = state.status === 'success';
  const isAuthenticated = state.user && isSuccess;

  return {
    user: state.user,
    error: state.error,
    isPending,
    isError,
    isSuccess,
    isAuthenticated,
    register,
    login,
    logout,
  };
}

export { AuthProvider, useAuthState };