import React, { FC, useState, useCallback } from 'react'; import { useTranslation } from 'react-i18next'; import { UncontrolledTooltip } from 'reactstrap'; import { useUserUISettings } from '~/client/services/user-ui-settings'; import { isUserPreferenceExists, isDarkMode as isDarkModeByUtil, applyColorScheme, removeUserPreference, updateUserPreference, updateUserPreferenceWithOsSettings, } from '~/client/util/color-scheme'; import { usePreferDrawerModeByUser, usePreferDrawerModeOnEditByUser } from '~/stores/ui'; import MoonIcon from '../Icons/MoonIcon'; import SidebarDockIcon from '../Icons/SidebarDockIcon'; import SidebarDrawerIcon from '../Icons/SidebarDrawerIcon'; import SunIcon from '../Icons/SunIcon'; type AppearanceModeDropdownProps = { isAuthenticated: boolean, } export const AppearanceModeDropdown:FC = (props: AppearanceModeDropdownProps) => { const { t } = useTranslation(); const { isAuthenticated } = props; const [useOsSettings, setOsSettings] = useState(!isUserPreferenceExists()); const [isDarkMode, setIsDarkMode] = useState(isDarkModeByUtil()); const { data: isPreferDrawerMode, update: updatePreferDrawerMode } = usePreferDrawerModeByUser(); const { data: isPreferDrawerModeOnEdit, mutate: mutatePreferDrawerModeOnEdit } = usePreferDrawerModeOnEditByUser(); const { scheduleToPut } = useUserUISettings(); const preferDrawerModeSwitchModifiedHandler = useCallback((preferDrawerMode: boolean, isEditMode: boolean) => { if (isEditMode) { mutatePreferDrawerModeOnEdit(preferDrawerMode); scheduleToPut({ preferDrawerModeOnEditByUser: preferDrawerMode }); } else { updatePreferDrawerMode(preferDrawerMode); } }, [updatePreferDrawerMode, mutatePreferDrawerModeOnEdit, scheduleToPut]); const followOsCheckboxModifiedHandler = useCallback((useOsSettings: boolean) => { if (useOsSettings) { removeUserPreference(); } else { updateUserPreferenceWithOsSettings(); } applyColorScheme(); // update states setOsSettings(useOsSettings); setIsDarkMode(isDarkModeByUtil()); }, []); const userPreferenceSwitchModifiedHandler = useCallback((isDarkMode: boolean) => { updateUserPreference(isDarkMode); applyColorScheme(); // update state setIsDarkMode(isDarkModeByUtil()); }, []); /* eslint-disable react/prop-types */ const IconWithTooltip = ({ id, label, children, additionalClasses, }) => ( <>
{children}
{label} ); const renderSidebarModeSwitch = useCallback((isEditMode: boolean) => { return ( <>
{t(isEditMode ? 'personal_dropdown.sidebar_mode_editor' : 'personal_dropdown.sidebar_mode')}
preferDrawerModeSwitchModifiedHandler(!e.target.checked, isEditMode)} />
); }, [isPreferDrawerMode, isPreferDrawerModeOnEdit, preferDrawerModeSwitchModifiedHandler, t]); return ( <> {/* setting button */} {/* dropdown */}
{/* sidebar mode */} {renderSidebarModeSwitch(false)}
{/* side bar mode on editor */} {isAuthenticated && renderSidebarModeSwitch(true)}
{/* color mode */}
{t('personal_dropdown.color_mode')}
userPreferenceSwitchModifiedHandler(e.target.checked)} />
followOsCheckboxModifiedHandler(e.target.checked)} />
); };