|
|
@ -42,7 +42,7 @@ |
|
|
|
|
|
|
|
<!-- Ideally, this button should only be visible when the active account has more than 7 or 11 contacts in their list (we want to limit the grid count above to 8 or 12 accounts to keep it compact) --> |
|
|
|
<router-link |
|
|
|
v-if="allContacts.length > 7" |
|
|
|
v-if="allContacts.length >= 7" |
|
|
|
:to="{ name: 'contact-gives' }" |
|
|
|
class="block text-center text-md font-bold uppercase bg-slate-500 text-white px-2 py-3 rounded-md" |
|
|
|
> |
|
|
@ -99,19 +99,18 @@ |
|
|
|
import { Component, Vue } from "vue-facing-decorator"; |
|
|
|
import GiftedDialog from "@/components/GiftedDialog.vue"; |
|
|
|
import { db, accountsDB } from "@/db/index"; |
|
|
|
import { MASTER_SETTINGS_KEY } from "@/db/tables/settings"; |
|
|
|
import { MASTER_SETTINGS_KEY, Settings } from "@/db/tables/settings"; |
|
|
|
import { accessToken } from "@/libs/crypto"; |
|
|
|
import { |
|
|
|
createAndSubmitGive, |
|
|
|
didInfo, |
|
|
|
GiverInputInfo, |
|
|
|
GiverOutputInfo, |
|
|
|
GiveServerRecord, |
|
|
|
} from "@/libs/endorserServer"; |
|
|
|
import { Contact } from "@/db/tables/contacts"; |
|
|
|
import QuickNav from "@/components/QuickNav.vue"; |
|
|
|
import EntityIcon from "@/components/EntityIcon.vue"; |
|
|
|
import { IIdentifier } from "@veramo/core"; |
|
|
|
import { Account } from "@/db/tables/accounts"; |
|
|
|
|
|
|
|
interface Notification { |
|
|
|
group: string; |
|
|
@ -144,10 +143,10 @@ export default class HomeView extends Vue { |
|
|
|
|
|
|
|
public async getIdentity(activeDid: string) { |
|
|
|
await accountsDB.open(); |
|
|
|
const account = await accountsDB.accounts |
|
|
|
const account = (await accountsDB.accounts |
|
|
|
.where("did") |
|
|
|
.equals(activeDid) |
|
|
|
.first(); |
|
|
|
.first()) as Account; |
|
|
|
const identity = JSON.parse(account?.identity || "null"); |
|
|
|
|
|
|
|
if (!identity) { |
|
|
@ -174,7 +173,7 @@ export default class HomeView extends Vue { |
|
|
|
this.allMyDids = allAccounts.map((acc) => acc.did); |
|
|
|
|
|
|
|
await db.open(); |
|
|
|
const settings = await db.settings.get(MASTER_SETTINGS_KEY); |
|
|
|
const settings = (await db.settings.get(MASTER_SETTINGS_KEY)) as Settings; |
|
|
|
this.apiServer = settings?.apiServer || ""; |
|
|
|
this.activeDid = settings?.activeDid || ""; |
|
|
|
this.allContacts = await db.contacts.toArray(); |
|
|
@ -204,7 +203,9 @@ export default class HomeView extends Vue { |
|
|
|
if (this.activeDid) { |
|
|
|
await accountsDB.open(); |
|
|
|
const allAccounts = await accountsDB.accounts.toArray(); |
|
|
|
const account = allAccounts.find((acc) => acc.did === this.activeDid); |
|
|
|
const account = allAccounts.find( |
|
|
|
(acc) => acc.did === this.activeDid, |
|
|
|
) as Account; |
|
|
|
const identity = JSON.parse(account?.identity || "null"); |
|
|
|
|
|
|
|
if (!identity) { |
|
|
@ -333,139 +334,5 @@ export default class HomeView extends Vue { |
|
|
|
openDialog(giver: GiverInputInfo) { |
|
|
|
(this.$refs.customDialog as GiftedDialog).open(giver); |
|
|
|
} |
|
|
|
|
|
|
|
handleDialogResult(result: GiverOutputInfo) { |
|
|
|
if (result.action === "confirm") { |
|
|
|
return new Promise((resolve) => { |
|
|
|
this.recordGive( |
|
|
|
result.giver?.did, |
|
|
|
result.description, |
|
|
|
result.hours, |
|
|
|
).then(() => { |
|
|
|
resolve(null); |
|
|
|
}); |
|
|
|
}); |
|
|
|
} else { |
|
|
|
// action was "cancel" so do nothing |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
/** |
|
|
|
* |
|
|
|
* @param giverDid may be null |
|
|
|
* @param description may be an empty string |
|
|
|
* @param hours may be 0 |
|
|
|
*/ |
|
|
|
public async recordGive( |
|
|
|
giverDid?: string, |
|
|
|
description?: string, |
|
|
|
hours?: number, |
|
|
|
) { |
|
|
|
if (!this.activeDid) { |
|
|
|
this.$notify( |
|
|
|
{ |
|
|
|
group: "alert", |
|
|
|
type: "danger", |
|
|
|
title: "Error", |
|
|
|
text: "You must select an identity before you can record a give.", |
|
|
|
}, |
|
|
|
-1, |
|
|
|
); |
|
|
|
return; |
|
|
|
} |
|
|
|
|
|
|
|
if (!description && !hours) { |
|
|
|
this.$notify( |
|
|
|
{ |
|
|
|
group: "alert", |
|
|
|
type: "danger", |
|
|
|
title: "Error", |
|
|
|
text: "You must enter a description or some number of hours.", |
|
|
|
}, |
|
|
|
-1, |
|
|
|
); |
|
|
|
return; |
|
|
|
} |
|
|
|
|
|
|
|
try { |
|
|
|
const identity = await this.getIdentity(this.activeDid); |
|
|
|
const result = await createAndSubmitGive( |
|
|
|
this.axios, |
|
|
|
this.apiServer, |
|
|
|
identity, |
|
|
|
giverDid, |
|
|
|
this.activeDid, |
|
|
|
description, |
|
|
|
hours, |
|
|
|
); |
|
|
|
|
|
|
|
if ( |
|
|
|
result.type === "error" || |
|
|
|
this.isGiveCreationError(result.response) |
|
|
|
) { |
|
|
|
const errorMessage = this.getGiveCreationErrorMessage(result); |
|
|
|
console.log("Error with give creation result:", result); |
|
|
|
this.$notify( |
|
|
|
{ |
|
|
|
group: "alert", |
|
|
|
type: "danger", |
|
|
|
title: "Error", |
|
|
|
text: errorMessage || "There was an error creating the give.", |
|
|
|
}, |
|
|
|
-1, |
|
|
|
); |
|
|
|
} else { |
|
|
|
this.$notify( |
|
|
|
{ |
|
|
|
group: "alert", |
|
|
|
type: "success", |
|
|
|
title: "Success", |
|
|
|
text: "That gift was recorded.", |
|
|
|
}, |
|
|
|
-1, |
|
|
|
); |
|
|
|
} |
|
|
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any |
|
|
|
} catch (error: any) { |
|
|
|
console.log("Error with give recordation caught:", error); |
|
|
|
const message = |
|
|
|
error.userMessage || |
|
|
|
error.response?.data?.error?.message || |
|
|
|
"There was an error recording the give."; |
|
|
|
this.$notify( |
|
|
|
{ |
|
|
|
group: "alert", |
|
|
|
type: "danger", |
|
|
|
title: "Error", |
|
|
|
text: message, |
|
|
|
}, |
|
|
|
-1, |
|
|
|
); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
// Helper functions for readability |
|
|
|
|
|
|
|
/** |
|
|
|
* @param result response "data" from the server |
|
|
|
* @returns true if the result indicates an error |
|
|
|
*/ |
|
|
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any |
|
|
|
isGiveCreationError(result: any) { |
|
|
|
return result.status !== 201 || result.data?.error; |
|
|
|
} |
|
|
|
|
|
|
|
/** |
|
|
|
* @param result direct response eg. ErrorResult or SuccessResult (potentially with embedded "data") |
|
|
|
* @returns best guess at an error message |
|
|
|
*/ |
|
|
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any |
|
|
|
getGiveCreationErrorMessage(result: any) { |
|
|
|
return ( |
|
|
|
result.error?.userMessage || |
|
|
|
result.error?.error || |
|
|
|
result.response?.data?.error?.message |
|
|
|
); |
|
|
|
} |
|
|
|
} |
|
|
|
</script> |
|
|
|