diff --git a/app/dashboard/folders/page.tsx b/app/dashboard/folders/page.tsx index a53659b..ccf34de 100644 --- a/app/dashboard/folders/page.tsx +++ b/app/dashboard/folders/page.tsx @@ -51,6 +51,7 @@ import { import FolderModal from "@/components/FolderModal" import type { FolderData as SDKFolderData, FolderCreated } from "@/lib/4nk/models/FolderData" import { FolderPrivateFields, setDefaultFolderRoles } from "@/lib/4nk/models/FolderData" +import { RhCreated, RhData, RhPrivateFields, setDefaultRhRoles } from "@/lib/4nk/models/RhData" import AuthModal from "@/components/4nk/AuthModal" import Iframe from "@/components/4nk/Iframe" import MessageBus from "@/lib/4nk/MessageBus" @@ -58,7 +59,6 @@ import EventBus from "@/lib/4nk/EventBus" import UserStore from "@/lib/4nk/UserStore" import ProcessesViewer from "@/components/ProcessesViewer" import { iframeUrl } from "@/app/page" - interface FolderData { id: number name: string @@ -356,7 +356,6 @@ export default function FoldersPage() { messageBus.isReady().then(() => { messageBus.getProcesses().then((processes: any) => { setProcesses(processes); - console.log('getProcesses', processes); }); }); } @@ -999,16 +998,16 @@ export default function FoldersPage() { ); return; } - + // Ajout du type dans les données du dossier const folderToCreate = { ...folderData, type: folderType }; - + const roles = setDefaultFolderRoles(userPairingId, [], []); const folderPrivateFields = FolderPrivateFields; - + MessageBus.getInstance(iframeUrl) .createFolder(folderToCreate, folderPrivateFields, roles) .then((_folderCreated: FolderCreated) => { @@ -1027,17 +1026,60 @@ export default function FoldersPage() { ) ); - setShowCreateFolderModal(false); - showNotification("success", `Dossier "${folderData.name}" créé avec succès sur 4NK`); + setShowCreateFolderModal(false); + showNotification("success", `Dossier "${folderData.name}" créé avec succès sur 4NK`); }) .catch((error) => { - console.error('Erreur lors de la création du dossier 4NK:', error); - showNotification("error", "Erreur lors de la création du dossier"); + console.error('Erreur lors de la création du dossier 4NK:', error); + showNotification("error", "Erreur lors de la création du dossier"); }); }, [userPairingId, isConnected, iframeUrl, folderType] ); + // const handleSaveNewRhFolder = useCallback( + // (folderData: RhData) => { + // if (!isConnected || !userPairingId) { + // console.error('Conditions non remplies:', { isConnected, userPairingId }); + // showNotification( + // "error", + // `Vous devez être connecté à 4NK pour créer un dossier (Connected: ${isConnected}, PairingId: ${userPairingId ? 'OK' : 'NULL'})` + // ); + // return; + // } + + // const roles = setDefaultRhRoles(userPairingId, [], []); + // const folderPrivateFields = RhPrivateFields; + + // MessageBus.getInstance(iframeUrl) + // .createRhFolder(folderData, folderPrivateFields, roles) + // .then((_folderCreated: RhCreated) => { + // const firstStateId = _folderCreated.process.states[0].state_id; + // MessageBus.getInstance(iframeUrl) + // .notifyProcessUpdate(_folderCreated.processId, firstStateId) + // .then(() => + // MessageBus.getInstance(iframeUrl) + // .validateState(_folderCreated.processId, firstStateId) + // .then(() => + // MessageBus.getInstance(iframeUrl) + // .getProcesses() + // .then(async (processes: any) => { + // setProcesses(processes) + // }) + // ) + // ); + + // setShowCreateFolderModal(false); + // showNotification("success", `Dossier (RH) "${folderData.name}" créé avec succès sur 4NK`); + // }) + // .catch((error) => { + // console.error('Erreur lors de la création du dossier 4NK:', error); + // showNotification("error", "Erreur lors de la création du dossier"); + // }); + // }, + // [userPairingId, isConnected, iframeUrl, folderType] + // ); + const handleToggleFavorite = (folderId: number) => { const folder = folders.find((f) => f.id === folderId) if (!folder) return diff --git a/lib/4nk/MessageBus.ts b/lib/4nk/MessageBus.ts index fc320e1..59059fe 100644 --- a/lib/4nk/MessageBus.ts +++ b/lib/4nk/MessageBus.ts @@ -5,6 +5,7 @@ import { isProfileData, type ProfileCreated, type ProfileData } from './models/P import { isFolderData, type FolderCreated, type FolderData } from './models/FolderData'; import { v4 as uuidv4 } from 'uuid'; import type { RoleDefinition } from './models/Roles'; +import { isRhData, RhCreated, RhData } from './models/RhData'; export default class MessageBus { private static instance: MessageBus; @@ -407,15 +408,65 @@ export default class MessageBus { unsubscribe(); this.destroyMessageListener(); // Return value must contain the data commited in the new process - const folderData = processCreated.processData; - if (!folderData || !isFolderData(folderData)) reject('Returned invalid process data'); + const data = processCreated.processData; + if (!data || !isFolderData(data)) reject('Returned invalid process data'); if (!processCreated.processId || typeof processCreated.processId !== 'string') reject('Returned invalid process id'); // TODO check that process is of type Process const folderCreated: FolderCreated = { processId: processCreated.processId, process: processCreated.process, - folderData + data + }; + + resolve(folderCreated); + }); + + const unsubscribeError = EventBus.getInstance().on('ERROR_PROCESS_CREATED', (responseId: string, error: string) => { + if (responseId !== correlationId) { + return; + } + unsubscribeError(); + this.destroyMessageListener(); + reject(error); + }); + + this.sendMessage({ + type: 'CREATE_PROCESS', + processData: folderData, + privateFields: folderPrivateData, + roles, + accessToken + }); + }).catch(console.error); + }); + } + + public createRhFolder(folderData: RhData, folderPrivateData: string[], roles: Record): Promise { + return new Promise((resolve: (folderData: RhCreated) => void, reject: (error: string) => void) => { + this.checkToken().then(() => { + const userStore = UserStore.getInstance(); + const accessToken = userStore.getAccessToken()!; + + const correlationId = uuidv4(); + this.initMessageListener(correlationId); + + const unsubscribe = EventBus.getInstance().on('PROCESS_CREATED', (responseId: string, processCreated: any) => { + if (responseId !== correlationId) { + return; + } + unsubscribe(); + this.destroyMessageListener(); + // Return value must contain the data commited in the new process + const data = processCreated.processData; + if (!data || !isFolderData(data)) reject('Returned invalid process data'); + if (!processCreated.processId || typeof processCreated.processId !== 'string') reject('Returned invalid process id'); + // TODO check that process is of type Process + + const folderCreated: RhCreated = { + processId: processCreated.processId, + process: processCreated.process, + data }; resolve(folderCreated);