@@ -36,8 +36,12 @@ const MAX_FREE_REPOS = 3
3636// Extract error message from API response (handles nested detail objects)
3737function extractErrorMessage ( err : any , fallback : string ) : string {
3838 if ( typeof err ?. detail === 'string' ) return err . detail
39- if ( err ?. detail ?. message ) return err . detail . message
40- if ( err ?. message ) return err . message
39+ if ( typeof err ?. detail ?. message === 'string' ) return err . detail . message
40+ if ( typeof err ?. message === 'string' ) return err . message
41+ // Last resort: try to stringify if it's an object
42+ if ( err ?. detail && typeof err . detail === 'object' ) {
43+ return JSON . stringify ( err . detail )
44+ }
4145 return fallback
4246}
4347
@@ -47,6 +51,14 @@ function isUpgradeError(err: any): boolean {
4751 return [ 'REPO_TOO_LARGE' , 'REPO_LIMIT_REACHED' ] . includes ( code )
4852}
4953
54+ // Show upgrade toast with waitlist CTA (DRY helper for 4 call sites)
55+ function showUpgradeToast ( err : any , fallback : string , onJoin : ( ) => void ) {
56+ toast . error ( extractErrorMessage ( err , fallback ) , {
57+ description : 'Join the Pro waitlist for higher limits' ,
58+ action : { label : 'Join Waitlist' , onClick : onJoin }
59+ } )
60+ }
61+
5062type RepoTab = 'overview' | 'search' | 'dependencies' | 'insights' | 'impact'
5163
5264export function DashboardHome ( ) {
@@ -115,10 +127,7 @@ export function DashboardHome() {
115127 if ( ! response . ok ) {
116128 const err = await response . json ( ) . catch ( ( ) => ( { } ) )
117129 if ( isUpgradeError ( err ) ) {
118- toast . error ( extractErrorMessage ( err , 'Repository too large' ) , {
119- description : 'Join the Pro waitlist for higher limits' ,
120- action : { label : 'Join Waitlist' , onClick : ( ) => setShowUpgradeModal ( true ) }
121- } )
130+ showUpgradeToast ( err , 'Repository too large' , ( ) => setShowUpgradeModal ( true ) )
122131 return
123132 }
124133 throw new Error ( extractErrorMessage ( err , 'Failed to add repository' ) )
@@ -136,10 +145,7 @@ export function DashboardHome() {
136145 if ( ! indexResponse . ok ) {
137146 const err = await indexResponse . json ( ) . catch ( ( ) => ( { } ) )
138147 if ( isUpgradeError ( err ) ) {
139- toast . error ( extractErrorMessage ( err , 'Repository too large' ) , {
140- description : 'Join the Pro waitlist for higher limits' ,
141- action : { label : 'Join Waitlist' , onClick : ( ) => setShowUpgradeModal ( true ) }
142- } )
148+ showUpgradeToast ( err , 'Repository too large' , ( ) => setShowUpgradeModal ( true ) )
143149 return
144150 }
145151 throw new Error ( extractErrorMessage ( err , 'Failed to start indexing' ) )
@@ -183,10 +189,7 @@ export function DashboardHome() {
183189 if ( ! response . ok ) {
184190 const err = await response . json ( ) . catch ( ( ) => ( { } ) )
185191 if ( isUpgradeError ( err ) ) {
186- toast . error ( extractErrorMessage ( err , `${ repo . name } too large` ) , {
187- description : 'Join the Pro waitlist for higher limits' ,
188- action : { label : 'Join Waitlist' , onClick : ( ) => setShowUpgradeModal ( true ) }
189- } )
192+ showUpgradeToast ( err , `${ repo . name } too large` , ( ) => setShowUpgradeModal ( true ) )
190193 continue
191194 }
192195 throw new Error ( extractErrorMessage ( err , `Failed to add ${ repo . name } ` ) )
@@ -204,10 +207,7 @@ export function DashboardHome() {
204207 if ( ! indexResponse . ok ) {
205208 const err = await indexResponse . json ( ) . catch ( ( ) => ( { } ) )
206209 if ( isUpgradeError ( err ) ) {
207- toast . error ( extractErrorMessage ( err , `${ repo . name } too large` ) , {
208- description : 'Join the Pro waitlist for higher limits' ,
209- action : { label : 'Join Waitlist' , onClick : ( ) => setShowUpgradeModal ( true ) }
210- } )
210+ showUpgradeToast ( err , `${ repo . name } too large` , ( ) => setShowUpgradeModal ( true ) )
211211 continue
212212 }
213213 const errMsg = extractErrorMessage ( err , 'Indexing failed to start' )
0 commit comments