import { AlertDialog, AlertDialogAction, AlertDialogCancel, AlertDialogContent, AlertDialogDescription, AlertDialogFooter, AlertDialogHeader, AlertDialogTitle, AlertDialogTrigger } from '@/components/ui/alert-dialog' import { Button } from '@/components/ui/button' import { Skeleton } from '@/components/ui/skeleton' import { useFollowListOptional } from '@/providers/FollowListProvider' import { useMuteList } from '@/contexts/mute-list-context' import { useNostr } from '@/providers/NostrProvider' import { useMemo, useState } from 'react' import { useTranslation } from 'react-i18next' import { toast } from 'sonner' export default function FollowButton({ pubkey }: { pubkey: string }) { const { t } = useTranslation() const { pubkey: accountPubkey, checkLogin } = useNostr() const followList = useFollowListOptional() const { mutePubkeySet, unmutePubkey } = useMuteList() const [updating, setUpdating] = useState(false) const [hover, setHover] = useState(false) const followings = followList?.followings ?? [] const isFollowing = useMemo(() => followings.includes(pubkey), [followings, pubkey]) const isMuted = useMemo(() => mutePubkeySet.has(pubkey), [mutePubkeySet, pubkey]) if (!followList || !accountPubkey || (pubkey && pubkey === accountPubkey)) return null const { follow, unfollow } = followList const handleFollow = async (e: React.MouseEvent) => { e.stopPropagation() checkLogin(async () => { if (isFollowing) return setUpdating(true) try { await follow(pubkey) } catch (error) { toast.error(t('Follow failed') + ': ' + (error as Error).message) } finally { setUpdating(false) } }) } const handleUnfollow = async (e: React.MouseEvent) => { e.stopPropagation() checkLogin(async () => { if (!isFollowing) return setUpdating(true) try { await unfollow(pubkey) } catch (error) { toast.error(t('Unfollow failed') + ': ' + (error as Error).message) } finally { setUpdating(false) } }) } const handleUnmute = async (e: React.MouseEvent) => { e.stopPropagation() checkLogin(async () => { if (!isMuted) return setUpdating(true) try { await unmutePubkey(pubkey) toast.success(t('User unmuted')) } catch (error) { toast.error(t('Unmute failed') + ': ' + (error as Error).message) } finally { setUpdating(false) } }) } // If following and muted, show "Muted" button instead of "Following" if (isFollowing && isMuted) { return ( {t('Unmute user')}? {t('Are you sure you want to unmute this user? This will restore the follow button.')} {t('Cancel')} {t('Unmute')} ) } return isFollowing ? ( {t('Unfollow')}? {t('Are you sure you want to unfollow this user?')} {t('Cancel')} {t('Unfollow')} ) : ( ) }