11"use client" ;
22
33import type React from "react" ;
4- import { useState } from "react" ;
4+ import { useMemo , useState } from "react" ;
5+ import { useAll , useMatched , useMyID , usePendingFromMe } from "~/api/user" ;
6+ import FullScreenCircularProgress from "~/components/common/FullScreenCircularProgress" ;
57import Search from "~/components/search/search" ;
68import Table from "~/components/search/table" ;
79
@@ -15,12 +17,58 @@ export default function SearchPage({
1517} ) {
1618 const [ query , setQuery ] = useState < string > ( searchParams ?. query ?? "" ) ;
1719
20+ const {
21+ state : { data } ,
22+ } = useAll ( ) ;
23+ const {
24+ state : { data : myId } ,
25+ } = useMyID ( ) ;
26+ const initialData = useMemo ( ( ) => {
27+ return data ?. filter ( ( item ) => item . id !== myId && item . id !== 0 ) ?? null ;
28+ } , [ data , myId ] ) ;
29+ const users = query
30+ ? initialData ?. filter ( ( user ) =>
31+ user . name . toLowerCase ( ) . includes ( query . toLowerCase ( ) ) ,
32+ )
33+ : initialData ;
34+
35+ const {
36+ state : { data : matches } ,
37+ } = useMatched ( ) ;
38+
39+ const {
40+ state : { data : pending } ,
41+ } = usePendingFromMe ( ) ;
42+
43+ // リクエストを送ってない人のみリクエスト送信可能
44+ // FIXME: O(n^2) | n = count(users) なのでめっちゃ計算コストかかる。なんとかして。
45+ const canRequest = ( userId : number ) =>
46+ ! matches ?. some ( ( match ) => match . id === userId ) &&
47+ ! pending ?. some ( ( pending ) => pending . id === userId ) ;
48+
49+ const [ searchQuery__interest , setSearchQuery__interest ] = useState <
50+ string | null
51+ > ( null ) ;
52+ setSearchQuery__interest ; // TODO: use this in some UI
53+
54+ const filteredUsers = users
55+ // this is O(count(users) * count(avg(count(interests))) * count(avg(len(interests.name)))). very bad.
56+ ?. filter (
57+ ( u ) =>
58+ searchQuery__interest === null ||
59+ u . interestSubjects . some ( ( i ) => i . name . includes ( searchQuery__interest ) ) ,
60+ ) ;
61+
1862 return (
1963 < div className = "flex min-h-screen justify-center " >
2064 < div className = "w-full" >
2165 < h2 className = "m-5 mb-4 font-bold text-2xl" > ユーザー検索</ h2 >
2266 < Search placeholder = "検索" setSearchString = { setQuery } />
23- < Table query = { query } />
67+ { filteredUsers ? (
68+ < Table users = { filteredUsers } canRequest = { canRequest } />
69+ ) : (
70+ < FullScreenCircularProgress />
71+ ) }
2472 </ div >
2573 </ div >
2674 ) ;
0 commit comments