portfolio/src/components/molecules/ThemeSwitch.jsx

66 lines
1.8 KiB
React
Raw Normal View History

2019-11-11 23:46:47 +01:00
import React 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'
2018-09-17 00:43:52 +02:00
import posed from 'react-pose'
2019-11-11 23:46:47 +01:00
import useDarkMode from '../../hooks/use-dark-mode'
2018-09-14 20:58:49 +02:00
import { fadeIn } from '../atoms/Transitions'
2018-09-20 19:06:46 +02:00
import { ReactComponent as Day } from '../../images/day.svg'
import { ReactComponent as Night } from '../../images/night.svg'
2018-06-11 19:48:38 +02:00
import styles from './ThemeSwitch.module.scss'
2018-05-10 16:06:17 +02:00
2018-09-14 20:58:49 +02:00
const Animation = posed.aside(fadeIn)
2018-09-14 20:22:57 +02:00
2018-09-06 14:28:01 +02:00
const ThemeToggle = ({ dark }) => (
<span id="toggle" className={styles.checkboxContainer} aria-live="assertive">
2019-05-26 23:52:27 +02:00
<Day className={!dark ? null : 'active'} />
<span className={styles.checkboxFake} />
2018-09-06 14:28:01 +02:00
<Night className={dark ? 'active' : null} />
</span>
)
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
2018-09-17 00:43:52 +02:00
const ThemeToggleInput = ({ dark, toggleDark }) => (
<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}
/>
)
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-09 19:12:58 +01:00
export default function ThemeSwitch() {
2019-11-11 23:46:47 +01:00
const { darkMode, toggleDark } = useDarkMode()
2019-11-09 19:12:58 +01:00
const themeColor = darkMode ? '#1d2224' : '#e7eef4'
return (
<>
<Helmet>
<body className={darkMode ? 'dark' : null} />
<meta name="theme-color" content={themeColor} />
<meta
name="apple-mobile-web-app-status-bar-style"
content="black-translucent"
/>
2019-11-09 19:12:58 +01:00
</Helmet>
<Animation className={styles.themeSwitch}>
<label className={styles.checkbox}>
<span className={styles.label}>Toggle Night Mode</span>
<ThemeToggleInput dark={darkMode} toggleDark={toggleDark} />
<ThemeToggle dark={darkMode} />
</label>
</Animation>
</>
)
2018-05-10 16:06:17 +02:00
}