Skip to content

Commit b9b7f52

Browse files
fix(credentials): show error when OAuth deletion fails due to missing fields
- Add deleteError state to track and display deletion errors - Keep confirmation dialog open when deletion fails - Show user-friendly error message when accountId or providerId is missing - Add loading state to delete button during deletion - Display error message in confirmation dialog with proper styling Co-authored-by: Emir Karabeg <emir-karabeg@users.noreply.github.com>
1 parent 6651be7 commit b9b7f52

1 file changed

Lines changed: 35 additions & 7 deletions

File tree

  • apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components/settings-modal/components/credentials

apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components/settings-modal/components/credentials/credentials-manager.tsx

Lines changed: 35 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -204,6 +204,7 @@ export function CredentialsManager() {
204204
const [copyIdSuccess, setCopyIdSuccess] = useState(false)
205205
const [credentialToDelete, setCredentialToDelete] = useState<WorkspaceCredential | null>(null)
206206
const [showDeleteConfirmDialog, setShowDeleteConfirmDialog] = useState(false)
207+
const [deleteError, setDeleteError] = useState<string | null>(null)
207208
const { data: session } = useSession()
208209
const currentUserId = session?.user?.id || ''
209210

@@ -804,16 +805,19 @@ export function CredentialsManager() {
804805

805806
const handleDeleteClick = (credential: WorkspaceCredential) => {
806807
setCredentialToDelete(credential)
808+
setDeleteError(null)
807809
setShowDeleteConfirmDialog(true)
808810
}
809811

810812
const handleConfirmDelete = async () => {
811813
if (!credentialToDelete) return
812-
setShowDeleteConfirmDialog(false)
814+
setDeleteError(null)
813815

814816
try {
815817
if (credentialToDelete.type === 'oauth') {
816818
if (!credentialToDelete.accountId || !credentialToDelete.providerId) {
819+
const errorMessage = 'Cannot disconnect: missing account information. Please try reconnecting this credential first.'
820+
setDeleteError(errorMessage)
817821
logger.error('Cannot disconnect OAuth credential: missing accountId or providerId')
818822
return
819823
}
@@ -835,10 +839,12 @@ export function CredentialsManager() {
835839
if (selectedCredentialId === credentialToDelete.id) {
836840
setSelectedCredentialId(null)
837841
}
842+
setShowDeleteConfirmDialog(false)
843+
setCredentialToDelete(null)
838844
} catch (error) {
845+
const message = error instanceof Error ? error.message : 'Failed to delete credential'
846+
setDeleteError(message)
839847
logger.error('Failed to delete credential', error)
840-
} finally {
841-
setCredentialToDelete(null)
842848
}
843849
}
844850

@@ -1371,8 +1377,14 @@ export function CredentialsManager() {
13711377
/>
13721378
)
13731379

1380+
const handleCloseDeleteDialog = () => {
1381+
setShowDeleteConfirmDialog(false)
1382+
setCredentialToDelete(null)
1383+
setDeleteError(null)
1384+
}
1385+
13741386
const deleteConfirmDialogJsx = (
1375-
<Modal open={showDeleteConfirmDialog} onOpenChange={setShowDeleteConfirmDialog}>
1387+
<Modal open={showDeleteConfirmDialog} onOpenChange={(open) => !open && handleCloseDeleteDialog()}>
13761388
<ModalContent size='sm'>
13771389
<ModalHeader>
13781390
{credentialToDelete?.type === 'oauth' ? 'Disconnect Secret' : 'Delete Secret'}
@@ -1386,13 +1398,29 @@ export function CredentialsManager() {
13861398
</span>
13871399
? <span className='text-[var(--text-error)]'>This action cannot be undone.</span>
13881400
</p>
1401+
{deleteError && (
1402+
<div className='mt-[12px] rounded-[8px] border border-red-500/50 bg-red-50 p-[12px] dark:bg-red-950/30'>
1403+
<div className='flex items-start gap-[10px]'>
1404+
<AlertTriangle className='mt-[1px] h-4 w-4 flex-shrink-0 text-red-600 dark:text-red-400' />
1405+
<p className='text-[12px] text-red-700 dark:text-red-300'>{deleteError}</p>
1406+
</div>
1407+
</div>
1408+
)}
13891409
</ModalBody>
13901410
<ModalFooter>
1391-
<Button variant='default' onClick={() => setShowDeleteConfirmDialog(false)}>
1411+
<Button variant='default' onClick={handleCloseDeleteDialog}>
13921412
Cancel
13931413
</Button>
1394-
<Button variant='destructive' onClick={handleConfirmDelete}>
1395-
{credentialToDelete?.type === 'oauth' ? 'Disconnect' : 'Delete'}
1414+
<Button
1415+
variant='destructive'
1416+
onClick={handleConfirmDelete}
1417+
disabled={deleteCredential.isPending || disconnectOAuthService.isPending}
1418+
>
1419+
{deleteCredential.isPending || disconnectOAuthService.isPending
1420+
? 'Deleting...'
1421+
: credentialToDelete?.type === 'oauth'
1422+
? 'Disconnect'
1423+
: 'Delete'}
13961424
</Button>
13971425
</ModalFooter>
13981426
</ModalContent>

0 commit comments

Comments
 (0)