import { currentScroll, globalNotifPage, ReloadButtonTop, SkeletonList, TEMA } from "@/module/_global"; import { ActionIcon, Avatar, Box, Card, Center, Divider, Flex, Grid, Group, Progress, Skeleton, Text, TextInput, Title } from "@mantine/core"; import { useParams, useRouter, useSearchParams } from "next/navigation"; import { useEffect, useState } from "react"; import { HiMagnifyingGlass, HiMiniPresentationChartBar, HiOutlineListBullet, HiSquares2X2 } from "react-icons/hi2"; import { MdAccountCircle } from "react-icons/md"; import { IDataTask } from "../lib/type_task"; import { funGetAllTask } from "../lib/api_task"; import toast from "react-hot-toast"; import { useMediaQuery, useShallowEffect } from "@mantine/hooks"; import _ from "lodash"; import { useHookstate } from "@hookstate/core"; export default function ListDivisionTask() { const [isList, setIsList] = useState(false) const router = useRouter() const [isData, setData] = useState([]) const param = useParams<{ id: string }>() const searchParams = useSearchParams() const status = searchParams.get('status') const [searchQuery, setSearchQuery] = useState('') const [loading, setLoading] = useState(true); const tema = useHookstate(TEMA) const paddingLift = useMediaQuery('(max-width: 505px)') const { value: containerRef } = useHookstate(currentScroll) const [isPage, setPage] = useState(1) const [totalData, setTotalData] = useState(0) const [isRefresh, setRefresh] = useState(false) const notifLoadPage = useHookstate(globalNotifPage) const handleList = () => { setIsList(!isList) } const fetchData = async (loading: boolean) => { try { setLoading(loading) const response = await funGetAllTask('?division=' + param.id + '&status=' + status + '&search=' + searchQuery + '&page=' + isPage) if (response.success) { setTotalData(response.total) if (isPage == 1) { setData(response?.data) } else { setData((isData) => [...isData, ...response.data]) } } else { toast.error(response.message); } setLoading(false); } catch (error) { toast.error("Gagal mendapatkan tugas divisi, coba lagi nanti"); console.error(error); } finally { setLoading(false); } }; useShallowEffect(() => { setPage(1) fetchData(true); }, [status, searchQuery]); useShallowEffect(() => { fetchData(false) }, [isPage]) 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 + 1 >= scrollHeight) { setPage(isPage + 1) } } }; const container = containerRef?.current; container?.addEventListener("scroll", handleScroll); return () => { container?.removeEventListener("scroll", handleScroll); }; }, [containerRef, isPage]); useShallowEffect(() => { if (notifLoadPage.get().category == 'division/' + param.id + '/task' && notifLoadPage.get().load == true) { setRefresh(true) } }, [notifLoadPage.get().load]) function onRefresh() { notifLoadPage.set({ category: '', load: false }) setRefresh(false) setPage(1) setTimeout(() => { fetchData(false) }, 500) } return ( { isRefresh && { onRefresh() }} title='UPDATE' /> } } placeholder="Pencarian" onChange={(val) => setSearchQuery(val.target.value)} /> {isList ? ( ) : ( )} Total Tugas {totalData} {isList ? ( { loading ? Array(3) .fill(null) .map((_, i) => ( )) : _.isEmpty(isData) ? Tidak ada Tugas : isData.map((v, i) => { return ( router.push(`task/${v.id}`)}>
{v.title}
); })}
) : ( {loading ? Array(3) .fill(null) .map((_, i) => ( )) : _.isEmpty(isData) ? Tidak ada Tugas : isData.map((v: any, i: any) => { return ( router.push(`task/${v.id}`)}> {v.title} {v.progress}% {v.desc} {(v.member == 0) ? "0" : "+" + (v.member - 1)} ); }) } )}
) }