'use client' import { currentScroll, globalNotifPage, globalRole, keyWibu, ReloadButtonTop, TEMA } from "@/module/_global"; import { useHookstate } from "@hookstate/core"; import { ActionIcon, Badge, Box, Divider, Flex, Grid, Group, Skeleton, Spoiler, Text, TextInput } from "@mantine/core"; import { useShallowEffect } from "@mantine/hooks"; import _ from "lodash"; import { useRouter, useSearchParams } from "next/navigation"; import { useEffect, useState } from "react"; import toast from "react-hot-toast"; import { BiSolidCommentDetail } from "react-icons/bi"; import { GrChatOption } from "react-icons/gr"; import { HiMagnifyingGlass } from "react-icons/hi2"; import { useWibuRealtime } from "wibu-realtime"; import { funGetAllDiscussionGeneral } from "../lib/api_discussion_general"; export default function ListDiscussionGeneral() { const [isData, setData] = useState([]) const [searchQuery, setSearchQuery] = useState('') const [loading, setLoading] = useState(true) const tema = useHookstate(TEMA) const router = useRouter() const { value: containerRef } = useHookstate(currentScroll) const searchParams = useSearchParams() const status = searchParams.get('active') const group = searchParams.get('group') const roleLogin = useHookstate(globalRole) const [nameGroup, setNameGroup] = useState('') const [isPage, setPage] = useState(1) const notifLoadPage = useHookstate(globalNotifPage) const [isRefresh, setRefresh] = useState(false) const [dataRealTime, setDataRealtime] = useWibuRealtime({ WIBU_REALTIME_TOKEN: keyWibu, project: "sdm" }) const getData = async (loading: boolean) => { try { setLoading(loading) const response = await funGetAllDiscussionGeneral('?active=' + status + '&group=' + group + '&search=' + searchQuery + '&page=' + isPage) if (response.success) { setNameGroup(response.filter.name) if (isPage == 1) { setData(response.data) } else { setData([...isData, ...response.data]) } } else { toast.error(response.message) } } catch (error) { console.error(error) } finally { setLoading(false) } } useShallowEffect(() => { getData(false) }, [isPage]) useShallowEffect(() => { setPage(1) getData(true) }, [searchQuery, status]) useEffect(() => { const handleScroll = async () => { if (containerRef && containerRef.current) { const scrollTop = containerRef.current.scrollTop; const containerHeight = containerRef.current.clientHeight; const scrollHeight = containerRef.current.scrollHeight; if (scrollTop + containerHeight >= scrollHeight) { setPage(isPage + 1) } } }; const container = containerRef?.current; container?.addEventListener("scroll", handleScroll); return () => { container?.removeEventListener("scroll", handleScroll); }; }, [containerRef, isPage]); useShallowEffect(() => { if (notifLoadPage.get().category == 'discussion-general' && notifLoadPage.get().load == true) { setRefresh(true) } }, [notifLoadPage.get().load]) useShallowEffect(() => { if (dataRealTime && dataRealTime.some((i: any) => i.category == 'discussion-general')) { setRefresh(true) } }, [dataRealTime]) function onRefresh() { notifLoadPage.set({ category: '', load: false }) setRefresh(false) setPage(1) setTimeout(() => { getData(false) }, 500) } return ( { isRefresh && { onRefresh() }} title='UPDATE' /> } } placeholder="Pencarian" value={searchQuery} onChange={(e) => setSearchQuery(e.target.value)} /> {roleLogin.get() == 'supadmin' && Filter : {nameGroup}} {loading ? Array(3) .fill(null) .map((_, i) => ( )) : _.isEmpty(isData) ? Tidak ada Diskusi : isData.map((v, i) => { return ( { router.push(`discussion/${v.id}`) }}> {v.title} { status != "false" && {v.status === 1 ? "BUKA" : "TUTUP"} } {v.createdAt} { router.push(`/discussion/${v.id}`) }} > {v.desc} Diskusikan {v.total_komentar} Komentar {isData.length <= 1 ? "" : } ); }) } ) }