fix: blogs suggestion query

This commit is contained in:
RizqiSyahrendra 2025-03-14 15:26:38 +07:00
parent 8ed94a3a4d
commit 36868e4af0
4 changed files with 50 additions and 9 deletions

View File

@ -4,7 +4,7 @@ import { RichText } from "@payloadcms/richtext-lexical/react";
import { headers } from "next/headers";
import Image from "next/image";
import { notFound } from "next/navigation";
import Blog from "./Blog";
import BlogsSuggestion from "./BlogsSuggestion";
export interface BlogDetailProps {
slug: string | undefined;
@ -121,7 +121,7 @@ export default async function BlogDetail({ slug }: BlogDetailProps) {
</section>
{/* End Section */}
<div className="mb-5">
<Blog />
<BlogsSuggestion />
</div>
</>
);

View File

@ -1,13 +1,14 @@
import React from "react";
import Image from "next/image";
import Link from "next/link";
import { fetchBlog } from "@/services/payload/blog";
import { fetchBlogSuggestion } from "@/services/payload/blog";
import { sanitizeBlogContentIntoStringPreview } from "@/utils/sanitize";
export default async function Blog() {
const data = await fetchBlog();
export default async function BlogsSuggestion() {
const data = await fetchBlogSuggestion();
if (!data?.totalDocs) return <></>;
return (
<>
{/* End Background Shape */}
@ -25,13 +26,13 @@ export default async function Blog() {
{/* Blog Posts Grid */}
<div className="row mt-n30">
{/* Post Item */}
{data?.formattedData?.slice(0, 2).map((elm: any, i: number) => (
{data?.formattedData?.map((elm, i) => (
<div key={i} className="post-prev-3 col-12 col-lg-10 offset-lg-1 col-xl-6 offset-xl-0 mt-30">
<div className="post-prev-3-container d-block d-sm-flex">
<div className="post-prev-3-img">
<Link href={elm.slug}>
<Link href={`/${elm.slug ?? ""}`}>
<Image
src={elm.imgFormatted.url}
src={elm?.imgFormatted?.url ?? ""}
width={400}
height={200}
alt="Add Image Description"
@ -41,7 +42,7 @@ export default async function Blog() {
</div>
<div className="post-prev-3-intro">
<h4 className="post-prev-3-title">
<Link href={elm.slug}>{elm.title}</Link>
<Link href={`/${elm.slug ?? ""}`}>{elm.title}</Link>
</h4>
<div className="post-prev-3-text">{sanitizeBlogContentIntoStringPreview(elm.content)}</div>
<div className="post-prev-3-info clearfix">

View File

@ -1,5 +1,6 @@
import payloadConfig from "@/payload.config";
import { formatDate } from "@/utils/datetime";
import { getRandomNumber } from "@/utils/general";
import { getPayload, Where } from "payload";
type FetchBlogParams = {
@ -51,6 +52,41 @@ export async function fetchBlog({ page, search = "", categoryId, tagId }: FetchB
};
}
export async function fetchBlogSuggestion() {
const payload = await getPayload({ config: payloadConfig });
const limitPerPage = 2;
const blogCountQuery = await payload.count({
collection: "blogs",
});
// randomize page
let page = 1;
const totalDocs = blogCountQuery.totalDocs;
if (totalDocs > limitPerPage) {
const totalPage = Math.ceil(totalDocs / limitPerPage);
page = getRandomNumber(totalPage);
}
const blogDataQuery = await payload.find({
collection: "blogs",
page,
limit: limitPerPage,
});
const formattedData = blogDataQuery.docs.map((item) => {
return {
...item,
imgFormatted: typeof item.img !== "number" ? { url: item?.img?.url ?? "", alt: item.img.alt } : undefined,
createdAtFormatted: formatDate(item.createdAt),
};
});
return {
...blogDataQuery,
formattedData,
};
}
export async function fetchBlogDetail(slug: string | undefined) {
const payload = await getPayload({ config: payloadConfig });
const blogDataQuery = await payload.find({

View File

@ -1,3 +1,7 @@
export function limitString(text: string) {
return `${text.length > 100 ? `${text.slice(0, 100)}...` : text}`;
}
export function getRandomNumber(range: number): number {
return Math.floor(Math.random() * range) + 1;
}