Skip to content

Commit c6c1296

Browse files
fix(credentials): prioritize expired invitations
1 parent b840004 commit c6c1296

2 files changed

Lines changed: 42 additions & 2 deletions

File tree

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
/**
2+
* @vitest-environment node
3+
*/
4+
import { describe, expect, it } from 'vitest'
5+
import type { CredentialGroupEnrollmentDetail } from '@/lib/api/contracts/credential-groups'
6+
import { getEnrollmentStatus } from '@/ee/credential-groups/components/credential-group-detail'
7+
8+
const ENROLLMENT: CredentialGroupEnrollmentDetail = {
9+
id: 'enrollment-1',
10+
credentialGroupId: 'group-1',
11+
email: 'person@example.com',
12+
status: 'in_progress',
13+
expiresAt: '2026-08-13T00:00:00.000Z',
14+
invitedAt: '2026-08-12T00:00:00.000Z',
15+
sentAt: '2026-08-12T00:00:00.000Z',
16+
completedAt: null,
17+
revokedAt: null,
18+
expired: true,
19+
createdAt: '2026-08-12T00:00:00.000Z',
20+
updatedAt: '2026-08-13T00:00:00.000Z',
21+
connections: [{ provider: 'gmail', status: 'needs_reauth', count: 1 }],
22+
}
23+
24+
describe('Credential Group enrollment status', () => {
25+
it('keeps expired incomplete invitations ahead of credential reauthorization', () => {
26+
expect(getEnrollmentStatus(ENROLLMENT, ['gmail'])).toEqual({
27+
label: 'Expired',
28+
invalid: true,
29+
})
30+
})
31+
32+
it('shows reauthorization for completed enrollments after their invitation expires', () => {
33+
expect(getEnrollmentStatus({ ...ENROLLMENT, status: 'completed' }, ['gmail'])).toEqual({
34+
label: 'Reconnect needed',
35+
invalid: false,
36+
})
37+
})
38+
})

apps/sim/ee/credential-groups/components/credential-group-detail.tsx

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -48,12 +48,15 @@ const CREDENTIAL_GROUP_TABS = [
4848
{ value: 'people', label: 'People' },
4949
] as const
5050

51-
function getEnrollmentStatus(
51+
export function getEnrollmentStatus(
5252
enrollment: CredentialGroupEnrollmentDetail,
5353
activeProviders: CredentialGroupProvider[]
5454
) {
5555
if (enrollment.status === 'revoked') return { label: 'Revoked', invalid: false }
5656
if (enrollment.status === 'delivery_failed') return { label: 'Delivery failed', invalid: true }
57+
if (enrollment.status !== 'completed' && enrollment.expired) {
58+
return { label: 'Expired', invalid: true }
59+
}
5760
const needsReauthorization = enrollment.connections.some(
5861
(connection) => connection.status === 'needs_reauth'
5962
)
@@ -70,7 +73,6 @@ function getEnrollmentStatus(
7073
return { label: 'Connected', invalid: false }
7174
}
7275
if (enrollment.status === 'completed') return { label: 'In progress', invalid: false }
73-
if (enrollment.expired) return { label: 'Expired', invalid: true }
7476
if (enrollment.status === 'in_progress') return { label: 'In progress', invalid: false }
7577
return { label: 'Invited', invalid: false }
7678
}

0 commit comments

Comments
 (0)