Subscriptions: ...

Loading subscriptions...

// Use ISO date for start date calculation const expiryDate = sub.dateTo ? new Date(sub.dateTo) : null; const startDate = expiryDate ? new Date(expiryDate) : new Date(); startDate.setDate(startDate.getDate() + 1); document.getElementById('renew-start-date').innerText = startDate.toLocaleDateString('en-GB'); const sitePackages = allAvailablePackages.filter(p => p.siteName === sub.site); const listEl = document.getElementById('renew-package-list'); listEl.innerHTML = ''; if (sitePackages.length === 0) { listEl.innerHTML = '

No available packages for renewal.

'; } else { sitePackages.forEach(pkg => { const item = document.createElement('div'); item.className = 'renew-package-item'; item.innerHTML = `
${pkg.packageName} ${pkg.duration} Month(s)
${pkg.price.toLocaleString('en-US')} B
`; item.querySelector('.checkout-btn').onclick = () => selectPackage(pkg, startDate); listEl.appendChild(item); }); } document.getElementById('dialog-overlay').style.display = 'flex'; document.getElementById('confirmation-dialog').style.display = 'none'; document.getElementById('renew-dialog').style.display = 'block'; } function selectPackage(pkg, predefinedStartDate) { currentSelection.pkg = pkg; const startDate = predefinedStartDate; document.getElementById('conf-user').innerText = currentUser.displayName; document.getElementById('conf-site').innerText = currentSelection.siteName; document.getElementById('conf-package').innerText = `${pkg.packageName} (${pkg.duration} Months)`; document.getElementById('conf-start-date').innerText = startDate.toLocaleDateString('en-GB'); const expiryDate = new Date(startDate); expiryDate.setMonth(expiryDate.getMonth() + pkg.duration); document.getElementById('conf-expiry-date').innerText = expiryDate.toLocaleDateString('en-GB'); const price = pkg.price || 0; const adjustment = 0; // Placeholder document.getElementById('conf-price').innerText = `${price.toFixed(2)} THB`; document.getElementById('conf-adjustment').innerText = `${adjustment.toFixed(2)} THB`; document.getElementById('conf-total').innerText = `${(price + adjustment).toFixed(2)} THB`; document.getElementById('renew-dialog').style.display = 'none'; document.getElementById('confirmation-dialog').style.display = 'block'; } function subscribe() { console.log("Subscribing with data:", currentSelection); alert('Subscription confirmed!'); closeDialogs(); } function renderSubscriptions(subscriptions) { const listEl = document.getElementById('subscription-list'); listEl.innerHTML = ''; if (!subscriptions || subscriptions.length === 0) { listEl.innerHTML = '

No active subscriptions found.

'; return; } const today = new Date(); today.setHours(0, 0, 0, 0); // Helper to convert ISO string to DD/MM/YYYY in Asia/Bangkok timezone function isoToBangkokDateStr(isoStr) { if (!isoStr) return ''; const date = new Date(isoStr); // Convert to Bangkok time (UTC+7) const bangkokOffset = 7 * 60; const localOffset = date.getTimezoneOffset(); const bangkokDate = new Date(date.getTime() + (bangkokOffset + localOffset) * 60000); const day = String(bangkokDate.getDate()).padStart(2, '0'); const month = String(bangkokDate.getMonth() + 1).padStart(2, '0'); const year = bangkokDate.getFullYear(); return `${day}/${month}/${year}`; } subscriptions.forEach(sub => { const dateToStr = isoToBangkokDateStr(sub.dateTo); const dateFromStr = isoToBangkokDateStr(sub.dateFrom); // For expiry calculation, use the original ISO string const expiryDate = sub.dateTo ? new Date(sub.dateTo) : null; let remainingDaysText = ''; if (expiryDate) { const diff = expiryDate.setHours(0,0,0,0) - today.getTime(); const remainingDays = Math.ceil(diff / (1000 * 60 * 60 * 24)); remainingDaysText = remainingDays >= 0 ? `(${remainingDays}D)` : '(Expired)'; } const item = document.createElement('div'); item.className = 'list-item'; item.innerHTML = `

${sub.site}: ${sub.package}

Exp: ${dateToStr} ${remainingDaysText}

`; item.querySelector('.renew-btn').onclick = () => openRenewDialog(sub); listEl.appendChild(item); }); } const main = async () => { await liff.init({ liffId: "2007831374-B91rgk5N" }); if (!liff.isLoggedIn()) { liff.login(); return; } const profile = await liff.getProfile(); currentUser = profile; document.getElementById('profileName').innerText = profile.displayName; const userInfoResponse = await fetch(`/getuserinfo/${profile.userId}/${profile.displayName}`); const userInfo = await userInfoResponse.json(); if (userInfo.res === 'not found') { window.location.href = `/unregistered?lineid=${profile.userId}&linename=${profile.displayName}`; return; } document.getElementById('new-package-link').href = `/packagelist?lineid=${profile.userId}&locoid=${userInfo.loco_id}`; try { // Use Promise.all to wait for all data to be fetched before rendering const [packagesResponse, subscriptionsResponse] = await Promise.all([ fetch('/getavailablepackages'), fetch(`/getsubscription/${profile.userId}`) ]); if (!packagesResponse.ok) { throw new Error(`Failed to fetch available packages: ${packagesResponse.statusText}`); } if (!subscriptionsResponse.ok) { throw new Error(`Failed to fetch subscriptions: ${subscriptionsResponse.statusText}`); } allAvailablePackages = await packagesResponse.json(); const subscriptions = await subscriptionsResponse.json(); renderSubscriptions(subscriptions); } catch (error) { console.error('Error fetching page data:', error); document.getElementById('subscription-list').innerHTML = '

Error loading subscriptions.

'; } }; main(); main();