/* global React, Card, Button, Input, Ic, VS */
// Zakładka "Maile" — admin-only.
// Lista odbiorców raportów (tabela vibrostore_contacts).
// Pojawiają się w pop-upie po kliknięciu "Wyślij raport mailem".
function MaileScreen() {
const role = VS.getRole();
const isAdmin = role === 'admin';
if (!isAdmin) {
return (
Maile
Dostęp tylko dla administratora.
);
}
const [list, setList] = React.useState(null);
const [err, setErr] = React.useState('');
const [msg, setMsg] = React.useState('');
const [showAdd, setShowAdd] = React.useState(false);
const [nName, setNName] = React.useState('');
const [nEmail, setNEmail] = React.useState('');
const [nRole, setNRole] = React.useState('');
const [adding, setAdding] = React.useState(false);
const load = React.useCallback(() => {
VS.contacts()
.then(r => setList(r || []))
.catch(e => setErr(e.message));
}, []);
React.useEffect(() => { load(); }, [load]);
function flash(text) { setMsg(text); setTimeout(() => setMsg(''), 2200); }
async function add() {
if (!nName.trim() || !nEmail.trim()) { flash('Nazwa i e-mail wymagane'); return; }
setAdding(true);
try {
await VS.addContact({ name: nName.trim(), email: nEmail.trim(), role: nRole.trim() });
setNName(''); setNEmail(''); setNRole('');
setShowAdd(false);
load();
flash('Dodano odbiorcę.');
} catch (e) { flash('Błąd: ' + e.message); }
finally { setAdding(false); }
}
async function remove(c) {
if (!confirm(`Usunąć "${c.name}"?`)) return;
try { await VS.deleteContact(c.id); load(); flash('Usunięto.'); }
catch (e) { flash('Błąd: ' + e.message); }
}
return (
Administracja
Maile
Lista odbiorców raportów. Pojawia się w pop-upie po kliknięciu „Wyślij raport mailem".
{list ? `${list.length} kontaktów` : ''}
} onClick={() => setShowAdd(s => !s)}>
{showAdd ? 'Ukryj' : 'Nowy odbiorca'}
{showAdd && (
Dodaj odbiorcę
} onClick={add} disabled={adding}>
{adding ? 'Dodaję…' : 'Zapisz'}
setShowAdd(false)}>Anuluj
{msg && {msg} }
)}
{err && (
{err}
)}
{!err && !list &&
Ładowanie…
}
{!err && list && list.length === 0 && (
Brak odbiorców. Dodaj pierwszego, by mogli pojawić się w pop-upie wysyłki raportu.
)}
{!err && list && list.length > 0 && (
Nazwa
E-mail
Notatka
Akcje
{list.map((c, i) => (
remove(c)} />
))}
)}
{!showAdd && msg && (
{msg}
)}
);
}
function ContactRow({ item, last, onChange, onRemove }) {
const [editing, setEditing] = React.useState(false);
const [name, setName] = React.useState(item.name || '');
const [email, setEmail] = React.useState(item.email || '');
const [role, setRole] = React.useState(item.role || '');
const [busy, setBusy] = React.useState(false);
const [msg, setMsg] = React.useState('');
React.useEffect(() => {
setName(item.name || ''); setEmail(item.email || ''); setRole(item.role || '');
}, [item.id, item.name, item.email, item.role]);
async function save() {
setBusy(true); setMsg('');
try {
await VS.updateContact(item.id, { name, email, role });
setEditing(false);
onChange && onChange();
} catch (e) { setMsg('Błąd: ' + e.message); }
finally { setBusy(false); }
}
if (!editing) {
return (
{item.name}
{item.email}
{item.role || '—'}
} onClick={() => setEditing(true)}>Edytuj
} onClick={onRemove}>Usuń
);
}
return (
);
}
Object.assign(window, { MaileScreen });