Skip to content

Commit 9faf3d6

Browse files
committed
Preserve the active filters when switching to map view
1 parent a40306b commit 9faf3d6

2 files changed

Lines changed: 21 additions & 21 deletions

File tree

pages/accountLists/[accountListId]/contacts/ContactsWrapper.tsx

Lines changed: 13 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import { ParsedUrlQuery } from 'node:querystring';
22
import { useRouter } from 'next/router';
33
import React, { useCallback, useEffect, useMemo, useState } from 'react';
4+
import { omit } from 'lodash';
45
import { ContactsProvider } from 'src/components/Contacts/ContactsContext/ContactsContext';
56
import { TableViewModeEnum } from 'src/components/Shared/Header/ListHeader';
67
import {
@@ -66,7 +67,7 @@ export const ContactsWrapper: React.FC<Props> = ({
6667
}
6768
});
6869

69-
const [activeFilters, setActiveFilters] = useState<
70+
const [activeFiltersRaw, setActiveFilters] = useState<
7071
ContactFilterSetInput & TaskFilterSetInput
7172
>(JSON.parse(decodeURIComponent(getQueryParam(query, 'filters') ?? '{}')));
7273
const [starredFilter, setStarredFilter] = useState<
@@ -77,12 +78,21 @@ export const ContactsWrapper: React.FC<Props> = ({
7778
);
7879
const [filterPanelOpen, setFilterPanelOpen] = useState(true);
7980

81+
// Only allow the ids filter in map view, and remove the ids filter in other views
82+
const activeFilters = useMemo(() => {
83+
if (viewMode === TableViewModeEnum.Map) {
84+
return activeFiltersRaw;
85+
} else {
86+
return omit(activeFiltersRaw, 'ids');
87+
}
88+
}, [viewMode, activeFiltersRaw]);
89+
8090
const getContactHrefObject: GetContactHrefObject = useCallback(
8191
(contactId) => {
8292
// Omit the filters and searchTerm from the previous query because we don't want them in the URL
8393
// if they are empty and Next.js will still add them to the URL query even if they are undefined.
8494
// i.e. { filters: undefined, searchTerm: '' } results in a querystring of ?filters=&searchTerm
85-
const { filters: _filters, searchTerm: _searchTerm, ...newQuery } = query;
95+
const newQuery = omit(query, ['filters', 'searchTerm']);
8696

8797
const queryContactId: string[] = [];
8898
if (addViewMode && viewMode !== TableViewModeEnum.List) {
@@ -94,10 +104,7 @@ export const ContactsWrapper: React.FC<Props> = ({
94104
newQuery.contactId = queryContactId;
95105

96106
const sanitizedFilters = sanitizeFilters(activeFilters);
97-
if (
98-
viewMode !== TableViewModeEnum.Map &&
99-
Object.keys(sanitizedFilters).length
100-
) {
107+
if (Object.keys(sanitizedFilters).length) {
101108
newQuery.filters = encodeURIComponent(JSON.stringify(sanitizedFilters));
102109
}
103110

src/components/Contacts/ContactsContext/ContactsContext.tsx

Lines changed: 8 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -161,18 +161,14 @@ export const ContactsProvider: React.FC<ContactsContextProps> = ({
161161
}
162162
}, [contactsView]);
163163

164-
const contactsFilters = useMemo(() => {
165-
// Remove filters in the map view
166-
const viewFilters =
167-
viewMode === TableViewModeEnum.Map
168-
? { ids: sanitizedFilters.ids }
169-
: sanitizedFilters;
170-
return {
171-
...viewFilters,
164+
const contactsFilters = useMemo(
165+
() => ({
166+
...sanitizedFilters,
172167
...starredFilter,
173168
wildcardSearch: searchTerm as string,
174-
};
175-
}, [sanitizedFilters, viewMode, starredFilter, searchTerm]);
169+
}),
170+
[sanitizedFilters, starredFilter, searchTerm],
171+
);
176172

177173
const contactsQueryResult = useContactsQuery({
178174
variables: {
@@ -262,12 +258,9 @@ export const ContactsProvider: React.FC<ContactsContextProps> = ({
262258
) => {
263259
const newViewMode = view as TableViewModeEnum;
264260
saveContactsView(newViewMode);
265-
if (newViewMode === TableViewModeEnum.Map) {
261+
if (newViewMode === TableViewModeEnum.Map && ids.length) {
266262
// When switching to the map, make the filter only show the selected contacts, if any
267-
setActiveFilters({ ids });
268-
} else if (viewMode === TableViewModeEnum.Map) {
269-
// When switching away from the map, reset the filter to show all contacts
270-
setActiveFilters({});
263+
setActiveFilters({ ...activeFilters, ids });
271264
}
272265
};
273266
//#endregion

0 commit comments

Comments
 (0)