From 9c1b3d2435cc92abf406770754ef5b71f46cbad6 Mon Sep 17 00:00:00 2001 From: arsam Date: Fri, 18 Sep 2026 23:24:06 +0330 Subject: [PATCH] Import source: app/src/admin/NewsletterPanel Import the existing local project snapshot. This commit organizes existing files; it does not represent newly developed functionality. --- app/src/admin/NewsletterPanel.jsx | 42 +++++++++++++++++++++++++++++++ 1 file changed, 42 insertions(+) create mode 100644 app/src/admin/NewsletterPanel.jsx diff --git a/app/src/admin/NewsletterPanel.jsx b/app/src/admin/NewsletterPanel.jsx new file mode 100644 index 0000000..5ddd630 --- /dev/null +++ b/app/src/admin/NewsletterPanel.jsx @@ -0,0 +1,42 @@ +import { useState, useEffect } from 'react'; +import { useToast, inputStyle, pillBtn } from '../../teknav-ui.jsx'; +import { adminApi } from '../lib/admin-api.js'; +import { BRAND } from './Shared.jsx'; + +function NewsletterPanel() { + const toast = useToast(); + const [campaigns, setCampaigns] = useState([]); + const [subscribers, setSubscribers] = useState([]); + const [subject, setSubject] = useState(''); + const [bodyHtml, setBodyHtml] = useState(''); + const load = () => Promise.all([adminApi.listNewsletterCampaigns(), adminApi.listNewsletterSubscribers()]).then(([c, s]) => { setCampaigns(c); setSubscribers(s); }); + useEffect(() => { load().catch(() => {}); }, []); + const create = async (e) => { + e.preventDefault(); + await adminApi.createNewsletterCampaign({ subject, bodyHtml }); + setSubject(''); + setBodyHtml(''); + toast('کمپین خبرنامه ذخیره شد'); + load(); + }; + const send = async (id) => { await adminApi.sendNewsletterCampaign(id); toast('کمپین ارسال شد'); load(); }; + return ( +
+
مشترکان واقعی API: {subscribers.length.toLocaleString('fa-IR')}
+
+ setSubject(e.target.value)} placeholder="موضوع کمپین" style={inputStyle} dir="rtl" /> +