@@ -15,11 +15,13 @@ interface StatusEntry {
1515const AdminPage = ( { language } : AdminPageProps ) => {
1616 const [ isUpdating , setIsUpdating ] = useState ( false )
1717 const [ isClearing , setIsClearing ] = useState ( false )
18+ const [ isRebuilding , setIsRebuilding ] = useState ( false )
1819 const [ message , setMessage ] = useState ( '' )
1920 const [ error , setError ] = useState ( '' )
2021 const [ latestStatus , setLatestStatus ] = useState < StatusEntry | null > ( null )
2122 const [ hasStartedUpdate , setHasStartedUpdate ] = useState ( false )
2223 const [ startYearInput , setStartYearInput ] = useState < string > ( '' )
24+ const [ hasStartedRebuild , setHasStartedRebuild ] = useState ( false )
2325 const intervalRef = useRef < NodeJS . Timeout | null > ( null )
2426 const [ defaultStartYear , setDefaultStartYear ] = useState < number | null > ( null )
2527
@@ -129,11 +131,41 @@ const AdminPage = ({ language }: AdminPageProps) => {
129131 }
130132 }
131133
134+ const handleRebuildTypesense = async ( ) => {
135+ setIsRebuilding ( true )
136+ setMessage ( '' )
137+ setError ( '' )
138+ setLatestStatus ( null )
139+ setHasStartedRebuild ( true )
140+
141+ try {
142+ const response = await axios . post ( '/api/rebuild-typesense' )
143+ setMessage ( language === 'fin'
144+ ? 'Typesense-indeksien uudelleenrakentaminen aloitettu!'
145+ : 'Typesense-indexombyggnad startad!'
146+ )
147+ console . log ( 'Rebuild response:' , response . data )
148+
149+ // Start polling for status updates
150+ startPolling ( )
151+
152+ } catch ( err ) {
153+ console . error ( 'Rebuild failed:' , err )
154+ setError ( language === 'fin'
155+ ? 'Indeksien uudelleenrakentaminen epäonnistui. Tarkista konsoli lisätiedoille.'
156+ : 'Ombyggnad av index misslyckades. Kontrollera konsolen för mer information.'
157+ )
158+ setIsRebuilding ( false )
159+ }
160+ }
161+
132162 // Stop polling and updating state when updating becomes false (only if we started an update)
133163 useEffect ( ( ) => {
134- if ( latestStatus && hasStartedUpdate && ! latestStatus . updating ) {
164+ if ( latestStatus && ( hasStartedUpdate || hasStartedRebuild ) && ! latestStatus . updating ) {
135165 setIsUpdating ( false )
166+ setIsRebuilding ( false )
136167 setHasStartedUpdate ( false )
168+ setHasStartedRebuild ( false )
137169 stopPolling ( )
138170
139171 // Check the action to determine success or failure
@@ -148,15 +180,25 @@ const AdminPage = ({ language }: AdminPageProps) => {
148180 ? 'Päivitys epäonnistui.'
149181 : 'Uppdatering misslyckades.'
150182 )
183+ } else if ( action === 'typesense_rebuild_complete' ) {
184+ setMessage ( language === 'fin'
185+ ? 'Indeksien uudelleenrakentaminen valmistui onnistuneesti!'
186+ : 'Ombyggnad av indexen slutfördes framgångsrikt!'
187+ )
188+ } else if ( action === 'typesense_rebuild_failed' ) {
189+ setError ( language === 'fin'
190+ ? 'Indeksien uudelleenrakentaminen epäonnistui.'
191+ : 'Ombyggnad av indexen misslyckades.'
192+ )
151193 } else {
152194 // Generic completion message if no specific action
153195 setMessage ( language === 'fin'
154- ? 'Päivitys valmistui!'
155- : 'Uppdatering slutförd !'
196+ ? 'Operaatio valmistui!'
197+ : 'Operationen slutfördes !'
156198 )
157199 }
158200 }
159- } , [ latestStatus , hasStartedUpdate , language ] )
201+ } , [ latestStatus , hasStartedUpdate , hasStartedRebuild , language ] )
160202
161203 const containerStyle : React . CSSProperties = {
162204 display : 'flex' ,
@@ -191,6 +233,18 @@ const AdminPage = ({ language }: AdminPageProps) => {
191233 margin : '0 10px 20px 10px'
192234 }
193235
236+ const rebuildButtonStyle : React . CSSProperties = {
237+ backgroundColor : '#FFA500' ,
238+ color : 'white' ,
239+ border : 'none' ,
240+ padding : '12px 24px' ,
241+ fontSize : '16px' ,
242+ borderRadius : '4px' ,
243+ cursor : ( isUpdating || isRebuilding ) ? 'not-allowed' : 'pointer' ,
244+ opacity : ( isUpdating || isRebuilding ) ? 0.6 : 1 ,
245+ margin : '0 10px 20px 10px'
246+ }
247+
194248 const messageStyle : React . CSSProperties = {
195249 padding : '10px' ,
196250 borderRadius : '4px' ,
@@ -248,7 +302,7 @@ const AdminPage = ({ language }: AdminPageProps) => {
248302
249303 < div style = { { marginTop : '50px' } } >
250304 < div style = { containerStyle } >
251- < h2 > { language === 'fin' ? 'Järjestelmän ylläpito' : 'Systemunderhåll' } </ h2 >
305+ < h2 > { language === 'fin' ? 'Järjestelmän jee ylläpito' : 'Systemunderhåll' } </ h2 >
252306
253307 < p style = { { textAlign : 'center' , marginBottom : '30px' , color : '#666' } } >
254308 { language === 'fin'
@@ -290,6 +344,17 @@ const AdminPage = ({ language }: AdminPageProps) => {
290344 : ( language === 'fin' ? 'Tyhjennä tilat' : 'Rensa status' )
291345 }
292346 </ button >
347+
348+ < button
349+ style = { rebuildButtonStyle }
350+ onClick = { handleRebuildTypesense }
351+ disabled = { isUpdating || isRebuilding }
352+ >
353+ { isRebuilding
354+ ? ( language === 'fin' ? 'Rakennetaan uudelleen...' : 'Bygger om...' )
355+ : ( language === 'fin' ? 'Uudelleen rakenna Typesense' : 'Bygga om Typesense' )
356+ }
357+ </ button >
293358 </ div >
294359
295360 { message && (
0 commit comments