213 lines
6.9 KiB
TypeScript
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
|