| 
						
						
						
					 | 
					@ -1,4 +1,5 @@ | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					<template> | 
					 | 
					 | 
					<template> | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					 | 
					 | 
					 | 
					<div> | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					  <div class="space-y-4"> | 
					 | 
					 | 
					  <div class="space-y-4"> | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					    <!-- Loading State --> | 
					 | 
					 | 
					    <!-- Loading State --> | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					    <div | 
					 | 
					 | 
					    <div | 
				
			
			
		
	
	
		
		
			
				
					| 
						
							
								
							
						
						
							
								
							
						
						
					 | 
					@ -48,7 +49,7 @@ | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					        <button | 
					 | 
					 | 
					        <button | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					          class="text-sm bg-gradient-to-b from-slate-400 to-slate-700 shadow-[inset_0_-1px_0_0_rgba(0,0,0,0.5)] text-white px-3 py-1.5 rounded-md" | 
					 | 
					 | 
					          class="text-sm bg-gradient-to-b from-slate-400 to-slate-700 shadow-[inset_0_-1px_0_0_rgba(0,0,0,0.5)] text-white px-3 py-1.5 rounded-md" | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					          title="Refresh members list now" | 
					 | 
					 | 
					          title="Refresh members list now" | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					          @click="manualRefresh" | 
					 | 
					 | 
					          @click="refreshData(false)" | 
				
			
			
				
				
			
		
	
		
		
	
		
		
			
				
					 | 
					 | 
					        > | 
					 | 
					 | 
					        > | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					          <font-awesome icon="rotate" :class="{ 'fa-spin': isLoading }" /> | 
					 | 
					 | 
					          <font-awesome icon="rotate" :class="{ 'fa-spin': isLoading }" /> | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					          Refresh | 
					 | 
					 | 
					          Refresh | 
				
			
			
		
	
	
		
		
			
				
					| 
						
							
								
							
						
						
							
								
							
						
						
					 | 
					@ -163,7 +164,7 @@ | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					        <button | 
					 | 
					 | 
					        <button | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					          class="text-sm bg-gradient-to-b from-slate-400 to-slate-700 shadow-[inset_0_-1px_0_0_rgba(0,0,0,0.5)] text-white px-3 py-1.5 rounded-md" | 
					 | 
					 | 
					          class="text-sm bg-gradient-to-b from-slate-400 to-slate-700 shadow-[inset_0_-1px_0_0_rgba(0,0,0,0.5)] text-white px-3 py-1.5 rounded-md" | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					          title="Refresh members list now" | 
					 | 
					 | 
					          title="Refresh members list now" | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					          @click="manualRefresh" | 
					 | 
					 | 
					          @click="refreshData(false)" | 
				
			
			
				
				
			
		
	
		
		
	
		
		
			
				
					 | 
					 | 
					        > | 
					 | 
					 | 
					        > | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					          <font-awesome icon="rotate" :class="{ 'fa-spin': isLoading }" /> | 
					 | 
					 | 
					          <font-awesome icon="rotate" :class="{ 'fa-spin': isLoading }" /> | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					          Refresh | 
					 | 
					 | 
					          Refresh | 
				
			
			
		
	
	
		
		
			
				
					| 
						
						
						
							
								
							
						
					 | 
					@ -177,43 +178,44 @@ | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					    </div> | 
					 | 
					 | 
					    </div> | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					  </div> | 
					 | 
					 | 
					  </div> | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					
 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					  <!-- Admit Pending Members Dialog Component --> | 
					 | 
					 | 
					  <!-- This Admit component is for the organizer to admit pending members to the meeting --> | 
				
			
			
				
				
			
		
	
		
		
	
		
		
			
				
					 | 
					 | 
					  <AdmitPendingMembersDialog | 
					 | 
					 | 
					  <AdmitPendingMembersDialog | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					    ref="admitPendingMembersDialog" | 
					 | 
					 | 
					    ref="admitPendingMembersDialog" | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					    :active-did="activeDid" | 
					 | 
					 | 
					    :active-did="activeDid" | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					    :api-server="apiServer" | 
					 | 
					 | 
					    :api-server="apiServer" | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					    :pending-members-data="pendingMembersData" | 
					 | 
					 | 
					    @close="closeMemberSelectionDialogCallback" | 
				
			
			
				
				
			
		
	
		
		
			
				
					 | 
					 | 
					    @close="closeAdmitPendingDialog" | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
	
		
		
			
				
					 | 
					 | 
					  /> | 
					 | 
					 | 
					  /> | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					 | 
					 | 
					 | 
					  <!-- This Bulk Visibility component is for non-organizer members to add other members to their contacts and set their visibility --> | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					  <SetBulkVisibilityDialog | 
					 | 
					 | 
					  <SetBulkVisibilityDialog | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					    :visible="visibleBulkVisibilityDialog" | 
					 | 
					 | 
					    ref="setBulkVisibilityDialog" | 
				
			
			
				
				
			
		
	
		
		
	
		
		
			
				
					 | 
					 | 
					    :active-did="activeDid" | 
					 | 
					 | 
					    :active-did="activeDid" | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					    :api-server="apiServer" | 
					 | 
					 | 
					    :api-server="apiServer" | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					    :members-data="pendingMembersData" | 
					 | 
					 | 
					    @close="closeMemberSelectionDialogCallback" | 
				
			
			
				
				
			
		
	
		
		
			
				
					 | 
					 | 
					    @close="closeSetBulkVisibilityDialog" | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
	
		
		
			
				
					 | 
					 | 
					  /> | 
					 | 
					 | 
					  /> | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					 | 
					 | 
					 | 
					</div> | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					</template> | 
					 | 
					 | 
					</template> | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					
 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					<script lang="ts"> | 
					 | 
					 | 
					<script lang="ts"> | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					import { Component, Vue, Prop, Emit } from "vue-facing-decorator"; | 
					 | 
					 | 
					import { Component, Vue, Prop, Emit } from "vue-facing-decorator"; | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					
 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					 | 
					 | 
					 | 
					import { NotificationIface } from "@/constants/app"; | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					 | 
					 | 
					 | 
					import { | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					 | 
					 | 
					 | 
					  NOTIFY_ADD_CONTACT_FIRST, | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					 | 
					 | 
					 | 
					  NOTIFY_CONTINUE_WITHOUT_ADDING, | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					 | 
					 | 
					 | 
					} from "@/constants/notifications"; | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					 | 
					 | 
					 | 
					import { SOMEONE_UNNAMED } from "@/constants/entities"; | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					import { | 
					 | 
					 | 
					import { | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					  errorStringForLog, | 
					 | 
					 | 
					  errorStringForLog, | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					  getHeaders, | 
					 | 
					 | 
					  getHeaders, | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					  register, | 
					 | 
					 | 
					  register, | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					  serverMessageForUser, | 
					 | 
					 | 
					  serverMessageForUser, | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					} from "../libs/endorserServer"; | 
					 | 
					 | 
					} from "@/libs/endorserServer"; | 
				
			
			
				
				
			
		
	
		
		
			
				
					
					 | 
					 | 
					import { decryptMessage } from "../libs/crypto"; | 
					 | 
					 | 
					import { decryptMessage } from "@/libs/crypto"; | 
				
			
			
				
				
			
		
	
		
		
			
				
					
					 | 
					 | 
					import { Contact } from "../db/tables/contacts"; | 
					 | 
					 | 
					import { Contact } from "@/db/tables/contacts"; | 
				
			
			
				
				
			
		
	
		
		
			
				
					
					 | 
					 | 
					import * as libsUtil from "../libs/util"; | 
					 | 
					 | 
					import { MemberData } from "@/interfaces"; | 
				
			
			
				
				
			
		
	
		
		
			
				
					
					 | 
					 | 
					import { NotificationIface } from "../constants/app"; | 
					 | 
					 | 
					import * as libsUtil from "@/libs/util"; | 
				
			
			
				
				
			
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
			
				
					 | 
					 | 
					import { PlatformServiceMixin } from "@/utils/PlatformServiceMixin"; | 
					 | 
					 | 
					import { PlatformServiceMixin } from "@/utils/PlatformServiceMixin"; | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					import { createNotifyHelpers, TIMEOUTS } from "@/utils/notify"; | 
					 | 
					 | 
					import { createNotifyHelpers, TIMEOUTS } from "@/utils/notify"; | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					import { | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					  NOTIFY_ADD_CONTACT_FIRST, | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					  NOTIFY_CONTINUE_WITHOUT_ADDING, | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					} from "@/constants/notifications"; | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					import { SOMEONE_UNNAMED } from "@/constants/entities"; | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					import AdmitPendingMembersDialog from "./AdmitPendingMembersDialog.vue"; | 
					 | 
					 | 
					import AdmitPendingMembersDialog from "./AdmitPendingMembersDialog.vue"; | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					import SetBulkVisibilityDialog from "./SetBulkVisibilityDialog.vue"; | 
					 | 
					 | 
					import SetBulkVisibilityDialog from "./SetBulkVisibilityDialog.vue"; | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					
 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
	
		
		
			
				
					| 
						
							
								
							
						
						
							
								
							
						
						
					 | 
					@ -263,16 +265,6 @@ export default class MembersList extends Vue { | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					  activeDid = ""; | 
					 | 
					 | 
					  activeDid = ""; | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					  apiServer = ""; | 
					 | 
					 | 
					  apiServer = ""; | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					
 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					  // Admit Pending Members Dialog state | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					  pendingMembersData: Array<{ | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					    did: string; | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					    name: string; | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					    isContact: boolean; | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					    member: { memberId: string }; | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					  }> = []; | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					  visibleBulkVisibilityDialog = false; | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					  // Auto-refresh functionality | 
					 | 
					 | 
					  // Auto-refresh functionality | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					  countdownTimer = 10; | 
					 | 
					 | 
					  countdownTimer = 10; | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					  autoRefreshInterval: NodeJS.Timeout | null = null; | 
					 | 
					 | 
					  autoRefreshInterval: NodeJS.Timeout | null = null; | 
				
			
			
		
	
	
		
		
			
				
					| 
						
							
								
							
						
						
							
								
							
						
						
					 | 
					@ -302,16 +294,6 @@ export default class MembersList extends Vue { | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					    this.refreshData(); | 
					 | 
					 | 
					    this.refreshData(); | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					  } | 
					 | 
					 | 
					  } | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					
 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					  async refreshData(showPendingEvenIfAllWereIgnored = false) { | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					    // Force refresh both contacts and members | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					    this.contacts = await this.$getAllContacts(); | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					    await this.fetchMembers(); | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					    // Check if we should show the admit pending members dialog first | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					    this.checkAndShowAdmitPendingDialog(showPendingEvenIfAllWereIgnored); | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					  } | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					  async fetchMembers() { | 
					 | 
					 | 
					  async fetchMembers() { | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					    try { | 
					 | 
					 | 
					    try { | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					      this.isLoading = true; | 
					 | 
					 | 
					      this.isLoading = true; | 
				
			
			
		
	
	
		
		
			
				
					| 
						
							
								
							
						
						
							
								
							
						
						
					 | 
					@ -408,8 +390,22 @@ export default class MembersList extends Vue { | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					        ); | 
					 | 
					 | 
					        ); | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					      } | 
					 | 
					 | 
					      } | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					    } else { | 
					 | 
					 | 
					    } else { | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					      // non-organizers only get visible members from server | 
					 | 
					 | 
					      // non-organizers only get visible members from server, plus themselves | 
				
			
			
				
				
			
		
	
		
		
			
				
					
					 | 
					 | 
					      members = this.decryptedMembers; | 
					 | 
					 | 
					
 | 
				
			
			
				
				
			
		
	
		
		
	
		
		
	
		
		
			
				
					 | 
					 | 
					 | 
					 | 
					 | 
					      // this is a stub for this user just in case they are waiting to get in | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					 | 
					 | 
					 | 
					      // which is especially useful so they can see their own DID | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					 | 
					 | 
					 | 
					      const currentUser: DecryptedMember = { | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					 | 
					 | 
					 | 
					        member: { | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					 | 
					 | 
					 | 
					          admitted: false, | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					 | 
					 | 
					 | 
					          content: "{}", | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					 | 
					 | 
					 | 
					          memberId: -1, | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					 | 
					 | 
					 | 
					        }, | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					 | 
					 | 
					 | 
					        name: this.firstName, | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					 | 
					 | 
					 | 
					        did: this.activeDid, | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					 | 
					 | 
					 | 
					        isRegistered: false, | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					 | 
					 | 
					 | 
					      }; | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					 | 
					 | 
					 | 
					      const otherMembersPlusUser = [ currentUser, ...this.decryptedMembers ]; | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					 | 
					 | 
					 | 
					      members = otherMembersPlusUser; | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					    } | 
					 | 
					 | 
					    } | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					
 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					    // Sort members according to priority: | 
					 | 
					 | 
					    // Sort members according to priority: | 
				
			
			
		
	
	
		
		
			
				
					| 
						
							
								
							
						
						
							
								
							
						
						
					 | 
					@ -462,61 +458,51 @@ export default class MembersList extends Vue { | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					    return this.contacts.find((contact) => contact.did === did); | 
					 | 
					 | 
					    return this.contacts.find((contact) => contact.did === did); | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					  } | 
					 | 
					 | 
					  } | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					
 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					  getPendingMembers(): { | 
					 | 
					 | 
					  getPendingMembersToAdmit(): MemberData[] { | 
				
			
			
				
				
			
		
	
		
		
			
				
					 | 
					 | 
					    did: string; | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					    name: string; | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					    isContact: boolean; | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					    member: { memberId: string }; | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					  }[] { | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
	
		
		
			
				
					 | 
					 | 
					    return this.decryptedMembers | 
					 | 
					 | 
					    return this.decryptedMembers | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					      .filter((member) => { | 
					 | 
					 | 
					      .filter((member) =>  | 
				
			
			
				
				
			
		
	
		
		
			
				
					
					 | 
					 | 
					        // Exclude the current user | 
					 | 
					 | 
					        member.did !== this.activeDid && !member.member.admitted | 
				
			
			
				
				
			
		
	
		
		
			
				
					
					 | 
					 | 
					        if (member.did === this.activeDid) { | 
					 | 
					 | 
					      ) | 
				
			
			
				
				
			
		
	
		
		
			
				
					
					 | 
					 | 
					          return false; | 
					 | 
					 | 
					      .map(this.convertDecryptedMemberToMemberData); | 
				
			
			
				
				
			
		
	
		
		
			
				
					 | 
					 | 
					        } | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					        // Only include non-admitted members | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					        return !member.member.admitted; | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					      }) | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					      .map((member) => ({ | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					        did: member.did, | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					        name: member.name, | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					        isContact: !!this.getContactFor(member.did), | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					        member: { | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					          memberId: member.member.memberId.toString(), | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					        }, | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					      })); | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
			
				
					 | 
					 | 
					  } | 
					 | 
					 | 
					  } | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					
 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					  getNonContactMembers(): { | 
					 | 
					 | 
					  getNonContactMembers(): MemberData[] { | 
				
			
			
				
				
			
		
	
		
		
			
				
					 | 
					 | 
					    did: string; | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					    name: string; | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					    isContact: boolean; | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					    member: { memberId: string }; | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					  }[] { | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
	
		
		
			
				
					 | 
					 | 
					    return this.decryptedMembers | 
					 | 
					 | 
					    return this.decryptedMembers | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					      .filter((member) => !this.getContactFor(member.did)) | 
					 | 
					 | 
					      .filter((member) => | 
				
			
			
				
				
			
		
	
		
		
			
				
					
					 | 
					 | 
					      .map((member) => ({ | 
					 | 
					 | 
					        member.did !== this.activeDid && !this.getContactFor(member.did) | 
				
			
			
				
				
			
		
	
		
		
			
				
					
					 | 
					 | 
					        did: member.did, | 
					 | 
					 | 
					      ) | 
				
			
			
				
				
			
		
	
		
		
			
				
					
					 | 
					 | 
					        name: member.name, | 
					 | 
					 | 
					      .map(this.convertDecryptedMemberToMemberData); | 
				
			
			
				
				
			
		
	
		
		
			
				
					
					 | 
					 | 
					        isContact: false, | 
					 | 
					 | 
					  } | 
				
			
			
				
				
			
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
			
				
					 | 
					 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					 | 
					 | 
					 | 
					  convertDecryptedMemberToMemberData( | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					 | 
					 | 
					 | 
					    decryptedMember: DecryptedMember, | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					 | 
					 | 
					 | 
					  ): MemberData { | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					 | 
					 | 
					 | 
					    return { | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					 | 
					 | 
					 | 
					      did: decryptedMember.did, | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					 | 
					 | 
					 | 
					      name: decryptedMember.name, | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					 | 
					 | 
					 | 
					      isContact: !!this.getContactFor(decryptedMember.did), | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					      member: { | 
					 | 
					 | 
					      member: { | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					          memberId: member.member.memberId.toString(), | 
					 | 
					 | 
					        memberId: decryptedMember.member.memberId.toString(), | 
				
			
			
				
				
			
		
	
		
		
	
		
		
			
				
					 | 
					 | 
					      }, | 
					 | 
					 | 
					      }, | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					      })); | 
					 | 
					 | 
					    }; | 
				
			
			
				
				
			
		
	
		
		
	
		
		
			
				
					 | 
					 | 
					  } | 
					 | 
					 | 
					  } | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					
 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					  /** | 
					 | 
					 | 
					  /** | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					   * Show the admit pending members dialog if conditions are met | 
					 | 
					 | 
					   * Show the admit pending members dialog if conditions are met | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					   */ | 
					 | 
					 | 
					   */ | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					  checkAndShowAdmitPendingDialog(showPendingEvenIfAllWereIgnored = false) { | 
					 | 
					 | 
					  async refreshData(bypassPromptIfAllWereIgnored = true) { | 
				
			
			
				
				
			
		
	
		
		
	
		
		
			
				
					 | 
					 | 
					 | 
					 | 
					 | 
					    // Force refresh both contacts and members | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					 | 
					 | 
					 | 
					    this.contacts = await this.$getAllContacts(); | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					 | 
					 | 
					 | 
					    await this.fetchMembers(); | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					    const pendingMembers = this.isOrganizer | 
					 | 
					 | 
					    const pendingMembers = this.isOrganizer | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					      ? this.getPendingMembers() | 
					 | 
					 | 
					      ? this.getPendingMembersToAdmit() | 
				
			
			
				
				
			
		
	
		
		
	
		
		
			
				
					 | 
					 | 
					      : this.getNonContactMembers(); | 
					 | 
					 | 
					      : this.getNonContactMembers(); | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					    if (pendingMembers.length === 0) { | 
					 | 
					 | 
					    if (pendingMembers.length === 0) { | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					      this.startAutoRefresh(); | 
					 | 
					 | 
					      this.startAutoRefresh(); | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					      return; | 
					 | 
					 | 
					      return; | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					    } | 
					 | 
					 | 
					    } | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					    if (!showPendingEvenIfAllWereIgnored) { | 
					 | 
					 | 
					    if (bypassPromptIfAllWereIgnored) { | 
				
			
			
				
				
			
		
	
		
		
	
		
		
			
				
					 | 
					 | 
					      // only show if there are pending members that have not been ignored | 
					 | 
					 | 
					      // only show if there are pending members that have not been ignored | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					      const pendingMembersNotIgnored = pendingMembers.filter( | 
					 | 
					 | 
					      const pendingMembersNotIgnored = pendingMembers.filter( | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					        (member) => !this.previousMemberDidsIgnored.includes(member.did), | 
					 | 
					 | 
					        (member) => !this.previousMemberDidsIgnored.includes(member.did), | 
				
			
			
		
	
	
		
		
			
				
					| 
						
						
						
							
								
							
						
					 | 
					@ -528,31 +514,21 @@ export default class MembersList extends Vue { | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					      } | 
					 | 
					 | 
					      } | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					    } | 
					 | 
					 | 
					    } | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					    this.stopAutoRefresh(); | 
					 | 
					 | 
					    this.stopAutoRefresh(); | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					    this.pendingMembersData = pendingMembers; | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					    if (this.isOrganizer) { | 
					 | 
					 | 
					    if (this.isOrganizer) { | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					      ( | 
					 | 
					 | 
					      ( | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					        this.$refs.admitPendingMembersDialog as AdmitPendingMembersDialog | 
					 | 
					 | 
					        this.$refs.admitPendingMembersDialog as AdmitPendingMembersDialog | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					      ).open(); | 
					 | 
					 | 
					      ).open(pendingMembers); | 
				
			
			
				
				
			
		
	
		
		
	
		
		
			
				
					 | 
					 | 
					    } else { | 
					 | 
					 | 
					    } else { | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					      this.visibleBulkVisibilityDialog = true; | 
					 | 
					 | 
					      ( | 
				
			
			
				
				
			
		
	
		
		
	
		
		
			
				
					 | 
					 | 
					 | 
					 | 
					 | 
					        this.$refs.setBulkVisibilityDialog as SetBulkVisibilityDialog | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					 | 
					 | 
					 | 
					      ).open(pendingMembers); | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					    } | 
					 | 
					 | 
					    } | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					  } | 
					 | 
					 | 
					  } | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					
 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					  // Admit Pending Members Dialog methods | 
					 | 
					 | 
					  // Admit Pending Members Dialog methods | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					  async closeAdmitPendingDialog( | 
					 | 
					 | 
					  async closeMemberSelectionDialogCallback( | 
				
			
			
				
				
			
		
	
		
		
			
				
					 | 
					 | 
					    result: { notSelectedMemberDids: string[] } | undefined, | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					  ) { | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					    this.pendingMembersData = []; | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					    this.previousMemberDidsIgnored = result?.notSelectedMemberDids || []; | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					    await this.refreshData(); | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					  } | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					  async closeSetBulkVisibilityDialog( | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
	
		
		
			
				
					 | 
					 | 
					    result: { notSelectedMemberDids: string[] } | undefined, | 
					 | 
					 | 
					    result: { notSelectedMemberDids: string[] } | undefined, | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					  ) { | 
					 | 
					 | 
					  ) { | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					    this.visibleBulkVisibilityDialog = false; | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					    this.pendingMembersData = []; | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					    this.previousMemberDidsIgnored = result?.notSelectedMemberDids || []; | 
					 | 
					 | 
					    this.previousMemberDidsIgnored = result?.notSelectedMemberDids || []; | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					
 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					    await this.refreshData(); | 
					 | 
					 | 
					    await this.refreshData(); | 
				
			
			
		
	
	
		
		
			
				
					| 
						
							
								
							
						
						
							
								
							
						
						
					 | 
					@ -697,6 +673,7 @@ export default class MembersList extends Vue { | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					  } | 
					 | 
					 | 
					  } | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					
 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					  startAutoRefresh() { | 
					 | 
					 | 
					  startAutoRefresh() { | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					 | 
					 | 
					 | 
					    this.stopAutoRefresh(); | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					    this.lastRefreshTime = Date.now(); | 
					 | 
					 | 
					    this.lastRefreshTime = Date.now(); | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					    this.countdownTimer = 10; | 
					 | 
					 | 
					    this.countdownTimer = 10; | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					
 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
	
		
		
			
				
					| 
						
							
								
							
						
						
							
								
							
						
						
					 | 
					@ -726,17 +703,6 @@ export default class MembersList extends Vue { | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					    } | 
					 | 
					 | 
					    } | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					  } | 
					 | 
					 | 
					  } | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					
 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					  async manualRefresh() { | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					    // Clear existing auto-refresh interval | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					    if (this.autoRefreshInterval) { | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					      clearInterval(this.autoRefreshInterval); | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					      this.autoRefreshInterval = null; | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					    } | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					    // Trigger immediate refresh | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					    await this.refreshData(true); | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					  } | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					  beforeDestroy() { | 
					 | 
					 | 
					  beforeDestroy() { | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					    this.stopAutoRefresh(); | 
					 | 
					 | 
					    this.stopAutoRefresh(); | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					  } | 
					 | 
					 | 
					  } | 
				
			
			
		
	
	
		
		
			
				
					| 
						
							
								
							
						
						
						
					 | 
					
  |