11import { createSignal , createEffect , onCleanup , onMount , createMemo } from "solid-js" ;
2+ import type { JSX } from "solid-js" ;
23
3- export default function ScrollHeader ( props ) {
4+ interface ScrollHeaderProps {
5+ children : JSX . Element ;
6+ }
7+
8+ export default function ScrollHeader ( props : ScrollHeaderProps ) {
49 const [ isVisible , setIsVisible ] = createSignal ( true ) ;
510 const [ lastScrollY , setLastScrollY ] = createSignal ( 0 ) ;
611 const [ isAtTop , setIsAtTop ] = createSignal ( true ) ;
712 const [ theme , setTheme ] = createSignal ( 'light' ) ;
8-
13+ const [ isLoggedIn , setIsLoggedIn ] = createSignal ( false ) ;
14+
15+ interface UserData {
16+ username ?: string ;
17+ avatar_url ?: string ;
18+ [ key : string ] : any ;
19+ }
20+
21+ const [ userData , setUserData ] = createSignal < UserData | null > ( null ) ;
22+
923 // Handle scroll events with debounce
1024 const handleScroll = ( ) => {
1125 const currentScrollY = window . scrollY ;
12-
26+
1327 // Check if at top of page
1428 if ( currentScrollY < 10 ) {
1529 setIsAtTop ( true ) ;
@@ -19,10 +33,10 @@ export default function ScrollHeader(props) {
1933 if ( isAtTop ( ) ) {
2034 setIsAtTop ( false ) ;
2135 }
22-
36+
2337 // Check scroll direction
2438 const isScrollingUp = currentScrollY < lastScrollY ( ) ;
25-
39+
2640 if ( isScrollingUp ) {
2741 // Scrolling up - show header
2842 setIsVisible ( true ) ;
@@ -33,14 +47,14 @@ export default function ScrollHeader(props) {
3347 }
3448 }
3549 }
36-
50+
3751 // Update last scroll position
3852 setLastScrollY ( currentScrollY ) ;
3953 } ;
40-
54+
4155 // Throttle scroll events using requestAnimationFrame
4256 let isThrottled = false ;
43-
57+
4458 const onScroll = ( ) => {
4559 if ( ! isThrottled ) {
4660 requestAnimationFrame ( ( ) => {
@@ -50,9 +64,9 @@ export default function ScrollHeader(props) {
5064 isThrottled = true ;
5165 }
5266 } ;
53-
67+
5468 // Listen for theme changes in localStorage
55- const handleStorageChange = ( e ) => {
69+ const handleStorageChange = ( e : StorageEvent ) => {
5670 if ( typeof localStorage !== 'undefined' && e . key === 'theme' ) {
5771 setTheme ( e . newValue || 'light' ) ;
5872 }
@@ -63,41 +77,52 @@ export default function ScrollHeader(props) {
6377 setLastScrollY ( window . scrollY ) ;
6478 // Initialize header state
6579 handleScroll ( ) ;
66-
80+
6781 // Set initial theme from localStorage (only available in browser)
6882 if ( typeof localStorage !== 'undefined' ) {
6983 setTheme ( localStorage . getItem ( 'theme' ) || 'light' ) ;
84+
85+ // 检查用户登录状态
86+ const token = localStorage . getItem ( 'token' ) ;
87+ const user = localStorage . getItem ( 'user' ) ;
88+
89+ if ( token && user ) {
90+ setIsLoggedIn ( true ) ;
91+ try {
92+ setUserData ( JSON . parse ( user ) ) ;
93+ } catch ( e ) {
94+ console . error ( '解析用户数据失败' , e ) ;
95+ }
96+ }
7097 }
71-
98+
7299 // Listen for theme changes from other components
73100 window . addEventListener ( 'storage' , handleStorageChange ) ;
74101 } ) ;
75-
102+
76103 createEffect ( ( ) => {
77104 // Add scroll event listener
78105 window . addEventListener ( "scroll" , onScroll , { passive : true } ) ;
79-
106+
80107 onCleanup ( ( ) => {
81108 // Remove scroll event listener
82109 window . removeEventListener ( "scroll" , onScroll ) ;
83110 window . removeEventListener ( 'storage' , handleStorageChange ) ;
84111 } ) ;
85112 } ) ;
86-
113+
87114 // Theme-based background color class
88115 const bgColorClass = createMemo ( ( ) => {
89- return theme ( ) === 'dark'
90- ? 'bg-base-100/80 backdrop-blur-sm shadow-md'
116+ return theme ( ) === 'dark'
117+ ? 'bg-base-100/80 backdrop-blur-sm shadow-md'
91118 : 'bg-base-100/95 backdrop-blur-sm shadow-md' ;
92119 } ) ;
93-
120+
94121 return (
95122 < header
96- class = { `fixed top-0 w-full z-50 transition-all duration-300 transform ${
97- isVisible ( ) ? "translate-y-0" : "-translate-y-full"
98- } ${
99- ! isAtTop ( ) ? bgColorClass ( ) : "bg-base-100"
100- } `}
123+ class = { `fixed top-0 w-full z-50 transition-all duration-300 transform ${ isVisible ( ) ? "translate-y-0" : "-translate-y-full"
124+ } ${ ! isAtTop ( ) ? bgColorClass ( ) : "bg-base-100"
125+ } `}
101126 >
102127 { props . children }
103128 </ header >
0 commit comments