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}
/>
)}
)
}