Skip to content

Commit 2aeb6c7

Browse files
committed
cleanup
1 parent df7b0fc commit 2aeb6c7

File tree

2 files changed

+44
-31
lines changed
  • apps/sim/app
    • playground
    • workspace/[workspaceId]/w/components/sidebar/components/workspace-header/components/invite-modal

2 files changed

+44
-31
lines changed

apps/sim/app/playground/page.tsx

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ import {
2424
Cursor,
2525
DatePicker,
2626
DocumentAttachment,
27+
Download,
2728
Duplicate,
2829
Expand,
2930
Eye,
@@ -51,6 +52,7 @@ import {
5152
NoWrap,
5253
PanelLeft,
5354
Play,
55+
PlayOutline,
5456
Popover,
5557
PopoverBackButton,
5658
PopoverContent,
@@ -214,6 +216,9 @@ export default function PlaygroundPage() {
214216
<VariantRow label='primary'>
215217
<Button variant='primary'>Primary</Button>
216218
</VariantRow>
219+
<VariantRow label='destructive'>
220+
<Button variant='destructive'>Destructive</Button>
221+
</VariantRow>
217222
<VariantRow label='secondary'>
218223
<Button variant='secondary'>Secondary</Button>
219224
</VariantRow>
@@ -290,6 +295,9 @@ export default function PlaygroundPage() {
290295
<VariantRow label='outline'>
291296
<Badge variant='outline'>Outline</Badge>
292297
</VariantRow>
298+
<VariantRow label='type'>
299+
<Badge variant='type'>Type</Badge>
300+
</VariantRow>
293301
<VariantRow label='green'>
294302
<Badge variant='green'>Green</Badge>
295303
<Badge variant='green' dot>
@@ -323,6 +331,9 @@ export default function PlaygroundPage() {
323331
<VariantRow label='teal'>
324332
<Badge variant='teal'>Teal</Badge>
325333
</VariantRow>
334+
<VariantRow label='cyan'>
335+
<Badge variant='cyan'>Cyan</Badge>
336+
</VariantRow>
326337
<VariantRow label='gray'>
327338
<Badge variant='gray'>Gray</Badge>
328339
</VariantRow>
@@ -996,6 +1007,7 @@ export default function PlaygroundPage() {
9961007
{ Icon: Copy, name: 'Copy' },
9971008
{ Icon: Cursor, name: 'Cursor' },
9981009
{ Icon: DocumentAttachment, name: 'DocumentAttachment' },
1010+
{ Icon: Download, name: 'Download' },
9991011
{ Icon: Duplicate, name: 'Duplicate' },
10001012
{ Icon: Expand, name: 'Expand' },
10011013
{ Icon: Eye, name: 'Eye' },
@@ -1011,6 +1023,7 @@ export default function PlaygroundPage() {
10111023
{ Icon: NoWrap, name: 'NoWrap' },
10121024
{ Icon: PanelLeft, name: 'PanelLeft' },
10131025
{ Icon: Play, name: 'Play' },
1026+
{ Icon: PlayOutline, name: 'PlayOutline' },
10141027
{ Icon: Redo, name: 'Redo' },
10151028
{ Icon: Rocket, name: 'Rocket' },
10161029
{ Icon: Trash, name: 'Trash' },

apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components/workspace-header/components/invite-modal/invite-modal.tsx

Lines changed: 31 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -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,21 @@ export function InviteModal({ open, onOpenChange, workspaceName }: InviteModalPr
118117
}
119118
}, [open, workspaceId, fetchPendingInvitations, refetchPermissions])
120119

120+
// Clear error message when modal opens
121+
useEffect(() => {
122+
if (open) {
123+
setErrorMessage(null)
124+
}
125+
}, [open])
126+
127+
useEffect(() => {
128+
const intervalsRef = cooldownIntervalsRef.current
129+
return () => {
130+
intervalsRef.forEach((interval) => clearInterval(interval))
131+
intervalsRef.clear()
132+
}
133+
}, [])
134+
121135
const addEmail = useCallback(
122136
(email: string) => {
123137
if (!email.trim()) return false
@@ -248,11 +262,6 @@ export function InviteModal({ open, onOpenChange, workspaceName }: InviteModalPr
248262
}
249263

250264
setExistingUserPermissionChanges({})
251-
252-
setSuccessMessage(
253-
`Permission changes saved for ${updates.length} user${updates.length !== 1 ? 's' : ''}!`
254-
)
255-
setTimeout(() => setSuccessMessage(null), 3000)
256265
} catch (error) {
257266
logger.error('Error saving permission changes:', error)
258267
const errorMsg =
@@ -275,9 +284,6 @@ export function InviteModal({ open, onOpenChange, workspaceName }: InviteModalPr
275284
if (!userPerms.canAdmin || !hasPendingChanges) return
276285

277286
setExistingUserPermissionChanges({})
278-
setSuccessMessage('Changes restored to original permissions!')
279-
280-
setTimeout(() => setSuccessMessage(null), 3000)
281287
}, [userPerms.canAdmin, hasPendingChanges])
282288

283289
const handleRemoveMemberClick = useCallback((userId: string, email: string) => {
@@ -330,9 +336,6 @@ export function InviteModal({ open, onOpenChange, workspaceName }: InviteModalPr
330336
delete updated[memberToRemove.userId]
331337
return updated
332338
})
333-
334-
setSuccessMessage(`${memberToRemove.email} has been removed from the workspace`)
335-
setTimeout(() => setSuccessMessage(null), 3000)
336339
} catch (error) {
337340
logger.error('Error removing member:', error)
338341
const errorMsg =
@@ -378,9 +381,6 @@ export function InviteModal({ open, onOpenChange, workspaceName }: InviteModalPr
378381
setPendingInvitations((prev) =>
379382
prev.filter((inv) => inv.invitationId !== invitationToRemove.invitationId)
380383
)
381-
382-
setSuccessMessage(`Invitation for ${invitationToRemove.email} has been cancelled`)
383-
setTimeout(() => setSuccessMessage(null), 3000)
384384
} catch (error) {
385385
logger.error('Error cancelling invitation:', error)
386386
const errorMsg =
@@ -420,9 +420,6 @@ export function InviteModal({ open, onOpenChange, workspaceName }: InviteModalPr
420420
throw new Error(data.error || 'Failed to resend invitation')
421421
}
422422

423-
setSuccessMessage(`Invitation resent to ${email}`)
424-
setTimeout(() => setSuccessMessage(null), 3000)
425-
426423
setResentInvitationIds((prev) => ({ ...prev, [invitationId]: true }))
427424
setTimeout(() => {
428425
setResentInvitationIds((prev) => {
@@ -443,6 +440,12 @@ export function InviteModal({ open, onOpenChange, workspaceName }: InviteModalPr
443440
return next
444441
})
445442
setResendCooldowns((prev) => ({ ...prev, [invitationId]: 60 }))
443+
444+
const existingInterval = cooldownIntervalsRef.current.get(invitationId)
445+
if (existingInterval) {
446+
clearInterval(existingInterval)
447+
}
448+
446449
const interval = setInterval(() => {
447450
setResendCooldowns((prev) => {
448451
const current = prev[invitationId]
@@ -451,11 +454,14 @@ export function InviteModal({ open, onOpenChange, workspaceName }: InviteModalPr
451454
const next = { ...prev }
452455
delete next[invitationId]
453456
clearInterval(interval)
457+
cooldownIntervalsRef.current.delete(invitationId)
454458
return next
455459
}
456460
return { ...prev, [invitationId]: current - 1 }
457461
})
458462
}, 1000)
463+
464+
cooldownIntervalsRef.current.set(invitationId, interval)
459465
}
460466
},
461467
[workspaceId, userPerms.canAdmin, resendCooldowns]
@@ -466,7 +472,6 @@ export function InviteModal({ open, onOpenChange, workspaceName }: InviteModalPr
466472
e.preventDefault()
467473

468474
setErrorMessage(null)
469-
setSuccessMessage(null)
470475

471476
if (validEmails.length === 0 || !workspaceId) {
472477
return
@@ -555,11 +560,6 @@ export function InviteModal({ open, onOpenChange, workspaceName }: InviteModalPr
555560
setEmailItems([])
556561
setUserPermissions([])
557562
}
558-
setShowSent(true)
559-
560-
setTimeout(() => {
561-
setShowSent(false)
562-
}, 4000)
563563
}
564564
} catch (err) {
565565
logger.error('Error inviting members:', err)
@@ -581,23 +581,23 @@ export function InviteModal({ open, onOpenChange, workspaceName }: InviteModalPr
581581
setExistingUserPermissionChanges({})
582582
setIsSubmitting(false)
583583
setIsSaving(false)
584-
setShowSent(false)
585584
setErrorMessage(null)
586-
setSuccessMessage(null)
587585
setMemberToRemove(null)
588586
setIsRemovingMember(false)
589587
setInvitationToRemove(null)
590588
setIsRemovingInvitation(false)
589+
setResendCooldowns({})
590+
setResentInvitationIds({})
591+
592+
cooldownIntervalsRef.current.forEach((interval) => clearInterval(interval))
593+
cooldownIntervalsRef.current.clear()
591594
}, [])
592595

593596
return (
594597
<Modal
595598
open={open}
596599
onOpenChange={(newOpen: boolean) => {
597-
if (newOpen) {
598-
setErrorMessage(null)
599-
setSuccessMessage(null)
600-
} else {
600+
if (!newOpen) {
601601
resetState()
602602
}
603603
onOpenChange(newOpen)

0 commit comments

Comments
 (0)