/** * Basic information card for a selected chain * Displays: PDB ID, Protein name, Chain ID, UniProt ID in a single well-designed card */ import { ChainMetadata } from '../../../types/protein'; interface ChainBasicInfoCardsProps { metadata: ChainMetadata | null; isLoading?: boolean; } const ChainBasicInfoCards: React.FC = ({ metadata, isLoading }) => { const getUniProtId = () => { if (!metadata?.polymer_entity?.reference_sequences) return '—'; const refSeqs = metadata.polymer_entity.reference_sequences; const uniprotRefs = refSeqs.filter((ref: any) => ref.database_name === 'UniProt'); if (uniprotRefs.length > 0) { const first = uniprotRefs[0].database_accession; if (uniprotRefs.length > 1) { return ( r.database_accession).join(', ')}> {first} +{uniprotRefs.length - 1} more ); } return first; } // Fallback to first reference sequence if (refSeqs.length > 0) { return refSeqs[0].database_accession || '—'; } return '—'; }; if (isLoading) { return (
Loading chain metadata...
); } const pdbId = metadata?.entry?.rcsb_id || metadata?.pdb_id; const chainId = metadata?.chain_id || metadata?.polymer_entity_instance?.auth_asym_id; return (

Chain Metadata

{pdbId || 'N/A'} {chainId && ( Chain {chainId} )}
{/* Chips Row */} {/* Compact three-column metadata flow */}
Protein Name
{metadata?.entry?.title || '—'}
PDB ID
{pdbId || '—'}
Chain ID
{chainId || '—'}
UniProt ID
{getUniProtId()}
Binding Status
{metadata?.binding_status || '—'}
CATH ID
{metadata?.cath_id || 'uncategorized'}
CATH Domain
{metadata?.cath_superfamily ? ( {metadata.cath_superfamily} ) : '—'}
State ID
{metadata?.state_id || '—'}
); }; export default ChainBasicInfoCards;