50 lines
2.3 KiB
JavaScript
50 lines
2.3 KiB
JavaScript
function createRefreshAll({ messageTypes, sendRuntimeMessage, activityCache, resetRelatedData,
|
|
opportunitiesQueryState, productsContentState, consumptionPlansState, consumptionTrendState,
|
|
aiSummaryState, reload, onFailure, notify, createRefreshIcon, environment }) {
|
|
let pending = null;
|
|
function refresh(period) {
|
|
if (pending) return pending;
|
|
opportunitiesQueryState.periodRequestVersion += 1;
|
|
productsContentState.currentProductsRequestId = "";
|
|
productsContentState.opptyProductsByNumber = new Map();
|
|
productsContentState.expandedProductOptyNumbers = new Set();
|
|
productsContentState.productsProgress = { state: "idle", completed: 0, total: 0, failed: 0, cacheHits: 0 };
|
|
consumptionPlansState.accountPlansRequestState = new Map();
|
|
consumptionTrendState.consumptionTrendCache = new Map();
|
|
consumptionTrendState.consumptionTrendWindowOffsets = new Map();
|
|
consumptionTrendState.consumptionTrendSeriesFilters = new Map();
|
|
aiSummaryState.aiSummariesByOptyNumber = new Map();
|
|
resetRelatedData();
|
|
pending = (async () => {
|
|
await activityCache.invalidate();
|
|
const response = await sendRuntimeMessage({ type: messageTypes.invalidateProductsCache });
|
|
if (!response?.ok) throw new Error(response?.error || "Unable to clear product cache.");
|
|
await reload(period);
|
|
})().catch(error => { onFailure(error); throw error; }).finally(() => { pending = null; });
|
|
return pending;
|
|
}
|
|
function createButton(getPeriod) {
|
|
const button = environment.document.createElement("button");
|
|
button.type = "button";
|
|
button.className = "opportunities-extension-icon-button opportunities-extension-refresh-all";
|
|
button.append(createRefreshIcon());
|
|
button.title = "Refresh all";
|
|
button.setAttribute("aria-label", "Refresh all");
|
|
button.addEventListener("click", async () => {
|
|
if (button.disabled) return;
|
|
button.disabled = true;
|
|
button.title = "Refreshing...";
|
|
button.setAttribute("aria-busy", "true");
|
|
try { await refresh(getPeriod()); }
|
|
catch (error) { notify(error.message || "Unable to refresh cached data.", true); }
|
|
finally {
|
|
button.disabled = false;
|
|
button.title = "Refresh all";
|
|
button.setAttribute("aria-busy", "false");
|
|
}
|
|
});
|
|
return button;
|
|
}
|
|
return { refresh, createButton };
|
|
}
|