diff --git a/src/components/admin/SmsCityProfilesPanel.jsx b/src/components/admin/SmsCityProfilesPanel.jsx index f3718d1..2185f71 100644 --- a/src/components/admin/SmsCityProfilesPanel.jsx +++ b/src/components/admin/SmsCityProfilesPanel.jsx @@ -7,6 +7,93 @@ 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); @@ -44,31 +131,20 @@ export const SmsCityProfilesPanel = () => { useEffect(() => { fetchProfiles(); }, [fetchProfiles]); const resetForm = () => { - setFormCity("Ялта"); - setFormDeliveryMode("notification"); - setFormDeliveryText(""); - setFormPickupMode("notification"); - setFormPickupText(""); - setFormSecondSms(true); - setFormPaidStorage(true); - setFormSmsEnabled(true); - setFormNote(""); - setEditingId(null); + 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 || "", + 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); @@ -79,264 +155,126 @@ export const SmsCityProfilesPanel = () => { if (error) throw error; setMessage("✅ Профиль добавлен"); } - setShowForm(false); - resetForm(); - fetchProfiles(); + setShowForm(false); resetForm(); fetchProfiles(); setTimeout(() => setMessage(""), 3000); } catch (e) { setMessage("❌ Ошибка: " + e.message); - } finally { - setSaving(false); - } + } finally { setSaving(false); } }; - const handleEdit = (profile) => { - setEditingId(profile.id); - setFormCity(profile.city); - setFormDeliveryMode(profile.delivery_mode || "link"); - setFormDeliveryText(profile.delivery_text || ""); - setFormPickupMode(profile.pickup_mode || "link"); - setFormPickupText(profile.pickup_text || ""); - setFormSecondSms(profile.second_sms_enabled ?? true); - setFormPaidStorage(profile.paid_storage_enabled ?? true); - setFormSmsEnabled(profile.sms_enabled ?? true); - setFormNote(profile.note || ""); + 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); - } + 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 handleQuickToggle = async (profile, field) => { - try { - const { error } = await supabase.from("sms_city_profiles").update({ [field]: !profile[field] }).eq("id", profile.id); - if (error) throw error; - fetchProfiles(); - } catch (e) { - console.error("toggle error", e); - } - }; - - // ── Styles ────────────────────────────────────────────────────────────── - // Карточка профиля — лёгкий зелёный оттенок, виден на белом Panel - const profileCardStyle = { - backgroundColor: "var(--color-accent-soft)", - border: "1px solid var(--color-border)", - borderRadius: "16px", - padding: "16px", - }; - - // Внутренний блок (Доставка/Самовывоз) — непрозрачный, контраст с карточкой - const innerBlockStyle = { - backgroundColor: "var(--color-surface-strong)", - border: "1px solid var(--color-border)", - borderRadius: "10px", - padding: "12px", - }; - - // Инпут — фон базовый - const inputStyle = { - backgroundColor: "var(--color-base)", - border: "1px solid var(--color-border)", - borderRadius: "10px", - padding: "8px 12px", - color: "var(--color-text)", - width: "100%", - fontSize: "14px", - }; - - const labelStyle = { - fontSize: "12px", - fontWeight: 500, - color: "var(--color-text-muted)", - }; - - // ── UI helpers ────────────────────────────────────────────────────────── - const ModeBadge = ({ mode }) => { - if (mode === "notification") { - return Уведомление; - } - return Ссылка; - }; + const ModeBadge = ({ mode }) => mode === "notification" + ? Уведомление + : Ссылка; const Toggle = ({ checked, onChange, label }) => (
- Настройка поведения SMS для каждого города: согласование по ссылке или уведомление. +
+ Настройка поведения SMS для каждого города.
⚠ Все SMS в этот город отключены
- )} + {!formSmsEnabled &&⚠ Все SMS в этот город отключены
}Загрузка...
+Загрузка...
) : profiles.length === 0 ? ( -- Профилей нет. Города без профиля используют стандартный флоу (ссылка на согласование). -
+Профилей нет. Города без профиля используют стандартный флоу (ссылка на согласование).
"{p.delivery_text}"
- )} + {p.delivery_text &&"{p.delivery_text}"
}"{p.pickup_text}"
- )} + {p.pickup_text &&"{p.pickup_text}"
}💬 {p.note}
- )} + {p.note &&💬 {p.note}
}