Allow renaming visitors
This commit is contained in:
+40
-2
@@ -215,6 +215,13 @@ $("#visitorList").addEventListener("click", async (event) => {
|
||||
await openConversation(conversationId);
|
||||
});
|
||||
|
||||
$("#conversationHeader").addEventListener("click", async (event) => {
|
||||
const button = event.target.closest("[data-rename-visitor]");
|
||||
if (!button) return;
|
||||
event.preventDefault();
|
||||
await renameVisitor(button.dataset.renameVisitor);
|
||||
});
|
||||
|
||||
async function showApp() {
|
||||
$("#loginView").classList.add("hidden");
|
||||
$("#appView").classList.remove("hidden");
|
||||
@@ -353,7 +360,7 @@ function syncConversationVisitors() {
|
||||
}
|
||||
|
||||
function conversationVisitorName(item) {
|
||||
return item.visitor?.name || item.visitor?.email || item.visitorLabel || "Navstevnik";
|
||||
return item.visitorAlias || item.visitor?.name || item.visitor?.email || item.visitorLabel || "Navstevnik";
|
||||
}
|
||||
|
||||
function renderVisitors() {
|
||||
@@ -419,7 +426,10 @@ function renderActive() {
|
||||
$("#conversationHeader").innerHTML = `
|
||||
<div class="visitor-head">
|
||||
<div class="visitor-summary-row">
|
||||
<h2>${escapeHtml(conversationVisitorName(conversation))}</h2>
|
||||
<button class="visitor-name-edit" type="button" data-rename-visitor="${escapeHtml(conversation.visitorToken)}" title="Prejmenovat navstevnika">
|
||||
<span>${escapeHtml(conversationVisitorName(conversation))}</span>
|
||||
<svg viewBox="0 0 24 24" aria-hidden="true"><path d="M4 17.5V20h2.5L17.8 8.7l-2.5-2.5L4 17.5Zm15.7-11.1a1 1 0 0 0 0-1.4L18.3 3.6a1 1 0 0 0-1.4 0l-1 1 2.5 2.5 1.3-.7Z"></path></svg>
|
||||
</button>
|
||||
${presenceDot(conversation.visitorPresence)}
|
||||
<span title="Zeme">${visitorCountry(conversation)}</span>
|
||||
<span title="Doba na webu">${formatDuration(conversation.sessionSeconds)}</span>
|
||||
@@ -440,6 +450,34 @@ function renderActive() {
|
||||
$("#messages").scrollTop = $("#messages").scrollHeight;
|
||||
}
|
||||
|
||||
async function renameVisitor(visitorToken) {
|
||||
if (!state.active?.conversation || !visitorToken) return;
|
||||
const currentName = conversationVisitorName(state.active.conversation);
|
||||
const nextName = window.prompt("Prejmenovat navstevnika", state.active.conversation.visitorAlias || currentName);
|
||||
if (nextName === null) return;
|
||||
const result = await api(`/api/admin/visitors/${encodeURIComponent(visitorToken)}`, {
|
||||
method: "PATCH",
|
||||
body: { displayName: nextName }
|
||||
});
|
||||
applyVisitorRename(visitorToken, result.label, result.displayName);
|
||||
}
|
||||
|
||||
function applyVisitorRename(visitorToken, label, alias) {
|
||||
const update = (item) => item.visitorToken === visitorToken
|
||||
? { ...item, visitorLabel: label, visitorAlias: alias || "" }
|
||||
: item;
|
||||
state.conversations = state.conversations.map(update);
|
||||
state.visitors = state.visitors.map((visitor) => visitor.id === visitorToken
|
||||
? { ...visitor, label, visitorAlias: alias || "" }
|
||||
: visitor);
|
||||
if (state.active?.conversation?.visitorToken === visitorToken) {
|
||||
state.active.conversation = update(state.active.conversation);
|
||||
}
|
||||
renderConversations();
|
||||
renderVisitors();
|
||||
if (state.active) renderActive();
|
||||
}
|
||||
|
||||
function adminReadReceipt(conversation, messages) {
|
||||
const lastAdminMessage = [...messages].reverse().find((message) => message.senderType === "admin");
|
||||
if (!lastAdminMessage) return "";
|
||||
|
||||
Reference in New Issue
Block a user