import { useEffect } from "react"; import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; import { faFileCirclePlus, faFilePen, faUserGear, faUserPlus, faRightFromBracket, } from "@fortawesome/free-solid-svg-icons"; import { useNavigate, Link, useLocation } from "react-router-dom"; import { useSendLogoutMutation } from "../features/auth/authApiSlice"; const DASH_REGEX = /^\/dash(\/)?$/; const NOTES_REGEX = /^\/dash\/todos(\/)?$/; const USERS_REGEX = /^\/dash\/users(\/)?$/; const DashHeader = () => { const navigate = useNavigate(); const { pathname } = useLocation(); const [sendLogout, { isLoading, isSuccess, isError, error }] = useSendLogoutMutation(); useEffect(() => { if (isSuccess) navigate("/"); }, [isSuccess, navigate]); const onNewTodoClicked = () => navigate("/dash/todos/new"); const onNewUserClicked = () => navigate("/dash/users/new"); const onTodosClicked = () => navigate("/dash/todos"); const onUsersClicked = () => navigate("/dash/users"); if (isLoading) return <p>Logging Out...</p>; if (isError) return <p>Error: {error.data?.message}</p>; let dashClass = null; if ( !DASH_REGEX.test(pathname) && !NOTES_REGEX.test(pathname) && !USERS_REGEX.test(pathname) ) { dashClass = "dash-header__container--small"; } let newTodoButton = null; if (NOTES_REGEX.test(pathname)) { newTodoButton = ( <button className="icon-button" title="New Todo" onClick={onNewTodoClicked} > <FontAwesomeIcon icon={faFileCirclePlus} /> </button> ); } let newUserButton = null; if (USERS_REGEX.test(pathname)) { newUserButton = ( <button className="icon-button" title="New User" onClick={onNewUserClicked} > <FontAwesomeIcon icon={faUserPlus} /> </button> ); } let userButton = null; if (!USERS_REGEX.test(pathname) && pathname.includes("/dash")) { userButton = ( <button className="icon-button" title="Users" onClick={onUsersClicked}> <FontAwesomeIcon icon={faUserGear} /> </button> ); } let todosButton = null; if (!NOTES_REGEX.test(pathname) && pathname.includes("/dash")) { todosButton = ( <button className="icon-button" title="Todos" onClick={onTodosClicked}> <FontAwesomeIcon icon={faFilePen} /> </button> ); } const logoutButton = ( <button className="icon-button" title="Logout" onClick={sendLogout}> <FontAwesomeIcon icon={faRightFromBracket} /> </button> ); const errClass = isError ? "errmsg" : "offscreen"; let buttonContent; if (isLoading) { buttonContent = <p>Logging Out...</p>; } else { buttonContent = ( <> {newTodoButton} {newUserButton} {todosButton} {userButton} {logoutButton} </> ); } const content = ( <> <p className={errClass}>{error?.data?.message}</p> <header className="dash-header"> <div className={`dash-header__container ${dashClass}`}> <Link to="/dash"> <h1 className="dash-header__title">TODO-APP API</h1> </Link> <nav className="dash-header__nav">{buttonContent}</nav> </div> </header> </> ); return content; }; export default DashHeader;