function createInstallBaseAction({ messageTypes, requestConsumerTokenServiceOnce, sendRuntimeMessage, appendBackgroundRequestLog, openInstallBaseModal, environment }) { const { document } = environment; const pending = new Map(); async function load(partyNumber) { const authorizations = await requestConsumerTokenServiceOnce(); const response = await sendRuntimeMessage({ type: messageTypes.requestInstallBase, partyNumber, authorizations: { accountSummary: authorizations.accountSummary, installBase: authorizations.installBase } }); appendBackgroundRequestLog(response?.debugRequests); if (!response?.ok) throw new Error(response?.error || "Unable to load installed base."); return response.items; } function createInstallBaseButton(opportunity) { const button = document.createElement("button"); button.type = "button"; button.className = "opportunities-extension-action-button"; button.title = "View customer installed base"; button.setAttribute("aria-label", `View installed base for ${opportunity.CustomerAccount?.PartyUniqueName || "customer"}`); const icon = document.createElementNS("http://www.w3.org/2000/svg", "svg"); icon.setAttribute("viewBox", "0 0 24 24"); icon.setAttribute("aria-hidden", "true"); icon.setAttribute("focusable", "false"); const path = document.createElementNS("http://www.w3.org/2000/svg", "path"); path.setAttribute("d", "M4 3h16v7H4z M4 14h16v7H4z M7 6.5h.01 M7 17.5h.01 M11 6.5h6 M11 17.5h6 M8 10v4 M16 10v4"); path.setAttribute("fill", "none"); path.setAttribute("stroke", "currentColor"); path.setAttribute("stroke-width", "1.7"); path.setAttribute("stroke-linecap", "round"); path.setAttribute("stroke-linejoin", "round"); icon.append(path); button.append(icon); button.addEventListener("click", async () => { const view = openInstallBaseModal(opportunity, button); const partyNumber = String(opportunity.CustomerAccount?.PartyNumber || ""); try { if (!partyNumber) throw new Error("Customer Party Number is unavailable."); if (!pending.has(partyNumber)) { const request = load(partyNumber).finally(() => { if (pending.get(partyNumber) === request) pending.delete(partyNumber); }); pending.set(partyNumber, request); } view.render(await pending.get(partyNumber)); } catch (error) { view.render([], error.message || "Unable to load installed base."); } }); return button; } return { createInstallBaseButton, resetRequests: () => pending.clear() }; }