pl-fe: migrate search to react-query

Signed-off-by: marcin mikołajczak <git@mkljczk.pl>
This commit is contained in:
marcin mikołajczak
2024-11-09 19:48:02 +01:00
parent 7609a7e2a7
commit 42f7226594
13 changed files with 309 additions and 509 deletions

View File

@ -0,0 +1,108 @@
import { useInfiniteQuery } from '@tanstack/react-query';
import { importEntities } from 'pl-fe/actions/importer';
import { useAppDispatch } from 'pl-fe/hooks/use-app-dispatch';
import { useClient } from 'pl-fe/hooks/use-client';
import type { SearchParams } from 'pl-api';
import type { PaginationParams } from 'pl-api/dist/params/common';
const useSearchAccounts = (
query: string,
params?: Omit<SearchParams, keyof PaginationParams | 'type' | 'offset'>,
) => {
const client = useClient();
const dispatch = useAppDispatch();
const searchQuery = useInfiniteQuery({
queryKey: ['search', 'accounts', query, params],
queryFn: ({ pageParam, signal }) => client.search.search(query!, {
with_relationships: true,
...params,
offset: pageParam ? data?.length : 0,
type: 'accounts',
}, { signal }).then(({ accounts }) => {
dispatch(importEntities({ accounts }));
return accounts.map(({ id }) => id);
}),
enabled: !!query?.trim(),
initialPageParam: [''],
getNextPageParam: (page) => page.length ? page : undefined,
select: (data => data.pages.flat()),
});
const data: Array<string> | undefined = searchQuery.data;
return searchQuery;
};
const useSearchStatuses = (
query: string,
params?: Omit<SearchParams, keyof PaginationParams | 'type' | 'offset'>,
) => {
const client = useClient();
const dispatch = useAppDispatch();
return useInfiniteQuery({
queryKey: ['search', 'statuses', query, params],
queryFn: ({ pageParam: offset, signal }) => client.search.search(query, {
with_relationships: true,
...params,
offset,
type: 'statuses',
}, { signal }).then(({ statuses }) => {
dispatch(importEntities({ statuses }));
return statuses.map(({ id }) => id);
}),
enabled: !!query?.trim(),
initialPageParam: 0,
getNextPageParam: (_, allPages) => allPages.flat().length,
select: (data => data.pages.flat()),
});
};
const useSearchHashtags = (
query: string,
params?: Omit<SearchParams, keyof PaginationParams | 'type' | 'offset'>,
) => {
const client = useClient();
return useInfiniteQuery({
queryKey: ['search', 'hashtags', query, params],
queryFn: ({ pageParam: offset, signal }) => client.search.search(query, {
...params,
offset,
type: 'hashtags',
}, { signal }).then(({ hashtags }) => hashtags),
enabled: !!query?.trim(),
initialPageParam: 0,
getNextPageParam: (_, allPages) => allPages.flat().length,
select: (data => data.pages.flat()),
});
};
const useSearchGroups = (
query: string,
params?: Omit<SearchParams, keyof PaginationParams | 'type' | 'offset'>,
) => {
const client = useClient();
const dispatch = useAppDispatch();
return useInfiniteQuery({
queryKey: ['search', 'groups', query, params],
queryFn: ({ pageParam: offset, signal }) => client.search.search(query, {
...params,
offset,
type: 'groups',
}, { signal }).then(({ groups }) => {
dispatch(importEntities({ groups }));
return groups.map(({ id }) => id);
}),
enabled: !!query?.trim(),
initialPageParam: 0,
getNextPageParam: (_, allPages) => allPages.flat().length,
select: (data => data.pages.flat()),
});
};
export { useSearchAccounts, useSearchStatuses, useSearchHashtags, useSearchGroups };