|  | @ -22,7 +22,9 @@ | 
			
		
	
		
		
			
				
					|  |  |             title="Edit Meeting" |  |  |             title="Edit Meeting" | 
			
		
	
		
		
			
				
					|  |  |           > |  |  |           > | 
			
		
	
		
		
			
				
					|  |  |             <fa icon="pen" class="fa-fw" /> |  |  |             <fa icon="pen" class="fa-fw" /> | 
			
		
	
		
		
			
				
					
					|  |  |             <span class="sr-only">{{ isInCreateMode() ? 'Create Meeting' : 'Edit Meeting' }}</span> |  |  |             <span class="sr-only">{{ | 
			
				
				
			
		
	
		
		
	
		
		
			
				
					|  |  |  |  |  |               isInCreateMode() ? "Create Meeting" : "Edit Meeting" | 
			
		
	
		
		
			
				
					|  |  |  |  |  |             }}</span> | 
			
		
	
		
		
			
				
					|  |  |           </button> |  |  |           </button> | 
			
		
	
		
		
			
				
					|  |  |         </div> |  |  |         </div> | 
			
		
	
		
		
			
				
					|  |  |         <button |  |  |         <button | 
			
		
	
	
		
		
			
				
					|  | @ -33,28 +35,41 @@ | 
			
		
	
		
		
			
				
					|  |  |           title="Delete Meeting" |  |  |           title="Delete Meeting" | 
			
		
	
		
		
			
				
					|  |  |         > |  |  |         > | 
			
		
	
		
		
			
				
					|  |  |           <fa icon="trash-can" class="fa-fw" /> |  |  |           <fa icon="trash-can" class="fa-fw" /> | 
			
		
	
		
		
			
				
					
					|  |  |           <span class="sr-only">{{ isDeleting ? 'Deleting...' : 'Delete Meeting' }}</span> |  |  |           <span class="sr-only">{{ | 
			
				
				
			
		
	
		
		
	
		
		
			
				
					|  |  |  |  |  |             isDeleting ? "Deleting..." : "Delete Meeting" | 
			
		
	
		
		
			
				
					|  |  |  |  |  |           }}</span> | 
			
		
	
		
		
			
				
					|  |  |         </button> |  |  |         </button> | 
			
		
	
		
		
			
				
					|  |  |       </div> |  |  |       </div> | 
			
		
	
		
		
			
				
					|  |  |       <div class="space-y-2"> |  |  |       <div class="space-y-2"> | 
			
		
	
		
		
			
				
					|  |  |         <p><strong>Name:</strong> {{ currentMeeting.name }}</p> |  |  |         <p><strong>Name:</strong> {{ currentMeeting.name }}</p> | 
			
		
	
		
		
			
				
					
					|  |  |         <p><strong>Expires:</strong> {{ formatExpirationTime(currentMeeting.expiresAt) }}</p> |  |  |         <p> | 
			
				
				
			
		
	
		
		
	
		
		
			
				
					|  |  |  |  |  |           <strong>Expires:</strong> | 
			
		
	
		
		
			
				
					|  |  |  |  |  |           {{ formatExpirationTime(currentMeeting.expiresAt) }} | 
			
		
	
		
		
			
				
					|  |  |  |  |  |         </p> | 
			
		
	
		
		
			
				
					|  |  | 
 |  |  | 
 | 
			
		
	
		
		
			
				
					|  |  |         <div v-if="currentMeeting.password" class="mt-4"> |  |  |         <div v-if="currentMeeting.password" class="mt-4"> | 
			
		
	
		
		
			
				
					
					|  |  |           <p class="text-gray-600">Share the password with the people you want to onboard.</p> |  |  |           <p class="text-gray-600"> | 
			
				
				
			
		
	
		
		
	
		
		
			
				
					|  |  |  |  |  |             Share the password with the people you want to onboard. | 
			
		
	
		
		
			
				
					|  |  |  |  |  |           </p> | 
			
		
	
		
		
			
				
					|  |  |         </div> |  |  |         </div> | 
			
		
	
		
		
			
				
					|  |  |         <div v-else class="text-red-600"> |  |  |         <div v-else class="text-red-600"> | 
			
		
	
		
		
			
				
					
					|  |  |           Your copy of the password is not saved. Edit the meeting, or delete it and create a new meeting. |  |  |           Your copy of the password is not saved. Edit the meeting, or delete it | 
			
				
				
			
		
	
		
		
	
		
		
			
				
					|  |  |  |  |  |           and create a new meeting. | 
			
		
	
		
		
			
				
					|  |  |         </div> |  |  |         </div> | 
			
		
	
		
		
			
				
					|  |  |       </div> |  |  |       </div> | 
			
		
	
		
		
			
				
					|  |  |     </div> |  |  |     </div> | 
			
		
	
		
		
			
				
					|  |  | 
 |  |  | 
 | 
			
		
	
		
		
			
				
					|  |  | 
 |  |  |  | 
			
		
	
		
		
			
				
					|  |  |     <!-- Delete Confirmation Dialog --> |  |  |     <!-- Delete Confirmation Dialog --> | 
			
		
	
		
		
			
				
					
					|  |  |     <div v-if="showDeleteConfirm" class="fixed inset-0 bg-black bg-opacity-50 flex items-center justify-center p-4"> |  |  |     <div | 
			
				
				
			
		
	
		
		
	
		
		
			
				
					|  |  |  |  |  |       v-if="showDeleteConfirm" | 
			
		
	
		
		
			
				
					|  |  |  |  |  |       class="fixed inset-0 bg-black bg-opacity-50 flex items-center justify-center p-4" | 
			
		
	
		
		
			
				
					|  |  |  |  |  |     > | 
			
		
	
		
		
			
				
					|  |  |       <div class="bg-white rounded-lg p-6 max-w-sm w-full"> |  |  |       <div class="bg-white rounded-lg p-6 max-w-sm w-full"> | 
			
		
	
		
		
			
				
					|  |  |         <h3 class="text-lg font-medium mb-4">Delete Meeting?</h3> |  |  |         <h3 class="text-lg font-medium mb-4">Delete Meeting?</h3> | 
			
		
	
		
		
			
				
					
					|  |  |         <p class="text-gray-600 mb-6">This action cannot be undone. Are you sure you want to delete this meeting?</p> |  |  |         <p class="text-gray-600 mb-6"> | 
			
				
				
			
		
	
		
		
	
		
		
			
				
					|  |  |  |  |  |           This action cannot be undone. Are you sure you want to delete this | 
			
		
	
		
		
			
				
					|  |  |  |  |  |           meeting? | 
			
		
	
		
		
			
				
					|  |  |  |  |  |         </p> | 
			
		
	
		
		
			
				
					|  |  |         <div class="flex justify-between space-x-4"> |  |  |         <div class="flex justify-between space-x-4"> | 
			
		
	
		
		
			
				
					|  |  |           <button |  |  |           <button | 
			
		
	
		
		
			
				
					|  |  |             @click="showDeleteConfirm = false" |  |  |             @click="showDeleteConfirm = false" | 
			
		
	
	
		
		
			
				
					|  | @ -74,14 +89,27 @@ | 
			
		
	
		
		
			
				
					|  |  | 
 |  |  | 
 | 
			
		
	
		
		
			
				
					|  |  |     <!-- Create/Edit Meeting Form --> |  |  |     <!-- Create/Edit Meeting Form --> | 
			
		
	
		
		
			
				
					|  |  |     <div |  |  |     <div | 
			
		
	
		
		
			
				
					
					|  |  |       v-if="!isLoading && isInEditOrCreateMode() && newOrUpdatedMeeting != null /* duplicate check is for typechecks */" |  |  |       v-if=" | 
			
				
				
			
		
	
		
		
	
		
		
			
				
					|  |  |  |  |  |         !isLoading && | 
			
		
	
		
		
			
				
					|  |  |  |  |  |         isInEditOrCreateMode() && | 
			
		
	
		
		
			
				
					|  |  |  |  |  |         newOrUpdatedMeeting != null /* duplicate check is for typechecks */ | 
			
		
	
		
		
			
				
					|  |  |  |  |  |       " | 
			
		
	
		
		
			
				
					|  |  |       class="mt-8" |  |  |       class="mt-8" | 
			
		
	
		
		
			
				
					|  |  |     > |  |  |     > | 
			
		
	
		
		
			
				
					
					|  |  |       <h2 class="text-2xl mb-4">{{ isInCreateMode() ? 'Create New Meeting' : 'Edit Meeting' }}</h2> |  |  |       <h2 class="text-2xl mb-4"> | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |       <!-- This is my first form. Not sure whether I like it or not; gotta see if the browser benefits extend to the native app. --> |  |  |         {{ isInCreateMode() ? "Create New Meeting" : "Edit Meeting" }} | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |       <form @submit.prevent="isInCreateMode() ? createMeeting() : updateMeeting()" class="space-y-4"> |  |  |       </h2> | 
			
				
				
			
		
	
		
		
	
		
		
	
		
		
	
		
		
			
				
					|  |  |  |  |  |       <!-- This is my first form. Not sure if I like it; will see if the browser benefits extend to the native app. --> | 
			
		
	
		
		
			
				
					|  |  |  |  |  |       <form | 
			
		
	
		
		
			
				
					|  |  |  |  |  |         @submit.prevent="isInCreateMode() ? createMeeting() : updateMeeting()" | 
			
		
	
		
		
			
				
					|  |  |  |  |  |         class="space-y-4" | 
			
		
	
		
		
			
				
					|  |  |  |  |  |       > | 
			
		
	
		
		
			
				
					|  |  |         <div> |  |  |         <div> | 
			
		
	
		
		
			
				
					
					|  |  |           <label for="meetingName" class="block text-sm font-medium text-gray-700">Meeting Name</label> |  |  |           <label | 
			
				
				
			
		
	
		
		
	
		
		
			
				
					|  |  |  |  |  |             for="meetingName" | 
			
		
	
		
		
			
				
					|  |  |  |  |  |             class="block text-sm font-medium text-gray-700" | 
			
		
	
		
		
			
				
					|  |  |  |  |  |             >Meeting Name</label | 
			
		
	
		
		
			
				
					|  |  |  |  |  |           > | 
			
		
	
		
		
			
				
					|  |  |           <input |  |  |           <input | 
			
		
	
		
		
			
				
					|  |  |             id="meetingName" |  |  |             id="meetingName" | 
			
		
	
		
		
			
				
					|  |  |             v-model="newOrUpdatedMeeting.name" |  |  |             v-model="newOrUpdatedMeeting.name" | 
			
		
	
	
		
		
			
				
					|  | @ -93,7 +121,11 @@ | 
			
		
	
		
		
			
				
					|  |  |         </div> |  |  |         </div> | 
			
		
	
		
		
			
				
					|  |  | 
 |  |  | 
 | 
			
		
	
		
		
			
				
					|  |  |         <div> |  |  |         <div> | 
			
		
	
		
		
			
				
					
					|  |  |           <label for="expirationTime" class="block text-sm font-medium text-gray-700">Meeting Expiration Time</label> |  |  |           <label | 
			
				
				
			
		
	
		
		
	
		
		
			
				
					|  |  |  |  |  |             for="expirationTime" | 
			
		
	
		
		
			
				
					|  |  |  |  |  |             class="block text-sm font-medium text-gray-700" | 
			
		
	
		
		
			
				
					|  |  |  |  |  |             >Meeting Expiration Time</label | 
			
		
	
		
		
			
				
					|  |  |  |  |  |           > | 
			
		
	
		
		
			
				
					|  |  |           <input |  |  |           <input | 
			
		
	
		
		
			
				
					|  |  |             id="expirationTime" |  |  |             id="expirationTime" | 
			
		
	
		
		
			
				
					|  |  |             v-model="newOrUpdatedMeeting.expiresAt" |  |  |             v-model="newOrUpdatedMeeting.expiresAt" | 
			
		
	
	
		
		
			
				
					|  | @ -105,7 +137,9 @@ | 
			
		
	
		
		
			
				
					|  |  |         </div> |  |  |         </div> | 
			
		
	
		
		
			
				
					|  |  | 
 |  |  | 
 | 
			
		
	
		
		
			
				
					|  |  |         <div> |  |  |         <div> | 
			
		
	
		
		
			
				
					
					|  |  |           <label for="password" class="block text-sm font-medium text-gray-700">Meeting Password</label> |  |  |           <label for="password" class="block text-sm font-medium text-gray-700" | 
			
				
				
			
		
	
		
		
	
		
		
			
				
					|  |  |  |  |  |             >Meeting Password</label | 
			
		
	
		
		
			
				
					|  |  |  |  |  |           > | 
			
		
	
		
		
			
				
					|  |  |           <input |  |  |           <input | 
			
		
	
		
		
			
				
					|  |  |             id="password" |  |  |             id="password" | 
			
		
	
		
		
			
				
					|  |  |             v-model="newOrUpdatedMeeting.password" |  |  |             v-model="newOrUpdatedMeeting.password" | 
			
		
	
	
		
		
			
				
					|  | @ -117,7 +151,9 @@ | 
			
		
	
		
		
			
				
					|  |  |         </div> |  |  |         </div> | 
			
		
	
		
		
			
				
					|  |  | 
 |  |  | 
 | 
			
		
	
		
		
			
				
					|  |  |         <div> |  |  |         <div> | 
			
		
	
		
		
			
				
					
					|  |  |           <label for="userName" class="block text-sm font-medium text-gray-700">Your Name</label> |  |  |           <label for="userName" class="block text-sm font-medium text-gray-700" | 
			
				
				
			
		
	
		
		
	
		
		
			
				
					|  |  |  |  |  |             >Your Name</label | 
			
		
	
		
		
			
				
					|  |  |  |  |  |           > | 
			
		
	
		
		
			
				
					|  |  |           <input |  |  |           <input | 
			
		
	
		
		
			
				
					|  |  |             id="userName" |  |  |             id="userName" | 
			
		
	
		
		
			
				
					|  |  |             v-model="newOrUpdatedMeeting.userFullName" |  |  |             v-model="newOrUpdatedMeeting.userFullName" | 
			
		
	
	
		
		
			
				
					|  | @ -133,7 +169,15 @@ | 
			
		
	
		
		
			
				
					|  |  |           class="w-full bg-gradient-to-b from-green-400 to-green-700 shadow-[inset_0_-1px_0_0_rgba(0,0,0,0.5)] text-white px-4 py-2 rounded-md hover:from-green-500 hover:to-green-800" |  |  |           class="w-full bg-gradient-to-b from-green-400 to-green-700 shadow-[inset_0_-1px_0_0_rgba(0,0,0,0.5)] text-white px-4 py-2 rounded-md hover:from-green-500 hover:to-green-800" | 
			
		
	
		
		
			
				
					|  |  |           :disabled="isLoading" |  |  |           :disabled="isLoading" | 
			
		
	
		
		
			
				
					|  |  |         > |  |  |         > | 
			
		
	
		
		
			
				
					
					|  |  |           {{ isLoading ? (isInCreateMode() ? 'Creating...' : 'Updating...' ) : (isInCreateMode() ? 'Create Meeting' : 'Update Meeting') }} |  |  |           {{ | 
			
				
				
			
		
	
		
		
	
		
		
			
				
					|  |  |  |  |  |             isLoading | 
			
		
	
		
		
			
				
					|  |  |  |  |  |               ? isInCreateMode() | 
			
		
	
		
		
			
				
					|  |  |  |  |  |                 ? "Creating..." | 
			
		
	
		
		
			
				
					|  |  |  |  |  |                 : "Updating..." | 
			
		
	
		
		
			
				
					|  |  |  |  |  |               : isInCreateMode() | 
			
		
	
		
		
			
				
					|  |  |  |  |  |                 ? "Create Meeting" | 
			
		
	
		
		
			
				
					|  |  |  |  |  |                 : "Update Meeting" | 
			
		
	
		
		
			
				
					|  |  |  |  |  |           }} | 
			
		
	
		
		
			
				
					|  |  |         </button> |  |  |         </button> | 
			
		
	
		
		
			
				
					|  |  |         <button |  |  |         <button | 
			
		
	
		
		
			
				
					|  |  |           v-if="isInEditOrCreateMode()" |  |  |           v-if="isInEditOrCreateMode()" | 
			
		
	
	
		
		
			
				
					|  | @ -147,12 +191,15 @@ | 
			
		
	
		
		
			
				
					|  |  |     </div> |  |  |     </div> | 
			
		
	
		
		
			
				
					|  |  | 
 |  |  | 
 | 
			
		
	
		
		
			
				
					|  |  |     <!-- Members Section --> |  |  |     <!-- Members Section --> | 
			
		
	
		
		
			
				
					
					|  |  |     <div v-if="!isLoading && currentMeeting != null" class="mt-8 p-4 border rounded-lg bg-white shadow"> |  |  |     <div | 
			
				
				
			
		
	
		
		
	
		
		
			
				
					|  |  |  |  |  |       v-if="!isLoading && currentMeeting != null" | 
			
		
	
		
		
			
				
					|  |  |  |  |  |       class="mt-8 p-4 border rounded-lg bg-white shadow" | 
			
		
	
		
		
			
				
					|  |  |  |  |  |     > | 
			
		
	
		
		
			
				
					|  |  |       <div class="flex items-center justify-between mb-4"> |  |  |       <div class="flex items-center justify-between mb-4"> | 
			
		
	
		
		
			
				
					|  |  |         <h2 class="text-2xl">Meeting Members</h2> |  |  |         <h2 class="text-2xl">Meeting Members</h2> | 
			
		
	
		
		
			
				
					|  |  |       </div> |  |  |       </div> | 
			
		
	
		
		
			
				
					|  |  |       <router-link |  |  |       <router-link | 
			
		
	
		
		
			
				
					
					|  |  |         :to="`/onboard-meeting-members/${currentMeeting.groupId}?password=${encodeURIComponent(currentMeeting.password || '')}`" |  |  |         :to="onboardMeetingMembersLink()" | 
			
				
				
			
		
	
		
		
	
		
		
			
				
					|  |  |         class="inline-block px-4 text-blue-600" |  |  |         class="inline-block px-4 text-blue-600" | 
			
		
	
		
		
			
				
					|  |  |         target="_blank" |  |  |         target="_blank" | 
			
		
	
		
		
			
				
					|  |  |       > |  |  |       > | 
			
		
	
	
		
		
			
				
					|  | @ -176,20 +223,24 @@ | 
			
		
	
		
		
			
				
					|  |  | </template> |  |  | </template> | 
			
		
	
		
		
			
				
					|  |  | 
 |  |  | 
 | 
			
		
	
		
		
			
				
					|  |  | <script lang="ts"> |  |  | <script lang="ts"> | 
			
		
	
		
		
			
				
					
					|  |  | import { Component, Vue } from 'vue-facing-decorator'; |  |  | import { Component, Vue } from "vue-facing-decorator"; | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  | import QuickNav from '@/components/QuickNav.vue'; |  |  | import QuickNav from "@/components/QuickNav.vue"; | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  | import TopMessage from '@/components/TopMessage.vue'; |  |  | import TopMessage from "@/components/TopMessage.vue"; | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  | import MembersList from '@/components/MembersList.vue'; |  |  | import MembersList from "@/components/MembersList.vue"; | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  | import { logConsoleAndDb, retrieveSettingsForActiveAccount } from '@/db/index'; |  |  | import { logConsoleAndDb, retrieveSettingsForActiveAccount } from "@/db/index"; | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  | import { errorStringForLog, getHeaders, serverMessageForUser } from '@/libs/endorserServer'; |  |  | import { | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  | import { encryptMessage } from '@/libs/crypto'; |  |  |   errorStringForLog, | 
			
				
				
			
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
			
				
					|  |  |  |  |  |   getHeaders, | 
			
		
	
		
		
			
				
					|  |  |  |  |  |   serverMessageForUser, | 
			
		
	
		
		
			
				
					|  |  |  |  |  | } from "@/libs/endorserServer"; | 
			
		
	
		
		
			
				
					|  |  |  |  |  | import { encryptMessage } from "@/libs/crypto"; | 
			
		
	
		
		
			
				
					|  |  | 
 |  |  | 
 | 
			
		
	
		
		
			
				
					|  |  | interface ServerMeeting { |  |  | interface ServerMeeting { | 
			
		
	
		
		
			
				
					
					|  |  |   groupId: string;   // from the server |  |  |   groupId: number; // from the server | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |   name: string;      // from the server |  |  |   name: string; // from the server | 
			
				
				
			
		
	
		
		
	
		
		
	
		
		
			
				
					|  |  |   expiresAt: string; // from the server |  |  |   expiresAt: string; // from the server | 
			
		
	
		
		
			
				
					|  |  |   userFullName?: string; // from the user's session |  |  |   userFullName?: string; // from the user's session | 
			
		
	
		
		
			
				
					
					|  |  |   password?: string;     // from the user's session |  |  |   password?: string; // from the user's session | 
			
				
				
			
		
	
		
		
	
		
		
			
				
					|  |  | } |  |  | } | 
			
		
	
		
		
			
				
					|  |  | 
 |  |  | 
 | 
			
		
	
		
		
			
				
					|  |  | interface MeetingSetupInfo { |  |  | interface MeetingSetupInfo { | 
			
		
	
	
		
		
			
				
					|  | @ -207,16 +258,19 @@ interface MeetingSetupInfo { | 
			
		
	
		
		
			
				
					|  |  |   }, |  |  |   }, | 
			
		
	
		
		
			
				
					|  |  | }) |  |  | }) | 
			
		
	
		
		
			
				
					|  |  | export default class OnboardMeetingView extends Vue { |  |  | export default class OnboardMeetingView extends Vue { | 
			
		
	
		
		
			
				
					
					|  |  |   $notify!: (notification: { group: string; type: string; title: string; text: string }, timeout?: number) => void; |  |  |   $notify!: ( | 
			
				
				
			
		
	
		
		
	
		
		
			
				
					|  |  |  |  |  |     notification: { group: string; type: string; title: string; text: string }, | 
			
		
	
		
		
			
				
					|  |  |  |  |  |     timeout?: number, | 
			
		
	
		
		
			
				
					|  |  |  |  |  |   ) => void; | 
			
		
	
		
		
			
				
					|  |  | 
 |  |  | 
 | 
			
		
	
		
		
			
				
					|  |  |   currentMeeting: ServerMeeting | null = null; |  |  |   currentMeeting: ServerMeeting | null = null; | 
			
		
	
		
		
			
				
					|  |  |   newOrUpdatedMeeting: MeetingSetupInfo | null = null; |  |  |   newOrUpdatedMeeting: MeetingSetupInfo | null = null; | 
			
		
	
		
		
			
				
					
					|  |  |   activeDid = ''; |  |  |   activeDid = ""; | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |   apiServer = ''; |  |  |   apiServer = ""; | 
			
				
				
			
		
	
		
		
	
		
		
	
		
		
			
				
					|  |  |   isDeleting = false; |  |  |   isDeleting = false; | 
			
		
	
		
		
			
				
					|  |  |   isLoading = true; |  |  |   isLoading = true; | 
			
		
	
		
		
			
				
					|  |  |   showDeleteConfirm = false; |  |  |   showDeleteConfirm = false; | 
			
		
	
		
		
			
				
					
					|  |  |   fullName = ''; |  |  |   fullName = ""; | 
			
				
				
			
		
	
		
		
	
		
		
			
				
					|  |  |   get minDateTime() { |  |  |   get minDateTime() { | 
			
		
	
		
		
			
				
					|  |  |     const now = new Date(); |  |  |     const now = new Date(); | 
			
		
	
		
		
			
				
					|  |  |     now.setMinutes(now.getMinutes() + 5); // Set minimum 5 minutes in the future |  |  |     now.setMinutes(now.getMinutes() + 5); // Set minimum 5 minutes in the future | 
			
		
	
	
		
		
			
				
					|  | @ -225,9 +279,9 @@ export default class OnboardMeetingView extends Vue { | 
			
		
	
		
		
			
				
					|  |  | 
 |  |  | 
 | 
			
		
	
		
		
			
				
					|  |  |   async created() { |  |  |   async created() { | 
			
		
	
		
		
			
				
					|  |  |     const settings = await retrieveSettingsForActiveAccount(); |  |  |     const settings = await retrieveSettingsForActiveAccount(); | 
			
		
	
		
		
			
				
					
					|  |  |     this.activeDid = settings.activeDid || ''; |  |  |     this.activeDid = settings.activeDid || ""; | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |     this.apiServer = settings.apiServer || ''; |  |  |     this.apiServer = settings.apiServer || ""; | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |     this.fullName = settings.firstName || ''; |  |  |     this.fullName = settings.firstName || ""; | 
			
				
				
			
		
	
		
		
	
		
		
	
		
		
	
		
		
			
				
					|  |  | 
 |  |  | 
 | 
			
		
	
		
		
			
				
					|  |  |     await this.fetchCurrentMeeting(); |  |  |     await this.fetchCurrentMeeting(); | 
			
		
	
		
		
			
				
					|  |  |     this.isLoading = false; |  |  |     this.isLoading = false; | 
			
		
	
	
		
		
			
				
					|  | @ -255,10 +309,10 @@ export default class OnboardMeetingView extends Vue { | 
			
		
	
		
		
			
				
					|  |  |   // Format a date object to YYYY-MM-DDTHH:mm format for datetime-local input |  |  |   // Format a date object to YYYY-MM-DDTHH:mm format for datetime-local input | 
			
		
	
		
		
			
				
					|  |  |   private formatDateForInput(date: Date): string { |  |  |   private formatDateForInput(date: Date): string { | 
			
		
	
		
		
			
				
					|  |  |     const year = date.getFullYear(); |  |  |     const year = date.getFullYear(); | 
			
		
	
		
		
			
				
					
					|  |  |     const month = String(date.getMonth() + 1).padStart(2, '0'); |  |  |     const month = String(date.getMonth() + 1).padStart(2, "0"); | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |     const day = String(date.getDate()).padStart(2, '0'); |  |  |     const day = String(date.getDate()).padStart(2, "0"); | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |     const hours = String(date.getHours()).padStart(2, '0'); |  |  |     const hours = String(date.getHours()).padStart(2, "0"); | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |     const minutes = String(date.getMinutes()).padStart(2, '0'); |  |  |     const minutes = String(date.getMinutes()).padStart(2, "0"); | 
			
				
				
			
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
			
				
					|  |  | 
 |  |  | 
 | 
			
		
	
		
		
			
				
					|  |  |     return `${year}-${month}-${day}T${hours}:${minutes}`; |  |  |     return `${year}-${month}-${day}T${hours}:${minutes}`; | 
			
		
	
		
		
			
				
					|  |  |   } |  |  |   } | 
			
		
	
	
		
		
			
				
					|  | @ -266,10 +320,10 @@ export default class OnboardMeetingView extends Vue { | 
			
		
	
		
		
			
				
					|  |  |   blankMeeting(): MeetingSetupInfo { |  |  |   blankMeeting(): MeetingSetupInfo { | 
			
		
	
		
		
			
				
					|  |  |     return { |  |  |     return { | 
			
		
	
		
		
			
				
					|  |  |       // no groupId yet |  |  |       // no groupId yet | 
			
		
	
		
		
			
				
					
					|  |  |       name: '', |  |  |       name: "", | 
			
				
				
			
		
	
		
		
	
		
		
			
				
					|  |  |       expiresAt: this.getDefaultExpirationTime(), |  |  |       expiresAt: this.getDefaultExpirationTime(), | 
			
		
	
		
		
			
				
					|  |  |       userFullName: this.fullName, |  |  |       userFullName: this.fullName, | 
			
		
	
		
		
			
				
					
					|  |  |       password: this.currentMeeting?.password || "", |  |  |       password: (this.currentMeeting?.password as string) || "", | 
			
				
				
			
		
	
		
		
	
		
		
			
				
					|  |  |     }; |  |  |     }; | 
			
		
	
		
		
			
				
					|  |  |   } |  |  |   } | 
			
		
	
		
		
			
				
					|  |  | 
 |  |  | 
 | 
			
		
	
	
		
		
			
				
					|  | @ -277,8 +331,8 @@ export default class OnboardMeetingView extends Vue { | 
			
		
	
		
		
			
				
					|  |  |     try { |  |  |     try { | 
			
		
	
		
		
			
				
					|  |  |       const headers = await getHeaders(this.activeDid); |  |  |       const headers = await getHeaders(this.activeDid); | 
			
		
	
		
		
			
				
					|  |  |       const response = await this.axios.get( |  |  |       const response = await this.axios.get( | 
			
		
	
		
		
			
				
					
					|  |  |         this.apiServer + '/api/partner/groupOnboard', |  |  |         this.apiServer + "/api/partner/groupOnboard", | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |         { headers } |  |  |         { headers }, | 
			
				
				
			
		
	
		
		
	
		
		
	
		
		
			
				
					|  |  |       ); |  |  |       ); | 
			
		
	
		
		
			
				
					|  |  | 
 |  |  | 
 | 
			
		
	
		
		
			
				
					|  |  |       if (response?.data?.data) { |  |  |       if (response?.data?.data) { | 
			
		
	
	
		
		
			
				
					|  | @ -302,7 +356,9 @@ export default class OnboardMeetingView extends Vue { | 
			
		
	
		
		
			
				
					|  |  | 
 |  |  | 
 | 
			
		
	
		
		
			
				
					|  |  |     try { |  |  |     try { | 
			
		
	
		
		
			
				
					|  |  |       if (!this.newOrUpdatedMeeting) { |  |  |       if (!this.newOrUpdatedMeeting) { | 
			
		
	
		
		
			
				
					
					|  |  |         throw Error('There was no meeting data to create. We should never get here.'); |  |  |         throw Error( | 
			
				
				
			
		
	
		
		
	
		
		
			
				
					|  |  |  |  |  |           "There was no meeting data to create. We should never get here.", | 
			
		
	
		
		
			
				
					|  |  |  |  |  |         ); | 
			
		
	
		
		
			
				
					|  |  |       } |  |  |       } | 
			
		
	
		
		
			
				
					|  |  | 
 |  |  | 
 | 
			
		
	
		
		
			
				
					|  |  |       // Convert local time to UTC for comparison and server submission |  |  |       // Convert local time to UTC for comparison and server submission | 
			
		
	
	
		
		
			
				
					|  | @ -311,57 +367,59 @@ export default class OnboardMeetingView extends Vue { | 
			
		
	
		
		
			
				
					|  |  |       if (localExpiresAt <= now) { |  |  |       if (localExpiresAt <= now) { | 
			
		
	
		
		
			
				
					|  |  |         this.$notify( |  |  |         this.$notify( | 
			
		
	
		
		
			
				
					|  |  |           { |  |  |           { | 
			
		
	
		
		
			
				
					
					|  |  |             group: 'alert', |  |  |             group: "alert", | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |             type: 'warning', |  |  |             type: "warning", | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |             title: 'Invalid Time', |  |  |             title: "Invalid Time", | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |             text: 'Select a future time for the meeting expiration.', |  |  |             text: "Select a future time for the meeting expiration.", | 
			
				
				
			
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
			
				
					|  |  |           }, |  |  |           }, | 
			
		
	
		
		
			
				
					
					|  |  |           5000 |  |  |           5000, | 
			
				
				
			
		
	
		
		
	
		
		
			
				
					|  |  |         ); |  |  |         ); | 
			
		
	
		
		
			
				
					|  |  |         return; |  |  |         return; | 
			
		
	
		
		
			
				
					|  |  |       } |  |  |       } | 
			
		
	
		
		
			
				
					|  |  |       if (!this.newOrUpdatedMeeting.userFullName) { |  |  |       if (!this.newOrUpdatedMeeting.userFullName) { | 
			
		
	
		
		
			
				
					|  |  |         this.$notify( |  |  |         this.$notify( | 
			
		
	
		
		
			
				
					|  |  |           { |  |  |           { | 
			
		
	
		
		
			
				
					
					|  |  |             group: 'alert', |  |  |             group: "alert", | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |             type: 'warning', |  |  |             type: "warning", | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |             title: 'Invalid Name', |  |  |             title: "Invalid Name", | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |             text: 'Please enter your name.', |  |  |             text: "Please enter your name.", | 
			
				
				
			
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
			
				
					|  |  |           }, |  |  |           }, | 
			
		
	
		
		
			
				
					
					|  |  |           5000 |  |  |           5000, | 
			
				
				
			
		
	
		
		
	
		
		
			
				
					|  |  |         ); |  |  |         ); | 
			
		
	
		
		
			
				
					|  |  |         return; |  |  |         return; | 
			
		
	
		
		
			
				
					|  |  |       } |  |  |       } | 
			
		
	
		
		
			
				
					|  |  |       if (!this.newOrUpdatedMeeting.password) { |  |  |       if (!this.newOrUpdatedMeeting.password) { | 
			
		
	
		
		
			
				
					|  |  |         this.$notify( |  |  |         this.$notify( | 
			
		
	
		
		
			
				
					|  |  |           { |  |  |           { | 
			
		
	
		
		
			
				
					
					|  |  |             group: 'alert', |  |  |             group: "alert", | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |             type: 'warning', |  |  |             type: "warning", | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |             title: 'Invalid Password', |  |  |             title: "Invalid Password", | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |             text: 'Please enter a password.', |  |  |             text: "Please enter a password.", | 
			
				
				
			
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
			
				
					|  |  |           }, |  |  |           }, | 
			
		
	
		
		
			
				
					
					|  |  |           5000 |  |  |           5000, | 
			
				
				
			
		
	
		
		
	
		
		
			
				
					|  |  |         ); |  |  |         ); | 
			
		
	
		
		
			
				
					|  |  |         return; |  |  |         return; | 
			
		
	
		
		
			
				
					|  |  |       } |  |  |       } | 
			
		
	
		
		
			
				
					|  |  | 
 |  |  | 
 | 
			
		
	
		
		
			
				
					|  |  | 
 |  |  |  | 
			
		
	
		
		
			
				
					|  |  |       // create content with user's name and DID encrypted with password |  |  |       // create content with user's name and DID encrypted with password | 
			
		
	
		
		
			
				
					|  |  |       const content = { |  |  |       const content = { | 
			
		
	
		
		
			
				
					|  |  |         name: this.newOrUpdatedMeeting.userFullName, |  |  |         name: this.newOrUpdatedMeeting.userFullName, | 
			
		
	
		
		
			
				
					|  |  |         did: this.activeDid, |  |  |         did: this.activeDid, | 
			
		
	
		
		
			
				
					|  |  |       }; |  |  |       }; | 
			
		
	
		
		
			
				
					
					|  |  |       const encryptedContent = await encryptMessage(JSON.stringify(content), this.newOrUpdatedMeeting.password); |  |  |       const encryptedContent = await encryptMessage( | 
			
				
				
			
		
	
		
		
	
		
		
			
				
					|  |  |  |  |  |         JSON.stringify(content), | 
			
		
	
		
		
			
				
					|  |  |  |  |  |         this.newOrUpdatedMeeting.password, | 
			
		
	
		
		
			
				
					|  |  |  |  |  |       ); | 
			
		
	
		
		
			
				
					|  |  | 
 |  |  | 
 | 
			
		
	
		
		
			
				
					|  |  |       const headers = await getHeaders(this.activeDid); |  |  |       const headers = await getHeaders(this.activeDid); | 
			
		
	
		
		
			
				
					|  |  |       const response = await this.axios.post( |  |  |       const response = await this.axios.post( | 
			
		
	
		
		
			
				
					
					|  |  |         this.apiServer + '/api/partner/groupOnboard', |  |  |         this.apiServer + "/api/partner/groupOnboard", | 
			
				
				
			
		
	
		
		
	
		
		
			
				
					|  |  |         { |  |  |         { | 
			
		
	
		
		
			
				
					|  |  |           name: this.newOrUpdatedMeeting.name, |  |  |           name: this.newOrUpdatedMeeting.name, | 
			
		
	
		
		
			
				
					|  |  |           expiresAt: localExpiresAt.toISOString(), |  |  |           expiresAt: localExpiresAt.toISOString(), | 
			
		
	
		
		
			
				
					|  |  |           content: encryptedContent, |  |  |           content: encryptedContent, | 
			
		
	
		
		
			
				
					|  |  |         }, |  |  |         }, | 
			
		
	
		
		
			
				
					
					|  |  |         { headers } |  |  |         { headers }, | 
			
				
				
			
		
	
		
		
	
		
		
			
				
					|  |  |       ); |  |  |       ); | 
			
		
	
		
		
			
				
					|  |  | 
 |  |  | 
 | 
			
		
	
		
		
			
				
					|  |  |       if (response.data && response.data.success) { |  |  |       if (response.data && response.data.success) { | 
			
		
	
	
		
		
			
				
					|  | @ -373,27 +431,32 @@ export default class OnboardMeetingView extends Vue { | 
			
		
	
		
		
			
				
					|  |  |         this.newOrUpdatedMeeting = null; |  |  |         this.newOrUpdatedMeeting = null; | 
			
		
	
		
		
			
				
					|  |  |         this.$notify( |  |  |         this.$notify( | 
			
		
	
		
		
			
				
					|  |  |           { |  |  |           { | 
			
		
	
		
		
			
				
					
					|  |  |             group: 'alert', |  |  |             group: "alert", | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |             type: 'success', |  |  |             type: "success", | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |             title: 'Success', |  |  |             title: "Success", | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |             text: 'Meeting created.', |  |  |             text: "Meeting created.", | 
			
				
				
			
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
			
				
					|  |  |           }, |  |  |           }, | 
			
		
	
		
		
			
				
					
					|  |  |           3000 |  |  |           3000, | 
			
				
				
			
		
	
		
		
	
		
		
			
				
					|  |  |         ); |  |  |         ); | 
			
		
	
		
		
			
				
					|  |  |       } else { |  |  |       } else { | 
			
		
	
		
		
			
				
					|  |  |         throw { response: response }; |  |  |         throw { response: response }; | 
			
		
	
		
		
			
				
					|  |  |       } |  |  |       } | 
			
		
	
		
		
			
				
					|  |  |     } catch (error) { |  |  |     } catch (error) { | 
			
		
	
		
		
			
				
					
					|  |  |       logConsoleAndDb('Error creating meeting: ' + errorStringForLog(error), true); |  |  |       logConsoleAndDb( | 
			
				
				
			
		
	
		
		
	
		
		
			
				
					|  |  |  |  |  |         "Error creating meeting: " + errorStringForLog(error), | 
			
		
	
		
		
			
				
					|  |  |  |  |  |         true, | 
			
		
	
		
		
			
				
					|  |  |  |  |  |       ); | 
			
		
	
		
		
			
				
					|  |  |       const errorMessage = serverMessageForUser(error); |  |  |       const errorMessage = serverMessageForUser(error); | 
			
		
	
		
		
			
				
					|  |  |       this.$notify( |  |  |       this.$notify( | 
			
		
	
		
		
			
				
					|  |  |         { |  |  |         { | 
			
		
	
		
		
			
				
					
					|  |  |           group: 'alert', |  |  |           group: "alert", | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |           type: 'danger', |  |  |           type: "danger", | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |           title: 'Error', |  |  |           title: "Error", | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |           text: errorMessage || 'Failed to create meeting. Try reloading or submitting again.', |  |  |           text: | 
			
				
				
			
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
			
				
					|  |  |  |  |  |             errorMessage || | 
			
		
	
		
		
			
				
					|  |  |  |  |  |             "Failed to create meeting. Try reloading or submitting again.", | 
			
		
	
		
		
			
				
					|  |  |         }, |  |  |         }, | 
			
		
	
		
		
			
				
					
					|  |  |         5000 |  |  |         5000, | 
			
				
				
			
		
	
		
		
	
		
		
			
				
					|  |  |       ); |  |  |       ); | 
			
		
	
		
		
			
				
					|  |  |     } finally { |  |  |     } finally { | 
			
		
	
		
		
			
				
					|  |  |       this.isLoading = false; |  |  |       this.isLoading = false; | 
			
		
	
	
		
		
			
				
					|  | @ -403,14 +466,16 @@ export default class OnboardMeetingView extends Vue { | 
			
		
	
		
		
			
				
					|  |  |   formatExpirationTime(expiresAt: string): string { |  |  |   formatExpirationTime(expiresAt: string): string { | 
			
		
	
		
		
			
				
					|  |  |     const expiration = new Date(expiresAt); // Server time is in UTC |  |  |     const expiration = new Date(expiresAt); // Server time is in UTC | 
			
		
	
		
		
			
				
					|  |  |     const now = new Date(); |  |  |     const now = new Date(); | 
			
		
	
		
		
			
				
					
					|  |  |     const diffHours = Math.round((expiration.getTime() - now.getTime()) / (1000 * 60 * 60)); |  |  |     const diffHours = Math.round( | 
			
				
				
			
		
	
		
		
	
		
		
			
				
					|  |  |  |  |  |       (expiration.getTime() - now.getTime()) / (1000 * 60 * 60), | 
			
		
	
		
		
			
				
					|  |  |  |  |  |     ); | 
			
		
	
		
		
			
				
					|  |  | 
 |  |  | 
 | 
			
		
	
		
		
			
				
					|  |  |     if (diffHours < 0) { |  |  |     if (diffHours < 0) { | 
			
		
	
		
		
			
				
					
					|  |  |       return 'Expired'; |  |  |       return "Expired"; | 
			
				
				
			
		
	
		
		
	
		
		
			
				
					|  |  |     } else if (diffHours < 1) { |  |  |     } else if (diffHours < 1) { | 
			
		
	
		
		
			
				
					
					|  |  |       return 'Less than an hour'; |  |  |       return "Less than an hour"; | 
			
				
				
			
		
	
		
		
	
		
		
			
				
					|  |  |     } else if (diffHours === 1) { |  |  |     } else if (diffHours === 1) { | 
			
		
	
		
		
			
				
					
					|  |  |       return '1 hour'; |  |  |       return "1 hour"; | 
			
				
				
			
		
	
		
		
	
		
		
			
				
					|  |  |     } else { |  |  |     } else { | 
			
		
	
		
		
			
				
					|  |  |       return `${diffHours} hours`; |  |  |       return `${diffHours} hours`; | 
			
		
	
		
		
			
				
					|  |  |     } |  |  |     } | 
			
		
	
	
		
		
			
				
					|  | @ -424,10 +489,9 @@ export default class OnboardMeetingView extends Vue { | 
			
		
	
		
		
			
				
					|  |  |     this.isDeleting = true; |  |  |     this.isDeleting = true; | 
			
		
	
		
		
			
				
					|  |  |     try { |  |  |     try { | 
			
		
	
		
		
			
				
					|  |  |       const headers = await getHeaders(this.activeDid); |  |  |       const headers = await getHeaders(this.activeDid); | 
			
		
	
		
		
			
				
					
					|  |  |       await this.axios.delete( |  |  |       await this.axios.delete(this.apiServer + "/api/partner/groupOnboard", { | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |         this.apiServer + '/api/partner/groupOnboard', |  |  |         headers, | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |         { headers } |  |  |       }); | 
			
				
				
			
		
	
		
		
			
				
					|  |  |       ); |  |  |  | 
			
		
	
		
		
	
		
		
	
		
		
	
		
		
			
				
					|  |  | 
 |  |  | 
 | 
			
		
	
		
		
			
				
					|  |  |       this.currentMeeting = null; |  |  |       this.currentMeeting = null; | 
			
		
	
		
		
			
				
					|  |  |       this.newOrUpdatedMeeting = this.blankMeeting(); |  |  |       this.newOrUpdatedMeeting = this.blankMeeting(); | 
			
		
	
	
		
		
			
				
					|  | @ -435,23 +499,23 @@ export default class OnboardMeetingView extends Vue { | 
			
		
	
		
		
			
				
					|  |  | 
 |  |  | 
 | 
			
		
	
		
		
			
				
					|  |  |       this.$notify( |  |  |       this.$notify( | 
			
		
	
		
		
			
				
					|  |  |         { |  |  |         { | 
			
		
	
		
		
			
				
					
					|  |  |           group: 'alert', |  |  |           group: "alert", | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |           type: 'success', |  |  |           type: "success", | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |           title: 'Success', |  |  |           title: "Success", | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |           text: 'Meeting deleted successfully.', |  |  |           text: "Meeting deleted successfully.", | 
			
				
				
			
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
			
				
					|  |  |         }, |  |  |         }, | 
			
		
	
		
		
			
				
					
					|  |  |         3000 |  |  |         3000, | 
			
				
				
			
		
	
		
		
	
		
		
			
				
					|  |  |       ); |  |  |       ); | 
			
		
	
		
		
			
				
					|  |  |     } catch (error) { |  |  |     } catch (error) { | 
			
		
	
		
		
			
				
					
					|  |  |       console.error('Error deleting meeting:', error); |  |  |       console.error("Error deleting meeting:", error); | 
			
				
				
			
		
	
		
		
	
		
		
			
				
					|  |  |       this.$notify( |  |  |       this.$notify( | 
			
		
	
		
		
			
				
					|  |  |         { |  |  |         { | 
			
		
	
		
		
			
				
					
					|  |  |           group: 'alert', |  |  |           group: "alert", | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |           type: 'danger', |  |  |           type: "danger", | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |           title: 'Error', |  |  |           title: "Error", | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |           text: serverMessageForUser(error) || 'Failed to delete meeting.', |  |  |           text: serverMessageForUser(error) || "Failed to delete meeting.", | 
			
				
				
			
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
			
				
					|  |  |         }, |  |  |         }, | 
			
		
	
		
		
			
				
					
					|  |  |         5000 |  |  |         5000, | 
			
				
				
			
		
	
		
		
	
		
		
			
				
					|  |  |       ); |  |  |       ); | 
			
		
	
		
		
			
				
					|  |  |     } finally { |  |  |     } finally { | 
			
		
	
		
		
			
				
					|  |  |       this.isDeleting = false; |  |  |       this.isDeleting = false; | 
			
		
	
	
		
		
			
				
					|  | @ -465,11 +529,13 @@ export default class OnboardMeetingView extends Vue { | 
			
		
	
		
		
			
				
					|  |  |       this.newOrUpdatedMeeting = { |  |  |       this.newOrUpdatedMeeting = { | 
			
		
	
		
		
			
				
					|  |  |         name: this.currentMeeting.name, |  |  |         name: this.currentMeeting.name, | 
			
		
	
		
		
			
				
					|  |  |         expiresAt: this.formatDateForInput(localExpiresAt), |  |  |         expiresAt: this.formatDateForInput(localExpiresAt), | 
			
		
	
		
		
			
				
					
					|  |  |         userFullName: this.currentMeeting.userFullName || '', |  |  |         userFullName: this.currentMeeting.userFullName || "", | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |         password: this.currentMeeting.password || '', |  |  |         password: this.currentMeeting.password || "", | 
			
				
				
			
		
	
		
		
	
		
		
	
		
		
			
				
					|  |  |       }; |  |  |       }; | 
			
		
	
		
		
			
				
					|  |  |     } else { |  |  |     } else { | 
			
		
	
		
		
			
				
					
					|  |  |       console.error('There is no current meeting to edit. We should never get here.'); |  |  |       console.error( | 
			
				
				
			
		
	
		
		
	
		
		
			
				
					|  |  |  |  |  |         "There is no current meeting to edit. We should never get here.", | 
			
		
	
		
		
			
				
					|  |  |  |  |  |       ); | 
			
		
	
		
		
			
				
					|  |  |     } |  |  |     } | 
			
		
	
		
		
			
				
					|  |  |   } |  |  |   } | 
			
		
	
		
		
			
				
					|  |  | 
 |  |  | 
 | 
			
		
	
	
		
		
			
				
					|  | @ -481,7 +547,7 @@ export default class OnboardMeetingView extends Vue { | 
			
		
	
		
		
			
				
					|  |  |   async updateMeeting() { |  |  |   async updateMeeting() { | 
			
		
	
		
		
			
				
					|  |  |     this.isLoading = true; |  |  |     this.isLoading = true; | 
			
		
	
		
		
			
				
					|  |  |     if (!this.newOrUpdatedMeeting) { |  |  |     if (!this.newOrUpdatedMeeting) { | 
			
		
	
		
		
			
				
					
					|  |  |       throw Error('There was no meeting data to update.'); |  |  |       throw Error("There was no meeting data to update."); | 
			
				
				
			
		
	
		
		
	
		
		
			
				
					|  |  |     } |  |  |     } | 
			
		
	
		
		
			
				
					|  |  | 
 |  |  | 
 | 
			
		
	
		
		
			
				
					|  |  |     try { |  |  |     try { | 
			
		
	
	
		
		
			
				
					|  | @ -491,36 +557,36 @@ export default class OnboardMeetingView extends Vue { | 
			
		
	
		
		
			
				
					|  |  |       if (localExpiresAt <= now) { |  |  |       if (localExpiresAt <= now) { | 
			
		
	
		
		
			
				
					|  |  |         this.$notify( |  |  |         this.$notify( | 
			
		
	
		
		
			
				
					|  |  |           { |  |  |           { | 
			
		
	
		
		
			
				
					
					|  |  |             group: 'alert', |  |  |             group: "alert", | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |             type: 'warning', |  |  |             type: "warning", | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |             title: 'Invalid Time', |  |  |             title: "Invalid Time", | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |             text: 'Select a future time for the meeting expiration.', |  |  |             text: "Select a future time for the meeting expiration.", | 
			
				
				
			
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
			
				
					|  |  |           }, |  |  |           }, | 
			
		
	
		
		
			
				
					
					|  |  |           5000 |  |  |           5000, | 
			
				
				
			
		
	
		
		
	
		
		
			
				
					|  |  |         ); |  |  |         ); | 
			
		
	
		
		
			
				
					|  |  |         return; |  |  |         return; | 
			
		
	
		
		
			
				
					|  |  |       } |  |  |       } | 
			
		
	
		
		
			
				
					|  |  |       if (!this.newOrUpdatedMeeting.userFullName) { |  |  |       if (!this.newOrUpdatedMeeting.userFullName) { | 
			
		
	
		
		
			
				
					|  |  |         this.$notify( |  |  |         this.$notify( | 
			
		
	
		
		
			
				
					|  |  |           { |  |  |           { | 
			
		
	
		
		
			
				
					
					|  |  |             group: 'alert', |  |  |             group: "alert", | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |             type: 'warning', |  |  |             type: "warning", | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |             title: 'Invalid Name', |  |  |             title: "Invalid Name", | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |             text: 'Please enter your name.', |  |  |             text: "Please enter your name.", | 
			
				
				
			
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
			
				
					|  |  |           }, |  |  |           }, | 
			
		
	
		
		
			
				
					
					|  |  |           5000 |  |  |           5000, | 
			
				
				
			
		
	
		
		
	
		
		
			
				
					|  |  |         ); |  |  |         ); | 
			
		
	
		
		
			
				
					|  |  |         return; |  |  |         return; | 
			
		
	
		
		
			
				
					|  |  |       } |  |  |       } | 
			
		
	
		
		
			
				
					|  |  |       if (!this.newOrUpdatedMeeting.password) { |  |  |       if (!this.newOrUpdatedMeeting.password) { | 
			
		
	
		
		
			
				
					|  |  |         this.$notify( |  |  |         this.$notify( | 
			
		
	
		
		
			
				
					|  |  |           { |  |  |           { | 
			
		
	
		
		
			
				
					
					|  |  |             group: 'alert', |  |  |             group: "alert", | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |             type: 'warning', |  |  |             type: "warning", | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |             title: 'Invalid Password', |  |  |             title: "Invalid Password", | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |             text: 'Please enter a password.', |  |  |             text: "Please enter a password.", | 
			
				
				
			
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
			
				
					|  |  |           }, |  |  |           }, | 
			
		
	
		
		
			
				
					
					|  |  |           5000 |  |  |           5000, | 
			
				
				
			
		
	
		
		
	
		
		
			
				
					|  |  |         ); |  |  |         ); | 
			
		
	
		
		
			
				
					|  |  |         return; |  |  |         return; | 
			
		
	
		
		
			
				
					|  |  |       } |  |  |       } | 
			
		
	
	
		
		
			
				
					|  | @ -529,56 +595,73 @@ export default class OnboardMeetingView extends Vue { | 
			
		
	
		
		
			
				
					|  |  |         name: this.newOrUpdatedMeeting.userFullName, |  |  |         name: this.newOrUpdatedMeeting.userFullName, | 
			
		
	
		
		
			
				
					|  |  |         did: this.activeDid, |  |  |         did: this.activeDid, | 
			
		
	
		
		
			
				
					|  |  |       }; |  |  |       }; | 
			
		
	
		
		
			
				
					
					|  |  |       const encryptedContent = await encryptMessage(JSON.stringify(content), this.newOrUpdatedMeeting.password); |  |  |       const encryptedContent = await encryptMessage( | 
			
				
				
			
		
	
		
		
	
		
		
			
				
					|  |  |  |  |  |         JSON.stringify(content), | 
			
		
	
		
		
			
				
					|  |  |  |  |  |         this.newOrUpdatedMeeting.password, | 
			
		
	
		
		
			
				
					|  |  |  |  |  |       ); | 
			
		
	
		
		
			
				
					|  |  | 
 |  |  | 
 | 
			
		
	
		
		
			
				
					|  |  |       const headers = await getHeaders(this.activeDid); |  |  |       const headers = await getHeaders(this.activeDid); | 
			
		
	
		
		
			
				
					|  |  |       const response = await this.axios.put( |  |  |       const response = await this.axios.put( | 
			
		
	
		
		
			
				
					
					|  |  |         this.apiServer + '/api/partner/groupOnboard', |  |  |         this.apiServer + "/api/partner/groupOnboard", | 
			
				
				
			
		
	
		
		
	
		
		
			
				
					|  |  |         { |  |  |         { | 
			
		
	
		
		
			
				
					|  |  |           // the groupId is in the currentMeeting but it's not necessary while users only have one meeting |  |  |           // the groupId is in the currentMeeting but it's not necessary while users only have one meeting | 
			
		
	
		
		
			
				
					|  |  |           name: this.newOrUpdatedMeeting.name, |  |  |           name: this.newOrUpdatedMeeting.name, | 
			
		
	
		
		
			
				
					|  |  |           expiresAt: localExpiresAt.toISOString(), |  |  |           expiresAt: localExpiresAt.toISOString(), | 
			
		
	
		
		
			
				
					|  |  |           content: encryptedContent, |  |  |           content: encryptedContent, | 
			
		
	
		
		
			
				
					|  |  |         }, |  |  |         }, | 
			
		
	
		
		
			
				
					
					|  |  |         { headers } |  |  |         { headers }, | 
			
				
				
			
		
	
		
		
	
		
		
			
				
					|  |  |       ); |  |  |       ); | 
			
		
	
		
		
			
				
					|  |  | 
 |  |  | 
 | 
			
		
	
		
		
			
				
					|  |  |       if (response.data && response.data.success) { |  |  |       if (response.data && response.data.success) { | 
			
		
	
		
		
			
				
					|  |  |         // Update the current meeting with only the necessary fields |  |  |         // Update the current meeting with only the necessary fields | 
			
		
	
		
		
			
				
					|  |  |         this.currentMeeting = { |  |  |         this.currentMeeting = { | 
			
		
	
		
		
			
				
					|  |  |           ...this.newOrUpdatedMeeting, |  |  |           ...this.newOrUpdatedMeeting, | 
			
		
	
		
		
			
				
					
					|  |  |           groupId: this.currentMeeting?.groupId || "", |  |  |           groupId: (this.currentMeeting?.groupId as number) || -1, | 
			
				
				
			
		
	
		
		
	
		
		
			
				
					|  |  |         }; |  |  |         }; | 
			
		
	
		
		
			
				
					|  |  |         this.newOrUpdatedMeeting = null; |  |  |         this.newOrUpdatedMeeting = null; | 
			
		
	
		
		
			
				
					|  |  |       } else { |  |  |       } else { | 
			
		
	
		
		
			
				
					|  |  |         throw { response: response }; |  |  |         throw { response: response }; | 
			
		
	
		
		
			
				
					|  |  |       } |  |  |       } | 
			
		
	
		
		
			
				
					|  |  |     } catch (error) { |  |  |     } catch (error) { | 
			
		
	
		
		
			
				
					
					|  |  |       logConsoleAndDb('Error updating meeting: ' + errorStringForLog(error), true); |  |  |       logConsoleAndDb( | 
			
				
				
			
		
	
		
		
	
		
		
			
				
					|  |  |  |  |  |         "Error updating meeting: " + errorStringForLog(error), | 
			
		
	
		
		
			
				
					|  |  |  |  |  |         true, | 
			
		
	
		
		
			
				
					|  |  |  |  |  |       ); | 
			
		
	
		
		
			
				
					|  |  |       const errorMessage = serverMessageForUser(error); |  |  |       const errorMessage = serverMessageForUser(error); | 
			
		
	
		
		
			
				
					|  |  |       this.$notify( |  |  |       this.$notify( | 
			
		
	
		
		
			
				
					|  |  |         { |  |  |         { | 
			
		
	
		
		
			
				
					
					|  |  |           group: 'alert', |  |  |           group: "alert", | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |           type: 'danger', |  |  |           type: "danger", | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |           title: 'Error', |  |  |           title: "Error", | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |           text: errorMessage || 'Failed to update meeting. Try reloading or submitting again.', |  |  |           text: | 
			
				
				
			
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
			
				
					|  |  |  |  |  |             errorMessage || | 
			
		
	
		
		
			
				
					|  |  |  |  |  |             "Failed to update meeting. Try reloading or submitting again.", | 
			
		
	
		
		
			
				
					|  |  |         }, |  |  |         }, | 
			
		
	
		
		
			
				
					
					|  |  |         5000 |  |  |         5000, | 
			
				
				
			
		
	
		
		
	
		
		
			
				
					|  |  |       ); |  |  |       ); | 
			
		
	
		
		
			
				
					|  |  |     } finally { |  |  |     } finally { | 
			
		
	
		
		
			
				
					|  |  |       this.isLoading = false; |  |  |       this.isLoading = false; | 
			
		
	
		
		
			
				
					|  |  |     } |  |  |     } | 
			
		
	
		
		
			
				
					|  |  |   } |  |  |   } | 
			
		
	
		
		
			
				
					|  |  | 
 |  |  | 
 | 
			
		
	
		
		
			
				
					|  |  |  |  |  |   onboardMeetingMembersLink(): string { | 
			
		
	
		
		
			
				
					|  |  |  |  |  |     if (this.currentMeeting) { | 
			
		
	
		
		
			
				
					|  |  |  |  |  |       return `/onboard-meeting-members/${this.currentMeeting?.groupId}?password=${encodeURIComponent( | 
			
		
	
		
		
			
				
					|  |  |  |  |  |         this.currentMeeting?.password || "", | 
			
		
	
		
		
			
				
					|  |  |  |  |  |       )}`; | 
			
		
	
		
		
			
				
					|  |  |  |  |  |     } | 
			
		
	
		
		
			
				
					|  |  |  |  |  |     return ""; | 
			
		
	
		
		
			
				
					|  |  |  |  |  |   } | 
			
		
	
		
		
			
				
					|  |  |  |  |  | 
 | 
			
		
	
		
		
			
				
					|  |  |   handleMembersError(message: string) { |  |  |   handleMembersError(message: string) { | 
			
		
	
		
		
			
				
					|  |  |     this.$notify( |  |  |     this.$notify( | 
			
		
	
		
		
			
				
					|  |  |       { |  |  |       { | 
			
		
	
		
		
			
				
					
					|  |  |         group: 'alert', |  |  |         group: "alert", | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |         type: 'danger', |  |  |         type: "danger", | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |         title: 'Error', |  |  |         title: "Error", | 
			
				
				
			
		
	
		
		
	
		
		
	
		
		
	
		
		
			
				
					|  |  |         text: message, |  |  |         text: message, | 
			
		
	
		
		
			
				
					|  |  |       }, |  |  |       }, | 
			
		
	
		
		
			
				
					
					|  |  |       5000 |  |  |       5000, | 
			
				
				
			
		
	
		
		
	
		
		
			
				
					|  |  |     ); |  |  |     ); | 
			
		
	
		
		
			
				
					|  |  |   } |  |  |   } | 
			
		
	
		
		
			
				
					|  |  | } |  |  | } | 
			
		
	
	
		
		
			
				
					|  | 
 |