@@ -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 )
@@ -118,6 +117,20 @@ export function InviteModal({ open, onOpenChange, workspaceName }: InviteModalPr
118117 }
119118 } , [ open , workspaceId , fetchPendingInvitations , refetchPermissions ] )
120119
120+ useEffect ( ( ) => {
121+ if ( open ) {
122+ setErrorMessage ( null )
123+ }
124+ } , [ open ] )
125+
126+ useEffect ( ( ) => {
127+ const intervalsRef = cooldownIntervalsRef . current
128+ return ( ) => {
129+ intervalsRef . forEach ( ( interval ) => clearInterval ( interval ) )
130+ intervalsRef . clear ( )
131+ }
132+ } , [ ] )
133+
121134 const addEmail = useCallback (
122135 ( email : string ) => {
123136 if ( ! email . trim ( ) ) return false
@@ -248,11 +261,6 @@ export function InviteModal({ open, onOpenChange, workspaceName }: InviteModalPr
248261 }
249262
250263 setExistingUserPermissionChanges ( { } )
251-
252- setSuccessMessage (
253- `Permission changes saved for ${ updates . length } user${ updates . length !== 1 ? 's' : '' } !`
254- )
255- setTimeout ( ( ) => setSuccessMessage ( null ) , 3000 )
256264 } catch ( error ) {
257265 logger . error ( 'Error saving permission changes:' , error )
258266 const errorMsg =
@@ -275,9 +283,6 @@ export function InviteModal({ open, onOpenChange, workspaceName }: InviteModalPr
275283 if ( ! userPerms . canAdmin || ! hasPendingChanges ) return
276284
277285 setExistingUserPermissionChanges ( { } )
278- setSuccessMessage ( 'Changes restored to original permissions!' )
279-
280- setTimeout ( ( ) => setSuccessMessage ( null ) , 3000 )
281286 } , [ userPerms . canAdmin , hasPendingChanges ] )
282287
283288 const handleRemoveMemberClick = useCallback ( ( userId : string , email : string ) => {
@@ -330,9 +335,6 @@ export function InviteModal({ open, onOpenChange, workspaceName }: InviteModalPr
330335 delete updated [ memberToRemove . userId ]
331336 return updated
332337 } )
333-
334- setSuccessMessage ( `${ memberToRemove . email } has been removed from the workspace` )
335- setTimeout ( ( ) => setSuccessMessage ( null ) , 3000 )
336338 } catch ( error ) {
337339 logger . error ( 'Error removing member:' , error )
338340 const errorMsg =
@@ -378,9 +380,6 @@ export function InviteModal({ open, onOpenChange, workspaceName }: InviteModalPr
378380 setPendingInvitations ( ( prev ) =>
379381 prev . filter ( ( inv ) => inv . invitationId !== invitationToRemove . invitationId )
380382 )
381-
382- setSuccessMessage ( `Invitation for ${ invitationToRemove . email } has been cancelled` )
383- setTimeout ( ( ) => setSuccessMessage ( null ) , 3000 )
384383 } catch ( error ) {
385384 logger . error ( 'Error cancelling invitation:' , error )
386385 const errorMsg =
@@ -420,9 +419,6 @@ export function InviteModal({ open, onOpenChange, workspaceName }: InviteModalPr
420419 throw new Error ( data . error || 'Failed to resend invitation' )
421420 }
422421
423- setSuccessMessage ( `Invitation resent to ${ email } ` )
424- setTimeout ( ( ) => setSuccessMessage ( null ) , 3000 )
425-
426422 setResentInvitationIds ( ( prev ) => ( { ...prev , [ invitationId ] : true } ) )
427423 setTimeout ( ( ) => {
428424 setResentInvitationIds ( ( prev ) => {
@@ -443,6 +439,12 @@ export function InviteModal({ open, onOpenChange, workspaceName }: InviteModalPr
443439 return next
444440 } )
445441 setResendCooldowns ( ( prev ) => ( { ...prev , [ invitationId ] : 60 } ) )
442+
443+ const existingInterval = cooldownIntervalsRef . current . get ( invitationId )
444+ if ( existingInterval ) {
445+ clearInterval ( existingInterval )
446+ }
447+
446448 const interval = setInterval ( ( ) => {
447449 setResendCooldowns ( ( prev ) => {
448450 const current = prev [ invitationId ]
@@ -451,11 +453,14 @@ export function InviteModal({ open, onOpenChange, workspaceName }: InviteModalPr
451453 const next = { ...prev }
452454 delete next [ invitationId ]
453455 clearInterval ( interval )
456+ cooldownIntervalsRef . current . delete ( invitationId )
454457 return next
455458 }
456459 return { ...prev , [ invitationId ] : current - 1 }
457460 } )
458461 } , 1000 )
462+
463+ cooldownIntervalsRef . current . set ( invitationId , interval )
459464 }
460465 } ,
461466 [ workspaceId , userPerms . canAdmin , resendCooldowns ]
@@ -466,7 +471,6 @@ export function InviteModal({ open, onOpenChange, workspaceName }: InviteModalPr
466471 e . preventDefault ( )
467472
468473 setErrorMessage ( null )
469- setSuccessMessage ( null )
470474
471475 if ( validEmails . length === 0 || ! workspaceId ) {
472476 return
@@ -555,11 +559,6 @@ export function InviteModal({ open, onOpenChange, workspaceName }: InviteModalPr
555559 setEmailItems ( [ ] )
556560 setUserPermissions ( [ ] )
557561 }
558- setShowSent ( true )
559-
560- setTimeout ( ( ) => {
561- setShowSent ( false )
562- } , 4000 )
563562 }
564563 } catch ( err ) {
565564 logger . error ( 'Error inviting members:' , err )
@@ -581,23 +580,23 @@ export function InviteModal({ open, onOpenChange, workspaceName }: InviteModalPr
581580 setExistingUserPermissionChanges ( { } )
582581 setIsSubmitting ( false )
583582 setIsSaving ( false )
584- setShowSent ( false )
585583 setErrorMessage ( null )
586- setSuccessMessage ( null )
587584 setMemberToRemove ( null )
588585 setIsRemovingMember ( false )
589586 setInvitationToRemove ( null )
590587 setIsRemovingInvitation ( false )
588+ setResendCooldowns ( { } )
589+ setResentInvitationIds ( { } )
590+
591+ cooldownIntervalsRef . current . forEach ( ( interval ) => clearInterval ( interval ) )
592+ cooldownIntervalsRef . current . clear ( )
591593 } , [ ] )
592594
593595 return (
594596 < Modal
595597 open = { open }
596598 onOpenChange = { ( newOpen : boolean ) => {
597- if ( newOpen ) {
598- setErrorMessage ( null )
599- setSuccessMessage ( null )
600- } else {
599+ if ( ! newOpen ) {
601600 resetState ( )
602601 }
603602 onOpenChange ( newOpen )
0 commit comments