From 22151f4595fa9a4038bb1d9e59036302dab3aec0 Mon Sep 17 00:00:00 2001
From: Michele Alberti <michele.alberti@cea.fr>
Date: Thu, 4 Jun 2020 10:58:58 +0200
Subject: [PATCH] [ivette] Reset useRequest response state on falsy values for
 project, rq, or params.

When either the current projet, or rq, or params takes a falsy value, the request is considered off-line.
---
 ivette/src/frama-c/states.ts    | 11 ++++++-----
 ivette/src/renderer/ASTinfo.tsx |  8 ++++++--
 ivette/src/renderer/ASTview.tsx |  2 +-
 3 files changed, 13 insertions(+), 8 deletions(-)

diff --git a/ivette/src/frama-c/states.ts b/ivette/src/frama-c/states.ts
index b846dee4fa4..94ccba06ede 100644
--- a/ivette/src/frama-c/states.ts
+++ b/ivette/src/frama-c/states.ts
@@ -161,6 +161,9 @@ export function useState(id: string) {
  *  The request is send asynchronously and cached until any change in
  *  `rq`, `params`, current project or server activity.
  *
+ *  The request is considered off-line as soon as either `rq` or `params` or
+ *  current project takes a falsy value.
+ *
  *  Default values for various situations can be defined in the options
  *  parameter, which is `undefined` unless specified, or `null` to keep the
  *  current value.
@@ -175,12 +178,10 @@ export function useRequest(rq: string, params: any, options: any = {}) {
   const footprint = project ? JSON.stringify([project, rq, params]) : undefined;
 
   async function trigger() {
-    if (project) {
+    if (project && rq && params) {
       try {
-        if (rq && params) {
-          const r = await Server.GET({ endpoint: rq, params });
-          setResponse(r);
-        }
+        const r = await Server.GET({ endpoint: rq, params });
+        setResponse(r);
       } catch (error) {
         PP.error(`Fail in useRequest '${rq}'. ${error.toString()}`);
         const err = options.error;
diff --git a/ivette/src/renderer/ASTinfo.tsx b/ivette/src/renderer/ASTinfo.tsx
index e4754c98f10..4e21ed0a246 100644
--- a/ivette/src/renderer/ASTinfo.tsx
+++ b/ivette/src/renderer/ASTinfo.tsx
@@ -19,7 +19,11 @@ const ASTinfo = () => {
   const buffer = React.useMemo(() => new RichTextBuffer(), []);
   const [select, setSelect] = States.useSelection();
   const marker = select && select.marker;
-  const data = States.useRequest('kernel.ast.info', marker);
+  const data = States.useRequest(
+    'kernel.ast.info',
+    marker,
+    { offline: undefined },
+  );
 
   React.useEffect(() => {
     buffer.clear();
@@ -31,7 +35,7 @@ const ASTinfo = () => {
   // Callbacks
   function onSelection(name: string) {
     // For now, the only markers are functions.
-    setSelect({ function: name, marker: null });
+    setSelect({ function: name, marker: undefined });
   }
 
   // Component
diff --git a/ivette/src/renderer/ASTview.tsx b/ivette/src/renderer/ASTview.tsx
index 4879b2fd17c..4b85a415ae2 100644
--- a/ivette/src/renderer/ASTview.tsx
+++ b/ivette/src/renderer/ASTview.tsx
@@ -105,7 +105,7 @@ const ASTview = () => {
     if (marker && marker.kind === 'function') {
       const item1 = {
         label: `Go to definition of ${marker.name}`,
-        onClick: () => setSelect({ function: marker.name, marker: null }),
+        onClick: () => setSelect({ function: marker.name, marker: undefined }),
       };
       Dome.popupMenu([item1]);
     }
-- 
GitLab