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