| import React, { useState } from 'react' | |
| import { useNavigate } from 'react-router-dom' | |
| import { Button, Flex, Modal, Text, Title } from '@mantine/core' | |
| import { useDisclosure } from '@mantine/hooks' | |
| const Logout = () => { | |
| const [isOpen, { open, close }] = useDisclosure(false); | |
| const navigate = useNavigate(); | |
| const [isLoading, setIsLoading] = useState(false); | |
| const [errorMsg, setErrorMsg] = useState(""); | |
| const logoutHandler = async (evt) => { | |
| try { | |
| evt.preventDefault(); | |
| console.log('Logging out') | |
| setIsLoading(true); | |
| let logoutUrl = `${import.meta.env.VITE_BACKEND_HOST}/api/auth/logout` | |
| const response = await fetch(logoutUrl, { | |
| method: 'DELETE', credentials: 'include' | |
| }); | |
| const resData = await response.json(); | |
| setIsLoading(false); | |
| if (response.ok) { | |
| localStorage.removeItem('user'); | |
| localStorage.removeItem('loggedIn'); | |
| close(); | |
| return navigate('/login'); | |
| } else { | |
| return setErrorMsg(resData.message || "Something went wrong") | |
| } | |
| } catch (err) { | |
| setIsLoading(false) | |
| console.error(err) | |
| setErrorMsg("Something went wrong"); | |
| } | |
| } | |
| return ( | |
| <> | |
| <Modal opened={isOpen} onClose={close} title={<Title order={3}>Logout</Title>} centered> | |
| <Text>Are you sure you want to logout?</Text> | |
| <Flex gap={'sm'} my="20px"> | |
| <form onSubmit={logoutHandler}> | |
| <Button loading={isLoading} type="submit" color='red' px='xl'>Logout</Button> | |
| </form> | |
| <Button disabled={isLoading} color='gray'>Cancel</Button> | |
| </Flex> | |
| <Text style={{ color: 'red', fontWeight: '800' }}> | |
| {errorMsg} | |
| </Text> | |
| </Modal> | |
| <Button onClick={open} type="submit" color='red' size='md' px='xl'>Logout</Button> | |
| </> | |
| ) | |
| } | |
| export default Logout |