11'use client' ;
22
33import Link from 'next/link' ;
4+ import clsx from 'clsx' ;
45import { useEffect , useState } from 'react' ;
56import { createRoot } from 'react-dom/client' ;
67import useSWR from 'swr' ;
8+ import Router from 'next/router' ;
79
810import { SetUsernameAndPassword } from '@/app/auth/modal' ;
911import { ChatList } from '@/components/chat/chat-list' ;
@@ -22,6 +24,9 @@ import MaskIcon from '@/icons/mask.svg';
2224import PremiumIcon from '@/icons/premium.svg' ;
2325import SettingsIcon from '@/icons/settings.svg' ;
2426import UserIcon from '@/icons/user.svg' ;
27+ import MoreIcon from '@/icons/more.svg' ;
28+ import LogoutIcon from '@/icons/logout.svg' ;
29+ import PersonIcon from '@/icons/person.svg' ;
2530import Locale from '@/locales' ;
2631import { useStore } from '@/store' ;
2732import styles from '@/styles/module/home.module.scss' ;
@@ -91,14 +96,15 @@ function bindPassword() {
9196 }
9297 } ;
9398 root . render (
94- < Modal title = { Locale . Auth . SetUp } onClose = { closeModal } >
99+ < Modal title = { Locale . Auth . SetUp } onClose = { closeModal } className = { styles [ 'force-auth-modal' ] } >
95100 < SetUsernameAndPassword onClose = { closeModal } />
96101 </ Modal > ,
97102 ) ;
98103}
99104
100105export function Sidebar ( { children } : { children : React . ReactNode } ) {
101106 const {
107+ setSessionToken,
102108 showSideBar,
103109 setShowSideBar,
104110 fetcher,
@@ -107,6 +113,7 @@ export function Sidebar({ children }: { children: React.ReactNode }) {
107113 config,
108114 } = useStore ( ) ;
109115 const [ newbtnExpanded , setNewbtnExpanded ] = useState < boolean > ( false ) ;
116+ const [ morebtnExpanded , setMorebtnExpanded ] = useState < boolean > ( false ) ;
110117
111118 useSWR ( '/announcement/recent' , ( url ) =>
112119 fetcher ( url )
@@ -159,11 +166,10 @@ export function Sidebar({ children }: { children: React.ReactNode }) {
159166
160167 return (
161168 < div
162- className = { `${
163- config . tightBorder && ! isMobileScreen ( )
164- ? styles [ 'tight-container' ]
165- : styles . container
166- } `}
169+ className = { `${ config . tightBorder && ! isMobileScreen ( )
170+ ? styles [ 'tight-container' ]
171+ : styles . container
172+ } `}
167173 >
168174 < div
169175 className = { styles . sidebar + ` ${ showSideBar && styles [ 'sidebar-show' ] } ` }
@@ -202,6 +208,7 @@ export function Sidebar({ children }: { children: React.ReactNode }) {
202208 onClick = { ( ) => {
203209 setShowSideBar ( false ) ;
204210 setNewbtnExpanded ( false ) ;
211+ setMorebtnExpanded ( false ) ;
205212 } }
206213 className = { styles [ 'link-full' ] }
207214 style = { { color : 'inherit' , textDecoration : 'inherit' } }
@@ -250,41 +257,92 @@ export function Sidebar({ children }: { children: React.ReactNode }) {
250257
251258 < div className = { styles [ 'sidebar-tail' ] } >
252259 { userData && < Premium userData = { userData } /> }
253- < Link
254- href = "/profile"
255- onClick = { ( ) => {
256- setShowSideBar ( false ) ;
257- } }
258- style = { { color : 'inherit' , textDecoration : 'inherit' } }
259- prefetch = { true }
260- className = { styles [ 'link-full' ] }
261- >
262- < div className = { styles [ 'sidebar-accountbtn' ] } >
263- < div
264- className = { styles [ 'sidebar-account' ] }
260+ < div className = { styles [ 'sidebar-accountbtn' ] } >
261+ < div className = { morebtnExpanded ? styles [ 'sidebar-account-ext' ] : clsx ( styles [ 'sidebar-account-ext' ] , styles [ 'sidebar-account-ext-dis' ] ) } >
262+ < Link
263+ href = "/profile"
265264 onClick = { ( ) => {
266265 setShowSideBar ( false ) ;
266+ setNewbtnExpanded ( false ) ;
267+ setMorebtnExpanded ( false ) ;
267268 } }
269+ className = { styles [ 'link-full' ] }
270+ style = { { color : 'inherit' , textDecoration : 'inherit' } }
268271 >
269- < div className = { styles [ 'avatar' ] } >
270- < UserIcon />
271- </ div >
272- < div className = { styles [ 'account-name' ] } >
273- { userData ?. name ?? Locale . Index . DefaultUser }
272+ < div className = { styles [ 'sidebar-account-ext-item' ] } >
273+ < div className = { styles [ 'icon' ] } >
274+ < PersonIcon />
275+ </ div >
276+ < div className = { styles [ 'text' ] } >
277+ { Locale . Index . Profile }
278+ </ div >
274279 </ div >
275- </ div >
280+ </ Link >
276281 < Link
277282 href = "/settings"
278283 onClick = { ( ) => {
279284 setShowSideBar ( false ) ;
285+ setNewbtnExpanded ( false ) ;
286+ setMorebtnExpanded ( false ) ;
280287 } }
288+ className = { styles [ 'link-full' ] }
289+ style = { { color : 'inherit' , textDecoration : 'inherit' } }
281290 >
282- < div className = { styles [ 'account-settingbtn' ] } >
291+ < div className = { styles [ 'sidebar-account-ext-item' ] } >
292+ < div className = { styles [ 'icon' ] } >
283293 < SettingsIcon />
284294 </ div >
295+ < div className = { styles [ 'text' ] } >
296+ { Locale . Index . Settings }
297+ </ div >
298+ </ div >
299+ </ Link >
300+ < Link
301+ href = "/announcement"
302+ onClick = { ( ) => {
303+ setShowSideBar ( false ) ;
304+ setNewbtnExpanded ( false ) ;
305+ setMorebtnExpanded ( false ) ;
306+ } }
307+ className = { styles [ 'link-full' ] }
308+ style = { { color : 'inherit' , textDecoration : 'inherit' } }
309+ >
310+ < div className = { styles [ 'sidebar-account-ext-item' ] } >
311+ < div className = { styles [ 'icon' ] } >
312+ < AnnouncementIcon />
313+ </ div >
314+ < div className = { styles [ 'text' ] } >
315+ { Locale . Index . Announcement }
316+ </ div >
317+ </ div >
285318 </ Link >
319+ < div className = { styles [ 'sidebar-account-ext-item' ] } onClick = { ( ) => {
320+ setSessionToken ( undefined ) ;
321+ setShowSideBar ( false ) ;
322+ setNewbtnExpanded ( false ) ;
323+ setMorebtnExpanded ( false ) ;
324+ Router . reload ( ) ;
325+ } } >
326+ < div className = { styles [ 'icon' ] } >
327+ < LogoutIcon />
328+ </ div >
329+ < div className = { styles [ 'text' ] } >
330+ { Locale . Index . LogOut }
331+ </ div >
332+ </ div >
286333 </ div >
287- </ Link >
334+ < div className = { styles [ 'sidebar-account' ] } onClick = { ( ) => setMorebtnExpanded ( ! morebtnExpanded ) } >
335+ < div className = { styles [ 'avatar' ] } >
336+ < UserIcon />
337+ </ div >
338+ < div className = { styles [ 'account-name' ] } >
339+ { userData ?. name ?? Locale . Index . DefaultUser }
340+ </ div >
341+ < div className = { styles [ 'account-settingbtn' ] } >
342+ < MoreIcon />
343+ </ div >
344+ </ div >
345+ </ div >
288346 </ div >
289347 </ div >
290348 < div className = { styles [ 'window-content' ] } > { children } </ div >
0 commit comments