1
- import React from 'react' ;
2
- import { ThemeProvider } from 'styled-components' ;
3
- import { theme } from './styles/Theme' ;
4
- import GlobalStyles from './styles/GlobalStyles' ;
1
+ import React , { useState , useEffect , useContext } from 'react' ;
5
2
import Header from './components/Header' ;
6
3
import Hero from './components/Hero' ;
7
4
import Features from './components/Features' ;
@@ -10,22 +7,72 @@ import Installation from './components/Installation';
10
7
import TypescriptSupport from './components/TypescriptSupport' ;
11
8
import Community from './components/Community' ;
12
9
import Footer from './components/Footer' ;
10
+ import { ThemeProvider } from 'styled-components' ;
11
+ import { lightTheme , darkTheme } from './styles/Theme' ;
12
+ import GlobalStyles from './styles/GlobalStyles' ;
13
+
14
+ // 创建主题上下文
15
+ export const ThemeContext = React . createContext ( {
16
+ isDarkMode : true ,
17
+ toggleTheme : ( ) => { } ,
18
+ } ) ;
19
+
20
+ // 提供一个钩子函数用于获取主题上下文
21
+ export const useTheme = ( ) => useContext ( ThemeContext ) ;
13
22
14
23
const App : React . FC = ( ) => {
24
+ // 主题状态
25
+ const [ isDarkMode , setIsDarkMode ] = useState ( true ) ;
26
+
27
+ // 切换主题函数
28
+ const toggleTheme = ( ) => {
29
+ setIsDarkMode ( ! isDarkMode ) ;
30
+ localStorage . setItem ( 'darkMode' , ( ! isDarkMode ) . toString ( ) ) ;
31
+ } ;
32
+
33
+ // 从本地存储获取主题设置
34
+ useEffect ( ( ) => {
35
+ const savedDarkMode = localStorage . getItem ( 'darkMode' ) ;
36
+ if ( savedDarkMode !== null ) {
37
+ setIsDarkMode ( savedDarkMode === 'true' ) ;
38
+ } else {
39
+ // 如果没有保存过设置,则检查系统偏好
40
+ const prefersDarkMode = window . matchMedia ( '(prefers-color-scheme: dark)' ) . matches ;
41
+ setIsDarkMode ( prefersDarkMode ) ;
42
+ }
43
+ } , [ ] ) ;
44
+
45
+ useEffect ( ( ) => {
46
+ // 更新页面滚动位置
47
+ window . scrollTo ( 0 , 0 ) ;
48
+
49
+ // 监听浏览器历史变化
50
+ const handlePopState = ( ) => {
51
+ // 移除与 currentPage 相关的逻辑
52
+ window . scrollTo ( 0 , 0 ) ;
53
+ } ;
54
+
55
+ window . addEventListener ( 'popstate' , handlePopState ) ;
56
+ return ( ) => window . removeEventListener ( 'popstate' , handlePopState ) ;
57
+ } , [ ] ) ;
58
+
15
59
return (
16
- < ThemeProvider theme = { theme } >
17
- < GlobalStyles />
18
- < Header />
19
- < main >
20
- < Hero />
21
- < Features />
22
- < WorkflowDemo />
23
- < Installation />
24
- < TypescriptSupport />
25
- < Community />
26
- </ main >
27
- < Footer />
28
- </ ThemeProvider >
60
+ < ThemeContext . Provider value = { { isDarkMode, toggleTheme } } >
61
+ < ThemeProvider theme = { isDarkMode ? darkTheme : lightTheme } >
62
+ < GlobalStyles />
63
+
64
+ < div >
65
+ < Header />
66
+ < Hero />
67
+ < Features />
68
+ < WorkflowDemo />
69
+ < Installation />
70
+ < TypescriptSupport />
71
+ < Community />
72
+ < Footer />
73
+ </ div >
74
+ </ ThemeProvider >
75
+ </ ThemeContext . Provider >
29
76
) ;
30
77
} ;
31
78
0 commit comments