import React, { useState } from 'react'; import PropTypes from 'prop-types'; import { withTranslation } from 'react-i18next'; import { UncontrolledTooltip } from 'reactstrap'; import { withUnstatedContainers } from '../UnstatedUtils'; import AppContainer from '~/client/services/AppContainer'; import NavigationContainer from '~/client/services/NavigationContainer'; import { isUserPreferenceExists, isDarkMode as isDarkModeByUtil, applyColorScheme, removeUserPreference, updateUserPreference, updateUserPreferenceWithOsSettings, } from '~/client/util/color-scheme'; import UserPicture from '../User/UserPicture'; import SidebarDrawerIcon from '../Icons/SidebarDrawerIcon'; import SidebarDockIcon from '../Icons/SidebarDockIcon'; import MoonIcon from '../Icons/MoonIcon'; import SunIcon from '../Icons/SunIcon'; const PersonalDropdown = (props) => { const { t, appContainer, navigationContainer } = props; const user = appContainer.currentUser || {}; const [useOsSettings, setOsSettings] = useState(!isUserPreferenceExists()); const [isDarkMode, setIsDarkMode] = useState(isDarkModeByUtil()); const logoutHandler = () => { const { interceptorManager } = appContainer; const context = { user, currentPagePath: decodeURIComponent(window.location.pathname), }; interceptorManager.process('logout', context); window.location.href = '/logout'; }; const preferDrawerModeSwitchModifiedHandler = (bool) => { navigationContainer.setDrawerModePreference(bool); }; const preferDrawerModeOnEditSwitchModifiedHandler = (bool) => { navigationContainer.setDrawerModePreferenceOnEdit(bool); }; const followOsCheckboxModifiedHandler = (bool) => { if (bool) { removeUserPreference(); } else { updateUserPreferenceWithOsSettings(); } applyColorScheme(); // update states setOsSettings(bool); setIsDarkMode(isDarkModeByUtil()); }; const userPreferenceSwitchModifiedHandler = (bool) => { updateUserPreference(bool); applyColorScheme(); // update state setIsDarkMode(isDarkModeByUtil()); }; /* * render */ const { preferDrawerModeByUser, preferDrawerModeOnEditByUser, } = navigationContainer.state; /* eslint-disable react/prop-types */ const IconWithTooltip = ({ id, label, children, additionalClasses, }) => ( <>
{children}
{label} ); /* eslint-enable react/prop-types */ return ( <> {/* Button */} {/* remove .dropdown-toggle for hide caret */} {/* See https://stackoverflow.com/a/44577512/13183572 */}  {user.name} {/* Menu */}
{user.name}
{user.username}
{user.email}
{ t('personal_dropdown.home') } { t('personal_dropdown.settings') }
{/* Sidebar Mode */}
{t('personal_dropdown.sidebar_mode')}
preferDrawerModeSwitchModifiedHandler(!e.target.checked)} />
{/* Sidebar Mode on Editor */}
{t('personal_dropdown.sidebar_mode_editor')}
preferDrawerModeOnEditSwitchModifiedHandler(!e.target.checked)} />
{/* Color Mode */}
{t('personal_dropdown.color_mode')}
followOsCheckboxModifiedHandler(e.target.checked)} />
userPreferenceSwitchModifiedHandler(e.target.checked)} />
); }; /** * Wrapper component for using unstated */ const PersonalDropdownWrapper = withUnstatedContainers(PersonalDropdown, [AppContainer, NavigationContainer]); PersonalDropdown.propTypes = { t: PropTypes.func.isRequired, // i18next appContainer: PropTypes.instanceOf(AppContainer).isRequired, navigationContainer: PropTypes.instanceOf(NavigationContainer).isRequired, }; export default withTranslation()(PersonalDropdownWrapper);