Refactor to reduce lines
This commit is contained in:
@@ -1650,24 +1650,7 @@
|
||||
button.classList.add("is-loading");
|
||||
setStatus("Requesting history sync…", "info");
|
||||
try {
|
||||
const payload = new URLSearchParams();
|
||||
payload.set("service", thread.dataset.service || "");
|
||||
payload.set("identifier", thread.dataset.identifier || "");
|
||||
if (thread.dataset.person) {
|
||||
payload.set("person", thread.dataset.person);
|
||||
}
|
||||
payload.set("limit", thread.dataset.limit || "60");
|
||||
const response = await fetch(historySyncUrl, {
|
||||
method: "POST",
|
||||
credentials: "same-origin",
|
||||
headers: {
|
||||
"X-CSRFToken": csrfToken,
|
||||
"Content-Type": "application/x-www-form-urlencoded",
|
||||
Accept: "application/json"
|
||||
},
|
||||
body: payload.toString(),
|
||||
});
|
||||
const result = await response.json();
|
||||
const result = await postFormJson(historySyncUrl, queryParams());
|
||||
if (!result.ok) {
|
||||
setStatus(
|
||||
String(result.message || result.error || "History sync failed."),
|
||||
@@ -2352,14 +2335,7 @@
|
||||
}
|
||||
panelState.polling = true;
|
||||
try {
|
||||
const params = new URLSearchParams();
|
||||
params.set("service", thread.dataset.service || "");
|
||||
params.set("identifier", thread.dataset.identifier || "");
|
||||
if (thread.dataset.person) {
|
||||
params.set("person", thread.dataset.person);
|
||||
}
|
||||
params.set("limit", thread.dataset.limit || "60");
|
||||
params.set("after_ts", String(lastTs));
|
||||
const params = queryParams({ after_ts: String(lastTs) });
|
||||
const response = await fetch(thread.dataset.pollUrl + "?" + params.toString(), {
|
||||
method: "GET",
|
||||
credentials: "same-origin",
|
||||
@@ -2532,7 +2508,7 @@
|
||||
return active;
|
||||
};
|
||||
|
||||
const queryParams = function () {
|
||||
const queryParams = function (extraParams) {
|
||||
const params = new URLSearchParams();
|
||||
params.set("service", thread.dataset.service || "");
|
||||
params.set("identifier", thread.dataset.identifier || "");
|
||||
@@ -2540,9 +2516,47 @@
|
||||
params.set("person", thread.dataset.person);
|
||||
}
|
||||
params.set("limit", thread.dataset.limit || "60");
|
||||
const extras =
|
||||
extraParams && typeof extraParams === "object" ? extraParams : {};
|
||||
Object.keys(extras).forEach(function (key) {
|
||||
const value = extras[key];
|
||||
if (value === undefined || value === null || value === "") {
|
||||
return;
|
||||
}
|
||||
params.set(String(key), String(value));
|
||||
});
|
||||
return params;
|
||||
};
|
||||
|
||||
const postFormJson = async function (url, params) {
|
||||
const response = await fetch(url, {
|
||||
method: "POST",
|
||||
credentials: "same-origin",
|
||||
headers: {
|
||||
"X-CSRFToken": csrfToken,
|
||||
"Content-Type": "application/x-www-form-urlencoded",
|
||||
Accept: "application/json"
|
||||
},
|
||||
body: params.toString(),
|
||||
});
|
||||
if (!response.ok) {
|
||||
throw new Error("Request failed");
|
||||
}
|
||||
return response.json();
|
||||
};
|
||||
|
||||
const getJson = async function (url) {
|
||||
const response = await fetch(url, {
|
||||
method: "GET",
|
||||
credentials: "same-origin",
|
||||
headers: { Accept: "application/json" }
|
||||
});
|
||||
if (!response.ok) {
|
||||
throw new Error("Request failed");
|
||||
}
|
||||
return response.json();
|
||||
};
|
||||
|
||||
const titleCase = function (value) {
|
||||
const raw = String(value || "").trim().toLowerCase();
|
||||
if (!raw) {
|
||||
@@ -2625,6 +2639,17 @@
|
||||
}
|
||||
};
|
||||
|
||||
const cardContentNode = function (card) {
|
||||
return card ? card.querySelector(".compose-ai-content") : null;
|
||||
};
|
||||
|
||||
const setCardMessage = function (card, message) {
|
||||
const node = cardContentNode(card);
|
||||
if (node) {
|
||||
node.textContent = String(message || "");
|
||||
}
|
||||
};
|
||||
|
||||
const openEngage = function (sourceRef) {
|
||||
const engageCard = showCard("engage");
|
||||
if (!engageCard) {
|
||||
@@ -2644,19 +2669,19 @@
|
||||
}
|
||||
setCardLoading(card, true);
|
||||
try {
|
||||
const response = await fetch(thread.dataset.draftsUrl + "?" + queryParams().toString(), {
|
||||
method: "GET",
|
||||
credentials: "same-origin",
|
||||
headers: { Accept: "application/json" }
|
||||
});
|
||||
const payload = await response.json();
|
||||
const payload = await getJson(
|
||||
thread.dataset.draftsUrl + "?" + queryParams().toString()
|
||||
);
|
||||
setCardLoading(card, false);
|
||||
if (!payload.ok) {
|
||||
card.querySelector(".compose-ai-content").textContent = payload.error || "Failed to load drafts.";
|
||||
setCardMessage(card, payload.error || "Failed to load drafts.");
|
||||
return;
|
||||
}
|
||||
const drafts = Array.isArray(payload.drafts) ? payload.drafts : [];
|
||||
const container = card.querySelector(".compose-ai-content");
|
||||
const container = cardContentNode(card);
|
||||
if (!container) {
|
||||
return;
|
||||
}
|
||||
container.innerHTML = "";
|
||||
const engageButton = document.createElement("button");
|
||||
engageButton.type = "button";
|
||||
@@ -2695,7 +2720,7 @@
|
||||
});
|
||||
} catch (err) {
|
||||
setCardLoading(card, false);
|
||||
card.querySelector(".compose-ai-content").textContent = "Failed to load drafts.";
|
||||
setCardMessage(card, "Failed to load drafts.");
|
||||
}
|
||||
};
|
||||
|
||||
@@ -2706,21 +2731,18 @@
|
||||
}
|
||||
setCardLoading(card, true);
|
||||
try {
|
||||
const response = await fetch(thread.dataset.summaryUrl + "?" + queryParams().toString(), {
|
||||
method: "GET",
|
||||
credentials: "same-origin",
|
||||
headers: { Accept: "application/json" }
|
||||
});
|
||||
const payload = await response.json();
|
||||
const payload = await getJson(
|
||||
thread.dataset.summaryUrl + "?" + queryParams().toString()
|
||||
);
|
||||
setCardLoading(card, false);
|
||||
if (!payload.ok) {
|
||||
card.querySelector(".compose-ai-content").textContent = payload.error || "Failed to load summary.";
|
||||
setCardMessage(card, payload.error || "Failed to load summary.");
|
||||
return;
|
||||
}
|
||||
card.querySelector(".compose-ai-content").textContent = String(payload.summary || "");
|
||||
setCardMessage(card, String(payload.summary || ""));
|
||||
} catch (err) {
|
||||
setCardLoading(card, false);
|
||||
card.querySelector(".compose-ai-content").textContent = "Failed to load summary.";
|
||||
setCardMessage(card, "Failed to load summary.");
|
||||
}
|
||||
};
|
||||
|
||||
@@ -2731,17 +2753,14 @@
|
||||
}
|
||||
setCardLoading(card, true);
|
||||
try {
|
||||
const response = await fetch(
|
||||
thread.dataset.quickInsightsUrl + "?" + queryParams().toString(),
|
||||
{
|
||||
method: "GET",
|
||||
credentials: "same-origin",
|
||||
headers: { Accept: "application/json" }
|
||||
}
|
||||
const payload = await getJson(
|
||||
thread.dataset.quickInsightsUrl + "?" + queryParams().toString()
|
||||
);
|
||||
const payload = await response.json();
|
||||
setCardLoading(card, false);
|
||||
const container = card.querySelector(".compose-ai-content");
|
||||
const container = cardContentNode(card);
|
||||
if (!container) {
|
||||
return;
|
||||
}
|
||||
if (!payload.ok) {
|
||||
container.textContent = payload.error || "Failed to load quick insights.";
|
||||
return;
|
||||
@@ -2994,8 +3013,7 @@
|
||||
}
|
||||
} catch (err) {
|
||||
setCardLoading(card, false);
|
||||
card.querySelector(".compose-ai-content").textContent =
|
||||
"Failed to load quick insights.";
|
||||
setCardMessage(card, "Failed to load quick insights.");
|
||||
}
|
||||
};
|
||||
|
||||
@@ -3035,18 +3053,12 @@
|
||||
if (showCustom && customValue) {
|
||||
params.set("custom_text", customValue);
|
||||
}
|
||||
const response = await fetch(
|
||||
thread.dataset.engagePreviewUrl + "?" + params.toString(),
|
||||
{
|
||||
method: "GET",
|
||||
credentials: "same-origin",
|
||||
headers: { Accept: "application/json" }
|
||||
}
|
||||
const payload = await getJson(
|
||||
thread.dataset.engagePreviewUrl + "?" + params.toString()
|
||||
);
|
||||
const payload = await response.json();
|
||||
setCardLoading(card, false);
|
||||
if (!payload.ok) {
|
||||
card.querySelector(".compose-ai-content").textContent = payload.error || "Failed to load engage preview.";
|
||||
setCardMessage(card, payload.error || "Failed to load engage preview.");
|
||||
panelState.engageToken = "";
|
||||
return;
|
||||
}
|
||||
@@ -3081,11 +3093,11 @@
|
||||
if (payload.artifact) {
|
||||
text = text + "\n\nSource: " + String(payload.artifact);
|
||||
}
|
||||
card.querySelector(".compose-ai-content").textContent = text;
|
||||
setCardMessage(card, text);
|
||||
sendBtn.disabled = !(confirm.checked && panelState.engageToken);
|
||||
} catch (err) {
|
||||
setCardLoading(card, false);
|
||||
card.querySelector(".compose-ai-content").textContent = "Failed to load engage preview.";
|
||||
setCardMessage(card, "Failed to load engage preview.");
|
||||
panelState.engageToken = "";
|
||||
} finally {
|
||||
if (refreshBtn) {
|
||||
@@ -3141,27 +3153,13 @@
|
||||
if (!panelState.engageToken) {
|
||||
return;
|
||||
}
|
||||
const formData = new URLSearchParams();
|
||||
formData.set("service", thread.dataset.service || "");
|
||||
formData.set("identifier", thread.dataset.identifier || "");
|
||||
if (thread.dataset.person) {
|
||||
formData.set("person", thread.dataset.person);
|
||||
}
|
||||
formData.set("engage_token", panelState.engageToken);
|
||||
formData.set("failsafe_arm", confirm.checked ? "1" : "0");
|
||||
formData.set("failsafe_confirm", confirm.checked ? "1" : "0");
|
||||
const formData = queryParams({
|
||||
engage_token: panelState.engageToken,
|
||||
failsafe_arm: confirm.checked ? "1" : "0",
|
||||
failsafe_confirm: confirm.checked ? "1" : "0",
|
||||
});
|
||||
try {
|
||||
const response = await fetch(thread.dataset.engageSendUrl, {
|
||||
method: "POST",
|
||||
credentials: "same-origin",
|
||||
headers: {
|
||||
"X-CSRFToken": csrfToken,
|
||||
"Content-Type": "application/x-www-form-urlencoded",
|
||||
Accept: "application/json"
|
||||
},
|
||||
body: formData.toString()
|
||||
});
|
||||
const payload = await response.json();
|
||||
const payload = await postFormJson(thread.dataset.engageSendUrl, formData);
|
||||
if (!payload.ok) {
|
||||
flashCompose("is-send-fail");
|
||||
setStatus(payload.error || "Engage send failed.", "danger");
|
||||
@@ -3352,28 +3350,26 @@
|
||||
|
||||
// Cancel send support: show a cancel button while the form request is pending.
|
||||
let cancelBtn = null;
|
||||
const cancelSendRequest = function (commandId) {
|
||||
return postFormJson(
|
||||
'{% url "compose_cancel_send" %}',
|
||||
queryParams({ command_id: String(commandId || "") })
|
||||
);
|
||||
};
|
||||
const showCancelButton = function () {
|
||||
if (cancelBtn) return;
|
||||
cancelBtn = document.createElement('button');
|
||||
cancelBtn.type = 'button';
|
||||
cancelBtn.className = 'button is-danger is-light is-small compose-cancel-send-btn';
|
||||
cancelBtn.textContent = 'Cancel Send';
|
||||
cancelBtn.addEventListener('click', function () {
|
||||
// Post cancel by service+identifier
|
||||
const payload = new URLSearchParams();
|
||||
payload.set('service', thread.dataset.service || '');
|
||||
payload.set('identifier', thread.dataset.identifier || '');
|
||||
fetch('{% url "compose_cancel_send" %}', {
|
||||
method: 'POST',
|
||||
credentials: 'same-origin',
|
||||
headers: { 'X-CSRFToken': '{{ csrf_token }}', 'Content-Type': 'application/x-www-form-urlencoded' },
|
||||
body: payload.toString(),
|
||||
}).then(function (resp) {
|
||||
// Hide cancel once requested
|
||||
cancelBtn.addEventListener('click', async function () {
|
||||
try {
|
||||
await cancelSendRequest("");
|
||||
} catch (e) {
|
||||
// Ignore cancel failures.
|
||||
} finally {
|
||||
hideCancelButton();
|
||||
}).catch(function () {
|
||||
hideCancelButton();
|
||||
});
|
||||
}
|
||||
});
|
||||
if (statusBox) {
|
||||
statusBox.appendChild(cancelBtn);
|
||||
@@ -3498,24 +3494,16 @@
|
||||
btn.type = 'button';
|
||||
btn.className = 'button is-danger is-light is-small compose-persistent-cancel-btn';
|
||||
btn.textContent = 'Cancel Queued Send';
|
||||
btn.addEventListener('click', function () {
|
||||
const payload = new URLSearchParams();
|
||||
payload.set('service', thread.dataset.service || '');
|
||||
payload.set('identifier', thread.dataset.identifier || '');
|
||||
payload.set('command_id', String(commandId || ''));
|
||||
fetch('{% url "compose_cancel_send" %}', {
|
||||
method: 'POST',
|
||||
credentials: 'same-origin',
|
||||
headers: { 'X-CSRFToken': '{{ csrf_token }}', 'Content-Type': 'application/x-www-form-urlencoded' },
|
||||
body: payload.toString(),
|
||||
}).then(function (resp) {
|
||||
btn.addEventListener('click', async function () {
|
||||
try {
|
||||
await cancelSendRequest(String(commandId || ''));
|
||||
stopPendingCommandPolling();
|
||||
hidePersistentCancelButton();
|
||||
setStatus('Send cancelled.', 'warning');
|
||||
poll(true);
|
||||
}).catch(function () {
|
||||
await poll(true);
|
||||
} catch (e) {
|
||||
hidePersistentCancelButton();
|
||||
});
|
||||
}
|
||||
});
|
||||
container.appendChild(btn);
|
||||
if (statusBox) {
|
||||
|
||||
Reference in New Issue
Block a user