120 lines
3.0 KiB
TypeScript
120 lines
3.0 KiB
TypeScript
import { useMemo } from 'react';
|
|
import { endpoints, fetcher } from 'src/lib/axios';
|
|
import type { IPostItem } from 'src/types/blog';
|
|
import type { SWRConfiguration } from 'swr';
|
|
import useSWR from 'swr';
|
|
|
|
// ----------------------------------------------------------------------
|
|
|
|
const swrOptions: SWRConfiguration = {
|
|
revalidateIfStale: false,
|
|
revalidateOnFocus: false,
|
|
revalidateOnReconnect: false,
|
|
};
|
|
|
|
// ----------------------------------------------------------------------
|
|
|
|
type PostsData = {
|
|
posts: IPostItem[];
|
|
};
|
|
|
|
export function useGetPosts() {
|
|
const url = endpoints.post.list;
|
|
|
|
const { data, isLoading, error, isValidating } = useSWR<PostsData>(url, fetcher, swrOptions);
|
|
|
|
const memoizedValue = useMemo(
|
|
() => ({
|
|
posts: data?.posts || [],
|
|
postsLoading: isLoading,
|
|
postsError: error,
|
|
postsValidating: isValidating,
|
|
postsEmpty: !isLoading && !data?.posts.length,
|
|
}),
|
|
[data?.posts, error, isLoading, isValidating]
|
|
);
|
|
|
|
return memoizedValue;
|
|
}
|
|
|
|
// ----------------------------------------------------------------------
|
|
|
|
type PostData = {
|
|
post: IPostItem;
|
|
};
|
|
|
|
export function useGetPost(title: string) {
|
|
const url = title ? [endpoints.post.details, { params: { title } }] : '';
|
|
|
|
const { data, isLoading, error, isValidating } = useSWR<PostData>(url, fetcher, swrOptions);
|
|
|
|
const memoizedValue = useMemo(
|
|
() => ({
|
|
post: data?.post,
|
|
postLoading: isLoading,
|
|
postError: error,
|
|
postValidating: isValidating,
|
|
}),
|
|
[data?.post, error, isLoading, isValidating]
|
|
);
|
|
|
|
return memoizedValue;
|
|
}
|
|
|
|
// ----------------------------------------------------------------------
|
|
|
|
type LatestPostsData = {
|
|
latestPosts: IPostItem[];
|
|
};
|
|
|
|
export function useGetLatestPosts(title: string) {
|
|
const url = title ? [endpoints.post.latest, { params: { title } }] : '';
|
|
|
|
const { data, isLoading, error, isValidating } = useSWR<LatestPostsData>(
|
|
url,
|
|
fetcher,
|
|
swrOptions
|
|
);
|
|
|
|
const memoizedValue = useMemo(
|
|
() => ({
|
|
latestPosts: data?.latestPosts || [],
|
|
latestPostsLoading: isLoading,
|
|
latestPostsError: error,
|
|
latestPostsValidating: isValidating,
|
|
latestPostsEmpty: !isLoading && !data?.latestPosts.length,
|
|
}),
|
|
[data?.latestPosts, error, isLoading, isValidating]
|
|
);
|
|
|
|
return memoizedValue;
|
|
}
|
|
|
|
// ----------------------------------------------------------------------
|
|
|
|
type SearchResultsData = {
|
|
results: IPostItem[];
|
|
};
|
|
|
|
export function useSearchPosts(query: string) {
|
|
const url = query ? [endpoints.post.search, { params: { query } }] : '';
|
|
|
|
const { data, isLoading, error, isValidating } = useSWR<SearchResultsData>(url, fetcher, {
|
|
...swrOptions,
|
|
keepPreviousData: true,
|
|
});
|
|
|
|
const memoizedValue = useMemo(
|
|
() => ({
|
|
searchResults: data?.results || [],
|
|
searchLoading: isLoading,
|
|
searchError: error,
|
|
searchValidating: isValidating,
|
|
searchEmpty: !isLoading && !isValidating && !data?.results.length,
|
|
}),
|
|
[data?.results, error, isLoading, isValidating]
|
|
);
|
|
|
|
return memoizedValue;
|
|
}
|