import {useReviews} from '@app/reviews/requests/use-reviews'; import {Reviewable} from '@app/reviews/reviewable'; import { NewReviewForm, NewReviewFormActions, } from '@app/reviews/review-list/new-review-form'; import React, {ReactNode, useRef} from 'react'; import {ReviewListItem} from '@app/reviews/review-list/review-list-item'; import {InfiniteScrollSentinel} from '@common/ui/infinite-scroll/infinite-scroll-sentinel'; import {Button} from '@common/ui/buttons/button'; import {Trans} from '@common/i18n/trans'; import {AnimatePresence, m} from 'framer-motion'; import {opacityAnimation} from '@common/ui/animation/opacity-animation'; import {Skeleton} from '@common/ui/skeleton/skeleton'; import {IllustratedMessage} from '@common/ui/images/illustrated-message'; import {Review} from '@app/titles/models/review'; import {AccountRequiredCard} from '@common/comments/comment-list/account-required-card'; import {useAuth} from '@common/auth/use-auth'; import {message} from '@common/i18n/message'; const accountRequiredMessage = message( 'Please login or create account to add a review', ); interface Props { reviewable: Reviewable; disabled?: boolean; noResultsMessage?: ReactNode; showAccountRequiredMessage?: boolean; } export function ReviewList({ reviewable, disabled, noResultsMessage, showAccountRequiredMessage, }: Props) { const query = useReviews(reviewable); const actionsRef = useRef(null); const {user} = useAuth(); const currentUserReview = query.data?.pages[0].current_user_review; const sharedReview = query.data?.pages[0].shared_review; return (
{showAccountRequiredMessage && ( )} {query.isLoading ? ( ) : ( )}
{ actionsRef.current?.openReviewPanel(); }} > } />
); } interface ReviewListItemsProps { reviews: Review[]; sharedReview?: Review; noResultsMessage?: ReactNode; } function ReviewListItems({ reviews, sharedReview, noResultsMessage, }: ReviewListItemsProps) { const {user} = useAuth(); let content: ReactNode; if (!reviews.length) { content = user ? noResultsMessage || ( } description={} /> ) : null; } else { content = reviews.map(review => ( )); } return ( {sharedReview && } {content} ); } interface ReviewListSkeletonsProps { count: number; } export function ReviewListSkeletons({count}: ReviewListSkeletonsProps) { return ( {[...new Array(count).keys()].map(index => (
))}
); }