From 94b6e58cd086e0d73baf77e0a86663f2f2e6ad15 Mon Sep 17 00:00:00 2001 From: Sosthene Date: Sun, 15 Jun 2025 10:37:08 +0200 Subject: [PATCH] Display private data for each process --- src/components/ProcessesViewer.css | 8 +- src/components/ProcessesViewer.tsx | 121 +++++++++++++++++++---------- 2 files changed, 89 insertions(+), 40 deletions(-) diff --git a/src/components/ProcessesViewer.css b/src/components/ProcessesViewer.css index b0f5290..aa004c3 100644 --- a/src/components/ProcessesViewer.css +++ b/src/components/ProcessesViewer.css @@ -171,4 +171,10 @@ word-break: break-all; margin-bottom: 0.25rem; font-size: 0.8rem; -} \ No newline at end of file +} + +.process-actions { + margin-top: 20px; + padding: 10px; + text-align: center; +} diff --git a/src/components/ProcessesViewer.tsx b/src/components/ProcessesViewer.tsx index 31f6f4b..69a3f34 100644 --- a/src/components/ProcessesViewer.tsx +++ b/src/components/ProcessesViewer.tsx @@ -1,14 +1,14 @@ import { useState, memo } from 'react'; import './ProcessesViewer.css'; +import { isFileBlob, type FileBlob } from '../sdk/models/Data'; +import MessageBus from '../sdk/MessageBus'; +import { iframeUrl } from '../App'; interface BlockState { commited_in: string; state_id: string; pcd_commitment: Record; - public_data: { - memberPublicName?: string | number[]; - pairedAddresses?: string[] | number[]; - }; + public_data: Record; // Autres propriétés disponibles si nécessaires } @@ -28,6 +28,7 @@ interface ProcessesViewerProps { function ProcessesViewer({ processes, myProcesses }: ProcessesViewerProps) { const [expandedBlocks, setExpandedBlocks] = useState([]); const [isFiltered, setIsFiltered] = useState(false); + const [privateData, setPrivateData] = useState>>({}); const handleFilterClick = () => { setIsFiltered(prev => !prev); @@ -51,24 +52,49 @@ function ProcessesViewer({ processes, myProcesses }: ProcessesViewerProps) { ); }; - 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; + const fetchPrivateData = async (processId: string, stateId: string) => { + if (!expandedBlocks.includes(processId) || !myProcesses.includes(processId)) { + return; } + try { + const messageBus = MessageBus.getInstance(iframeUrl); + await messageBus.isReady(); - return "Format d'adresse inconnu"; + const data = await messageBus.getData(processId, stateId); + console.log(data); + + setPrivateData(prev => ({ + ...prev, + [stateId]: data + })); + console.log(privateData); + } catch (error) { + console.error('Error fetching private data:', error); + } + }; + + const handleDownload = (name: string | undefined, fileBlob: FileBlob) => { + const blob = new Blob([fileBlob.data], { type: fileBlob.type }); + const url = URL.createObjectURL(blob); + const a = document.createElement('a'); + a.href = url; + a.download = name || 'download'; + document.body.appendChild(a); + a.click(); + document.body.removeChild(a); + URL.revokeObjectURL(url); + }; + + const formatValue = (key: string, value: string | number[] | FileBlob) => { + if (isFileBlob(value)) { + return ( +
+ {key} + +
+ ); + } + return JSON.stringify(value || ''); // TODO handle most common cases }; const formatName = (name: string | number[] | undefined): string => { @@ -154,29 +180,46 @@ function ProcessesViewer({ processes, myProcesses }: ProcessesViewerProps) { +
+
Données privées
+
+ {!myProcesses.includes(processId) ? ( +
+ Vous n'avez pas accès aux données privées de ce processus +
+ ) : !privateData[state.state_id] ? ( + (() => { + fetchPrivateData(processId, state.state_id); + return
Chargement...
; + })() + ) : Object.keys(privateData[state.state_id]).length > 0 ? ( + Object.entries(privateData[state.state_id]).map(([key, value]) => ( +
+ {key}: {formatValue(key, value)} +
+ )) + ) : ( +
+ Aucune donnée privée disponible +
+ )} +
+
Données publiques
- Nom: {formatName(state.public_data.memberPublicName)} + {Object.keys(state.public_data).length > 0 ? ( + Object.entries(state.public_data).map(([key, value]) => ( +
+ {key}: {formatValue(key, value)} +
+ )) + ) : ( +
+ Aucune donnée publique disponible +
+ )}
- {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 || '')}
  • - ) - } -
-
- )}
);