2023-04-23 08:26:39 -05:00
// Copyright (C) 2022-present Daniel31x13 <daniel31x13@gmail.com>
// This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 3.
// This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
// You should have received a copy of the GNU General Public License along with this program. If not, see <https://www.gnu.org/licenses/>.
2023-02-24 11:32:28 -06:00
import { FontAwesomeIcon } from "@fortawesome/react-fontawesome" ;
2023-03-28 02:31:50 -05:00
import { signOut } from "next-auth/react" ;
2023-03-05 15:03:20 -06:00
import {
faPlus ,
2023-03-28 02:31:50 -05:00
faCircleUser ,
faSliders ,
faArrowRightFromBracket ,
faChevronDown ,
2023-04-30 15:54:40 -05:00
faBars ,
2023-03-05 15:03:20 -06:00
} from "@fortawesome/free-solid-svg-icons" ;
2023-05-01 05:07:01 -05:00
import { useEffect , useState } from "react" ;
2023-03-28 02:31:50 -05:00
import Dropdown from "@/components/Dropdown" ;
2023-05-08 09:35:39 -05:00
import Modal from "@/components/Modal" ;
import AddLink from "@/components/Modal/AddLink" ;
import ClickAwayHandler from "@/components/ClickAwayHandler" ;
import Sidebar from "@/components/Sidebar" ;
2023-05-01 05:07:01 -05:00
import { useRouter } from "next/router" ;
2023-05-08 09:35:39 -05:00
import Search from "@/components/Search" ;
2023-05-16 12:08:28 -05:00
import UserSettings from "./Modal/UserSettings" ;
2023-05-20 14:25:00 -05:00
import useAccountStore from "@/store/account" ;
2023-02-24 11:32:28 -06:00
export default function ( ) {
2023-05-20 14:25:00 -05:00
const { account } = useAccountStore ( ) ;
2023-02-24 11:32:28 -06:00
2023-03-28 02:31:50 -05:00
const [ profileDropdown , setProfileDropdown ] = useState ( false ) ;
2023-02-24 11:32:28 -06:00
2023-03-08 15:31:24 -06:00
const [ linkModal , setLinkModal ] = useState ( false ) ;
2023-05-16 12:08:28 -05:00
const [ settingsModal , setSettingsModal ] = useState ( false ) ;
2023-04-30 15:54:40 -05:00
const [ sidebar , setSidebar ] = useState ( false ) ;
2023-05-01 05:07:01 -05:00
const router = useRouter ( ) ;
2023-04-30 15:54:40 -05:00
window . addEventListener ( "resize" , ( ) = > setSidebar ( false ) ) ;
2023-05-01 05:07:01 -05:00
useEffect ( ( ) = > {
setSidebar ( false ) ;
} , [ router ] ) ;
2023-04-30 15:54:40 -05:00
const toggleSidebar = ( ) = > {
setSidebar ( ! sidebar ) ;
} ;
2023-02-24 11:32:28 -06:00
2023-03-08 15:31:24 -06:00
const toggleLinkModal = ( ) = > {
setLinkModal ( ! linkModal ) ;
2023-02-24 11:32:28 -06:00
} ;
2023-02-08 18:32:20 -06:00
2023-05-16 12:08:28 -05:00
const toggleSettingsModal = ( ) = > {
setSettingsModal ( ! settingsModal ) ;
} ;
2023-02-08 18:32:20 -06:00
return (
2023-05-18 13:02:17 -05:00
// lg:ml-64 xl:ml-80
2023-05-23 18:07:26 -05:00
< div className = "flex justify-between gap-2 items-center px-5 py-2 border-solid border-b-sky-100 border-b h-16" >
2023-04-30 15:54:40 -05:00
< div
onClick = { toggleSidebar }
2023-05-23 18:07:26 -05:00
className = "inline-flex lg:hidden gap-1 items-center select-none cursor-pointer p-2 text-sky-500 rounded-md hover:outline-sky-500 outline duration-100 bg-white outline-sky-100 outline-1"
2023-04-30 15:54:40 -05:00
>
2023-05-23 18:07:26 -05:00
< FontAwesomeIcon icon = { faBars } className = "w-6 h-6" / >
2023-04-30 15:54:40 -05:00
< / div >
2023-05-08 09:35:39 -05:00
< Search / >
2023-03-28 02:31:50 -05:00
< div className = "flex items-center gap-2" >
< div
2023-03-08 15:31:24 -06:00
onClick = { toggleLinkModal }
2023-05-23 18:07:26 -05:00
className = "inline-flex gap-1 items-center font-semibold select-none cursor-pointer px-2 sm:px-3 py-2 text-sky-500 hover:text-sky-600 rounded-md hover:outline-sky-500 outline duration-100 bg-white outline-sky-100 outline-1"
2023-03-28 02:31:50 -05:00
>
2023-05-23 18:07:26 -05:00
< FontAwesomeIcon icon = { faPlus } className = "w-6 h-6 sm:w-5 sm:h-5" / >
< span className = "hidden sm:block" > New Link < / span >
2023-03-28 02:31:50 -05:00
< / div >
2023-02-24 11:32:28 -06:00
2023-03-28 02:31:50 -05:00
< div className = "relative" >
< div
2023-05-23 18:07:26 -05:00
className = "flex gap-1 group items-center w-fit bg-white text-gray-600 cursor-pointer"
2023-03-28 02:31:50 -05:00
onClick = { ( ) = > setProfileDropdown ( ! profileDropdown ) }
id = "profile-dropdown"
>
2023-05-23 18:07:26 -05:00
{ account . profilePic ? (
< img
src = { account . profilePic }
2023-05-24 15:33:41 -05:00
className = "h-10 w-10 pointer-events-none rounded-full border-[3px] border-sky-100 group-hover:border-sky-500 duration-100"
2023-05-23 18:07:26 -05:00
alt = ""
/ >
) : (
< FontAwesomeIcon
icon = { faCircleUser }
className = "h-10 w-10 pointer-events-none group-hover:text-sky-600 duration-100"
/ >
) }
< div className = "pointer-events-none hidden sm:block group-hover:text-sky-600 duration-100" >
< div className = "flex item-center gap-1" >
< p className = "font-bold leading-3 hidden sm:block" >
{ account . name }
< / p >
< FontAwesomeIcon icon = { faChevronDown } className = "h-3 w-3" / >
< / div >
2023-03-28 02:31:50 -05:00
< / div >
< / div >
{ profileDropdown ? (
< Dropdown
items = { [
{
name : "Settings" ,
icon : < FontAwesomeIcon icon = { faSliders } / > ,
2023-05-16 12:08:28 -05:00
onClick : ( ) = > {
toggleSettingsModal ( ) ;
setProfileDropdown ( ! profileDropdown ) ;
} ,
2023-03-28 02:31:50 -05:00
} ,
{
name : "Logout" ,
icon : < FontAwesomeIcon icon = { faArrowRightFromBracket } / > ,
onClick : ( ) = > {
signOut ( ) ;
setProfileDropdown ( ! profileDropdown ) ;
} ,
} ,
] }
onClickOutside = { ( e : Event ) = > {
const target = e . target as HTMLInputElement ;
if ( target . id !== "profile-dropdown" ) setProfileDropdown ( false ) ;
} }
2023-05-23 18:07:26 -05:00
className = "absolute top-11 right-0 z-20 w-36"
2023-03-28 02:31:50 -05:00
/ >
) : null }
2023-04-30 15:54:40 -05:00
2023-05-16 12:08:28 -05:00
{ linkModal ? (
< Modal toggleModal = { toggleLinkModal } >
< AddLink toggleLinkModal = { toggleLinkModal } / >
< / Modal >
) : null }
{ settingsModal ? (
< Modal toggleModal = { toggleSettingsModal } >
< UserSettings toggleSettingsModal = { toggleSettingsModal } / >
< / Modal >
) : null }
2023-04-30 15:54:40 -05:00
{ sidebar ? (
< div className = "fixed top-0 bottom-0 right-0 left-0 bg-gray-500 bg-opacity-10 flex items-center fade-in z-30" >
< ClickAwayHandler onClickOutside = { toggleSidebar } >
2023-05-01 05:07:01 -05:00
< div className = "slide-right shadow-lg" >
2023-04-30 15:54:40 -05:00
< Sidebar / >
< / div >
< / ClickAwayHandler >
< / div >
) : null }
2023-03-28 02:31:50 -05:00
< / div >
2023-02-08 18:32:20 -06:00
< / div >
< / div >
) ;
2023-02-08 17:58:55 -06:00
}