"use client"; import { Autocomplete, AutocompleteItem, BreadcrumbItem, Breadcrumbs, Button, DatePicker, Image, Input, Listbox, ListboxItem, Pagination, Popover, PopoverContent, PopoverTrigger, Select, SelectItem, } from "@heroui/react"; import { CalendarIcon, Calender, ChevronLeftIcon, ChevronRightIcon, ClockIcon, EyeFilledIcon, SearchIcon, TimesIcon, UserIcon, } from "../../icons"; import Link from "next/link"; import { useCallback, useEffect, useRef, useState } from "react"; import { getArticleByCategoryLanding, getListArticle, } from "@/services/article"; import { convertDateFormatNoTimeV2, formatMonthString, htmlToString, textEllipsis, } from "@/utils/global"; import { useParams, usePathname, useRouter, useSearchParams, } from "next/navigation"; import { close, loading } from "@/config/swal"; import { format } from "date-fns"; import { getCategoryById } from "@/services/master-categories"; import AsyncSelect from "react-select/async"; const months = [ "Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec", ]; export default function ListNews() { const [article, setArticle] = useState([]); const [page, setPage] = useState(1); const router = useRouter(); const pathname = usePathname(); const [totalPage, setTotalPage] = useState(1); const topRef = useRef(null); const params = useParams(); const category = params?.name; const searchParams = useSearchParams(); const categoryIds = searchParams.get("category_id"); const [categories, setCategories] = useState([]); const [searchValue, setSearchValue] = useState( searchParams.get("search") || "" ); const [categorySearch, setCategorySearch] = useState(""); const [selectedCategoryId, setSelectedCategoryId] = useState([]); const today = new Date(); const [year, setYear] = useState(today.getFullYear()); const [selectedMonth, setSelectedMonth] = useState( searchParams.get("month") ? Number(searchParams.get("month")) - 1 : null ); const [selectedDate, setSelectedDate] = useState(null); const handleMonthClick = (monthIndex: number) => { setSelectedMonth(monthIndex); setSelectedDate(new Date(year, monthIndex, 1)); }; useEffect(() => { const search = searchParams.get("search"); const category = searchParams.get("category_id"); if (searchParams.get("search")) { setSearchValue(String(searchParams.get("search"))); getArticle({ title: String(search) }); } if (category && category !== "") { getCategoryFromQueries(category.split(",")); } }, [searchParams]); const getCategoryFromQueries = async (category: string[]) => { const temp = []; for (const element of category) { const res = await getCategoryById(Number(element)); if (res?.data?.data) { temp.push(res?.data?.data); } } const setup = setupCategory(temp); setSelectedCategoryId(setup); getArticle({ category: setup }); }; useEffect(() => { getArticle(); }, [page, searchParams]); async function getArticle(props?: { title?: string; category?: any }) { loading(); // topRef.current?.scrollIntoView({ behavior: "smooth" }); const req = { page: page, search: props?.title || searchValue || "", limit: "9", isPublish: true, sort: "desc", categorySlug: pathname.includes("polda") || pathname.includes("satker") ? String(category) : "", categoryIds: props?.category ? props.category.map((val: any) => val.id).join(",") : selectedCategoryId.length > 0 ? selectedCategoryId.map((val: any) => val.id).join(",") : "", startDate: selectedDate && selectedMonth !== null ? convertDateFormatNoTimeV2(new Date(year, selectedMonth, 1)) : "", endDate: selectedDate && selectedMonth !== null ? convertDateFormatNoTimeV2(new Date(year, selectedMonth + 1, 0)) : "", }; const response = await getListArticle(req); setArticle(response?.data?.data); setTotalPage(response?.data?.meta?.totalPage); close(); } const debounceTimeout = useRef(null); const getCategory = async (search?: string) => { const res = await getArticleByCategoryLanding({ // limit: debouncedValue === "" ? "5" : "", // title: debouncedValue, limit: !search || search === "" ? "5" : "", title: search ? search : "", }); if (res?.data?.data) { setCategories(res?.data?.data); return res?.data?.data; } return []; }; const setupCategory = (data: any) => { const temp = []; for (const element of data) { temp.push({ id: element.id, label: element.title, value: element.id, }); } return temp; }; const loadOptions = useCallback( (inputValue: string, callback: (options: any) => void) => { if (debounceTimeout.current) { clearTimeout(debounceTimeout.current); } debounceTimeout.current = setTimeout(async () => { try { const data = await getCategory(inputValue); callback(setupCategory(data)); } catch (error) { callback([]); } }, 1500); }, [] ); return (
Beranda

Berita

{ // if (event.key === "Enter") { // router.push(pathname + `?search=${searchValue}`); // getArticle(); // } // }} labelPlacement="outside" placeholder="Judul..." value={searchValue} onValueChange={setSearchValue} type="search" /> "border border-gray-300 border-1 rounded-xl min-w-[300px] max-w-[600px]", menu: () => "z-50", }} value={selectedCategoryId} onChange={setSelectedCategoryId} />
{" "} {selectedDate ? format(selectedDate, "MMMM yyyy") : "Pilih Bulan"}
{year}
{months.map((month, idx) => ( ))}
{" "} {selectedDate && ( setSelectedDate(null)} > )}
{/* */}
{article?.length < 1 || !article ? (
Tidak ada Data
) : ( <>
{article?.map((news: any) => (
thumbnail
{news?.title}

{formatMonthString(news?.createdAt)}

{`${new Date(news?.createdAt) .getHours() .toString() .padStart(2, "0")}:${new Date(news?.createdAt) .getMinutes() .toString() .padStart(2, "0")}`}

{news?.createdByName}

{textEllipsis(htmlToString(news?.description), 165)}
))}
)}
); }