Advertisement
ballistc

Untitled

Mar 10th, 2021
1,159
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. import Router, { useRouter } from 'next/router'
  2. import { createContext, ReactNode, useEffect, useState } from 'react';
  3. import api from '../services/api'
  4. import Cookies from 'js-cookie'
  5.  
  6. interface AuthContextData {
  7.   signUp(username: string, email: string, password: string): void
  8.   signIn(email: string, password: string): void
  9.   signOut(): void
  10.   user: {
  11.     username: string
  12.     email: string
  13.   }
  14.   error: string
  15.   loading: boolean
  16.   token: string
  17. }
  18. interface AuthProviderProps {
  19.   children: ReactNode
  20. }
  21. type User = {
  22.   username: string
  23.   email: string
  24. }
  25. export const AuthContext = createContext({} as AuthContextData)
  26.  
  27. export function AuthProvider({ children }: AuthProviderProps) {
  28.   const [user, setUser] = useState()
  29.   const [token, setToken] = useState("")
  30.   const [error, setError] = useState(null)
  31.   const { pathname, events } = useRouter()
  32.   const [loading, setLoading] = useState(true)
  33.  
  34.   useEffect(() => {
  35.     async function getStorageData() {
  36.       const Storagetoken = await Cookies.get("token")
  37.       const Storageuser = await Cookies.get("user")
  38.       api.defaults.headers.common['Authorization'] = `Bearer ${Storagetoken}`
  39.       if (Storageuser && Storagetoken) {
  40.         setUser(JSON.parse(Storageuser))
  41.         setLoading(false)
  42.         setToken(Storagetoken)
  43.         if (pathname === '/signup' || pathname === '/signin') {
  44.           await Router.push('/creategroup')
  45.         }
  46.       } else {
  47.         if (pathname === '/groups' || pathname === '/members' || pathname === '/creategroup') {
  48.           Router.push('/signin')
  49.         }
  50.       }
  51.  
  52.     } getStorageData()
  53.   }, [])
  54.  
  55.   useEffect(() => {
  56.     // Check that a new route is OK
  57.     const handleRouteChange = url => {
  58.       if (url !== '/' && !user) {
  59.         window.location.href = '/signin'
  60.       }
  61.     }
  62.  
  63.     // Check that initial route is OK
  64.     if (pathname !== '/' && user === null) {
  65.       window.location.href = '/'
  66.     }
  67.  
  68.     // Monitor routes
  69.     events.on('routeChangeStart', handleRouteChange)
  70.     return () => {
  71.       events.off('routeChangeStart', handleRouteChange)
  72.     }
  73.   }, [user])
  74.   async function signUp(username, email, password) {
  75.     try {
  76.  
  77.       const response = await api.post('/admin/signup', {
  78.         username,
  79.         email,
  80.         password
  81.       })
  82.       const token = response.data.token.token
  83.       let user = response.data.user
  84.       setUser(user)
  85.       setToken(token)
  86.       await Cookies.set("token", token)
  87.       await Cookies.set("user", JSON.stringify(user))
  88.       api.defaults.headers.common["Authorization"] = `Bearer ${token}`
  89.       Router.push('/creategroup')
  90.     } catch (err) {
  91.       setError("Esse usuário já existe")
  92.     }
  93.   }
  94.  
  95.   async function signIn(email, password) {
  96.     try {
  97.  
  98.       const response = await api.post('/admin/login', {
  99.         email,
  100.         password
  101.       })
  102.  
  103.       const token = response.data.token.token
  104.       const user = response.data.user
  105.  
  106.       setUser(user)
  107.       setToken(token)
  108.  
  109.       await Cookies.set("token", token)
  110.       await Cookies.set("user", JSON.stringify(user))
  111.  
  112.       api.defaults.headers.common["Authorization"] = `Bearer ${token}`
  113.  
  114.       Router.push('/creategroup')
  115.     }
  116.     catch (err) {
  117.       setError("Email ou senha inválidos")
  118.     }
  119.   }
  120.   async function signOut() {
  121.     Cookies.remove("user")
  122.     Cookies.remove("token")
  123.     setToken("")
  124.     setUser(null)
  125.     Router.push('/signin')
  126.   }
  127.   return (
  128.     <AuthContext.Provider value={{
  129.       signUp,
  130.       signIn,
  131.       signOut,
  132.       user,
  133.       error,
  134.       loading,
  135.       token
  136.     }}>
  137.  
  138.       {children}
  139.     </AuthContext.Provider>
  140.   )
  141. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement