119 lines
3.6 KiB
JavaScript
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);
|
|
}
|
|
}
|