From b8ca2a03fea75f609826e97fcd78e9be6d36daa4 Mon Sep 17 00:00:00 2001 From: Trent Larson Date: Thu, 6 Feb 2025 19:58:09 -0700 Subject: [PATCH] add 'isRegistered' flag to encrypted contents in an onboarding meeting --- src/components/MembersList.vue | 113 ++++++++++++++------------ src/views/OnboardMeetingListView.vue | 3 + src/views/OnboardMeetingSetupView.vue | 4 + 3 files changed, 68 insertions(+), 52 deletions(-) diff --git a/src/components/MembersList.vue b/src/components/MembersList.vue index 1e30590..b7673ad 100644 --- a/src/components/MembersList.vue +++ b/src/components/MembersList.vue @@ -171,13 +171,13 @@ interface Member { admitted: boolean; content: string; memberId: number; - registered: boolean; } interface DecryptedMember { member: Member; name: string; did: string; + isRegistered: boolean; } @Component @@ -258,6 +258,7 @@ export default class MembersList extends Vue { member: member, name: content.name, did: content.did, + isRegistered: !!content.isRegistered, }); if (isFirstEntry && content.did === this.activeDid) { this.isOrganizer = true; @@ -293,7 +294,7 @@ export default class MembersList extends Vue { group: "alert", type: "info", title: "Admission info", - text: "This is to register people and admit them to the meeting. A '+' symbol means they are not yet admitted and you can register and admit them. A '-' means you can remove them, but they will stay registered.", + text: "This is to register people in Time Safari and to admit them to the meeting. A '+' symbol means they are not yet admitted and you can register and admit them. A '-' means you can remove them, but they will stay registered.", }, 10000, ); @@ -331,67 +332,73 @@ export default class MembersList extends Vue { return this.contacts.find((contact) => contact.did === did); } - checkWhetherContactBeforeAdmitting(member: DecryptedMember) { - const contact = this.getContactFor(member.did); - if (!member.member.admitted && !contact) { + checkWhetherContactBeforeAdmitting(decrMember: DecryptedMember) { + const contact = this.getContactFor(decrMember.did); + if (!decrMember.member.admitted && !contact) { // If not a contact, show confirmation dialog - this.$notify({ - group: "modal", - type: "confirm", - title: "Add as Contact First?", - text: "This person is not in your contacts. Would you like to add them as a contact first?", - yesText: "Add as Contact", - noText: "Skip Adding Contact", - onYes: async () => { - await this.addAsContact(member); - // After adding as contact, proceed with admission - await this.toggleAdmission(member); - }, - onNo: async () => { - // If they choose not to add as contact, show second confirmation - this.$notify({ - group: "modal", - type: "confirm", - title: "Continue Without Adding?", - text: "Are you sure you want to proceed with admission even though they are not a contact?", - yesText: "Continue", - onYes: async () => { - await this.toggleAdmission(member); - }, - onCancel: async () => { - // Do nothing, effectively canceling the operation - }, + this.$notify( + { + group: "modal", + type: "confirm", + title: "Add as Contact First?", + text: "This person is not in your contacts. Would you like to add them as a contact first?", + yesText: "Add as Contact", + noText: "Skip Adding Contact", + onYes: async () => { + await this.addAsContact(decrMember); + // After adding as contact, proceed with admission + await this.toggleAdmission(decrMember); }, - -1, - ); - }, - }, - -1, - ); + onNo: async () => { + // If they choose not to add as contact, show second confirmation + this.$notify( + { + group: "modal", + type: "confirm", + title: "Continue Without Adding?", + text: "Are you sure you want to proceed with admission even though they are not a contact?", + yesText: "Continue", + onYes: async () => { + await this.toggleAdmission(decrMember); + }, + onCancel: async () => { + // Do nothing, effectively canceling the operation + }, + }, + -1, + ); + }, + }, + -1, + ); } else { // If already a contact, proceed directly with admission - this.toggleAdmission(member); + this.toggleAdmission(decrMember); } } - async toggleAdmission(member: DecryptedMember) { + async toggleAdmission(decrMember: DecryptedMember) { try { const headers = await getHeaders(this.activeDid); await this.axios.put( - `${this.apiServer}/api/partner/groupOnboardMember/${member.member.memberId}`, - { admitted: !member.member.admitted }, + `${this.apiServer}/api/partner/groupOnboardMember/${decrMember.member.memberId}`, + { admitted: !decrMember.member.admitted }, { headers }, ); // Update local state - member.member.admitted = !member.member.admitted; + decrMember.member.admitted = !decrMember.member.admitted; - const oldContact = this.getContactFor(member.did); + const oldContact = this.getContactFor(decrMember.did); // if admitted, now register that user if they are not registered - if (member.member.admitted && !oldContact?.registered) { + if ( + decrMember.member.admitted && + !decrMember.isRegistered && + !oldContact?.registered + ) { const contactOldOrNew: Contact = oldContact || { - did: member.did, - name: member.name, - } + did: decrMember.did, + name: decrMember.name, + }; try { const result = await register( this.activeDid, @@ -400,9 +407,9 @@ export default class MembersList extends Vue { contactOldOrNew, ); if (result.success) { - member.member.registered = true; + decrMember.isRegistered = true; if (oldContact) { - await db.contacts.update(member.did, { registered: true }); + await db.contacts.update(decrMember.did, { registered: true }); oldContact.registered = true; } this.$notify( @@ -417,16 +424,18 @@ export default class MembersList extends Vue { } else { throw result; } - // eslint-disable-next-line @typescript-eslint/no-explicit-any + // eslint-disable-next-line @typescript-eslint/no-explicit-any } catch (error: any) { // registration failure is likely explained by a message from the server - const additionalInfo = serverMessageForUser(error) || error?.error || ""; + const additionalInfo = + serverMessageForUser(error) || error?.error || ""; this.$notify( { group: "alert", type: "warning", title: "Registration failed", - text: "They were admitted to the meeting. However, registration failed. You can register them from the contacts screen. " + + text: + "They were admitted to the meeting. However, registration failed. You can register them from the contacts screen. " + additionalInfo, }, 12000, diff --git a/src/views/OnboardMeetingListView.vue b/src/views/OnboardMeetingListView.vue index 35e2805..480dc1c 100644 --- a/src/views/OnboardMeetingListView.vue +++ b/src/views/OnboardMeetingListView.vue @@ -126,6 +126,7 @@ export default class OnboardMeetingListView extends Vue { attendingMeeting: Meeting | null = null; firstName = ""; isLoading = false; + isRegistered = false; meetings: Meeting[] = []; password = ""; selectedMeeting: Meeting | null = null; @@ -136,6 +137,7 @@ export default class OnboardMeetingListView extends Vue { this.activeDid = settings.activeDid || ""; this.apiServer = settings.apiServer || ""; this.firstName = settings.firstName || ""; + this.isRegistered = !!settings.isRegistered; await this.fetchMeetings(); } @@ -232,6 +234,7 @@ export default class OnboardMeetingListView extends Vue { const memberData = { name: this.firstName, did: this.activeDid, + isRegistered: this.isRegistered, }; const memberDataString = JSON.stringify(memberData); const encryptedMemberData = await encryptMessage( diff --git a/src/views/OnboardMeetingSetupView.vue b/src/views/OnboardMeetingSetupView.vue index 8b1c004..a81c760 100644 --- a/src/views/OnboardMeetingSetupView.vue +++ b/src/views/OnboardMeetingSetupView.vue @@ -273,6 +273,7 @@ export default class OnboardMeetingView extends Vue { apiServer = ""; isDeleting = false; isLoading = true; + isRegistered = false; showDeleteConfirm = false; fullName = ""; get minDateTime() { @@ -286,6 +287,7 @@ export default class OnboardMeetingView extends Vue { this.activeDid = settings.activeDid || ""; this.apiServer = settings.apiServer || ""; this.fullName = settings.firstName || ""; + this.isRegistered = !!settings.isRegistered; await this.fetchCurrentMeeting(); this.isLoading = false; @@ -409,6 +411,7 @@ export default class OnboardMeetingView extends Vue { const content = { name: this.newOrUpdatedMeeting.userFullName, did: this.activeDid, + isRegistered: this.isRegistered, }; const encryptedContent = await encryptMessage( JSON.stringify(content), @@ -598,6 +601,7 @@ export default class OnboardMeetingView extends Vue { const content = { name: this.newOrUpdatedMeeting.userFullName, did: this.activeDid, + isRegistered: this.isRegistered, }; const encryptedContent = await encryptMessage( JSON.stringify(content),