Files
hossein-por-shop/frontend/composables/api/documents/useSearchFile.ts
T
marzban-dev cdc0ebec26 Updated
2025-01-06 19:26:16 +03:30

78 lines
1.9 KiB
TypeScript

// imports
import { useInfiniteQuery } from "@tanstack/vue-query";
import axios from "~/configs/axios.config";
import { API_ENDPOINTS, QUERY_KEYS } from "~/constants";
import type { ComputedRef } from "vue";
// types
export type SearchFileResponse = Branch;
type HandlerProps = typeof initialPageParam & {
signal: AbortSignal,
search: string,
id: number | undefined;
sort: string | undefined;
}
// state
const initialPageParam = {
limit: 10,
offset: 0
};
// methods
export const handleSearchFile = async ({ search, offset, limit, id, signal, sort }: HandlerProps) => {
const { data } = await axios.get<SearchFileResponse>(`${API_ENDPOINTS.branch.get}/${id}`, {
params: {
offset,
limit,
search,
sort_by: sort
},
signal
});
return data;
};
// composable
const useSearchFile = (search: Ref<string>, id: Ref<number | undefined>, sort: ComputedRef<string | undefined>) => {
const enabled = computed(() => {
return search.value.trim() != "" && !!id.value;
});
return useInfiniteQuery({
enabled,
retry: false,
refetchOnMount: false,
refetchOnWindowFocus: false,
queryKey: [QUERY_KEYS.searchFile, search, id, sort],
queryFn: ({ pageParam, signal }) => handleSearchFile({
...pageParam,
signal,
search: search.value,
sort: sort.value,
id: id.value
}),
initialPageParam,
getNextPageParam: (lastPage, pages) => {
const page = pages.length + 1;
const limit = initialPageParam.limit;
const nextPageParams = {
offset: page * limit - limit,
limit
};
return lastPage?.structure.next ? nextPageParams : undefined;
}
});
};
export default useSearchFile;