11import React from 'react'
22import classnames from 'classnames'
33import { Link , NavLink , withRouter } from 'react-router-dom'
4+ import { DARK_KEY_SINGLE } from '../../utils/const'
45import taroUILogo from '../../assets/logo-taro.png'
6+ import darkImg from '../../assets/dark.svg'
7+ import lightImg from '../../assets/light.svg'
58import './style.scss'
69
710class PageHeader extends React . Component {
811 constructor ( ...args ) {
912 super ( ...args )
1013 this . state = {
11- toggle : true
14+ toggle : true ,
15+ mode : 'light' ,
1216 }
1317 }
18+
19+ componentDidMount ( ) {
20+ const _mode = localStorage . getItem ( 'mode' )
21+ const style = localStorage . getItem ( 'dark-style' ) ;
22+ const isCurrentStyle = style && ~ style . indexOf ( DARK_KEY_SINGLE ) && ! ~ style . indexOf ( '<style' )
23+
24+ if ( _mode ) {
25+ this . setState ( {
26+ mode : _mode
27+ } )
28+
29+ if ( _mode === 'dark' && isCurrentStyle ) {
30+ const styleTag = document . createElement ( 'style' ) ;
31+ styleTag . type = 'text/css' ;
32+ styleTag . innerHTML = style ;
33+ document . head . appendChild ( styleTag ) ;
34+ }
35+ }
36+ }
37+
1438 toggleMenu ( ) {
1539 const _toggle = this . state . toggle
1640 this . setState ( {
@@ -23,13 +47,52 @@ class PageHeader extends React.Component {
2347 goToSource ( e ) {
2448 e . preventDefault ( )
2549 }
50+ handleChange ( ) {
51+ const _mode = this . state . mode
52+ const modeVal = _mode === 'light' ? 'dark' : 'light'
53+ const { handleMode } = this . props
54+ const styles = Array . from ( document . querySelectorAll ( 'style' ) ) ;
55+ const style = localStorage . getItem ( 'dark-style' ) ;
56+ const isCurrentStyle = style && ~ style . indexOf ( DARK_KEY_SINGLE ) && ! ~ style . indexOf ( '<style' )
57+
58+ if ( modeVal === 'light' ) {
59+ styles . forEach ( style => {
60+ if ( ~ style . outerHTML . indexOf ( DARK_KEY_SINGLE ) ) {
61+ const newStyle = style . outerHTML . replace ( / < s t y l e > / g, '' ) . replace ( / < \/ s t y l e > / g, '' ) . replace ( / < s t y l e t y p e = " t e x t \/ c s s " > / , '' )
62+ localStorage . setItem ( 'dark-style' , newStyle )
63+ style . remove ( )
64+ }
65+ } ) ;
66+ }
67+
68+ if ( modeVal === 'dark' && isCurrentStyle ) {
69+ const styleTag = document . createElement ( 'style' ) ;
70+ styleTag . type = 'text/css' ;
71+ styleTag . innerHTML = style ;
72+ document . head . appendChild ( styleTag ) ;
73+ }
74+
75+ if ( modeVal === 'dark' && ! isCurrentStyle ) {
76+ require ( '../../assets/style/dark.scss' ) ;
77+ }
78+
79+ this . setState ( {
80+ mode : modeVal ,
81+ } , ( ) => {
82+ localStorage . setItem ( 'mode' , modeVal )
83+ handleMode && handleMode ( )
84+ } )
85+ }
2686
2787 render ( ) {
28- const { collapse, style } = this . props
29- const { toggle } = this . state
88+ const { collapse, style, themeMode } = this . props
89+ const { toggle, mode } = this . state
90+ const darktheme = themeMode && mode === 'dark' && 'darktheme' // 暗黑模式bg
91+ const darktext = themeMode && mode === 'dark' && 'darktext' // 暗黑模式text color
92+
3093 return (
3194 < header
32- className = { classnames ( 'page-header' , { collapse } ) }
95+ className = { classnames ( 'page-header' , { collapse, darktheme } ) }
3396 style = { style }
3497 id = 'J-page-header'
3598 >
@@ -38,7 +101,7 @@ class PageHeader extends React.Component {
38101 < div className = 'logo' >
39102 < Link to = '/' >
40103 < img className = 'logo-img' src = { taroUILogo } />
41- < span > Taro UI</ span >
104+ < span className = { classnames ( '' , { darktext } ) } > Taro UI</ span >
42105 </ Link >
43106 </ div >
44107 < i className = 'icon icon-menu nav-icon' onClick = { this . toggleMenu } />
@@ -50,6 +113,7 @@ class PageHeader extends React.Component {
50113 < ul className = 'navbar' >
51114 < li >
52115 < NavLink
116+ className = { classnames ( '' , { darktext } ) }
53117 activeClassName = 'router-link-active'
54118 to = '/docs/introduction'
55119 >
@@ -58,6 +122,7 @@ class PageHeader extends React.Component {
58122 </ li >
59123 < li >
60124 < NavLink
125+ className = { classnames ( '' , { darktext } ) }
61126 activeClassName = 'router-link-active'
62127 to = '/docs/resource'
63128 >
@@ -68,15 +133,31 @@ class PageHeader extends React.Component {
68133 < a
69134 href = 'https://nervjs.github.io/taro-ui-theme-preview/'
70135 target = '__blank'
136+ className = { classnames ( '' , { darktext } ) }
71137 >
72138 主题生成器
73139 </ a >
74140 </ li >
75141 < li >
76- < a href = 'https://aotu.io/' target = '__blank' >
142+ < a
143+ href = 'https://aotu.io/'
144+ target = '__blank'
145+ className = { classnames ( '' , { darktext } ) }
146+ >
77147 关于我们
78148 </ a >
79149 </ li >
150+ {
151+ themeMode && < li >
152+ < a onClick = { this . handleChange . bind ( this ) } >
153+ {
154+ mode === 'light'
155+ ? < img className = "nav-icon" src = { darkImg } />
156+ : < img className = "nav-icon" src = { lightImg } />
157+ }
158+ </ a >
159+ </ li >
160+ }
80161 </ ul >
81162 </ div >
82163 </ div >
0 commit comments