Line data Source code
1 : import * as React from 'react';
2 :
3 : import type { QueryExecutionState } from '../query/query_execution_state.js';
4 : import type { ShellQueryExecutionTracker } from '../shell/query_execution.js';
5 :
6 : /// The result that the overlay of the shell shows. Closing the overlay keeps the result so that it can open again, the
7 : /// computation of a result is released once another result replaces it.
8 1 : export function useShellQueryResult(queryExecutions: ShellQueryExecutionTracker, releaseResult: (queryId: number) => void) {
9 1 : const [lastQuery, setLastQuery] = React.useState<QueryExecutionState | null>(null);
10 1 : const [open, setOpen] = React.useState(false);
11 1 : const lastQueryRef = React.useRef(lastQuery);
12 1 : lastQueryRef.current = lastQuery;
13 1 : const lastQueryId = lastQuery?.queryId ?? null;
14 1 : React.useEffect(() => {
15 1 : if (lastQueryId == null) return;
16 1 : return () => releaseResult(lastQueryId);
17 1 : }, [lastQueryId, releaseResult]);
18 1 : const showResultQuery = React.useCallback((queryId: number) => {
19 1 : const query = queryExecutions.getSnapshot().find(candidate => candidate.queryId === queryId) ?? null;
20 1 : setLastQuery(query);
21 1 : setOpen(query != null);
22 1 : }, [queryExecutions]);
23 1 : const closeResultQuery = React.useCallback(() => setOpen(false), []);
24 1 : const reopenResultQuery = React.useCallback(() => {
25 1 : if (lastQueryRef.current == null) return false;
26 1 : setOpen(true);
27 1 : return true;
28 1 : }, []);
29 : /// A result that failed to render doesn't open again
30 1 : const dropResultQuery = React.useCallback(() => {
31 1 : setLastQuery(null);
32 1 : setOpen(false);
33 1 : }, []);
34 :
35 1 : return { resultQuery: open ? lastQuery : null, showResultQuery, closeResultQuery, reopenResultQuery, dropResultQuery };
36 1 : }
|