diff --git a/eslint.config.mjs b/eslint.config.mjs index e4e9331..5b57896 100644 --- a/eslint.config.mjs +++ b/eslint.config.mjs @@ -25,6 +25,7 @@ const eslintConfig = [ }], '@stylistic/jsx-closing-bracket-location': 'off', '@stylistic/jsx-curly-newline': 'off', + '@stylistic/jsx-one-expression-per-line': 'off', '@stylistic/multiline-ternary': 'off', '@stylistic/block-spacing': 'off', '@typescript-eslint/no-empty-object-type': 'off', diff --git a/src/app/(auth)/login/page.tsx b/src/app/(auth)/login/page.tsx index 979f74f..3eeee80 100644 --- a/src/app/(auth)/login/page.tsx +++ b/src/app/(auth)/login/page.tsx @@ -27,7 +27,7 @@ import {ApiResponse} from '@/lib/api' import {Label} from '@/components/ui/label' import logo from '@/assets/logo.webp' import bg from './_assets/bg.webp' -import {useProfileStore} from '@/app/stores' +import {useProfileStore} from '@/components/stores-provider' import Link from 'next/link' export type LoginPageProps = {} diff --git a/src/app/(home)/@header/_client/navs.tsx b/src/app/(home)/@header/_client/navs.tsx deleted file mode 100644 index f98acc8..0000000 --- a/src/app/(home)/@header/_client/navs.tsx +++ /dev/null @@ -1,97 +0,0 @@ -import Image from 'next/image' -import Link from 'next/link' -import down from '@/assets/header/down.svg' - -export function LinkItem(props: { - text: string - href: string -}) { - return ( -
  • - - {props.text} - -
    -
    -
  • - ) -} - -export function MenuItem(props: { - text: string - active: boolean - onEnter: (e: React.PointerEvent) => void - onLeave: (e: React.PointerEvent) => void - onTouchStart?: (e: React.TouchEvent) => void -}) { - return ( -
  • - -
    -
  • - ) -} - -// 移动端 -export function MobileLinkItem(props: { - text: string - href: string - onClick?: () => void -}) { - return ( -
  • - - {props.text} - -
  • - ) -} diff --git a/src/app/(home)/@header/_client/product.tsx b/src/app/(home)/@header/_client/product.tsx deleted file mode 100644 index 7d16000..0000000 --- a/src/app/(home)/@header/_client/product.tsx +++ /dev/null @@ -1,183 +0,0 @@ -'use client' -import {ReactNode, useState, useEffect, MouseEvent} from 'react' -import Wrap from '@/components/wrap' -import Image from 'next/image' -import anno from '@/assets/header/product/anno.svg' -import Link from 'next/link' -import {merge} from '@/lib/utils' -import prod from '@/assets/header/product/prod.svg' -import custom from '@/assets/header/product/custom.svg' -import {useSearchParams} from 'next/navigation' -import {useRouter} from 'next/navigation' - -type TabType = 'domestic' | 'oversea' - -export function Tab(props: { - selected: boolean - onSelect: () => void - children: ReactNode -}) { - return ( -
  • - -
  • - ) -} - -export default function ProductMenu() { - const [type, setType] = useState('domestic') - - useEffect(() => { - const checkMobile = () => { - } - - checkMobile() - window.addEventListener('resize', checkMobile) - return () => window.removeEventListener('resize', checkMobile) - }, []) - return ( - - -
    - {type === 'domestic' - ? ( - - ) : ( - - ) - } -
    - -
    - ) -} - -export function Domestic(props: {}) { - const searchParams = useSearchParams() - const currentType = searchParams?.get('type') || 'short' - return ( -
    -
    -

    - 产品 - 代理产品 -

    - - - - -
    -
    -

    - 定制 - 业务定制 -

    -
    -

    优质/企业/精选IP

    -

    - 超 1000 家企业共同信赖之选!大客户经理全 - 程 1 对 1 沟通,随时为您排忧解难,提供 24 - 小时不间断支持 -

    -
    -
    -
    - ) -} - -export function DomesticLink(props: { - label: string - desc: string - href: string - discount: number - active?: boolean -}) { - const router = useRouter() - // const ctx = useContext(HeaderContext) - // if (!ctx) { - // throw new Error(`HeaderContext not found`) - // } - - const onClick = (e: MouseEvent) => { - e.preventDefault() - e.stopPropagation() - // ctx.setMenu(false) - router.push(props.href) - } - - return ( - -

    - {props.label} - - 折扣 - {props.discount} - % - -

    -

    - {props.desc} -

    - - ) -} - -export function Oversea(props: {}) { - return ( -
    - -
    - ) -} diff --git a/src/app/(home)/@header/_client/provider.tsx b/src/app/(home)/@header/_client/provider.tsx deleted file mode 100644 index c7a4927..0000000 --- a/src/app/(home)/@header/_client/provider.tsx +++ /dev/null @@ -1,227 +0,0 @@ -'use client' -import {createContext, ReactNode, useCallback, useContext, useEffect, useMemo, useRef, useState} from 'react' -import Link from 'next/link' -import Image from 'next/image' -import {LinkItem, MenuItem} from './navs' -import SolutionMenu from './solution' -import ProductMenu from './product' -import HelpMenu from './help' -import Wrap from '@/components/wrap' -import logo from '@/assets/logo.webp' -import {Button} from '@/components/ui/button' -import {useProfileStore} from '@/app/stores' -import UserCenter from '@/components/composites/user-center' -import {MenuIcon} from 'lucide-react' -import {merge} from '@/lib/utils' - -export const HeaderContext = createContext<{ - setMenu: (value: boolean) => void - isMobile: boolean -} | null>(null) - -export type ProviderProps = {} - -export default function Provider(props: ProviderProps) { - // ====================== - // 滚动条状态 - // ====================== - const [scroll, setScroll] = useState(false) // Changed to false for client-side rendering - const handleScroll = useCallback(() => { - setScroll(window.scrollY > 48) - }, []) - - useEffect(() => { - // Initialize scroll state on client - setScroll(window.scrollY > 48) - window.addEventListener('scroll', handleScroll) - return () => { - window.removeEventListener('scroll', handleScroll) - } - }, [handleScroll]) - - // ====================== - // 菜单状态 - // ====================== - - const [menu, setMenu] = useState(false) - const [page, setPage] = useState(0) - const menuRef = useRef(null) - const [productDropdownOpen, setProductDropdownOpen] = useState(false) - - useEffect(() => { - const handleClickOutside = (e: MouseEvent | TouchEvent) => { - if (menuRef.current && !menuRef.current.contains(e.target as Node)) { - const target = e.target as HTMLElement - // 排除所有交互元素 - if (!target.closest('a, button, [role="button"], [role="tab"]')) { - setMenu(false) - setProductDropdownOpen(false) // 同时关闭产品下拉菜单 - } - } - } - document.addEventListener('mousedown', handleClickOutside) - document.addEventListener('touchstart', handleClickOutside) - return () => { - document.removeEventListener('mousedown', handleClickOutside) - document.removeEventListener('touchstart', handleClickOutside) - } - }, []) - - const isMobile = () => { - if (typeof window === 'undefined') return false - return window.innerWidth <= 768 - } - - const handleMenuEnter = (pageIndex: number) => { - if (isMobile() && menu && page === pageIndex) { - setMenu(false) - } - else { - setPage(pageIndex) - setMenu(true) - } - } - - const handleMenuLeave = () => { - if (!isMobile()) { - setMenu(false) - } - } - - const pages = useMemo(() => [ - , - , - , - ], []) - - const toggleMobileMenu = () => { - setMenu(!menu) - } - - // ====================== - // 用户信息 - // ====================== - - const profile = useProfileStore(store => store.profile) - - // ====================== - // render - // ====================== - - return ( - -
    - -
    - {/* logo */} - - logo - - - {/* 菜单 */} - -
    - {/* 登录 */} -
    - {profile == undefined - ? ( -
    - - 登录 - - - 注册 - -
    - ) - : ( -
    - ) - } -
    -
    -
    - - {/* 下拉菜单 */} -
    !isMobile() && setMenu(true)} - onPointerLeave={() => !isMobile() && setMenu(false)} - > - {pages[page]} -
    -
    - ) -} diff --git a/src/app/(home)/@header/common.tsx b/src/app/(home)/@header/common.tsx new file mode 100644 index 0000000..1eee09e --- /dev/null +++ b/src/app/(home)/@header/common.tsx @@ -0,0 +1,18 @@ +import {createContext} from 'react' +import Image, {StaticImageData} from 'next/image' + +export const HeaderContext = createContext<{ + setMenu: (value: boolean) => void +} | null>(null) + +export function FragmentTitle(props: { + text: string + img: StaticImageData +}) { + return ( +

    + icon + {props.text} +

    + ) +} diff --git a/src/app/(home)/@header/_client/help.tsx b/src/app/(home)/@header/menu-help.tsx similarity index 67% rename from src/app/(home)/@header/_client/help.tsx rename to src/app/(home)/@header/menu-help.tsx index 43eb5e3..8a687f4 100644 --- a/src/app/(home)/@header/_client/help.tsx +++ b/src/app/(home)/@header/menu-help.tsx @@ -5,16 +5,17 @@ import h01 from '@/assets/header/help/01.svg' import h02 from '@/assets/header/help/02.svg' import h03 from '@/assets/header/help/03.svg' import banner from '@/assets/header/help/banner.webp' +import {FragmentTitle} from '@/app/(home)/@header/common' export default function HelpMenu() { return ( - + -

    - {props.title} - {props.title} -

    -
      +
      + +
        {props.items.map((item, index) => ( -
      • {item.lead}
      • +
      • + {item.lead} +
      • ))}
      diff --git a/src/app/(home)/@header/menu-mobile.tsx b/src/app/(home)/@header/menu-mobile.tsx new file mode 100644 index 0000000..c1a4a5d --- /dev/null +++ b/src/app/(home)/@header/menu-mobile.tsx @@ -0,0 +1,31 @@ +import ProductMenu from './menu-product' +import HelpMenu from './menu-help' +import SolutionMenu from './menu-solution' + +export type MobileMenuProps = {} + +export default function MobileMenu(props: MobileMenuProps) { + return ( +
      +
      + +
      +
      + + +
      +
      + + +
      +
      + ) +} + +function MenuTitle(props: {title: string}) { + return ( +

      + {props.title} +

      + ) +} diff --git a/src/app/(home)/@header/menu-product.tsx b/src/app/(home)/@header/menu-product.tsx new file mode 100644 index 0000000..709478c --- /dev/null +++ b/src/app/(home)/@header/menu-product.tsx @@ -0,0 +1,150 @@ +'use client' +import {ReactNode, useContext, useState} from 'react' +import Wrap from '@/components/wrap' +import anno from '@/assets/header/product/anno.svg' +import Link from 'next/link' +import {merge} from '@/lib/utils' +import prod from '@/assets/header/product/prod.svg' +import custom from '@/assets/header/product/custom.svg' +import {useRouter} from 'next/navigation' +import {FragmentTitle, HeaderContext} from './common' + +type TabType = 'domestic' | 'oversea' + +export default function ProductMenu() { + const [type, setType] = useState('domestic') + + return ( + +
        + setType('domestic')}>国内代理 + setType('oversea')}>海外代理 +
      + {type === 'domestic' + ? ( + + ) : ( + + ) + } + +
      + ) +} + +export function Tab(props: { + selected: boolean + onSelect: () => void + children: ReactNode +}) { + return ( +
    • + +
    • + ) +} + +export function Domestic(props: {}) { + return ( +
      +
      + + + + +
      +
      + + +
      +
      + ) +} + +export function Oversea(props: {}) { + return ( +
      +

      产品即将上线,敬请期待~

      +
      + ) +} + +export function DomesticLink(props: { + label: string + desc: string + href: string + discount?: number +}) { + const router = useRouter() + const ctx = useContext(HeaderContext) + if (!ctx) { + throw new Error(`HeaderContext not found`) + } + + const onClick = () => { + ctx.setMenu(false) + router.push(props.href) + } + + return ( + +

      + {props.label} + {props.discount && ( + + 折扣 {props.discount}% + + )} +

      +

      + {props.desc} +

      + + ) +} diff --git a/src/app/(home)/@header/_client/solution.tsx b/src/app/(home)/@header/menu-solution.tsx similarity index 83% rename from src/app/(home)/@header/_client/solution.tsx rename to src/app/(home)/@header/menu-solution.tsx index 20ab4e3..fc13960 100644 --- a/src/app/(home)/@header/_client/solution.tsx +++ b/src/app/(home)/@header/menu-solution.tsx @@ -1,4 +1,3 @@ -import Image from 'next/image' import Wrap from '@/components/wrap' import s01 from '@/assets/header/solution/01.svg' import s02 from '@/assets/header/solution/02.svg' @@ -9,10 +8,11 @@ import s06 from '@/assets/header/solution/06.svg' import s07 from '@/assets/header/solution/07.svg' import s08 from '@/assets/header/solution/08.svg' import {StaticImageData} from 'next/image' +import {FragmentTitle} from '@/app/(home)/@header/common' export default function SolutionMenu() { return ( - + - {props.title} -
      -

      {props.title}

      -

      {props.desc}

      -
      + +

      {props.desc}

      ) } diff --git a/src/app/(home)/@header/page.tsx b/src/app/(home)/@header/page.tsx index 1356492..e08fc21 100644 --- a/src/app/(home)/@header/page.tsx +++ b/src/app/(home)/@header/page.tsx @@ -1,39 +1,36 @@ 'use client' -import UserCenter from '@/components/composites/user-center' -import {useClientStore, useProfileStore} from '@/app/stores' -import {buttonVariants} from '@/components/ui/button' -import { - Navigation, - NavigationIndicator, - NavigationLink, - NavigationLinkItem, - NavigationGroup, - NavigationTriggerItem, - NavigationMenuViewport, -} from '@/components/ui/navigation-menu' -import Wrap from '@/components/wrap' -import {merge} from '@/lib/utils' -import {useState, useCallback, useEffect, useContext} from 'react' +import {useCallback, useEffect, useMemo, useState, PointerEvent, ComponentProps} from 'react' +import Link from 'next/link' import Image from 'next/image' +import SolutionMenu from './menu-solution' +import ProductMenu from './menu-product' +import HelpMenu from './menu-help' +import MobileMenu from './menu-mobile' +import Wrap from '@/components/wrap' import logo from '@/assets/logo.webp' -import ProductMenu, {Domestic} from '@/app/(home)/@header/_client/product' -import SolutionMenu from '@/app/(home)/@header/_client/solution' -import HelpMenu from '@/app/(home)/@header/_client/help' +import {Button} from '@/components/ui/button' +import {useProfileStore} from '@/components/stores-provider' +import UserCenter from '@/components/composites/user-center' import {MenuIcon} from 'lucide-react' +import down from '@/assets/header/down.svg' +import {merge} from '@/lib/utils' +import {HeaderContext} from './common' -export type HeaderProps = {} +export type ProviderProps = {} -export default function Header(props: HeaderProps) { +export default function Page(props: ProviderProps) { // ====================== - // 背景显示状态 + // 滚动条状态 // ====================== - const [expand, setExpand] = useState(false) - const [scroll, setScroll] = useState(false) + const [scroll, setScroll] = useState(false) // Changed to false for client-side rendering + const handleScroll = useCallback(() => { setScroll(window.scrollY > 48) }, []) + useEffect(() => { + // Initialize scroll state on client setScroll(window.scrollY > 48) window.addEventListener('scroll', handleScroll) return () => { @@ -42,10 +39,57 @@ export default function Header(props: HeaderProps) { }, [handleScroll]) // ====================== - // 移动端 + // 菜单状态 // ====================== - const lg = useClientStore(state => state.breakpoint.lg) + const [menu, setMenu] = useState(false) + const [page, setPage] = useState(0) + const pages = useMemo(() => [ + , + , + , + , + ], []) + + const enterMenu = (i: number) => { + return (e: PointerEvent) => { + setPage(i) + if (e.pointerType === 'mouse' || page !== i) { + setMenu(true) + } + else { + setMenu(!menu) + } + } + } + + const exitMenu = (e: PointerEvent) => { + if (e.pointerType === 'mouse') { + setMenu(false) + } + } + + const enterMenuContent = (e: PointerEvent) => { + setMenu(true) + } + + const exitMenuContent = (e: PointerEvent) => { + if (e.pointerType === 'mouse') { + setMenu(false) + } + } + + const enterMenuMask = (e: PointerEvent) => { + if (e.pointerType !== 'mouse') { + setMenu(false) + } + } + + // ====================== + // 用户信息 + // ====================== + + const profile = useProfileStore(store => store.profile) // ====================== // render @@ -53,102 +97,188 @@ export default function Header(props: HeaderProps) { return (
      - { - setExpand(!!value) - }} - > + className={merge( + 'fixed top-0 left-0 w-screen z-10 flex flex-col', + menu && 'h-screen', + )}> + + + {/* 菜单栏 */}
      - -
      - {lg ? ( - - + + - - - - - - ) : ( - - } - className={merge( - `flex flex-col items-start gap-6`, - )} - > - - - - - - - - - - - )} - - }/> + {/* 登录 */} +
      + {profile == undefined + ? ( + <> + + 登录 + + + 注册 + + + ) + : ( + + ) + }
      -
      - - + {/* 下拉菜单 */} +
      + {pages[page]} +
      + + {/* 遮罩层 */} +
      + +
      ) } -function AccountRegion() { - const profile = useProfileStore(state => state.profile) - +function LinkItem(props: { + text: string + href: string +}) { return ( -
      - {profile ? ( - - ) : ( - - )} -
      +
    • + + {props.text} + +
      +
      +
    • + ) +} + +function MenuItem(props: { + text: string + active: boolean +} & ComponentProps<'button'>) { + return ( +
    • + +
      +
    • ) } diff --git a/src/app/admin/_client/header.tsx b/src/app/admin/_client/header.tsx index 2de6aba..39e17c0 100644 --- a/src/app/admin/_client/header.tsx +++ b/src/app/admin/_client/header.tsx @@ -1,7 +1,7 @@ 'use client' import {PanelLeftCloseIcon, PanelLeftOpenIcon} from 'lucide-react' import {Button} from '@/components/ui/button' -import {useLayoutStore} from '@/app/stores' +import {useLayoutStore} from '@/components/stores-provider' import {merge} from '@/lib/utils' import UserCenter from '@/components/composites/user-center' import {User} from '@/lib/models' diff --git a/src/app/admin/_client/layout.tsx b/src/app/admin/_client/layout.tsx index bb4421b..f1e33d1 100644 --- a/src/app/admin/_client/layout.tsx +++ b/src/app/admin/_client/layout.tsx @@ -1,6 +1,6 @@ 'use client' import {ReactNode} from 'react' -import {useLayoutStore} from '@/app/stores' +import {useLayoutStore} from '@/components/stores-provider' import {merge} from '@/lib/utils' type AdminLayoutProps = { diff --git a/src/app/admin/_client/navbar.tsx b/src/app/admin/_client/navbar.tsx index 54d9aa4..3373eae 100644 --- a/src/app/admin/_client/navbar.tsx +++ b/src/app/admin/_client/navbar.tsx @@ -1,7 +1,7 @@ 'use client' import {ComponentProps, ReactNode, useState} from 'react' import {merge} from '@/lib/utils' -import {useLayoutStore} from '@/app/stores' +import {useLayoutStore} from '@/components/stores-provider' import Link from 'next/link' import Image from 'next/image' import logoAvatar from '../_assets/logo-avatar.svg' diff --git a/src/app/admin/identify/page.tsx b/src/app/admin/identify/page.tsx index e8c52d4..2751b43 100644 --- a/src/app/admin/identify/page.tsx +++ b/src/app/admin/identify/page.tsx @@ -11,7 +11,7 @@ import {Identify} from '@/actions/user' import {toast} from 'sonner' import {useEffect, useRef, useState} from 'react' import * as qrcode from 'qrcode' -import {useProfileStore} from '@/app/stores' +import {useProfileStore} from '@/components/stores-provider' import {merge} from '@/lib/utils' import banner from './_assets/banner.webp' import personal from './_assets/personal.webp' diff --git a/src/app/admin/profile/page.tsx b/src/app/admin/profile/page.tsx index daaee5f..cfe8bc2 100644 --- a/src/app/admin/profile/page.tsx +++ b/src/app/admin/profile/page.tsx @@ -7,7 +7,7 @@ import {Button} from '@/components/ui/button' import {useForm} from 'react-hook-form' import {zodResolver} from '@hookform/resolvers/zod' import * as z from 'zod' -import {useProfileStore} from '@/app/stores' +import {useProfileStore} from '@/components/stores-provider' import {toast} from 'sonner' import {CheckCircle, QrCodeIcon} from 'lucide-react' import * as qrcode from 'qrcode' diff --git a/src/app/effects.tsx b/src/app/effects.tsx index e6468a6..789fc8f 100644 --- a/src/app/effects.tsx +++ b/src/app/effects.tsx @@ -1,6 +1,6 @@ 'use client' import {ReactNode, useEffect} from 'react' -import {useClientStore, useLayoutStore} from '@/app/stores' +import {useClientStore, useLayoutStore} from '@/components/stores-provider' export type EffectProviderProps = { children?: ReactNode diff --git a/src/app/layout.tsx b/src/app/layout.tsx index 22794d2..07ca743 100644 --- a/src/app/layout.tsx +++ b/src/app/layout.tsx @@ -4,7 +4,7 @@ import {Metadata} from 'next' import './globals.css' import localFont from 'next/font/local' import {Toaster} from '@/components/ui/sonner' -import Stores from '@/app/stores' +import StoresProvider from '@/components/stores-provider' import {getProfile} from '@/actions/auth' import Effects from '@/app/effects' @@ -29,11 +29,11 @@ export default async function RootLayout({ return ( - + {children} - + diff --git a/src/components/composites/purchase/long/right.tsx b/src/components/composites/purchase/long/right.tsx index 499faa7..25a3f9f 100644 --- a/src/components/composites/purchase/long/right.tsx +++ b/src/components/composites/purchase/long/right.tsx @@ -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 '@/app/stores' +import {useProfileStore} from '@/components/stores-provider' import RechargeModal from '@/components/composites/recharge' import Pay from '@/components/composites/purchase/pay' import {buttonVariants} from '@/components/ui/button' diff --git a/src/components/composites/purchase/pay.tsx b/src/components/composites/purchase/pay.tsx index 08ffc44..530efb6 100644 --- a/src/components/composites/purchase/pay.tsx +++ b/src/components/composites/purchase/pay.tsx @@ -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 '@/app/stores' +import {useProfileStore} from '@/components/stores-provider' import {Alert, AlertTitle} from '@/components/ui/alert' import {ApiResponse, ExtraResp, ExtraReq} from '@/lib/api' import {toast} from 'sonner' diff --git a/src/components/composites/purchase/short/right.tsx b/src/components/composites/purchase/short/right.tsx index 4341600..7d2f256 100644 --- a/src/components/composites/purchase/short/right.tsx +++ b/src/components/composites/purchase/short/right.tsx @@ -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 '@/app/stores' +import {useProfileStore} from '@/components/stores-provider' import RechargeModal from '@/components/composites/recharge' import {buttonVariants} from '@/components/ui/button' import Link from 'next/link' diff --git a/src/components/composites/recharge/index.tsx b/src/components/composites/recharge/index.tsx index 01ef705..3765f54 100644 --- a/src/components/composites/recharge/index.tsx +++ b/src/components/composites/recharge/index.tsx @@ -19,7 +19,7 @@ import {useEffect, useMemo, useRef, useState} from 'react' import {Loader} from 'lucide-react' import {RechargeComplete, RechargePrepare} from '@/actions/user' import * as qrcode from 'qrcode' -import {useProfileStore} from '@/app/stores' +import {useProfileStore} from '@/components/stores-provider' import {merge} from '@/lib/utils' import { Platform, diff --git a/src/components/composites/user-center/index.tsx b/src/components/composites/user-center/index.tsx index db3b79e..7f570f9 100644 --- a/src/components/composites/user-center/index.tsx +++ b/src/components/composites/user-center/index.tsx @@ -1,5 +1,5 @@ 'use client' -import {useProfileStore} from '@/app/stores' +import {useProfileStore} from '@/components/stores-provider' import {Button} from '@/components/ui/button' import {Avatar, AvatarFallback, AvatarImage} from '@/components/ui/avatar' import {LoaderIcon, LogOutIcon, UserIcon, UserPenIcon} from 'lucide-react' diff --git a/src/app/stores.tsx b/src/components/stores-provider.tsx similarity index 96% rename from src/app/stores.tsx rename to src/components/stores-provider.tsx index c187703..c5357da 100644 --- a/src/app/stores.tsx +++ b/src/components/stores-provider.tsx @@ -42,7 +42,7 @@ export type ProfileProviderProps = { children: ReactNode } -export default function Stores(props: ProfileProviderProps) { +export default function StoresProvider(props: ProfileProviderProps) { const profile = useRef>(null) if (!profile.current) { console.log('📦 create profile store')