From dd281e78fdd3b215664ec274f2c00f0482cdba55 Mon Sep 17 00:00:00 2001 From: Trent Larson Date: Mon, 3 Feb 2025 15:31:00 -0700 Subject: [PATCH] show when an onboarding member is already in a meeting, and allow them to leave --- src/main.ts | 2 + src/views/OnboardMeetingListView.vue | 110 ++++++++++++++++++++++++--- 2 files changed, 101 insertions(+), 11 deletions(-) diff --git a/src/main.ts b/src/main.ts index 2aa9c6b..df2f5d3 100644 --- a/src/main.ts +++ b/src/main.ts @@ -74,6 +74,7 @@ import { faPlus, faQuestion, faQrcode, + faRightFromBracket, faRotate, faShareNodes, faSpinner, @@ -153,6 +154,7 @@ library.add( faQrcode, faQuestion, faRotate, + faRightFromBracket, faShareNodes, faSpinner, faSquare, diff --git a/src/views/OnboardMeetingListView.vue b/src/views/OnboardMeetingListView.vue index ab6a6eb..4984f3a 100644 --- a/src/views/OnboardMeetingListView.vue +++ b/src/views/OnboardMeetingListView.vue @@ -13,13 +13,32 @@ +
+

You are in this meeting.

+
+

{{ attendingMeeting.name }}

+
+ +
+
+
+
+ class="p-4 bg-white rounded-lg shadow hover:shadow-md transition-shadow cursor-pointer" + @click="promptPassword(meeting)" + >

{{ meeting.name }}

-

Group ID: {{ meeting.groupId }}

@@ -32,6 +51,7 @@

Enter Meeting Password

void; - meetings: Meeting[] = []; - isLoading = false; - showPasswordDialog = false; - password = ''; - selectedMeeting: Meeting | null = null; activeDid = ''; apiServer = ''; + attendingMeeting: Meeting | null = null; firstName = ''; + isLoading = false; + meetings: Meeting[] = []; + password = ''; + selectedMeeting: Meeting | null = null; + showPasswordDialog = false; async created() { const settings = await retrieveSettingsForActiveAccount(); @@ -99,14 +121,40 @@ export default class OnboardMeetingListView extends Vue { async fetchMeetings() { this.isLoading = true; try { + // get the meeting that the user is attending const headers = await getHeaders(this.activeDid); const response = await this.axios.get( - this.apiServer + '/api/partner/groupsOnboarding', + this.apiServer + '/api/partner/groupOnboardMember', { headers } ); + + if (response.data?.data) { + // they're in a meeting already + const attendingMeetingId = response.data.data.groupId; + // retrieve the meeting details + const headers2 = await getHeaders(this.activeDid); + const response2 = await this.axios.get( + this.apiServer + '/api/partner/groupOnboard/' + attendingMeetingId, + { headers: headers2 } + ); + + if (response2.data?.data) { + this.attendingMeeting = response2.data.data; + return; + } else { + // this should never happen + logConsoleAndDb('Error fetching meeting for user after saying they are in one.', true); + } + } + + const headers2 = await getHeaders(this.activeDid); + const response2 = await this.axios.get( + this.apiServer + '/api/partner/groupsOnboarding', + { headers: headers2 } + ); - if (response.data && response.data.data) { - this.meetings = response.data.data; + if (response2.data?.data) { + this.meetings = response2.data.data; } } catch (error) { logConsoleAndDb('Error fetching meetings: ' + errorStringForLog(error), true); @@ -128,6 +176,12 @@ export default class OnboardMeetingListView extends Vue { this.password = ''; this.selectedMeeting = meeting; this.showPasswordDialog = true; + nextTick(() => { + const input = this.$refs.passwordInput as HTMLInputElement; + if (input) { + input.focus(); + } + }); } cancelPasswordDialog() { @@ -195,5 +249,39 @@ export default class OnboardMeetingListView extends Vue { ); } } + + async leaveMeeting() { + try { + const headers = await getHeaders(this.activeDid); + await this.axios.delete( + this.apiServer + '/api/partner/groupOnboardMember', + { headers } + ); + + this.attendingMeeting = null; + await this.fetchMeetings(); + + this.$notify( + { + group: 'alert', + type: 'success', + title: 'Success', + text: 'Successfully left the meeting.', + }, + 5000 + ); + } catch (error) { + logConsoleAndDb('Error leaving meeting: ' + errorStringForLog(error), true); + this.$notify( + { + group: 'alert', + type: 'danger', + title: 'Error', + text: serverMessageForUser(error) || 'Failed to leave meeting.', + }, + 5000 + ); + } + } } \ No newline at end of file