diff --git a/src/components/MembersList.vue b/src/components/MembersList.vue new file mode 100644 index 0000000..d7aa884 --- /dev/null +++ b/src/components/MembersList.vue @@ -0,0 +1,107 @@ + + + \ No newline at end of file diff --git a/src/views/OnboardMeetingListView.vue b/src/views/OnboardMeetingListView.vue index 78903ed..ab6a6eb 100644 --- a/src/views/OnboardMeetingListView.vue +++ b/src/views/OnboardMeetingListView.vue @@ -138,6 +138,8 @@ export default class OnboardMeetingListView extends Vue { async submitPassword() { if (!this.selectedMeeting) { + // this should never happen + logConsoleAndDb('No meeting selected when prompting for password, which should never happen.', true); return; } diff --git a/src/views/OnboardMeetingMembersView.vue b/src/views/OnboardMeetingMembersView.vue index 6296ed6..db0a34b 100644 --- a/src/views/OnboardMeetingMembersView.vue +++ b/src/views/OnboardMeetingMembersView.vue @@ -17,13 +17,8 @@ Back to Meetings - -
- -
- -
+
{{ errorMessage }}
@@ -33,20 +28,12 @@
-
-
-

{{ member.name }}

-

DID: {{ member.did }}

-
- -

- No members found in this meeting -

-

- That password failed. You may be in the wrong meeting. Go back and try again. -

-
+ @@ -54,37 +41,17 @@ import { Component, Vue } from 'vue-facing-decorator'; import QuickNav from '@/components/QuickNav.vue'; import TopMessage from '@/components/TopMessage.vue'; -import { logConsoleAndDb, retrieveSettingsForActiveAccount } from '@/db/index'; -import { errorStringForLog, getHeaders, serverMessageForUser } from '@/libs/endorserServer'; -import { decryptMessage } from '@/libs/crypto'; - -interface Member { - memberId: number; - content: string; -} - -interface DecryptedMember { - memberId: number; - name: string; - did: string; -} +import MembersList from '@/components/MembersList.vue'; @Component({ components: { QuickNav, TopMessage, + MembersList, }, }) export default class OnboardMeetingMembersView extends Vue { - $notify!: (notification: { group: string; type: string; title: string; text: string }, timeout?: number) => void; - - activeDid = ''; - apiServer = ''; - decryptedMembers: DecryptedMember[] = []; - decryptFailure = false; errorMessage = ''; - isLoading = false; - members: Member[] = []; get groupId(): string { return this.$route.params.groupId as string; @@ -103,55 +70,10 @@ export default class OnboardMeetingMembersView extends Vue { this.errorMessage = 'The password is missing. Go back and try again.'; return; } - - const settings = await retrieveSettingsForActiveAccount(); - this.activeDid = settings.activeDid || ''; - this.apiServer = settings.apiServer || ''; - await this.fetchMembers(); } - async fetchMembers() { - this.isLoading = true; - this.errorMessage = ''; - - try { - const headers = await getHeaders(this.activeDid); - const response = await this.axios.get( - `${this.apiServer}/api/partner/groupOnboardMembers/`, - { headers } - ); - - if (response.data && response.data.data) { - this.members = response.data.data; - await this.decryptMemberContents(); - } else { - throw { response: response }; - } - } catch (error) { - logConsoleAndDb('Error fetching members: ' + errorStringForLog(error), true); - this.errorMessage = serverMessageForUser(error) || 'Failed to fetch members.'; - } finally { - this.isLoading = false; - } - } - - async decryptMemberContents() { - this.decryptedMembers = []; - - for (const member of this.members) { - try { - const decryptedContent = await decryptMessage(member.content, this.password); - const content = JSON.parse(decryptedContent); - - this.decryptedMembers.push({ - memberId: member.memberId, - name: content.name, - did: content.did, - }); - } catch (error) { - this.decryptFailure = true; - } - } + handleError(message: string) { + this.errorMessage = message; } } \ No newline at end of file diff --git a/src/views/OnboardMeetingSetupView.vue b/src/views/OnboardMeetingSetupView.vue index 7d864a1..d213978 100644 --- a/src/views/OnboardMeetingSetupView.vue +++ b/src/views/OnboardMeetingSetupView.vue @@ -9,7 +9,10 @@ -
+

Current Meeting

@@ -19,7 +22,7 @@ title="Edit Meeting" > - Edit Meeting + {{ isInCreateMode() ? 'Create Meeting' : 'Edit Meeting' }}
- - - Open page that meeting members see -
+
@@ -77,10 +73,13 @@
-
-

{{ isEditingOrCreating() ? 'Edit Meeting' : 'Create New Meeting' }}

+
+

{{ isInCreateMode() ? 'Create New Meeting' : 'Edit Meeting' }}

-
+
- {{ isLoading ? (isEditingOrCreating() ? 'Updating...' : 'Creating...') : (isEditingOrCreating() ? 'Update Meeting' : 'Create Meeting') }} + {{ isLoading ? (isInCreateMode() ? 'Creating...' : 'Updating...' ) : (isInCreateMode() ? 'Create Meeting' : 'Update Meeting') }}
+ +
+
+

Meeting Members

+
+ + Open page that meeting members see + + + +
+
@@ -159,6 +179,7 @@ import { Component, Vue } from 'vue-facing-decorator'; import QuickNav from '@/components/QuickNav.vue'; import TopMessage from '@/components/TopMessage.vue'; +import MembersList from '@/components/MembersList.vue'; import { logConsoleAndDb, retrieveSettingsForActiveAccount } from '@/db/index'; import { errorStringForLog, getHeaders, serverMessageForUser } from '@/libs/endorserServer'; import { encryptMessage } from '@/libs/crypto'; @@ -182,6 +203,7 @@ interface MeetingSetupInfo { components: { QuickNav, TopMessage, + MembersList, }, }) export default class OnboardMeetingView extends Vue { @@ -211,7 +233,11 @@ export default class OnboardMeetingView extends Vue { this.isLoading = false; } - isEditingOrCreating(): boolean { + isInCreateMode(): boolean { + return this.newOrUpdatedMeeting != null && this.currentMeeting == null; + } + + isInEditOrCreateMode(): boolean { return this.newOrUpdatedMeeting != null; } @@ -256,13 +282,11 @@ export default class OnboardMeetingView extends Vue { ); if (response?.data?.data) { - console.log('Response data', response.data.data); this.currentMeeting = { ...response.data.data, userFullName: this.fullName, password: this.currentMeeting?.password || "", }; - console.log('Current meeting', this.currentMeeting); } else { // no meeting found this.newOrUpdatedMeeting = this.blankMeeting(); @@ -345,6 +369,7 @@ export default class OnboardMeetingView extends Vue { ...this.newOrUpdatedMeeting, groupId: response.data.success.groupId, }; + this.newOrUpdatedMeeting = null; this.$notify( { @@ -436,7 +461,6 @@ export default class OnboardMeetingView extends Vue { startEditing() { // Populate form with existing meeting data if (this.currentMeeting) { - console.log('Current meeting', this.currentMeeting); const localExpiresAt = new Date(this.currentMeeting.expiresAt); this.newOrUpdatedMeeting = { name: this.currentMeeting.name, @@ -520,14 +544,12 @@ export default class OnboardMeetingView extends Vue { ); if (response.data && response.data.success) { - console.log('Updated meeting', response.data); // Update the current meeting with only the necessary fields this.currentMeeting = { ...this.newOrUpdatedMeeting, groupId: this.currentMeeting?.groupId || "", }; this.newOrUpdatedMeeting = null; - console.log('Updated meeting now', this.currentMeeting); } else { throw { response: response }; } @@ -547,5 +569,17 @@ export default class OnboardMeetingView extends Vue { this.isLoading = false; } } + + handleMembersError(message: string) { + this.$notify( + { + group: 'alert', + type: 'danger', + title: 'Error', + text: message, + }, + 5000 + ); + } } \ No newline at end of file