chatapp-h5/h5/invite-bd/invite.js
2026-04-24 21:13:53 +08:00

119 lines
3.6 KiB
JavaScript

import { applyLang, avatarError, bindHeader, connectToApp, get, post, t, toast } from "../bd-static/shared.js";
const config = {
title: "invite_become_BD",
list: "/team/bd/invite-bd-message-own",
invite: "/team/bd/invite-bd",
cancel: (id) => `/team/bd/invite-bd-cancel/${id}`
};
let invited = [];
let searchResult = [];
let selected = null;
bindHeader(config.title);
applyLang();
const input = document.getElementById("searchInput");
input.placeholder = t("enter_user_id");
input.addEventListener("input", () => {
selected = null;
render();
});
input.addEventListener("keyup", (event) => {
if (event.key === "Enter") search();
});
document.getElementById("inviteButton").addEventListener("click", invite);
connectToApp().then(loadInvited);
async function loadInvited() {
try {
const response = await get(config.list);
invited = response.body || [];
render();
} catch (error) {
toast(error.response?.errorMsg || error.message);
}
}
async function search() {
const account = input.value.trim();
selected = null;
searchResult = [];
if (!account) {
await loadInvited();
return;
}
try {
const response = await get(`/user/user-profile/open-search?account=${encodeURIComponent(account)}`);
if (response.status && response.body) searchResult = [{ userProfile: response.body }];
} catch (error) {
toast(error.response?.errorMsg || error.message);
}
render();
}
function render() {
const list = document.getElementById("list");
const data = input.value.trim() ? searchResult : invited;
list.innerHTML = "";
document.getElementById("empty").hidden = data.length > 0;
data.forEach((item) => {
const user = item.userProfile || {};
const card = document.createElement("article");
card.className = "member-card";
card.innerHTML = `
<img class="avatar" src="${user.userAvatar || ""}" alt="">
<div class="member-main">
<div class="member-name">${user.userNickname || "-"}</div>
<div class="member-meta">${t("user_id_prefix")}${user.account || "-"}</div>
</div>
<div class="member-side"></div>
`;
card.addEventListener("click", () => {
if (!input.value.trim() || item.status === 0 || item.status === 1) return;
selected = selected?.id === user.id ? null : user;
render();
});
const side = card.querySelector(".member-side");
if (item.status === 0) {
side.innerHTML = `<div class="badge pending">${t("pending")}</div><button class="danger-btn" type="button">${t("cancel")}</button>`;
side.querySelector("button").addEventListener("click", (event) => {
event.stopPropagation();
cancelInvite(item.id);
});
} else if (item.status === 1) {
side.innerHTML = `<span class="badge success">${t("success")}</span>`;
} else if (selected?.id === user.id) {
side.innerHTML = `<span class="badge success">✓</span>`;
}
avatarError(card.querySelector("img"));
list.appendChild(card);
});
document.getElementById("inviteButton").disabled = !selected;
}
async function invite() {
if (!selected) return;
try {
await post(config.invite, { inviteUserId: selected.id });
toast(t("invitation_submitted"));
input.value = "";
selected = null;
searchResult = [];
await loadInvited();
} catch (error) {
toast(error.response?.errorMsg || t("something_went_wrong"));
}
}
async function cancelInvite(id) {
try {
await post(config.cancel(id));
toast(t("application_cancelled"));
await loadInvited();
} catch (error) {
const msg = error.response?.errorMsg?.replace(/^.*\]\s*/, "") || t("cancellation_failed_try_again");
toast(msg);
}
}