From 7708a1fd12e903efc149c08a980a4ca9bc570b67 Mon Sep 17 00:00:00 2001 From: c-bata Date: Mon, 4 Mar 2024 18:51:09 +0900 Subject: [PATCH] Use useDeferredValue instead of Debounce.tsx --- optuna_dashboard/ts/components/Debounce.tsx | 1 + optuna_dashboard/ts/components/StudyList.tsx | 59 +++++++++++--------- 2 files changed, 33 insertions(+), 27 deletions(-) diff --git a/optuna_dashboard/ts/components/Debounce.tsx b/optuna_dashboard/ts/components/Debounce.tsx index 31e34739a..c8ee17513 100644 --- a/optuna_dashboard/ts/components/Debounce.tsx +++ b/optuna_dashboard/ts/components/Debounce.tsx @@ -1,6 +1,7 @@ import React, { FC, useEffect } from "react" import { TextField, TextFieldProps } from "@mui/material" +// TODO(c-bata): Remove this and use `useDeferredValue` instead. export const DebouncedInputTextField: FC<{ onChange: (s: string, valid: boolean) => void delay: number diff --git a/optuna_dashboard/ts/components/StudyList.tsx b/optuna_dashboard/ts/components/StudyList.tsx index 6c6625197..49d5c1918 100644 --- a/optuna_dashboard/ts/components/StudyList.tsx +++ b/optuna_dashboard/ts/components/StudyList.tsx @@ -1,4 +1,10 @@ -import React, { FC, useEffect, useState } from "react" +import React, { + FC, + useEffect, + useState, + useDeferredValue, + useMemo, +} from "react" import { useNavigate } from "react-router-dom" import { useRecoilValue } from "recoil" import { Link } from "react-router-dom" @@ -26,7 +32,6 @@ import CompareIcon from "@mui/icons-material/Compare" import DriveFileRenameOutlineIcon from "@mui/icons-material/DriveFileRenameOutline" import { actionCreator } from "../action" -import { DebouncedInputTextField } from "./Debounce" import { studySummariesLoadingState, studySummariesState } from "../state" import { styled } from "@mui/system" import { AppDrawer } from "./AppDrawer" @@ -41,7 +46,8 @@ export const StudyList: FC<{ const theme = useTheme() const action = actionCreator() - const [studyFilterText, setStudyFilterText] = React.useState("") + const [_studyFilterText, setStudyFilterText] = React.useState("") + const studyFilterText = useDeferredValue(_studyFilterText) const studyFilter = (row: StudySummary) => { const keywords = studyFilterText.split(" ") return !keywords.every((k) => { @@ -64,12 +70,14 @@ export const StudyList: FC<{ const query = useQuery() const initialSortBy = query.get("studies_order_by") === "asc" ? "asc" : "desc" const [sortBy, setSortBy] = useState<"asc" | "desc">(initialSortBy) + const filteredStudies = useMemo(() => { + let filteredStudies: StudySummary[] = studies.filter((s) => !studyFilter(s)) + if (sortBy === "desc") { + filteredStudies = filteredStudies.reverse() + } + return filteredStudies + }, [studyFilterText, studies, sortBy]) - let filteredStudies = studies.filter((s) => !studyFilter(s)) - - if (sortBy === "desc") { - filteredStudies = filteredStudies.reverse() - } useEffect(() => { action.updateStudySummaries() }, []) @@ -201,26 +209,23 @@ export const StudyList: FC<{ - { - setStudyFilterText(s) + { + setStudyFilterText(e.target.value) }} - delay={500} - textFieldProps={{ - fullWidth: true, - id: "search-study", - variant: "outlined", - placeholder: "Search study", - sx: { maxWidth: 500 }, - InputProps: { - startAdornment: ( - - - - - - ), - }, + id="search-study" + variant="outlined" + placeholder="Search study" + fullWidth + sx={{ maxWidth: 500 }} + InputProps={{ + startAdornment: ( + + + + + + ), }} /> {sortBySelect}