|  |  | @ -73,7 +73,7 @@ | 
			
		
	
		
			
				
					|  |  |  |                 ? "Confirmed Amounts" | 
			
		
	
		
			
				
					|  |  |  |                 : "Unconfirmed Amounts" | 
			
		
	
		
			
				
					|  |  |  |           }} | 
			
		
	
		
			
				
					|  |  |  |           <fa icon="rotate" class="fa-fw" /> | 
			
		
	
		
			
				
					|  |  |  |           <fa icon="left-right" class="fa-fw" /> | 
			
		
	
		
			
				
					|  |  |  |         </button> | 
			
		
	
		
			
				
					|  |  |  |       </div> | 
			
		
	
		
			
				
					|  |  |  |     </div> | 
			
		
	
	
		
			
				
					|  |  | @ -301,30 +301,25 @@ | 
			
		
	
		
			
				
					|  |  |  | </template> | 
			
		
	
		
			
				
					|  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  | <script lang="ts"> | 
			
		
	
		
			
				
					|  |  |  | import { AxiosError } from "axios"; | 
			
		
	
		
			
				
					|  |  |  | import {Axios, AxiosError} from "axios"; | 
			
		
	
		
			
				
					|  |  |  | import { IndexableType } from "dexie"; | 
			
		
	
		
			
				
					|  |  |  | import * as didJwt from "did-jwt"; | 
			
		
	
		
			
				
					|  |  |  | import * as R from "ramda"; | 
			
		
	
		
			
				
					|  |  |  | import { IIdentifier } from "@veramo/core"; | 
			
		
	
		
			
				
					|  |  |  | import { Component, Vue } from "vue-facing-decorator"; | 
			
		
	
		
			
				
					|  |  |  | import { Router } from "vue-router"; | 
			
		
	
		
			
				
					|  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  | import { AppString, NotificationIface } from "@/constants/app"; | 
			
		
	
		
			
				
					|  |  |  | import { accountsDB, db } from "@/db/index"; | 
			
		
	
		
			
				
					|  |  |  | import {accountsDB, db, NonsensitiveDexie} from "@/db/index"; | 
			
		
	
		
			
				
					|  |  |  | import { Contact } from "@/db/tables/contacts"; | 
			
		
	
		
			
				
					|  |  |  | import { MASTER_SETTINGS_KEY, Settings } from "@/db/tables/settings"; | 
			
		
	
		
			
				
					|  |  |  | import { | 
			
		
	
		
			
				
					|  |  |  |   accessToken, | 
			
		
	
		
			
				
					|  |  |  |   getContactPayloadFromJwtUrl, | 
			
		
	
		
			
				
					|  |  |  |   SimpleSigner, | 
			
		
	
		
			
				
					|  |  |  | } from "@/libs/crypto"; | 
			
		
	
		
			
				
					|  |  |  | import { accessToken, getContactPayloadFromJwtUrl } from "@/libs/crypto"; | 
			
		
	
		
			
				
					|  |  |  | import { | 
			
		
	
		
			
				
					|  |  |  |   CONTACT_CSV_HEADER, | 
			
		
	
		
			
				
					|  |  |  |   CONTACT_URL_PREFIX, | 
			
		
	
		
			
				
					|  |  |  |   GiverReceiverInputInfo, | 
			
		
	
		
			
				
					|  |  |  |   GiveSummaryRecord, | 
			
		
	
		
			
				
					|  |  |  |   isDid, | 
			
		
	
		
			
				
					|  |  |  |   RegisterVerifiableCredential, | 
			
		
	
		
			
				
					|  |  |  |   SERVICE_ID, | 
			
		
	
		
			
				
					|  |  |  |   register, | 
			
		
	
		
			
				
					|  |  |  |   setVisibilityUtil, | 
			
		
	
		
			
				
					|  |  |  | } from "@/libs/endorserServer"; | 
			
		
	
		
			
				
					|  |  |  | import * as libsUtil from "@/libs/util"; | 
			
		
	
	
		
			
				
					|  |  | @ -335,6 +330,7 @@ import OfferDialog from "@/components/OfferDialog.vue"; | 
			
		
	
		
			
				
					|  |  |  | import { Account } from "@/db/tables/accounts"; | 
			
		
	
		
			
				
					|  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  | import { Buffer } from "buffer/"; | 
			
		
	
		
			
				
					|  |  |  | import {getIdentity} from "@/libs/util"; | 
			
		
	
		
			
				
					|  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  | @Component({ | 
			
		
	
		
			
				
					|  |  |  |   components: { GiftedDialog, EntityIcon, OfferDialog, QuickNav }, | 
			
		
	
	
		
			
				
					|  |  | @ -360,6 +356,7 @@ export default class ContactsView extends Vue { | 
			
		
	
		
			
				
					|  |  |  |   givenToMeConfirmed: Record<string, number> = {}; | 
			
		
	
		
			
				
					|  |  |  |   // { "did:...": amount } entry for each contact | 
			
		
	
		
			
				
					|  |  |  |   givenToMeUnconfirmed: Record<string, number> = {}; | 
			
		
	
		
			
				
					|  |  |  |   hideRegisterPromptOnNewContact = false; | 
			
		
	
		
			
				
					|  |  |  |   isRegistered = false; | 
			
		
	
		
			
				
					|  |  |  |   showDidCopy = false; | 
			
		
	
		
			
				
					|  |  |  |   showGiveNumbers = false; | 
			
		
	
	
		
			
				
					|  |  | @ -378,6 +375,9 @@ export default class ContactsView extends Vue { | 
			
		
	
		
			
				
					|  |  |  |     this.isRegistered = !!settings?.isRegistered; | 
			
		
	
		
			
				
					|  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |     this.showGiveNumbers = !!settings?.showContactGivesInline; | 
			
		
	
		
			
				
					|  |  |  |     this.hideRegisterPromptOnNewContact = | 
			
		
	
		
			
				
					|  |  |  |       !!settings?.hideRegisterPromptOnNewContact; | 
			
		
	
		
			
				
					|  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |     if (this.showGiveNumbers) { | 
			
		
	
		
			
				
					|  |  |  |       this.loadGives(); | 
			
		
	
		
			
				
					|  |  |  |     } | 
			
		
	
	
		
			
				
					|  |  | @ -681,6 +681,7 @@ export default class ContactsView extends Vue { | 
			
		
	
		
			
				
					|  |  |  |         nextPubKeyHashB64: payload.own.nextPublicEncKeyHash, | 
			
		
	
		
			
				
					|  |  |  |         profileImageUrl: payload.own.profileImageUrl, | 
			
		
	
		
			
				
					|  |  |  |         publicKeyBase64: payload.own.publicEncKey, | 
			
		
	
		
			
				
					|  |  |  |         isRegistered: payload.own.isRegistered, | 
			
		
	
		
			
				
					|  |  |  |       } as Contact); | 
			
		
	
		
			
				
					|  |  |  |     } | 
			
		
	
		
			
				
					|  |  |  |   } | 
			
		
	
	
		
			
				
					|  |  | @ -705,6 +706,7 @@ export default class ContactsView extends Vue { | 
			
		
	
		
			
				
					|  |  |  |         let addedMessage; | 
			
		
	
		
			
				
					|  |  |  |         if (this.activeDid) { | 
			
		
	
		
			
				
					|  |  |  |           this.setVisibility(newContact, true, false); | 
			
		
	
		
			
				
					|  |  |  |           newContact.seesMe = true; // didn't work inside setVisibility | 
			
		
	
		
			
				
					|  |  |  |           addedMessage = | 
			
		
	
		
			
				
					|  |  |  |             "They were added, and your activity is visible to them."; | 
			
		
	
		
			
				
					|  |  |  |         } else { | 
			
		
	
	
		
			
				
					|  |  | @ -712,15 +714,39 @@ export default class ContactsView extends Vue { | 
			
		
	
		
			
				
					|  |  |  |         } | 
			
		
	
		
			
				
					|  |  |  |         this.contactInput = ""; | 
			
		
	
		
			
				
					|  |  |  |         if (this.isRegistered) { | 
			
		
	
		
			
				
					|  |  |  |           this.$notify( | 
			
		
	
		
			
				
					|  |  |  |             { | 
			
		
	
		
			
				
					|  |  |  |               group: "alert", | 
			
		
	
		
			
				
					|  |  |  |               type: "info", | 
			
		
	
		
			
				
					|  |  |  |               title: "New User?", | 
			
		
	
		
			
				
					|  |  |  |               text: "If they are a new user, be sure to register to onboard them.", | 
			
		
	
		
			
				
					|  |  |  |             }, | 
			
		
	
		
			
				
					|  |  |  |             -1, | 
			
		
	
		
			
				
					|  |  |  |           ); | 
			
		
	
		
			
				
					|  |  |  |           if (!this.hideRegisterPromptOnNewContact && !newContact.registered) { | 
			
		
	
		
			
				
					|  |  |  |             setTimeout(() => { | 
			
		
	
		
			
				
					|  |  |  |               this.$notify( | 
			
		
	
		
			
				
					|  |  |  |                 { | 
			
		
	
		
			
				
					|  |  |  |                   group: "modal", | 
			
		
	
		
			
				
					|  |  |  |                   type: "confirm", | 
			
		
	
		
			
				
					|  |  |  |                   title: "Register", | 
			
		
	
		
			
				
					|  |  |  |                   text: "Do you want to register them?", | 
			
		
	
		
			
				
					|  |  |  |                   onCancel: async (stopAsking: boolean) => { | 
			
		
	
		
			
				
					|  |  |  |                     if (stopAsking) { | 
			
		
	
		
			
				
					|  |  |  |                       db.settings.update(MASTER_SETTINGS_KEY, { | 
			
		
	
		
			
				
					|  |  |  |                         hideRegisterPromptOnNewContact: stopAsking, | 
			
		
	
		
			
				
					|  |  |  |                       }); | 
			
		
	
		
			
				
					|  |  |  |                       this.hideRegisterPromptOnNewContact = stopAsking; | 
			
		
	
		
			
				
					|  |  |  |                     } | 
			
		
	
		
			
				
					|  |  |  |                   }, | 
			
		
	
		
			
				
					|  |  |  |                   onNo: async (stopAsking: boolean) => { | 
			
		
	
		
			
				
					|  |  |  |                     if (stopAsking) { | 
			
		
	
		
			
				
					|  |  |  |                       db.settings.update(MASTER_SETTINGS_KEY, { | 
			
		
	
		
			
				
					|  |  |  |                         hideRegisterPromptOnNewContact: stopAsking, | 
			
		
	
		
			
				
					|  |  |  |                       }); | 
			
		
	
		
			
				
					|  |  |  |                       this.hideRegisterPromptOnNewContact = stopAsking; | 
			
		
	
		
			
				
					|  |  |  |                     } | 
			
		
	
		
			
				
					|  |  |  |                   }, | 
			
		
	
		
			
				
					|  |  |  |                   onYes: async () => { | 
			
		
	
		
			
				
					|  |  |  |                     await this.register(newContact); | 
			
		
	
		
			
				
					|  |  |  |                   }, | 
			
		
	
		
			
				
					|  |  |  |                   promptToStopAsking: true, | 
			
		
	
		
			
				
					|  |  |  |                 }, | 
			
		
	
		
			
				
					|  |  |  |                 -1, | 
			
		
	
		
			
				
					|  |  |  |               ); | 
			
		
	
		
			
				
					|  |  |  |             }, 500); | 
			
		
	
		
			
				
					|  |  |  |           } | 
			
		
	
		
			
				
					|  |  |  |         } | 
			
		
	
		
			
				
					|  |  |  |         this.$notify( | 
			
		
	
		
			
				
					|  |  |  |           { | 
			
		
	
	
		
			
				
					|  |  | @ -809,99 +835,65 @@ export default class ContactsView extends Vue { | 
			
		
	
		
			
				
					|  |  |  |       1000, | 
			
		
	
		
			
				
					|  |  |  |     ); | 
			
		
	
		
			
				
					|  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |     const identity = await this.getIdentity(this.activeDid); | 
			
		
	
		
			
				
					|  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |     const vcClaim: RegisterVerifiableCredential = { | 
			
		
	
		
			
				
					|  |  |  |       "@context": "https://schema.org", | 
			
		
	
		
			
				
					|  |  |  |       "@type": "RegisterAction", | 
			
		
	
		
			
				
					|  |  |  |       agent: { identifier: identity.did }, | 
			
		
	
		
			
				
					|  |  |  |       object: SERVICE_ID, | 
			
		
	
		
			
				
					|  |  |  |       participant: { identifier: contact.did }, | 
			
		
	
		
			
				
					|  |  |  |     }; | 
			
		
	
		
			
				
					|  |  |  |     // Make a payload for the claim | 
			
		
	
		
			
				
					|  |  |  |     const vcPayload = { | 
			
		
	
		
			
				
					|  |  |  |       vc: { | 
			
		
	
		
			
				
					|  |  |  |         "@context": ["https://www.w3.org/2018/credentials/v1"], | 
			
		
	
		
			
				
					|  |  |  |         type: ["VerifiableCredential"], | 
			
		
	
		
			
				
					|  |  |  |         credentialSubject: vcClaim, | 
			
		
	
		
			
				
					|  |  |  |       }, | 
			
		
	
		
			
				
					|  |  |  |     }; | 
			
		
	
		
			
				
					|  |  |  |     // Create a signature using private key of identity | 
			
		
	
		
			
				
					|  |  |  |     if (identity.keys[0].privateKeyHex !== null) { | 
			
		
	
		
			
				
					|  |  |  |       // eslint-disable-next-line @typescript-eslint/no-non-null-assertion | 
			
		
	
		
			
				
					|  |  |  |       const privateKeyHex: string = identity.keys[0].privateKeyHex!; | 
			
		
	
		
			
				
					|  |  |  |       const signer = await SimpleSigner(privateKeyHex); | 
			
		
	
		
			
				
					|  |  |  |       const alg = undefined; | 
			
		
	
		
			
				
					|  |  |  |       // Create a JWT for the request | 
			
		
	
		
			
				
					|  |  |  |       const vcJwt: string = await didJwt.createJWT(vcPayload, { | 
			
		
	
		
			
				
					|  |  |  |         alg: alg, | 
			
		
	
		
			
				
					|  |  |  |         issuer: identity.did, | 
			
		
	
		
			
				
					|  |  |  |         signer: signer, | 
			
		
	
		
			
				
					|  |  |  |       }); | 
			
		
	
		
			
				
					|  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |       // Make the xhr request payload | 
			
		
	
		
			
				
					|  |  |  |       const payload = JSON.stringify({ jwtEncoded: vcJwt }); | 
			
		
	
		
			
				
					|  |  |  |       const url = this.apiServer + "/api/v2/claim"; | 
			
		
	
		
			
				
					|  |  |  |       const headers = await this.getHeaders(identity); | 
			
		
	
		
			
				
					|  |  |  |     try { | 
			
		
	
		
			
				
					|  |  |  |       const regResult = await register( | 
			
		
	
		
			
				
					|  |  |  |         this.activeDid, | 
			
		
	
		
			
				
					|  |  |  |         this.apiServer, | 
			
		
	
		
			
				
					|  |  |  |         this.axios, | 
			
		
	
		
			
				
					|  |  |  |         contact, | 
			
		
	
		
			
				
					|  |  |  |       ); | 
			
		
	
		
			
				
					|  |  |  |       if (regResult.success) { | 
			
		
	
		
			
				
					|  |  |  |         contact.registered = true; | 
			
		
	
		
			
				
					|  |  |  |         db.contacts.update(contact.did, { registered: true }); | 
			
		
	
		
			
				
					|  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |       try { | 
			
		
	
		
			
				
					|  |  |  |         const resp = await this.axios.post(url, payload, { headers }); | 
			
		
	
		
			
				
					|  |  |  |         if (resp.data?.success?.embeddedRecordError) { | 
			
		
	
		
			
				
					|  |  |  |           let message = "There was some problem with the registration."; | 
			
		
	
		
			
				
					|  |  |  |           if (typeof resp.data.success.embeddedRecordError == "string") { | 
			
		
	
		
			
				
					|  |  |  |             message += " " + resp.data.success.embeddedRecordError; | 
			
		
	
		
			
				
					|  |  |  |           } | 
			
		
	
		
			
				
					|  |  |  |           this.$notify( | 
			
		
	
		
			
				
					|  |  |  |             { | 
			
		
	
		
			
				
					|  |  |  |               group: "alert", | 
			
		
	
		
			
				
					|  |  |  |               type: "danger", | 
			
		
	
		
			
				
					|  |  |  |               title: "Registration Still Unknown", | 
			
		
	
		
			
				
					|  |  |  |               text: message, | 
			
		
	
		
			
				
					|  |  |  |             }, | 
			
		
	
		
			
				
					|  |  |  |             5000, | 
			
		
	
		
			
				
					|  |  |  |           ); | 
			
		
	
		
			
				
					|  |  |  |         } else if (resp.data?.success?.handleId) { | 
			
		
	
		
			
				
					|  |  |  |           contact.registered = true; | 
			
		
	
		
			
				
					|  |  |  |           db.contacts.update(contact.did, { registered: true }); | 
			
		
	
		
			
				
					|  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |           this.$notify( | 
			
		
	
		
			
				
					|  |  |  |             { | 
			
		
	
		
			
				
					|  |  |  |               group: "alert", | 
			
		
	
		
			
				
					|  |  |  |               type: "success", | 
			
		
	
		
			
				
					|  |  |  |               title: "Registration Success", | 
			
		
	
		
			
				
					|  |  |  |               text: | 
			
		
	
		
			
				
					|  |  |  |                 (contact.name || "That unnamed person") + | 
			
		
	
		
			
				
					|  |  |  |                 " has been registered.", | 
			
		
	
		
			
				
					|  |  |  |             }, | 
			
		
	
		
			
				
					|  |  |  |             5000, | 
			
		
	
		
			
				
					|  |  |  |           ); | 
			
		
	
		
			
				
					|  |  |  |         } | 
			
		
	
		
			
				
					|  |  |  |       } catch (error) { | 
			
		
	
		
			
				
					|  |  |  |         console.error("Error when registering:", error); | 
			
		
	
		
			
				
					|  |  |  |         let userMessage = "There was an error. See logs for more info."; | 
			
		
	
		
			
				
					|  |  |  |         const serverError = error as AxiosError; | 
			
		
	
		
			
				
					|  |  |  |         if (serverError) { | 
			
		
	
		
			
				
					|  |  |  |           if (serverError.response?.data?.error?.message) { | 
			
		
	
		
			
				
					|  |  |  |             userMessage = serverError.response.data.error.message; | 
			
		
	
		
			
				
					|  |  |  |           } else if (serverError.message) { | 
			
		
	
		
			
				
					|  |  |  |             userMessage = serverError.message; // Info for the user | 
			
		
	
		
			
				
					|  |  |  |           } else { | 
			
		
	
		
			
				
					|  |  |  |             userMessage = JSON.stringify(serverError.toJSON()); | 
			
		
	
		
			
				
					|  |  |  |           } | 
			
		
	
		
			
				
					|  |  |  |         } else { | 
			
		
	
		
			
				
					|  |  |  |           userMessage = error as string; | 
			
		
	
		
			
				
					|  |  |  |         } | 
			
		
	
		
			
				
					|  |  |  |         // Now set that error for the user to see. | 
			
		
	
		
			
				
					|  |  |  |         this.$notify( | 
			
		
	
		
			
				
					|  |  |  |           { | 
			
		
	
		
			
				
					|  |  |  |             group: "alert", | 
			
		
	
		
			
				
					|  |  |  |             type: "success", | 
			
		
	
		
			
				
					|  |  |  |             title: "Registration Success", | 
			
		
	
		
			
				
					|  |  |  |             text: | 
			
		
	
		
			
				
					|  |  |  |               (contact.name || "That unnamed person") + " has been registered.", | 
			
		
	
		
			
				
					|  |  |  |           }, | 
			
		
	
		
			
				
					|  |  |  |           5000, | 
			
		
	
		
			
				
					|  |  |  |         ); | 
			
		
	
		
			
				
					|  |  |  |       } else { | 
			
		
	
		
			
				
					|  |  |  |         this.$notify( | 
			
		
	
		
			
				
					|  |  |  |           { | 
			
		
	
		
			
				
					|  |  |  |             group: "alert", | 
			
		
	
		
			
				
					|  |  |  |             type: "danger", | 
			
		
	
		
			
				
					|  |  |  |             title: "Registration Error", | 
			
		
	
		
			
				
					|  |  |  |             text: userMessage, | 
			
		
	
		
			
				
					|  |  |  |             text: | 
			
		
	
		
			
				
					|  |  |  |               (regResult.error as string) || | 
			
		
	
		
			
				
					|  |  |  |               "Something went wrong during registration.", | 
			
		
	
		
			
				
					|  |  |  |           }, | 
			
		
	
		
			
				
					|  |  |  |           5000, | 
			
		
	
		
			
				
					|  |  |  |         ); | 
			
		
	
		
			
				
					|  |  |  |       } | 
			
		
	
		
			
				
					|  |  |  |     } catch (error) { | 
			
		
	
		
			
				
					|  |  |  |       console.error("Error when registering:", error); | 
			
		
	
		
			
				
					|  |  |  |       let userMessage = "There was an error. See logs for more info."; | 
			
		
	
		
			
				
					|  |  |  |       const serverError = error as AxiosError; | 
			
		
	
		
			
				
					|  |  |  |       if (serverError) { | 
			
		
	
		
			
				
					|  |  |  |         if (serverError.response?.data?.error?.message) { | 
			
		
	
		
			
				
					|  |  |  |           userMessage = serverError.response.data.error.message; | 
			
		
	
		
			
				
					|  |  |  |         } else if (serverError.message) { | 
			
		
	
		
			
				
					|  |  |  |           userMessage = serverError.message; // Info for the user | 
			
		
	
		
			
				
					|  |  |  |         } else { | 
			
		
	
		
			
				
					|  |  |  |           userMessage = JSON.stringify(serverError.toJSON()); | 
			
		
	
		
			
				
					|  |  |  |         } | 
			
		
	
		
			
				
					|  |  |  |       } else { | 
			
		
	
		
			
				
					|  |  |  |         userMessage = error as string; | 
			
		
	
		
			
				
					|  |  |  |       } | 
			
		
	
		
			
				
					|  |  |  |       // Now set that error for the user to see. | 
			
		
	
		
			
				
					|  |  |  |       this.$notify( | 
			
		
	
		
			
				
					|  |  |  |         { | 
			
		
	
		
			
				
					|  |  |  |           group: "alert", | 
			
		
	
		
			
				
					|  |  |  |           type: "danger", | 
			
		
	
		
			
				
					|  |  |  |           title: "Registration Error", | 
			
		
	
		
			
				
					|  |  |  |           text: userMessage, | 
			
		
	
		
			
				
					|  |  |  |         }, | 
			
		
	
		
			
				
					|  |  |  |         5000, | 
			
		
	
		
			
				
					|  |  |  |       ); | 
			
		
	
		
			
				
					|  |  |  |     } | 
			
		
	
		
			
				
					|  |  |  |   } | 
			
		
	
		
			
				
					|  |  |  | 
 | 
			
		
	
	
		
			
				
					|  |  | @ -980,6 +972,13 @@ export default class ContactsView extends Vue { | 
			
		
	
		
			
				
					|  |  |  |       if (resp.status === 200) { | 
			
		
	
		
			
				
					|  |  |  |         const visibility = resp.data; | 
			
		
	
		
			
				
					|  |  |  |         contact.seesMe = visibility; | 
			
		
	
		
			
				
					|  |  |  |         console.log( | 
			
		
	
		
			
				
					|  |  |  |           "Visibility checked:", | 
			
		
	
		
			
				
					|  |  |  |           visibility, | 
			
		
	
		
			
				
					|  |  |  |           contact.did, | 
			
		
	
		
			
				
					|  |  |  |           contact.name, | 
			
		
	
		
			
				
					|  |  |  |         ); // eslint-disable-line no-console | 
			
		
	
		
			
				
					|  |  |  |         console.log(this.contacts); // eslint-disable-line no-console | 
			
		
	
		
			
				
					|  |  |  |         db.contacts.update(contact.did, { seesMe: visibility }); | 
			
		
	
		
			
				
					|  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |         this.$notify( | 
			
		
	
	
		
			
				
					|  |  | @ -1064,7 +1063,7 @@ export default class ContactsView extends Vue { | 
			
		
	
		
			
				
					|  |  |  |             this.showGiftedDialog(giverDid, recipientDid); | 
			
		
	
		
			
				
					|  |  |  |           }, | 
			
		
	
		
			
				
					|  |  |  |           onYes: async () => { | 
			
		
	
		
			
				
					|  |  |  |             this.$router.push({ | 
			
		
	
		
			
				
					|  |  |  |             (this.$router as Router).push({ | 
			
		
	
		
			
				
					|  |  |  |               name: "contact-amounts", | 
			
		
	
		
			
				
					|  |  |  |               query: { contactDid: giverDid }, | 
			
		
	
		
			
				
					|  |  |  |             }); | 
			
		
	
	
		
			
				
					|  |  | @ -1159,6 +1158,18 @@ export default class ContactsView extends Vue { | 
			
		
	
		
			
				
					|  |  |  |       ); | 
			
		
	
		
			
				
					|  |  |  |     } | 
			
		
	
		
			
				
					|  |  |  |     this.showGiveNumbers = newShowValue; | 
			
		
	
		
			
				
					|  |  |  |     if ( | 
			
		
	
		
			
				
					|  |  |  |       newShowValue && | 
			
		
	
		
			
				
					|  |  |  |       Object.keys(this.givenByMeDescriptions).length === 0 && | 
			
		
	
		
			
				
					|  |  |  |       Object.keys(this.givenByMeConfirmed).length === 0 && | 
			
		
	
		
			
				
					|  |  |  |       Object.keys(this.givenByMeUnconfirmed).length === 0 && | 
			
		
	
		
			
				
					|  |  |  |       Object.keys(this.givenToMeDescriptions).length === 0 && | 
			
		
	
		
			
				
					|  |  |  |       Object.keys(this.givenToMeConfirmed).length === 0 && | 
			
		
	
		
			
				
					|  |  |  |       Object.keys(this.givenToMeUnconfirmed).length === 0 | 
			
		
	
		
			
				
					|  |  |  |     ) { | 
			
		
	
		
			
				
					|  |  |  |       // assume we should load it all | 
			
		
	
		
			
				
					|  |  |  |       this.loadGives(); | 
			
		
	
		
			
				
					|  |  |  |     } | 
			
		
	
		
			
				
					|  |  |  |   } | 
			
		
	
		
			
				
					|  |  |  |   public toggleShowGiveTotals() { | 
			
		
	
		
			
				
					|  |  |  |     if (this.showGiveTotals) { | 
			
		
	
	
		
			
				
					|  |  | 
 |