/** * @file SmsCityProfilesPanel.jsx * @description Профили SMS по городам. */ import React, { useState, useEffect, useCallback } from "react"; import { Panel } from "../UI/Panel"; import { supabase } from "../../supabaseClient"; import { CRIMEAN_CITIES } from "../../constants/cities.js"; const THEME_STYLES = ` .sms-card { background: #e8f0ec; border: 1px solid #c8d8d2; border-radius: 16px; padding: 16px; } [data-theme="dark"] .sms-card { background: #0d1a16; border: 1px solid rgba(236,245,242,0.12); } .sms-inner { background: #ffffff; border: 1px solid #d0dad6; border-radius: 10px; padding: 12px; } [data-theme="dark"] .sms-inner { background: #142822; border: 1px solid rgba(236,245,242,0.08); } .sms-input { background: #f4f7f5; border: 1px solid #c8d8d2; border-radius: 10px; padding: 8px 12px; color: #10211b; width: 100%; font-size: 14px; font-family: inherit; } [data-theme="dark"] .sms-input { background: #09110f; border: 1px solid rgba(236,245,242,0.12); color: #ecf5f2; } .sms-input::placeholder { color: #5d6d66; } [data-theme="dark"] .sms-input::placeholder { color: #9eb0aa; } .sms-label { font-size: 12px; font-weight: 500; color: #5d6d66; } [data-theme="dark"] .sms-label { color: #9eb0aa; } .sms-city-name { font-size: 16px; font-weight: 700; color: #10211b; } [data-theme="dark"] .sms-city-name { color: #ecf5f2; } .sms-section-title { font-size: 14px; font-weight: 600; color: #10211b; } [data-theme="dark"] .sms-section-title { color: #ecf5f2; } .sms-muted { font-size: 12px; color: #5d6d66; } [data-theme="dark"] .sms-muted { color: #9eb0aa; } .sms-text { font-size: 13px; color: #10211b; } [data-theme="dark"] .sms-text { color: #ecf5f2; } .sms-italic { font-size: 12px; color: #5d6d66; font-style: italic; line-height: 1.4; margin-top: 6px; } [data-theme="dark"] .sms-italic { color: #9eb0aa; } .sms-toggle-text { font-size: 13px; color: #10211b; } [data-theme="dark"] .sms-toggle-text { color: #ecf5f2; } .sms-btn { border-radius: 12px; padding: 8px 16px; font-size: 12px; font-weight: 600; color: #fff; border: none; cursor: pointer; background: #12805c; } [data-theme="dark"] .sms-btn { background: #57d8a9; color: #06120d; } .sms-btn-sm { border-radius: 8px; border: 1px solid #c8d8d2; padding: 4px 10px; font-size: 12px; font-weight: 500; color: #10211b; cursor: pointer; background: transparent; } [data-theme="dark"] .sms-btn-sm { border: 1px solid rgba(236,245,242,0.12); color: #ecf5f2; } .sms-btn-del { border-radius: 8px; padding: 4px 8px; font-size: 14px; color: #5d6d66; cursor: pointer; background: transparent; border: none; } [data-theme="dark"] .sms-btn-del { color: #9eb0aa; } .sms-mode-btn-active-g { flex: 1; border-radius: 10px; border: 1px solid #22c55e; background: rgba(34,197,94,0.1); color: #22c55e; padding: 8px 12px; font-size: 14px; font-weight: 500; cursor: pointer; } .sms-mode-btn-inactive { flex: 1; border-radius: 10px; border: 1px solid #c8d8d2; background: transparent; color: #5d6d66; padding: 8px 12px; font-size: 14px; font-weight: 500; cursor: pointer; } [data-theme="dark"] .sms-mode-btn-inactive { border: 1px solid rgba(236,245,242,0.12); color: #9eb0aa; } .sms-mode-btn-active-b { flex: 1; border-radius: 10px; border: 1px solid #3b82f6; background: rgba(59,130,246,0.1); color: #3b82f6; padding: 8px 12px; font-size: 14px; font-weight: 500; cursor: pointer; } `; export const SmsCityProfilesPanel = () => { const [profiles, setProfiles] = useState([]); const [loading, setLoading] = useState(true); const [showForm, setShowForm] = useState(false); const [saving, setSaving] = useState(false); const [message, setMessage] = useState(""); const [formCity, setFormCity] = useState("Ялта"); const [formDeliveryMode, setFormDeliveryMode] = useState("notification"); const [formDeliveryText, setFormDeliveryText] = useState(""); const [formPickupMode, setFormPickupMode] = useState("notification"); const [formPickupText, setFormPickupText] = useState(""); const [formSecondSms, setFormSecondSms] = useState(true); const [formPaidStorage, setFormPaidStorage] = useState(true); const [formSmsEnabled, setFormSmsEnabled] = useState(true); const [formNote, setFormNote] = useState(""); const [editingId, setEditingId] = useState(null); const fetchProfiles = useCallback(async () => { setLoading(true); try { const { data, error } = await supabase .from("sms_city_profiles") .select("*") .order("city", { ascending: true }); if (error) throw error; setProfiles(data || []); } catch (e) { console.error("fetch sms_city_profiles error", e); } finally { setLoading(false); } }, []); useEffect(() => { fetchProfiles(); }, [fetchProfiles]); const resetForm = () => { setFormCity("Ялта"); setFormDeliveryMode("notification"); setFormDeliveryText(""); setFormPickupMode("notification"); setFormPickupText(""); setFormSecondSms(true); setFormPaidStorage(true); setFormSmsEnabled(true); setFormNote(""); setEditingId(null); }; const handleSave = async () => { setSaving(true); try { const payload = { city: formCity, delivery_mode: formDeliveryMode, delivery_text: formDeliveryText || null, pickup_mode: formPickupMode, pickup_text: formPickupText || null, second_sms_enabled: formSecondSms, paid_storage_enabled: formPaidStorage, sms_enabled: formSmsEnabled, note: formNote || "", }; if (editingId) { const { error } = await supabase.from("sms_city_profiles").update(payload).eq("id", editingId); if (error) throw error; setMessage("✅ Профиль обновлён"); } else { const { error } = await supabase.from("sms_city_profiles").insert(payload); if (error) throw error; setMessage("✅ Профиль добавлен"); } setShowForm(false); resetForm(); fetchProfiles(); setTimeout(() => setMessage(""), 3000); } catch (e) { setMessage("❌ Ошибка: " + e.message); } finally { setSaving(false); } }; const handleEdit = (p) => { setEditingId(p.id); setFormCity(p.city); setFormDeliveryMode(p.delivery_mode || "link"); setFormDeliveryText(p.delivery_text || ""); setFormPickupMode(p.pickup_mode || "link"); setFormPickupText(p.pickup_text || ""); setFormSecondSms(p.second_sms_enabled ?? true); setFormPaidStorage(p.paid_storage_enabled ?? true); setFormSmsEnabled(p.sms_enabled ?? true); setFormNote(p.note || ""); setShowForm(true); }; const handleDelete = async (id) => { try { const { error } = await supabase.from("sms_city_profiles").delete().eq("id", id); if (error) throw error; fetchProfiles(); } catch (e) { console.error("delete error", e); } }; const ModeBadge = ({ mode }) => mode === "notification" ? Уведомление : Ссылка; const Toggle = ({ checked, onChange, label }) => (
{label && {label}}
); return (
{/* Header */}
🏙️

Профили SMS по городам

Настройка поведения SMS для каждого города.

{message && {message}}
{/* Form */} {showForm && (

{editingId ? "Редактировать профиль" : "Новый профиль города"}

setFormSmsEnabled(!formSmsEnabled)} label="SMS включены для города" /> {!formSmsEnabled &&

⚠ Все SMS в этот город отключены

}
{/* Delivery */}
📦 Доставка
{formDeliveryMode === "notification" && (