page.tsx 1.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344
  1. 'use server';
  2. import './style.scss';
  3. import View from './view';
  4. import { BoardSort, PostSearchType } from '@/constants/forum';
  5. import { fetchAllPosts } from '@/lib/api/forum/board';
  6. import { throwError } from '@/lib/utils/server';
  7. type Props = {
  8. searchParams: Promise<{
  9. page: number;
  10. perPage: number;
  11. sort?: BoardSort;
  12. search: PostSearchType;
  13. keyword?: string;
  14. }>;
  15. }
  16. export default async function Latest({ searchParams }: Props)
  17. {
  18. const query = await searchParams;
  19. query.page = Math.max(Number(query.page) || 1) as number;
  20. query.perPage = Math.max(Number(query.perPage) || 20) as number;
  21. query.sort = (Number(query.sort) || BoardSort.CreatedAt) as BoardSort|undefined;
  22. query.search = (Number(query.search) || PostSearchType.Subject) as PostSearchType;
  23. query.keyword = (query.keyword || '') as string|undefined;
  24. const posts = await fetchAllPosts({
  25. page: query.page as number,
  26. perPage: query.perPage as number,
  27. sort: query.sort as BoardSort|null|undefined,
  28. search: query.search as PostSearchType,
  29. keyword: query.keyword as string|null|undefined
  30. });
  31. if (!posts.success) {
  32. throwError(posts);
  33. }
  34. return (
  35. <View _query={query} _postList={posts.data!} />
  36. );
  37. }