// Author: fruit.com.cn import { useState } from 'react'; import { engagementApi } from '../api/engagement'; import { useMutation } from './useMutation'; /** * 点赞 / 收藏状态与交互,Shorts 与播放页共用。 * likeTargetType: 'EPISODE' | 'DRAMA' */ export function useEngagement({ likeTargetType, likeTargetId, dramaId, initialLikeCount = 0, initialSaveCount = 0 }) { const [liked, setLiked] = useState(false); const [likeCount, setLikeCount] = useState(Number(initialLikeCount) || 0); const [saved, setSaved] = useState(false); const [saveCount, setSaveCount] = useState(Number(initialSaveCount) || 0); const likeMutation = useMutation(() => engagementApi.toggleLike(likeTargetType, likeTargetId)); const saveMutation = useMutation(() => engagementApi.toggleFavorite(dramaId)); const toggleLike = async () => { try { const result = await likeMutation.run(); setLiked(Boolean(result?.liked)); setLikeCount(Number(result?.count) || 0); } catch { // 交互失败时保持原状态,避免误导用户 } }; const toggleSave = async () => { try { const next = await saveMutation.run(); setSaved(Boolean(next)); setSaveCount((count) => Math.max(0, count + (next ? 1 : -1))); } catch { // 同上 } }; const syncStats = (stats) => { if (!stats) return; setLiked(Boolean(stats.liked)); setLikeCount(Number(stats.likeCount) || 0); setSaved(Boolean(stats.favorited)); setSaveCount(Number(stats.favoriteCount) || 0); }; return { liked, likeCount, saved, saveCount, toggleLike, toggleSave, syncStats, pending: likeMutation.pending || saveMutation.pending, }; }