233 lines
8.4 KiB
TypeScript
233 lines
8.4 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 { ProfilePrivateFields, setDefaultProfileRoles, type ProfileCreated, type ProfileData } from './sdk/models/ProfileData'
|
|
import { FolderPrivateFields, setDefaultFolderRoles, type FolderCreated, type FolderData } from './sdk/models/FolderData'
|
|
|
|
export 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, processes]);
|
|
|
|
// 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, validatorId: string | null, ownerId: string | null) => {
|
|
if (userPairingId !== null) {
|
|
if (validatorId === null && ownerId === null) {
|
|
console.error("No validator or owner ID provided");
|
|
return;
|
|
}
|
|
const messageBus = MessageBus.getInstance(iframeUrl);
|
|
if (validatorId === null) {
|
|
validatorId = userPairingId;
|
|
} else if (ownerId === null) {
|
|
ownerId = userPairingId;
|
|
}
|
|
const roles = setDefaultProfileRoles([ownerId!], validatorId!);
|
|
const profilePrivateFields = ProfilePrivateFields;
|
|
messageBus.createProfile(profileData, profilePrivateFields, roles).then((_profileCreated: ProfileCreated) => {
|
|
messageBus.notifyProcessUpdate(_profileCreated.processId, _profileCreated.process.states[0].state_id).then(() => {
|
|
messageBus.validateState(_profileCreated.processId, _profileCreated.process.states[0].state_id).then((_updatedProcess: any) => {
|
|
messageBus.getProcesses().then((processes: any) => {
|
|
setProcesses(processes);
|
|
});
|
|
});
|
|
})
|
|
});
|
|
|
|
setShowProfileModal(false);
|
|
}
|
|
}, [userPairingId]);
|
|
|
|
// Gestionnaire pour soumettre les données du dossier
|
|
const handleFolderSubmit = useCallback((folderData: FolderData) => {
|
|
if (userPairingId !== null) {
|
|
const roles = setDefaultFolderRoles(userPairingId, [], []);
|
|
const folderPrivateFields = FolderPrivateFields;
|
|
MessageBus.getInstance(iframeUrl).createFolder(folderData, folderPrivateFields, roles).then((_folderCreated: FolderCreated) => {
|
|
MessageBus.getInstance(iframeUrl).notifyProcessUpdate(_folderCreated.processId, _folderCreated.process.states[0].state_id).then(() => {
|
|
MessageBus.getInstance(iframeUrl).validateState(_folderCreated.processId, _folderCreated.process.states[0].state_id).then((_updatedProcess: any) => {
|
|
MessageBus.getInstance(iframeUrl).getProcesses().then((processes: any) => {
|
|
setProcesses(processes);
|
|
});
|
|
});
|
|
})
|
|
});
|
|
|
|
setShowFolderModal(false);
|
|
}
|
|
}, [userPairingId]);
|
|
|
|
// 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} myProcesses={myProcesses} onProcessesUpdate={setProcesses}/>
|
|
</div>
|
|
</div>
|
|
|
|
{/* Modales */}
|
|
{showAuthModal && (
|
|
<AuthModal
|
|
isOpen={showAuthModal}
|
|
onConnect={() => {
|
|
setIsConnected(true);
|
|
setShowAuthModal(false);
|
|
}}
|
|
onClose={() => setShowAuthModal(false)}
|
|
iframeUrl={iframeUrl}
|
|
/>
|
|
)}
|
|
{showProfileModal && (
|
|
<ProfileModal
|
|
isOpen={showProfileModal}
|
|
onClose={handleCloseProfileModal}
|
|
onSubmit={(profileData: ProfileData, validatorId: string | null, ownerId: string | null) => handleProfileSubmit(profileData, validatorId, ownerId)}
|
|
/>
|
|
)}
|
|
{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
|