Skip to content

Commit 3a1349e

Browse files
committed
Move selectedTable state up into ResultsApp
1 parent efc2606 commit 3a1349e

File tree

2 files changed

+48
-31
lines changed

2 files changed

+48
-31
lines changed

extensions/ql-vscode/src/view/results/ResultTables.tsx

Lines changed: 7 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,6 @@ import {
1313
ALERTS_TABLE_NAME,
1414
GRAPH_TABLE_NAME,
1515
SELECT_TABLE_NAME,
16-
getDefaultResultSetName,
1716
} from "../../common/interface-types";
1817
import { tableHeaderClassName } from "./result-table-utils";
1918
import { vscode } from "../vscode-api";
@@ -42,6 +41,8 @@ interface ResultTablesProps {
4241
isLoadingNewResults: boolean;
4342
queryName: string;
4443
queryPath: string;
44+
selectedTable: string;
45+
onSelectedTableChange: (tableName: string) => void;
4546
problemsViewSelected: boolean;
4647
onProblemsViewSelectedChange: (selected: boolean) => void;
4748
}
@@ -102,30 +103,12 @@ export function ResultTables(props: ResultTablesProps) {
102103
origResultsPaths,
103104
isLoadingNewResults,
104105
sortStates,
106+
selectedTable,
107+
onSelectedTableChange,
105108
problemsViewSelected,
106109
onProblemsViewSelectedChange,
107110
} = props;
108111

109-
const [selectedTable, setSelectedTable] = useState(
110-
parsedResultSets.selectedTable ||
111-
getDefaultResultSet(getResultSets(rawResultSets, interpretation)),
112-
);
113-
useEffect(() => {
114-
const resultSetExists =
115-
parsedResultSets.resultSetNames.some((v) => selectedTable === v) ||
116-
getResultSets(rawResultSets, interpretation).some(
117-
(v) => selectedTable === getResultSetName(v),
118-
);
119-
120-
// If the selected result set does not exist, select the default result set.
121-
if (!resultSetExists) {
122-
setSelectedTable(
123-
parsedResultSets.selectedTable ||
124-
getDefaultResultSet(getResultSets(rawResultSets, interpretation)),
125-
);
126-
}
127-
}, [parsedResultSets, interpretation, rawResultSets, selectedTable]);
128-
129112
const onTableSelectionChange = useCallback(
130113
(event: React.ChangeEvent<HTMLSelectElement>): void => {
131114
const selectedTable = event.target.value;
@@ -134,9 +117,10 @@ export function ResultTables(props: ResultTablesProps) {
134117
pageNumber: 0,
135118
selectedTable,
136119
});
120+
onSelectedTableChange(selectedTable);
137121
sendTelemetry("local-results-table-selection");
138122
},
139-
[],
123+
[onSelectedTableChange],
140124
);
141125

142126
const handleCheckboxChanged = useCallback(
@@ -227,7 +211,7 @@ export function ResultTables(props: ResultTablesProps) {
227211
sortState={sortStates.get(resultSetName)}
228212
nonemptyRawResults={nonemptyRawResults}
229213
showRawResults={() => {
230-
setSelectedTable(SELECT_TABLE_NAME);
214+
onSelectedTableChange(SELECT_TABLE_NAME);
231215
sendTelemetry("local-results-show-raw-results");
232216
}}
233217
offset={offset}
@@ -237,12 +221,6 @@ export function ResultTables(props: ResultTablesProps) {
237221
);
238222
}
239223

240-
function getDefaultResultSet(resultSets: readonly ResultSet[]): string {
241-
return getDefaultResultSetName(
242-
resultSets.map((resultSet) => getResultSetName(resultSet)),
243-
);
244-
}
245-
246224
function getResultSetName(resultSet: ResultSet): string {
247225
switch (resultSet.t) {
248226
case "RawResultSet":

extensions/ql-vscode/src/view/results/ResultsApp.tsx

Lines changed: 41 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ import {
1515
ALERTS_TABLE_NAME,
1616
DEFAULT_USER_SETTINGS,
1717
GRAPH_TABLE_NAME,
18+
getDefaultResultSetName,
1819
} from "../../common/interface-types";
1920
import { useMessageFromExtension } from "../common/useMessageFromExtension";
2021
import { ResultTables } from "./ResultTables";
@@ -64,6 +65,7 @@ interface ResultsViewState {
6465
displayedResults: ResultsState;
6566
nextResultsInfo: ResultsInfo | null;
6667
isExpectingResultsUpdate: boolean;
68+
selectedTable: string | undefined;
6769
}
6870

6971
/**
@@ -78,6 +80,7 @@ export function ResultsApp() {
7880
},
7981
nextResultsInfo: null,
8082
isExpectingResultsUpdate: true,
83+
selectedTable: undefined,
8184
});
8285

8386
const [userSettings, setUserSettings] = useState<UserSettings>(
@@ -86,6 +89,39 @@ export function ResultsApp() {
8689

8790
const [problemsViewSelected, setProblemsViewSelected] = useState(false);
8891

92+
const onSelectedTableChange = useCallback((tableName: string) => {
93+
setState((prev) => {
94+
if (tableName === prev.selectedTable) return prev;
95+
return {
96+
...prev,
97+
selectedTable: tableName,
98+
};
99+
});
100+
}, []);
101+
102+
// Ensure selectedTable is valid for the current result sets.
103+
// This runs in ResultsApp (not ResultTables) so it survives remounts.
104+
const displayedResultsInfo = state.displayedResults.resultsInfo;
105+
useEffect(() => {
106+
if (!displayedResultsInfo) return;
107+
const { parsedResultSets, interpretation } = displayedResultsInfo;
108+
const allNames = interpretation
109+
? parsedResultSets.resultSetNames.concat([
110+
interpretation.data.t === "GraphInterpretationData"
111+
? GRAPH_TABLE_NAME
112+
: ALERTS_TABLE_NAME,
113+
])
114+
: parsedResultSets.resultSetNames;
115+
if (
116+
state.selectedTable === undefined ||
117+
!allNames.includes(state.selectedTable)
118+
) {
119+
const tableName =
120+
parsedResultSets.selectedTable ?? getDefaultResultSetName(allNames);
121+
onSelectedTableChange(tableName);
122+
}
123+
}, [displayedResultsInfo, state.selectedTable, onSelectedTableChange]);
124+
89125
const updateStateWithNewResultsInfo = useCallback(
90126
(resultsInfo: ResultsInfo): void => {
91127
let results: Results | null = null;
@@ -103,15 +139,16 @@ export function ResultsApp() {
103139
statusText = `Error loading results: ${errorMessage}`;
104140
}
105141

106-
setState({
142+
setState((prev) => ({
143+
...prev,
107144
displayedResults: {
108145
resultsInfo,
109146
results,
110147
errorMessage: statusText,
111148
},
112149
nextResultsInfo: null,
113150
isExpectingResultsUpdate: false,
114-
});
151+
}));
115152
},
116153
[],
117154
);
@@ -232,6 +269,8 @@ export function ResultsApp() {
232269
}
233270
queryName={displayedResults.resultsInfo.queryName}
234271
queryPath={displayedResults.resultsInfo.queryPath}
272+
selectedTable={state.selectedTable ?? ""}
273+
onSelectedTableChange={onSelectedTableChange}
235274
problemsViewSelected={problemsViewSelected}
236275
onProblemsViewSelectedChange={setProblemsViewSelected}
237276
/>

0 commit comments

Comments
 (0)