diff --git a/crates/adapters/template-askama/templates/activity_feed.html b/crates/adapters/template-askama/templates/activity_feed.html index 97ce7042..b9a93a3e 100644 --- a/crates/adapters/template-askama/templates/activity_feed.html +++ b/crates/adapters/template-askama/templates/activity_feed.html @@ -45,9 +45,8 @@ {% if let Some(wm) = entry.review().watch_medium() %} {{ wm.label() }} {% endif %} - {% let author = ctx.is_current_user(entry.review().user_id().value()) %} {% if let Some(comment) = entry.review().comment() %} - {% if !author && entry.review().spoilers() %} + {% if entry.review().spoilers() %}
Contains spoilers {{ comment.value() }} diff --git a/crates/adapters/template-askama/templates/movie_detail.html b/crates/adapters/template-askama/templates/movie_detail.html index ab5606f1..20fc6456 100644 --- a/crates/adapters/template-askama/templates/movie_detail.html +++ b/crates/adapters/template-askama/templates/movie_detail.html @@ -129,9 +129,8 @@ ★ {% endfor %} - {% let author = ctx.is_current_user(entry.review().user_id().value()) %} {% if let Some(comment) = entry.review().comment() %} - {% if !author && entry.review().spoilers() %} + {% if entry.review().spoilers() %}
Contains spoilers {{ comment.value() }} diff --git a/crates/adapters/template-askama/templates/profile.html b/crates/adapters/template-askama/templates/profile.html index d431260e..a4111264 100644 --- a/crates/adapters/template-askama/templates/profile.html +++ b/crates/adapters/template-askama/templates/profile.html @@ -219,9 +219,8 @@ ★ {% endfor %} - {% let author = ctx.is_current_user(entry.review().user_id().value()) %} {% if let Some(comment) = entry.review().comment() %} - {% if !author && entry.review().spoilers() %} + {% if entry.review().spoilers() %}
Contains spoilers {{ comment.value() }} diff --git a/spa/src/components/community-reviews.tsx b/spa/src/components/community-reviews.tsx index b6edd7da..d9e9d3e7 100644 --- a/spa/src/components/community-reviews.tsx +++ b/spa/src/components/community-reviews.tsx @@ -10,12 +10,10 @@ import type { SocialReviewDto } from "@/features/movies" type CommunityReviewsProps = { reviews: { items: SocialReviewDto[] } - /** Authenticated viewer id — own reviews are never veiled. */ - currentUserId?: string onShowDetail?: (review: SocialReviewDto) => void } -export function CommunityReviews({ reviews, currentUserId, onShowDetail }: CommunityReviewsProps) { +export function CommunityReviews({ reviews, onShowDetail }: CommunityReviewsProps) { const { t } = useTranslation() return ( @@ -26,7 +24,7 @@ export function CommunityReviews({ reviews, currentUserId, onShowDetail }: Commu ) : (
{reviews.items.map((r, i) => { - const veiled = !!r.spoilers && currentUserId !== r.user_id + const veiled = !!r.spoilers return ( diff --git a/spa/src/components/feed-tab.tsx b/spa/src/components/feed-tab.tsx index 68f7d0ea..ee0bdc9e 100644 --- a/spa/src/components/feed-tab.tsx +++ b/spa/src/components/feed-tab.tsx @@ -94,7 +94,6 @@ export function FeedTab() { onLoadMore={loadMore} renderItem={(entry) => { const isOwn = entry.user_id === auth?.user_id - const veil = !isOwn && !!entry.review.spoilers const card = ( setEditingEntry(entry) : undefined} onShowDetail={entry.review.comment ? () => setDetailEntry(entry) : undefined} /> @@ -141,7 +139,6 @@ export function FeedTab() { movie={detailEntry.movie} review={detailEntry.review} userName={detailEntry.user_display_name} - veil={detailEntry.user_id !== auth?.user_id} /> )}
diff --git a/spa/src/components/profile-view.tsx b/spa/src/components/profile-view.tsx index 45d5e3a8..31d32b1e 100644 --- a/spa/src/components/profile-view.tsx +++ b/spa/src/components/profile-view.tsx @@ -18,7 +18,6 @@ import { TimeAgo } from "@/components/time-ago" import { WATCH_MEDIUMS } from "@/lib/watch-mediums" import { ReviewDetailSheet } from "@/components/review-detail-sheet" import { DiaryCalendar } from "@/components/diary-calendar" -import { useAuth } from "@/components/auth-provider" import type { DiaryEntryDto } from "@/lib/api/common" import { tmdbProfileUrl } from "@/lib/api/client" import type { UserProfileResponse } from "@/features/users" @@ -151,7 +150,6 @@ function StatCell({ label, value }: { label: string; value: string | number }) { function DiaryTab({ sortBy, userId, search }: { sortBy: string; userId?: string; search?: string }) { const { t } = useTranslation() - const { auth } = useAuth() const { data, isPending, hasNextPage, isFetchingNextPage, fetchNextPage } = useInfiniteDiary({ sort_by: sortBy, user_id: userId }) const items = data?.pages.flatMap((p) => p.items) ?? [] @@ -181,7 +179,7 @@ function DiaryTab({ sortBy, userId, search }: { sortBy: string; userId?: string; comment={e.review.comment} subtitle={<>} variant="compact" - spoilers={userId && userId === auth?.user_id ? undefined : e.review.spoilers} + spoilers={e.review.spoilers} onShowDetail={e.review.comment ? () => setDetailEntry(e) : undefined} /> )} @@ -192,7 +190,6 @@ function DiaryTab({ sortBy, userId, search }: { sortBy: string; userId?: string; onOpenChange={(open) => !open && setDetailEntry(null)} movie={detailEntry.movie} review={detailEntry.review} - veil={!!userId && userId !== auth?.user_id} /> )} diff --git a/spa/src/components/review-card.tsx b/spa/src/components/review-card.tsx index b1bc5f1e..9db2843c 100644 --- a/spa/src/components/review-card.tsx +++ b/spa/src/components/review-card.tsx @@ -17,13 +17,12 @@ type ReviewCardProps = { userId?: string isFederated?: boolean actorUrl?: string - /** Blur the comment until revealed — set for every viewer except the author. */ - veil?: boolean onEdit?: () => void onShowDetail?: () => void } -export function ReviewCard({ movie, review, userName, userId, isFederated, actorUrl, veil, onEdit, onShowDetail }: ReviewCardProps) { +export function ReviewCard({ movie, review, userName, userId, isFederated, actorUrl, onEdit, onShowDetail }: ReviewCardProps) { + const veil = !!review.spoilers const showDetail = veil ? undefined : onShowDetail const card = ( diff --git a/spa/src/components/review-detail-sheet.tsx b/spa/src/components/review-detail-sheet.tsx index edecdd73..a268ea68 100644 --- a/spa/src/components/review-detail-sheet.tsx +++ b/spa/src/components/review-detail-sheet.tsx @@ -13,11 +13,9 @@ type ReviewDetailSheetProps = { movie: MovieDto review: ReviewDto userName?: string - /** Blur the comment until revealed — set for every viewer except the author. */ - veil?: boolean } -export function ReviewDetailSheet({ open, onOpenChange, movie, review, userName, veil }: ReviewDetailSheetProps) { +export function ReviewDetailSheet({ open, onOpenChange, movie, review, userName }: ReviewDetailSheetProps) { return ( @@ -43,7 +41,7 @@ export function ReviewDetailSheet({ open, onOpenChange, movie, review, userName, {review.comment && ( - veil && review.spoilers ? ( + review.spoilers ? ( ) : (

diff --git a/spa/src/components/spoiler-veil.tsx b/spa/src/components/spoiler-veil.tsx index 62161212..034f8359 100644 --- a/spa/src/components/spoiler-veil.tsx +++ b/spa/src/components/spoiler-veil.tsx @@ -10,8 +10,8 @@ type SpoilerVeilProps = { } /** - * Hides review text behind a blur with a reveal button — shown to everyone - * except the review's author. Once revealed, the text stays visible. + * Hides review text behind a blur with a reveal button — shown to every + * viewer, the author included. Once revealed, the text stays visible. */ export function SpoilerVeil({ content, className }: SpoilerVeilProps) { const { t } = useTranslation() diff --git a/spa/src/components/viewing-history.tsx b/spa/src/components/viewing-history.tsx index 0fbeecd5..6590765e 100644 --- a/spa/src/components/viewing-history.tsx +++ b/spa/src/components/viewing-history.tsx @@ -1,6 +1,7 @@ import { useTranslation } from "react-i18next" import { TrendingUp } from "lucide-react" import { StarDisplay } from "@/components/star-display" +import { SpoilerVeil } from "@/components/spoiler-veil" import { shortDate } from "@/lib/date" import type { ReviewHistoryResponse } from "@/features/movies" @@ -24,7 +25,11 @@ export function ViewingHistory({ history }: { history: ReviewHistoryResponse })

{shortDate(v.watched_at)}

{v.comment && ( -

{v.comment}

+ v.spoilers ? ( + + ) : ( +

{v.comment}

+ ) )}
diff --git a/spa/src/routes/_app/movies.$id.tsx b/spa/src/routes/_app/movies.$id.tsx index 48b2122f..0d808685 100644 --- a/spa/src/routes/_app/movies.$id.tsx +++ b/spa/src/routes/_app/movies.$id.tsx @@ -12,7 +12,6 @@ import { Badge } from "@/components/ui/badge" import { Button } from "@/components/ui/button" import { Skeleton } from "@/components/ui/skeleton" import { posterUrl, tmdbProfileUrl } from "@/lib/api/client" -import { useAuth } from "@/components/auth-provider" import { useMovie, useMovieHistory, useMovieProfile } from "@/features/movies" import { useDocumentTitle } from "@/hooks/use-document-title" import { @@ -30,7 +29,6 @@ function MovieDetailPage() { const { t } = useTranslation() const { id } = Route.useParams() const { data, isPending } = useMovie(id) - const { auth } = useAuth() const { data: profile } = useMovieProfile(id) const { data: history } = useMovieHistory(id) useDocumentTitle(data?.movie.title) @@ -109,7 +107,6 @@ function MovieDetailPage() { @@ -122,7 +119,6 @@ function MovieDetailPage() { movie={movie} review={{ id: "", rating: detailReview.rating, comment: detailReview.comment, watched_at: detailReview.watched_at, watch_medium: detailReview.watch_medium, spoilers: detailReview.spoilers }} userName={detailReview.user_display} - veil={detailReview.user_id !== auth?.user_id} /> )}