adjust to the new profile-embedding endpoint

This commit is contained in:
2026-02-08 20:38:59 -07:00
parent 1b19919121
commit 0a927ccec5

View File

@@ -328,13 +328,11 @@
<button
type="button"
role="switch"
:aria-checked="
generateEmbedding ?? userProfileData?.generateEmbedding
"
:disabled="generateEmbeddingSaving || userProfileLoading"
:aria-checked="embeddingMetadata?.generateEmbedding ?? false"
:disabled="embeddingMetadataSaving || embeddingMetadataLoading"
class="relative inline-flex h-6 w-11 flex-shrink-0 cursor-pointer rounded-full border-2 border-transparent transition-colors focus:outline-none focus:ring-2 focus:ring-blue-500 focus:ring-offset-2 disabled:opacity-50 disabled:cursor-not-allowed"
:class="
(generateEmbedding ?? userProfileData?.generateEmbedding)
(embeddingMetadata?.generateEmbedding ?? false)
? 'bg-blue-600'
: 'bg-gray-200'
"
@@ -343,28 +341,24 @@
<span
class="pointer-events-none inline-block h-5 w-5 transform rounded-full bg-white shadow ring-0 transition"
:class="
(generateEmbedding ?? userProfileData?.generateEmbedding)
(embeddingMetadata?.generateEmbedding ?? false)
? 'translate-x-5'
: 'translate-x-1'
"
/>
</button>
<span class="text-sm text-gray-600">
{{
(generateEmbedding ?? userProfileData?.generateEmbedding)
? "On"
: "Off"
}}
<span v-if="userProfileLoading" class="ml-1">(loading…)</span>
<span v-else-if="generateEmbeddingSaving" class="ml-1"
{{ (embeddingMetadata?.generateEmbedding ?? false) ? "On" : "Off" }}
<span v-if="embeddingMetadataLoading" class="ml-1">(loading…)</span>
<span v-else-if="embeddingMetadataSaving" class="ml-1"
>(saving…)</span
>
</span>
<span class="text-sm text-gray-600">
{{
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.