Browse Source
- Add detailed error logging for image upload failures in PhotoDialog and SharedPhotoView - Extract DataExportSection into standalone component with proper prop handling - Fix Backup Identifier Seed visibility by passing activeDid propcross-platform-factory
4 changed files with 139 additions and 67 deletions
@ -0,0 +1,114 @@ |
|||
<template> |
|||
<div |
|||
id="sectionDataExport" |
|||
class="bg-slate-100 rounded-md overflow-hidden px-4 py-4 mt-8 mb-8" |
|||
> |
|||
<div class="mb-2 font-bold">Data Export</div> |
|||
<router-link |
|||
v-if="activeDid" |
|||
:to="{ name: 'seed-backup' }" |
|||
class="block w-full text-center text-md bg-gradient-to-b from-blue-400 to-blue-700 shadow-[inset_0_-1px_0_0_rgba(0,0,0,0.5)] text-white px-1.5 py-2 rounded-md mb-2 mt-2" |
|||
> |
|||
Backup Identifier Seed |
|||
</router-link> |
|||
|
|||
<button |
|||
:class="computedStartDownloadLinkClassNames()" |
|||
class="block w-full text-center text-md bg-gradient-to-b from-blue-400 to-blue-700 shadow-[inset_0_-1px_0_0_rgba(0,0,0,0.5)] text-white px-1.5 py-2 rounded-md" |
|||
@click="exportDatabase()" |
|||
> |
|||
Download Settings & Contacts |
|||
<br /> |
|||
(excluding Identifier Data) |
|||
</button> |
|||
<a |
|||
ref="downloadLink" |
|||
:class="computedDownloadLinkClassNames()" |
|||
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 again here to download now. |
|||
</a> |
|||
<div class="mt-4"> |
|||
<p> |
|||
After the download, you can save the file in your preferred storage |
|||
location. |
|||
</p> |
|||
<ul> |
|||
<li class="list-disc list-outside ml-4"> |
|||
On iOS: Choose "More..." and select a place in iCloud, or go "Back" |
|||
and save to another location. |
|||
</li> |
|||
<li class="list-disc list-outside ml-4"> |
|||
On Android: Choose "Open" and then share |
|||
<font-awesome icon="share-nodes" class="fa-fw" /> |
|||
to your prefered place. |
|||
</li> |
|||
</ul> |
|||
</div> |
|||
</div> |
|||
</template> |
|||
|
|||
<script lang="ts"> |
|||
import { Component, Prop, Vue } from "vue-facing-decorator"; |
|||
import { NotificationIface } from "../constants/app"; |
|||
import { db } from "../db/index"; |
|||
import { logger } from "../utils/logger"; |
|||
|
|||
@Component |
|||
export default class DataExportSection extends Vue { |
|||
$notify!: (notification: NotificationIface, timeout?: number) => void; |
|||
|
|||
@Prop({ required: true }) readonly activeDid!: string; |
|||
downloadUrl = ""; |
|||
|
|||
beforeUnmount() { |
|||
if (this.downloadUrl) { |
|||
URL.revokeObjectURL(this.downloadUrl); |
|||
} |
|||
} |
|||
|
|||
public async exportDatabase() { |
|||
try { |
|||
const blob = await db.export({ prettyJson: true }); |
|||
this.downloadUrl = URL.createObjectURL(blob); |
|||
const downloadAnchor = this.$refs.downloadLink as HTMLAnchorElement; |
|||
downloadAnchor.href = this.downloadUrl; |
|||
downloadAnchor.download = `${db.name}-backup.json`; |
|||
downloadAnchor.click(); |
|||
this.$notify( |
|||
{ |
|||
group: "alert", |
|||
type: "success", |
|||
title: "Download Started", |
|||
text: "See your downloads directory for the backup. It is in the Dexie format.", |
|||
}, |
|||
-1, |
|||
); |
|||
setTimeout(() => URL.revokeObjectURL(this.downloadUrl), 1000); |
|||
} catch (error) { |
|||
logger.error("Export Error:", error); |
|||
this.$notify( |
|||
{ |
|||
group: "alert", |
|||
type: "danger", |
|||
title: "Export Error", |
|||
text: "There was an error exporting the data.", |
|||
}, |
|||
3000, |
|||
); |
|||
} |
|||
} |
|||
|
|||
public computedStartDownloadLinkClassNames() { |
|||
return { |
|||
hidden: this.downloadUrl, |
|||
}; |
|||
} |
|||
|
|||
public computedDownloadLinkClassNames() { |
|||
return { |
|||
hidden: !this.downloadUrl, |
|||
}; |
|||
} |
|||
} |
|||
</script> |
Loading…
Reference in new issue