import { useState, memo } from 'react'; import './ProcessesViewer.css'; interface BlockState { commited_in: string; state_id: string; public_data: { memberPublicName?: string | number[]; pairedAddresses?: string[] | number[]; }; // Autres propriétés disponibles si nécessaires } interface Block { states: BlockState[]; } interface Processes { [key: string]: Block; } interface ProcessesViewerProps { processes: Processes | null; } function ProcessesViewer({ processes }: ProcessesViewerProps) { const [expandedBlocks, setExpandedBlocks] = useState([]); // Si pas de données, afficher un message if (!processes || Object.keys(processes).length === 0) { return (

Aucun processus disponible

Connectez-vous

); } const toggleBlock = (blockId: string) => { setExpandedBlocks(prev => prev.includes(blockId) ? prev.filter(id => id !== blockId) : [...prev, blockId] ); }; const formatAddress = (address: string | number[] | undefined): string => { if (!address) return "Adresse non disponible"; if (Array.isArray(address)) { // Si c'est un tableau de nombres, on le convertit en chaîne de caractères try { // Convertir les codes ASCII en caractères const chars = address.map(code => String.fromCharCode(Number(code))); return chars.join(''); } catch (e) { return "Adresse encodée (format non supporté)"; } } else if (typeof address === 'string') { // Si c'est déjà une chaîne, on la retourne telle quelle return address; } return "Format d'adresse inconnu"; }; const formatName = (name: string | number[] | undefined): string => { if (!name) return "Nom non disponible"; if (Array.isArray(name)) { if (name.length === 1 && name[0] === 96) { return "`"; // Caractère spécial } try { const chars = name.map(code => String.fromCharCode(Number(code))); return chars.join(''); } catch (e) { return "Nom encodé (format non supporté)"; } } else if (typeof name === 'string') { return name; } return "Format de nom inconnu"; }; return (

Processus

{Object.keys(processes).length} processus disponible(s)

{Object.entries(processes).map(([blockId, block]) => { const isExpanded = expandedBlocks.includes(blockId); const stateCount = block.states.length; // Le premier état est le plus récent return (
toggleBlock(blockId)} >
{blockId.substring(0, 8)}...{blockId.substring(blockId.length - 4)}
{stateCount} état(s)
{isExpanded ? '▼' : '▶'}
{isExpanded && (
ID complet: {blockId}
{block.states.map((state, index) => (

État {index + 1}

State ID: {state.state_id}
Commited dans: {state.commited_in}
Données publiques
Nom: {formatName(state.public_data.memberPublicName)}
{state.public_data.pairedAddresses && (
Adresses associées:
    {Array.isArray(state.public_data.pairedAddresses) ? (typeof state.public_data.pairedAddresses[0] === 'string' ? ( (state.public_data.pairedAddresses as string[]).map((addr, i) => (
  • {addr}
  • )) ) : (
  • {formatAddress(state.public_data.pairedAddresses as number[])}
  • )) : (
  • {String(state.public_data.pairedAddresses || '')}
  • ) }
)}
))}
)}
); })}
); }; ProcessesViewer.displayName = 'ProcessesViewer'; export default memo(ProcessesViewer);