11import React from "react" ;
2- import cn from "classnames " ;
3- import { Skeleton , Empty , Pagination } from "antd " ;
4- import { Repo , User , Org , Card } from "shared/components " ;
2+ import Toolbar from "./toolbar " ;
3+ import List from "./list " ;
4+ import Pagination from "./pagination " ;
55import { useSearch , PAGE_SIZE } from "./hooks" ;
66import { useSearchQuery } from "./queries.gen" ;
7- import SortSelect from "./sort-select" ;
8- import "./index.scss" ;
9-
10- // FIXME: decompose
117
128/**
139 * @feature Результаты поиска
@@ -28,65 +24,23 @@ const SearchResults = () => {
2824
2925 return (
3026 < div className = "search-results" >
31- < h2 className = "search-results__toolbar flex" >
32- < span className = "search-results__label flex-grow" >
33- { loading && (
34- < Skeleton
35- className = "search-results__label-placeholder"
36- paragraph = { false }
37- active
38- />
39- ) }
40- { ! loading && (
41- < >
42- { count } results by < b > { searchConfig . queryClean } </ b > :
43- </ >
44- ) }
45- </ span >
46- < SortSelect className = "search-results__sort-select ml-4" />
47- </ h2 >
48- < div className = "search-results__list" >
49- { loading && < Card . SkeletonGroup amount = { PAGE_SIZE } /> }
50- { data ?. search . nodes ?. map ( ( node ) => (
51- < ResultItem key = { node ?. id } className = { ( node as any ) . __typename } >
52- { isRepoSearch && < Repo data = { node } format = "owner-repo" /> }
53- { /* !!! FIXME: simplify */ }
54- { isUserSearch &&
55- ( ( node as any ) ?. __typename === "Organization" ? (
56- < Org data = { node } />
57- ) : (
58- < User data = { node } />
59- ) ) }
60- </ ResultItem >
61- ) ) }
62- { isEmpty && < Empty className = "p-8" description = "No results found" /> }
63- </ div >
64- < div className = "search-results__pagination text-center mt-6" >
65- { count > PAGE_SIZE && (
66- < Pagination
67- current = { page }
68- /**
69- * Отображаем минимальное
70- * - либо по кол-ву результатов,
71- * - либо с ограничением в 100 страниц
72- * (как на github)
73- * @remark Да и их API не возвращает результаты после 1000
74- */
75- total = { Math . min ( count , 100 * PAGE_SIZE ) }
76- onChange = { handlePageChange }
77- pageSize = { PAGE_SIZE }
78- showSizeChanger = { false }
79- showQuickJumper
80- responsive
81- />
82- ) }
83- </ div >
27+ < Toolbar count = { count } loading = { loading } queryClean = { searchConfig . queryClean } />
28+ < List
29+ nodes = { data ?. search . nodes }
30+ loading = { loading }
31+ isEmpty = { isEmpty }
32+ isRepoSearch = { isRepoSearch }
33+ isUserSearch = { isUserSearch }
34+ pageSize = { PAGE_SIZE }
35+ />
36+ < Pagination
37+ count = { count }
38+ handlePageChange = { handlePageChange }
39+ page = { page }
40+ pageSize = { PAGE_SIZE }
41+ />
8442 </ div >
8543 ) ;
8644} ;
8745
88- const ResultItem = ( { children, className } : PropsWithChildren & PropsWithClassName ) => (
89- < div className = { cn ( "search-results__item" , "mb-6" , className ) } > { children } </ div >
90- ) ;
91-
9246export default SearchResults ;
0 commit comments