import Dropdown from '@/Components/Dropdown/Dropdown' import { DropdownItem } from '@/Components/Dropdown/DropdownItem' import { usePremiumModal } from '@/Hooks/usePremiumModal' import HorizontalSeparator from '@/Components/Shared/HorizontalSeparator' import Switch from '@/Components/Switch/Switch' import { WebApplication } from '@/Application/Application' import { ContentType, FeatureIdentifier, PrefKey, GetFeatures, SNTheme } from '@standardnotes/snjs' import { observer } from 'mobx-react-lite' import { FunctionComponent, useEffect, useState } from 'react' import { Subtitle, Title, Text } from '@/Components/Preferences/PreferencesComponents/Content' import { sortThemes } from '@/Utils/SortThemes' import PreferencesPane from '../PreferencesComponents/PreferencesPane' import PreferencesGroup from '../PreferencesComponents/PreferencesGroup' import PreferencesSegment from '../PreferencesComponents/PreferencesSegment' import { PremiumFeatureIconName } from '@/Components/Icon/PremiumFeatureIcon' import { PrefDefaults } from '@/Constants/PrefDefaults' type Props = { application: WebApplication } const Appearance: FunctionComponent = ({ application }) => { const premiumModal = usePremiumModal() const [themeItems, setThemeItems] = useState([]) const [autoLightTheme, setAutoLightTheme] = useState(() => application.getPreference(PrefKey.AutoLightThemeIdentifier, PrefDefaults[PrefKey.AutoLightThemeIdentifier]), ) const [autoDarkTheme, setAutoDarkTheme] = useState(() => application.getPreference(PrefKey.AutoDarkThemeIdentifier, PrefDefaults[PrefKey.AutoDarkThemeIdentifier]), ) const [useDeviceSettings, setUseDeviceSettings] = useState(() => application.getPreference(PrefKey.UseSystemColorScheme, PrefDefaults[PrefKey.UseSystemColorScheme]), ) useEffect(() => { const themesAsItems: DropdownItem[] = application.items .getDisplayableComponents() .filter((component) => component.isTheme()) .filter((component) => !(component as SNTheme).isLayerable()) .sort(sortThemes) .map((theme) => { return { label: theme.name, value: theme.identifier as string, } }) GetFeatures() .filter((feature) => feature.content_type === ContentType.Theme && !feature.layerable) .forEach((theme) => { if (themesAsItems.findIndex((item) => item.value === theme.identifier) === -1) { themesAsItems.push({ label: theme.name as string, value: theme.identifier, icon: PremiumFeatureIconName, }) } }) themesAsItems.unshift({ label: 'Default', value: 'Default', }) setThemeItems(themesAsItems) }, [application]) const toggleUseDeviceSettings = () => { application.setPreference(PrefKey.UseSystemColorScheme, !useDeviceSettings).catch(console.error) if (!application.getPreference(PrefKey.AutoLightThemeIdentifier)) { application .setPreference(PrefKey.AutoLightThemeIdentifier, autoLightTheme as FeatureIdentifier) .catch(console.error) } if (!application.getPreference(PrefKey.AutoDarkThemeIdentifier)) { application .setPreference(PrefKey.AutoDarkThemeIdentifier, autoDarkTheme as FeatureIdentifier) .catch(console.error) } setUseDeviceSettings(!useDeviceSettings) } const changeAutoLightTheme = (value: string, item: DropdownItem) => { if (item.icon === PremiumFeatureIconName) { premiumModal.activate(`${item.label} theme`) } else { application.setPreference(PrefKey.AutoLightThemeIdentifier, value as FeatureIdentifier).catch(console.error) setAutoLightTheme(value) } } const changeAutoDarkTheme = (value: string, item: DropdownItem) => { if (item.icon === PremiumFeatureIconName) { premiumModal.activate(`${item.label} theme`) } else { application.setPreference(PrefKey.AutoDarkThemeIdentifier, value as FeatureIdentifier).catch(console.error) setAutoDarkTheme(value) } } return ( Themes
Use system color scheme Automatically change active theme based on your system settings.
Automatic Light Theme Theme to be used for system light mode:
Automatic Dark Theme Theme to be used for system dark mode:
) } export default observer(Appearance)