1
0
mirror of https://github.com/kremalicious/portfolio.git synced 2024-06-28 00:27:40 +02:00
portfolio/src/components/molecules/ThemeSwitch.jsx

84 lines
2.1 KiB
React
Raw Normal View History

2019-11-26 18:25:42 +01:00
import React, { memo, useEffect, useState } from 'react'
2018-05-23 00:03:46 +02:00
import PropTypes from 'prop-types'
2018-05-12 01:42:29 +02:00
import Helmet from 'react-helmet'
2019-11-28 19:58:49 +01:00
import useDarkMode from 'use-dark-mode'
2019-11-13 11:59:59 +01:00
import Icon from '../atoms/Icon'
2018-06-11 19:48:38 +02:00
import styles from './ThemeSwitch.module.scss'
2018-05-10 16:06:17 +02:00
2019-11-28 19:58:49 +01:00
const ThemeToggle = memo(({ dark }) => (
<span id="toggle" className={styles.checkboxContainer} aria-live="assertive">
2019-11-13 13:32:11 +01:00
<Icon name="Sun" className={!dark ? null : 'active'} />
<span className={styles.checkboxFake} />
2019-11-13 13:32:11 +01:00
<Icon name="Moon" className={dark ? 'active' : null} />
</span>
2019-11-28 19:58:49 +01:00
))
ThemeToggle.displayName = 'ThemeToggle'
2018-05-23 00:03:46 +02:00
2018-09-06 14:28:01 +02:00
ThemeToggle.propTypes = {
2019-05-26 23:52:27 +02:00
dark: PropTypes.bool.isRequired
2018-09-06 14:28:01 +02:00
}
2018-05-10 16:06:17 +02:00
2019-11-28 19:58:49 +01:00
const ThemeToggleInput = memo(({ dark, toggleDark }) => (
2018-09-17 00:43:52 +02:00
<input
2019-05-26 23:52:27 +02:00
onChange={() => toggleDark()}
2018-09-17 00:43:52 +02:00
type="checkbox"
name="toggle"
value="toggle"
aria-describedby="toggle"
checked={dark}
/>
2019-11-28 19:58:49 +01:00
))
ThemeToggleInput.displayName = 'ThemeToggleInput'
2018-05-10 17:58:45 +02:00
2018-09-17 00:43:52 +02:00
ThemeToggleInput.propTypes = {
2019-05-26 23:52:27 +02:00
dark: PropTypes.bool.isRequired,
toggleDark: PropTypes.func.isRequired
2018-09-17 00:43:52 +02:00
}
2018-05-10 16:06:17 +02:00
2019-11-28 19:58:49 +01:00
const HeadItems = ({ bodyClass, themeColor }) => (
<Helmet>
<body className={bodyClass} />
<meta name="theme-color" content={themeColor} />
<meta
name="apple-mobile-web-app-status-bar-style"
content="black-translucent"
/>
</Helmet>
)
HeadItems.propTypes = {
bodyClass: PropTypes.string.isRequired,
themeColor: PropTypes.string.isRequired
}
2019-11-26 18:25:42 +01:00
function ThemeSwitch() {
2019-11-28 19:58:49 +01:00
const { value, toggle } = useDarkMode(false, {
classNameDark: 'dark',
classNameLight: 'light'
})
2020-02-15 14:05:14 +01:00
const [themeColor, setThemeColor] = useState('')
const [bodyClass, setBodyClass] = useState('')
2019-11-26 18:25:42 +01:00
useEffect(() => {
2019-11-28 19:58:49 +01:00
setBodyClass(value ? 'dark' : null)
setThemeColor(value ? '#1d2224' : '#e7eef4')
}, [value])
2019-11-09 19:12:58 +01:00
return (
<>
2019-11-28 19:58:49 +01:00
<HeadItems themeColor={themeColor} bodyClass={bodyClass} />
2019-11-16 13:37:25 +01:00
<aside className={styles.themeSwitch}>
2019-11-09 19:12:58 +01:00
<label className={styles.checkbox}>
<span className={styles.label}>Toggle Night Mode</span>
2019-11-28 19:58:49 +01:00
<ThemeToggleInput dark={value} toggleDark={toggle} />
<ThemeToggle dark={value} />
2019-11-09 19:12:58 +01:00
</label>
2019-11-16 13:37:25 +01:00
</aside>
2019-11-09 19:12:58 +01:00
</>
)
2018-05-10 16:06:17 +02:00
}
2019-11-26 18:25:42 +01:00
export default memo(ThemeSwitch)