mirror of
https://github.com/NapNeko/NapCatQQ.git
synced 2025-12-27 19:31:22 +08:00
94 lines
2.7 KiB
TypeScript
94 lines
2.7 KiB
TypeScript
import { Button } from '@heroui/button'
|
|
import { Image } from '@heroui/image'
|
|
import clsx from 'clsx'
|
|
import { motion } from 'motion/react'
|
|
import React from 'react'
|
|
import { IoMdLogOut } from 'react-icons/io'
|
|
import { MdDarkMode, MdLightMode } from 'react-icons/md'
|
|
|
|
import useAuth from '@/hooks/auth'
|
|
import useDialog from '@/hooks/use-dialog'
|
|
import { useTheme } from '@/hooks/use-theme'
|
|
|
|
import logo from '@/assets/images/logo.png'
|
|
import type { MenuItem } from '@/config/site'
|
|
|
|
import Menus from './menus'
|
|
|
|
interface SideBarProps {
|
|
open: boolean
|
|
items: MenuItem[]
|
|
}
|
|
|
|
const SideBar: React.FC<SideBarProps> = (props) => {
|
|
const { open, items } = props
|
|
const { toggleTheme, isDark } = useTheme()
|
|
const { revokeAuth } = useAuth()
|
|
const dialog = useDialog()
|
|
const onRevokeAuth = () => {
|
|
dialog.confirm({
|
|
title: '退出登录',
|
|
content: '确定要退出登录吗?',
|
|
onConfirm: revokeAuth
|
|
})
|
|
}
|
|
return (
|
|
<motion.div
|
|
className={clsx(
|
|
'overflow-hidden fixed top-0 left-0 h-full z-50 bg-background md:bg-transparent md:static shadow-md md:shadow-none rounded-r-md md:rounded-none'
|
|
)}
|
|
initial={{ width: 0 }}
|
|
animate={{ width: open ? '16rem' : 0 }}
|
|
transition={{
|
|
type: open ? 'spring' : 'tween',
|
|
stiffness: 150,
|
|
damping: open ? 15 : 10
|
|
}}
|
|
style={{ overflow: 'hidden' }}
|
|
>
|
|
<motion.div className="w-64 flex flex-col items-stretch h-full transition-transform duration-300 ease-in-out z-30 relative float-right">
|
|
<div className="flex justify-center items-center my-2 gap-2">
|
|
<Image radius="none" height={40} src={logo} className="mb-2" />
|
|
<div
|
|
className={clsx(
|
|
'flex items-center font-bold',
|
|
'!text-2xl shiny-text'
|
|
)}
|
|
>
|
|
NapCat
|
|
</div>
|
|
</div>
|
|
<div className="overflow-y-auto flex flex-col flex-1 px-4">
|
|
<Menus items={items} />
|
|
<div className="mt-auto mb-10 md:mb-0">
|
|
<Button
|
|
className="w-full"
|
|
color="primary"
|
|
radius="full"
|
|
variant="light"
|
|
onPress={toggleTheme}
|
|
startContent={
|
|
!isDark ? <MdLightMode size={16} /> : <MdDarkMode size={16} />
|
|
}
|
|
>
|
|
切换主题
|
|
</Button>
|
|
<Button
|
|
className="w-full mb-2"
|
|
color="primary"
|
|
radius="full"
|
|
variant="light"
|
|
onPress={onRevokeAuth}
|
|
startContent={<IoMdLogOut size={16} />}
|
|
>
|
|
退出登录
|
|
</Button>
|
|
</div>
|
|
</div>
|
|
</motion.div>
|
|
</motion.div>
|
|
)
|
|
}
|
|
|
|
export default SideBar
|