diff --git a/src/components/orders/SmsStatusCard.jsx b/src/components/orders/SmsStatusCard.jsx index 1b84acc..3c99f74 100644 --- a/src/components/orders/SmsStatusCard.jsx +++ b/src/components/orders/SmsStatusCard.jsx @@ -66,6 +66,38 @@ const fmtCountdown = (targetTs) => { return `${m}м ${s}с`; }; +// ── SMS log entry (expandable to show text) ────────────────────────────────── +const SmsLogEntry = ({ log }) => { + const [expanded, setExpanded] = useState(false); + const hasText = !!log.sms_text; + return ( +
+
setExpanded(e => !e) : undefined} + > + {fmtTime(log.created_at)} + + {log.status === "delivered" ? "доставлено" : log.status === "sent" ? "отправлено" : log.status === "checking" ? "проверка" : log.status === "expired" ? "истёк" : log.status} + + {log.campaign_type && ( + + {log.campaign_type === "first_sms" ? "1-е SMS" : log.campaign_type === "second_sms" ? "2-е SMS" : log.campaign_type === "manual" ? "ручное" : log.campaign_type === "paid_storage" ? "платное хранение" : log.campaign_type} + + )} + {hasText && ( + {expanded ? "▲" : "▼"} + )} +
+ {hasText && expanded && ( +
+ {log.sms_text} +
+ )} +
+ ); +}; + // ── Component ──────────────────────────────────────────────────────────────── export const SmsStatusCard = ({ order, userRole }) => { const [restarting, setRestarting] = useState(false); @@ -170,10 +202,14 @@ export const SmsStatusCard = ({ order, userRole }) => { }; const countdown = nextCheck ? fmtCountdown(nextCheck) : null; - // Determine SMS display state - const hasSmsSent = !!smsSentAt; // SMS physically sent (may not be delivered yet) - const hasFirstSms = !!firstSmsAt; // First SMS confirmed delivered (103) - const hasSecondSms = !!secondSmsAt; // Second SMS confirmed delivered (103) + // Determine SMS display state from sms_log (source of truth) + const firstSmsLog = smsLog.find(l => l.campaign_type === "first_sms"); + const secondSmsLog = smsLog.find(l => l.campaign_type === "second_sms"); + const isDelivered = (log) => log && (log.status === "delivered" || log.sms_code === "103"); + const hasFirstSms = isDelivered(firstSmsLog); + const hasSecondSms = isDelivered(secondSmsLog); + const firstSmsFailed = firstSmsLog && ["expired", "error", "send_failed", "limit_exceeded"].includes(firstSmsLog.status); + const secondSmsFailed = secondSmsLog && ["expired", "error", "send_failed", "limit_exceeded"].includes(secondSmsLog.status); return ( @@ -185,13 +221,15 @@ export const SmsStatusCard = ({ order, userRole }) => {
{/* 1st SMS */}
- +
1-е SMS
{hasFirstSms ? ( -
{fmtTime(firstSmsAt)} ✓ получено клиентом
- ) : hasSmsSent && notifStatus === "sms_sending" ? ( -
{fmtTime(smsSentAt)} · отправлено, ждём ответ оператора…
+
{fmtTime(firstSmsLog.created_at)} ✓ получено клиентом
+ ) : firstSmsFailed ? ( +
{fmtTime(firstSmsLog.created_at)} ⚠ {firstSmsLog.status === "expired" ? "срок доставки истёк" : firstSmsLog.status}
+ ) : firstSmsAt ? ( +
{fmtTime(firstSmsAt)} · отправлено, ждём ответ оператора…
) : notifStatus === "link_ready" ? (
в очереди на отправку
) : ( @@ -202,11 +240,13 @@ export const SmsStatusCard = ({ order, userRole }) => { {/* 2nd SMS */}
- +
2-е SMS
{hasSecondSms ? ( -
{fmtTime(secondSmsAt)} ✓ получено клиентом
+
{fmtTime(secondSmsLog.created_at)} ✓ получено клиентом
+ ) : secondSmsFailed ? ( +
{fmtTime(secondSmsLog.created_at)} ⚠ {secondSmsLog.status === "expired" ? "срок доставки истёк" : secondSmsLog.status}
) : notifStatus === "first_sms_sent" && countdown ? (
отправка через {countdown} @@ -244,18 +284,7 @@ export const SmsStatusCard = ({ order, userRole }) => {
История SMS
{smsLog.map((log) => ( -
- {fmtTime(log.created_at)} - - {log.status === "delivered" ? "доставлено" : log.status === "sent" ? "отправлено" : log.status === "checking" ? "проверка" : log.status === "expired" ? "истёк" : log.status} - - {log.sent_to && ( - → {log.sent_to} - )} - {log.sms_code && ( - код: {log.sms_code} - )} -
+ ))}