实现响应式导航栏组件

This commit is contained in:
2025-06-18 17:57:12 +08:00
parent ba7d22168d
commit 39f30fcfa9
29 changed files with 742 additions and 223 deletions

View File

@@ -8,7 +8,7 @@ import Image from 'next/image'
import alipay from '@/components/composites/purchase/_assets/alipay.svg'
import wechat from '@/components/composites/purchase/_assets/wechat.svg'
import balance from '@/components/composites/purchase/_assets/balance.svg'
import {useProfileStore} from '@/components/providers/StoreProvider'
import {useProfileStore} from '@/app/stores'
import RechargeModal from '@/components/composites/recharge'
import Pay from '@/components/composites/purchase/pay'
import {buttonVariants} from '@/components/ui/button'

View File

@@ -6,7 +6,7 @@ import wechat from './_assets/wechat.svg'
import balance from './_assets/balance.svg'
import Image from 'next/image'
import {useEffect, useRef, useState} from 'react'
import {useProfileStore} from '@/components/providers/StoreProvider'
import {useProfileStore} from '@/app/stores'
import {Alert, AlertTitle} from '@/components/ui/alert'
import {ApiResponse, ExtraResp, ExtraReq} from '@/lib/api'
import {toast} from 'sonner'

View File

@@ -8,7 +8,7 @@ import Image from 'next/image'
import alipay from '@/components/composites/purchase/_assets/alipay.svg'
import wechat from '@/components/composites/purchase/_assets/wechat.svg'
import balance from '@/components/composites/purchase/_assets/balance.svg'
import {useProfileStore} from '@/components/providers/StoreProvider'
import {useProfileStore} from '@/app/stores'
import RechargeModal from '@/components/composites/recharge'
import {buttonVariants} from '@/components/ui/button'
import Link from 'next/link'

View File

@@ -21,7 +21,7 @@ import {useEffect, useMemo, useRef, useState} from 'react'
import {Loader} from 'lucide-react'
import {RechargeByPay, RechargeByAlipayConfirm, RechargeByWechat, RechargeByWechatConfirm} from '@/actions/user'
import * as qrcode from 'qrcode'
import {useProfileStore} from '@/components/providers/StoreProvider'
import {useProfileStore} from '@/app/stores'
import {merge} from '@/lib/utils'
import {
Platform,

View File

@@ -1,19 +1,21 @@
'use client'
import {useProfileStore} from '@/components/providers/StoreProvider'
import {useProfileStore} from '@/app/stores'
import {Button} from '@/components/ui/button'
import {DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuTrigger} from '@/components/ui/dropdown-menu'
import {Avatar, AvatarFallback, AvatarImage} from '@/components/ui/avatar'
import {LogOutIcon, UserIcon, UserPenIcon} from 'lucide-react'
import {LoaderIcon, LogOutIcon, UserIcon, UserPenIcon} from 'lucide-react'
import {usePathname, useRouter} from 'next/navigation'
import {logout} from '@/actions/auth'
import {useState} from 'react'
import {HoverCard, HoverCardContent, HoverCardTrigger} from '@/components/ui/hover-card'
import {User} from '@/lib/models'
export default function UserCenter() {
type UserCenterProps = {
profile: User
}
export default function UserCenter(props: UserCenterProps) {
const router = useRouter()
// 登录控制
const profile = useProfileStore(store => store.profile)
const refreshProfile = useProfileStore(store => store.refreshProfile)
const doLogout = async () => {
const resp = await logout()
@@ -31,13 +33,7 @@ export default function UserCenter() {
}
}
return !profile ? (
<Button
theme="fail"
onClick={() => router.push('/login')}>
</Button>
) : (
return (
<HoverCard openDelay={150} closeDelay={150}>
<HoverCardTrigger>
<Button
@@ -46,10 +42,10 @@ export default function UserCenter() {
onClick={toAdminPage}
>
<Avatar>
<AvatarImage src={profile.avatar} alt="avatar"/>
<AvatarImage src={props.profile.avatar} alt="avatar"/>
<AvatarFallback className="bg-primary-muted"><UserIcon/></AvatarFallback>
</Avatar>
<span>{profile.name}</span>
<span>{props.profile.name}</span>
</Button>
</HoverCardTrigger>
<HoverCardContent className="w-36 p-1" align="end">