Skip to content

Commit 8b4540e

Browse files
committed
Hide cached searches
When query changes, old cached search results still show as their data is not null, so the check passes. Now also checks if the query is allowed.
1 parent 2792403 commit 8b4540e

File tree

2 files changed

+73
-88
lines changed

2 files changed

+73
-88
lines changed

src/components/Autocomplete/Autocomplete.tsx

+54-38
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,11 @@ import {
1717
} from "@mui/material";
1818
import { Autocomplete } from "@mui/material";
1919
import { GenomeSearchProps, Result } from "./types";
20-
import { QueryClient, QueryClientProvider, useQuery } from "@tanstack/react-query";
20+
import {
21+
QueryClient,
22+
QueryClientProvider,
23+
useQuery,
24+
} from "@tanstack/react-query";
2125

2226
/**
2327
* An autocomplete search component for genomic landmarks such as genes, SNPs, ICRs, and CCRs.
@@ -43,13 +47,6 @@ const Search: React.FC<GenomeSearchProps> = ({
4347
slotProps,
4448
...autocompleteProps
4549
}) => {
46-
// Boolean flags for each query
47-
const searchGene = queries.includes("Gene");
48-
const searchSnp = queries.includes("SNP");
49-
const searchICRE = queries.includes("iCRE");
50-
const searchCCRE = queries.includes("cCRE");
51-
const searchCoordinate = queries.includes("Coordinate");
52-
5350
// State variables
5451
const [inputValue, setInputValue] = useState("");
5552
const [selection, setSelection] = useState<Result>({} as Result);
@@ -58,6 +55,12 @@ const Search: React.FC<GenomeSearchProps> = ({
5855
);
5956
const [isLoading, setIsLoading] = useState(false);
6057

58+
const searchGene = queries.includes("Gene");
59+
const searchSnp = queries.includes("SNP");
60+
const searchICRE = queries.includes("iCRE");
61+
const searchCCRE = queries.includes("cCRE");
62+
const searchCoordinate = queries.includes("Coordinate");
63+
6164
const {
6265
data: icreData,
6366
refetch: refetchICREs,
@@ -130,31 +133,43 @@ const Search: React.FC<GenomeSearchProps> = ({
130133
useEffect(() => {
131134
if (isLoading) return;
132135
const resultsList = [];
133-
if (geneData) {
136+
if (geneData && searchGene) {
134137
resultsList.push(...geneResultList(geneData.data.gene, geneLimit || 3));
135138
}
136-
if (icreData && inputValue.toLowerCase().startsWith("eh")) {
139+
if (icreData && searchICRE && inputValue.toLowerCase().startsWith("eh")) {
137140
resultsList.push(
138141
...icreResultList(icreData.data.iCREQuery, icreLimit || 3)
139142
);
140143
}
141-
if (ccreData && inputValue.toLowerCase().startsWith("eh")) {
144+
if (ccreData && searchCCRE && inputValue.toLowerCase().startsWith("eh")) {
142145
resultsList.push(
143146
...ccreResultList(ccreData.data.cCREQuery, ccreLimit || 3)
144147
);
145148
}
146-
if (snpData && inputValue.toLowerCase().startsWith("rs")) {
149+
if (snpData && searchSnp && inputValue.toLowerCase().startsWith("rs")) {
147150
resultsList.push(
148151
...snpResultList(snpData.data.snpAutocompleteQuery, snpLimit || 3)
149152
);
150153
}
151-
if (searchCoordinate && isDomain(inputValue)) {
154+
if (isDomain(inputValue) && searchCoordinate) {
152155
resultsList.push(...getCoordinates(inputValue, assembly));
153156
}
154157

155158
if (resultsList.length === 0) setResults(null);
156159
else setResults(resultsList);
157-
}, [isLoading, icreData, ccreData, geneData, snpData]);
160+
}, [
161+
isLoading,
162+
icreData,
163+
ccreData,
164+
geneData,
165+
snpData,
166+
searchGene,
167+
searchICRE,
168+
searchCCRE,
169+
searchSnp,
170+
searchCoordinate,
171+
inputValue,
172+
]);
158173

159174
// Handle submit
160175
const onSubmit = useCallback(() => {
@@ -184,10 +199,10 @@ const Search: React.FC<GenomeSearchProps> = ({
184199
return (
185200
<Box
186201
display="flex"
187-
flexDirection="row"
202+
flexDirection="row"
188203
gap={2}
189204
style={{ ...style }}
190-
sx={{ ...sx}}
205+
sx={{ ...sx }}
191206
{...slotProps?.box}
192207
>
193208
<Autocomplete
@@ -256,31 +271,32 @@ const Search: React.FC<GenomeSearchProps> = ({
256271
*/
257272
function renderGroup(params: any, inputValue: string) {
258273
// Sort items within each group by title match relevance
259-
const sortedOptions = Array.isArray(params.children) && !isDomain(inputValue)
260-
? params.children.sort((a: any, b: any) => {
261-
const aTitle = (
262-
a.props?.children?.props?.children?.[0]?.props?.children || ""
263-
).toLowerCase();
264-
const bTitle = (
265-
b.props?.children?.props?.children?.[0]?.props?.children || ""
266-
).toLowerCase();
267-
const query = inputValue.toLowerCase();
268-
// Exact matches first
269-
if (aTitle === query && bTitle !== query) return -1;
270-
if (bTitle === query && aTitle !== query) return 1;
274+
const sortedOptions =
275+
Array.isArray(params.children) && !isDomain(inputValue)
276+
? params.children.sort((a: any, b: any) => {
277+
const aTitle = (
278+
a.props?.children?.props?.children?.[0]?.props?.children || ""
279+
).toLowerCase();
280+
const bTitle = (
281+
b.props?.children?.props?.children?.[0]?.props?.children || ""
282+
).toLowerCase();
283+
const query = inputValue.toLowerCase();
284+
// Exact matches first
285+
if (aTitle === query && bTitle !== query) return -1;
286+
if (bTitle === query && aTitle !== query) return 1;
271287

272-
// Starts with query second
273-
if (aTitle.startsWith(query) && !bTitle.startsWith(query)) return -1;
274-
if (bTitle.startsWith(query) && !aTitle.startsWith(query)) return 1;
288+
// Starts with query second
289+
if (aTitle.startsWith(query) && !bTitle.startsWith(query)) return -1;
290+
if (bTitle.startsWith(query) && !aTitle.startsWith(query)) return 1;
275291

276-
// Contains query third
277-
if (aTitle.includes(query) && !bTitle.includes(query)) return -1;
278-
if (bTitle.includes(query) && !aTitle.includes(query)) return 1;
292+
// Contains query third
293+
if (aTitle.includes(query) && !bTitle.includes(query)) return -1;
294+
if (bTitle.includes(query) && !aTitle.includes(query)) return 1;
279295

280-
// Alphabetical order for equal relevance
281-
return aTitle.localeCompare(bTitle);
282-
})
283-
: params.children;
296+
// Alphabetical order for equal relevance
297+
return aTitle.localeCompare(bTitle);
298+
})
299+
: params.children;
284300

285301
return (
286302
<div key={params.key}>

src/test.tsx

+19-50
Original file line numberDiff line numberDiff line change
@@ -1,59 +1,28 @@
11
import { createRoot } from "react-dom/client";
2-
import { Stack } from "@mui/material";
3-
import { MiniMapProps, ScatterPlot } from "./components/ScatterPlot";
2+
import { Box, Typography } from "@mui/material";
3+
import { GenomeSearch, ResultType } from "./components/Autocomplete";
44
import { useEffect, useState } from "react";
55

6-
type Point = {
7-
x: number;
8-
y: number;
9-
color: string;
10-
shape: "circle" | "triangle";
11-
};
12-
13-
// Example data for the scatter plot
14-
const scatterData: Point[] = [
15-
{ x: 1, y: 2, color: 'red', shape: "circle" },
16-
{ x: 3, y: 4, color: 'blue', shape: "circle" },
17-
{ x: 5, y: 6, color: 'green', shape: "circle" },
18-
];
19-
20-
// Mock for the map prop
21-
const miniMap: MiniMapProps = {
22-
position: { right: 50, bottom: 50 }
23-
};
24-
256
function App() {
26-
const [isLoading, setIsLoading] = useState(true);
27-
28-
useEffect(() => {
29-
const fakeLoading = setTimeout(() => {
30-
setIsLoading(false);
31-
}, 2000); // Adjust delay as needed
32-
33-
return () => clearTimeout(fakeLoading); // Cleanup on unmount
34-
}, []);
35-
7+
const [query, setQuery] = useState<ResultType[]>(["Gene"]);
8+
useEffect(() => {
9+
const timer = setTimeout(() => {
10+
setQuery(["SNP"]);
11+
}, 5000);
12+
return () => clearTimeout(timer);
13+
}, []);
3614
return (
37-
<Stack height={"57vh"} width={"70vw"} padding={1} sx={{ border: '2px solid', borderColor: 'grey.400', borderRadius: '8px' }}>
38-
<ScatterPlot
39-
pointData={scatterData}
40-
loading={isLoading}
41-
leftAxisLabel="sdgc"
42-
bottomAxisLabel="s.khdcvsvb"
43-
miniMap={miniMap}
44-
disableTooltip
45-
initialState={
46-
{
47-
minimap: {
48-
open: true,
49-
},
50-
controls: {
51-
selectionType: "pan"
52-
}
53-
}
54-
}
15+
<Box display="flex" flexDirection="column" justifyContent="center" alignItems="center" height="50vh" width="100%">
16+
<Typography variant="h1">{query.join(", ")}</Typography>
17+
<GenomeSearch
18+
assembly="GRCh38"
19+
queries={query}
20+
onSearchSubmit={(result) => {
21+
console.log(result);
22+
}}
23+
sx={{ width: "400px" }}
5524
/>
56-
</Stack>
25+
</Box>
5726
);
5827
}
5928

0 commit comments

Comments
 (0)