"use client"; import { useState } from "react"; type Customer = { id: string; customer_name: string; customer_email: string | null; customer_phone: string | null; pickup_complete: boolean; }; type StopMessagingFormProps = { stopId: string; }; const quickMessages = [ { label: "Truck running late", value: "Heads up — the truck is running about 15 minutes behind schedule. Thanks for your patience!" }, { label: "Stop moved", value: "Attention — today's stop location has changed to a new address. Please check the updated details." }, { label: "Weather delay", value: "Due to weather conditions, today's stop may be delayed. We'll send updates as the day progresses." }, { label: "Sold out", value: "This stop has sold out of several items. Check our website or next stop for availability." }, { label: "Preorder cutoff reminder", value: "Friendly reminder — the preorder cutoff for our next stop is tonight at midnight. Order online to guarantee your pickup!" }, { label: "Pickup reminder", value: "Reminder — you have an order ready for pickup today. See you soon!" }, ]; export default function StopMessagingForm({ stopId }: StopMessagingFormProps) { const [customers, setCustomers] = useState([]); const [loaded, setLoaded] = useState(false); const [loading, setLoading] = useState(false); const [channel, setChannel] = useState<"sms" | "email" | "both">("sms"); const [message, setMessage] = useState(""); const [customMessage, setCustomMessage] = useState(""); const [sending, setSending] = useState(false); const [sent, setSent] = useState(0); const [error, setError] = useState(null); async function loadCustomers() { setLoading(true); setError(null); const res = await fetch( `${process.env.NEXT_PUBLIC_SUPABASE_URL}/rest/v1/orders?stop_id=eq.${stopId}&pickup_complete=eq.false&pickup_complete=eq.false&select=customer_name,customer_email,customer_phone,pickup_complete`, { headers: { apikey: process.env.NEXT_PUBLIC_SUPABASE_ANON_KEY!, }, } ); const data = await res.json(); if (!res.ok) { setError(data.message); } else { setCustomers(data); setLoaded(true); } setLoading(false); } function useQuickMessage(msg: string) { setMessage(msg); setCustomMessage(msg); } async function handleSend() { if (!message.trim()) return; setSending(true); setError(null); const recipients = customers.filter((c) => { if (channel === "sms") return c.customer_phone; if (channel === "email") return c.customer_email; return c.customer_phone || c.customer_email; }); // Call Supabase Edge Function to send messages const res = await fetch( `${process.env.NEXT_PUBLIC_SUPABASE_URL}/functions/v1/send-messages`, { method: "POST", headers: { apikey: process.env.NEXT_PUBLIC_SUPABASE_ANON_KEY!, "Content-Type": "application/json", }, body: JSON.stringify({ channel, message, recipients: recipients.map((r) => ({ phone: r.customer_phone, email: r.customer_email, name: r.customer_name, })), }), } ); if (!res.ok) { const err = await res.json(); setError(err.message ?? "Failed to send messages"); setSending(false); return; } setSent(recipients.length); setSending(false); } const recipients = customers.filter((c) => { if (channel === "sms") return c.customer_phone; if (channel === "email") return c.customer_email; return c.customer_phone || c.customer_email; }); return (

Send Message

Notify all customers with pending pickups at this stop.

{!loaded ? ( ) : ( <> {customers.length === 0 ? (
No pending orders for this stop yet.
) : (
{customers.length} pending order{customers.length !== 1 ? "s" : ""} found {recipients.length !== customers.length && ( — {recipients.length} with contact info )}
)} {/* Channel */}
{(["sms", "email", "both"] as const).map((ch) => ( ))}
{/* Quick messages */}
{quickMessages.map((qm) => ( ))}
{/* Message preview */}