import {User} from '@common/auth/user'; import React, {Fragment, useContext, useState} from 'react'; import {Checkbox} from '@common/ui/forms/toggle/checkbox'; import {UserAvatar} from '@common/ui/images/user-avatar'; import {FormattedRelativeTime} from '@common/i18n/formatted-relative-time'; import {queryClient} from '@common/http/query-client'; import {Button} from '@common/ui/buttons/button'; import {Trans} from '@common/i18n/trans'; import {FormTextField} from '@common/ui/forms/input-field/text-field/text-field'; import {SiteConfigContext} from '@common/core/settings/site-config-context'; import {Link} from 'react-router-dom'; import {LinkStyle} from '@common/ui/buttons/external-link'; import {NormalizedModel} from '@common/datatable/filters/normalized-model'; import {Review} from '@app/titles/models/review'; import {TitleRating} from '@app/reviews/title-rating'; import {useUpdateReview} from '@app/admin/reviews/requests/use-update-review'; import {useForm} from 'react-hook-form'; import {CreateReviewPayload} from '@app/reviews/requests/use-create-review'; import {Form} from '@common/ui/forms/form'; import {StarSelector} from '@app/reviews/review-list/star-selector'; import {DeleteReviewsButton} from '@app/admin/reviews/delete-reviews-button'; import {BulletSeparatedItems} from '@app/titles/bullet-separated-items'; interface Props { review: Review; isSelected: boolean; onToggle: () => void; } export function ReviewDatatableItem({review, isSelected, onToggle}: Props) { const [isEditing, setIsEditing] = useState(false); const helpfulCount = review.helpful_count || 1; const totalFeedbackCount = review.helpful_count + review.not_helpful_count || 1; return (
{review.reviewable && ( )}
{isEditing ? ( { setIsEditing(false); if (isSaved) { queryClient.invalidateQueries({queryKey: ['comment']}); } }} /> ) : (
{review.title && (
{review.title}
)}
{review.body}
{review.reports_count ? ( ) : null}
)}
); } interface ReviewableHeaderProps { isSelected: boolean; onToggle: Props['onToggle']; reviewable: NormalizedModel; } function ReviewableHeader({ isSelected, onToggle, reviewable, }: ReviewableHeaderProps) { return (
onToggle()} />
{reviewable.image && ( )}
{reviewable.name}
({reviewable.model_type})
); } interface CommentHeaderProps { review: Review; } function ReviewHeader({review}: CommentHeaderProps) { return (
{review.user && ( )}
{review.user && (
{}
)}
); } interface EditReviewFormProps { review: Review; onClose: (saved: boolean) => void; } function EditReviewForm({review, onClose}: EditReviewFormProps) { const [content, setContent] = useState(review.body); const updateReview = useUpdateReview(review); const form = useForm({ defaultValues: { score: review.score, title: review.title, body: review.body, }, }); return (
{ updateReview.mutate(newValues, {onSuccess: () => onClose(true)}); }} > { form.setValue('score', newScore); }} /> } labelSuffix={} autoFocus minLength={10} required /> } labelSuffix={} inputElementType="textarea" rows={5} minLength={100} required /> ); } interface UserDisplayNameProps { user: User; show: 'display_name' | 'email'; } function UserDisplayName({user, show}: UserDisplayNameProps) { const {auth} = useContext(SiteConfigContext); if (auth.getUserProfileLink) { return ( {user[show]} ); } return
{user[show]}
; }