jbilcke-hf's picture
jbilcke-hf HF staff
working on some new features
3d4392e
raw
history blame
No virus
2.51 kB
import { useEffect, useState, useTransition } from "react"
import { useLocalStorage } from "usehooks-ts"
import { MediaInfo, MediaRating } from "@/types/general"
import { getMediaRating, rateMedia } from "@/app/api/actions/stats"
import { localStorageKeys } from "@/app/state/localStorageKeys"
import { defaultSettings } from "@/app/state/defaultSettings"
import { GenericLikeButton } from "./generic"
export function LikeButton({
media
}: {
media?: MediaInfo
}) {
const [_pending, startTransition] = useTransition()
const [rating, setRating] = useState<MediaRating>({
isLikedByUser: false,
isDislikedByUser: false,
numberOfLikes: 0,
numberOfDislikes: 0,
})
const [huggingfaceApiKey] = useLocalStorage<string>(
localStorageKeys.huggingfaceApiKey,
defaultSettings.huggingfaceApiKey
)
useEffect(() => {
startTransition(async () => {
if (!media || !media?.id) { return }
const freshRating = await getMediaRating(media.id, huggingfaceApiKey)
setRating(freshRating)
})
}, [media?.id, huggingfaceApiKey])
if (!media) { return null }
if (!huggingfaceApiKey) { return null }
const handleLike = huggingfaceApiKey ? () => {
// we use optimistic updates
const previousRating = { ...rating }
setRating({
...rating,
isLikedByUser: true,
isDislikedByUser: false,
numberOfLikes: Math.abs(Math.max(0, rating.numberOfLikes + 1)),
numberOfDislikes: Math.abs(Math.max(0, rating.numberOfDislikes - 1)),
})
startTransition(async () => {
try {
const freshRating = await rateMedia(media.id, true, huggingfaceApiKey)
// setRating(freshRating)
} catch (err) {
setRating(previousRating)
}
})
} : undefined
const handleDislike = huggingfaceApiKey ? () => {
// we use optimistic updates
const previousRating = { ...rating }
setRating({
...rating,
isLikedByUser: false,
isDislikedByUser: true,
numberOfLikes: Math.abs(Math.max(0, rating.numberOfLikes - 1)),
numberOfDislikes: Math.abs(Math.max(0, rating.numberOfDislikes + 1)),
})
startTransition(async () => {
try {
const freshRating = await rateMedia(media.id, false, huggingfaceApiKey)
// setRating(freshRating)
} catch (err) {
setRating(previousRating)
}
})
} : undefined
return (
<GenericLikeButton
{...rating}
onLike={handleLike}
onDislike={handleDislike}
/>
)
}