diff --git a/babel.config.js b/babel.config.js index 162a3ea..cfbc571 100644 --- a/babel.config.js +++ b/babel.config.js @@ -1,3 +1,4 @@ module.exports = { + plugins: ["@babel/plugin-transform-private-methods"], presets: ["@vue/cli-plugin-babel/preset"], }; diff --git a/package-lock.json b/package-lock.json index 1cbcd8a..4c5c568 100644 --- a/package-lock.json +++ b/package-lock.json @@ -42,6 +42,7 @@ "js-generate-password": "^0.1.9", "js-yaml": "^4.1.0", "localstorage-slim": "^2.5.0", + "lru-cache": "^10.2.0", "luxon": "^3.4.4", "merkletreejs": "^0.3.11", "moment": "^2.29.4", @@ -3052,6 +3053,18 @@ "integrity": "sha512-0CNTVCLZggSh7bc5VkX5WWPWO+cyZbNd07IHIsSXLia/eAq+r836hgk+8BKoEh7949Mda87VUOitx5OddVj64A==", "optional": true }, + "node_modules/@digitalcredentials/jsonld/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "optional": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/@digitalcredentials/keypair": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/@digitalcredentials/keypair/-/keypair-1.0.5.tgz", @@ -3149,6 +3162,18 @@ "integrity": "sha512-0CNTVCLZggSh7bc5VkX5WWPWO+cyZbNd07IHIsSXLia/eAq+r836hgk+8BKoEh7949Mda87VUOitx5OddVj64A==", "optional": true }, + "node_modules/@digitalcredentials/vc-status-list/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "optional": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/@discoveryjs/json-ext": { "version": "0.5.7", "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz", @@ -4317,6 +4342,19 @@ "node": ">=4" } }, + "node_modules/@expo/cli/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "optional": true, + "peer": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/@expo/cli/node_modules/mimic-fn": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", @@ -4714,6 +4752,19 @@ "url": "https://github.com/sponsors/isaacs" } }, + "node_modules/@expo/config/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "optional": true, + "peer": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/@expo/config/node_modules/resolve-from": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", @@ -8912,6 +8963,18 @@ "node": ">=12" } }, + "node_modules/@transmute/jsonld/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "optional": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/@transmute/ld-key-pair": { "version": "0.7.0-unstable.81", "resolved": "https://registry.npmjs.org/@transmute/ld-key-pair/-/ld-key-pair-0.7.0-unstable.81.tgz", @@ -9674,6 +9737,18 @@ "integrity": "sha512-0CNTVCLZggSh7bc5VkX5WWPWO+cyZbNd07IHIsSXLia/eAq+r836hgk+8BKoEh7949Mda87VUOitx5OddVj64A==", "optional": true }, + "node_modules/@veramo-community/lds-ecdsa-secp256k1-recovery2020/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "optional": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/@veramo/core": { "version": "5.5.3", "resolved": "https://registry.npmjs.org/@veramo/core/-/core-5.5.3.tgz", @@ -10378,6 +10453,18 @@ "node": ">=8" } }, + "node_modules/@vue/cli-shared-utils/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/@vue/cli-shared-utils/node_modules/supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", @@ -12425,6 +12512,19 @@ "node": ">= 10" } }, + "node_modules/cacache/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "optional": true, + "peer": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/cacache/node_modules/mkdirp": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", @@ -17014,6 +17114,19 @@ "node": ">=10" } }, + "node_modules/hosted-git-info/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "optional": true, + "peer": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/hpack.js": { "version": "2.1.6", "resolved": "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz", @@ -19269,6 +19382,18 @@ "integrity": "sha512-0CNTVCLZggSh7bc5VkX5WWPWO+cyZbNd07IHIsSXLia/eAq+r836hgk+8BKoEh7949Mda87VUOitx5OddVj64A==", "optional": true }, + "node_modules/jsonld/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "optional": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/jsonpointer": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/jsonpointer/-/jsonpointer-5.0.1.tgz", @@ -20246,15 +20371,11 @@ } }, "node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "devOptional": true, - "dependencies": { - "yallist": "^4.0.0" - }, + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.2.0.tgz", + "integrity": "sha512-2bIM8x+VAf6JT4bKAljS1qUWgMsqZRPGJS6FSahIMPVvctcNhyVp7AJu7quxOW9jwkryBReKZY5tY5JYv2n/7Q==", "engines": { - "node": ">=10" + "node": "14 || >=16.14" } }, "node_modules/luxon": { @@ -25124,6 +25245,18 @@ "node": ">=10" } }, + "node_modules/semver/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "devOptional": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/send": { "version": "0.18.0", "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", diff --git a/package.json b/package.json index 5425d24..2487cff 100644 --- a/package.json +++ b/package.json @@ -42,6 +42,7 @@ "js-generate-password": "^0.1.9", "js-yaml": "^4.1.0", "localstorage-slim": "^2.5.0", + "lru-cache": "^10.2.0", "luxon": "^3.4.4", "merkletreejs": "^0.3.11", "moment": "^2.29.4", diff --git a/project.task.yaml b/project.task.yaml index d111576..c8db872 100644 --- a/project.task.yaml +++ b/project.task.yaml @@ -1,10 +1,13 @@ tasks : +- fix the notification link to the app - 24 contextual tutorials https://docs.google.com/document/d/11C_K3RM0rgo0onih20KFhcIzukZyq_CRWqaWX5om_kM/edit#heading=h.iwiwcydou5hw - 24 Move to Vite +- feeds - add "remote" filter, if they choose 'visible' then warn that they won't see any others, cache list & don't reload front page on change + - .1 add KindSpring link to ideas - .1 on feed, don't show "to someone anonymous" if it's to a project - .1 on ideas, put an "x" to close it assignee-group:ui @@ -122,7 +125,7 @@ tasks : - 08 convert to cleaner implementation (maybe Drie -- https://github.com/janvorisek/drie) - .5 show seed phrase in a QR code for transfer to another device -- .5 on DiscoverView, switch to a filter UI (eg. just from friend +- .5 on DiscoverView, switch to a filter UI (eg. just from friend) - .5 don't show "Offer" on project screen if they aren't registered - 01 especially for iOS, check for new version & update, eg. https://stackoverflow.com/questions/52221805/any-way-yet-to-auto-update-or-just-clear-the-cache-on-a-pwa-on-ios diff --git a/src/components/FeedFilters.vue b/src/components/FeedFilters.vue index 669e953..a8b029a 100644 --- a/src/components/FeedFilters.vue +++ b/src/components/FeedFilters.vue @@ -3,21 +3,21 @@

Feed Filters

-

Show only activities that are…

+

Show only activities that…

-
From my contacts
+
Include Someone Visible to Me
@@ -30,6 +30,8 @@
+ or +
-
Nearby
+
Are Nearby
@@ -109,20 +111,20 @@ import { db } from "@/db/index"; }, }) export default class FeedFilters extends Vue { - callOnCloseIfChanged = () => {}; + onCloseIfChanged = () => {}; hasSearchBox = false; - isInMyContacts = false; + hasVisibleDid = false; isNearby = false; settingChanged = false; visible = false; - async open(callOnCloseIfChanged: () => void) { - this.callOnCloseIfChanged = callOnCloseIfChanged; + async open(onCloseIfChanged: () => void) { + this.onCloseIfChanged = onCloseIfChanged; await db.open(); const settings = await db.settings.get(MASTER_SETTINGS_KEY); - this.isInMyContacts = !!settings?.filterFeedContacts; - this.isNearby = !!settings?.filterFeedNearby; + this.hasVisibleDid = !!settings?.filterFeedByVisible; + this.isNearby = !!settings?.filterFeedByNearby; if (settings?.searchBoxes && settings.searchBoxes.length > 0) { this.hasSearchBox = true; } @@ -131,11 +133,11 @@ export default class FeedFilters extends Vue { this.visible = true; } - toggleContacts() { + toggleHasVisibleDid() { this.settingChanged = true; - this.isInMyContacts = !this.isInMyContacts; + this.hasVisibleDid = !this.hasVisibleDid; db.settings.update(MASTER_SETTINGS_KEY, { - filterFeedContacts: this.isInMyContacts, + filterFeedByVisible: this.hasVisibleDid, }); } @@ -143,41 +145,41 @@ export default class FeedFilters extends Vue { this.settingChanged = true; this.isNearby = !this.isNearby; db.settings.update(MASTER_SETTINGS_KEY, { - filterFeedNearby: this.isNearby, + filterFeedByNearby: this.isNearby, }); } async clearAll() { - if (this.isInMyContacts || this.isNearby) { + if (this.hasVisibleDid || this.isNearby) { this.settingChanged = true; } db.settings.update(MASTER_SETTINGS_KEY, { - filterFeedNearby: false, - filterFeedContacts: false, + filterFeedByNearby: false, + filterFeedByVisible: false, }); - this.isInMyContacts = false; + this.hasVisibleDid = false; this.isNearby = false; } async setAll() { - if (!this.isInMyContacts || !this.isNearby) { + if (!this.hasVisibleDid || !this.isNearby) { this.settingChanged = true; } db.settings.update(MASTER_SETTINGS_KEY, { - filterFeedNearby: true, - filterFeedContacts: true, + filterFeedByNearby: true, + filterFeedByVisible: true, }); - this.isInMyContacts = true; + this.hasVisibleDid = true; this.isNearby = true; } close() { if (this.settingChanged) { - this.callOnCloseIfChanged(); + this.onCloseIfChanged(); } this.visible = false; } diff --git a/src/db/tables/settings.ts b/src/db/tables/settings.ts index 479ee63..dbc4cf0 100644 --- a/src/db/tables/settings.ts +++ b/src/db/tables/settings.ts @@ -17,8 +17,8 @@ export type Settings = { activeDid?: string; // Active Decentralized ID apiServer?: string; // API server URL - filterFeedNearby?: string; // filter by nearby - filterFeedContacts?: string; // filter by user contacts + filterFeedByNearby?: boolean; // filter by nearby + filterFeedByVisible?: boolean; // filter by visible users ie. anyone not hidden firstName?: string; // User's first name isRegistered?: boolean; @@ -42,6 +42,10 @@ export type Settings = { webPushServer?: string; // Web Push server URL }; +export function isAnyFeedFilterOn(settings: Settings): boolean { + return !!(settings.filterFeedByNearby || settings.filterFeedByVisible); +} + /** * Schema for the Settings table in the database. */ diff --git a/src/libs/endorserServer.ts b/src/libs/endorserServer.ts index 5972708..b1676e9 100644 --- a/src/libs/endorserServer.ts +++ b/src/libs/endorserServer.ts @@ -1,9 +1,11 @@ +import { Axios, AxiosResponse, RawAxiosRequestHeaders } from "axios"; +import * as didJwt from "did-jwt"; +import { LRUCache } from "lru-cache"; import * as R from "ramda"; import { IIdentifier } from "@veramo/core"; -import { accessToken, SimpleSigner } from "@/libs/crypto"; -import * as didJwt from "did-jwt"; -import { Axios, AxiosResponse } from "axios"; + import { Contact } from "@/db/tables/contacts"; +import { accessToken, SimpleSigner } from "@/libs/crypto"; export const SCHEMA_ORG_CONTEXT = "https://schema.org"; // the object in RegisterAction claims @@ -49,7 +51,7 @@ export interface GenericVerifiableCredential { [key: string]: any; // eslint-disable-line @typescript-eslint/no-explicit-any } -export interface GenericServerRecord extends GenericVerifiableCredential { +export interface GenericCredWrapper extends GenericVerifiableCredential { handleId?: string; id: string; issuedAt: string; @@ -58,7 +60,7 @@ export interface GenericServerRecord extends GenericVerifiableCredential { claim: Record; claimType?: string; } -export const BLANK_GENERIC_SERVER_RECORD: GenericServerRecord = { +export const BLANK_GENERIC_SERVER_RECORD: GenericCredWrapper = { "@context": SCHEMA_ORG_CONTEXT, "@type": "", claim: {}, @@ -68,7 +70,7 @@ export const BLANK_GENERIC_SERVER_RECORD: GenericServerRecord = { }; // a summary record; the VC is found the fullClaim field -export interface GiveServerRecord { +export interface GiveSummaryRecord { agentDid: string; amount: number; amountConfirmed: number; @@ -83,7 +85,7 @@ export interface GiveServerRecord { } // a summary record; the VC is found the fullClaim field -export interface OfferServerRecord { +export interface OfferSummaryRecord { amount: number; amountGiven: number; amountGivenConfirmed: number; @@ -101,7 +103,7 @@ export interface OfferServerRecord { } // a summary record; the VC is not currently part of this record -export interface PlanServerRecord { +export interface PlanSummaryRecord { agentDid?: string; // optional, if the issuer wants someone else to manage as well description: string; endTime?: string; @@ -256,6 +258,10 @@ export type CreateAndSubmitClaimResult = SuccessResult | ErrorResult; // See https://github.com/trentlarson/endorser-ch/blob/0cb626f803028e7d9c67f095858a9fc8542e3dbd/server/api/services/util.js#L6 const HIDDEN_DID = "did:none:HIDDEN"; +const planCache: LRUCache = new LRUCache({ + max: 500, +}); + export function isDid(did: string) { return did.startsWith("did:"); } @@ -269,7 +275,7 @@ export function isEmptyOrHiddenDid(did?: string) { } /** - * @return true for any nested string where func(input) === true + * @return true for any string within this primitive/object/array where func(input) === true * * Similar logic is found in endorser-mobile. */ @@ -304,6 +310,12 @@ export function containsHiddenDid(obj: any) { return testRecursivelyOnStrings(isHiddenDid, obj); } +// eslint-disable-next-line @typescript-eslint/no-explicit-any +export const containsNonHiddenDid = (obj: any) => { + // eslint-disable-next-line @typescript-eslint/no-explicit-any + return testRecursivelyOnStrings((s: any) => isDid(s) && !isHiddenDid(s), obj); +}; + export function stripEndorserPrefix(claimId: string) { if (claimId && claimId.startsWith(ENDORSER_CH_HANDLE_PREFIX)) { return claimId.substring(ENDORSER_CH_HANDLE_PREFIX.length); @@ -423,6 +435,62 @@ export function didInfo( return didInfoForContact(did, activeDid, contact, allMyDids).displayName; } +async function getHeaders(identity: IIdentifier) { + const headers: RawAxiosRequestHeaders = { + "Content-Type": "application/json", + }; + if (identity) { + const token = await accessToken(identity); + headers["Authorization"] = "Bearer " + token; + } + return headers; +} + +export async function getPlanFromCache( + handleId: string, + identity: IIdentifier, + axios: Axios, + apiServer: string, +) { + let cred = planCache.get(handleId); + if (!cred) { + const url = + apiServer + + "/api/v2/report/plans?handleId=" + + encodeURIComponent(handleId); + const headers = await getHeaders(identity); + try { + const resp = await axios.get(url, { headers }); + if (resp.status === 200 && resp.data?.data?.length > 0) { + cred = resp.data.data[0]; + planCache.set(handleId, cred); + } else { + console.log( + "Failed to load plan with handle", + handleId, + " Got data:", + resp.data, + ); + } + } catch (error) { + console.log( + "Failed to load plan with handle", + handleId, + " Got error:", + error, + ); + } + } + return cred; +} + +export async function setPlanInCache( + handleId: string, + planSummary: PlanSummaryRecord, +) { + planCache.set(handleId, planSummary); +} + /** * For result, see https://api.endorser.ch/api-docs/#/claims/post_api_v2_claim * @@ -475,7 +543,7 @@ export async function createAndSubmitGive( vcClaim.image = imageUrl; } return createAndSubmitClaim( - vcClaim as GenericServerRecord, + vcClaim as GenericCredWrapper, identity, apiServer, axios, @@ -524,7 +592,7 @@ export async function createAndSubmitOffer( }; } return createAndSubmitClaim( - vcClaim as GenericServerRecord, + vcClaim as GenericCredWrapper, identity, apiServer, axios, @@ -695,7 +763,7 @@ const claimSummary = (claim: Record) => { similar code is also contained in endorser-mobile **/ export const claimSpecialDescription = ( - record: GenericServerRecord, + record: GenericCredWrapper, activeDid: string, identifiers: Array, contacts: Array, @@ -789,7 +857,7 @@ export const claimSpecialDescription = ( "...]" ); } else { - return issuer + " declared " + claimSummary(claim as GenericServerRecord); + return issuer + " declared " + claimSummary(claim as GenericCredWrapper); } }; diff --git a/src/libs/util.ts b/src/libs/util.ts index 1a613df..f85f550 100644 --- a/src/libs/util.ts +++ b/src/libs/util.ts @@ -9,7 +9,7 @@ import { accountsDB, db } from "@/db/index"; import { Account } from "@/db/tables/accounts"; import { MASTER_SETTINGS_KEY } from "@/db/tables/settings"; import { deriveAddress, generateSeed, newIdentifier } from "@/libs/crypto"; -import { GenericServerRecord, containsHiddenDid } from "@/libs/endorserServer"; +import { GenericCredWrapper, containsHiddenDid } from "@/libs/endorserServer"; import * as serverUtil from "@/libs/endorserServer"; // eslint-disable-next-line @typescript-eslint/no-var-requires @@ -69,7 +69,7 @@ export const isGlobalUri = (uri: string) => { return uri && uri.match(new RegExp(/^[A-Za-z][A-Za-z0-9+.-]+:/)); }; -export const giveIsConfirmable = (veriClaim: GenericServerRecord) => { +export const giveIsConfirmable = (veriClaim: GenericCredWrapper) => { return veriClaim.claimType === "GiveAction"; }; @@ -85,7 +85,7 @@ export const doCopyTwoSecRedo = (text: string, fn: () => void) => { * @param veriClaim is expected to have fields: claim, claimType, and issuer */ export const isGiveRecordTheUserCanConfirm = ( - veriClaim: GenericServerRecord, + veriClaim: GenericCredWrapper, activeDid: string, confirmerIdList: string[] = [], ) => { @@ -101,9 +101,9 @@ export const isGiveRecordTheUserCanConfirm = ( * @returns the DID of the person who offered, or undefined if hidden * @param veriClaim is expected to have fields: claim and issuer */ -export const offerGiverDid: ( - arg0: GenericServerRecord, -) => string | undefined = (veriClaim) => { +export const offerGiverDid: (arg0: GenericCredWrapper) => string | undefined = ( + veriClaim, +) => { let giver; if ( veriClaim.claim.offeredBy?.identifier && @@ -120,7 +120,7 @@ export const offerGiverDid: ( * @returns true if the user can fulfill the offer * @param veriClaim is expected to have fields: claim, claimType, and issuer */ -export const canFulfillOffer = (veriClaim: GenericServerRecord) => { +export const canFulfillOffer = (veriClaim: GenericCredWrapper) => { return !!(veriClaim.claimType === "Offer" && offerGiverDid(veriClaim)); }; diff --git a/src/views/ContactAmountsView.vue b/src/views/ContactAmountsView.vue index a6fc0ff..1d3654a 100644 --- a/src/views/ContactAmountsView.vue +++ b/src/views/ContactAmountsView.vue @@ -119,7 +119,7 @@ import { MASTER_SETTINGS_KEY } from "@/db/tables/settings"; import { accessToken, SimpleSigner } from "@/libs/crypto"; import { AgreeVerifiableCredential, - GiveServerRecord, + GiveSummaryRecord, GiveVerifiableCredential, SCHEMA_ORG_CONTEXT, } from "@/libs/endorserServer"; @@ -131,7 +131,7 @@ export default class ContactAmountssView extends Vue { activeDid = ""; apiServer = ""; contact: Contact | null = null; - giveRecords: Array = []; + giveRecords: Array = []; numAccounts = 0; async beforeCreate() { @@ -197,7 +197,7 @@ export default class ContactAmountssView extends Vue { async loadGives(activeDid: string, contact: Contact) { try { const identity = await this.getIdentity(this.activeDid); - let result: Array = []; + let result: Array = []; const url = this.apiServer + "/api/v2/report/gives?agentDid=" + @@ -252,7 +252,7 @@ export default class ContactAmountssView extends Vue { ); } - const sortedResult: Array = R.sort( + const sortedResult: Array = R.sort( (a, b) => new Date(b.issuedAt).getTime() - new Date(a.issuedAt).getTime(), result, @@ -271,7 +271,7 @@ export default class ContactAmountssView extends Vue { } } - async confirm(record: GiveServerRecord) { + async confirm(record: GiveSummaryRecord) { // Make claim // I use clone here because otherwise it gets a Proxy object. // eslint-disable-next-line @typescript-eslint/no-explicit-any diff --git a/src/views/ContactsView.vue b/src/views/ContactsView.vue index 8384163..2bf4a9a 100644 --- a/src/views/ContactsView.vue +++ b/src/views/ContactsView.vue @@ -303,7 +303,7 @@ import { import { CONTACT_CSV_HEADER, CONTACT_URL_PREFIX, - GiveServerRecord, + GiveSummaryRecord, GiveVerifiableCredential, isDid, RegisterVerifiableCredential, @@ -410,7 +410,7 @@ export default class ContactsView extends Vue { } const handleResponse = ( - resp: { status: number; data: { data: GiveServerRecord[] } }, + resp: { status: number; data: { data: GiveSummaryRecord[] } }, descriptions: Record, confirmed: Record, unconfirmed: Record, diff --git a/src/views/HomeView.vue b/src/views/HomeView.vue index 4194151..57dca40 100644 --- a/src/views/HomeView.vue +++ b/src/views/HomeView.vue @@ -247,11 +247,17 @@ Loading…

+
+

+ No claims match your filters. +

+