@@ -7,17 +7,43 @@ import {
77import { useAtomValue } from "jotai" ;
88import { twMerge } from "tailwind-merge" ;
99
10+ const formatError = (
11+ errors : ( string | Error ) [ ] ,
12+ label ?: string
13+ ) : JSX . Element => {
14+ if ( ! errors . length ) {
15+ return < > </ > ;
16+ }
17+
18+ return (
19+ < div >
20+ { label && < div > { label } :</ div > }
21+ { errors . map ( ( e ) => {
22+ const string = e instanceof Error ? e . message : String ( e ) ;
23+ return < div key = { string } > { string } </ div > ;
24+ } ) }
25+ </ div >
26+ ) ;
27+ } ;
28+
1029export const SyncIndicator = ( ) : JSX . Element => {
1130 const syncStatus = useAtomValue ( syncStatusAtom ) ;
1231 const indexerServicesSyncStatus = useAtomValue ( indexerServicesSyncStatusAtom ) ;
1332 const chainStatus = useAtomValue ( chainStatusAtom ) ;
1433
15- const isError = syncStatus . isError || indexerServicesSyncStatus . isError ;
16- const isSyncing = syncStatus . isSyncing || indexerServicesSyncStatus . isSyncing ;
34+ const { errors } = syncStatus ;
1735 const { services } = indexerServicesSyncStatus ;
36+ const isChainStatusError = ! chainStatus ?. height || ! chainStatus ?. epoch ;
37+
38+ const isError =
39+ syncStatus . isError ||
40+ indexerServicesSyncStatus . isError ||
41+ isChainStatusError ;
42+
43+ const isSyncing = syncStatus . isSyncing || indexerServicesSyncStatus . isSyncing ;
1844
1945 return (
20- < div className = "relative group/tooltip p-1 " >
46+ < div className = "relative group/tooltip px-1 py-3 " >
2147 < div
2248 className = { twMerge (
2349 "w-2 h-2 rounded-full" ,
@@ -26,12 +52,23 @@ export const SyncIndicator = (): JSX.Element => {
2652 isError && ! isSyncing && "bg-red-500"
2753 ) }
2854 />
29- < Tooltip className = "whitespace-nowrap" >
55+ < Tooltip
56+ position = "bottom"
57+ className = "z-10 w-max max-w-[200px] text-balance"
58+ >
3059 { isSyncing ?
3160 "Syncing"
3261 : isError ?
33- `Error syncing ${ services . length ? `. Lagging services: ${ services . join ( ", " ) } .` : "" } `
34- : `Fully synced: height ${ chainStatus ?. height } , epoch ${ chainStatus ?. epoch } `
62+ < div >
63+ { formatError ( errors , "Error" ) }
64+ { formatError ( services , "Lagging services" ) }
65+ { isChainStatusError && "Chain status not loaded." }
66+ </ div >
67+ : < div >
68+ < div > Fully synced:</ div >
69+ < div > Height:{ chainStatus ?. height } </ div >
70+ < div > Epoch:{ chainStatus ?. epoch } </ div >
71+ </ div >
3572 }
3673 </ Tooltip >
3774 </ div >
0 commit comments