import {Title} from '@app/titles/models/title'; import {DialogTrigger} from '@common/ui/overlays/dialog/dialog-trigger'; import {Button} from '@common/ui/buttons/button'; import {StarBorderIcon} from '@common/icons/material/StarBorder'; import {Trans} from '@common/i18n/trans'; import {RatingDialog} from '@app/reviews/rating-dialog'; import {Episode} from '@app/titles/models/episode'; import clsx from 'clsx'; import {TitleRating} from '@app/reviews/title-rating'; import {useCurrentUserRatingFor} from '@app/reviews/requests/use-current-user-ratings'; import {Skeleton} from '@common/ui/skeleton/skeleton'; import {AnimatePresence, m} from 'framer-motion'; import {opacityAnimation} from '@common/ui/animation/opacity-animation'; import {ReactElement} from 'react'; import {useAuthClickCapture} from '@app/use-auth-click-capture'; interface Props { title: Title; episode?: Episode; size?: 'sm' | 'md' | 'lg'; className?: string; } export function InteractableRating({ title, episode, size = 'md', className, }: Props) { const isUpcoming = episode ? episode.status === 'upcoming' : title.status === 'upcoming'; const score = (episode || title).rating; if (isUpcoming) { return null; } return (
{score ? (
) : null}
); } function RateButton({title, episode}: Props) { const item = episode || title; const {isLoading, rating} = useCurrentUserRatingFor(item); const authHandler = useAuthClickCapture(); let content: ReactElement; if (isLoading) { content = ( ); } else { content = ( {rating ? ( ) : ( )} ); } return ( {content} ); } function getSizeClassName(size: Props['size']) { switch (size) { case 'sm': return 'text-sm'; case 'md': return 'text-base'; case 'lg': return 'text-lg'; } }