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