From 2b0e60dfc2592ac15fe0c6e047996b6ba1ff46d4 Mon Sep 17 00:00:00 2001 From: Matthew Raymer Date: Mon, 23 Jun 2025 10:30:08 +0000 Subject: [PATCH] feat: enhance GenericVerifiableCredential interface with explicit optional properties - Add name, description, and agent as optional properties to GenericVerifiableCredential - Improve type safety and IntelliSense for common claim properties - Maintain backward compatibility with existing code - Reduce need for type assertions when accessing claim properties --- doc/migration-to-wa-sqlite.md | 8 ++--- src/components/FeedFilters.vue | 2 -- src/components/GiftedDialog.vue | 1 - src/components/GiftedPrompts.vue | 1 - src/components/ImageMethodDialog.vue | 29 ++++++++-------- src/components/MembersList.vue | 6 +--- src/components/OfferDialog.vue | 1 - src/components/PhotoDialog.vue | 1 - src/components/PushNotificationPermission.vue | 6 +--- src/components/TopMessage.vue | 1 - src/components/UserNameDialog.vue | 1 - .../World/components/objects/landmarks.js | 1 - src/interfaces/index.ts | 2 ++ src/libs/endorserServer.ts | 15 +++++---- src/libs/partnerServer.ts | 2 +- src/libs/util.ts | 9 +---- .../platforms/CapacitorPlatformService.ts | 7 ++-- src/views/AccountViewView.vue | 33 +++++++++++-------- src/views/ClaimAddRawView.vue | 27 ++++++++++----- src/views/ClaimReportCertificateView.vue | 9 ++--- src/views/ClaimView.vue | 1 - src/views/ConfirmGiftView.vue | 1 - src/views/ContactAmountsView.vue | 12 +++---- src/views/ContactEditView.vue | 3 +- src/views/ContactGiftingView.vue | 1 - src/views/ContactImportView.vue | 25 +------------- src/views/ContactQRScanFullView.vue | 3 -- src/views/DiscoverView.vue | 23 +++++-------- src/views/GiftedDetailsView.vue | 1 - src/views/HelpNotificationsView.vue | 5 +-- src/views/HelpView.vue | 4 --- src/views/HomeView.vue | 8 ++--- src/views/IdentitySwitcherView.vue | 6 ---- src/views/ImportDerivedAccountView.vue | 2 -- src/views/LogView.vue | 10 +++--- src/views/NewEditProjectView.vue | 20 +++++------ src/views/OfferDetailsView.vue | 5 +-- src/views/OnboardMeetingListView.vue | 1 - src/views/OnboardMeetingMembersView.vue | 8 +++-- src/views/OnboardMeetingSetupView.vue | 4 ++- src/views/ProjectViewView.vue | 10 ++---- src/views/QuickActionBvcEndView.vue | 11 +++---- src/views/RecentOffersToUserView.vue | 1 - src/views/ShareMyContactInfoView.vue | 1 - src/views/SharedPhotoView.vue | 2 -- src/views/StartView.vue | 2 +- src/views/TestView.vue | 13 ++------ src/views/UserProfileView.vue | 1 - 48 files changed, 141 insertions(+), 205 deletions(-) diff --git a/doc/migration-to-wa-sqlite.md b/doc/migration-to-wa-sqlite.md index 2249b0df..dd1fa1eb 100644 --- a/doc/migration-to-wa-sqlite.md +++ b/doc/migration-to-wa-sqlite.md @@ -69,8 +69,8 @@ export async function migrateActiveDid(): Promise { // 3. Update SQLite master settings await updateDefaultSettings({ activeDid: dexieActiveDid }); -} -``` + } + ``` #### Enhanced `migrateSettings()` Function The settings migration now includes activeDid handling: @@ -171,7 +171,7 @@ npm run test:migration ``` ### ActiveDid Testing -```typescript + ```typescript // Test activeDid migration specifically const result = await migrateActiveDid(); expect(result.success).toBe(true); @@ -204,7 +204,7 @@ logger.setLevel('debug'); // Check migration status const comparison = await compareDatabases(); console.log('Settings differences:', comparison.differences.settings); -``` + ``` ## Future Enhancements diff --git a/src/components/FeedFilters.vue b/src/components/FeedFilters.vue index 0748cb8e..23adee98 100644 --- a/src/components/FeedFilters.vue +++ b/src/components/FeedFilters.vue @@ -101,8 +101,6 @@ import { import { Router } from "vue-router"; import * as databaseUtil from "../db/databaseUtil"; -import { MASTER_SETTINGS_KEY } from "../db/tables/settings"; -import { db, retrieveSettingsForActiveAccount } from "../db/index"; @Component({ components: { diff --git a/src/components/GiftedDialog.vue b/src/components/GiftedDialog.vue index bcdf5ede..f08f5b0b 100644 --- a/src/components/GiftedDialog.vue +++ b/src/components/GiftedDialog.vue @@ -96,7 +96,6 @@ import { serverMessageForUser, } from "../libs/endorserServer"; import * as libsUtil from "../libs/util"; -import { db, retrieveSettingsForActiveAccount } from "../db/index"; import { Contact } from "../db/tables/contacts"; import * as databaseUtil from "../db/databaseUtil"; import { retrieveAccountDids } from "../libs/util"; diff --git a/src/components/GiftedPrompts.vue b/src/components/GiftedPrompts.vue index 57840022..ea3fa288 100644 --- a/src/components/GiftedPrompts.vue +++ b/src/components/GiftedPrompts.vue @@ -75,7 +75,6 @@ import { Vue, Component } from "vue-facing-decorator"; import { Router } from "vue-router"; import { AppString, NotificationIface } from "../constants/app"; -import { db } from "../db/index"; import { Contact } from "../db/tables/contacts"; import * as databaseUtil from "../db/databaseUtil"; import { GiverReceiverInputInfo } from "../libs/util"; diff --git a/src/components/ImageMethodDialog.vue b/src/components/ImageMethodDialog.vue index b18e2f29..69d9b860 100644 --- a/src/components/ImageMethodDialog.vue +++ b/src/components/ImageMethodDialog.vue @@ -262,30 +262,21 @@ import { Component, Vue } from "vue-facing-decorator"; import VuePictureCropper, { cropper } from "vue-picture-cropper"; import { Capacitor } from "@capacitor/core"; import { DEFAULT_IMAGE_API_SERVER, NotificationIface } from "../constants/app"; -import { retrieveSettingsForActiveAccount } from "../db/index"; import { accessToken } from "../libs/crypto"; import { logger } from "../utils/logger"; import { PlatformServiceFactory } from "../services/PlatformServiceFactory"; import * as databaseUtil from "../db/databaseUtil"; +import { Prop } from "vue-facing-decorator"; +import { Router } from "vue-router"; const inputImageFileNameRef = ref(); @Component({ components: { VuePictureCropper }, - props: { - isRegistered: { - type: Boolean, - default: true, - }, - defaultCameraMode: { - type: String, - default: "environment", - validator: (value: string) => ["environment", "user"].includes(value), - }, - }, }) export default class ImageMethodDialog extends Vue { $notify!: (notification: NotificationIface, timeout?: number) => void; + $router!: Router; /** Active DID for user authentication */ activeDid = ""; @@ -303,7 +294,7 @@ export default class ImageMethodDialog extends Vue { fileName?: string; /** Callback function to set image URL after upload */ - imageCallback: (imageUrl?: string) => void = () => {}; + imageCallback: (imageUrl: string) => void = () => {}; /** URL for image input */ imageUrl?: string; @@ -351,6 +342,14 @@ export default class ImageMethodDialog extends Vue { cameraStateMessage?: string; error: string | null = null; + // Props + @Prop({ default: true }) isRegistered!: boolean; + @Prop({ + default: "environment", + validator: (value: string) => ["environment", "user"].includes(value), + }) + defaultCameraMode!: string; + /** * Lifecycle hook: Initializes component and retrieves user settings * @throws {Error} When settings retrieval fails @@ -411,7 +410,7 @@ export default class ImageMethodDialog extends Vue { type: file.type, }); this.blob = blob; - this.fileName = file.name; + this.fileName = (file as File).name; this.showRetry = false; } }; @@ -442,7 +441,7 @@ export default class ImageMethodDialog extends Vue { ); } } else { - this.imageCallback(this.imageUrl); + this.imageCallback(this.imageUrl as string); this.close(); } } diff --git a/src/components/MembersList.vue b/src/components/MembersList.vue index c84e52a1..cb5449b3 100644 --- a/src/components/MembersList.vue +++ b/src/components/MembersList.vue @@ -159,11 +159,7 @@ diff --git a/src/views/ClaimAddRawView.vue b/src/views/ClaimAddRawView.vue index 087cd95d..42853bd2 100644 --- a/src/views/ClaimAddRawView.vue +++ b/src/views/ClaimAddRawView.vue @@ -30,12 +30,11 @@ diff --git a/src/views/OfferDetailsView.vue b/src/views/OfferDetailsView.vue index 0bbd11d3..e8fb5afc 100644 --- a/src/views/OfferDetailsView.vue +++ b/src/views/OfferDetailsView.vue @@ -181,7 +181,6 @@ import { RouteLocationNormalizedLoaded, Router } from "vue-router"; import QuickNav from "../components/QuickNav.vue"; import TopMessage from "../components/TopMessage.vue"; import { NotificationIface } from "../constants/app"; -import { db, retrieveSettingsForActiveAccount } from "../db/index"; import { GenericCredWrapper, OfferClaim } from "../interfaces"; import { createAndSubmitOffer, @@ -314,7 +313,9 @@ export default class OfferDetailsView extends Vue { group: "alert", type: "danger", title: "Error", - text: err.message || "There was an error loading the offer details.", + text: + (err as Error)?.message || + "There was an error loading the offer details.", }, 5000, ); diff --git a/src/views/OnboardMeetingListView.vue b/src/views/OnboardMeetingListView.vue index 75c8e868..777674a1 100644 --- a/src/views/OnboardMeetingListView.vue +++ b/src/views/OnboardMeetingListView.vue @@ -90,7 +90,6 @@ import { Router } from "vue-router"; import QuickNav from "../components/QuickNav.vue"; import TopMessage from "../components/TopMessage.vue"; import * as databaseUtil from "../db/databaseUtil"; -import { retrieveSettingsForActiveAccount } from "../db/index"; import { logConsoleAndDb } from "../db/databaseUtil"; import { errorStringForLog, diff --git a/src/views/OnboardMeetingMembersView.vue b/src/views/OnboardMeetingMembersView.vue index b7de0e28..e07e4ecd 100644 --- a/src/views/OnboardMeetingMembersView.vue +++ b/src/views/OnboardMeetingMembersView.vue @@ -123,7 +123,9 @@ export default class OnboardMeetingMembersView extends Vue { const member = response.data?.data; if (!member) { if (!this.firstName) { - this.$refs.userNameDialog.open(this.addMemberToMeeting); + (this.$refs.userNameDialog as UserNameDialog).open( + this.addMemberToMeeting, + ); // addMemberToMeeting sets isLoading to false } else { await this.addMemberToMeeting(this.firstName); @@ -136,7 +138,9 @@ export default class OnboardMeetingMembersView extends Vue { } else { // must be already in the right meeting if (!this.firstName) { - this.$refs.userNameDialog.open(this.updateMemberInMeeting); + (this.$refs.userNameDialog as UserNameDialog).open( + this.updateMemberInMeeting, + ); // updateMemberInMeeting sets isLoading to false } else { await this.updateMemberInMeeting(this.firstName); diff --git a/src/views/OnboardMeetingSetupView.vue b/src/views/OnboardMeetingSetupView.vue index 1d1882b9..bc6c63c7 100644 --- a/src/views/OnboardMeetingSetupView.vue +++ b/src/views/OnboardMeetingSetupView.vue @@ -271,12 +271,12 @@