1 import { memo, useCallback, useRef } from 'react';
3 import { c } from 'ttag';
5 import { useUser } from '@proton/account/user/hooks';
9 CollapsibleSidebarSpotlight,
19 } from '@proton/components';
20 import SidebarStorageUpsell from '@proton/components/containers/payments/subscription/SidebarStorageUpsell';
21 import useDisplayContactsWidget from '@proton/components/hooks/useDisplayContactsWidget';
22 import { APPS } from '@proton/shared/lib/constants';
26 sendRequestCollapsibleSidebarReport,
28 } from '@proton/shared/lib/helpers/collapsibleSidebar';
29 import { isElectronApp } from '@proton/shared/lib/helpers/desktop';
30 import { CHECKLIST_DISPLAY_TYPE } from '@proton/shared/lib/interfaces';
31 import clsx from '@proton/utils/clsx';
33 import { useMailDispatch, useMailSelector } from 'proton-mail/store/hooks';
35 import { MESSAGE_ACTIONS } from '../../constants';
36 import { useOnCompose } from '../../containers/ComposeProvider';
37 import { useGetStartedChecklist } from '../../containers/onboardingChecklist/provider/GetStartedChecklistProvider';
38 import { ComposeTypes } from '../../hooks/composer/useCompose';
39 import { layoutActions } from '../../store/layout/layoutSlice';
40 import { selectLayoutIsExpanded } from '../../store/layout/layoutSliceSelectors';
41 import OnboardingChecklistSidebar from '../onboarding/checklist/sidebar/OnboardingChecklistSidebar';
42 import MailSidebarList from './MailSidebarList';
43 import MailSidebarPrimaryButton from './MailSidebarPrimaryButton';
49 const MailSidebar = ({ labelID }: Props) => {
51 const [user] = useUser();
52 const [showSideBar, setshowSideBar] = useLocalState(true, `${user.ID}-${APPS.PROTONMAIL}-left-nav-opened`);
53 const { viewportWidth } = useActiveBreakpoint();
54 const collapsed = !showSideBar && !viewportWidth['<=small'];
56 const onCompose = useOnCompose();
57 const dispatch = useMailDispatch();
58 const expanded = useMailSelector(selectLayoutIsExpanded);
59 const { displayState } = useGetStartedChecklist();
60 const handleCompose = useCallback(() => {
61 void onCompose({ type: ComposeTypes.newMessage, action: MESSAGE_ACTIONS.NEW });
64 const logo = <SidebarLogo collapsed={collapsed} to="/inbox" app={APPS.PROTONMAIL} />;
66 const displayContactsInHeader = useDisplayContactsWidget();
68 const onClickExpandNav = (sourceEvent = SOURCE_EVENT.BUTTON_SIDEBAR) => {
69 sendRequestCollapsibleSidebarReport({
71 action: showSideBar ? COLLAPSE_EVENTS.COLLAPSE : COLLAPSE_EVENTS.EXPAND,
72 application: APPS.PROTONMAIL,
75 setshowSideBar(!showSideBar);
78 const navigationRef = useRef<HTMLDivElement>(null);
80 const { isScrollPresent } = useLeftSidebarButton({
87 appsDropdown={<AppsDropdown app={APPS.PROTONMAIL} />}
89 onToggleExpand={() => {
90 dispatch(layoutActions.toggleSidebarExpand());
92 primary={<MailSidebarPrimaryButton collapsed={collapsed} handleCompose={handleCompose} />}
94 version={<AppVersion />}
95 preFooter={<SidebarStorageUpsell app={APPS.PROTONMAIL} />}
97 showStorage={showSideBar}
98 navigationRef={navigationRef}
100 <SidebarNav className="flex *:min-size-auto">
105 {displayContactsInHeader && (
107 toggleHeaderDropdown={() => {
108 dispatch(layoutActions.setSidebarExpanded(false));
112 {displayState === CHECKLIST_DISPLAY_TYPE.REDUCED && !collapsed && (
113 <OnboardingChecklistSidebar />
117 collapsed={collapsed}
118 onClickExpandNav={onClickExpandNav}
125 !collapsed && 'absolute bottom-0 right-0 mb-11',
126 isScrollPresent && 'sidebar-collapse-button-container--above-scroll'
129 <CollapsibleSidebarSpotlight app={APPS.PROTONMAIL}>
130 {collapsed && <div aria-hidden="true" className="border-top my-1 mx-3"></div>}
134 ? c('Action').t`Collapse navigation bar`
135 : c('Action').t`Display navigation bar`
137 originalPlacement="right"
141 'hidden md:flex sidebar-collapse-button navigation-link-header-group-control color-weak shrink-0',
142 !showSideBar && 'sidebar-collapse-button--collapsed',
143 collapsed ? 'mx-auto' : 'mr-2 ml-auto',
144 isScrollPresent && 'sidebar-collapse-button--above-scroll'
146 onClick={() => onClickExpandNav()}
147 aria-pressed={showSideBar}
150 name={showSideBar ? 'chevrons-left' : 'chevrons-right'}
151 alt={c('Action').t`Show navigation bar`}
155 </CollapsibleSidebarSpotlight>
163 export default memo(MailSidebar);