import { AdminPanelSettings, DarkModeOutlined, GroupAdd, LightModeOutlined, Logout, Person, Settings, SwapHoriz, Tune, WorkspacePremium, } from '@mui/icons-material' import { Avatar, Box, Divider, Dropdown, ListItemContent, ListItemDecorator, Menu, MenuButton, MenuItem, Sheet, Typography, useColorScheme, } from '@mui/joy' import { useMediaQuery } from '@mui/material' import moment from 'moment' import { useState } from 'react' import { useTranslation } from 'react-i18next' import { useNavigate } from 'react-router-dom' import { useImpersonateUser } from '../contexts/ImpersonateUserContext' import useStickyState from '../hooks/useStickyState' import { useCircleMembers, useUserProfile } from '../queries/UserQueries' import { apiClient } from '../utils/ApiClient' import { isPlusAccount, resolvePhotoURL } from '../utils/Helpers' import UserModal from '../views/Modals/Inputs/UserModal' import SubscriptionModal from './SubscriptionModal' const UserProfileAvatar = () => { const { t } = useTranslation('common') const navigate = useNavigate() const { mode, setMode } = useColorScheme() const { data: userProfile } = useUserProfile() const { canImpersonate, getEffectiveUser, isImpersonating, startImpersonation, stopImpersonation, } = useImpersonateUser() const { data: circleMembersData } = useCircleMembers() const [isModalOpen, setIsModalOpen] = useState(false) const [isSubscriptionModalOpen, setIsSubscriptionModalOpen] = useState(false) const [themeMode, setThemeMode] = useStickyState(mode, 'themeMode') const isLargeScreen = useMediaQuery(theme => theme.breakpoints.up('lg')) if (!userProfile) return null const currentUser = getEffectiveUser(userProfile) const isAdmin = canImpersonate(userProfile, circleMembersData?.res) const isPlusUser = isPlusAccount(userProfile) const getSubscriptionStatus = () => { if (!userProfile) return t('userMenu.planFree') if (userProfile.subscription === 'active') { return t('userMenu.planPlus') } if ( userProfile.subscription === 'cancelled' && moment().isBefore(userProfile.expiration) ) { return t('userMenu.planPlusExpiring') } return t('userMenu.planFree') } const handleLogout = () => { apiClient.handleLogout() } const handleSupportEmail = () => { window.location.href = 'mailto:support@donetick.com' } const isDarkMode = themeMode === 'dark' const handleThemeToggle = () => { const newThemeMode = isDarkMode ? 'light' : 'dark' setThemeMode(newThemeMode) setMode(newThemeMode) } return ( <> {isImpersonating ? ( ) : ( )} {currentUser?.displayName || currentUser?.name} {currentUser?.email} {isPlusUser && ( {getSubscriptionStatus()} )} {isImpersonating && ( {t('userMenu.impersonating')} )} {isAdmin && ( <> setIsModalOpen(true)} sx={{ borderRadius: 'var(--joy-radius-sm)', '&:hover': { backgroundColor: 'var(--joy-palette-neutral-softHoverBg)', }, }} > {isImpersonating ? t('userMenu.switchUser') : t('userMenu.impersonateUser')} {t('userMenu.actAsAnother')} {isImpersonating && ( stopImpersonation()} sx={{ borderRadius: 'var(--joy-radius-sm)', '&:hover': { backgroundColor: 'var(--joy-palette-neutral-softHoverBg)', }, }} > {t('userMenu.stopImpersonating')} {t('userMenu.returnToAccount')} )} )} navigate('/settings')} sx={{ borderRadius: 'var(--joy-radius-sm)', '&:hover': { backgroundColor: 'var(--joy-palette-neutral-softHoverBg)', }, }} > {t('settings')} {t('userMenu.accountPrefs')} navigate('/settings/circle')} sx={{ borderRadius: 'var(--joy-radius-sm)', '&:hover': { backgroundColor: 'var(--joy-palette-neutral-softHoverBg)', }, }} > {t('userMenu.invitePeople')} {t('userMenu.addMembers')} {isLargeScreen && ( navigate('/settings/detailed#sidepanel')} sx={{ borderRadius: 'var(--joy-radius-sm)', '&:hover': { backgroundColor: 'var(--joy-palette-neutral-softHoverBg)', }, }} > {t('userMenu.sidePanelSettings')} Customize layout & cards )} {isDarkMode ? : } {isDarkMode ? t('userMenu.switchToLight') : t('userMenu.switchToDark')} {t('userMenu.toggleThemeAppearance')} {!isPlusUser && ( navigate('/settings/account')} sx={{ borderRadius: 'var(--joy-radius-sm)', '&:hover': { backgroundColor: 'var(--joy-palette-warning-softHoverBg)', }, }} > {t('userMenu.upgradeToPlus')} {t('userMenu.unlockPremium')} )} {/* Support support@donetick.com */} {t('logout')} { startImpersonation(user, userProfile) setIsModalOpen(false) }} onClose={() => setIsModalOpen(false)} /> setIsSubscriptionModalOpen(false)} /> ) } export default UserProfileAvatar