import React, { useContext, useEffect, useState } from 'react'; import { slide as Menu } from 'react-burger-menu'; import constants from 'utils/strings/constants'; import { getData, LS_KEYS, setData } from 'utils/storage/localStorage'; import { getToken } from 'utils/common/key'; import { getEndpoint } from 'utils/common/apiUtil'; import { Button } from 'react-bootstrap'; import { isSubscriptionActive, getUserSubscription, isOnFreePlan, isSubscriptionCancelled, isSubscribed, convertToHumanReadable, } from 'utils/billingUtil'; import isElectron from 'is-electron'; import { Collection } from 'services/collectionService'; import { useRouter } from 'next/router'; import LinkButton from './pages/gallery/LinkButton'; import { downloadApp } from 'utils/common'; import { getUserDetails, logoutUser } from 'services/userService'; import { LogoImage } from 'pages/_app'; import { SetDialogMessage } from './MessageDialog'; import EnteSpinner from './EnteSpinner'; import RecoveryKeyModal from './RecoveryKeyModal'; import TwoFactorModal from './TwoFactorModal'; import ExportModal from './ExportModal'; import { GalleryContext, SetLoading } from 'pages/gallery'; import InProgressIcon from './icons/InProgressIcon'; import exportService from 'services/exportService'; import { Subscription } from 'services/billingService'; import { PAGES } from 'types'; import { ARCHIVE_SECTION } from 'components/pages/gallery/Collections'; interface Props { collections: Collection[]; setDialogMessage: SetDialogMessage; setLoading: SetLoading; } export default function Sidebar(props: Props) { const [usage, SetUsage] = useState(null); const [user, setUser] = useState(null); const [subscription, setSubscription] = useState(null); useEffect(() => { setUser(getData(LS_KEYS.USER)); setSubscription(getUserSubscription()); }, []); const [isOpen, setIsOpen] = useState(false); const [recoverModalView, setRecoveryModalView] = useState(false); const [twoFactorModalView, setTwoFactorModalView] = useState(false); const [exportModalView, setExportModalView] = useState(false); const galleryContext = useContext(GalleryContext); useEffect(() => { const main = async () => { if (!isOpen) { return; } const userDetails = await getUserDetails(); setUser({ ...user, email: userDetails.email }); SetUsage(convertToHumanReadable(userDetails.usage)); setSubscription(userDetails.subscription); setData(LS_KEYS.USER, { ...getData(LS_KEYS.USER), email: userDetails.email, }); setData(LS_KEYS.SUBSCRIPTION, userDetails.subscription); }; main(); }, [isOpen]); function openFeedbackURL() { const feedbackURL: string = `${getEndpoint()}/users/feedback?token=${encodeURIComponent( getToken() )}`; const win = window.open(feedbackURL, '_blank'); win.focus(); } function initiateEmail(email: string) { const a = document.createElement('a'); a.href = 'mailto:' + email; a.rel = 'noreferrer noopener'; a.click(); } // eslint-disable-next-line @typescript-eslint/no-unused-vars function exportFiles() { if (isElectron()) { setExportModalView(true); } else { props.setDialogMessage({ title: constants.DOWNLOAD_APP, content: constants.DOWNLOAD_APP_MESSAGE(), staticBackdrop: true, proceed: { text: constants.DOWNLOAD, action: downloadApp, variant: 'success', }, close: { text: constants.CLOSE, }, }); } } const router = useRouter(); function onManageClick() { setIsOpen(false); galleryContext.showPlanSelectorModal(); } return ( setIsOpen(state.isOpen)} itemListElement="div">
{user?.email}
{constants.SUBSCRIPTION_PLAN}
{isSubscriptionActive(subscription) ? ( isOnFreePlan(subscription) ? ( constants.FREE_SUBSCRIPTION_INFO( subscription?.expiryTime ) ) : isSubscriptionCancelled(subscription) ? ( constants.RENEWAL_CANCELLED_SUBSCRIPTION_INFO( subscription?.expiryTime ) ) : ( constants.RENEWAL_ACTIVE_SUBSCRIPTION_INFO( subscription?.expiryTime ) ) ) : (

{constants.SUBSCRIPTION_EXPIRED}

)}
{constants.USAGE_DETAILS}
{usage ? ( constants.USAGE_INFO( usage, convertToHumanReadable(subscription?.storage) ) ) : (
)}
{constants.REQUEST_FEATURE} initiateEmail('contact@ente.io')}> {constants.SUPPORT} <> setRecoveryModalView(false)} somethingWentWrong={() => props.setDialogMessage({ title: constants.RECOVER_KEY_GENERATION_FAILED, close: { variant: 'danger' }, }) } /> setRecoveryModalView(true)}> {constants.DOWNLOAD_RECOVERY_KEY} <> setTwoFactorModalView(false)} setDialogMessage={props.setDialogMessage} closeSidebar={() => setIsOpen(false)} setLoading={props.setLoading} /> setTwoFactorModalView(true)}> {constants.TWO_FACTOR} { router.push(PAGES.CHANGE_PASSWORD); }}> {constants.CHANGE_PASSWORD} { router.push(PAGES.CHANGE_EMAIL); }}> {constants.UPDATE_EMAIL} <> setExportModalView(false)} usage={usage} />
{constants.EXPORT}
{exportService.isExportInProgress() && ( )}
{ galleryContext.setActiveCollection(ARCHIVE_SECTION); setIsOpen(false); }}> {constants.ARCHIVE}
props.setDialogMessage({ title: `${constants.CONFIRM} ${constants.LOGOUT}`, content: constants.LOGOUT_MESSAGE, staticBackdrop: true, proceed: { text: constants.LOGOUT, action: logoutUser, variant: 'danger', }, close: { text: constants.CANCEL }, }) }> {constants.LOGOUT} props.setDialogMessage({ title: `${constants.DELETE_ACCOUNT}`, content: constants.DELETE_MESSAGE(), staticBackdrop: true, proceed: { text: constants.DELETE_ACCOUNT, action: () => { initiateEmail('account-deletion@ente.io'); }, variant: 'danger', }, close: { text: constants.CANCEL }, }) }> {constants.DELETE_ACCOUNT}
); }