@@ -161,6 +161,7 @@ export default function SettingsPage() {
161161 // Save indicator
162162 const [ showSaved , setShowSaved ] = createSignal ( false ) ;
163163 let saveTimer : ReturnType < typeof setTimeout > | undefined ;
164+ let pendingFocusHandler : ( ( ) => void ) | undefined ;
164165
165166 function saveWithFeedback ( patch : Parameters < typeof updateConfig > [ 0 ] ) {
166167 updateConfig ( patch ) ;
@@ -169,7 +170,12 @@ export default function SettingsPage() {
169170 saveTimer = setTimeout ( ( ) => setShowSaved ( false ) , 1500 ) ;
170171 }
171172
172- onCleanup ( ( ) => clearTimeout ( saveTimer ) ) ;
173+ onCleanup ( ( ) => {
174+ clearTimeout ( saveTimer ) ;
175+ if ( pendingFocusHandler ) {
176+ window . removeEventListener ( "focus" , pendingFocusHandler ) ;
177+ }
178+ } ) ;
173179
174180 // Local copies for org/repo editing (committed on blur/change)
175181 const [ localOrgs , setLocalOrgs ] = createSignal < string [ ] > ( config . selectedOrgs ) ;
@@ -222,13 +228,17 @@ export default function SettingsPage() {
222228
223229 function handleGrantOrgs ( ) {
224230 window . open ( buildOrgAccessUrl ( ) , "_blank" , "noopener" ) ;
225- // Auto-merge newly accessible orgs when user returns from GitHub settings
231+ // Remove any prior focus listener before adding a new one (dedup on rapid clicks)
232+ if ( pendingFocusHandler ) {
233+ window . removeEventListener ( "focus" , pendingFocusHandler ) ;
234+ }
226235 const onFocus = ( ) => {
227236 window . removeEventListener ( "focus" , onFocus ) ;
237+ pendingFocusHandler = undefined ;
228238 void mergeNewOrgs ( ) ;
229239 } ;
240+ pendingFocusHandler = onFocus ;
230241 window . addEventListener ( "focus" , onFocus ) ;
231- onCleanup ( ( ) => window . removeEventListener ( "focus" , onFocus ) ) ;
232242 }
233243
234244 function handleOrgsChange ( orgs : string [ ] ) {
0 commit comments