import Head from 'next/head' import {DateTime} from 'luxon' import Link from 'next/link' import styles from './style.module.css' CheckoutComplete.getInitialProps = async function({ctx: {query: {session_id}, axios}}){ const {data: orders} = await axios.get('/api/orders') const mostRecentOrder = orders.sort(sortOrders)[0] return {order: mostRecentOrder} } export default function CheckoutComplete({order}){ const items = order.transactions.map(transaction => transaction.cart.items).flat() const latestTransaction = order.transactions.sort(sortTransactions)[0] const preorderDates = order.transactions.filter(t => t.has_preorder).map(t => DateTime.fromISO(t.preorder_fulfill_date)) preorderDates.sort((b, a) => a < b ? -1 : a > b ? 1 : 0) const latestPreorder = preorderDates[0]?.toLocaleString(DateTime.DATE_FULL) let shippingEstimate = 'Orders typically are shipped within 3-5 business days of purchase.' if (latestPreorder) { shippingEstimate = `Your order will be shipped when all of its items become available (estimated ${latestPreorder.toLocaleString(DateTime.DATE_SHORT)}).` } let email = null const stripePayment = latestTransaction.payments.find(p => p.stripe !== null) if(stripePayment) email = stripePayment.recipient_email return ( <> Order Complete | Society of Socks

Order Complete

The following items:

{items.map(({uuid, count, item}) => ( ))}
{count}x {item.name}

Will be shipped to:

{order.address.name}

{order.address.street1}

{order.address.street2}

{order.address.city}, {order.address.state}, {order.address.zip}

{ email ? ( <>

{shippingEstimate} You will receive an email with a tracking number when your order ships.

Your tracking number will be sent to: {email}

If you do not receive an email {latestPreorder ? 'within a week of the shipping estimate' : 'within 1 week'}, please contact us. In any correspondence please be sure to include your order number (#{order.number}).

) : (

{shippingEstimate}

) } ) } function parsePaymentTime({payments}){ if(payments.length < 1) return null; let lastPaymentTime = DateTime.fromISO(payments[0].time) for(const payment of payments) { const current = DateTime.fromISO(payment.time) if(current.diff(lastPaymentTime).as('seconds') > 0) lastPaymentTime = current; } return lastPaymentTime } function sortTransactions(a,b){ const timeA = parsePaymentTime(a) const timeB = parsePaymentTime(b) return timeB.diff(timeA).as('seconds') } function sortOrders(a,b){ const timePaidA = parsePaymentTime(a.transactions.sort(sortTransactions)[0]) const timePaidB = parsePaymentTime(b.transactions.sort(sortTransactions)[0]) return timePaidB.diff(timePaidA).as('seconds') } function formatMoney(money){ if (money === undefined || money === null) return null; return '$' + (money / 100).toFixed(2) }