diff --git a/packages/services/src/Domain/Contacts/ContactService.ts b/packages/services/src/Domain/Contacts/ContactService.ts index 0da16dca9..bbe15ab56 100644 --- a/packages/services/src/Domain/Contacts/ContactService.ts +++ b/packages/services/src/Domain/Contacts/ContactService.ts @@ -1,7 +1,11 @@ import { DeleteContact } from './UseCase/DeleteContact' import { MutatorClientInterface } from './../Mutator/MutatorClientInterface' import { PureCryptoInterface } from '@standardnotes/sncrypto-common' -import { SharedVaultInviteServerHash, SharedVaultUserServerHash } from '@standardnotes/responses' +import { + ClientDisplayableError, + SharedVaultInviteServerHash, + SharedVaultUserServerHash, +} from '@standardnotes/responses' import { TrustedContactInterface, TrustedContactMutator, DecryptedItemInterface } from '@standardnotes/models' import { AbstractService } from '../Service/AbstractService' import { SyncServiceInterface } from '../Sync/SyncServiceInterface' @@ -110,6 +114,9 @@ export class ContactService extends AbstractService impleme name?: string, ): Promise { const { userUuid, publicKey, signingPublicKey } = this.parseCollaborationID(collaborationID) + if (userUuid === this.user.getUserUuid()) { + throw new ClientDisplayableError('You cannot add yourself as a trusted contact') + } return this.createOrEditTrustedContact({ name: name ?? '', contactUuid: userUuid, diff --git a/packages/web/src/javascripts/Components/Preferences/Panes/Vaults/Contacts/EditContactModal.tsx b/packages/web/src/javascripts/Components/Preferences/Panes/Vaults/Contacts/EditContactModal.tsx index f296c01e6..26fb4ec89 100644 --- a/packages/web/src/javascripts/Components/Preferences/Panes/Vaults/Contacts/EditContactModal.tsx +++ b/packages/web/src/javascripts/Components/Preferences/Panes/Vaults/Contacts/EditContactModal.tsx @@ -2,7 +2,7 @@ import { FunctionComponent, useCallback, useEffect, useMemo, useState } from 're import Modal, { ModalAction } from '@/Components/Modal/Modal' import DecoratedInput from '@/Components/Input/DecoratedInput' import { useApplication } from '@/Components/ApplicationProvider' -import { InviteRecord, TrustedContactInterface } from '@standardnotes/snjs' +import { ClientDisplayableError, InviteRecord, TrustedContactInterface } from '@standardnotes/snjs' type Props = { fromInvite?: InviteRecord @@ -46,12 +46,19 @@ const EditContactModal: FunctionComponent = ({ onCloseDialog, fromInvite, void application.contacts.editTrustedContactFromCollaborationID(editingContact, { name, collaborationID }) handleDialogClose() } else { - const contact = await application.contacts.addTrustedContactFromCollaborationID(collaborationID, name) - if (contact) { - onAddContact?.(contact) - handleDialogClose() - } else { - void application.alerts.alert('Unable to create contact. Please try again.') + try { + const contact = await application.contacts.addTrustedContactFromCollaborationID(collaborationID, name) + if (contact) { + onAddContact?.(contact) + handleDialogClose() + } else { + void application.alerts.alert('Unable to create contact. Please try again.') + } + } catch (error) { + if (error instanceof ClientDisplayableError) { + application.alerts.showErrorAlert(error).catch(console.error) + } + console.error(error) } } }, [editingContact, application.contacts, application.alerts, name, collaborationID, handleDialogClose, onAddContact])