import {useTranslations} from "next-intl"; import useLanguage from "@/lib/app/hooks/useLanguage"; import {useEffect, useMemo, useState} from "react"; import moment from "moment-jalaali"; import useSWR from "swr"; import {IconButton, Tooltip, Typography} from "@mui/material"; import MaterialReactTable from "material-react-table"; import useRequest from "@/lib/app/hooks/useRequest"; import RefreshIcon from '@mui/icons-material/Refresh'; function DataTable(props) { const requestServer = useRequest({auth: true}) const t = useTranslations(); const {languageApp, languageList} = useLanguage(); const [columnFilters, setColumnFilters] = useState([]); const [sorting, setSorting] = useState(props.sorting || []); const [pagination, setPagination] = useState({pageIndex: 0, pageSize: 10}); const [columnFilterFns, setColumnFilterFns] = useState(() => { let output = {}; const list = props.columns.map((item) => item.enableColumnFilter ? {[item.id]: item.filterFn} : {[item.id]: ""}); for (var key in list) { var nestedObj = list[key]; for (var nestedKey in nestedObj) { output[nestedKey] = nestedObj[nestedKey]; } } return output; }); const [updateTime, setUpdateTime] = useState( moment().format("HH:mm | jYYYY/jMM/jDD") ); const tableLocalization = useMemo(() => languageList.find((item) => item.key == languageApp).tableLocalization, [languageApp, languageList]); const fetchUrl = useMemo(() => { const params = new URLSearchParams(); params.set( "start", `${pagination.pageIndex * pagination.pageSize}` ); const filters = columnFilters.map((filter) => { let datatype; for (const i in props.columns) { if (props.columns[i].id == filter.id) { datatype = props.columns[i].datatype; } } return { ...filter, fn: columnFilterFns[filter.id], datatype: datatype, }; }); params.set("size", pagination.pageSize); params.set("filters", JSON.stringify(filters ?? [])); params.set("sorting", JSON.stringify(sorting ?? [])); return `${props.tableUrl}?${params}`; }, [props.tableUrl, columnFilters, columnFilterFns, pagination, sorting, props.columns,]); const {data, isValidating, mutate} = useSWR(fetchUrl, (...args) => requestServer(args, 'get', { pending: false, success: {notification: {show: false}} }).then((response) => response.data).catch(() => { }) , { revalidateIfStale: true, revalidateOnFocus: false, revalidateOnReconnect: true, keepPreviousData: true }); useEffect(() => { setUpdateTime(moment().format("HH:mm | jYYYY/jMM/jDD")); }, [isValidating, languageApp]); return ( (<> {props.enableCustomToolbar /* send condition */ ? /* send component */ : } mutate()}> )} renderBottomToolbarCustomActions={({table}) => (<> {props.enableLastUpdate /* send condition */ ? ( {t("last_updated_at")}: {updateTime} ) : ("")} )} state={{ showProgressBars: isValidating, columnFilters, columnFilterFns, pagination, sorting, }} positionActionsColumn={"last"} enableRowActions={props.enableRowActions} renderRowActions={({row}) => } {...props} />); } export default DataTable;