11import React , { useState } from "react" ;
2- import { ReactComponent as GitStatsLogo } from '../Images/logo.svg' ;
2+ import { ReactComponent as GitStatsLogo } from '../Images/logo.svg' ;
33import DataProvider from "../Data-provider/index"
44import ScrollToBottom from 'react-scroll-to-bottom' ;
55import Loader from '../Components/Extras/Loader'
6- import { DebounceInput } from 'react-debounce-input' ;
6+ import { DebounceInput } from 'react-debounce-input' ;
77
88function Header ( ) {
99 let [ dayStatus , setTheme ] = useState ( true ) ;
1010 let [ imageUrl , setImageUrl ] = useState ( "img/sun.png" ) ;
1111 let [ searchUsers , setSearchUsers ] = useState ( ) ;
12- const [ searchString , setSearchString ] = useState ( )
1312 let body = document . querySelector ( "body" ) ;
1413
1514 function changeTheme ( ) {
@@ -23,87 +22,91 @@ function Header() {
2322 setTheme ( ! dayStatus ) ;
2423 } ;
2524
26- function openSearch ( ) {
27- let search = document . querySelector ( '.search-wrapper' ) ;
28- if ( search . classList . contains ( 'open' ) ) {
29- search . classList . remove ( 'open' )
30- }
31- else {
32- search . classList . add ( 'open' )
33- }
34-
25+ function openSearch ( ) {
26+ let search = document . querySelector ( '.search-wrapper' ) ;
27+ if ( search . classList . contains ( 'open' ) ) {
28+ search . classList . remove ( 'open' )
29+ }
30+ else {
31+ search . classList . add ( 'open' )
32+ // focus search bar when clicked too
33+ document . getElementById ( "search_bar" ) . focus ( )
34+ }
3535 }
3636
37- async function search ( event ) {
38- setSearchString ( event . target . value )
39- let result = await DataProvider . getSearchUsers ( event . target . value ) ;
40- let users = result && result . map ( user =>
41- < li > < a href = { `/${ user . login } ` } > < img src = { user . avatar_url } /> { user . login } </ a > </ li >
42- ) ;
43- setSearchUsers ( users ) ;
37+ // To-Do
38+ // #1\ when search bar looses focus hide the search results
39+ // #2\ search bar present in left most side in desktop version // move to right
40+ // #3\ the weird sliding of search results when seach input goes out of focus // will be fixed by #1
41+ // #4\ on initial load it show "no user found" until the api call completes // instead show loading
42+ // #5\ make a landing page with search feature
43+ // #6\ proper linking of listed repos and emails and git usernames
44+ // #7\ add few more detailed graphs (active on x week day) (contribution to projects other then own)
45+ // 8#\ simplify cacluation code. (I'll fix it.)
46+ // 9#\ handle the case if our api server is down 404,500 errors
47+
48+
49+ async function search ( event ) {
50+ let result = await DataProvider . getSearchUsers ( event . target . value ) ;
51+ let users = result && result . map ( user =>
52+ < li key = { user . login } > < a href = { `/${ user . login } ` } > < img src = { user . avatar_url } alt = { user . login } /> { user . login } </ a > </ li >
53+ ) ;
54+ setSearchUsers ( users ) ;
4455 }
4556
4657 return (
47- < header >
48- < div className = "container" >
49- < nav className = "navbar navbar-expand-lg" >
50- < a className = "navbar-brand text-white logo" href = "#" >
51- < GitStatsLogo height = { 30 } />
52- { /* <img src={process.env.PUBLIC_URL + "/cat-logo.png"} alt="" /> */ }
53- </ a >
54- < button
55- className = "navbar-toggler"
56- type = "button"
57- data-toggle = "collapse"
58- data-target = "#navbarNavDropdown"
59- aria-controls = "navbarNavDropdown"
60- aria-expanded = "false"
61- aria-label = "Toggle navigation"
62- >
63- < span className = "navbar-toggler-icon" > </ span >
64- </ button >
65- < div className = " navbar-collapse" id = "navbarNavDropdown" >
66- < button onClick = { openSearch } className = "search_icon" > { Loader . search_icon } </ button >
67- < ul className = "navbar-nav ml-auto" >
68- < li className = "nav-item active active nav-item position-relative search-wrapper" >
69- < a className = "nav-link text-light-gray" >
70- < DebounceInput
71- minLength = { 2 }
72- debounceTimeout = { 500 }
73- className = "search"
74- placeholder = "Search..."
75- onChange = { search }
76- />
77- </ a >
78- { searchUsers && (
79- < div className = "Search-result" >
80- < ul className = "search-result" >
81- < ScrollToBottom >
82- { searchUsers . length > 0
83- ? searchUsers
84- : Loader . user_not_found }
85- </ ScrollToBottom >
86- </ ul >
58+ < header >
59+ < div className = "container" >
60+ < nav className = "navbar navbar-expand-lg" >
61+ < a className = "navbar-brand text-white logo" >
62+ < GitStatsLogo height = { 30 } />
63+ { /* <img src={process.env.PUBLIC_URL + "/cat-logo.png"} alt="" /> */ }
64+ </ a >
65+ < div className = "" id = "navbarNavDropdown" >
66+ < button onClick = { openSearch } className = "search_icon" > { Loader . search_icon } </ button >
67+ < ul className = "navbar-nav ml-auto" >
68+ < li className = "nav-item active active nav-item position-relative search-wrapper" >
69+ < a className = "nav-link text-light-gray" >
70+ < DebounceInput
71+ minLength = { 2 }
72+ debounceTimeout = { 500 }
73+ className = "search"
74+ placeholder = "Search..."
75+ onChange = { search }
76+ id = "search_bar"
77+ />
78+ </ a >
79+ { searchUsers && (
80+ < div className = "Search-result" >
81+ < ul className = "search-result" >
82+ { /*No Need to scroll to bottom */ }
83+ { /* best match is always at top */ }
84+ { /* <ScrollToBottom> */ }
85+ { searchUsers . length > 0
86+ ? searchUsers
87+ : Loader . user_not_found }
88+ { /* </ScrollToBottom> */ }
89+ </ ul >
90+ </ div >
91+ ) }
92+ </ li >
93+ < li className = "mobile-theme" >
94+ < div className = "change-theme mt-2 font-size-13" >
95+ < button onClick = { changeTheme } >
96+ < img
97+ className = "mr-1"
98+ src = { process . env . PUBLIC_URL + imageUrl }
99+ alt = ""
100+ />
101+ < span className = "d-none d-lg-inline-block d-sm-inline-block" > { dayStatus ? "Night Mode" : "Day Mode" } </ span >
102+ </ button >
103+ </ div >
104+ </ li >
105+ </ ul >
87106 </ div >
88- ) }
89- </ li >
90- < li className = "mobile-theme" >
91- < div className = "change-theme mt-2 font-size-13" >
92- < button onClick = { changeTheme } >
93- < img
94- className = "mr-1"
95- src = { process . env . PUBLIC_URL + imageUrl }
96- alt = ""
97- />
98- < span className = "d-none d-lg-inline-block d-sm-inline-block" > { dayStatus ? "Night Mode" : "Day Mode" } </ span >
99- </ button >
100- </ div >
101- </ li >
102- </ ul >
107+ </ nav >
103108 </ div >
104- </ nav >
105- </ div >
106- </ header >
109+ </ header >
107110 ) ;
108111} ;
109112
0 commit comments