Refactor to reduce lines

This commit is contained in:
2026-02-18 00:27:59 +00:00
parent a59a0b0329
commit 521692c458
6 changed files with 596 additions and 816 deletions

View File

@@ -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) {