← back to NationalPaperHangers

views/public/booking.ejs

59 lines

<%- include('../partials/head', { title }) %>
<%- include('../partials/header') %>

<section class="booking-confirmation">
  <header>
    <p class="kicker">Booking · <%= booking.business_name %></p>
    <h1 class="display-sm">
      <% if (booking.status === 'confirmed') { %>You're confirmed.<% } else if (booking.status === 'pending') { %>Booking received.<% } else if (booking.status === 'canceled' || booking.status === 'declined') { %>Booking canceled.<% } else if (booking.status === 'completed') { %>Project complete.<% } else { %>Your booking<% } %>
    </h1>
  </header>

  <div class="booking-card">
    <dl>
      <dt>Studio</dt>
      <dd><a href="/installer/<%= booking.installer_slug %>"><%= booking.business_name %></a><% if (booking.installer_phone) { %> · <%= booking.installer_phone %><% } %></dd>
      <dt>When</dt>
      <dd><%= new Date(booking.scheduled_start).toLocaleString('en-US', { weekday: 'long', month: 'long', day: 'numeric', hour: 'numeric', minute: '2-digit' }) %></dd>
      <dt>Type</dt>
      <dd><%= (booking.project_type || 'consultation').replace(/_/g,' ') %></dd>
      <dt>Status</dt>
      <dd><span class="status-badge status-<%= booking.status %>"><%= booking.status %></span></dd>
      <% if (booking.address_line1) { %>
        <dt>Address</dt>
        <dd><%= [booking.address_line1, booking.city, booking.state, booking.zip].filter(Boolean).join(', ') %></dd>
      <% } %>
      <% if (booking.customer_notes) { %>
        <dt>Notes</dt>
        <dd><%= booking.customer_notes %></dd>
      <% } %>
    </dl>
  </div>

  <p>Need to reschedule or cancel? Reply to your confirmation email or write to <a href="mailto:info@nationalpaperhangers.com">info@nationalpaperhangers.com</a>.</p>
</section>

<%- include('../partials/footer') %>
<% if (booking.status === 'confirmed') { %>
<%
  // Script-context values must be JSON-serialised, not HTML-escaped: inside a
  // script block HTML entities are not decoded, so the old escaped-output tag
  // left raw apostrophes mangled and a newline / trailing backslash in
  // business_name produced a JS SyntaxError that broke the whole inline
  // script. JSON.stringify yields a valid JS string literal; the angle-bracket
  // escape neutralises a literal closing script tag.
  function jsLit(v) {
    return JSON.stringify(String(v == null ? '' : v))
      .replace(/</g, '\\u003c').replace(/\u2028/g, '\\u2028').replace(/\u2029/g, '\\u2029');
  }
%>
<script>
  // GA4 conversion: booking_confirmed
  gtag('event', 'booking_confirmed', {
    booking_uuid: <%- jsLit(booking.uuid) %>,
    installer_slug: <%- jsLit(booking.installer_slug) %>,
    installer_name: <%- jsLit(booking.business_name) %>
  });
</script>
<% } %>