Skip to content

Commit 728e82e

Browse files
authored
feat: persist sidebar open/close state (#17559)
* feat: persist sidebar open/close state * fix typo * remove extra comments * feat: handle very long folder names * feat: folders empty state * refactor: get rid of hook and make status 3 options
1 parent 40045de commit 728e82e

File tree

6 files changed

+58
-32
lines changed

6 files changed

+58
-32
lines changed

src/script/page/LeftSidebar/panels/Conversations/ConversationHeader/ConversationHeader.styles.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,9 @@ export const label: CSSObject = {
3333
fontWeight: 'var(--font-weight-semibold)',
3434
fontSize: 'var(--font-size-base)',
3535
paddingBlock: '8px',
36+
textOverflow: 'ellipsis',
37+
overflow: 'hidden',
38+
whiteSpace: 'nowrap',
3639
};
3740

3841
export const button: CSSObject = {

src/script/page/LeftSidebar/panels/Conversations/ConversationTab/ConversationFolderTab.tsx

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -19,11 +19,18 @@
1919

2020
import cx from 'classnames';
2121

22+
import {useMatchMedia} from '@wireapp/react-ui-kit';
23+
2224
import {Config} from 'src/script/Config';
2325
import {createLabel} from 'src/script/conversation/ConversationLabelRepository';
2426
import {ConversationRepository} from 'src/script/conversation/ConversationRepository';
2527
import {Conversation} from 'src/script/entity/Conversation';
26-
import {SidebarTabs, useFolderState, useSidebarStore} from 'src/script/page/LeftSidebar/panels/Conversations/state';
28+
import {
29+
SidebarStatus,
30+
SidebarTabs,
31+
useFolderState,
32+
useSidebarStore,
33+
} from 'src/script/page/LeftSidebar/panels/Conversations/state';
2734
import {ContextMenuEntry, showContextMenu} from 'src/script/ui/ContextMenu';
2835
import {useKoSubscribableChildren} from 'Util/ComponentUtil';
2936
import {t} from 'Util/LocalizerUtil';
@@ -52,9 +59,11 @@ export const ConversationFolderTab = ({
5259
unreadConversations = [],
5360
dataUieName,
5461
}: ConversationFolderTabProps) => {
55-
const {isOpen: isSidebarOpen, setIsOpen: setIsSidebarOpen} = useSidebarStore();
62+
const {status: sidebarStatus, setStatus: setSidebarStatus} = useSidebarStore();
5663
const {openFolder, isFoldersTabOpen, toggleFoldersTab, expandedFolder} = useFolderState();
5764
const {conversationLabelRepository} = conversationRepository;
65+
const mdBreakpoint = useMatchMedia('(max-width: 1000px)');
66+
const isSideBarOpen = sidebarStatus === SidebarStatus.AUTO ? mdBreakpoint : sidebarStatus === SidebarStatus.OPEN;
5867

5968
function toggleFolder(folderId: string) {
6069
openFolder(folderId);
@@ -86,13 +95,13 @@ export const ConversationFolderTab = ({
8695
}
8796

8897
function handleToggleFoldersTab(event: React.MouseEvent<HTMLButtonElement>) {
89-
if (isSidebarOpen) {
98+
if (isSideBarOpen) {
9099
toggleFoldersTab();
91100
return;
92101
}
93102

94103
if (folders.length === 0) {
95-
setIsSidebarOpen(true);
104+
setSidebarStatus(SidebarStatus.OPEN);
96105
return;
97106
}
98107

src/script/page/LeftSidebar/panels/Conversations/Conversations.tsx

Lines changed: 7 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@ import {ConversationsList} from './ConversationsList';
4949
import {ConversationTabs} from './ConversationTabs';
5050
import {EmptyConversationList} from './EmptyConversationList';
5151
import {getTabConversations} from './helpers';
52-
import {SidebarTabs, useFolderState, useSidebarStore} from './state';
52+
import {SidebarStatus, SidebarTabs, useFolderState, useSidebarStore} from './state';
5353

5454
import {CallingViewMode, CallState} from '../../../../calling/CallState';
5555
import {createLabel} from '../../../../conversation/ConversationLabelRepository';
@@ -99,13 +99,7 @@ const Conversations: React.FC<ConversationsProps> = ({
9999
userState = container.resolve(UserState),
100100
selfUser,
101101
}) => {
102-
const {
103-
isOpen: isSideBarOpen,
104-
toggleIsOpen: toggleSidebarIsOpen,
105-
setIsOpen: setIsSidebarOpen,
106-
currentTab,
107-
setCurrentTab,
108-
} = useSidebarStore();
102+
const {currentTab, status: sidebarStatus, setStatus: setSidebarStatus, setCurrentTab} = useSidebarStore();
109103
const [conversationsFilter, setConversationsFilter] = useState<string>('');
110104
const [isConversationFilterFocused, setIsConversationFilterFocused] = useState(false);
111105
const {classifiedDomains, isTeam} = useKoSubscribableChildren(teamState, ['classifiedDomains', 'isTeam']);
@@ -148,6 +142,9 @@ const Conversations: React.FC<ConversationsProps> = ({
148142
const {openFolder, closeFolder, expandedFolder, isFoldersTabOpen, toggleFoldersTab} = useFolderState();
149143
const {currentFocus, handleKeyDown, resetConversationFocus} = useConversationFocus(conversations);
150144

145+
const mdBreakpoint = useMatchMedia('(max-width: 1000px)');
146+
const isSideBarOpen = sidebarStatus === SidebarStatus.AUTO ? mdBreakpoint : sidebarStatus === SidebarStatus.OPEN;
147+
151148
const {conversations: currentTabConversations, searchInputPlaceholder} = getTabConversations({
152149
currentTab,
153150
conversations,
@@ -167,17 +164,12 @@ const Conversations: React.FC<ConversationsProps> = ({
167164
if (isFoldersTabOpen) {
168165
toggleFoldersTab();
169166
}
170-
toggleSidebarIsOpen();
167+
168+
setSidebarStatus(isSideBarOpen ? SidebarStatus.CLOSED : SidebarStatus.OPEN);
171169
}
172170

173171
const hasNoConversations = conversations.length + connectRequests.length === 0;
174172

175-
const mdBreakpoint = useMatchMedia('(max-width: 1000px)');
176-
177-
useEffect(() => {
178-
setIsSidebarOpen(!mdBreakpoint);
179-
}, [mdBreakpoint, setIsSidebarOpen]);
180-
181173
useEffect(() => {
182174
if (activeConversation && !conversationState.isVisible(activeConversation)) {
183175
// If the active conversation is not visible, switch to the recent view

src/script/page/LeftSidebar/panels/Conversations/EmptyConversationList/EmptyConversationList.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@ export const EmptyConversationList = ({currentTab, onChangeTab, searchValue = ''
4747
</Button>
4848
);
4949

50-
if (currentTab === SidebarTabs.RECENT) {
50+
if (currentTab === SidebarTabs.RECENT || currentTab === SidebarTabs.FOLDER) {
5151
return (
5252
<div css={wrapper}>
5353
<div>

src/script/page/LeftSidebar/panels/Conversations/state.ts

Lines changed: 28 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
*/
1919

2020
import {create} from 'zustand';
21+
import {persist, createJSONStorage} from 'zustand/middleware';
2122

2223
type FolderState = {
2324
expandedFolder: string;
@@ -68,22 +69,37 @@ export enum SidebarTabs {
6869
PREFERENCES,
6970
}
7071

72+
export const SidebarStatus = {
73+
OPEN: 'OPEN',
74+
CLOSED: 'CLOSED',
75+
AUTO: 'AUTO',
76+
} as const;
77+
78+
export type SidebarStatus = (typeof SidebarStatus)[keyof typeof SidebarStatus];
79+
7180
export interface SidebarStore {
72-
isOpen: boolean;
73-
setIsOpen: (isOpen: boolean) => void;
74-
toggleIsOpen: () => void;
81+
status: SidebarStatus;
82+
setStatus: (status: SidebarStatus) => void;
7583
currentTab: SidebarTabs;
7684
setCurrentTab: (tab: SidebarTabs) => void;
7785
}
7886

79-
const useSidebarStore = create<SidebarStore>((set, get) => ({
80-
currentTab: SidebarTabs.RECENT,
81-
setCurrentTab: (tab: SidebarTabs) => {
82-
set({currentTab: tab});
83-
},
84-
isOpen: true,
85-
setIsOpen: isOpen => set({isOpen}),
86-
toggleIsOpen: () => set({isOpen: !get().isOpen}),
87-
}));
87+
const useSidebarStore = create<SidebarStore>()(
88+
persist(
89+
set => ({
90+
currentTab: SidebarTabs.RECENT,
91+
setCurrentTab: (tab: SidebarTabs) => {
92+
set({currentTab: tab});
93+
},
94+
status: SidebarStatus.CLOSED,
95+
setStatus: status => set({status: status}),
96+
}),
97+
{
98+
name: 'sidebar-store',
99+
storage: createJSONStorage(() => localStorage),
100+
partialize: state => ({status: state.status}),
101+
},
102+
),
103+
);
88104

89105
export {useFolderState, useSidebarStore};

src/style/list/conversations.less

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -167,6 +167,12 @@
167167
font-size: 12px;
168168
font-weight: 400;
169169

170+
> span {
171+
overflow: hidden;
172+
text-overflow: ellipsis;
173+
white-space: nowrap;
174+
}
175+
170176
.conversations-sidebar-btn--badge {
171177
top: 8px;
172178
left: 8px;

0 commit comments

Comments
 (0)