xStore.contacts
Tin nhắn hỗ trợ của khách. Mỗi tin nhắn là MỘT lần gửi, không phải hội thoại.
Phương thức
| Phương thức | Cú pháp | Mô tả | Từ phiên bản |
|---|---|---|---|
create |
xStore.contacts.create({ title, body, attachments? }): Promise<ContactListItem> |
Gửi tin nhắn hỗ trợ với tư cách khách đã đăng nhập. Từ 1.1 dùng title thay cho subject. |
1.0 |
createAsGuest |
xStore.contacts.createAsGuest({ guest_name, guest_phone?, guest_email?, title, body, attachments? }): Promise<ContactListItem> |
Gửi tin nhắn mà không cần đăng nhập. Bắt buộc họ tên và ít nhất một trong hai: số điện thoại hoặc email. | 1.1 |
list |
xStore.contacts.list({ cursor, limit }) hoặc xStore.contacts.list(cursor?, limit = 20): Promise<CursorPage<ContactListItem>> |
Danh sách tin nhắn đã gửi. | 1.0 |
get |
xStore.contacts.get(contactId): Promise<ContactDetail> |
Chi tiết một tin nhắn kèm tệp đính kèm. Từ 1.1 không còn mảng messages. |
1.0 |
Ví dụ đầy đủ
<script>
// Khách vãng lai — không cần đăng nhập. Bắt buộc có họ tên, tiêu đề,
// nội dung, và ÍT NHẤT MỘT trong hai: số điện thoại hoặc email.
document.getElementById('contact-form').addEventListener('submit', async (e) => {
e.preventDefault();
const form = e.currentTarget;
const btn = form.querySelector('button[type="submit"]');
const status = form.querySelector('.status');
btn.disabled = true;
status.textContent = 'Đang gửi…';
try {
const contact = await xStore.contacts.createAsGuest({
guest_name: form.guest_name.value,
guest_phone: form.guest_phone.value,
title: form.title.value,
body: form.body.value,
});
form.reset();
status.textContent = 'Đã gửi. Mã tin nhắn: ' + contact.id;
} catch (err) {
status.textContent = 'Gửi không thành công: ' + err.message;
} finally {
btn.disabled = false;
}
});
// Khách đã đăng nhập — danh tính lấy từ phiên, không cần guest_*.
async function sendAsCustomer(title, body) {
const contact = await xStore.contacts.create({ title, body });
return contact.id;
}
// Khách xem lại tin nhắn đã gửi. KHÔNG có trả lời: một liên hệ là một
// tin nhắn. Tính năng hội thoại thuộc về module ticket trong tương lai.
async function showContact(contactId) {
const detail = await xStore.contacts.get(contactId);
document.getElementById('contact-body').textContent = detail.body;
}
</script>
Thư viện gọi tới /api/... trên chính tên miền cửa hàng, nên không cần khai báo địa chỉ máy chủ ở bất kỳ đâu.
Xem thêm Sự kiện để giao diện tự cập nhật sau mỗi thao tác.