diff --git a/src/App.tsx b/src/App.tsx index a880cf7..31e64ed 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -27,47 +27,55 @@ function App() { const [userPairingId, setUserPairingId] = useState(null) useEffect(() => { + // Met à jour la connexion au montage setIsConnected(UserStore.getInstance().isConnected()); - }); + }, []); useEffect(() => { + // Charge le pairingId s’il existe déjà setUserPairingId(UserStore.getInstance().getUserPairingId()); - }); + }, []); useEffect(() => { - if (isConnected) { + const handleConnectionFlow = async () => { + if (!isConnected) return; + + const userStore = UserStore.getInstance(); const messageBus = MessageBus.getInstance(iframeUrl); - messageBus.isReady().then(() => { - messageBus.getProcesses().then((processes: any) => { - setProcesses(processes); - }); - }); - } + + try { + await messageBus.isReady(); + + let pairingId = userStore.getUserPairingId(); + + // 1️⃣ Créer le pairing si non existant + if (!pairingId) { + console.log("🚀 No pairing found — creating new pairing..."); + pairingId = await messageBus.createUserPairing(); + console.log("✅ Pairing created:", pairingId); + + userStore.pair(pairingId); + setUserPairingId(pairingId); + } else { + console.log("🔗 Already paired with ID:", pairingId); + } + + // 2️⃣ Charger les processes + const processes = await messageBus.getProcesses(); + setProcesses(processes); + + // 3️⃣ Charger les myProcesses + const myProcesses = await messageBus.getMyProcesses(); + setMyProcesses(myProcesses); + + } catch (err) { + console.error("❌ Error during pairing or process loading:", err); + } + }; + + handleConnectionFlow(); }, [isConnected, iframeUrl]); - useEffect(() => { - if (isConnected && processes !== null) { - const messageBus = MessageBus.getInstance(iframeUrl); - messageBus.isReady().then(() => { - messageBus.getMyProcesses().then((res: string[]) => { - setMyProcesses(res); - }) - }); - } - }, [isConnected, processes]); - - useEffect(() => { - if (isConnected && userPairingId === null) { - const messageBus = MessageBus.getInstance(iframeUrl); - messageBus.isReady().then(() => { - messageBus.getUserPairingId().then((userPairingId: string) => { - UserStore.getInstance().pair(userPairingId); - setUserPairingId(UserStore.getInstance().getUserPairingId()); - }) - }); - } - }, [isConnected, userPairingId, processes]); - // Gestionnaire pour afficher la modale de connexion const handleLogin = useCallback(() => { // Afficher la modale de connexion @@ -189,7 +197,7 @@ function App() { {/* Espace pour contenu supplémentaire à droite */}
{/* Affichage des blocs de la blockchain */} - +
diff --git a/src/sdk/MessageBus.ts b/src/sdk/MessageBus.ts index 1198f00..cf50958 100644 --- a/src/sdk/MessageBus.ts +++ b/src/sdk/MessageBus.ts @@ -80,6 +80,48 @@ export default class MessageBus { }); } + public createUserPairing(): Promise { + return new Promise((resolve, reject) => { + this.checkToken().then(async () => { + const userStore = UserStore.getInstance(); + const accessToken = userStore.getAccessToken(); + if (!accessToken) { + return reject('No access token found'); + } + + const correlationId = uuidv4(); + this.initMessageListener(correlationId); + + // ✅ Success listener + const unsubscribeSuccess = EventBus.getInstance().on('PAIRING_CREATED', (responseId: string, pairingId: string) => { + if (responseId !== correlationId) return; + unsubscribeSuccess(); + unsubscribeError(); + this.destroyMessageListener(); + resolve(pairingId); + }); + + // ❌ Error listener + const unsubscribeError = EventBus.getInstance().on('ERROR_CREATE_PAIRING', (responseId: string, error: string) => { + if (responseId !== correlationId) return; + unsubscribeError(); + unsubscribeSuccess(); + this.destroyMessageListener(); + reject(error); + }); + + // 📨 Send CREATE_PAIRING message to iframe + this.sendMessage({ + type: 'CREATE_PAIRING', + accessToken, + messageId: correlationId, + }); + }).catch((err) => { + reject(`Failed to validate token before pairing: ${err}`); + }); + }); + } + public getUserPairingId(): Promise { return new Promise((resolve: (userPairingId: string) => void, reject: (error: string) => void) => { this.checkToken().then(() => { @@ -663,7 +705,7 @@ export default class MessageBus { EventBus.getInstance().emit('PROCESSES_RETRIEVED', correlationId, message.processes); break; - case 'GET_MY_PROCESSES': + case 'GET_MY_PROCESSES': if (this.errors[correlationId]) { const error = this.errors[correlationId]; delete this.errors[correlationId]; @@ -705,7 +747,7 @@ export default class MessageBus { EventBus.getInstance().emit('MESSAGE_RECEIVED', message); EventBus.getInstance().emit('UPDATE_NOTIFIED', correlationId); break; - + case 'STATE_VALIDATED': if (this.errors[correlationId]) { const error = this.errors[correlationId]; @@ -739,7 +781,18 @@ export default class MessageBus { EventBus.getInstance().emit('MESSAGE_RECEIVED', message); EventBus.getInstance().emit('PUBLIC_DATA_DECODED', correlationId, message.decodedData); break; - + + case 'PAIRING_CREATED': + if (this.errors[correlationId]) { + const error = this.errors[correlationId]; + delete this.errors[correlationId]; + EventBus.getInstance().emit('ERROR_PAIRING_CREATED', correlationId, error); + return; + } + EventBus.getInstance().emit('MESSAGE_RECEIVED', message); + EventBus.getInstance().emit('PAIRING_CREATED', correlationId, message.decodedData); + break; + case 'ERROR': console.error('Error:', message); this.errors[correlationId] = message.error;