|  | @ -53,17 +53,87 @@ | 
			
		
	
		
		
			
				
					|  |  |         </div> |  |  |         </div> | 
			
		
	
		
		
			
				
					|  |  |       </div> |  |  |       </div> | 
			
		
	
		
		
			
				
					|  |  | 
 |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |       <div class="mt-4"> |  |  |       <div  | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |         <h3 |  |  |         class="text-lg leading-6 font-medium text-red-900 mt-4" | 
			
				
				
			
		
	
		
		
	
		
		
	
		
		
			
				
					|  |  |  |  |  |       > | 
			
		
	
		
		
			
				
					|  |  |  |  |  |         <p | 
			
		
	
		
		
			
				
					|  |  |           v-if="comparison && (comparison.sqliteAccounts.length > 1 || comparison.sqliteSettings.length > 1 || comparison.sqliteContacts.length > 0)" |  |  |           v-if="comparison && (comparison.sqliteAccounts.length > 1 || comparison.sqliteSettings.length > 1 || comparison.sqliteContacts.length > 0)" | 
			
		
	
		
		
			
				
					|  |  |           class="text-lg leading-6 font-medium text-red-900 mb-4" |  |  |  | 
			
		
	
		
		
			
				
					|  |  |         > |  |  |         > | 
			
		
	
		
		
			
				
					
					|  |  |           Beware: you have unexpected existing data in the SQLite database that will be overwritten. You should talk with Trent. |  |  |           Beware: you have unexpected existing data in the SQLite database that will be overwritten. Talk with Trent. | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |         </h3> |  |  |         </p> | 
			
				
				
			
		
	
		
		
	
		
		
	
		
		
			
				
					|  |  |  |  |  |         <p | 
			
		
	
		
		
			
				
					|  |  |  |  |  |           v-if="cannotfindMainAccount" | 
			
		
	
		
		
			
				
					|  |  |  |  |  |         > | 
			
		
	
		
		
			
				
					|  |  |  |  |  |           We cannot find your main account. Talk with Trent. | 
			
		
	
		
		
			
				
					|  |  |  |  |  |         </p> | 
			
		
	
		
		
			
				
					|  |  |  |  |  |         <p | 
			
		
	
		
		
			
				
					|  |  |  |  |  |           v-if="hasMultipleMnemonics" | 
			
		
	
		
		
			
				
					|  |  |  |  |  |         > | 
			
		
	
		
		
			
				
					|  |  |  |  |  |           You have multiple accounts. If you didn't mean to, talk with Trent. | 
			
		
	
		
		
			
				
					|  |  |  |  |  |         </p> | 
			
		
	
		
		
			
				
					|  |  |  |  |  |       </div> | 
			
		
	
		
		
			
				
					|  |  |  |  |  |       <div> | 
			
		
	
		
		
			
				
					|  |  |  |  |  |         <p v-if="downloadMnemonic" class="text-green-500"> | 
			
		
	
		
		
			
				
					|  |  |  |  |  |           Here is your seed. Write it down! | 
			
		
	
		
		
			
				
					|  |  |  |  |  |           <br /> | 
			
		
	
		
		
			
				
					|  |  |  |  |  |           {{ downloadMnemonic }} | 
			
		
	
		
		
			
				
					|  |  |  |  |  |         </p> | 
			
		
	
		
		
			
				
					|  |  |       </div> |  |  |       </div> | 
			
		
	
		
		
			
				
					|  |  | 
 |  |  | 
 | 
			
		
	
		
		
			
				
					|  |  |       <!-- Action Buttons --> |  |  |       <!-- Action Buttons --> | 
			
		
	
		
		
			
				
					|  |  |       <div class="mt-4 mb-8 flex flex-wrap gap-4"> |  |  |       <div class="mt-4 mb-8 flex flex-wrap gap-4"> | 
			
		
	
		
		
			
				
					|  |  |  |  |  |         <button | 
			
		
	
		
		
			
				
					|  |  |  |  |  |           :disabled="isLoading" | 
			
		
	
		
		
			
				
					|  |  |  |  |  |           class="inline-flex items-center px-4 py-2 border border-transparent text-sm font-medium rounded-md shadow-sm text-white bg-blue-600 hover:bg-blue-700 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-blue-500 disabled:opacity-50 disabled:cursor-not-allowed" | 
			
		
	
		
		
			
				
					|  |  |  |  |  |           @click="downloadAccount" | 
			
		
	
		
		
			
				
					|  |  |  |  |  |         > | 
			
		
	
		
		
			
				
					|  |  |  |  |  |           <IconRenderer | 
			
		
	
		
		
			
				
					|  |  |  |  |  |             v-if="isLoading" | 
			
		
	
		
		
			
				
					|  |  |  |  |  |             icon-name="spinner" | 
			
		
	
		
		
			
				
					|  |  |  |  |  |             svg-class="animate-spin -ml-1 mr-3 h-5 w-5 text-white" | 
			
		
	
		
		
			
				
					|  |  |  |  |  |             fill="currentColor" | 
			
		
	
		
		
			
				
					|  |  |  |  |  |           /> | 
			
		
	
		
		
			
				
					|  |  |  |  |  |           <IconRenderer | 
			
		
	
		
		
			
				
					|  |  |  |  |  |             v-else | 
			
		
	
		
		
			
				
					|  |  |  |  |  |             icon-name="chart" | 
			
		
	
		
		
			
				
					|  |  |  |  |  |             svg-class="-ml-1 mr-3 h-5 w-5" | 
			
		
	
		
		
			
				
					|  |  |  |  |  |           /> | 
			
		
	
		
		
			
				
					|  |  |  |  |  |           Download Account | 
			
		
	
		
		
			
				
					|  |  |  |  |  |         </button> | 
			
		
	
		
		
			
				
					|  |  |  |  |  | 
 | 
			
		
	
		
		
			
				
					|  |  |  |  |  |         <button | 
			
		
	
		
		
			
				
					|  |  |  |  |  |           :disabled="isLoading" | 
			
		
	
		
		
			
				
					|  |  |  |  |  |           class="inline-flex items-center px-4 py-2 border border-transparent text-sm font-medium rounded-md shadow-sm text-white bg-blue-600 hover:bg-blue-700 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-blue-500 disabled:opacity-50 disabled:cursor-not-allowed" | 
			
		
	
		
		
			
				
					|  |  |  |  |  |           @click="downloadSettingsContacts" | 
			
		
	
		
		
			
				
					|  |  |  |  |  |         > | 
			
		
	
		
		
			
				
					|  |  |  |  |  |           <IconRenderer | 
			
		
	
		
		
			
				
					|  |  |  |  |  |             v-if="isLoading" | 
			
		
	
		
		
			
				
					|  |  |  |  |  |             icon-name="spinner" | 
			
		
	
		
		
			
				
					|  |  |  |  |  |             svg-class="animate-spin -ml-1 mr-3 h-5 w-5 text-white" | 
			
		
	
		
		
			
				
					|  |  |  |  |  |             fill="currentColor" | 
			
		
	
		
		
			
				
					|  |  |  |  |  |           /> | 
			
		
	
		
		
			
				
					|  |  |  |  |  |           <IconRenderer | 
			
		
	
		
		
			
				
					|  |  |  |  |  |             v-else | 
			
		
	
		
		
			
				
					|  |  |  |  |  |             icon-name="chart" | 
			
		
	
		
		
			
				
					|  |  |  |  |  |             svg-class="-ml-1 mr-3 h-5 w-5" | 
			
		
	
		
		
			
				
					|  |  |  |  |  |           /> | 
			
		
	
		
		
			
				
					|  |  |  |  |  |           Download Settings & Contacts | 
			
		
	
		
		
			
				
					|  |  |  |  |  |         </button> | 
			
		
	
		
		
			
				
					|  |  |  |  |  | 
 | 
			
		
	
		
		
			
				
					|  |  |  |  |  |         <div> | 
			
		
	
		
		
			
				
					|  |  |  |  |  |           <a ref="downloadLink"> | 
			
		
	
		
		
			
				
					|  |  |  |  |  |             <!-- No content necessary --> | 
			
		
	
		
		
			
				
					|  |  |  |  |  |             <p | 
			
		
	
		
		
			
				
					|  |  |  |  |  |               v-if="downloadSettingsContactsBlob" | 
			
		
	
		
		
			
				
					|  |  |  |  |  |               class="block w-full text-center text-md bg-gradient-to-b from-green-500 to-green-800 shadow-[inset_0_-1px_0_0_rgba(0,0,0,0.5)] text-white px-1.5 py-2 rounded-md mb-6" | 
			
		
	
		
		
			
				
					|  |  |  |  |  |             > | 
			
		
	
		
		
			
				
					|  |  |  |  |  |               If no download happened yet, click here to download now. | 
			
		
	
		
		
			
				
					|  |  |  |  |  |             </p> | 
			
		
	
		
		
			
				
					|  |  |  |  |  |           </a> | 
			
		
	
		
		
			
				
					|  |  |  |  |  |         </div> | 
			
		
	
		
		
			
				
					|  |  |  |  |  | 
 | 
			
		
	
		
		
			
				
					|  |  |  |  |  |         <div class="w-full border-t border-gray-200 my-4"></div> | 
			
		
	
		
		
			
				
					|  |  |  |  |  | 
 | 
			
		
	
		
		
			
				
					|  |  |         <button |  |  |         <button | 
			
		
	
		
		
			
				
					|  |  |           :disabled="isLoading" |  |  |           :disabled="isLoading" | 
			
		
	
		
		
			
				
					|  |  |           class="inline-flex items-center px-4 py-2 border border-transparent text-sm font-medium rounded-md shadow-sm text-white bg-blue-600 hover:bg-blue-700 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-blue-500 disabled:opacity-50 disabled:cursor-not-allowed" |  |  |           class="inline-flex items-center px-4 py-2 border border-transparent text-sm font-medium rounded-md shadow-sm text-white bg-blue-600 hover:bg-blue-700 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-blue-500 disabled:opacity-50 disabled:cursor-not-allowed" | 
			
		
	
	
		
		
			
				
					|  | @ -84,7 +154,7 @@ | 
			
		
	
		
		
			
				
					|  |  |         </button> |  |  |         </button> | 
			
		
	
		
		
			
				
					|  |  | 
 |  |  | 
 | 
			
		
	
		
		
			
				
					|  |  |         <button |  |  |         <button | 
			
		
	
		
		
			
				
					
					|  |  |           :disabled="isLoading || !comparison" |  |  |           :disabled="isLoading" | 
			
				
				
			
		
	
		
		
	
		
		
			
				
					|  |  |           class="inline-flex items-center px-6 py-3 border border-transparent text-base font-medium rounded-md shadow-sm text-white bg-indigo-600 hover:bg-indigo-700 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-indigo-500 disabled:opacity-50 disabled:cursor-not-allowed" |  |  |           class="inline-flex items-center px-6 py-3 border border-transparent text-base font-medium rounded-md shadow-sm text-white bg-indigo-600 hover:bg-indigo-700 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-indigo-500 disabled:opacity-50 disabled:cursor-not-allowed" | 
			
		
	
		
		
			
				
					|  |  |           @click="migrateAll" |  |  |           @click="migrateAll" | 
			
		
	
		
		
			
				
					|  |  |         > |  |  |         > | 
			
		
	
	
		
		
			
				
					|  | @ -124,7 +194,7 @@ | 
			
		
	
		
		
			
				
					|  |  |         </button> |  |  |         </button> | 
			
		
	
		
		
			
				
					|  |  | 
 |  |  | 
 | 
			
		
	
		
		
			
				
					|  |  |         <button |  |  |         <button | 
			
		
	
		
		
			
				
					
					|  |  |           :disabled="isLoading || !comparison" |  |  |           :disabled="isLoading || !downloadSettingsContactsBlob || !comparison" | 
			
				
				
			
		
	
		
		
	
		
		
			
				
					|  |  |           class="inline-flex items-center px-4 py-2 border border-transparent text-sm font-medium rounded-md shadow-sm text-white bg-green-600 hover:bg-green-700 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-green-500 disabled:opacity-50 disabled:cursor-not-allowed" |  |  |           class="inline-flex items-center px-4 py-2 border border-transparent text-sm font-medium rounded-md shadow-sm text-white bg-green-600 hover:bg-green-700 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-green-500 disabled:opacity-50 disabled:cursor-not-allowed" | 
			
		
	
		
		
			
				
					|  |  |           @click="migrateContacts" |  |  |           @click="migrateContacts" | 
			
		
	
		
		
			
				
					|  |  |         > |  |  |         > | 
			
		
	
	
		
		
			
				
					|  | @ -133,7 +203,7 @@ | 
			
		
	
		
		
			
				
					|  |  |         </button> |  |  |         </button> | 
			
		
	
		
		
			
				
					|  |  | 
 |  |  | 
 | 
			
		
	
		
		
			
				
					|  |  |         <button |  |  |         <button | 
			
		
	
		
		
			
				
					
					|  |  |           :disabled="isLoading || !comparison" |  |  |           :disabled="isLoading || !downloadSettingsContactsBlob || !comparison" | 
			
				
				
			
		
	
		
		
	
		
		
			
				
					|  |  |           class="inline-flex items-center px-4 py-2 border border-transparent text-sm font-medium rounded-md shadow-sm text-white bg-purple-600 hover:bg-purple-700 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-purple-500 disabled:opacity-50 disabled:cursor-not-allowed" |  |  |           class="inline-flex items-center px-4 py-2 border border-transparent text-sm font-medium rounded-md shadow-sm text-white bg-purple-600 hover:bg-purple-700 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-purple-500 disabled:opacity-50 disabled:cursor-not-allowed" | 
			
		
	
		
		
			
				
					|  |  |           @click="migrateSettings" |  |  |           @click="migrateSettings" | 
			
		
	
		
		
			
				
					|  |  |         > |  |  |         > | 
			
		
	
	
		
		
			
				
					|  | @ -142,7 +212,7 @@ | 
			
		
	
		
		
			
				
					|  |  |         </button> |  |  |         </button> | 
			
		
	
		
		
			
				
					|  |  | 
 |  |  | 
 | 
			
		
	
		
		
			
				
					|  |  |         <button |  |  |         <button | 
			
		
	
		
		
			
				
					
					|  |  |           :disabled="isLoading || !comparison" |  |  |           :disabled="isLoading || !downloadMnemonic || !comparison" | 
			
				
				
			
		
	
		
		
	
		
		
			
				
					|  |  |           class="inline-flex items-center px-4 py-2 border border-transparent text-sm font-medium rounded-md shadow-sm text-white bg-orange-600 hover:bg-orange-700 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-orange-500 disabled:opacity-50 disabled:cursor-not-allowed" |  |  |           class="inline-flex items-center px-4 py-2 border border-transparent text-sm font-medium rounded-md shadow-sm text-white bg-orange-600 hover:bg-orange-700 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-orange-500 disabled:opacity-50 disabled:cursor-not-allowed" | 
			
		
	
		
		
			
				
					|  |  |           @click="migrateAccounts" |  |  |           @click="migrateAccounts" | 
			
		
	
		
		
			
				
					|  |  |         > |  |  |         > | 
			
		
	
	
		
		
			
				
					|  | @ -440,7 +510,7 @@ | 
			
		
	
		
		
			
				
					|  |  |                       svg-class="h-5 w-5 text-yellow-600 mr-2" |  |  |                       svg-class="h-5 w-5 text-yellow-600 mr-2" | 
			
		
	
		
		
			
				
					|  |  |                     /> |  |  |                     /> | 
			
		
	
		
		
			
				
					|  |  |                     <span class="text-sm font-medium text-yellow-900" |  |  |                     <span class="text-sm font-medium text-yellow-900" | 
			
		
	
		
		
			
				
					
					|  |  |                       >Modified</span |  |  |                       >Modify</span | 
			
				
				
			
		
	
		
		
	
		
		
			
				
					|  |  |                     > |  |  |                     > | 
			
		
	
		
		
			
				
					|  |  |                   </div> |  |  |                   </div> | 
			
		
	
		
		
			
				
					|  |  |                   <span class="text-sm font-bold text-yellow-900">{{ |  |  |                   <span class="text-sm font-bold text-yellow-900">{{ | 
			
		
	
	
		
		
			
				
					|  | @ -457,7 +527,7 @@ | 
			
		
	
		
		
			
				
					|  |  |                       svg-class="h-5 w-5 text-red-600 mr-2" |  |  |                       svg-class="h-5 w-5 text-red-600 mr-2" | 
			
		
	
		
		
			
				
					|  |  |                     /> |  |  |                     /> | 
			
		
	
		
		
			
				
					|  |  |                     <span class="text-sm font-medium text-red-900" |  |  |                     <span class="text-sm font-medium text-red-900" | 
			
		
	
		
		
			
				
					
					|  |  |                       >Missing</span |  |  |                       >Keep</span | 
			
				
				
			
		
	
		
		
	
		
		
			
				
					|  |  |                     > |  |  |                     > | 
			
		
	
		
		
			
				
					|  |  |                   </div> |  |  |                   </div> | 
			
		
	
		
		
			
				
					|  |  |                   <span class="text-sm font-bold text-red-900">{{ |  |  |                   <span class="text-sm font-bold text-red-900">{{ | 
			
		
	
	
		
		
			
				
					|  | @ -489,13 +559,13 @@ | 
			
		
	
		
		
			
				
					|  |  |                 </div> |  |  |                 </div> | 
			
		
	
		
		
			
				
					|  |  |               </div> |  |  |               </div> | 
			
		
	
		
		
			
				
					|  |  | 
 |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |               <!-- Modified Accounts --> |  |  |               <!-- Modify Accounts --> | 
			
				
				
			
		
	
		
		
	
		
		
			
				
					|  |  |               <div |  |  |               <div | 
			
		
	
		
		
			
				
					|  |  |                 v-if="comparison.differences.accounts.modified.length > 0" |  |  |                 v-if="comparison.differences.accounts.modified.length > 0" | 
			
		
	
		
		
			
				
					|  |  |                 class="mt-4" |  |  |                 class="mt-4" | 
			
		
	
		
		
			
				
					|  |  |               > |  |  |               > | 
			
		
	
		
		
			
				
					|  |  |                 <h4 class="text-sm font-medium text-gray-900 mb-2"> |  |  |                 <h4 class="text-sm font-medium text-gray-900 mb-2"> | 
			
		
	
		
		
			
				
					
					|  |  |                   Modified Accounts ({{ comparison.differences.accounts.modified.length }}): |  |  |                   Modify Accounts ({{ comparison.differences.accounts.modified.length }}): | 
			
				
				
			
		
	
		
		
	
		
		
			
				
					|  |  |                 </h4> |  |  |                 </h4> | 
			
		
	
		
		
			
				
					|  |  |                 <div class="space-y-1"> |  |  |                 <div class="space-y-1"> | 
			
		
	
		
		
			
				
					|  |  |                   <div |  |  |                   <div | 
			
		
	
	
		
		
			
				
					|  | @ -512,13 +582,13 @@ | 
			
		
	
		
		
			
				
					|  |  |                 </div> |  |  |                 </div> | 
			
		
	
		
		
			
				
					|  |  |               </div> |  |  |               </div> | 
			
		
	
		
		
			
				
					|  |  | 
 |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |               <!-- Missing Accounts --> |  |  |               <!-- Keep Accounts --> | 
			
				
				
			
		
	
		
		
	
		
		
			
				
					|  |  |               <div |  |  |               <div | 
			
		
	
		
		
			
				
					|  |  |                 v-if="comparison.differences.accounts.missing.filter(a => a.did).length > 0" |  |  |                 v-if="comparison.differences.accounts.missing.filter(a => a.did).length > 0" | 
			
		
	
		
		
			
				
					|  |  |                 class="mt-4" |  |  |                 class="mt-4" | 
			
		
	
		
		
			
				
					|  |  |               > |  |  |               > | 
			
		
	
		
		
			
				
					|  |  |                 <h4 class="text-sm font-medium text-gray-900 mb-2"> |  |  |                 <h4 class="text-sm font-medium text-gray-900 mb-2"> | 
			
		
	
		
		
			
				
					
					|  |  |                   Missing Accounts ({{ comparison.differences.accounts.missing.filter(a => a.did).length }}): |  |  |                   Keep Accounts ({{ comparison.differences.accounts.missing.filter(a => a.did).length }}): | 
			
				
				
			
		
	
		
		
	
		
		
			
				
					|  |  |                 </h4> |  |  |                 </h4> | 
			
		
	
		
		
			
				
					|  |  |                 <div class="space-y-1"> |  |  |                 <div class="space-y-1"> | 
			
		
	
		
		
			
				
					|  |  |                   <div |  |  |                   <div | 
			
		
	
	
		
		
			
				
					|  | @ -569,7 +639,7 @@ | 
			
		
	
		
		
			
				
					|  |  |                       svg-class="h-5 w-5 text-yellow-600 mr-2" |  |  |                       svg-class="h-5 w-5 text-yellow-600 mr-2" | 
			
		
	
		
		
			
				
					|  |  |                     /> |  |  |                     /> | 
			
		
	
		
		
			
				
					|  |  |                     <span class="text-sm font-medium text-yellow-900" |  |  |                     <span class="text-sm font-medium text-yellow-900" | 
			
		
	
		
		
			
				
					
					|  |  |                       >Modified</span |  |  |                       >Modify</span | 
			
				
				
			
		
	
		
		
	
		
		
			
				
					|  |  |                     > |  |  |                     > | 
			
		
	
		
		
			
				
					|  |  |                   </div> |  |  |                   </div> | 
			
		
	
		
		
			
				
					|  |  |                   <span class="text-sm font-bold text-yellow-900">{{ |  |  |                   <span class="text-sm font-bold text-yellow-900">{{ | 
			
		
	
	
		
		
			
				
					|  | @ -586,7 +656,7 @@ | 
			
		
	
		
		
			
				
					|  |  |                       svg-class="h-5 w-5 text-red-600 mr-2" |  |  |                       svg-class="h-5 w-5 text-red-600 mr-2" | 
			
		
	
		
		
			
				
					|  |  |                     /> |  |  |                     /> | 
			
		
	
		
		
			
				
					|  |  |                     <span class="text-sm font-medium text-red-900" |  |  |                     <span class="text-sm font-medium text-red-900" | 
			
		
	
		
		
			
				
					
					|  |  |                       >Missing</span |  |  |                       >Keep</span | 
			
				
				
			
		
	
		
		
	
		
		
			
				
					|  |  |                     > |  |  |                     > | 
			
		
	
		
		
			
				
					|  |  |                   </div> |  |  |                   </div> | 
			
		
	
		
		
			
				
					|  |  |                   <span class="text-sm font-bold text-red-900">{{ |  |  |                   <span class="text-sm font-bold text-red-900">{{ | 
			
		
	
	
		
		
			
				
					|  | @ -616,13 +686,13 @@ | 
			
		
	
		
		
			
				
					|  |  |                 </div> |  |  |                 </div> | 
			
		
	
		
		
			
				
					|  |  |               </div> |  |  |               </div> | 
			
		
	
		
		
			
				
					|  |  | 
 |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |               <!-- Modified Settings --> |  |  |               <!-- Modify Settings --> | 
			
				
				
			
		
	
		
		
	
		
		
			
				
					|  |  |               <div |  |  |               <div | 
			
		
	
		
		
			
				
					|  |  |                 v-if="comparison.differences.settings.modified.length > 0" |  |  |                 v-if="comparison.differences.settings.modified.length > 0" | 
			
		
	
		
		
			
				
					|  |  |                 class="mt-4" |  |  |                 class="mt-4" | 
			
		
	
		
		
			
				
					|  |  |               > |  |  |               > | 
			
		
	
		
		
			
				
					|  |  |                 <h4 class="text-sm font-medium text-gray-900 mb-2"> |  |  |                 <h4 class="text-sm font-medium text-gray-900 mb-2"> | 
			
		
	
		
		
			
				
					
					|  |  |                   Modified Settings ({{ comparison.differences.settings.modified.length }}): |  |  |                   Modify Settings ({{ comparison.differences.settings.modified.length }}): | 
			
				
				
			
		
	
		
		
	
		
		
			
				
					|  |  |                 </h4> |  |  |                 </h4> | 
			
		
	
		
		
			
				
					|  |  |                 <div class="space-y-1"> |  |  |                 <div class="space-y-1"> | 
			
		
	
		
		
			
				
					|  |  |                   <div |  |  |                   <div | 
			
		
	
	
		
		
			
				
					|  | @ -637,13 +707,13 @@ | 
			
		
	
		
		
			
				
					|  |  |                 </div> |  |  |                 </div> | 
			
		
	
		
		
			
				
					|  |  |               </div> |  |  |               </div> | 
			
		
	
		
		
			
				
					|  |  | 
 |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |               <!-- Missing Settings --> |  |  |               <!-- Keep Settings --> | 
			
				
				
			
		
	
		
		
	
		
		
			
				
					|  |  |               <div |  |  |               <div | 
			
		
	
		
		
			
				
					|  |  |                 v-if="comparison.differences.settings.missing.filter(s => s.accountDid || s.activeDid).length > 0" |  |  |                 v-if="comparison.differences.settings.missing.filter(s => s.accountDid || s.activeDid).length > 0" | 
			
		
	
		
		
			
				
					|  |  |                 class="mt-4" |  |  |                 class="mt-4" | 
			
		
	
		
		
			
				
					|  |  |               > |  |  |               > | 
			
		
	
		
		
			
				
					|  |  |                 <h4 class="text-sm font-medium text-gray-900 mb-2"> |  |  |                 <h4 class="text-sm font-medium text-gray-900 mb-2"> | 
			
		
	
		
		
			
				
					
					|  |  |                   Missing Settings ({{ comparison.differences.settings.missing.filter(s => s.accountDid || s.activeDid).length }}): |  |  |                   Keep Settings ({{ comparison.differences.settings.missing.filter(s => s.accountDid || s.activeDid).length }}): | 
			
				
				
			
		
	
		
		
	
		
		
			
				
					|  |  |                 </h4> |  |  |                 </h4> | 
			
		
	
		
		
			
				
					|  |  |                 <div class="space-y-1"> |  |  |                 <div class="space-y-1"> | 
			
		
	
		
		
			
				
					|  |  |                   <div |  |  |                   <div | 
			
		
	
	
		
		
			
				
					|  | @ -692,7 +762,7 @@ | 
			
		
	
		
		
			
				
					|  |  |                       svg-class="h-5 w-5 text-yellow-600 mr-2" |  |  |                       svg-class="h-5 w-5 text-yellow-600 mr-2" | 
			
		
	
		
		
			
				
					|  |  |                     /> |  |  |                     /> | 
			
		
	
		
		
			
				
					|  |  |                     <span class="text-sm font-medium text-yellow-900" |  |  |                     <span class="text-sm font-medium text-yellow-900" | 
			
		
	
		
		
			
				
					
					|  |  |                       >Modified</span |  |  |                       >Modify</span | 
			
				
				
			
		
	
		
		
	
		
		
			
				
					|  |  |                     > |  |  |                     > | 
			
		
	
		
		
			
				
					|  |  |                   </div> |  |  |                   </div> | 
			
		
	
		
		
			
				
					|  |  |                   <span class="text-sm font-bold text-yellow-900">{{ |  |  |                   <span class="text-sm font-bold text-yellow-900">{{ | 
			
		
	
	
		
		
			
				
					|  | @ -709,7 +779,7 @@ | 
			
		
	
		
		
			
				
					|  |  |                       svg-class="h-5 w-5 text-red-600 mr-2" |  |  |                       svg-class="h-5 w-5 text-red-600 mr-2" | 
			
		
	
		
		
			
				
					|  |  |                     /> |  |  |                     /> | 
			
		
	
		
		
			
				
					|  |  |                     <span class="text-sm font-medium text-red-900" |  |  |                     <span class="text-sm font-medium text-red-900" | 
			
		
	
		
		
			
				
					
					|  |  |                       >Missing</span |  |  |                       >Keep</span | 
			
				
				
			
		
	
		
		
	
		
		
			
				
					|  |  |                     > |  |  |                     > | 
			
		
	
		
		
			
				
					|  |  |                   </div> |  |  |                   </div> | 
			
		
	
		
		
			
				
					|  |  |                   <span class="text-sm font-bold text-red-900">{{ |  |  |                   <span class="text-sm font-bold text-red-900">{{ | 
			
		
	
	
		
		
			
				
					|  | @ -739,13 +809,13 @@ | 
			
		
	
		
		
			
				
					|  |  |                 </div> |  |  |                 </div> | 
			
		
	
		
		
			
				
					|  |  |               </div> |  |  |               </div> | 
			
		
	
		
		
			
				
					|  |  | 
 |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |               <!-- Modified Contacts --> |  |  |               <!-- Modify Contacts --> | 
			
				
				
			
		
	
		
		
	
		
		
			
				
					|  |  |               <div |  |  |               <div | 
			
		
	
		
		
			
				
					|  |  |                 v-if="comparison.differences.contacts.modified.length > 0" |  |  |                 v-if="comparison.differences.contacts.modified.length > 0" | 
			
		
	
		
		
			
				
					|  |  |                 class="mt-4" |  |  |                 class="mt-4" | 
			
		
	
		
		
			
				
					|  |  |               > |  |  |               > | 
			
		
	
		
		
			
				
					|  |  |                 <h4 class="text-sm font-medium text-gray-900 mb-2"> |  |  |                 <h4 class="text-sm font-medium text-gray-900 mb-2"> | 
			
		
	
		
		
			
				
					
					|  |  |                   Modified Contacts ({{ comparison.differences.contacts.modified.length }}): |  |  |                   Modify Contacts ({{ comparison.differences.contacts.modified.length }}): | 
			
				
				
			
		
	
		
		
	
		
		
			
				
					|  |  |                 </h4> |  |  |                 </h4> | 
			
		
	
		
		
			
				
					|  |  |                 <div class="space-y-1"> |  |  |                 <div class="space-y-1"> | 
			
		
	
		
		
			
				
					|  |  |                   <div |  |  |                   <div | 
			
		
	
	
		
		
			
				
					|  | @ -760,13 +830,13 @@ | 
			
		
	
		
		
			
				
					|  |  |                 </div> |  |  |                 </div> | 
			
		
	
		
		
			
				
					|  |  |               </div> |  |  |               </div> | 
			
		
	
		
		
			
				
					|  |  | 
 |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |               <!-- Missing Contacts --> |  |  |               <!-- Keep Contacts --> | 
			
				
				
			
		
	
		
		
	
		
		
			
				
					|  |  |               <div |  |  |               <div | 
			
		
	
		
		
			
				
					|  |  |                 v-if="comparison.differences.contacts.missing.filter(c => c.did).length > 0" |  |  |                 v-if="comparison.differences.contacts.missing.filter(c => c.did).length > 0" | 
			
		
	
		
		
			
				
					|  |  |                 class="mt-4" |  |  |                 class="mt-4" | 
			
		
	
		
		
			
				
					|  |  |               > |  |  |               > | 
			
		
	
		
		
			
				
					|  |  |                 <h4 class="text-sm font-medium text-gray-900 mb-2"> |  |  |                 <h4 class="text-sm font-medium text-gray-900 mb-2"> | 
			
		
	
		
		
			
				
					
					|  |  |                   Missing Contacts ({{ comparison.differences.contacts.missing.filter(c => c.did).length }}): |  |  |                   Keep Contacts ({{ comparison.differences.contacts.missing.filter(c => c.did).length }}): | 
			
				
				
			
		
	
		
		
	
		
		
			
				
					|  |  |                 </h4> |  |  |                 </h4> | 
			
		
	
		
		
			
				
					|  |  |                 <div class="space-y-1"> |  |  |                 <div class="space-y-1"> | 
			
		
	
		
		
			
				
					|  |  |                   <div |  |  |                   <div | 
			
		
	
	
		
		
			
				
					|  | @ -801,6 +871,7 @@ | 
			
		
	
		
		
			
				
					|  |  | </template> |  |  | </template> | 
			
		
	
		
		
			
				
					|  |  | 
 |  |  | 
 | 
			
		
	
		
		
			
				
					|  |  | <script lang="ts"> |  |  | <script lang="ts"> | 
			
		
	
		
		
			
				
					|  |  |  |  |  | import { ref } from "vue"; | 
			
		
	
		
		
			
				
					|  |  | import { Component, Vue } from "vue-facing-decorator"; |  |  | import { Component, Vue } from "vue-facing-decorator"; | 
			
		
	
		
		
			
				
					|  |  | import { useClipboard } from "@vueuse/core"; |  |  | import { useClipboard } from "@vueuse/core"; | 
			
		
	
		
		
			
				
					|  |  | 
 |  |  | 
 | 
			
		
	
	
		
		
			
				
					|  | @ -817,6 +888,7 @@ import { | 
			
		
	
		
		
			
				
					|  |  |   getDexieAccounts, |  |  |   getDexieAccounts, | 
			
		
	
		
		
			
				
					|  |  |   getDexieSettings, |  |  |   getDexieSettings, | 
			
		
	
		
		
			
				
					|  |  |   getDexieContacts, |  |  |   getDexieContacts, | 
			
		
	
		
		
			
				
					|  |  |  |  |  |   getDexieExportBlob, | 
			
		
	
		
		
			
				
					|  |  | } from "../services/indexedDBMigrationService"; |  |  | } from "../services/indexedDBMigrationService"; | 
			
		
	
		
		
			
				
					|  |  | import { logger } from "../utils/logger"; |  |  | import { logger } from "../utils/logger"; | 
			
		
	
		
		
			
				
					|  |  | 
 |  |  | 
 | 
			
		
	
	
		
		
			
				
					|  | @ -847,13 +919,17 @@ import { logger } from "../utils/logger"; | 
			
		
	
		
		
			
				
					|  |  | }) |  |  | }) | 
			
		
	
		
		
			
				
					|  |  | export default class DatabaseMigration extends Vue { |  |  | export default class DatabaseMigration extends Vue { | 
			
		
	
		
		
			
				
					|  |  |   // Component state |  |  |   // Component state | 
			
		
	
		
		
			
				
					|  |  |  |  |  |   private comparison: DataComparison | null = null; | 
			
		
	
		
		
			
				
					|  |  |  |  |  |   private cannotfindMainAccount = false; | 
			
		
	
		
		
			
				
					|  |  |  |  |  |   private downloadSettingsContactsBlob?: Blob; | 
			
		
	
		
		
			
				
					|  |  |  |  |  |   private downloadMnemonic?: string; | 
			
		
	
		
		
			
				
					|  |  |  |  |  |   private hasMultipleMnemonics = false; | 
			
		
	
		
		
			
				
					|  |  |   private isLoading = false; |  |  |   private isLoading = false; | 
			
		
	
		
		
			
				
					|  |  |   private loadingMessage = ""; |  |  |   private loadingMessage = ""; | 
			
		
	
		
		
			
				
					|  |  |   private error = ""; |  |  |   private error = ""; | 
			
		
	
		
		
			
				
					|  |  |   private exportedData: Record<string, any> | null = null; |  |  |   private exportedData: Record<string, any> | null = null; | 
			
		
	
		
		
			
				
					|  |  |   private successMessage = ""; |  |  |  | 
			
		
	
		
		
			
				
					|  |  |   private comparison: DataComparison | null = null; |  |  |  | 
			
		
	
		
		
			
				
					|  |  |   private overwriteExisting = true; |  |  |   private overwriteExisting = true; | 
			
		
	
		
		
			
				
					|  |  |  |  |  |   private successMessage = ""; | 
			
		
	
		
		
			
				
					|  |  | 
 |  |  | 
 | 
			
		
	
		
		
			
				
					|  |  |   useClipboard = useClipboard; |  |  |   useClipboard = useClipboard; | 
			
		
	
		
		
			
				
					|  |  | 
 |  |  | 
 | 
			
		
	
	
		
		
			
				
					|  | @ -876,23 +952,6 @@ export default class DatabaseMigration extends Vue { | 
			
		
	
		
		
			
				
					|  |  |     return `${type} (${did || 'no DID'})`; |  |  |     return `${type} (${did || 'no DID'})`; | 
			
		
	
		
		
			
				
					|  |  |   } |  |  |   } | 
			
		
	
		
		
			
				
					|  |  | 
 |  |  | 
 | 
			
		
	
		
		
			
				
					|  |  |   /** |  |  |  | 
			
		
	
		
		
			
				
					|  |  |    * Computed property to get the DID for a setting |  |  |  | 
			
		
	
		
		
			
				
					|  |  |    * Handles both live comparison data and exported JSON format |  |  |  | 
			
		
	
		
		
			
				
					|  |  |    * |  |  |  | 
			
		
	
		
		
			
				
					|  |  |    * @param {any} setting - The setting object |  |  |  | 
			
		
	
		
		
			
				
					|  |  |    * @returns {string} The DID for the setting |  |  |  | 
			
		
	
		
		
			
				
					|  |  |    */ |  |  |  | 
			
		
	
		
		
			
				
					|  |  |   getSettingDid(setting: any): string { |  |  |  | 
			
		
	
		
		
			
				
					|  |  |     // Handle exported JSON format (has 'did' field) |  |  |  | 
			
		
	
		
		
			
				
					|  |  |     if (setting.did) { |  |  |  | 
			
		
	
		
		
			
				
					|  |  |       return setting.did; |  |  |  | 
			
		
	
		
		
			
				
					|  |  |     } |  |  |  | 
			
		
	
		
		
			
				
					|  |  |      |  |  |  | 
			
		
	
		
		
			
				
					|  |  |     // Handle live comparison data (has 'activeDid' or 'accountDid' fields) |  |  |  | 
			
		
	
		
		
			
				
					|  |  |     return setting.activeDid || setting.accountDid || 'no DID'; |  |  |  | 
			
		
	
		
		
			
				
					|  |  |   } |  |  |  | 
			
		
	
		
		
			
				
					|  |  | 
 |  |  |  | 
			
		
	
		
		
			
				
					|  |  |   /** |  |  |   /** | 
			
		
	
		
		
			
				
					|  |  |    * Computed property to check if an account has identity |  |  |    * Computed property to check if an account has identity | 
			
		
	
		
		
			
				
					|  |  |    * Handles both live comparison data and exported JSON format |  |  |    * Handles both live comparison data and exported JSON format | 
			
		
	
	
		
		
			
				
					|  | @ -947,6 +1006,36 @@ export default class DatabaseMigration extends Vue { | 
			
		
	
		
		
			
				
					|  |  |     } |  |  |     } | 
			
		
	
		
		
			
				
					|  |  |   } |  |  |   } | 
			
		
	
		
		
			
				
					|  |  | 
 |  |  | 
 | 
			
		
	
		
		
			
				
					|  |  |  |  |  |   async downloadAccount() { | 
			
		
	
		
		
			
				
					|  |  |  |  |  |     const accounts = await getDexieAccounts(); | 
			
		
	
		
		
			
				
					|  |  |  |  |  |     this.hasMultipleMnemonics = accounts.length > 1; | 
			
		
	
		
		
			
				
					|  |  |  |  |  |     const settings = await getDexieSettings(); | 
			
		
	
		
		
			
				
					|  |  |  |  |  |     let primaryAccount; | 
			
		
	
		
		
			
				
					|  |  |  |  |  |     if (settings.length > 0) { | 
			
		
	
		
		
			
				
					|  |  |  |  |  |       const primaryDid = settings[0].activeDid; | 
			
		
	
		
		
			
				
					|  |  |  |  |  |       primaryAccount = accounts.find(acc => acc.did === primaryDid); | 
			
		
	
		
		
			
				
					|  |  |  |  |  |       if (!primaryAccount) { | 
			
		
	
		
		
			
				
					|  |  |  |  |  |         this.cannotfindMainAccount = true; | 
			
		
	
		
		
			
				
					|  |  |  |  |  |         // abort everything | 
			
		
	
		
		
			
				
					|  |  |  |  |  |       } | 
			
		
	
		
		
			
				
					|  |  |  |  |  |     } else { | 
			
		
	
		
		
			
				
					|  |  |  |  |  |       // should never happen | 
			
		
	
		
		
			
				
					|  |  |  |  |  |       this.cannotfindMainAccount = true; | 
			
		
	
		
		
			
				
					|  |  |  |  |  |     } | 
			
		
	
		
		
			
				
					|  |  |  |  |  |     if (primaryAccount) { | 
			
		
	
		
		
			
				
					|  |  |  |  |  |       this.downloadMnemonic = primaryAccount.mnemonic; | 
			
		
	
		
		
			
				
					|  |  |  |  |  |     } | 
			
		
	
		
		
			
				
					|  |  |  |  |  |   } | 
			
		
	
		
		
			
				
					|  |  |  |  |  | 
 | 
			
		
	
		
		
			
				
					|  |  |  |  |  |   async downloadSettingsContacts() { | 
			
		
	
		
		
			
				
					|  |  |  |  |  |     this.downloadSettingsContactsBlob = await getDexieExportBlob(); | 
			
		
	
		
		
			
				
					|  |  |  |  |  |     const downloadUrl = URL.createObjectURL(this.downloadSettingsContactsBlob); | 
			
		
	
		
		
			
				
					|  |  |  |  |  |     const downloadAnchor = this.$refs.downloadLink as HTMLAnchorElement; | 
			
		
	
		
		
			
				
					|  |  |  |  |  |     downloadAnchor.href = downloadUrl; | 
			
		
	
		
		
			
				
					|  |  |  |  |  |     downloadAnchor.download = `TimeSafari-settings-contacts-backup.json`; | 
			
		
	
		
		
			
				
					|  |  |  |  |  |     downloadAnchor.click(); // doesn't work for some browsers, eg. DuckDuckGo | 
			
		
	
		
		
			
				
					|  |  |  |  |  |   } | 
			
		
	
		
		
			
				
					|  |  |  |  |  | 
 | 
			
		
	
		
		
			
				
					|  |  |   async displayDatabases() { |  |  |   async displayDatabases() { | 
			
		
	
		
		
			
				
					|  |  |     this.exportedData = { |  |  |     this.exportedData = { | 
			
		
	
		
		
			
				
					|  |  |       accounts: await getDexieAccounts(), |  |  |       accounts: await getDexieAccounts(), | 
			
		
	
	
		
		
			
				
					|  | 
 |