Rearrange functions so they are defined earlier in the file from where they are called

This commit is contained in:
Robert
2023-06-29 14:27:40 +01:00
parent c00adc01f1
commit dc5826a848

View File

@@ -87,6 +87,59 @@ export class ResultsApp extends React.Component<
}; };
} }
private updateStateWithNewResultsInfo(resultsInfo: ResultsInfo): void {
this.setState((prevState) => {
if (resultsInfo === null && prevState.isExpectingResultsUpdate) {
// Display loading message
return {
displayedResults: {
resultsInfo: null,
results: null,
errorMessage: "Loading results…",
},
isExpectingResultsUpdate: prevState.isExpectingResultsUpdate,
nextResultsInfo: resultsInfo,
};
} else if (resultsInfo === null) {
// No results to display
return {
displayedResults: {
resultsInfo: null,
results: null,
errorMessage: "No results to display",
},
isExpectingResultsUpdate: prevState.isExpectingResultsUpdate,
nextResultsInfo: resultsInfo,
};
}
let results: Results | null = null;
let statusText = "";
try {
const resultSets = getResultSets(resultsInfo);
results = {
resultSets,
database: resultsInfo.database,
sortStates: getSortStates(resultsInfo),
};
} catch (e) {
const errorMessage = getErrorMessage(e);
statusText = `Error loading results: ${errorMessage}`;
}
return {
displayedResults: {
resultsInfo,
results,
errorMessage: statusText,
},
nextResultsInfo: null,
isExpectingResultsUpdate: false,
};
});
}
handleMessage(msg: IntoResultsViewMsg): void { handleMessage(msg: IntoResultsViewMsg): void {
switch (msg.t) { switch (msg.t) {
case "setState": case "setState":
@@ -160,85 +213,23 @@ export class ResultsApp extends React.Component<
} }
} }
private updateStateWithNewResultsInfo(resultsInfo: ResultsInfo): void { private vscodeMessageHandler(evt: MessageEvent) {
this.setState((prevState) => { // sanitize origin
if (resultsInfo === null && prevState.isExpectingResultsUpdate) { const origin = evt.origin.replace(/\n|\r/g, "");
// Display loading message evt.origin === window.origin
return { ? this.handleMessage(evt.data as IntoResultsViewMsg)
displayedResults: { : console.error(`Invalid event origin ${origin}`);
resultsInfo: null,
results: null,
errorMessage: "Loading results…",
},
isExpectingResultsUpdate: prevState.isExpectingResultsUpdate,
nextResultsInfo: resultsInfo,
};
} else if (resultsInfo === null) {
// No results to display
return {
displayedResults: {
resultsInfo: null,
results: null,
errorMessage: "No results to display",
},
isExpectingResultsUpdate: prevState.isExpectingResultsUpdate,
nextResultsInfo: resultsInfo,
};
}
let results: Results | null = null;
let statusText = "";
try {
const resultSets = this.getResultSets(resultsInfo);
results = {
resultSets,
database: resultsInfo.database,
sortStates: this.getSortStates(resultsInfo),
};
} catch (e) {
const errorMessage = getErrorMessage(e);
statusText = `Error loading results: ${errorMessage}`;
}
return {
displayedResults: {
resultsInfo,
results,
errorMessage: statusText,
},
nextResultsInfo: null,
isExpectingResultsUpdate: false,
};
});
} }
private getResultSets(resultsInfo: ResultsInfo): readonly ResultSet[] { componentDidMount(): void {
const parsedResultSets = resultsInfo.parsedResultSets; this.vscodeMessageHandler = this.vscodeMessageHandler.bind(this);
const resultSet = parsedResultSets.resultSet; window.addEventListener("message", this.vscodeMessageHandler);
if ( }
resultSet.t !== "InterpretedResultSet" &&
resultSet.t !== "RawResultSet" componentWillUnmount(): void {
) { if (this.vscodeMessageHandler) {
throw new Error( window.removeEventListener("message", this.vscodeMessageHandler);
`Invalid result set type. Should be either "InterpretedResultSet" or "RawResultSet", but got "${
(resultSet as { t: string }).t
}".`,
);
} }
return [resultSet];
}
private getSortStates(
resultsInfo: ResultsInfo,
): Map<string, RawResultsSortState> {
const entries = Array.from(resultsInfo.sortedResultsMap.entries());
return new Map(
entries.map(([key, sortedResultSetInfo]) => [
key,
sortedResultSetInfo.sortState,
]),
);
} }
render(): JSX.Element { render(): JSX.Element {
@@ -286,23 +277,32 @@ export class ResultsApp extends React.Component<
return <span>{displayedResults.errorMessage}</span>; return <span>{displayedResults.errorMessage}</span>;
} }
} }
}
componentDidMount(): void {
this.vscodeMessageHandler = this.vscodeMessageHandler.bind(this); function getSortStates(
window.addEventListener("message", this.vscodeMessageHandler); resultsInfo: ResultsInfo,
} ): Map<string, RawResultsSortState> {
const entries = Array.from(resultsInfo.sortedResultsMap.entries());
componentWillUnmount(): void { return new Map(
if (this.vscodeMessageHandler) { entries.map(([key, sortedResultSetInfo]) => [
window.removeEventListener("message", this.vscodeMessageHandler); key,
} sortedResultSetInfo.sortState,
} ]),
);
private vscodeMessageHandler(evt: MessageEvent) { }
// sanitize origin
const origin = evt.origin.replace(/\n|\r/g, ""); function getResultSets(resultsInfo: ResultsInfo): readonly ResultSet[] {
evt.origin === window.origin const parsedResultSets = resultsInfo.parsedResultSets;
? this.handleMessage(evt.data as IntoResultsViewMsg) const resultSet = parsedResultSets.resultSet;
: console.error(`Invalid event origin ${origin}`); if (
} resultSet.t !== "InterpretedResultSet" &&
resultSet.t !== "RawResultSet"
) {
throw new Error(
`Invalid result set type. Should be either "InterpretedResultSet" or "RawResultSet", but got "${
(resultSet as { t: string }).t
}".`,
);
}
return [resultSet];
} }