From 39c2232db5a3ad427b7335889e73dddb7ac5b319 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Loi=CC=88c=20Correnson?= <loic.correnson@cea.fr>
Date: Thu, 12 May 2022 16:20:51 +0200
Subject: [PATCH] [dome] useEmitter hook

---
 ivette/src/dome/renderer/dome.tsx | 20 ++++++++++++++++++--
 1 file changed, 18 insertions(+), 2 deletions(-)

diff --git a/ivette/src/dome/renderer/dome.tsx b/ivette/src/dome/renderer/dome.tsx
index 7fb76ae8e9d..9ad53344c66 100644
--- a/ivette/src/dome/renderer/dome.tsx
+++ b/ivette/src/dome/renderer/dome.tsx
@@ -42,6 +42,7 @@
  */
 
 import _ from 'lodash';
+import Emitter from 'events';
 import React from 'react';
 import ReactDOM from 'react-dom';
 import { AppContainer } from 'react-hot-loader';
@@ -176,6 +177,21 @@ export function useEvent<A>(
   }, [evt, callback]);
 }
 
+/** Custom React Hook on Node Emitters. */
+export function useEmitter(
+  emitter: undefined | null | Emitter,
+  event: undefined | null | string,
+  callback: () => void,
+) {
+  return React.useEffect((): (undefined | (() => void)) => {
+    if (emitter && event) {
+      emitter.on(event, callback);
+      return () => emitter.off(event, callback);
+    }
+    return undefined;
+  }, [emitter, event, callback]);
+}
+
 // --------------------------------------------------------------------------
 // --- Application Events
 // --------------------------------------------------------------------------
@@ -186,13 +202,13 @@ export function useEvent<A>(
    the window frame is resized.
    You can use it for your own components as an easy-to-use global
    re-render event.
-*/
+ */
 export const update = new Event('dome.update');
 
 /**
    Dome reload event.
    It is emitted when the entire window is reloaded.
-*/
+ */
 export const reload = new Event('dome.reload');
 ipcRenderer.on('dome.ipc.reload', () => reload.emit());
 
-- 
GitLab