From 925f74bb3d9cb78573c084f1e74a5819eed8c883 Mon Sep 17 00:00:00 2001 From: Gabriel Kaszewski Date: Fri, 10 Jul 2026 00:33:49 +0200 Subject: [PATCH] feat: auto-grow comment textarea, review detail sheet for full text - textarea grows as you type instead of fixed 3 rows - tap truncated comment to open detail sheet with full selectable text - review detail sheet shows poster, rating, medium, date, full comment --- spa/src/components/review-card.tsx | 15 ++++++- spa/src/components/review-detail-sheet.tsx | 51 ++++++++++++++++++++++ spa/src/components/review-form-fields.tsx | 38 +++++++++++++++- spa/src/routes/_app/index.tsx | 13 ++++++ 4 files changed, 114 insertions(+), 3 deletions(-) create mode 100644 spa/src/components/review-detail-sheet.tsx diff --git a/spa/src/components/review-card.tsx b/spa/src/components/review-card.tsx index d795fbd..83ee277 100644 --- a/spa/src/components/review-card.tsx +++ b/spa/src/components/review-card.tsx @@ -17,9 +17,10 @@ type ReviewCardProps = { isFederated?: boolean actorUrl?: string onEdit?: () => void + onShowDetail?: () => void } -export function ReviewCard({ movie, review, userName, userId, isFederated, actorUrl, onEdit }: ReviewCardProps) { +export function ReviewCard({ movie, review, userName, userId, isFederated, actorUrl, onEdit, onShowDetail }: ReviewCardProps) { const card = ( @@ -59,7 +60,17 @@ export function ReviewCard({ movie, review, userName, userId, isFederated, actor {review.watch_medium && } - {review.comment &&

{review.comment}

} + {review.comment && ( +

e.key === "Enter" && onShowDetail() : undefined} + > + {review.comment} +

+ )}
diff --git a/spa/src/components/review-detail-sheet.tsx b/spa/src/components/review-detail-sheet.tsx new file mode 100644 index 0000000..3b3388c --- /dev/null +++ b/spa/src/components/review-detail-sheet.tsx @@ -0,0 +1,51 @@ +import { VisuallyHidden } from "radix-ui" +import { Drawer, DrawerContent, DrawerTitle } from "@/components/ui/drawer" +import { StarDisplay } from "@/components/star-display" +import { WatchMediumBadge } from "@/components/watch-medium-badge" +import { shortDate } from "@/lib/date" +import { posterUrl } from "@/lib/api/client" +import type { MovieDto, ReviewDto } from "@/lib/api/common" + +type ReviewDetailSheetProps = { + open: boolean + onOpenChange: (open: boolean) => void + movie: MovieDto + review: ReviewDto + userName?: string +} + +export function ReviewDetailSheet({ open, onOpenChange, movie, review, userName }: ReviewDetailSheetProps) { + return ( + + + {movie.title} +
+
+
+ {movie.poster_path && } +
+
+

{movie.title}

+

+ {movie.release_year}{movie.director && ` ยท ${movie.director}`} +

+ {userName &&

{userName}

} +
+
+ +
+ + {review.watch_medium && } + {shortDate(review.watched_at)} +
+ + {review.comment && ( +

+ {review.comment} +

+ )} +
+
+
+ ) +} diff --git a/spa/src/components/review-form-fields.tsx b/spa/src/components/review-form-fields.tsx index 6c62246..0d6f846 100644 --- a/spa/src/components/review-form-fields.tsx +++ b/spa/src/components/review-form-fields.tsx @@ -1,3 +1,4 @@ +import { useCallback, useRef } from "react" import { useTranslation } from "react-i18next" import { CalendarIcon } from "lucide-react" import { format } from "date-fns" @@ -38,7 +39,7 @@ export function ReviewFormFields({
-