import { Review } from "../../Logic/Web/Review" import Combine from "../Base/Combine" import { FixedUiElement } from "../Base/FixedUiElement" import Translations from "../i18n/Translations" import { Utils } from "../../Utils" import BaseUIElement from "../BaseUIElement" import Img from "../Base/Img" export default class SingleReview extends Combine { constructor(review: Review) { const d = review.date super([ new Combine([SingleReview.GenStars(review.rating)]), new FixedUiElement(review.comment), new Combine([ new Combine([ new FixedUiElement(review.author).SetClass("font-bold"), review.affiliated ? Translations.t.reviews.affiliated_reviewer_warning : "", ]).SetStyle("margin-right: 0.5em"), new FixedUiElement( `${d.getFullYear()}-${Utils.TwoDigits(d.getMonth() + 1)}-${Utils.TwoDigits( d.getDate() )} ${Utils.TwoDigits(d.getHours())}:${Utils.TwoDigits(d.getMinutes())}` ).SetClass("subtle-lighter"), ]).SetClass("flex mb-4 justify-end"), ]) this.SetClass("block p-2 m-4 rounded-xl subtle-background review-element") if (review.made_by_user.data) { this.SetClass("border-attention-catch") } } public static GenStars(rating: number): BaseUIElement { if (rating === undefined) { return Translations.t.reviews.no_rating } if (rating < 10) { rating = 10 } const scoreTen = Math.round(rating / 10) return new Combine([ ...Utils.TimesT(scoreTen / 2, (_) => new Img("./assets/svg/star.svg").SetClass("'h-8 w-8 md:h-12") ), scoreTen % 2 == 1 ? new Img("./assets/svg/star_half.svg").SetClass("h-8 w-8 md:h-12") : undefined, ]).SetClass("flex w-max") } }