|
@ -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(), |
|
|