|
@ -1,5 +1,7 @@ |
|
|
<template> |
|
|
<template> |
|
|
<QuickNav selected="Profile"></QuickNav> |
|
|
<QuickNav selected="Profile"></QuickNav> |
|
|
|
|
|
<TopMessage /> |
|
|
|
|
|
|
|
|
<!-- CONTENT --> |
|
|
<!-- CONTENT --> |
|
|
<section id="Content" class="p-6 pb-24"> |
|
|
<section id="Content" class="p-6 pb-24"> |
|
|
<!-- Heading --> |
|
|
<!-- Heading --> |
|
@ -215,7 +217,7 @@ |
|
|
<div v-if="showAdvanced"> |
|
|
<div v-if="showAdvanced"> |
|
|
<p class="text-rose-600 mb-8"> |
|
|
<p class="text-rose-600 mb-8"> |
|
|
Beware: the features here can be confusing and even change data in ways |
|
|
Beware: the features here can be confusing and even change data in ways |
|
|
you do not expect. But we support your freedoms! |
|
|
you do not expect. But we support your freedom! |
|
|
</p> |
|
|
</p> |
|
|
|
|
|
|
|
|
<!-- Deep Identity Details --> |
|
|
<!-- Deep Identity Details --> |
|
@ -357,6 +359,46 @@ |
|
|
</button> |
|
|
</button> |
|
|
</div> |
|
|
</div> |
|
|
|
|
|
|
|
|
|
|
|
<label |
|
|
|
|
|
for="toggleProdWarningMessage" |
|
|
|
|
|
class="flex items-center justify-between cursor-pointer my-4" |
|
|
|
|
|
@click="toggleProdWarning" |
|
|
|
|
|
> |
|
|
|
|
|
<!-- label --> |
|
|
|
|
|
<h2>Show warning if on prod server</h2> |
|
|
|
|
|
<!-- toggle --> |
|
|
|
|
|
<div class="relative ml-2"> |
|
|
|
|
|
<!-- input --> |
|
|
|
|
|
<input type="checkbox" v-model="warnIfProdServer" class="sr-only" /> |
|
|
|
|
|
<!-- line --> |
|
|
|
|
|
<div class="block bg-slate-500 w-14 h-8 rounded-full"></div> |
|
|
|
|
|
<!-- dot --> |
|
|
|
|
|
<div |
|
|
|
|
|
class="dot absolute left-1 top-1 bg-slate-400 w-6 h-6 rounded-full transition" |
|
|
|
|
|
></div> |
|
|
|
|
|
</div> |
|
|
|
|
|
</label> |
|
|
|
|
|
|
|
|
|
|
|
<label |
|
|
|
|
|
for="toggleTestWarningMessage" |
|
|
|
|
|
class="flex items-center justify-between cursor-pointer my-4" |
|
|
|
|
|
@click="toggleTestWarning" |
|
|
|
|
|
> |
|
|
|
|
|
<!-- label --> |
|
|
|
|
|
<h2>Show warning if on test server</h2> |
|
|
|
|
|
<!-- toggle --> |
|
|
|
|
|
<div class="relative ml-2"> |
|
|
|
|
|
<!-- input --> |
|
|
|
|
|
<input type="checkbox" v-model="warnIfTestServer" class="sr-only" /> |
|
|
|
|
|
<!-- line --> |
|
|
|
|
|
<div class="block bg-slate-500 w-14 h-8 rounded-full"></div> |
|
|
|
|
|
<!-- dot --> |
|
|
|
|
|
<div |
|
|
|
|
|
class="dot absolute left-1 top-1 bg-slate-400 w-6 h-6 rounded-full transition" |
|
|
|
|
|
></div> |
|
|
|
|
|
</div> |
|
|
|
|
|
</label> |
|
|
|
|
|
|
|
|
<div class="flex py-4"> |
|
|
<div class="flex py-4"> |
|
|
<h2 class="text-slate-500 text-sm font-bold mb-2"> |
|
|
<h2 class="text-slate-500 text-sm font-bold mb-2"> |
|
|
Notification Push Server |
|
|
Notification Push Server |
|
@ -407,7 +449,8 @@ import "dexie-export-import"; |
|
|
import { Component, Vue } from "vue-facing-decorator"; |
|
|
import { Component, Vue } from "vue-facing-decorator"; |
|
|
import { useClipboard } from "@vueuse/core"; |
|
|
import { useClipboard } from "@vueuse/core"; |
|
|
|
|
|
|
|
|
import QuickNav from "@/components/QuickNav.vue"; |
|
|
import QuickNav from "@/components/QuickNav"; |
|
|
|
|
|
import TopMessage from "@/components/TopMessage"; |
|
|
import { AppString } from "@/constants/app"; |
|
|
import { AppString } from "@/constants/app"; |
|
|
import { db, accountsDB } from "@/db/index"; |
|
|
import { db, accountsDB } from "@/db/index"; |
|
|
import { MASTER_SETTINGS_KEY, Settings } from "@/db/tables/settings"; |
|
|
import { MASTER_SETTINGS_KEY, Settings } from "@/db/tables/settings"; |
|
@ -432,7 +475,7 @@ interface IAccount { |
|
|
derivationPath: string; |
|
|
derivationPath: string; |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
@Component({ components: { QuickNav } }) |
|
|
@Component({ components: { QuickNav, TopMessage } }) |
|
|
export default class AccountViewView extends Vue { |
|
|
export default class AccountViewView extends Vue { |
|
|
$notify!: (notification: Notification, timeout?: number) => void; |
|
|
$notify!: (notification: Notification, timeout?: number) => void; |
|
|
|
|
|
|
|
@ -462,6 +505,8 @@ export default class AccountViewView extends Vue { |
|
|
showAdvanced = false; |
|
|
showAdvanced = false; |
|
|
|
|
|
|
|
|
subscription: PushSubscription | null = null; |
|
|
subscription: PushSubscription | null = null; |
|
|
|
|
|
warnIfProdServer = false; |
|
|
|
|
|
warnIfTestServer = false; |
|
|
|
|
|
|
|
|
private isSubscribed = false; |
|
|
private isSubscribed = false; |
|
|
get toggleNotifications() { |
|
|
get toggleNotifications() { |
|
@ -471,6 +516,62 @@ export default class AccountViewView extends Vue { |
|
|
this.isSubscribed = value; |
|
|
this.isSubscribed = value; |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
|
* Async function executed when the component is created. |
|
|
|
|
|
* Initializes the component's state with values from the database, |
|
|
|
|
|
* handles identity-related tasks, and checks limitations. |
|
|
|
|
|
* |
|
|
|
|
|
* @throws Will display specific messages to the user based on different errors. |
|
|
|
|
|
*/ |
|
|
|
|
|
async created() { |
|
|
|
|
|
try { |
|
|
|
|
|
await db.open(); |
|
|
|
|
|
|
|
|
|
|
|
const settings = await db.settings.get(MASTER_SETTINGS_KEY); |
|
|
|
|
|
|
|
|
|
|
|
// Initialize component state with values from the database or defaults |
|
|
|
|
|
this.initializeState(settings); |
|
|
|
|
|
|
|
|
|
|
|
// Get and process the identity |
|
|
|
|
|
const identity = await this.getIdentity(this.activeDid); |
|
|
|
|
|
if (identity) { |
|
|
|
|
|
this.processIdentity(identity); |
|
|
|
|
|
} |
|
|
|
|
|
} catch (err: unknown) { |
|
|
|
|
|
this.handleError(err); |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
async mounted() { |
|
|
|
|
|
try { |
|
|
|
|
|
const registration = await navigator.serviceWorker.ready; |
|
|
|
|
|
this.subscription = await registration.pushManager.getSubscription(); |
|
|
|
|
|
this.toggleNotifications = !!this.subscription; |
|
|
|
|
|
} catch (error) { |
|
|
|
|
|
console.error("Mount error:", error); |
|
|
|
|
|
this.toggleNotifications = false; |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
|
* Initializes component state with values from the database or defaults. |
|
|
|
|
|
* @param {SettingsType} settings - Object containing settings from the database. |
|
|
|
|
|
*/ |
|
|
|
|
|
initializeState(settings: Settings | undefined) { |
|
|
|
|
|
this.activeDid = (settings?.activeDid as string) || ""; |
|
|
|
|
|
this.apiServer = (settings?.apiServer as string) || ""; |
|
|
|
|
|
this.apiServerInput = (settings?.apiServer as string) || ""; |
|
|
|
|
|
this.givenName = |
|
|
|
|
|
(settings?.firstName || "") + |
|
|
|
|
|
(settings?.lastName ? ` ${settings.lastName}` : ""); // pre v 0.1.3 |
|
|
|
|
|
this.isRegistered = !!settings?.isRegistered; |
|
|
|
|
|
this.showContactGives = !!settings?.showContactGivesInline; |
|
|
|
|
|
this.warnIfProdServer = !!settings?.warnIfProdServer; |
|
|
|
|
|
this.warnIfTestServer = !!settings?.warnIfTestServer; |
|
|
|
|
|
this.webPushServer = (settings?.webPushServer as string) || ""; |
|
|
|
|
|
this.webPushServerInput = (settings?.webPushServer as string) || ""; |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
public async getIdentity(activeDid: string): Promise<IIdentifier | null> { |
|
|
public async getIdentity(activeDid: string): Promise<IIdentifier | null> { |
|
|
try { |
|
|
try { |
|
|
// Open the accounts database |
|
|
// Open the accounts database |
|
@ -536,6 +637,16 @@ export default class AccountViewView extends Vue { |
|
|
this.updateShowContactAmounts(); |
|
|
this.updateShowContactAmounts(); |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
toggleProdWarning() { |
|
|
|
|
|
this.warnIfProdServer = !this.warnIfProdServer; |
|
|
|
|
|
this.updateWarnIfProdServer(this.warnIfProdServer); |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
toggleTestWarning() { |
|
|
|
|
|
this.warnIfTestServer = !this.warnIfTestServer; |
|
|
|
|
|
this.updateWarnIfTestServer(this.warnIfTestServer); |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
readableTime(timeStr: string) { |
|
|
readableTime(timeStr: string) { |
|
|
return timeStr.substring(0, timeStr.indexOf("T")); |
|
|
return timeStr.substring(0, timeStr.indexOf("T")); |
|
|
} |
|
|
} |
|
@ -545,60 +656,6 @@ export default class AccountViewView extends Vue { |
|
|
this.numAccounts = await accountsDB.accounts.count(); |
|
|
this.numAccounts = await accountsDB.accounts.count(); |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
/** |
|
|
|
|
|
* Async function executed when the component is created. |
|
|
|
|
|
* Initializes the component's state with values from the database, |
|
|
|
|
|
* handles identity-related tasks, and checks limitations. |
|
|
|
|
|
* |
|
|
|
|
|
* @throws Will display specific messages to the user based on different errors. |
|
|
|
|
|
*/ |
|
|
|
|
|
async created() { |
|
|
|
|
|
try { |
|
|
|
|
|
await db.open(); |
|
|
|
|
|
|
|
|
|
|
|
const settings = await db.settings.get(MASTER_SETTINGS_KEY); |
|
|
|
|
|
|
|
|
|
|
|
// Initialize component state with values from the database or defaults |
|
|
|
|
|
this.initializeState(settings); |
|
|
|
|
|
|
|
|
|
|
|
// Get and process the identity |
|
|
|
|
|
const identity = await this.getIdentity(this.activeDid); |
|
|
|
|
|
if (identity) { |
|
|
|
|
|
this.processIdentity(identity); |
|
|
|
|
|
} |
|
|
|
|
|
} catch (err: unknown) { |
|
|
|
|
|
this.handleError(err); |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
async mounted() { |
|
|
|
|
|
try { |
|
|
|
|
|
const registration = await navigator.serviceWorker.ready; |
|
|
|
|
|
this.subscription = await registration.pushManager.getSubscription(); |
|
|
|
|
|
this.toggleNotifications = !!this.subscription; |
|
|
|
|
|
} catch (error) { |
|
|
|
|
|
console.error("Mount error:", error); |
|
|
|
|
|
this.toggleNotifications = false; |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
|
* Initializes component state with values from the database or defaults. |
|
|
|
|
|
* @param {SettingsType} settings - Object containing settings from the database. |
|
|
|
|
|
*/ |
|
|
|
|
|
initializeState(settings: Settings | undefined) { |
|
|
|
|
|
this.activeDid = (settings?.activeDid as string) || ""; |
|
|
|
|
|
this.apiServer = (settings?.apiServer as string) || ""; |
|
|
|
|
|
this.apiServerInput = (settings?.apiServer as string) || ""; |
|
|
|
|
|
this.givenName = |
|
|
|
|
|
(settings?.firstName || "") + |
|
|
|
|
|
(settings?.lastName ? ` ${settings.lastName}` : ""); // pre v 0.1.3 |
|
|
|
|
|
this.isRegistered = !!settings?.isRegistered; |
|
|
|
|
|
this.webPushServer = (settings?.webPushServer as string) || ""; |
|
|
|
|
|
this.webPushServerInput = (settings?.webPushServer as string) || ""; |
|
|
|
|
|
this.showContactGives = !!settings?.showContactGivesInline; |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
/** |
|
|
/** |
|
|
* Processes the identity and updates the component's state. |
|
|
* Processes the identity and updates the component's state. |
|
|
* @param {IdentityType} identity - Object containing identity information. |
|
|
* @param {IdentityType} identity - Object containing identity information. |
|
@ -672,6 +729,52 @@ export default class AccountViewView extends Vue { |
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
public async updateWarnIfProdServer(newSetting) { |
|
|
|
|
|
try { |
|
|
|
|
|
await db.open(); |
|
|
|
|
|
db.settings.update(MASTER_SETTINGS_KEY, { |
|
|
|
|
|
warnIfProdServer: newSetting, |
|
|
|
|
|
}); |
|
|
|
|
|
} catch (err) { |
|
|
|
|
|
this.$notify( |
|
|
|
|
|
{ |
|
|
|
|
|
group: "alert", |
|
|
|
|
|
type: "danger", |
|
|
|
|
|
title: "Error Updating Prod Warning", |
|
|
|
|
|
text: "Clear your cache and start over (after data backup).", |
|
|
|
|
|
}, |
|
|
|
|
|
-1, |
|
|
|
|
|
); |
|
|
|
|
|
console.error( |
|
|
|
|
|
"Telling user to clear cache after contact setting update because:", |
|
|
|
|
|
err, |
|
|
|
|
|
); |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
public async updateWarnIfTestServer(newSetting) { |
|
|
|
|
|
try { |
|
|
|
|
|
await db.open(); |
|
|
|
|
|
db.settings.update(MASTER_SETTINGS_KEY, { |
|
|
|
|
|
warnIfTestServer: newSetting, |
|
|
|
|
|
}); |
|
|
|
|
|
} catch (err) { |
|
|
|
|
|
this.$notify( |
|
|
|
|
|
{ |
|
|
|
|
|
group: "alert", |
|
|
|
|
|
type: "danger", |
|
|
|
|
|
title: "Error Updating Test Warning", |
|
|
|
|
|
text: "Clear your cache and start over (after data backup).", |
|
|
|
|
|
}, |
|
|
|
|
|
-1, |
|
|
|
|
|
); |
|
|
|
|
|
console.error( |
|
|
|
|
|
"Telling user to clear cache after contact setting update because:", |
|
|
|
|
|
err, |
|
|
|
|
|
); |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
/** |
|
|
/** |
|
|
* Asynchronously exports the database into a downloadable JSON file. |
|
|
* Asynchronously exports the database into a downloadable JSON file. |
|
|
* |
|
|
* |
|
|