import { useState } from 'react' import { useMutation, useQueryClient } from '@tanstack/react-query' import api from '../lib/api' import { UserPlusIcon, UserMinusIcon } from '@heroicons/react/24/outline' import { CheckIcon } from '@heroicons/react/24/solid' interface FollowButtonProps { type: 'user' | 'leader' | 'organization' | 'cause' id: number initialFollowing?: boolean initialCount?: number showCount?: boolean compact?: boolean onFollowChange?: (following: boolean, count: number) => void } export default function FollowButton({ type, id, initialFollowing = false, initialCount = 0, showCount = true, compact = false, onFollowChange }: FollowButtonProps) { const [isFollowing, setIsFollowing] = useState(initialFollowing) const [followerCount, setFollowerCount] = useState(initialCount) const [isHovered, setIsHovered] = useState(false) const queryClient = useQueryClient() const followMutation = useMutation({ mutationFn: async () => { const endpoint = `/social/follow/${type}/${id}` const response = await api.post(endpoint) return response.data }, onSuccess: (data) => { setIsFollowing(true) setFollowerCount(data.follower_count) onFollowChange?.(true, data.follower_count) // Invalidate relevant queries queryClient.invalidateQueries({ queryKey: ['social', 'stats'] }) queryClient.invalidateQueries({ queryKey: ['following', type] }) } }) const unfollowMutation = useMutation({ mutationFn: async () => { const endpoint = `/social/follow/${type}/${id}` const response = await api.delete(endpoint) return response.data }, onSuccess: (data) => { setIsFollowing(false) setFollowerCount(data.follower_count) onFollowChange?.(false, data.follower_count) // Invalidate relevant queries queryClient.invalidateQueries({ queryKey: ['social', 'stats'] }) queryClient.invalidateQueries({ queryKey: ['following', type] }) } }) const handleClick = () => { if (isFollowing) { unfollowMutation.mutate() } else { followMutation.mutate() } } const isLoading = followMutation.isPending || unfollowMutation.isPending // LinkedIn/Facebook style button if (compact) { return ( ) } // Full button with count return (
{showCount && ( {followerCount.toLocaleString()} {followerCount === 1 ? 'follower' : 'followers'} )}
) }