@@ -67,14 +67,15 @@ const Keyword = ({
6767
6868 const house = dewan ? String ( dewan ) : "" ;
6969 const start =
70- tarikh_mula !== undefined && ! Array . isArray ( tarikh_mula )
70+ tarikh_mula && ! Array . isArray ( tarikh_mula )
7171 ? parseISO ( tarikh_mula )
7272 : undefined ;
7373 const end =
74- tarikh_akhir !== undefined && ! Array . isArray ( tarikh_akhir )
74+ tarikh_akhir && ! Array . isArray ( tarikh_akhir )
7575 ? parseISO ( tarikh_akhir )
7676 : undefined ;
77- const diff = start && end ? differenceInCalendarDays ( start , end ) : 0 ;
77+ const diff =
78+ start && end ? Math . abs ( differenceInCalendarDays ( start , end ) ) : 0 ;
7879
7980 const [ loading , setLoading ] = useState < boolean > ( false ) ;
8081 const [ range , setRange ] = useState < number [ ] > ( [ 0 , timeseries . date . length - 1 ] ) ;
@@ -92,9 +93,9 @@ const Keyword = ({
9293 const data = response . data ;
9394
9495 // Check if the API returned a server error flag
95- if ( data . error && data . errorType === "server_error" ) {
96- router . push ( router . locale === "en-GB" ? "/en-GB/500" : "/500" ) ;
97- return ;
96+ if ( data ? .error && data ? .errorType === "server_error" ) {
97+ await router . push ( router . locale === "en-GB" ? "/en-GB/500" : "/500" ) ;
98+ return null ;
9899 }
99100
100101 return data ;
@@ -104,17 +105,26 @@ const Keyword = ({
104105 }
105106 } ;
106107
107- const barmeter_data = top_speakers
108- ? top_speakers . map ( s => {
108+ const barmeter_data = useMemo ( ( ) => {
109+ if ( ! top_speakers ) return [ ] ;
110+
111+ return top_speakers
112+ . map ( s => {
109113 const id = Object . keys ( s ) [ 0 ] ;
110- const speaker = speakers . find (
111- e => String ( e . new_author_id ) === id
112- ) ?. name ;
113- const total = s [ id ] ;
114+ const speaker = speakers . find ( e => String ( e . new_author_id ) === id ) ;
115+
116+ if ( ! speaker ?. name ) return null ;
117+
118+ const rawValue = Number ( s [ id ] ) ;
119+ const safeValue = Number . isFinite ( rawValue ) ? rawValue : 0 ;
114120
115- return { x : speaker ?? "" , y : total } ;
121+ return {
122+ x : speaker . name ,
123+ y : safeValue ,
124+ } ;
116125 } )
117- : [ ] ;
126+ . filter ( ( item ) : item is { x : string ; y : number } => item !== null ) ;
127+ } , [ top_speakers , speakers ] ) ;
118128
119129 useEffect ( ( ) => {
120130 setLoading ( false ) ;
@@ -125,32 +135,29 @@ const Keyword = ({
125135 } , [ timeseries ] ) ;
126136
127137 useEffect ( ( ) => {
138+ if ( ! keywordQuery ) {
139+ setSuggestion ( "" ) ;
140+ return ;
141+ }
142+
128143 const fetchSuggestion = async ( ) => {
129- if ( keywordQuery . length > 0 ) {
130- try {
131- const result = await getAutocomplete ( keywordQuery ) ;
144+ try {
145+ const result = await getAutocomplete ( keywordQuery ) ;
132146
133- // If result is undefined, it means we redirected to 500 page
134- if ( ! result ) return ;
147+ // If result is undefined, it means we redirected to 500 page
148+ if ( ! result ) return ;
135149
136- if ( result . suggestions && result . suggestions . length > 0 ) {
137- setSuggestion ( result . suggestions [ 0 ] ) ;
138- } else {
139- setSuggestion ( "" ) ;
140- }
141- } catch ( error ) {
142- console . error ( "Error fetching autocomplete:" , error ) ;
143- setSuggestion ( "" ) ;
144- }
145- } else {
150+ setSuggestion ( result . suggestions ?. [ 0 ] ?? "" ) ;
151+ } catch ( error ) {
152+ console . error ( "Error fetching autocomplete:" , error ) ;
146153 setSuggestion ( "" ) ;
147154 }
148155 } ;
149156
150157 const debounceTimeout = setTimeout ( fetchSuggestion , 200 ) ;
151158
152159 return ( ) => clearTimeout ( debounceTimeout ) ;
153- } , [ keywordQuery , router ] ) ;
160+ } , [ keywordQuery ] ) ;
154161
155162 return (
156163 < Container className = "divide-y divide-border" >
0 commit comments