// imports import clsx from 'clsx'; import Link from 'next/link'; import setLanguage from 'next-translate/setLanguage'; import useTranslation from 'next-translate/useTranslation'; import { usePathname } from 'next/navigation'; import React, { useEffect, useMemo, useState } from 'react'; // icons import IconSun from '../../../icons/Sun'; import IconUser from '../../../icons/User'; import IconMoon from '../../../icons/Moon'; import IconLogin from '../../../icons/Login'; import IconLogout from '../../../icons/Logout'; import IconSettings from '../../../icons/Settings'; import IconLanguage from '../../../icons/Language'; import IconInfluence from '../../../icons/Influence'; // signals import UserSignal from '../../../signals/User'; import LoginSignal from '../../../signals/Login'; import ThemeSignal from '../../../signals/Theme'; import RegisterSignal from '../../../signals/Register'; import Signal, { useSignal } from '../../../signal'; // locals import User from './User'; import Language from '../../Language'; // signals export const openMobile = new Signal.State(false); // width export const width = '64'; /** * leftbar * * @param props */ const ComponentLayoutRightbar = (props = {}) => { // signals const [user] = useSignal(UserSignal); const [,setLogin] = useSignal(LoginSignal); const [,setRegister] = useSignal(RegisterSignal); const [theme, setTheme] = useSignal(ThemeSignal); const [sOpenMobile, setOpenMobile] = useSignal(openMobile); // router const path = usePathname(); // translation const { t : tSidebar, lang } = useTranslation('sidebar'); // state const [ready, setReady] = useState(false); const [langOpen, setLangOpen] = useState(false); /** * on language * * @param code */ const onLanguage = async (code) => { // import cookie const Cookie = (await import('js-cookie')).default; // set language Cookie.set('NEXT_LOCALE', code, { expires : 365, }); setLanguage(code); setLangOpen(false); }; // items const navigation = useMemo(() => { // return return [ { id : 'profile', icon : IconUser, name : tSidebar('profile.title'), href : user?.id && '/profile', onClick : !user?.id && (() => setLogin(true)), current : path.startsWith('/profile') }, ...(user?.id ? [{ id : 'mana', href : '/mana', icon : IconInfluence, name : tSidebar('mana.title', { value : parseFloat(user?.wallet?.mana || 0).toLocaleString(), }), current : path.startsWith('/mana'), }] : []), { id : 'settings', href : user?.id && '/settings', icon : IconSettings, name : tSidebar('settings.title'), onClick : !user?.id && (() => setLogin(true)), current : path.startsWith('/settings'), }, 'divider', { id : 'lang', name : tSidebar('language.title'), icon : IconLanguage, onClick : () => setLangOpen(true), current : false, }, ...(props.noThemeMode ? [] : [{ id : 'theme', name : theme === 'dark' ? tSidebar('light.title') : tSidebar('dark.title'), icon : theme === 'dark' ? IconSun : IconMoon, onClick : () => setTheme(theme === 'dark' ? 'light' : 'dark'), current : false, }]), 'divider', ...(user?.id ? [{ id : 'logout', name : tSidebar('logout.title'), icon : IconLogout, onClick : props.onLogout, current : false, }] : [ { id : 'login', name : tSidebar('login.title'), icon : IconLogin, onClick : () => setLogin(true), current : path.startsWith('/login'), }, { id : 'register', name : tSidebar('register.title'), icon : IconLogin, onClick : () => setRegister(true), current : path.startsWith('/register'), } ]), ]; }, [path, user?.id, theme]); // use effect useEffect(() => { // set ready setReady(true); }, []); // return jsx return ( <>
setOpenMobile(!sOpenMobile)} />
{/* Static sidebar for desktop */}
{/* Sidebar component, swap this element with another sidebar if you like */}
setLangOpen(false)} onChange={onLanguage} language={lang} /> ); }; /** * export default */ export default ComponentLayoutRightbar;