import React, { useCallback, useMemo, useState } from "react"; import { Trans } from "@common/i18n/trans"; import clsx from "clsx"; import { StaticPageTitle } from "@common/seo/static-page-title"; import { DataTableHeader } from "@common/datatable/data-table-header"; import { useBackendFilterUrlParams } from "@common/datatable/filters/backend-filter-url-params"; import { GetDatatableDataParams, useDatatableData } from "@common/datatable/requests/paginated-resources"; import { FilterList } from "@common/datatable/filters/filter-list/filter-list"; import { SelectedStateDatatableHeader } from "@common/datatable/selected-state-datatable-header"; import { AnimatePresence } from "framer-motion"; import { DataTablePaginationFooter } from "@common/datatable/data-table-pagination-footer"; import { DataTableEmptyStateMessage } from "@common/datatable/page/data-table-emty-state-message"; import reviewsImage from "./reviews.svg"; import { FullPageLoader } from "@common/ui/progress/full-page-loader"; import { Review } from "@app/titles/models/review"; import { DeleteReviewsButton } from "@app/admin/reviews/delete-reviews-button"; import { ReviewDatatableItem } from "@app/admin/reviews/review-datatable-item"; import { ReviewsDatatableFilters } from "@app/admin/reviews/reviews-datatable-filters"; import { ReviewListSortButton } from "@app/reviews/review-list/review-list-sort-button"; import { Reviewable } from "@app/reviews/reviewable"; interface Props { hideTitle?: boolean; reviewable?: Reviewable; } export function ReviewsDatatablePage({hideTitle, reviewable}: Props) { const filters = useMemo(() => { return ReviewsDatatableFilters.filter( f => f.key !== 'reviewable_id' || !reviewable, ); }, [reviewable]); const {encodedFilters} = useBackendFilterUrlParams(filters); const [params, setParams] = useState({perPage: 15}); const [selectedReviews, setSelectedReviews] = useState([]); const [sort, setSort] = useState('created_at:desc'); const [orderBy, orderDir] = sort.split(':'); const query = useDatatableData('reviews', { ...params, orderBy, orderDir: orderDir as 'asc' | 'desc', with: 'reviewable,user', filters: encodedFilters, reviewable_type: reviewable?.model_type, reviewable_id: reviewable?.id, }, undefined, () => { setSelectedReviews([]); }); const toggleReview = useCallback( (id: number) => { const newValues = [...selectedReviews]; if (!newValues.includes(id)) { newValues.push(id); } else { const index = newValues.indexOf(id); newValues.splice(index, 1); } setSelectedReviews(newValues); }, [selectedReviews, setSelectedReviews], ); const isFiltering = !!(params.query || params.filters || encodedFilters); const pagination = query.data?.pagination; return (
{!hideTitle && (

)}
{selectedReviews.length ? ( } key="selected" /> ) : ( setParams({...params, query})} actions={ setSort(newSort)} color="primary" showReportsItem /> } /> )} {query.isLoading ? ( ) : (
{pagination?.data.map(review => ( toggleReview(review.id)} /> ))}
)} {(query.isFetched || query.isPlaceholderData) && !pagination?.data.length ? ( } filteringTitle={} /> ) : undefined} setParams({...params, page})} onPerPageChange={perPage => setParams({...params, perPage})} />
); }