import React from "react"; import { AuthContext, tokenExpireError } from "@/authContext"; import MkdSDK from "@/utils/MkdSDK"; import { useForm } from "react-hook-form"; import { Link, useNavigate, useSearchParams } from "react-router-dom"; import { GlobalContext, showToast } from "@/globalContext"; import { yupResolver } from "@hookform/resolvers/yup"; import * as yup from "yup"; import { clearSearchParams, parseSearchParams } from "@/utils/utils"; import PaginationBar from "@/components/PaginationBar"; import AddButton from "@/components/AddButton"; import Button from "@/components/Button"; import PaginationHeader from "@/components/PaginationHeader"; import Icon from "@/components/Icons"; import ReactHtmlTableToExcel from "react-html-table-to-excel"; import { ID_PREFIX } from "@/utils/constants"; import { adminColumns, applySetting } from "@/utils/adminPortalColumns"; let sdk = new MkdSDK(); const AdminReviewListPage = () => { const { dispatch } = React.useContext(AuthContext); const { state: globalState, dispatch: globalDispatch } = React.useContext(GlobalContext); const [tableColumns, setTableColumns] = React.useState([]); const [data, setCurrentTableData] = React.useState([]); const [pageSize, setPageSize] = React.useState(10); const [pageCount, setPageCount] = React.useState(0); const [dataTotal, setDataTotal] = React.useState(0); const [currentPage, setPage] = React.useState(0); const [canPreviousPage, setCanPreviousPage] = React.useState(false); const [canNextPage, setCanNextPage] = React.useState(false); const navigate = useNavigate(); const [searchParams, setSearchParams] = useSearchParams(); // TODO: find a better way to do this const [searchParams2] = useSearchParams(localStorage.getItem("admin_customer_review_filter") ?? ""); const schema = yup.object({ id: yup.string(), customer_first_name: yup.string(), customer_last_name: yup.string(), rating: yup.string(), type: yup.string(), }); const { reset, register, handleSubmit, formState: { errors }, } = useForm({ resolver: yupResolver(schema), defaultValues: (() => { let fromSearch = parseSearchParams(searchParams); if (Object.keys(fromSearch).length > 0) { return fromSearch; } return parseSearchParams(searchParams2); })(), }); function onSort(accessor) { const columns = tableColumns; const index = columns.findIndex((column) => column.accessor === accessor); const column = columns[index]; column.isSortedDesc = !column.isSortedDesc; columns.splice(index, 1, column); setTableColumns(() => [...columns]); const sortedList = selector(data, column.isSortedDesc, accessor); setCurrentTableData(sortedList); } function selector(users, isSortedDesc, accessor) { if (accessor?.split(",").length > 1) { accessor = accessor.split(",")[0]; } return users.sort((a, b) => { if (isSortedDesc) { if (isNaN(a[accessor])) { return a[accessor]?.toLowerCase() < b[accessor]?.toLowerCase() ? 1 : -1; } else { return a[accessor] < b[accessor] ? 1 : -1; } } if (!isSortedDesc) { if (isNaN(a[accessor])) { return a[accessor]?.toLowerCase() < b[accessor]?.toLowerCase() ? -1 : 1; } else { return a[accessor] < b[accessor] ? -1 : 1; } } }); } const rating = [ { key: "", value: "All" }, { key: "1", value: "1" }, { key: "2", value: "2" }, { key: "3", value: "3" }, { key: "4", value: "4" }, { key: "5", value: "5" }, ]; const type = [ { key: "", value: "All" }, { key: "0", value: "Given" }, { key: "1", value: "Received" }, ]; function updatePageSize(limit) { (async function () { setPageSize(limit); await getData(0, limit); })(); } function previousPage() { (async function () { await getData(currentPage - 1 > 0 ? currentPage - 1 : 0, pageSize); })(); } function nextPage() { (async function () { await getData(currentPage + 1 <= pageCount ? currentPage + 1 : 0, pageSize); })(); } async function getData(pageNum, limitNum) { let data = parseSearchParams(searchParams); data = Object.keys(data).length < 1 ? parseSearchParams(searchParams2) : data; data.id = data.id?.replace(ID_PREFIX.REVIEWS, ""); if (data && (data.type != undefined || data.type != null)) { data.type = data.type == 0 ? "customer" : "host"; } try { sdk.setTable("review"); const result = await sdk.callRawAPI( "/v2/api/custom/ergo/review/PAGINATE", { where: [ data ? `${data.id ? `ergo_review.id = '${data.id}'` : "1"} AND ${data.customer_first_name ? `customer.first_name LIKE '%${data.customer_first_name}%'` : "1"} AND ${ data.customer_last_name ? `customer.last_name LIKE '%${data.customer_last_name}%'` : "1" } AND ${data.rating ? `customer_rating = ${data.rating}` : "1"} AND ${data.type ? `given_by = '${data.type}'` : "1"} AND ${ data.status ? `ergo_review.status = ${data.status}` : "1" } AND ${data.property_spaces_id ? `ergo_review.property_spaces_id = ${data.property_spaces_id}` : "1"}` : 1, ], page: pageNum, limit: limitNum, sortId: "update_at", direction: "DESC", user: "customer", }, "POST", ); const { list, total, limit, num_pages, page } = result; const sortedList = selector(list, false); setCurrentTableData(sortedList); setPageSize(limit); setPageCount(num_pages); setPage(page); setDataTotal(total); setCanPreviousPage(page > 1); setCanNextPage(page + 1 <= num_pages); } catch (error) { tokenExpireError(dispatch, error.message); showToast(globalDispatch, error.message, 4000, "ERROR"); } } const onSubmit = (data) => { searchParams.set("id", data.id); searchParams.set("customer_first_name", data.customer_first_name); searchParams.set("customer_last_name", data.customer_last_name); searchParams.set("rating", data.rating); searchParams.set("type", data.type); searchParams.set("status", data.status); setSearchParams(searchParams); localStorage.setItem("admin_customer_review_filter", searchParams.toString()); getData(1, pageSize); }; React.useEffect(() => { globalDispatch({ type: "SETPATH", payload: { path: "review", }, }); (async function () { await fetchColumnOrder(); getData(1, pageSize); })(); }, []); React.useEffect(() => { if (!globalState.showReview) { getData(1, 10); } }, [globalState.showReview]); async function fetchColumnOrder() { sdk.setTable("settings"); const payload = { key_name: "admin_customer_review_column_order" }; try { const result = await sdk.callRestAPI({ limit: 1, page: 1, payload }, "PAGINATE"); if (Array.isArray(result.list) && result.list.length > 0) { setTableColumns(applySetting(result.list[0].optional_data ?? [], adminColumns.admin_customer_reviews)); } } catch (err) { tokenExpireError(dispatch, err.message); showToast(globalDispatch, err.message, 4000, "ERROR"); } } return ( <>

Review

{errors.id?.message}

{errors.customer_last_name?.message}

{errors.customer_first_name?.message}

{errors.rating?.message}

{errors.type?.message}

{errors.status?.message}

Change Column Order {" "}
{tableColumns.map((column, index) => ( ))} {data.map((row, i) => { return ( {tableColumns.map((cell, index) => { if (cell.accessor.split(",").length > 1) { return ( ); } if (cell.accessor === "") { return ( ); } if (cell.accessor === "rating") { return ( ); } if (cell.mapping) { return ( ); } if (cell.idPrefix) { return ( ); } return ( ); })} ); })}
onSort(column.accessor)} > {column.header} {column.isSorted ? (column.isSortedDesc ? " ▼" : " ▲") : ""}
{cell.accessor.split(",").map((accessor) => ( {row[accessor.trim()]} ))} {row[cell.accessor]} {cell.mapping[row[cell.accessor]]} {cell.idPrefix + row[cell.accessor]} {row[cell.accessor]}
); }; export default AdminReviewListPage;