Files
HKSingleParty/03_source/frontend/src/actions/blog.ts
louiscklaw 253c2f2487 update,
2025-06-15 04:23:06 +08:00

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;
}