2023-05-29 04:40:17 +00:00
|
|
|
import { clsx } from 'clsx'
|
2023-06-16 14:47:24 +00:00
|
|
|
import { createSignal, onCleanup, onMount } from 'solid-js'
|
2023-05-29 04:40:17 +00:00
|
|
|
|
2023-11-14 15:10:00 +00:00
|
|
|
import { useLocalize } from '../../../context/localize'
|
|
|
|
import { Icon } from '../Icon'
|
|
|
|
|
|
|
|
import styles from './DarkModeToggle.module.scss'
|
|
|
|
|
2023-05-29 04:40:17 +00:00
|
|
|
type Props = {
|
|
|
|
class?: string
|
|
|
|
}
|
|
|
|
|
|
|
|
const editorDarkModeSelected = localStorage.getItem('editorDarkMode')
|
|
|
|
const editorDarkModeAttr = document.documentElement.getAttribute('editorDarkMode')
|
|
|
|
|
|
|
|
export const DarkModeToggle = (props: Props) => {
|
|
|
|
const { t } = useLocalize()
|
|
|
|
const [editorDarkMode, setEditorDarkMode] = createSignal(false)
|
|
|
|
|
|
|
|
onMount(() => {
|
|
|
|
if (editorDarkModeSelected === 'true') {
|
|
|
|
setEditorDarkMode(true)
|
|
|
|
document.documentElement.dataset.editorDarkMode = 'true'
|
|
|
|
} else if (editorDarkModeSelected === 'false') {
|
|
|
|
setEditorDarkMode(false)
|
|
|
|
document.documentElement.dataset.editorDarkMode = 'false'
|
|
|
|
}
|
|
|
|
|
|
|
|
if (!editorDarkModeAttr && !editorDarkModeSelected) {
|
2023-08-31 04:20:32 +00:00
|
|
|
localStorage.setItem('editorDarkMode', 'false')
|
|
|
|
document.documentElement.dataset.editorDarkMode = 'false'
|
2023-05-29 04:40:17 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
onCleanup(() => {
|
|
|
|
setEditorDarkMode(false)
|
2024-02-04 09:03:15 +00:00
|
|
|
document.documentElement.dataset.editorDarkMode = undefined
|
2023-05-29 04:40:17 +00:00
|
|
|
})
|
|
|
|
})
|
|
|
|
|
|
|
|
const handleSwitchTheme = () => {
|
|
|
|
setEditorDarkMode(!editorDarkMode())
|
|
|
|
localStorage.setItem('editorDarkMode', editorDarkMode() ? 'true' : 'false')
|
|
|
|
document.documentElement.dataset.editorDarkMode = editorDarkMode() ? 'true' : 'false'
|
|
|
|
}
|
|
|
|
|
|
|
|
return (
|
|
|
|
<div class={clsx(styles.DarkModeToggle, props.class)}>
|
|
|
|
<input
|
|
|
|
type="checkbox"
|
|
|
|
id="theme-switcher"
|
|
|
|
value="1"
|
|
|
|
checked={editorDarkMode()}
|
|
|
|
onClick={handleSwitchTheme}
|
|
|
|
/>
|
|
|
|
<label for="theme-switcher">
|
|
|
|
{t('Night mode')}
|
|
|
|
<div class={styles.switcher}>
|
|
|
|
<Icon name="night-theme" class={styles.icon} />
|
|
|
|
</div>
|
|
|
|
</label>
|
|
|
|
</div>
|
|
|
|
)
|
|
|
|
}
|