const apiFetch = async (url, options = {}) => {
const opts = {
headers: { 'Content-Type': 'application/json' },
...options,
};
if (opts.body && typeof opts.body !== 'string') {
opts.body = JSON.stringify(opts.body);
}
const res = await fetch(url, opts);
if (!res.ok) {
throw new Error(`API error: ${res.status}`);
}
return res.json();
};
const showToast = (message, type = 'success') => {
const container = document.querySelector('.toast-container');
if (!container) return;
const toast = document.createElement('div');
toast.className = `toast align-items-center text-bg-${type} border-0 show`;
toast.setAttribute('role', 'alert');
toast.innerHTML = `
${contact.phone}
${contact.last_message || '暂无消息'}
`;
listEl.appendChild(item);
});
};
window.setActive = async (id) => {
activeId = id;
const contact = contacts.find(c => c.id === id);
chatTitle.textContent = contact ? contact.phone : '请选择联系人';
chatMeta.textContent = contact ? "手机号: " + contact.phone : "状态";
renderContacts();
await loadMessages();
};
window.deleteContact = async (id) => {
if (!confirm('确定删除此联系人?')) return;
try {
await apiFetch(`/api/contacts.php?action=delete&id=${id}`, { method: 'POST' });
await loadContacts();
showToast('已删除联系人');
if (activeId === id) {
activeId = null;
chatTitle.textContent = '请选择联系人';
chatMeta.textContent = '状态';
chatBody.innerHTML = '';
}
} catch (e) { showToast('删除失败', 'danger'); }
};
window.blockContact = async (id) => {
if (!confirm('确定拉黑此联系人?')) return;
try {
await apiFetch(`/api/contacts.php?action=block&id=${id}`, { method: 'POST' });
await loadContacts();
showToast('已拉黑联系人');
if (activeId === id) {
activeId = null;
chatTitle.textContent = '请选择联系人';
chatMeta.textContent = '状态';
chatBody.innerHTML = '';
}
} catch (e) { showToast('操作失败', 'danger'); }
};
const loadContacts = async () => {
const data = await apiFetch('/api/contacts.php');
contacts = data.contacts || [];
renderContacts();
};
const loadMessages = async () => {
if (!activeId) return;
const data = await apiFetch(`/api/messages.php?contact_id=${activeId}`);
chatBody.innerHTML = (data.messages || []).map(msg => `