skeleton/src/App.tsx

213 lines
6.9 KiB
TypeScript

import { useState, useEffect, useCallback } from 'react'
import './App.css'
import MessageConsole from './components/MessageConsole'
import ControlPanel from './components/ControlPanel'
import ProfileModal from './components/ProfileModal'
import AuthModal from './sdk/AuthModal';
import MessageBus from './sdk/MessageBus';
import EventBus from './sdk/EventBus';
import UserStore from './sdk/UserStrore';
import Iframe from './sdk/Iframe'
import BlockchainViewer from './components/ProcessesViewer';
import FolderModal from './components/FolderModal';
import type { ProfileData } from './sdk/models/ProfileData'
import type { FolderData } from './sdk/models/FolderData'
const iframeUrl = 'https://dev3.4nkweb.com'
function App() {
const [receivedMessages, setReceivedMessages] = useState<{ timestamp: string; data: any }[]>([])
const [isConnected, setIsConnected] = useState(false)
const [showProfileModal, setShowProfileModal] = useState(false)
const [showAuthModal, setShowAuthModal] = useState(false)
const [showFolderModal, setShowFolderModal] = useState(false)
const [processes, setProcesses] = useState<any>(null)
const [myProcesses, setMyProcesses] = useState<string[]>([])
const [userPairingId, setUserPairingId] = useState<string | null>(null)
useEffect(() => {
setIsConnected(UserStore.getInstance().isConnected());
});
useEffect(() => {
setUserPairingId(UserStore.getInstance().getUserPairingId());
});
useEffect(() => {
if (isConnected) {
const messageBus = MessageBus.getInstance(iframeUrl);
messageBus.isReady().then(() => {
messageBus.getProcesses().then((processes: any) => {
setProcesses(processes);
});
});
}
}, [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]);
// Gestionnaire pour afficher la modale de connexion
const handleLogin = useCallback(() => {
// Afficher la modale de connexion
setShowAuthModal(true);
}, []);
// Gestionnaire pour la déconnexion
const handleLogout = useCallback(() => {
// Déconnecter l'utilisateur
UserStore.getInstance().disconnect();
setIsConnected(false);
// Émettre un événement pour vider aussi les messages locaux dans MessageConsole
EventBus.getInstance().emit('CLEAR_CONSOLE');
// Vider les processes
setProcesses(null);
}, []);
// Gestionnaire pour ouvrir la modale de profil
const handleOpenProfileModal = useCallback(() => {
setShowProfileModal(true);
}, []);
// Gestionnaire pour ouvrir la modale de création de dossier
const handleOpenFolderModal = useCallback(() => {
setShowFolderModal(true);
}, []);
// Gestionnaire pour fermer la modale de création de dossier
const handleCloseFolderModal = useCallback(() => {
setShowFolderModal(false);
}, []);
// Gestionnaire pour fermer la modale de création de profil
const handleCloseProfileModal = useCallback(() => {
setShowProfileModal(false);
}, []);
// Gestionnaire pour soumettre les données du profil
const handleProfileSubmit = useCallback((profileData: ProfileData) => {
// Ajouter le validator fixe aux données du profil
const completeProfileData = {
...profileData,
validator: '884cb36a346a79af8697559f16940141f068bdf1656f88fa0df0e9ecd7311fb8:0'
};
MessageBus.getInstance(iframeUrl).createProfile(completeProfileData).then((_profileData: ProfileData) => {
MessageBus.getInstance(iframeUrl).getProcesses().then((processes: any) => {
setProcesses(processes);
});
});
setShowProfileModal(false);
}, []);
// Gestionnaire pour soumettre les données du dossier
const handleFolderSubmit = useCallback((folderData: FolderData) => {
MessageBus.getInstance(iframeUrl).createFolder(folderData).then((_folderData: FolderData) => {
MessageBus.getInstance(iframeUrl).getProcesses().then((processes: any) => {
setProcesses(processes);
});
});
setShowFolderModal(false);
}, []);
// Gestionnaire du clic sur le bouton Vider les messages
const handleClearMessages = useCallback(() => {
setReceivedMessages([]);
}, []);
return (
<div className="home-container">
<header className="home-header">
<h1>[4NK]</h1>
</header>
<main className="home-main">
<div className="welcome-section">
{/* Panneau de contrôle avec iframe */}
<ControlPanel
isConnected={isConnected}
onLogin={handleLogin}
onLogout={handleLogout}
onCreateProfile={handleOpenProfileModal}
onCreateFolder={handleOpenFolderModal}
iframeUrl={iframeUrl}
/>
{/* Structure flexible avec console à gauche et contenu à droite */}
<div className="app-content-layout">
{/* Console de messages (largeur fixe à gauche) */}
<MessageConsole
messages={receivedMessages}
onClearMessages={handleClearMessages}
/>
{/* Espace pour contenu supplémentaire à droite */}
<div className="content-area">
{/* Affichage des blocs de la blockchain */}
<BlockchainViewer processes={processes} />
</div>
</div>
{/* Modales */}
{showAuthModal && (
<AuthModal
isOpen={showAuthModal}
onConnect={() => {
setIsConnected(true);
setShowAuthModal(false);
}}
onClose={() => setShowAuthModal(false)}
iframeUrl={iframeUrl}
/>
)}
{showProfileModal && (
<ProfileModal
isOpen={showProfileModal}
onClose={handleCloseProfileModal}
onSubmit={handleProfileSubmit}
/>
)}
{showFolderModal && (
<FolderModal
isOpen={showFolderModal}
onClose={handleCloseFolderModal}
onSave={handleFolderSubmit}
onCancel={handleCloseFolderModal}
/>
)}
{/* N'afficher l'iframe que si l'utilisateur est connecté */}
{isConnected && <Iframe iframeUrl={iframeUrl} />}
</div>
</main>
</div>
)
}
export default App