--- import { Icon } from 'astro-icon/components' import { Schema } from 'astro-seo-schema' import { clamp, round, sum, sumBy } from 'lodash-es' import { cn } from '../lib/cn' import { prisma } from '../lib/prisma' import type { HTMLAttributes } from 'astro/types' type Props = HTMLAttributes<'div'> & { serviceId: number itemReviewedId: string averageUserRating?: number | null } const { serviceId, itemReviewedId, averageUserRating: averageUserRatingFromProps, class: className, ...htmlProps } = Astro.props const ratingsFromDb = await prisma.comment.groupBy({ by: ['rating'], where: { serviceId, ratingActive: true, status: { in: ['APPROVED', 'VERIFIED'], }, parentId: null, suspicious: false, }, _count: true, }) const ratings = ([5, 4, 3, 2, 1] as const).map((rating) => ({ rating, count: ratingsFromDb.find((stat) => stat.rating === rating)?._count ?? 0, })) const totalComments = sumBy(ratings, 'count') const averageUserRatingFromQuery = totalComments > 0 ? sum(ratings.map((stat) => stat.rating * stat.count)) / totalComments : null if (averageUserRatingFromProps !== undefined) { const a = averageUserRatingFromQuery === null ? null : round(averageUserRatingFromQuery, 2) const b = averageUserRatingFromProps === null ? null : round(averageUserRatingFromProps, 2) if (a !== b) { console.error( `The averageUserRating of the comments shown is different from the averageUserRating from the database. Service ID: ${serviceId} ratingUi: ${averageUserRatingFromQuery} ratingDb: ${averageUserRatingFromProps}` ) } } const averageUserRating = averageUserRatingFromProps === undefined ? averageUserRatingFromQuery : averageUserRatingFromProps ---
{ averageUserRating !== null && ( ) }
{averageUserRating !== null ? round(averageUserRating, 1).toLocaleString() : '-'}
{ ([1, 2, 3, 4, 5] as const).map((rating) => (
)) }
{totalComments.toLocaleString()} ratings
{ ratings.map(({ rating, count }) => { const percent = totalComments > 0 ? (count / totalComments) * 100 : null return ( <>
{rating.toLocaleString()}
{[{round(percent ?? 0).toLocaleString()}, %]}
) }) }