"use client"; import { useState, useEffect, useRef } from "react"; import { useQuery } from "@tanstack/react-query"; import { PaginatedResponse } from "@/shared/types/api-response"; import { News } from "@/shared/types/news"; import newsApi from "@/shared/services/news"; import DOMPurify from "dompurify"; import { getFileUrl } from "@/shared/utils/file"; import Image from "next/image"; import Link from "next/link"; import { NewspaperIcon } from "lucide-react"; export default function NewsPage() { const [page, setPage] = useState(1); const [searchTerm, setSearchTerm] = useState(""); const [filter] = useState('["is_active=true"]'); const [debouncedSearchTerm, setDebouncedSearchTerm] = useState(""); const limit = 10; const typingTimeoutRef = useRef | undefined>( undefined, ); const { data, isLoading, isError } = useQuery>({ queryKey: ["news", page, debouncedSearchTerm, filter], queryFn: () => newsApi.getNewsList({ search: debouncedSearchTerm, filter: filter, limit: limit, offset: (page - 1) * limit, }), }); // Debounce search input useEffect(() => { if (typingTimeoutRef.current) { clearTimeout(typingTimeoutRef.current); } typingTimeoutRef.current = setTimeout(() => { setDebouncedSearchTerm(searchTerm); setPage(1); // Reset to first page when search term changes }, 500); // 500ms delay after typing stops return () => { if (typingTimeoutRef.current) { clearTimeout(typingTimeoutRef.current); } }; }, [searchTerm]); const handleSearch = (e: React.FormEvent) => { e.preventDefault(); // Immediately trigger search on form submit if (typingTimeoutRef.current) { clearTimeout(typingTimeoutRef.current); } setDebouncedSearchTerm(searchTerm); setPage(1); }; if (isError) { return (
Error loading news
); } return (

Berita dan Pengumuman

Temukan informasi yang bersifat faktual dengan sumber data terpercaya yang disajikan dalam bentuk teks.

setSearchTerm(e.target.value)} />

{data?.total || 0} Berita dan Pengumuman ditemukan

{isLoading && (
)} {!isLoading && data?.items && data?.items?.length > 0 && ( <>
{data?.items.map((newsItem) => (
{newsItem.thumbnail && (
{newsItem.name}
)}

{newsItem.name}

))}
{data?.total && data.total > limit && (
)} )} {!isLoading && data?.items.length === 0 && (

Tidak ada berita ditemukan

Coba kata kunci pencarian lain atau periksa ejaan Anda.

)}
); }