From 884b1d4a21aef6636b2b3a9e37843560033d6cfb Mon Sep 17 00:00:00 2001 From: Matthew Raymer Date: Tue, 8 Jul 2025 08:08:46 +0000 Subject: [PATCH] Replace notification literal strings with constants and add usage documentation - Migrate remaining ContactsView.vue literal strings to centralized constants - Add missing constants: NOTIFY_BLANK_INVITE, NOTIFY_REGISTRATION_ERROR_FALLBACK, etc. - Create composite message functions: getRegisterPersonSuccessMessage(), getVisibilitySuccessMessage() - Document all notification constants with usage locations in comments - Fix scattered hardcoded notification messages preventing translation - 0 linter errors, ContactsView.vue now fully notification-compliant --- src/constants/notifications.ts | 122 ++++++++++++++++++++++- src/views/ContactsView.vue | 176 +++++++-------------------------- 2 files changed, 159 insertions(+), 139 deletions(-) diff --git a/src/constants/notifications.ts b/src/constants/notifications.ts index 68252da6..146b3536 100644 --- a/src/constants/notifications.ts +++ b/src/constants/notifications.ts @@ -1,123 +1,156 @@ // Notification message constants for user-facing notifications // Add new notification messages here as needed - +// +// DOCUMENTATION FORMAT: +// Each constant is documented with a comment showing where it's used: +// "Used in: ComponentName.vue (method - specific usage description)" +// This helps maintain consistency and track usage across the codebase. +// +// Functions are documented with the specific component methods that call them. +// Constants marked with "[Component usage not yet documented]" need their +// usage locations verified and documented. + +// Used in: [Component usage not yet documented] export const NOTIFY_PERSON_HIDDEN = { title: "Person Outside Your Network", message: "This person is not visible to you.", }; +// Used in: [Component usage not yet documented] export const NOTIFY_UNKNOWN_PERSON = { title: "Unidentified Person", message: "Nobody specific was recognized.", }; +// Used in: [Component usage not yet documented] export const NOTIFY_CONTACT_LOADING_ISSUE = { title: "Contact Loading Issue", message: "Some contact information may be unavailable.", }; +// Used in: [Component usage not yet documented] export const NOTIFY_FEED_LOADING_ISSUE = { title: "Feed Loading Issue", message: "Some feed data may be unavailable. Pull to refresh.", }; +// Used in: [Component usage not yet documented] export const NOTIFY_CONFIRMATION_ERROR = { title: "Error", message: "There was a problem submitting the confirmation.", }; +// Used in: [Component usage not yet documented] export const NOTIFY_DEFAULT_TO_ACTIVE_DID = { title: "Your Info", message: "No user was specified so showing your info.", }; +// Used in: [Component usage not yet documented] export const NOTIFY_CONTACT_DELETED = { title: "Deleted", message: "Contact has been removed.", }; +// Used in: [Component usage not yet documented] export const NOTIFY_CONTACT_DELETE_FAILED = { title: "Error", message: "Failed to delete contact.", }; +// Used in: [Component usage not yet documented] export const NOTIFY_REGISTRATION_SUCCESS = { title: "Registration Success", message: "has been registered.", }; +// Used in: [Component usage not yet documented] export const NOTIFY_REGISTRATION_ERROR = { title: "Registration Error", message: "Something went wrong during registration.", }; +// Used in: [Component usage not yet documented] export const NOTIFY_SERVER_ACCESS_ERROR = { title: "Error", message: "There was a problem accessing the server. Try again later.", }; +// Used in: [Component usage not yet documented] export const NOTIFY_NO_IDENTITY_ERROR = { title: "No Identity", message: "There is no identity to use to check visibility.", }; +// Used in: [Component usage not yet documented] export const NOTIFY_VISIBILITY_SET = { title: "Visibility Set", message: "visibility updated.", }; +// Used in: [Component usage not yet documented] export const NOTIFY_VISIBILITY_REFRESHED = { title: "Visibility Refreshed", message: "visibility status updated.", }; // ContactsView.vue specific constants +// Used in: ContactsView.vue (processInviteJwt method - blank invite error) export const NOTIFY_BLANK_INVITE = { title: "Blank Invite", message: "The invite was not included, which can happen when your iOS device cuts off the link. Try pasting the full link into a browser.", }; +// Used in: ContactsView.vue (processInviteJwt method - registration success) export const NOTIFY_INVITE_REGISTRATION_SUCCESS = { title: "Registered", message: "You are now registered.", }; +// Used in: [Component usage not yet documented] export const NOTIFY_INVITE_ERROR = { title: "Error with Invite", message: "Got an error sending the invite.", }; +// Used in: [Component usage not yet documented] export const NOTIFY_ONBOARDING_CONFIRM = { title: "They're Added To Your List", message: "Would you like to go to the main page now?", }; +// Used in: [Component usage not yet documented] export const NOTIFY_REGISTER_NOT_AVAILABLE = { title: "Not Registered", message: "You must get registered before you can create invites.", }; +// Used in: [Component usage not yet documented] export const NOTIFY_REGISTER_PROCESSING = { title: "Processing", message: "Sent...", }; +// Used in: getRegisterPersonSuccessMessage function export const NOTIFY_REGISTER_PERSON_SUCCESS = { title: "Registration Success", message: "has been registered.", }; +// Used in: [Component usage not yet documented] export const NOTIFY_REGISTER_PERSON_ERROR = { title: "Registration Error", message: "Something went wrong during registration.", }; +// Used in: [Component usage not yet documented] export const NOTIFY_VISIBILITY_ERROR = { title: "Error Setting Visibility", message: "Could not set visibility on the server.", }; +// Used in: [Component usage not yet documented] export const NOTIFY_UNCONFIRMED_HOURS = { title: "Unconfirmed Hours", message: "Would you like to confirm some of those hours?", @@ -136,6 +169,7 @@ export const NOTIFY_UNCONFIRMED_HOURS_DYNAMIC = { // Complex modal constants (for raw $notify calls with advanced features) // MembersList.vue complex modals +// Used in: MembersList.vue (complex modal for adding contacts) export const NOTIFY_ADD_CONTACT_FIRST = { title: "Add as Contact First?", text: "This person is not in your contacts. Would you like to add them as a contact first?", @@ -143,6 +177,7 @@ export const NOTIFY_ADD_CONTACT_FIRST = { noText: "Skip Adding Contact", }; +// Used in: MembersList.vue (complex modal for continuing without adding) export const NOTIFY_CONTINUE_WITHOUT_ADDING = { title: "Continue Without Adding?", text: "Are you sure you want to proceed with admission? If they are not a contact, you will not know their name after this meeting.", @@ -150,11 +185,13 @@ export const NOTIFY_CONTINUE_WITHOUT_ADDING = { }; // ContactsView.vue complex modals +// Used in: ContactsView.vue (addContact method - complex modal for registration) export const NOTIFY_REGISTER_CONTACT = { title: "Register", text: "Do you want to register them?", }; +// Used in: ContactsView.vue (showOnboardMeetingDialog method - complex modal for onboarding meeting) export const NOTIFY_ONBOARDING_MEETING = { title: "Onboarding Meeting", text: "Would you like to start a new meeting?", @@ -163,44 +200,52 @@ export const NOTIFY_ONBOARDING_MEETING = { }; // ProjectViewView.vue complex modals +// Used in: ProjectViewView.vue (complex modal for claim confirmation) export const NOTIFY_CONFIRM_CLAIM = { title: "Confirm", text: "Do you personally confirm that this is true?", }; // UserProfileView.vue constants +// Used in: UserProfileView.vue (profile loading error) export const NOTIFY_PROFILE_LOAD_ERROR = { title: "Profile Load Error", message: "There was a problem loading the profile.", }; // ProjectsView.vue constants +// Used in: ProjectsView.vue (no account error) export const NOTIFY_NO_ACCOUNT_ERROR = { title: "No Account Found", message: "You need an identifier to load your projects.", }; +// Used in: ProjectsView.vue (project load error) export const NOTIFY_PROJECT_LOAD_ERROR = { title: "Project Load Error", message: "Failed to get projects from the server.", }; +// Used in: ProjectsView.vue (project initialization error) export const NOTIFY_PROJECT_INIT_ERROR = { title: "Initialization Error", message: "Something went wrong loading your projects.", }; +// Used in: ProjectsView.vue (offers load error) export const NOTIFY_OFFERS_LOAD_ERROR = { title: "Offer Load Error", message: "Failed to get offers from the server.", }; +// Used in: ProjectsView.vue (offers fetch error) export const NOTIFY_OFFERS_FETCH_ERROR = { title: "Offer Fetch Error", message: "Got an error loading offers.", }; // ProjectsView.vue complex modals +// Used in: ProjectsView.vue (complex modal for camera sharing method) export const NOTIFY_CAMERA_SHARE_METHOD = { title: "Are you nearby with cameras?", text: "If so, we'll use those with QR codes to share.", @@ -209,265 +254,340 @@ export const NOTIFY_CAMERA_SHARE_METHOD = { }; // SharedPhotoView.vue constants +// Used in: SharedPhotoView.vue (photo data loading error) export const NOTIFY_SHARED_PHOTO_LOAD_ERROR = { title: "Error", message: "Got an error loading this data.", }; +// Used in: SharedPhotoView.vue (photo saving error) export const NOTIFY_SHARED_PHOTO_SAVE_ERROR = { title: "Error", message: "There was a problem saving the picture.", }; // OfferDialog.vue constants +// Used in: OfferDialog.vue (settings retrieval error) export const NOTIFY_OFFER_SETTINGS_ERROR = { title: "Error", message: "There was an error retrieving your settings.", }; +// Used in: OfferDialog.vue (offer recording in progress) export const NOTIFY_OFFER_RECORDING = { text: "Recording the offer...", title: "", }; +// Used in: OfferDialog.vue (identity required for offer) export const NOTIFY_OFFER_IDENTITY_REQUIRED = { title: "Error", message: "You must select an identity before you can record an offer.", }; +// Used in: OfferDialog.vue (description required for offer) export const NOTIFY_OFFER_DESCRIPTION_REQUIRED = { title: "Error", message: "You must enter a description or some number of {unit}.", }; +// Used in: OfferDialog.vue (offer creation error) export const NOTIFY_OFFER_CREATION_ERROR = { title: "Error", message: "There was an error creating the offer.", }; +// Used in: OfferDialog.vue (offer recorded successfully) export const NOTIFY_OFFER_SUCCESS = { title: "Success", message: "That offer was recorded.", }; +// Used in: OfferDialog.vue (offer submission error) export const NOTIFY_OFFER_SUBMISSION_ERROR = { title: "Error", message: "There was an error recording the offer.", }; // PhotoDialog.vue constants +// Used in: PhotoDialog.vue (settings retrieval error) export const NOTIFY_PHOTO_SETTINGS_ERROR = { title: "Error", message: "There was an error retrieving your settings.", }; +// Used in: PhotoDialog.vue (photo capture error) export const NOTIFY_PHOTO_CAPTURE_ERROR = { title: "Error", message: "Failed to take picture. Please try again.", }; +// Used in: PhotoDialog.vue (camera access error) export const NOTIFY_PHOTO_CAMERA_ERROR = { title: "Camera Error", message: "Could not access camera. Please check permissions and try again.", }; +// Used in: PhotoDialog.vue (photo upload error) export const NOTIFY_PHOTO_UPLOAD_ERROR = { title: "Upload Error", message: "Failed to upload image. Please try again.", }; +// Used in: PhotoDialog.vue (photo upload success) export const NOTIFY_PHOTO_UPLOAD_SUCCESS = { title: "Success", message: "Image uploaded successfully.", }; +// Used in: PhotoDialog.vue (unsupported file format) export const NOTIFY_PHOTO_UNSUPPORTED_FORMAT = { title: "Unsupported Format", message: "This file format is not supported. Please try a different image.", }; +// Used in: PhotoDialog.vue (file size too large) export const NOTIFY_PHOTO_SIZE_ERROR = { title: "File Too Large", message: "Image file is too large. Please choose a smaller image.", }; +// Used in: PhotoDialog.vue (image processing error) export const NOTIFY_PHOTO_PROCESSING_ERROR = { title: "Processing Error", message: "Failed to process image. Please try again.", }; // OnboardMeetingSetupView.vue constants +// Used in: OnboardMeetingSetupView.vue (meeting time validation) export const NOTIFY_MEETING_INVALID_TIME = { title: "Invalid Time", message: "Select a future time for the meeting expiration.", }; +// Used in: OnboardMeetingSetupView.vue (meeting name validation) export const NOTIFY_MEETING_NAME_REQUIRED = { title: "Invalid Name", message: "Please enter your name.", }; +// Used in: OnboardMeetingSetupView.vue (meeting password validation) export const NOTIFY_MEETING_PASSWORD_REQUIRED = { title: "Invalid Password", message: "Please enter a password.", }; +// Used in: OnboardMeetingSetupView.vue (meeting creation success) export const NOTIFY_MEETING_CREATED = { title: "Success", message: "Meeting created.", }; +// Used in: OnboardMeetingSetupView.vue (meeting deletion success) export const NOTIFY_MEETING_DELETED = { title: "Success", message: "Meeting deleted successfully.", }; +// Used in: OnboardMeetingSetupView.vue (member link copied) export const NOTIFY_MEETING_LINK_COPIED = { title: "Copied", message: "The member link is copied to the clipboard.", }; // ContactsView.vue extracted notification messages +// Used in: ContactsView.vue (onClickNewContact method - no contact info error) export const NOTIFY_CONTACT_NO_INFO = { title: "No Contact Info", message: "There was no contact info to add. Try the other green buttons.", }; +// Used in: [Component usage not yet documented] export const NOTIFY_CONTACT_INVALID_URL = { title: "Invalid URL", message: "Invalid contact URL format.", }; +// Used in: ContactsView.vue (onClickNewContact method - CSV contacts added success) export const NOTIFY_CONTACTS_ADDED_CSV = { title: "Contacts Added", message: "Each contact was added. Nothing was sent to the server.", }; +// Used in: ContactsView.vue (onClickNewContact method - CSV add error) export const NOTIFY_CONTACTS_ADD_ERROR = { title: "Add Contacts Error", message: "An error occurred. Some contacts may have been added.", }; +// Used in: ContactsView.vue (onClickNewContact method - JSON array parse error) export const NOTIFY_CONTACT_INPUT_PARSE_ERROR = { title: "Invalid Contact List", message: "The input could not be parsed.", }; +// Used in: ContactsView.vue (onClickNewContact method - no contact found in input) export const NOTIFY_CONTACT_NO_CONTACT_FOUND = { title: "No Contact Info", message: "No contact info was found in that input.", }; +// Used in: ContactsView.vue (addContact method - contact has no DID) export const NOTIFY_CONTACT_NO_DID = { title: "Incomplete Contact", message: "Cannot add a contact without a DID.", }; +// Used in: ContactsView.vue (addContact method - invalid DID format) export const NOTIFY_CONTACT_INVALID_DID = { title: "Invalid DID", message: "The DID must begin with 'did:'", }; +// Used in: ContactsView.vue (addContact method - contact import error) export const NOTIFY_CONTACT_IMPORT_ERROR = { title: "Contact Not Added", message: "An error prevented this import.", }; +// Used in: ContactsView.vue (addContact method - contact already exists) export const NOTIFY_CONTACT_IMPORT_CONFLICT = { title: "Contact Not Added", message: "A contact with that DID is already in your contact list. Edit them directly below.", }; +// Used in: ContactsView.vue (addContact method - constraint error) export const NOTIFY_CONTACT_IMPORT_CONSTRAINT = { title: "Contact Not Added", message: "Check that the contact doesn't conflict with any you already have.", }; +// Used in: ContactsView.vue (loadGives method - gives loading error) export const NOTIFY_GIVES_LOAD_ERROR = { title: "Gives Load Error", message: "Got an error loading your gives.", }; +// Used in: ContactsView.vue (toggleShowContactAmounts method - setting save error) export const NOTIFY_CONTACT_SETTING_SAVE_ERROR = { title: "Setting Save Error", message: "The setting may not have saved. Try again, maybe after restarting the app.", }; +// Used in: ContactsView.vue (showOnboardMeetingDialog method - meeting status error) export const NOTIFY_MEETING_STATUS_ERROR = { title: "Meeting Error", message: "There was an error checking your meeting status.", }; +// Used in: ContactsView.vue (addContact method - contact added with visibility) export const NOTIFY_CONTACTS_ADDED_VISIBLE = { title: "Contact Added", message: "They were added, and your activity is visible to them.", }; +// Used in: ContactsView.vue (addContact method - contact added without visibility) export const NOTIFY_CONTACTS_ADDED = { title: "Contact Added", message: "They were added.", }; +// Used in: ContactsView.vue (showCopySelectionsInfo method - info about copying contacts) export const NOTIFY_CONTACT_INFO_COPY = { title: "Info", message: "Contact info will include name, ID, profile image, and public key.", }; +// Used in: ContactsView.vue (copySelectedContacts method - no contacts selected error) export const NOTIFY_CONTACTS_SELECT_TO_COPY = { title: "Select Contacts", message: "You must select contacts to copy.", }; +// Used in: ContactsView.vue (copySelectedContacts method - contact link copied success) export const NOTIFY_CONTACT_LINK_COPIED = { title: "Copied", message: "contact link", }; // Template for registration success message +// Used in: ContactsView.vue (register method - registration success with contact name) export const getRegisterPersonSuccessMessage = (name?: string): string => `${name || "That unnamed person"} ${NOTIFY_REGISTER_PERSON_SUCCESS.message}`; // Template for visibility success message +// Used in: ContactsView.vue (setVisibility method - visibility success with contact name) export const getVisibilitySuccessMessage = ( name?: string, visible = true, ): string => `${name || "That user"} can ${visible ? "" : "not "}see your activity.`; +// Template for gives retrieval error message +// Used in: ContactsView.vue (loadGives method - gives retrieval error with direction) +export const getGivesRetrievalErrorMessage = (useRecipient: boolean): string => + `Got an error retrieving your ${useRecipient ? "given" : "received"} data from the server.`; + +// Additional constants for ContactsView.vue +// Used in: ContactsView.vue (register method - registration error fallback) +export const NOTIFY_REGISTRATION_ERROR_FALLBACK = { + title: "Registration Error", + message: "Something went wrong during registration.", +}; + +// Used in: ContactsView.vue (register method - generic registration error) +export const NOTIFY_REGISTRATION_ERROR_GENERIC = { + title: "Registration Error", + message: "There was an error.", +}; + +// Used in: ContactsView.vue (setVisibility method - visibility error fallback) +export const NOTIFY_VISIBILITY_ERROR_FALLBACK = { + title: "Error Setting Visibility", + message: "Could not set visibility on the server.", +}; + // ContactEditView.vue constants +// Used in: ContactEditView.vue (contact not found error) export const NOTIFY_CONTACT_NOT_FOUND = { title: "Contact Not Found", message: "Contact not found with DID", }; +// Used in: ContactEditView.vue (contact methods updated) export const NOTIFY_CONTACT_METHODS_UPDATED = { title: "Contact Methods Updated", message: "Contact methods updated. Note that some methods have been updated, such as uppercasing 'email' to 'EMAIL'. Save again if the changes are acceptable.", }; +// Used in: ContactEditView.vue (contact saved successfully) export const NOTIFY_CONTACT_SAVED = { title: "Contact Saved", message: "Contact saved successfully", }; // Dynamic message template for contact not found (used in ContactEditView.vue) +// Used in: ContactEditView.vue (contact not found with DID) export const createContactNotFoundMessage = (did: string): string => `${NOTIFY_CONTACT_NOT_FOUND.message} ${did}`; // ContactAmountsView.vue constants +// Used in: ContactAmountsView.vue (settings retrieval error) export const NOTIFY_SETTINGS_RETRIEVAL_ERROR = { title: "Error", message: "There was an error retrieving your settings or contacts or gives.", }; +// Used in: ContactAmountsView.vue (server retrieval error) export const NOTIFY_SERVER_RETRIEVAL_ERROR = { title: "Error With Server", message: "Got an error retrieving your given time from the server.", }; +// Used in: ContactAmountsView.vue (confirmation restriction) export const NOTIFY_CONFIRMATION_RESTRICTION = { title: "Not Allowed", message: "Only the recipient can confirm final receipt.", diff --git a/src/views/ContactsView.vue b/src/views/ContactsView.vue index e0642858..756c6dd9 100644 --- a/src/views/ContactsView.vue +++ b/src/views/ContactsView.vue @@ -396,14 +396,28 @@ import { NOTIFY_CONTACTS_ADD_ERROR, NOTIFY_CONTACT_NO_DID, NOTIFY_CONTACT_INVALID_DID, + NOTIFY_CONTACTS_ADDED_VISIBLE, + NOTIFY_CONTACTS_ADDED, NOTIFY_CONTACT_IMPORT_ERROR, NOTIFY_CONTACT_IMPORT_CONFLICT, NOTIFY_CONTACT_IMPORT_CONSTRAINT, NOTIFY_CONTACT_SETTING_SAVE_ERROR, - NOTIFY_CONTACTS_ADDED_VISIBLE, - NOTIFY_CONTACTS_ADDED, NOTIFY_CONTACT_INFO_COPY, NOTIFY_CONTACTS_SELECT_TO_COPY, + NOTIFY_CONTACT_LINK_COPIED, + NOTIFY_BLANK_INVITE, + NOTIFY_INVITE_REGISTRATION_SUCCESS, + NOTIFY_CONTACTS_ADDED_CSV, + NOTIFY_CONTACT_INPUT_PARSE_ERROR, + NOTIFY_CONTACT_NO_CONTACT_FOUND, + NOTIFY_GIVES_LOAD_ERROR, + NOTIFY_MEETING_STATUS_ERROR, + NOTIFY_REGISTRATION_ERROR_FALLBACK, + NOTIFY_REGISTRATION_ERROR_GENERIC, + NOTIFY_VISIBILITY_ERROR_FALLBACK, + getRegisterPersonSuccessMessage, + getVisibilitySuccessMessage, + getGivesRetrievalErrorMessage, } from "@/constants/notifications"; @Component({ @@ -513,15 +527,7 @@ export default class ContactsView extends Vue { const importedInviteJwt = this.$route.query["inviteJwt"] as string; if (importedInviteJwt === "") { // this happens when a platform (eg iOS) doesn't include anything after the "=" in a shared link. - this.$notify( - { - group: "alert", - type: "danger", - title: "Blank Invite", - text: "The invite was not included, which can happen when your iOS device cuts off the link. Try pasting the full link into a browser.", - }, - 7000, - ); + this.notify.error(NOTIFY_BLANK_INVITE.message, TIMEOUTS.VERY_LONG); } else if (importedInviteJwt) { // make sure user is created if (!this.activeDid) { @@ -541,15 +547,7 @@ export default class ContactsView extends Vue { // Replace databaseUtil.updateDidSpecificSettings with mixin method await this.$saveUserSettings(this.activeDid, { isRegistered: true }); this.isRegistered = true; - this.$notify( - { - group: "alert", - type: "success", - title: "Registered", - text: "You are now registered.", - }, - 3000, - ); + this.notify.success(NOTIFY_INVITE_REGISTRATION_SUCCESS.message); // wait for a second before continuing so they see the registration message await new Promise((resolve) => setTimeout(resolve, 1000)); @@ -602,15 +600,7 @@ export default class ContactsView extends Vue { } else if (error.message) { message = error.message; } - this.$notify( - { - group: "alert", - type: "danger", - title: "Error with Invite", - text: message, - }, - -1, - ); + this.notify.error(message, TIMEOUTS.MODAL); } // if we're here, they haven't redirected anywhere, so we'll redirect here without a query parameter this.$router.push({ path: "/contacts" }); @@ -683,18 +673,7 @@ export default class ContactsView extends Vue { resp.status, resp.data, ); - this.$notify( - { - group: "alert", - type: "danger", - title: "Retrieval Error", - text: - "Got an error retrieving your " + - (useRecipient ? "given" : "received") + - " data from the server.", - }, - 3000, - ); + this.notify.error(getGivesRetrievalErrorMessage(useRecipient)); } }; @@ -744,15 +723,7 @@ export default class ContactsView extends Vue { } catch (error) { const fullError = "Error loading gives: " + errorStringForLog(error); logConsoleAndDb(fullError, true); - this.$notify( - { - group: "alert", - type: "danger", - title: "Load Error", - text: "Got an error loading your gives.", - }, - 3000, - ); + this.notify.error(NOTIFY_GIVES_LOAD_ERROR.message); } } @@ -797,15 +768,7 @@ export default class ContactsView extends Vue { } try { await Promise.all(lineAdded); - this.$notify( - { - group: "alert", - type: "success", - title: "Contacts Added", - text: "Each contact was added. Nothing was sent to the server.", - }, - 3000, // keeping it up so that the "visibility" message is seen - ); + this.notify.success(NOTIFY_CONTACTS_ADDED_CSV.message); } catch (e) { const fullError = "Error adding contacts from CSV: " + errorStringForLog(e); @@ -877,13 +840,13 @@ export default class ContactsView extends Vue { "Error adding contacts from array: " + errorStringForLog(e); logConsoleAndDb(fullError, true); // Use notification helper and constant - this.notify.error("The input could not be parsed."); + this.notify.error(NOTIFY_CONTACT_INPUT_PARSE_ERROR.message); } return; } // Use notification helper and constant - this.notify.error("No contact info was found in that input."); + this.notify.error(NOTIFY_CONTACT_NO_CONTACT_FOUND.message); } private async addContactFromEndorserMobileLine( @@ -985,31 +948,9 @@ export default class ContactsView extends Vue { } } - // note that this is also in DIDView.vue - private async confirmSetVisibility(contact: Contact, visibility: boolean) { - const visibilityPrompt = visibility - ? "Are you sure you want to make your activity visible to them?" - : "Are you sure you want to hide all your activity from them?"; - this.$notify( - { - group: "modal", - type: "confirm", - title: "Set Visibility", - text: visibilityPrompt, - onYes: async () => { - const success = await this.setVisibility(contact, visibility, true); - if (success) { - contact.seesMe = visibility; // didn't work inside setVisibility - } - }, - }, - -1, - ); - } - // note that this is also in DIDView.vue private async register(contact: Contact) { - this.$notify({ group: "alert", type: "toast", title: "Sent..." }, 1000); + this.notify.sent(); try { const regResult = await register( @@ -1023,33 +964,18 @@ export default class ContactsView extends Vue { // Replace PlatformServiceFactory with mixin method await this.$updateContact(contact.did, { registered: true }); - this.$notify( - { - group: "alert", - type: "success", - title: "Registration Success", - text: - (contact.name || "That unnamed person") + " has been registered.", - }, - 3000, - ); + this.notify.success(getRegisterPersonSuccessMessage(contact.name)); } else { - this.$notify( - { - group: "alert", - type: "danger", - title: "Registration Error", - text: - (regResult.error as string) || - "Something went wrong during registration.", - }, - -1, + this.notify.error( + (regResult.error as string) || + NOTIFY_REGISTRATION_ERROR_FALLBACK.message, + TIMEOUTS.MODAL, ); } } catch (error) { const fullError = "Error when registering: " + errorStringForLog(error); logConsoleAndDb(fullError, true); - let userMessage = "There was an error."; + let userMessage = NOTIFY_REGISTRATION_ERROR_GENERIC.message; const serverError = error as AxiosError; if (serverError.isAxiosError) { if ( @@ -1070,15 +996,7 @@ export default class ContactsView extends Vue { userMessage = error as string; } // Now set that error for the user to see. - this.$notify( - { - group: "alert", - type: "danger", - title: "Registration Error", - text: userMessage, - }, - -1, - ); + this.notify.error(userMessage, TIMEOUTS.MODAL); } } @@ -1098,18 +1016,8 @@ export default class ContactsView extends Vue { if (result.success) { //contact.seesMe = visibility; // why doesn't it affect the UI from here? if (showSuccessAlert) { - this.$notify( - { - group: "alert", - type: "success", - title: "Visibility Set", - text: - (contact.name || "That user") + - " can " + - (visibility ? "" : "not ") + - "see your activity.", - }, - 3000, + this.notify.success( + getVisibilitySuccessMessage(contact.name, visibility), ); } return true; @@ -1119,16 +1027,8 @@ export default class ContactsView extends Vue { result, ); const message = - (result.error as string) || "Could not set visibility on the server."; - this.$notify( - { - group: "alert", - type: "danger", - title: "Error Setting Visibility", - text: message, - }, - 5000, - ); + (result.error as string) || NOTIFY_VISIBILITY_ERROR_FALLBACK.message; + this.notify.error(message, TIMEOUTS.LONG); return false; } } @@ -1314,7 +1214,7 @@ export default class ContactsView extends Vue { .copy(contactsJwtUrl) .then(() => { // Use notification helper - this.notify.copied("contact link"); + this.notify.copied(NOTIFY_CONTACT_LINK_COPIED.message); }); } @@ -1371,7 +1271,7 @@ export default class ContactsView extends Vue { "Error checking meeting status:" + errorStringForLog(error), ); // Use notification helper - this.notify.error("There was an error checking your meeting status."); + this.notify.error(NOTIFY_MEETING_STATUS_ERROR.message); } }