@@ -50,9 +50,8 @@ export function InviteModal({ open, onOpenChange, workspaceName }: InviteModalPr
5050 > ( { } )
5151 const [ isSubmitting , setIsSubmitting ] = useState ( false )
5252 const [ isSaving , setIsSaving ] = useState ( false )
53- const [ showSent , setShowSent ] = useState ( false )
53+ const cooldownIntervalsRef = useRef < Map < string , NodeJS . Timeout > > ( new Map ( ) )
5454 const [ errorMessage , setErrorMessage ] = useState < string | null > ( null )
55- const [ successMessage , setSuccessMessage ] = useState < string | null > ( null )
5655 const [ memberToRemove , setMemberToRemove ] = useState < { userId : string ; email : string } | null > (
5756 null
5857 )
@@ -121,10 +120,17 @@ export function InviteModal({ open, onOpenChange, workspaceName }: InviteModalPr
121120 useEffect ( ( ) => {
122121 if ( open ) {
123122 setErrorMessage ( null )
124- setSuccessMessage ( null )
125123 }
126124 } , [ open ] )
127125
126+ useEffect ( ( ) => {
127+ const intervalsRef = cooldownIntervalsRef . current
128+ return ( ) => {
129+ intervalsRef . forEach ( ( interval ) => clearInterval ( interval ) )
130+ intervalsRef . clear ( )
131+ }
132+ } , [ ] )
133+
128134 const addEmail = useCallback (
129135 ( email : string ) => {
130136 if ( ! email . trim ( ) ) return false
@@ -255,11 +261,6 @@ export function InviteModal({ open, onOpenChange, workspaceName }: InviteModalPr
255261 }
256262
257263 setExistingUserPermissionChanges ( { } )
258-
259- setSuccessMessage (
260- `Permission changes saved for ${ updates . length } user${ updates . length !== 1 ? 's' : '' } !`
261- )
262- setTimeout ( ( ) => setSuccessMessage ( null ) , 3000 )
263264 } catch ( error ) {
264265 logger . error ( 'Error saving permission changes:' , error )
265266 const errorMsg =
@@ -282,9 +283,6 @@ export function InviteModal({ open, onOpenChange, workspaceName }: InviteModalPr
282283 if ( ! userPerms . canAdmin || ! hasPendingChanges ) return
283284
284285 setExistingUserPermissionChanges ( { } )
285- setSuccessMessage ( 'Changes restored to original permissions!' )
286-
287- setTimeout ( ( ) => setSuccessMessage ( null ) , 3000 )
288286 } , [ userPerms . canAdmin , hasPendingChanges ] )
289287
290288 const handleRemoveMemberClick = useCallback ( ( userId : string , email : string ) => {
@@ -337,9 +335,6 @@ export function InviteModal({ open, onOpenChange, workspaceName }: InviteModalPr
337335 delete updated [ memberToRemove . userId ]
338336 return updated
339337 } )
340-
341- setSuccessMessage ( `${ memberToRemove . email } has been removed from the workspace` )
342- setTimeout ( ( ) => setSuccessMessage ( null ) , 3000 )
343338 } catch ( error ) {
344339 logger . error ( 'Error removing member:' , error )
345340 const errorMsg =
@@ -385,9 +380,6 @@ export function InviteModal({ open, onOpenChange, workspaceName }: InviteModalPr
385380 setPendingInvitations ( ( prev ) =>
386381 prev . filter ( ( inv ) => inv . invitationId !== invitationToRemove . invitationId )
387382 )
388-
389- setSuccessMessage ( `Invitation for ${ invitationToRemove . email } has been cancelled` )
390- setTimeout ( ( ) => setSuccessMessage ( null ) , 3000 )
391383 } catch ( error ) {
392384 logger . error ( 'Error cancelling invitation:' , error )
393385 const errorMsg =
@@ -427,9 +419,6 @@ export function InviteModal({ open, onOpenChange, workspaceName }: InviteModalPr
427419 throw new Error ( data . error || 'Failed to resend invitation' )
428420 }
429421
430- setSuccessMessage ( `Invitation resent to ${ email } ` )
431- setTimeout ( ( ) => setSuccessMessage ( null ) , 3000 )
432-
433422 setResentInvitationIds ( ( prev ) => ( { ...prev , [ invitationId ] : true } ) )
434423 setTimeout ( ( ) => {
435424 setResentInvitationIds ( ( prev ) => {
@@ -450,6 +439,12 @@ export function InviteModal({ open, onOpenChange, workspaceName }: InviteModalPr
450439 return next
451440 } )
452441 setResendCooldowns ( ( prev ) => ( { ...prev , [ invitationId ] : 60 } ) )
442+
443+ const existingInterval = cooldownIntervalsRef . current . get ( invitationId )
444+ if ( existingInterval ) {
445+ clearInterval ( existingInterval )
446+ }
447+
453448 const interval = setInterval ( ( ) => {
454449 setResendCooldowns ( ( prev ) => {
455450 const current = prev [ invitationId ]
@@ -458,11 +453,14 @@ export function InviteModal({ open, onOpenChange, workspaceName }: InviteModalPr
458453 const next = { ...prev }
459454 delete next [ invitationId ]
460455 clearInterval ( interval )
456+ cooldownIntervalsRef . current . delete ( invitationId )
461457 return next
462458 }
463459 return { ...prev , [ invitationId ] : current - 1 }
464460 } )
465461 } , 1000 )
462+
463+ cooldownIntervalsRef . current . set ( invitationId , interval )
466464 }
467465 } ,
468466 [ workspaceId , userPerms . canAdmin , resendCooldowns ]
@@ -473,7 +471,6 @@ export function InviteModal({ open, onOpenChange, workspaceName }: InviteModalPr
473471 e . preventDefault ( )
474472
475473 setErrorMessage ( null )
476- setSuccessMessage ( null )
477474
478475 if ( validEmails . length === 0 || ! workspaceId ) {
479476 return
@@ -562,11 +559,6 @@ export function InviteModal({ open, onOpenChange, workspaceName }: InviteModalPr
562559 setEmailItems ( [ ] )
563560 setUserPermissions ( [ ] )
564561 }
565- setShowSent ( true )
566-
567- setTimeout ( ( ) => {
568- setShowSent ( false )
569- } , 4000 )
570562 }
571563 } catch ( err ) {
572564 logger . error ( 'Error inviting members:' , err )
@@ -588,13 +580,16 @@ export function InviteModal({ open, onOpenChange, workspaceName }: InviteModalPr
588580 setExistingUserPermissionChanges ( { } )
589581 setIsSubmitting ( false )
590582 setIsSaving ( false )
591- setShowSent ( false )
592583 setErrorMessage ( null )
593- setSuccessMessage ( null )
594584 setMemberToRemove ( null )
595585 setIsRemovingMember ( false )
596586 setInvitationToRemove ( null )
597587 setIsRemovingInvitation ( false )
588+ setResendCooldowns ( { } )
589+ setResentInvitationIds ( { } )
590+
591+ cooldownIntervalsRef . current . forEach ( ( interval ) => clearInterval ( interval ) )
592+ cooldownIntervalsRef . current . clear ( )
598593 } , [ ] )
599594
600595 return (
@@ -703,7 +698,6 @@ export function InviteModal({ open, onOpenChange, workspaceName }: InviteModalPr
703698 variant = 'default'
704699 disabled = { isSaving || isSubmitting }
705700 onClick = { handleRestoreChanges }
706- className = 'h-[32px] gap-[8px] px-[12px] font-medium'
707701 >
708702 Restore Changes
709703 </ Button >
@@ -712,7 +706,6 @@ export function InviteModal({ open, onOpenChange, workspaceName }: InviteModalPr
712706 variant = 'tertiary'
713707 disabled = { isSaving || isSubmitting }
714708 onClick = { handleSaveChanges }
715- className = 'h-[32px] gap-[8px] px-[12px] font-medium'
716709 >
717710 { isSaving ? 'Saving...' : 'Save Changes' }
718711 </ Button >
0 commit comments