import React, { FC, useCallback, useRef, } from 'react'; import { useTranslation } from 'next-i18next'; import { useRipple } from 'react-use-ripple'; import { UncontrolledTooltip } from 'reactstrap'; import { useUserUISettings } from '~/client/services/user-ui-settings'; import { usePreferDrawerModeByUser, usePreferDrawerModeOnEditByUser } from '~/stores/ui'; import { Themes, useNextThemes } from '~/stores/use-next-themes'; 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('commons'); const { isAuthenticated } = props; const { setTheme, resolvedTheme, useOsSettings, isDarkMode, isForcedByGrowiTheme, } = useNextThemes(); const { data: isPreferDrawerMode, update: updatePreferDrawerMode } = usePreferDrawerModeByUser(); const { data: isPreferDrawerModeOnEdit, mutate: mutatePreferDrawerModeOnEdit } = usePreferDrawerModeOnEditByUser(); const { scheduleToPut } = useUserUISettings(); // ripple const buttonRef = useRef(null); useRipple(buttonRef, { rippleColor: 'rgba(255, 255, 255, 0.3)' }); const preferDrawerModeSwitchModifiedHandler = useCallback((preferDrawerMode: boolean, isEditMode: boolean) => { if (isEditMode) { mutatePreferDrawerModeOnEdit(preferDrawerMode); scheduleToPut({ preferDrawerModeOnEditByUser: preferDrawerMode }); } else { updatePreferDrawerMode(preferDrawerMode); } }, [updatePreferDrawerMode, mutatePreferDrawerModeOnEdit, scheduleToPut]); const followOsCheckboxModifiedHandler = useCallback((isChecked: boolean) => { if (isChecked) { setTheme(Themes.SYSTEM); } else { setTheme(resolvedTheme ?? Themes.LIGHT); } }, [resolvedTheme, setTheme]); const userPreferenceSwitchModifiedHandler = useCallback((isDarkMode: boolean) => { setTheme(isDarkMode ? Themes.DARK : Themes.LIGHT); }, [setTheme]); /* eslint-disable react/prop-types */ const IconWithTooltip = ({ id, label, children, additionalClasses, }) => ( <>
{children}
{label} ); const dropdownDivider =
; 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 */} {/* remove .dropdown-toggle for hide caret */} {/* See https://stackoverflow.com/a/44577512/13183572 */} {/* dropdown */}
{/* sidebar mode */} {renderSidebarModeSwitch(false)} {/* side bar mode on editor */} {isAuthenticated && ( <> {dropdownDivider} {renderSidebarModeSwitch(true)} )} {/* color mode */} { !isForcedByGrowiTheme && ( <> {dropdownDivider}
{t('personal_dropdown.color_mode')}
userPreferenceSwitchModifiedHandler(e.target.checked)} />
followOsCheckboxModifiedHandler(e.target.checked)} />
) }
); };