import { useCallback, useState } from "react" import { useTranslation } from "react-i18next" import { Film, RefreshCw } from "lucide-react" import { ReviewCard } from "@/components/review-card" import { EmptyState } from "@/components/empty-state" import { SwipeToDelete } from "@/components/swipe-to-delete" import { VirtualList } from "@/components/virtual-list" import { Button } from "@/components/ui/button" import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from "@/components/ui/select" import { Skeleton } from "@/components/ui/skeleton" import { useAuth } from "@/components/auth-provider" import { useQueryClient } from "@tanstack/react-query" import { ReviewSheet } from "@/components/review-sheet" import { ReviewDetailSheet } from "@/components/review-detail-sheet" import { useInfiniteActivityFeed, useDeleteReview } from "@/features/diary" import type { FeedEntryDto } from "@/features/diary" export function FeedSkeleton() { return (
{[1, 2, 3].map((i) => (
))}
) } export function FeedTab() { const { t } = useTranslation() const { auth } = useAuth() const qc = useQueryClient() const [refreshing, setRefreshing] = useState(false) const [sortBy, setSortBy] = useState("date") const feedSortOptions = [ { value: "date", label: t("feed.sortLatest") }, { value: "date_asc", label: t("feed.sortOldest") }, { value: "rating", label: t("feed.sortTopRated") }, { value: "rating_asc", label: t("feed.sortLowestRated") }, ] as const const { data, isPending, hasNextPage, isFetchingNextPage, fetchNextPage } = useInfiniteActivityFeed({ sort_by: sortBy }) const deleteReview = useDeleteReview() const [editingEntry, setEditingEntry] = useState(null) const [detailEntry, setDetailEntry] = useState(null) const items = data?.pages.flatMap((p) => p.items) ?? [] const loadMore = useCallback(() => fetchNextPage(), [fetchNextPage]) return (
{isPending && } {!isPending && !items.length && ( )} {items.length > 0 && ( { const isOwn = entry.user_id === auth?.user_id const card = ( setEditingEntry(entry) : undefined} onShowDetail={entry.review.comment ? () => setDetailEntry(entry) : undefined} /> ) return isOwn ? ( deleteReview.mutate(entry.review.id)} confirmTitle={t("feed.deleteReview")} confirmDescription={entry.movie.title} > {card} ) : ( card ) }} /> )} {editingEntry && ( !open && setEditingEntry(null)} movie={editingEntry.movie} review={editingEntry.review} /> )} {detailEntry && ( !open && setDetailEntry(null)} movie={detailEntry.movie} review={detailEntry.review} userName={detailEntry.user_display_name} /> )}
) }