diff --git a/src/views/DIDView.vue b/src/views/DIDView.vue
index b3897dc817..0e741998b9 100644
--- a/src/views/DIDView.vue
+++ b/src/views/DIDView.vue
@@ -328,13 +328,11 @@
- {{
- (generateEmbedding ?? userProfileData?.generateEmbedding)
- ? "On"
- : "Off"
- }}
- (loading…)
- (loading…)
+ (saving…)
{{
- userProfileData?.embeddingIsForEmptyString == null
+ embeddingMetadata?.isForEmptyString == null
? ""
- : userProfileData?.embeddingIsForEmptyString
+ : embeddingMetadata?.isForEmptyString
? "- Embedding is for blank description"
: "- Embedding is for non-blank description"
}}
@@ -519,9 +513,12 @@ export default class DIDView extends Vue {
contactLabels: string[] = [];
contactYaml = "";
- generateEmbedding: boolean | null = null; // used when there is no profile
- generateEmbeddingLoading = false;
- generateEmbeddingSaving = false;
+ embeddingMetadata: {
+ generateEmbedding: boolean;
+ isForEmptyString: boolean;
+ } | null = null;
+ embeddingMetadataLoading = false;
+ embeddingMetadataSaving = false;
hitEnd = false;
isLoading = false;
isMyDid = false;
@@ -567,7 +564,7 @@ export default class DIDView extends Vue {
await this.loadClaimsAbout();
await this.checkIfOwnDID();
if (this.showGeneralAdvanced && this.activeDid) {
- await this.loadUserProfile();
+ await this.loadUserProfileEmbeddingMetadata();
}
}
}
@@ -655,28 +652,17 @@ export default class DIDView extends Vue {
if (!this.viewingDid || !this.activeDid) {
return;
}
- const newValue = !(this.userProfileData
- ? this.userProfileData.generateEmbedding
- : this.generateEmbedding);
- this.generateEmbeddingSaving = true;
+ const currentValue = this.embeddingMetadata?.generateEmbedding ?? false;
+ const newValue = !currentValue;
+ this.embeddingMetadataSaving = true;
try {
const headers = await getHeaders(this.activeDid);
const url = `${this.partnerApiServer}/api/partner/userProfileGenerateEmbedding/${encodeURIComponent(this.viewingDid)}`;
await this.axios.put(url, { generateEmbedding: newValue }, { headers });
- if (this.userProfileData) {
- this.userProfileData.generateEmbedding = newValue;
- this.userProfileData.embeddingIsForEmptyString = newValue; // the server should have generated it or erased it
- } else {
- this.generateEmbedding = newValue;
- if (newValue) {
- this.userProfileData = {
- description: "",
- issuerDid: this.viewingDid,
- generateEmbedding: newValue,
- embeddingIsForEmptyString: true,
- };
- }
- }
+
+ // Refresh embedding metadata from the dedicated endpoint
+ await this.loadUserProfileEmbeddingMetadata();
+
this.notify.success(
newValue
? "Contact tagged to always generate embedding."
@@ -696,7 +682,7 @@ export default class DIDView extends Vue {
);
}
} finally {
- this.generateEmbeddingSaving = false;
+ this.embeddingMetadataSaving = false;
}
}
@@ -736,6 +722,39 @@ export default class DIDView extends Vue {
}
}
+ /**
+ * Loads embedding metadata (generateEmbedding, isForEmptyString) for the viewing DID
+ * from the partner API userProfileEmbeddingMetadata endpoint.
+ */
+ async loadUserProfileEmbeddingMetadata() {
+ if (!this.viewingDid || !this.activeDid) return;
+ this.embeddingMetadataLoading = true;
+ this.embeddingMetadata = null;
+ try {
+ const headers = await getHeaders(this.activeDid);
+ const url = `${this.partnerApiServer}/api/partner/userProfileEmbeddingMetadata/${encodeURIComponent(this.viewingDid)}`;
+ const response = await this.axios.get(url, { headers });
+ const data = response.data?.data;
+ if (data && typeof data.generateEmbedding === "boolean") {
+ this.embeddingMetadata = {
+ generateEmbedding: data.generateEmbedding,
+ isForEmptyString: !!data.isForEmptyString,
+ };
+ } else {
+ this.embeddingMetadata = null;
+ }
+ } catch (err: unknown) {
+ const axiosErr = err as { response?: { status?: number } };
+ if (axiosErr.response?.status === 404) {
+ this.embeddingMetadata = null;
+ } else {
+ logger.error("Failed to load user profile embedding metadata:", err);
+ }
+ } finally {
+ this.embeddingMetadataLoading = false;
+ }
+ }
+
/**
* Loads the user profile for the viewing DID from the partner API.
* Shows profile content or a message if the DID has no profile or it is not visible.