From 0e8f16d3de638da9b8ae907ccd86bdcc060c0136 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Loi=CC=88c=20Correnson?= <loic.correnson@cea.fr>
Date: Mon, 17 Feb 2020 17:04:07 +0100
Subject: [PATCH] [ivette/states] cached GET requests

---
 ivette/src/frama-c/states.js | 34 ++++++++++++++++++++++++++++++++++
 1 file changed, 34 insertions(+)

diff --git a/ivette/src/frama-c/states.js b/ivette/src/frama-c/states.js
index 3b24fb098c6..65696575026 100644
--- a/ivette/src/frama-c/states.js
+++ b/ivette/src/frama-c/states.js
@@ -122,6 +122,40 @@ export function useState(id)
   return [ value , (v) => setValue(id,project,v) ];
 }
 
+// --------------------------------------------------------------------------
+// --- Cached GET Requests
+// --------------------------------------------------------------------------
+
+/**
+   @summary Cached GET request (Custom React Hook).
+   @param {string} rq - GET request name
+   @param {any} [params] - GET request parameter
+   @param {boolean} [cancel] - Cancel value when updating (default is `false`)
+   @return {any} [result] GET reequest response (when available)
+   @description
+   Sends the specified GET request and returns its result.
+   The request is send asynchronously and cached until any change in
+   `rq`, `params`, current project or server activity.
+
+   The result can be `undefined` when the Server is off or until
+   the server response has been actually received
+   (first request or `cancel=true`).
+ */
+export function useRequest( rq, params, cancel=false )
+{
+  let project = useProject();
+  let [ value, setValue ] = React.useState();
+  React.useEffect( () => {
+    if (project) {
+      if (cancel) setValue(undefined);
+      Server.sendGET( rq , params ).then(setValue);
+    } else {
+      if (value !== undefined) setValue(undefined);
+    }
+  } , [ project, rq, JSON.stringify(params) ] );
+  return value;
+}
+
 // --------------------------------------------------------------------------
 // --- Synchronized States
 // --------------------------------------------------------------------------
-- 
GitLab