e1256503be
Notification bell:
- Bell now polls /InAppNotifications/Recent every 60s as a SignalR fallback
- Bell dropdown refresh on open so count is always current when staff looks at it
SMS consent → kiosk flow:
- Staff clicks "Get SMS Consent" on Customer Details → AJAX POST to
/Kiosk/PushSmsConsent stores customer in IMemoryCache (10 min TTL)
- Kiosk PollSession returns smsConsentPending + customerId so tablet navigates
to /Kiosk/SmsConsent/{customerId} automatically
- Customer reads TCPA consent on tablet, taps I Agree or No Thanks
- On agree: NotifyBySms/SmsConsentedAt/SmsConsentMethod set; in-app notification
fires; cache cleared; tablet returns to Welcome
- Removed Customers/SmsConsent (staff-browser version); moved view to Kiosk/
Button alignment:
- kiosk.css: added display:flex + align-items:center + justify-content:center to
all kiosk body buttons so content is centred vertically in tall button outlines
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
54 lines
2.3 KiB
Plaintext
54 lines
2.3 KiB
Plaintext
@model int
|
|
@{
|
|
Layout = "~/Views/Shared/_KioskLayout.cshtml";
|
|
ViewData["Title"] = "SMS Consent";
|
|
string customerName = ViewBag.CustomerName as string ?? "Customer";
|
|
}
|
|
|
|
<div class="kiosk-card">
|
|
<h2 class="fw-bold mb-1" style="font-size:1.6rem;">SMS Notifications</h2>
|
|
<p class="text-muted mb-4">Please read the following and tap <strong>I Agree</strong> to opt in.</p>
|
|
|
|
<form method="post" action="/Kiosk/SmsConsent/@Model">
|
|
@Html.AntiForgeryToken()
|
|
<input type="hidden" name="agreed" value="true" />
|
|
|
|
<div class="kiosk-terms-scroll mb-4">
|
|
<strong>SMS Consent & Opt-In</strong>
|
|
<p class="mt-2">
|
|
By tapping <em>I Agree</em> below, <strong>@customerName</strong> consents to receive
|
|
SMS text messages from @(ViewBag.CompanyName ?? "this shop") regarding order status
|
|
updates, pickup notifications, and other information related to your powder coating
|
|
services.
|
|
</p>
|
|
<p>
|
|
Message frequency varies. Message and data rates may apply.
|
|
You may opt out at any time by replying <strong>STOP</strong> to any message.
|
|
Reply <strong>HELP</strong> for assistance.
|
|
</p>
|
|
<p class="mb-0">
|
|
Your mobile number will not be shared with third parties or used for marketing
|
|
unrelated to your orders.
|
|
</p>
|
|
</div>
|
|
|
|
<div class="d-flex gap-3">
|
|
<a href="/Kiosk/SmsConsent/@Model?agreed=false"
|
|
onclick="event.preventDefault(); document.getElementById('declineForm').submit();"
|
|
class="btn btn-outline-secondary"
|
|
style="min-height:64px;border-radius:12px;font-size:1.1rem;flex:0 0 auto;padding:0 2rem;">
|
|
<i class="bi bi-x-lg me-1"></i> No Thanks
|
|
</a>
|
|
<button type="submit" class="btn btn-success kiosk-btn">
|
|
<i class="bi bi-check-circle me-2"></i> I Agree
|
|
</button>
|
|
</div>
|
|
</form>
|
|
|
|
@* Separate form for decline so "No Thanks" can POST with agreed=false *@
|
|
<form id="declineForm" method="post" action="/Kiosk/SmsConsent/@Model" style="display:none;">
|
|
@Html.AntiForgeryToken()
|
|
<input type="hidden" name="agreed" value="false" />
|
|
</form>
|
|
</div>
|