/**
* ระบบจัดการการชำระเงิน
* รับผิดชอบการแสดงหน้าชำระเงิน และการประมวลผลการชำระเงิน
*/
const PaymentManager = {
/**
* เริ่มต้นระบบชำระเงิน
* - ลงทะเบียนเทมเพลต
* - ตั้งค่าตัวรับฟังเหตุการณ์
*/
init() {
this.setupTemplates();
this.setupEventListeners();
},
/**
* ลงทะเบียนเทมเพลตที่ใช้ในระบบชำระเงิน
*/
setupTemplates() {
TemplateManager.registerTemplate('payment-modal-template',
`
`
);
},
/**
* ตั้งค่าตัวรับฟังเหตุการณ์สำหรับการทำงานต่างๆ
*/
setupEventListeners() {
document.addEventListener('click', async (e) => {
const target = e.target;
// จัดการการเลือกวิธีชำระเงิน
if (target.closest('.payment-method')) {
const method = target.closest('.payment-method').dataset.method;
await this.handlePaymentMethodSelection(method);
}
// จัดการการปิดหน้าต่าง
if (target.matches('.modal-close')) {
const modal = target.closest('.modal');
if (modal) {
modal.remove();
}
}
});
},
/**
* แสดงหน้าต่างชำระเงิน
* @param {Object} orderSummary - ข้อมูลสรุปการสั่งซื้อ
*/
showPaymentModal(orderSummary) {
// เก็บ orderId ไว้ใช้ตอนส่งผลการชำระเงิน
this.currentOrderId = orderSummary.orderId;
// แสดงหน้าต่างชำระเงิน
const modal = TemplateManager.showModal('payment-modal-template', {
total: `฿${orderSummary.total.total.toLocaleString()}`
});
if (!modal) return;
// แสดงช่องทางการชำระเงินที่เปิดใช้งาน
const methodsContainer = modal.querySelector('.payment-methods');
methodsContainer.innerHTML = Object.entries(CONFIG.PAYMENT.METHODS)
.filter(([_, method]) => method.enabled)
.map(([key, method]) => (
``
)).join('');
},
/**
* จัดการการเลือกวิธีชำระเงิน
* @param {string} method - รหัสวิธีการชำระเงินที่เลือก
*/
async handlePaymentMethodSelection(method) {
const modal = document.querySelector('#paymentModal');
const methodsContainer = modal.querySelector('.payment-methods');
const statusDiv = modal.querySelector('#paymentStatus');
const statusMessage = statusDiv.querySelector('.status-message');
try {
// ซ่อนตัวเลือกวิธีชำระเงิน
methodsContainer.style.display = 'none';
// แสดงสถานะกำลังดำเนินการ
statusDiv.classList.remove('hidden');
statusMessage.textContent = 'กำลังดำเนินการชำระเงิน...';
// ดำเนินการชำระเงิน
const result = await this.processPayment(method);
if (!result.success) {
// กรณีชำระเงินไม่สำเร็จ
methodsContainer.style.display = 'block';
statusDiv.classList.add('hidden');
NotificationManager.error('การชำระเงินไม่สำเร็จ กรุณาลองใหม่อีกครั้ง');
return;
}
// แสดงผลสำเร็จ
statusMessage.textContent = 'การชำระเงินสำเร็จ';
statusMessage.classList.add('success');
// ส่งผลการชำระเงิน
EventBus.emit('payment:completed', {
orderId: this.currentOrderId,
paymentResult: {
...result,
completedAt: new Date().toISOString()
}
});
// ปิดหน้าต่างและแสดงข้อความขอบคุณ
setTimeout(() => {
modal.remove();
NotificationManager.success('ขอบคุณสำหรับการสั่งซื้อ!');
}, 1500);
} catch (error) {
console.error('เกิดข้อผิดพลาดในการชำระเงิน:', error);
// กรณีเกิดข้อผิดพลาด
methodsContainer.style.display = 'block';
statusMessage.textContent = 'เกิดข้อผิดพลาด กรุณาลองใหม่อีกครั้ง หรือเปลี่ยนช่องทางการชำระเงินอื่น';
statusMessage.classList.add('error');
}
},
/**
* จำลองการประมวลผลการชำระเงิน
* @param {string} method - วิธีการชำระเงินที่เลือก
* @returns {Promise