Fix ClaimView affirm delivery action

- Add offer context support to gifting flow
- Add offerId prop to EntitySelectionStep for offer fulfillment context
- Pass offerId through GiftedDialog to EntitySelectionStep
- Update ContactGiftingView to handle offerId from route query parameters
- Extract offer details (description, amount, unitCode) for pre-population
This commit is contained in:
Jose Olarte III
2025-08-01 13:44:28 +08:00
parent 404a7cbc71
commit e741790d70
4 changed files with 90 additions and 5 deletions

View File

@@ -199,7 +199,14 @@
/>
</button>
</div>
<GiftedDialog ref="customGiveDialog" />
<GiftedDialog
ref="customGiveDialog"
:to-project-id="
detailsForGive?.fulfillsPlanHandleId ||
detailsForOffer?.fulfillsPlanHandleId ||
''
"
/>
<div v-if="libsUtil.isGiveAction(veriClaim)">
<div class="flex columns-3">
@@ -549,6 +556,12 @@ export default class ClaimView extends Vue {
fulfillsHandleId?: string;
} | null = null;
detailsForOffer: { fulfillsPlanHandleId?: string } | null = null;
// Project information for fulfillsPlanHandleId
projectInfo: {
name: string;
imageUrl?: string;
issuer: string;
} | null = null;
fullClaim = null;
fullClaimDump = "";
fullClaimMessage = "";
@@ -674,6 +687,7 @@ export default class ClaimView extends Vue {
this.confsVisibleToIdList = [];
this.detailsForGive = null;
this.detailsForOffer = null;
this.projectInfo = null;
this.fullClaim = null;
this.fullClaimDump = "";
this.fullClaimMessage = "";
@@ -851,6 +865,14 @@ export default class ClaimView extends Vue {
}
}
// Load project information if there's a fulfillsPlanHandleId
const planHandleId =
this.detailsForGive?.fulfillsPlanHandleId ||
this.detailsForOffer?.fulfillsPlanHandleId;
if (planHandleId) {
await this.loadProjectInfo(planHandleId, userDid);
}
// retrieve the list of confirmers
const confirmerInfo = await libsUtil.retrieveConfirmerIdList(
this.apiServer,
@@ -878,6 +900,33 @@ export default class ClaimView extends Vue {
}
}
async loadProjectInfo(planHandleId: string, userDid: string) {
const url =
this.apiServer +
"/api/claim/byHandle/" +
encodeURIComponent(planHandleId);
const headers = await serverUtil.getHeaders(userDid);
try {
const resp = await this.axios.get(url, { headers });
if (resp.status === 200) {
this.projectInfo = {
name: resp.data.claim?.name || "(no name)",
imageUrl: resp.data.claim?.image,
issuer: resp.data.issuer,
};
} else {
await this.$logError(
"Error getting project info: " + JSON.stringify(resp),
);
}
} catch (error: unknown) {
await this.$logError(
"Error retrieving project info: " + JSON.stringify(error),
);
}
}
async showFullClaim(claimId: string) {
const url =
this.apiServer + "/api/claim/full/" + encodeURIComponent(claimId);
@@ -997,10 +1046,37 @@ export default class ClaimView extends Vue {
this.veriClaim as GenericCredWrapper<OfferClaim>,
),
};
// Use project info as recipient if available, otherwise use undefined
const recipient = this.projectInfo
? {
did:
this.detailsForGive?.fulfillsPlanHandleId ||
this.detailsForOffer?.fulfillsPlanHandleId,
name: this.projectInfo.name,
handleId:
this.detailsForGive?.fulfillsPlanHandleId ||
this.detailsForOffer?.fulfillsPlanHandleId,
image: this.projectInfo.imageUrl,
}
: undefined;
// Extract offer information from the claim
const offerClaim = this.veriClaim.claim as OfferClaim;
const description =
offerClaim.itemOffered?.description || offerClaim.description;
const amount =
offerClaim.includesObject?.amountOfThisGood?.toString() || "0";
const unitCode = offerClaim.includesObject?.unitCode || "HUR";
(this.$refs.customGiveDialog as GiftedDialog).open(
giver,
undefined,
recipient,
this.veriClaim.handleId,
undefined, // prompt
description,
amount,
unitCode,
);
}