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 { 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 } from '../utils/Helpers' import UserModal from '../views/Modals/Inputs/UserModal' import SubscriptionModal from './SubscriptionModal' const UserProfileAvatar = () => { const navigate = useNavigate() const { mode, setMode } = useColorScheme() const { data: userProfile } = useUserProfile() const { isImpersonating, startImpersonation, stopImpersonation, canImpersonate, getEffectiveUser, } = 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 'Free' if (userProfile.subscription === 'active') { return 'Plus' } if ( userProfile.subscription === 'cancelled' && moment().isBefore(userProfile.expiration) ) { return 'Plus (expires soon)' } return 'Free' } 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 && ( Impersonating )} {isAdmin && ( <> setIsModalOpen(true)} sx={{ borderRadius: 'var(--joy-radius-sm)', '&:hover': { backgroundColor: 'var(--joy-palette-neutral-softHoverBg)', }, }} > {isImpersonating ? 'Switch User' : 'Impersonate User'} Act as another user {isImpersonating && ( stopImpersonation()} sx={{ borderRadius: 'var(--joy-radius-sm)', '&:hover': { backgroundColor: 'var(--joy-palette-neutral-softHoverBg)', }, }} > Stop Impersonating Return to your account )} )} navigate('/settings')} sx={{ borderRadius: 'var(--joy-radius-sm)', '&:hover': { backgroundColor: 'var(--joy-palette-neutral-softHoverBg)', }, }} > Settings Account & preferences navigate('/settings/circle')} sx={{ borderRadius: 'var(--joy-radius-sm)', '&:hover': { backgroundColor: 'var(--joy-palette-neutral-softHoverBg)', }, }} > Invite People Add members to your circle {isLargeScreen && ( navigate('/settings/detailed#sidepanel')} sx={{ borderRadius: 'var(--joy-radius-sm)', '&:hover': { backgroundColor: 'var(--joy-palette-neutral-softHoverBg)', }, }} > Side Panel Settings Customize layout & cards )} {isDarkMode ? : } {isDarkMode ? 'Switch to Light' : 'Switch to Dark'} Toggle theme appearance {!isPlusUser && ( setIsSubscriptionModalOpen(true)} sx={{ borderRadius: 'var(--joy-radius-sm)', '&:hover': { backgroundColor: 'var(--joy-palette-warning-softHoverBg)', }, }} > Upgrade to Plus Unlock premium features )} {/* Support support@donetick.com */} Logout { startImpersonation(user, userProfile) setIsModalOpen(false) }} onClose={() => setIsModalOpen(false)} /> setIsSubscriptionModalOpen(false)} /> ) } export default UserProfileAvatar