import {EyeIcon, EyeSlashIcon} from '@heroicons/react/24/outline' import clsx from 'clsx' import {useMemo, useState} from 'react' import {Tooltip} from 'web/components/widgets/tooltip' import {useHiddenProfiles} from 'web/hooks/use-hidden-profiles' import {api} from 'web/lib/api' import {useT} from 'web/lib/locale' export type HideProfileButtonProps = { hiddenUserId: string onHidden?: (userId: string) => void className?: string iconClassName?: string tooltip?: string ariaLabel?: string stopPropagation?: boolean eyeOff?: boolean } export function HideProfileButton(props: HideProfileButtonProps) { const { hiddenUserId, onHidden, className, iconClassName, tooltip, ariaLabel, stopPropagation, eyeOff, } = props const t = useT() const [submitting, setSubmitting] = useState(false) const {hiddenProfiles, refreshHiddenProfiles} = useHiddenProfiles() const [optimisticHidden, setOptimisticHidden] = useState(undefined) const hidden = useMemo(() => { if (optimisticHidden !== undefined) return optimisticHidden return hiddenProfiles?.some((u) => u.id === hiddenUserId) ?? false }, [hiddenProfiles, hiddenUserId, optimisticHidden]) const onClick = async (e: React.MouseEvent) => { e.preventDefault() if (stopPropagation) e.stopPropagation() if (submitting) return setSubmitting(true) // Optimistically update hidden state setOptimisticHidden(!hidden) try { if (hidden) { await api('unhide-profile', {hiddenUserId}) } else { await api('hide-profile', {hiddenUserId}) } refreshHiddenProfiles() onHidden?.(hiddenUserId) } catch (e) { console.error('Failed to toggle hide profile', e) // Revert optimistic update on failure setOptimisticHidden(hidden) } finally { setSubmitting(false) } } return ( ) } export default HideProfileButton