CEC-5135: remove prop from useEffect deps (#459)

* resolve localStorage race condition

* fix

* fix

* CEC-5135: remove prop from deps

* update test
This commit is contained in:
Tristan Timblin
2023-10-03 17:10:54 -07:00
committed by GitHub
parent e5ccb23443
commit eae44c9249
4 changed files with 32 additions and 36 deletions

View File

@@ -18,10 +18,10 @@ import useStyles from "../../useStyles";
const MainForm = () => { const MainForm = () => {
const classes = useStyles(); const classes = useStyles();
const [online, setOnline] = useState(false); const [online, setOnline] = useState(null);
const [onlineHMI, setOnlineHMI] = useState(false); const [onlineHMI, setOnlineHMI] = useState(null);
const [selectedVins, setSelectedVins] = useState([]); const [selectedVins, setSelectedVins] = useState([]);
const { vins, search, query, setQuery, loading } = useQuery(); const { payload, query, setQuery, loading } = useQuery();
const { setTitle, setSitePath } = useStatusContext(); const { setTitle, setSitePath } = useStatusContext();
const { const {
token: { token: {
@@ -36,7 +36,7 @@ const MainForm = () => {
}; };
const handleOnline = (event) => { const handleOnline = (event) => {
setOnline(event.target.checked); setOnline(event.target.checked || null);
}; };
const handleSelectAll = (cars) => { const handleSelectAll = (cars) => {
@@ -53,7 +53,7 @@ const MainForm = () => {
}; };
const handleOnlineHMI = (event) => { const handleOnlineHMI = (event) => {
setOnlineHMI(event.target.checked); setOnlineHMI(event.target.checked || null);
}; };
useEffect(() => { useEffect(() => {
@@ -105,10 +105,9 @@ const MainForm = () => {
token={token} token={token}
multiSelect multiSelect
search={{ search={{
search, ...payload,
vins, online,
online: online ? true : null, online_hmi: onlineHMI,
online_hmi: onlineHMI ? true : null,
}} }}
selected={selectedVins} selected={selectedVins}
onSelect={handleSelect} onSelect={handleSelect}

View File

@@ -35,42 +35,40 @@ function parseQueryPart(part) {
export default function useQuery() { export default function useQuery() {
const [query, setQuery] = useLocalStorage("VEHICLE_SEARCH", ""); const [query, setQuery] = useLocalStorage("VEHICLE_SEARCH", "");
const [parts, setParts] = useState([]); const [parts, setParts] = useState([]);
const [search, setSearch] = useState(null); const [payload, setPayload] = useState({});
const [vins, setVins] = useState("");
const [loading, setLoading] = useState(true); const [loading, setLoading] = useState(true);
function reset() {
setSearch("");
setVins([]);
}
useEffect(() => { useEffect(() => {
reset(); setLoading(true);
let vins = [];
let search = "";
const parts = query.replaceAll(" ", ",").split(",").map(parseQueryPart); const parts = query.replaceAll(" ", ",").split(",").map(parseQueryPart);
setParts(parts); setParts(parts);
parts.forEach(([type, value]) => { parts.forEach(([type, value]) => {
if (type === "vin") { if (type === "vin") {
setVins(vins => { vins.push(value);
if (vins.length) {
return `${vins},${value}`;
}
return value;
});
} }
if (type === "search") { if (type === "search") {
setSearch(search => `${search} ${value}`.trim()); search = `${search} ${value}`.trim();
} }
}); });
setPayload({
search,
vins: vins.join(","),
})
}, [query, setPayload]);
useEffect(() => {
setLoading(false); setLoading(false);
}, [query]); }, [payload, setLoading])
return { return {
parts, parts,
search, payload,
vins,
query, query,
setQuery, setQuery,
loading, loading,

View File

@@ -3,8 +3,7 @@ import useQuery from "./useQuery";
const MyComponent = () => { const MyComponent = () => {
const { const {
search, payload,
vins,
query, query,
setQuery, setQuery,
} = useQuery(); } = useQuery();
@@ -17,8 +16,8 @@ const MyComponent = () => {
onChange={(e) => setQuery(e.target.value)} onChange={(e) => setQuery(e.target.value)}
/> />
<ol> <ol>
<li data-testid="search">{search}</li> <li data-testid="search">{payload.search}</li>
<li data-testid="vins">{vins}</li> <li data-testid="vins">{payload.vins}</li>
<li data-testid="query">{query}</li> <li data-testid="query">{query}</li>
</ol> </ol>
</> </>

View File

@@ -67,7 +67,6 @@ const CarSelectionTable = (props) => {
const [order, setOrder] = useState("asc"); const [order, setOrder] = useState("asc");
const { getVehicles, vehicles, totalVehicles } = useVehicleContext(); const { getVehicles, vehicles, totalVehicles } = useVehicleContext();
const { setMessage } = useStatusContext(); const { setMessage } = useStatusContext();
const { search: searchTerm } = search;
const handleSort = (_event, property) => { const handleSort = (_event, property) => {
if (property === orderBy) { if (property === orderBy) {
@@ -111,21 +110,22 @@ const CarSelectionTable = (props) => {
}; };
useEffect(() => { useEffect(() => {
const options = { const queryParams = {
...search,
limit: pageSize, limit: pageSize,
offset: pageSize * pageIndex, offset: pageSize * pageIndex,
order: `${orderBy} ${order}`, order: `${orderBy} ${order}`,
}; };
(async () => { (async () => {
try { try {
await getVehicles(Object.assign(options, search), token); await getVehicles(queryParams, token);
} catch (e) { } catch (e) {
setMessage(e.message); setMessage(e.message);
logger.warn(e.stack); logger.warn(e.stack);
} }
})(); })();
// eslint-disable-next-line react-hooks/exhaustive-deps // eslint-disable-next-line react-hooks/exhaustive-deps
}, [pageIndex, pageSize, orderBy, order, search, token]); }, [pageIndex, pageSize, orderBy, order, token]);
useEffect(() => { useEffect(() => {
setPageIndex(0); setPageIndex(0);
@@ -172,7 +172,7 @@ const CarSelectionTable = (props) => {
<br /> <br />
<ECUList <ECUList
list={row.ecu_list} list={row.ecu_list}
search={searchTerm} search={search.search}
searchedOnly={true} searchedOnly={true}
/> />
</> </>