Skip to content

Commit 34394cc

Browse files
committed
make it faster
1 parent bf28433 commit 34394cc

File tree

3 files changed

+18
-26
lines changed

3 files changed

+18
-26
lines changed

web/app/search/page.tsx

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,23 +1,25 @@
11
"use client";
22

33
import type React from "react";
4+
import { useState } from "react";
45
import Search from "~/components/search/search";
56
import Table from "~/components/search/table";
67

7-
export default function SearchPage(props: {
8+
export default function SearchPage({
9+
searchParams,
10+
}: {
811
searchParams?: {
912
query?: string;
1013
page?: string;
1114
};
1215
}) {
13-
const searchParams = props.searchParams;
14-
const query = searchParams?.query || "";
16+
const [query, setQuery] = useState<string>(searchParams?.query ?? "");
1517

1618
return (
1719
<div className="flex min-h-screen justify-center ">
1820
<div className="w-full">
1921
<h2 className="m-5 mb-4 font-bold text-2xl">ユーザー検索</h2>
20-
<Search placeholder="検索" />
22+
<Search placeholder="検索" setSearchString={setQuery} />
2123
<Table query={query} />
2224
</div>
2325
</div>

web/components/search/search.tsx

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,23 @@
11
"use client";
22

3-
import { usePathname, useRouter, useSearchParams } from "next/navigation";
3+
import { usePathname, useSearchParams } from "next/navigation";
44
import { MdOutlineSearch } from "react-icons/md";
55

6-
export default function Search({ placeholder }: { placeholder: string }) {
6+
type Props = { placeholder: string; setSearchString: (s: string) => void };
7+
export default function Search({ placeholder, setSearchString }: Props) {
78
const searchParams = useSearchParams();
89
const pathname = usePathname();
9-
const { replace } = useRouter();
1010

1111
function handleSearch(term: string) {
12+
setSearchString(term);
1213
const params = new URLSearchParams(searchParams);
1314
if (term) {
1415
params.set("query", term);
1516
} else {
1617
params.delete("query");
1718
}
18-
replace(`${pathname}?${params.toString()}`);
19+
const newUrl = `${pathname}?${params.toString()}`;
20+
history.replaceState(undefined, "", newUrl);
1921
}
2022

2123
return (

web/components/search/table.tsx

Lines changed: 6 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
"use client";
2-
import type { User } from "common/types";
3-
import { useEffect, useMemo, useState } from "react";
2+
import { useMemo } from "react";
43
import { useAll, useMyID } from "~/api/user";
54
import { useModal } from "../common/modal/ModalProvider";
65
import { HumanListItem } from "../human/humanListItem";
@@ -11,27 +10,16 @@ export default function UserTable({ query }: { query: string }) {
1110
state: { data },
1211
} = useAll();
1312
const { state } = useMyID();
14-
const [users, setUsers] = useState<User[] | null>(null);
15-
16-
const filteredData = useMemo(() => {
13+
const initialData = useMemo(() => {
1714
return (
1815
data?.filter((item) => item.id !== state.data && item.id !== 0) ?? null
1916
);
2017
}, [data, state.data]);
21-
22-
useEffect(() => {
23-
function searchByUserName(query: string) {
24-
const filteredUsers = filteredData?.filter((user) =>
18+
const users = query
19+
? initialData?.filter((user) =>
2520
user.name.toLowerCase().includes(query.toLowerCase()),
26-
);
27-
setUsers(filteredUsers || null);
28-
}
29-
if (!query) {
30-
setUsers(filteredData);
31-
} else {
32-
searchByUserName(query);
33-
}
34-
}, [query, filteredData]);
21+
)
22+
: initialData;
3523

3624
return (
3725
<div>

0 commit comments

Comments
 (0)