Skip to content

Commit 9343c12

Browse files
authored
fix: no infinite soup search for query misses (#605)
1 parent 2c485e2 commit 9343c12

File tree

5 files changed

+48
-34
lines changed

5 files changed

+48
-34
lines changed

js/app/packages/app/component/UnifiedListView.tsx

Lines changed: 26 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -799,6 +799,13 @@ export function UnifiedListView(props: UnifiedListViewProps) {
799799

800800
const emailActive = useEmailLinksStatus();
801801

802+
const validSearchTerms = createMemo(() => {
803+
return debouncedSearchForService().length >= 3;
804+
});
805+
const isSearchActive = createMemo(() => {
806+
return validSearchTerms();
807+
});
808+
802809
const dssQueryParams = createMemo(
803810
(): GetItemsSoupParams => ({
804811
limit: props.defaultDisplayOptions?.limit ?? 100,
@@ -830,6 +837,7 @@ export function UnifiedListView(props: UnifiedListViewProps) {
830837
email_filters: {
831838
recipients:
832839
emailActive() &&
840+
!isSearchActive() &&
833841
view().viewType !== 'project' &&
834842
(entityTypeFilter().includes('email') ||
835843
entityTypeFilter().length === 0)
@@ -874,19 +882,6 @@ export function UnifiedListView(props: UnifiedListViewProps) {
874882
})
875883
);
876884

877-
const validSearchTerms = createMemo(() => {
878-
return debouncedSearchForService().length >= 3;
879-
});
880-
const validSearchFilters = createMemo(() => {
881-
const senders = unifiedSearchFilters()?.email?.senders;
882-
if (senders && senders.length > 0) return true;
883-
return false;
884-
});
885-
886-
const isSearchActive = createMemo(() => {
887-
return validSearchTerms() || validSearchFilters();
888-
});
889-
890885
const disableSearchService = createMemo(() => {
891886
return !isSearchActive();
892887
});
@@ -971,10 +966,13 @@ export function UnifiedListView(props: UnifiedListViewProps) {
971966
const channelsQuery = createChannelsQuery({
972967
disabled: disableChannelsQuery,
973968
});
974-
const dssInfiniteQuery = createDssInfiniteQuery(dssQueryParams, {
975-
disabled: disableDssInfiniteQuery,
976-
requestBody: dssQueryRequestBody,
977-
});
969+
const dssInfiniteQuery = createDssInfiniteQuery(
970+
dssQueryParams,
971+
dssQueryRequestBody,
972+
{
973+
disabled: disableDssInfiniteQuery,
974+
}
975+
);
978976
const searchNameContentInfiniteQuery = createUnifiedSearchInfiniteQuery(
979977
searchUnifiedNameContentQueryParams,
980978
{ disabled: disableSearchService }
@@ -988,6 +986,16 @@ export function UnifiedListView(props: UnifiedListViewProps) {
988986
};
989987
};
990988

989+
// We want to be to be able to search over locally cached emails without actually
990+
// fetching more data when we have a invalid search term (i.e. one or two chars).
991+
// If we're using search service for a valid term, we can safely fetch more data
992+
// from dss for fuzzy name search since we won't be searching over emails (too big).
993+
const disableFetchMore = createMemo(() => {
994+
const searchAllEmails =
995+
(dssQueryRequestBody().email_filters?.recipients ?? []).length === 0;
996+
return searchText().length > 0 && searchAllEmails;
997+
});
998+
991999
const { UnifiedListComponent, entities, isLoading } =
9921000
createUnifiedInfiniteList<
9931001
WithNotification<WithSearch<EntityData> | EntityData>
@@ -1011,6 +1019,7 @@ export function UnifiedListView(props: UnifiedListViewProps) {
10111019
entitySort,
10121020
searchFilter: nameFuzzySearchFilter,
10131021
isSearchActive,
1022+
disableFetchMore,
10141023
});
10151024

10161025
createEffect(() => {

js/app/packages/core/email-link/index.ts

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ import { emailClient } from '@service-email/client';
1010
import { updateUserInfo } from '@service-gql/client';
1111
import { useQuery } from '@tanstack/solid-query';
1212
import { err, okAsync, ResultAsync } from 'neverthrow';
13-
import { createSignal } from 'solid-js';
13+
import { createMemo, createSignal } from 'solid-js';
1414
import { queryClient } from '../../macro-entity/src/queries/client';
1515

1616
export const [emailRefetchInterval, setEmailRefetchInterval] = createSignal<
@@ -38,12 +38,12 @@ export function useEmailLinksQuery() {
3838

3939
export function useEmailLinksStatus() {
4040
const links = useEmailLinksQuery();
41-
return () => {
41+
return createMemo(() => {
4242
if (!links.data || links.error) {
4343
return false;
4444
}
45-
return links.data?.length > 0;
46-
};
45+
return links.data.length > 0;
46+
});
4747
}
4848

4949
function invalidateEmailLinks() {

js/app/packages/macro-entity/src/components/Provider.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@ export function Provider(props: ParentProps) {
4949
staleTime: 1000 * 10, // 10 seconds
5050
});
5151
queryClient.setQueryDefaults(queryKeys.all.dss, {
52-
staleTime: 1000 * 5, // 5 seconds
52+
staleTime: 1000 * 60, // 1 minute
5353
});
5454
queryClient.setQueryDefaults(queryKeys.all.email, {
5555
staleTime: 1000, // 1 second

js/app/packages/macro-entity/src/components/UnifiedInfiniteList.tsx

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -206,6 +206,7 @@ interface UnifiedInfiniteListContext<T extends EntityData> {
206206
entitySort?: Accessor<EntityComparator<T>>;
207207
searchFilter?: Accessor<EntitiesFilter<T> | undefined>;
208208
isSearchActive?: Accessor<boolean>;
209+
disableFetchMore?: Accessor<boolean>;
209210
}
210211

211212
export function createUnifiedInfiniteList<T extends EntityData>({
@@ -217,6 +218,7 @@ export function createUnifiedInfiniteList<T extends EntityData>({
217218
entitySort,
218219
searchFilter,
219220
isSearchActive,
221+
disableFetchMore,
220222
}: UnifiedInfiniteListContext<T>) {
221223
const [sortedEntitiesStore, setSortedEntitiesStore] = createStore<T[]>([]);
222224
const allEntities = createMemo(() => {
@@ -311,7 +313,7 @@ export function createUnifiedInfiniteList<T extends EntityData>({
311313
const searching = isSearchActive?.();
312314

313315
if (searching) {
314-
// NOTE: the default sort will be channels, then local fuzzy name, then serach service
316+
// NOTE: the default sort will be channels, then local fuzzy name, then search service
315317
// avoiding doing an extra sort as a speed optimization
316318
return entities.toSorted(sortEntitiesForSearch);
317319
}
@@ -388,7 +390,7 @@ export function createUnifiedInfiniteList<T extends EntityData>({
388390

389391
let isFetchingMore = false;
390392
const fetchMoreData = async () => {
391-
if (isFetchingMore) return;
393+
if (disableFetchMore?.() || isFetchingMore) return;
392394

393395
isFetchingMore = true;
394396
const results = entityInfiniteQueries.map((query) => {

js/app/packages/macro-entity/src/queries/dss.ts

Lines changed: 13 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -74,10 +74,12 @@ const fetchPaginatedDocumentsPost = async ({
7474
apiToken,
7575
params,
7676
requestBody,
77+
signal,
7778
}: {
7879
apiToken?: string;
7980
requestBody?: PostSoupRequest;
8081
params?: PostItemsSoupParams;
82+
signal?: AbortSignal;
8183
}) => {
8284
if (!apiToken) throw new Error('No API token provided');
8385
const Authorization = `Bearer ${apiToken}`;
@@ -93,6 +95,7 @@ const fetchPaginatedDocumentsPost = async ({
9395
headers: { Authorization, 'Content-Type': 'application/json' },
9496
method: 'POST',
9597
body: requestBody ? JSON.stringify(requestBody) : undefined,
98+
signal,
9699
});
97100
if (!response.ok)
98101
throw new Error('Failed to fetch documents', { cause: response });
@@ -102,21 +105,20 @@ const fetchPaginatedDocumentsPost = async ({
102105
};
103106

104107
export function createDssInfiniteQuery(
105-
_params?: Accessor<PostItemsSoupParams>,
108+
initialParams?: Accessor<PostItemsSoupParams>,
109+
getRequestBody?: Accessor<PostSoupRequest>,
106110
options?: {
107111
disabled?: Accessor<boolean>;
108-
requestBody?: Accessor<PostSoupRequest>;
109112
}
110113
) {
111114
const params = () => {
112-
const argParams = _params?.();
115+
const argParams = initialParams?.();
113116
let limit = 100;
114117
let sort_method;
115118
let emailView;
116-
const requestBody = options?.requestBody;
117119

118-
if (requestBody) {
119-
const body = requestBody();
120+
if (getRequestBody) {
121+
const body = getRequestBody();
120122
if (body?.limit) {
121123
limit = body.limit;
122124
}
@@ -140,7 +142,7 @@ export function createDssInfiniteQuery(
140142
const instructionsIdQuery = useInstructionsMdIdQuery();
141143

142144
return useInfiniteQuery(() => {
143-
const requestBody = options?.requestBody?.();
145+
const requestBody = getRequestBody?.();
144146
// Include all filters in query key so query refetches when any filter changes
145147
const documentFilters = requestBody?.document_filters;
146148
const projectFilters = requestBody?.project_filters;
@@ -166,12 +168,13 @@ export function createDssInfiniteQuery(
166168

167169
return {
168170
queryKey,
169-
queryHash: hashKey(queryKey),
170-
queryFn: ({ pageParam }) => {
171+
queryKeyHashFn: hashKey,
172+
queryFn: ({ pageParam, signal }) => {
171173
return fetchPaginatedDocumentsPost({
172174
apiToken: authQuery.data,
173-
requestBody: requestBody,
175+
requestBody,
174176
params: { cursor: pageParam.cursor },
177+
signal,
175178
});
176179
},
177180
initialPageParam: params(),

0 commit comments

Comments
 (0)