/** * Component: Blocklist Row (desktop + mobile) * Documentation: documentation/admin-features/release-blocklist.md * * Per-row Unblock is a real )} {isExpanded && hasDetail && (
          {entry.reasonDetail}
        
)} ); } function UnblockButton({ isUnblocking, onClick }: { isUnblocking: boolean; onClick: () => void }) { return ( ); } // --------------------------------------------------------------------------- // Desktop row — // --------------------------------------------------------------------------- function DesktopRow({ entry, onUnblocked, onUnblockFailed }: BlocklistRowProps) { const { isUnblocking, unblock } = useUnblock(entry, onUnblocked, onUnblockFailed); const [reasonExpanded, setReasonExpanded] = useState(false); const { absolute, relative } = formatTimestamp(entry.createdAt); return (

{entry.releaseName}

setReasonExpanded((v) => !v)} /> {entry.indexerName ?? } {relative} ); } // --------------------------------------------------------------------------- // Mobile card // --------------------------------------------------------------------------- function MobileRow({ entry, onUnblocked, onUnblockFailed }: BlocklistRowProps) { const { isUnblocking, unblock } = useUnblock(entry, onUnblocked, onUnblockFailed); const [reasonExpanded, setReasonExpanded] = useState(false); const { absolute, relative } = formatTimestamp(entry.createdAt); return (
{relative}

{entry.releaseName}

setReasonExpanded((v) => !v)} /> {entry.request?.audiobook && (

Associated request

)} {entry.indexerName && (

Indexer: {entry.indexerName}

)}
); } export const BlocklistRow = { Desktop: DesktopRow, Mobile: MobileRow, };