2025-09-22 13:48:44 +00:00
|
|
|
"use client";
|
|
|
|
|
|
|
|
|
|
import { useEffect, useState } from "react";
|
|
|
|
|
import Image from "next/image";
|
|
|
|
|
import Link from "next/link";
|
|
|
|
|
import { getListArticle } from "@/service/article";
|
|
|
|
|
import { CommentIcon } from "../icons/sidebar-icon";
|
|
|
|
|
import { Button } from "../ui/button";
|
|
|
|
|
import { MessageCircle } from "lucide-react";
|
|
|
|
|
|
|
|
|
|
type Article = {
|
|
|
|
|
id: number;
|
|
|
|
|
title: string;
|
|
|
|
|
description: string;
|
|
|
|
|
categoryName: string;
|
|
|
|
|
createdAt: string;
|
|
|
|
|
createdByName: string;
|
|
|
|
|
thumbnailUrl: string;
|
|
|
|
|
categories: { title: string }[];
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
export default function Lifestyle() {
|
|
|
|
|
const [page, setPage] = useState(1);
|
|
|
|
|
const [totalPage, setTotalPage] = useState(1);
|
|
|
|
|
const [articles, setArticles] = useState<Article[]>([]);
|
|
|
|
|
const [showData, setShowData] = useState("5");
|
|
|
|
|
const [visibleCount, setVisibleCount] = useState(4);
|
|
|
|
|
const [search, setSearch] = useState("");
|
|
|
|
|
const [selectedCategories, setSelectedCategories] = useState<any>("");
|
|
|
|
|
const [startDateValue, setStartDateValue] = useState({
|
|
|
|
|
startDate: null,
|
|
|
|
|
endDate: null,
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
useEffect(() => {
|
|
|
|
|
fetchArticles();
|
|
|
|
|
}, [page, showData, startDateValue, selectedCategories]);
|
|
|
|
|
|
|
|
|
|
async function fetchArticles() {
|
|
|
|
|
const req = {
|
|
|
|
|
limit: showData,
|
|
|
|
|
page,
|
|
|
|
|
search,
|
|
|
|
|
categorySlug: Array.from(selectedCategories).join(","),
|
|
|
|
|
sort: "desc",
|
|
|
|
|
isPublish: true,
|
|
|
|
|
sortBy: "created_at",
|
|
|
|
|
};
|
|
|
|
|
try {
|
|
|
|
|
const res = await getListArticle(req);
|
|
|
|
|
setArticles(res?.data?.data || []);
|
|
|
|
|
} catch (err) {
|
|
|
|
|
console.error(err);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return (
|
|
|
|
|
<section className=" py-10 ">
|
|
|
|
|
<div className="w-full py-8 bg-white shadow border">
|
|
|
|
|
<div className="mx-auto max-w-7xl grid grid-cols-1 lg:grid-cols-3 gap-8 ">
|
|
|
|
|
<div className="lg:col-span-2">
|
|
|
|
|
<div className="flex flex-col items-start gap-3 mb-6">
|
|
|
|
|
<h2 className="text-xl font-bold text-gray-900 uppercase">
|
|
|
|
|
LIFESTYLE
|
|
|
|
|
</h2>
|
|
|
|
|
<span className="w-10 h-[3px] bg-yellow-500 inline-block"></span>
|
|
|
|
|
</div>
|
|
|
|
|
|
|
|
|
|
<div className="grid grid-cols-1 md:grid-cols-2 gap-6">
|
|
|
|
|
{articles.slice(0, visibleCount).map((item) => (
|
|
|
|
|
<Link
|
|
|
|
|
key={item.id}
|
2025-09-28 16:46:28 +00:00
|
|
|
href={`/detail/${item.id}`}
|
2025-09-22 13:48:44 +00:00
|
|
|
className="group block rounded-lg overflow-hidden"
|
|
|
|
|
>
|
|
|
|
|
<Image
|
|
|
|
|
src={item.thumbnailUrl || "/placeholder.png"}
|
|
|
|
|
alt={item.title}
|
|
|
|
|
width={500}
|
|
|
|
|
height={300}
|
|
|
|
|
className="w-full h-[280px] object-cover rounded-lg"
|
|
|
|
|
/>
|
|
|
|
|
<h3 className="mt-3 font-bold text-lg group-hover:text-yellow-600 transition">
|
|
|
|
|
{item.title}
|
|
|
|
|
</h3>
|
|
|
|
|
<div className="flex items-center gap-2 mt-2 text-sm text-gray-600">
|
|
|
|
|
<span className="font-semibold">{item.createdByName}</span>
|
|
|
|
|
<span>•</span>
|
|
|
|
|
<span>
|
|
|
|
|
{new Date(item.createdAt).toLocaleDateString("id-ID", {
|
|
|
|
|
day: "numeric",
|
|
|
|
|
month: "long",
|
|
|
|
|
year: "numeric",
|
|
|
|
|
})}
|
|
|
|
|
</span>
|
|
|
|
|
<span className="flex items-center gap-1 text-yellow-600">
|
|
|
|
|
<MessageCircle size={16} /> 0 comments
|
|
|
|
|
</span>
|
|
|
|
|
</div>
|
|
|
|
|
</Link>
|
|
|
|
|
))}
|
|
|
|
|
</div>
|
|
|
|
|
|
|
|
|
|
{visibleCount < articles.length && (
|
|
|
|
|
<div className="flex justify-center mt-8">
|
|
|
|
|
<Button
|
|
|
|
|
onClick={() => setVisibleCount((prev) => prev + 4)}
|
|
|
|
|
variant="ghost"
|
|
|
|
|
className="text-xs font-semibold text-gray-700 hover:text-yellow-600 flex items-center gap-1"
|
|
|
|
|
>
|
|
|
|
|
LOAD MORE
|
|
|
|
|
<span className="text-yellow-500">↓</span>
|
|
|
|
|
</Button>
|
|
|
|
|
</div>
|
|
|
|
|
)}
|
|
|
|
|
</div>
|
|
|
|
|
|
|
|
|
|
<div className="space-y-6 mt-16">
|
|
|
|
|
<div className="border rounded-lg p-5 bg-white shadow-sm">
|
|
|
|
|
<h4 className="font-bold text-gray-900 mb-3">
|
|
|
|
|
Subscribe us to get the latest news!
|
|
|
|
|
</h4>
|
|
|
|
|
<form className="space-y-3">
|
|
|
|
|
<label className="block text-sm font-medium text-gray-700">
|
|
|
|
|
Email address:
|
|
|
|
|
</label>
|
|
|
|
|
<input
|
|
|
|
|
type="email"
|
|
|
|
|
placeholder="Your email address"
|
|
|
|
|
className="w-full border border-gray-300 rounded-md p-2 text-sm focus:outline-none focus:ring-2 focus:ring-yellow-500"
|
|
|
|
|
/>
|
|
|
|
|
<button
|
|
|
|
|
type="submit"
|
|
|
|
|
className="w-full bg-yellow-500 hover:bg-yellow-600 text-white font-semibold py-2 rounded-md transition"
|
|
|
|
|
>
|
|
|
|
|
SIGN UP
|
|
|
|
|
</button>
|
|
|
|
|
</form>
|
|
|
|
|
</div>
|
|
|
|
|
|
|
|
|
|
<div className="relative w-[1111px] max-w-full h-[300px] overflow-hidden flex items-center mx-auto border my-6 rounded">
|
|
|
|
|
<Image
|
|
|
|
|
src="/kolom.png"
|
|
|
|
|
alt="Berita Utama"
|
|
|
|
|
fill
|
|
|
|
|
className="object-contain rounded"
|
|
|
|
|
/>
|
|
|
|
|
</div>
|
|
|
|
|
</div>
|
|
|
|
|
</div>
|
|
|
|
|
</div>
|
|
|
|
|
<div className="w-full py-8 bg-[#F1F3F8] shadow border">
|
|
|
|
|
<div className="mx-auto max-w-7xl grid grid-cols-1 lg:grid-cols-3 gap-8 ">
|
|
|
|
|
<div className="lg:col-span-2">
|
|
|
|
|
<div className="flex flex-col items-start gap-3 mb-6">
|
|
|
|
|
<h2 className="text-xl font-bold text-gray-900 uppercase">
|
|
|
|
|
BUSINESS
|
|
|
|
|
</h2>
|
|
|
|
|
<span className="w-10 h-[3px] bg-yellow-500 inline-block"></span>
|
|
|
|
|
</div>
|
|
|
|
|
|
|
|
|
|
{/* Grid artikel */}
|
|
|
|
|
<div className="grid grid-cols-1 md:grid-cols-2 gap-6">
|
|
|
|
|
{/* {articles.slice(0, visibleCount).map((item) => (
|
|
|
|
|
<Link
|
|
|
|
|
key={item.id}
|
2025-09-28 16:46:28 +00:00
|
|
|
href={`/detail/${item.id}`}
|
2025-09-22 13:48:44 +00:00
|
|
|
className="group block rounded-lg overflow-hidden"
|
|
|
|
|
>
|
|
|
|
|
<Image
|
|
|
|
|
src={item.thumbnailUrl || "/placeholder.png"}
|
|
|
|
|
alt={item.title}
|
|
|
|
|
width={500}
|
|
|
|
|
height={300}
|
|
|
|
|
className="w-full h-[280px] object-cover rounded-lg"
|
|
|
|
|
/>
|
|
|
|
|
<h3 className="mt-3 font-bold text-lg group-hover:text-yellow-600 transition">
|
|
|
|
|
{item.title}
|
|
|
|
|
</h3>
|
|
|
|
|
<div className="flex items-center gap-2 mt-2 text-sm text-gray-600">
|
|
|
|
|
<span className="font-semibold">{item.createdByName}</span>
|
|
|
|
|
<span>•</span>
|
|
|
|
|
<span>
|
|
|
|
|
{new Date(item.createdAt).toLocaleDateString("id-ID", {
|
|
|
|
|
day: "numeric",
|
|
|
|
|
month: "long",
|
|
|
|
|
year: "numeric",
|
|
|
|
|
})}
|
|
|
|
|
</span>
|
|
|
|
|
<span className="flex items-center gap-1 text-yellow-600">
|
|
|
|
|
<MessageCircle size={16} /> 0 comments
|
|
|
|
|
</span>
|
|
|
|
|
</div>
|
|
|
|
|
</Link>
|
|
|
|
|
))} */}
|
|
|
|
|
</div>
|
|
|
|
|
|
|
|
|
|
{/* Load More button */}
|
|
|
|
|
{/* {visibleCount < articles.length && (
|
|
|
|
|
<div className="flex justify-center mt-8">
|
|
|
|
|
<Button
|
|
|
|
|
onClick={() => setVisibleCount((prev) => prev + 4)}
|
|
|
|
|
className="bg-yellow-500 hover:bg-yellow-600 text-white font-semibold px-6 py-2 rounded-md"
|
|
|
|
|
>
|
|
|
|
|
Load More
|
|
|
|
|
</Button>
|
|
|
|
|
</div>
|
|
|
|
|
)} */}
|
|
|
|
|
</div>
|
|
|
|
|
|
|
|
|
|
{/* Sidebar */}
|
|
|
|
|
{/* <div className="space-y-6 mt-16">
|
|
|
|
|
|
|
|
|
|
<div className="border rounded-lg p-5 bg-white shadow-sm">
|
|
|
|
|
<h4 className="font-bold text-gray-900 mb-3">
|
|
|
|
|
Subscribe us to get the latest news!
|
|
|
|
|
</h4>
|
|
|
|
|
<form className="space-y-3">
|
|
|
|
|
<label className="block text-sm font-medium text-gray-700">
|
|
|
|
|
Email address:
|
|
|
|
|
</label>
|
|
|
|
|
<input
|
|
|
|
|
type="email"
|
|
|
|
|
placeholder="Your email address"
|
|
|
|
|
className="w-full border border-gray-300 rounded-md p-2 text-sm focus:outline-none focus:ring-2 focus:ring-yellow-500"
|
|
|
|
|
/>
|
|
|
|
|
<button
|
|
|
|
|
type="submit"
|
|
|
|
|
className="w-full bg-yellow-500 hover:bg-yellow-600 text-white font-semibold py-2 rounded-md transition"
|
|
|
|
|
>
|
|
|
|
|
SIGN UP
|
|
|
|
|
</button>
|
|
|
|
|
</form>
|
|
|
|
|
</div>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<div className="relative w-[1111px] max-w-full h-[300px] overflow-hidden flex items-center mx-auto border my-6 rounded">
|
|
|
|
|
<Image
|
|
|
|
|
src="/kolom.png"
|
|
|
|
|
alt="Berita Utama"
|
|
|
|
|
fill
|
|
|
|
|
className="object-contain rounded"
|
|
|
|
|
/>
|
|
|
|
|
</div>
|
|
|
|
|
</div> */}
|
|
|
|
|
</div>
|
|
|
|
|
</div>
|
|
|
|
|
<div className="w-full py-10 bg-white">
|
|
|
|
|
<div className="mx-auto max-w-7xl grid grid-cols-1 lg:grid-cols-3 gap-8">
|
|
|
|
|
<div className="lg:col-span-2">
|
|
|
|
|
<div className="flex flex-col items-start gap-2 mb-6">
|
|
|
|
|
<h2 className="text-2xl font-bold text-gray-900 uppercase">
|
|
|
|
|
SPORTS
|
|
|
|
|
</h2>
|
|
|
|
|
<span className="w-10 h-[3px] bg-yellow-500 inline-block"></span>
|
|
|
|
|
</div>
|
|
|
|
|
|
|
|
|
|
<div className="grid grid-cols-1 md:grid-cols-2 gap-6">
|
|
|
|
|
{articles.slice(0, visibleCount).map((item) => (
|
|
|
|
|
<Link
|
|
|
|
|
key={item.id}
|
2025-09-28 16:46:28 +00:00
|
|
|
href={`/detail/${item.id}`}
|
2025-09-22 13:48:44 +00:00
|
|
|
className="group block rounded-lg overflow-hidden"
|
|
|
|
|
>
|
|
|
|
|
<Image
|
|
|
|
|
src={item.thumbnailUrl || "/placeholder.png"}
|
|
|
|
|
alt={item.title}
|
|
|
|
|
width={500}
|
|
|
|
|
height={300}
|
|
|
|
|
className="w-full h-[200px] object-cover rounded-lg"
|
|
|
|
|
/>
|
|
|
|
|
<h3 className="mt-3 font-bold text-lg group-hover:text-yellow-600 transition">
|
|
|
|
|
{item.title}
|
|
|
|
|
</h3>
|
|
|
|
|
<div className="flex items-center gap-2 mt-2 text-xs text-gray-600 flex-wrap">
|
|
|
|
|
<span className="font-semibold">{item.createdByName}</span>
|
|
|
|
|
<span>-</span>
|
|
|
|
|
<span>
|
|
|
|
|
{new Date(item.createdAt).toLocaleDateString("id-ID", {
|
|
|
|
|
day: "numeric",
|
|
|
|
|
month: "long",
|
|
|
|
|
year: "numeric",
|
|
|
|
|
})}
|
|
|
|
|
</span>
|
|
|
|
|
</div>
|
|
|
|
|
</Link>
|
|
|
|
|
))}
|
|
|
|
|
</div>
|
|
|
|
|
|
|
|
|
|
{visibleCount < articles.length && (
|
|
|
|
|
<div className="flex justify-center mt-10">
|
|
|
|
|
<Button
|
|
|
|
|
onClick={() => setVisibleCount((prev) => prev + 4)}
|
|
|
|
|
variant="ghost"
|
|
|
|
|
className="text-xs font-semibold text-gray-700 hover:text-yellow-600 flex items-center gap-1"
|
|
|
|
|
>
|
|
|
|
|
LOAD MORE
|
|
|
|
|
<span className="text-yellow-500">↓</span>
|
|
|
|
|
</Button>
|
|
|
|
|
</div>
|
|
|
|
|
)}
|
|
|
|
|
</div>
|
|
|
|
|
|
|
|
|
|
<div className="space-y-8">
|
|
|
|
|
<div className="relative w-full h-[200px] overflow-hidden flex items-center justify-center border rounded-lg">
|
|
|
|
|
<Image
|
|
|
|
|
src="/kolom.png"
|
|
|
|
|
alt="Kolom Iklan"
|
|
|
|
|
fill
|
|
|
|
|
className="object-contain rounded"
|
|
|
|
|
/>
|
|
|
|
|
</div>
|
|
|
|
|
|
|
|
|
|
<div>
|
|
|
|
|
<h4 className="font-bold text-gray-900 mb-4">Join Us!</h4>
|
|
|
|
|
<ul className="space-y-3 text-sm">
|
|
|
|
|
<li className="flex items-center gap-2">
|
|
|
|
|
<span className="w-7 h-7 flex items-center justify-center bg-blue-600 text-white rounded-full text-xs">
|
|
|
|
|
F
|
|
|
|
|
</span>
|
|
|
|
|
Facebook
|
|
|
|
|
</li>
|
|
|
|
|
<li className="flex items-center gap-2">
|
|
|
|
|
<span className="w-7 h-7 flex items-center justify-center bg-black text-white rounded-full text-xs">
|
|
|
|
|
X
|
|
|
|
|
</span>
|
|
|
|
|
Twitter
|
|
|
|
|
</li>
|
|
|
|
|
<li className="flex items-center gap-2">
|
|
|
|
|
<span className="w-7 h-7 flex items-center justify-center bg-pink-500 text-white rounded-full text-xs">
|
|
|
|
|
IG
|
|
|
|
|
</span>
|
|
|
|
|
Instagram
|
|
|
|
|
</li>
|
|
|
|
|
<li className="flex items-center gap-2">
|
|
|
|
|
<span className="w-7 h-7 flex items-center justify-center bg-red-600 text-white rounded-full text-xs">
|
|
|
|
|
▶
|
|
|
|
|
</span>
|
|
|
|
|
Youtube
|
|
|
|
|
</li>
|
|
|
|
|
<li className="flex items-center gap-2">
|
|
|
|
|
<span className="w-7 h-7 flex items-center justify-center bg-red-400 text-white rounded-full text-xs">
|
|
|
|
|
P
|
|
|
|
|
</span>
|
|
|
|
|
Pinterest
|
|
|
|
|
</li>
|
|
|
|
|
<li className="flex items-center gap-2">
|
|
|
|
|
<span className="w-7 h-7 flex items-center justify-center bg-pink-400 text-white rounded-full text-xs">
|
|
|
|
|
D
|
|
|
|
|
</span>
|
|
|
|
|
Dribbble
|
|
|
|
|
</li>
|
|
|
|
|
</ul>
|
|
|
|
|
</div>
|
|
|
|
|
</div>
|
|
|
|
|
</div>
|
|
|
|
|
</div>
|
|
|
|
|
<div className="w-full py-10 bg-[#F1F3F8] border-t">
|
|
|
|
|
<div className="mx-auto max-w-7xl">
|
|
|
|
|
<div className="flex flex-col items-start gap-2 mb-6">
|
|
|
|
|
<h2 className="text-2xl font-bold text-gray-900 uppercase">
|
|
|
|
|
TECHNOLOGY
|
|
|
|
|
</h2>
|
|
|
|
|
<span className="w-10 h-[3px] bg-yellow-500 inline-block"></span>
|
|
|
|
|
</div>
|
|
|
|
|
|
|
|
|
|
<div className="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-6">
|
|
|
|
|
{articles.slice(0, visibleCount).map((item) => (
|
|
|
|
|
<Link
|
|
|
|
|
key={item.id}
|
2025-09-28 16:46:28 +00:00
|
|
|
href={`/detail/${item.id}`}
|
2025-09-22 13:48:44 +00:00
|
|
|
className="group block rounded-lg overflow-hidden"
|
|
|
|
|
>
|
|
|
|
|
<Image
|
|
|
|
|
src={item.thumbnailUrl || "/placeholder.png"}
|
|
|
|
|
alt={item.title}
|
|
|
|
|
width={500}
|
|
|
|
|
height={300}
|
|
|
|
|
className="w-full h-[280px] object-cover rounded-lg"
|
|
|
|
|
/>
|
|
|
|
|
<h3 className="mt-3 font-bold text-lg group-hover:text-yellow-600 transition">
|
|
|
|
|
{item.title}
|
|
|
|
|
</h3>
|
|
|
|
|
<div className="flex items-center gap-2 mt-2 text-xs text-gray-600 flex-wrap">
|
|
|
|
|
<span className="font-semibold">{item.createdByName}</span>
|
|
|
|
|
<span>-</span>
|
|
|
|
|
<span>
|
|
|
|
|
{new Date(item.createdAt).toLocaleDateString("id-ID", {
|
|
|
|
|
day: "numeric",
|
|
|
|
|
month: "long",
|
|
|
|
|
year: "numeric",
|
|
|
|
|
})}
|
|
|
|
|
</span>
|
|
|
|
|
<span className="flex items-center gap-1 text-gray-500">
|
|
|
|
|
<MessageCircle size={14} className="text-yellow-500" /> 0
|
|
|
|
|
comments
|
|
|
|
|
</span>
|
|
|
|
|
</div>
|
|
|
|
|
</Link>
|
|
|
|
|
))}
|
|
|
|
|
</div>
|
|
|
|
|
|
|
|
|
|
<div className="relative my-5 max-w-full h-[125px] overflow-hidden flex items-center mx-auto border">
|
|
|
|
|
<Image
|
|
|
|
|
src="/image-kolom.png"
|
|
|
|
|
alt="Berita Utama"
|
|
|
|
|
fill
|
|
|
|
|
className="object-cover"
|
|
|
|
|
/>
|
|
|
|
|
</div>
|
|
|
|
|
|
|
|
|
|
{visibleCount < articles.length && (
|
|
|
|
|
<div className="flex justify-center mt-10">
|
|
|
|
|
<button
|
|
|
|
|
onClick={() => setVisibleCount((prev) => prev + 3)}
|
|
|
|
|
className="text-xs font-semibold text-gray-700 hover:text-yellow-600 flex items-center gap-1"
|
|
|
|
|
>
|
|
|
|
|
LOAD MORE <span className="text-yellow-500">↓</span>
|
|
|
|
|
</button>
|
|
|
|
|
</div>
|
|
|
|
|
)}
|
|
|
|
|
</div>
|
|
|
|
|
</div>
|
|
|
|
|
<div className="w-full py-10 bg-white border-t">
|
|
|
|
|
<div className="mx-auto max-w-7xl grid grid-cols-1 lg:grid-cols-3 gap-10">
|
|
|
|
|
<div className="lg:col-span-2">
|
|
|
|
|
<div className="flex flex-col items-start gap-2 mb-6">
|
|
|
|
|
<h2 className="text-2xl font-bold text-gray-900 uppercase">
|
|
|
|
|
FASHION
|
|
|
|
|
</h2>
|
|
|
|
|
<span className="w-10 h-[3px] bg-yellow-500 inline-block"></span>
|
|
|
|
|
</div>
|
|
|
|
|
|
|
|
|
|
<div className="space-y-8">
|
|
|
|
|
{articles.slice(0, visibleCount).map((item) => (
|
|
|
|
|
<Link
|
|
|
|
|
key={item.id}
|
2025-09-28 16:46:28 +00:00
|
|
|
href={`/detail/${item.id}`}
|
2025-09-22 13:48:44 +00:00
|
|
|
className="flex flex-col md:flex-row gap-5 group"
|
|
|
|
|
>
|
|
|
|
|
<Image
|
|
|
|
|
src={item.thumbnailUrl || "/placeholder.png"}
|
|
|
|
|
alt={item.title}
|
|
|
|
|
width={300}
|
|
|
|
|
height={200}
|
|
|
|
|
className="w-full md:w-[250px] h-[180px] object-cover rounded-lg"
|
|
|
|
|
/>
|
|
|
|
|
<div className="flex-1">
|
|
|
|
|
<h3 className="font-bold text-xl text-gray-900 group-hover:text-yellow-600 transition">
|
|
|
|
|
{item.title}
|
|
|
|
|
</h3>
|
|
|
|
|
<p className="text-gray-600 text-sm mt-2 line-clamp-2">
|
|
|
|
|
{item.description}
|
|
|
|
|
</p>
|
|
|
|
|
<div className="flex items-center gap-2 mt-3 text-sm text-gray-600">
|
|
|
|
|
<span className="font-semibold">
|
|
|
|
|
{item.createdByName}
|
|
|
|
|
</span>
|
|
|
|
|
<span>-</span>
|
|
|
|
|
<span>
|
|
|
|
|
{new Date(item.createdAt).toLocaleDateString("id-ID", {
|
|
|
|
|
day: "numeric",
|
|
|
|
|
month: "long",
|
|
|
|
|
year: "numeric",
|
|
|
|
|
})}
|
|
|
|
|
</span>
|
|
|
|
|
<span className="flex items-center gap-1 text-yellow-600">
|
|
|
|
|
<MessageCircle size={16} /> 0 comments
|
|
|
|
|
</span>
|
|
|
|
|
</div>
|
|
|
|
|
</div>
|
|
|
|
|
</Link>
|
|
|
|
|
))}
|
|
|
|
|
</div>
|
|
|
|
|
|
|
|
|
|
<div className="relative my-5 max-w-full h-[125px] overflow-hidden flex items-center mx-auto border">
|
|
|
|
|
<Image
|
|
|
|
|
src="/image-kolom.png"
|
|
|
|
|
alt="Berita Utama"
|
|
|
|
|
fill
|
|
|
|
|
className="object-cover"
|
|
|
|
|
/>
|
|
|
|
|
</div>
|
|
|
|
|
|
|
|
|
|
{visibleCount < articles.length && (
|
|
|
|
|
<div className="flex justify-center mt-6">
|
|
|
|
|
<button
|
|
|
|
|
onClick={() => setVisibleCount((prev) => prev + 3)}
|
|
|
|
|
className="text-sm font-semibold text-gray-700 hover:text-yellow-600 flex items-center gap-1"
|
|
|
|
|
>
|
|
|
|
|
LOAD MORE <span className="text-yellow-500">↓</span>
|
|
|
|
|
</button>
|
|
|
|
|
</div>
|
|
|
|
|
)}
|
|
|
|
|
</div>
|
|
|
|
|
|
|
|
|
|
<div>
|
|
|
|
|
<div className="flex flex-col items-start gap-2 mb-6">
|
|
|
|
|
<h2 className="text-lg font-bold text-gray-900 ">Recent Post</h2>
|
|
|
|
|
<span className="w-10 h-[3px] bg-yellow-500 inline-block"></span>
|
|
|
|
|
</div>
|
|
|
|
|
<div className="space-y-5">
|
|
|
|
|
{articles.map((post, idx) => (
|
|
|
|
|
<Link
|
|
|
|
|
key={post.id}
|
2025-09-28 16:46:28 +00:00
|
|
|
href={`/detail/${post.id}`}
|
2025-09-22 13:48:44 +00:00
|
|
|
className="flex items-start gap-3 group"
|
|
|
|
|
>
|
|
|
|
|
{/* Thumbnail */}
|
|
|
|
|
<Image
|
|
|
|
|
src={post.thumbnailUrl || "/placeholder.png"}
|
|
|
|
|
alt={post.title}
|
|
|
|
|
width={80}
|
|
|
|
|
height={80}
|
|
|
|
|
className="w-[70px] h-[70px] object-cover rounded"
|
|
|
|
|
/>
|
|
|
|
|
|
|
|
|
|
{/* Konten */}
|
|
|
|
|
<div className="flex-1">
|
|
|
|
|
<p className="text-[10px] uppercase text-yellow-600 font-bold">
|
|
|
|
|
{post.categoryName}
|
|
|
|
|
</p>
|
|
|
|
|
<h4 className="font-semibold text-sm text-gray-900 group-hover:text-yellow-600">
|
|
|
|
|
{post.title}
|
|
|
|
|
</h4>
|
|
|
|
|
<span className="text-xs text-gray-500">
|
|
|
|
|
{new Date(post.createdAt).toLocaleDateString("id-ID", {
|
|
|
|
|
day: "numeric",
|
|
|
|
|
month: "long",
|
|
|
|
|
year: "numeric",
|
|
|
|
|
})}
|
|
|
|
|
</span>
|
|
|
|
|
</div>
|
|
|
|
|
|
|
|
|
|
{/* Nomor urut */}
|
|
|
|
|
<span className="text-2xl font-bold text-yellow-500 w-8 flex-shrink-0">
|
|
|
|
|
{String(idx + 1).padStart(2, "0")}
|
|
|
|
|
</span>
|
|
|
|
|
</Link>
|
|
|
|
|
))}
|
|
|
|
|
</div>
|
|
|
|
|
</div>
|
|
|
|
|
</div>
|
|
|
|
|
</div>
|
|
|
|
|
</section>
|
|
|
|
|
);
|
|
|
|
|
}
|