import { useEffect, useState } from "react"; import { useTranslation } from "react-i18next"; import { api } from "../../api"; import { useToast } from "../../toast"; import { useConfirm } from "../../confirm"; import Icon from "../../components/Icon"; import Modal from "../../components/Modal"; const LEER = { name: "", host: "", port: 993, security: "ssl", username: "", password: "", folder: "INBOX", done_folder: "", mark_seen: true, is_active: true, poll_minutes: 15, }; /** * Postfächer für den Mail-Abruf. * * Raiffeisen und Revolut melden Überweisungen per E-Mail. Certain holt sie ab * und macht daraus Vorschläge – gebucht wird nur, was der Nutzer abnickt. * * Kartenzahlungen im Laden melden die Banken NICHT per Mail, nur per Push in * ihrer App. Dafür gibt es die Schnellerfassung per Kurzbefehl unter * „Mein Konto". */ export default function Postfaecher() { const { t } = useTranslation(); const toast = useToast(); const confirm = useConfirm(); const [quellen, setQuellen] = useState([]); const [konten, setKonten] = useState([]); const [form, setForm] = useState(null); // null = Formular zu const [ordner, setOrdner] = useState(null); // Ergebnis des Verbindungstests const [absender, setAbsender] = useState({}); const [busy, setBusy] = useState(false); // Was beim letzten Abruf durchgefallen ist – beim Einrichten die einzige // Möglichkeit zu sehen, was in den Absender-Filter gehört. const [uebergangen, setUebergangen] = useState([]); async function laden() { try { const [q, k] = await Promise.all([api.listMailSources(), api.listAccounts()]); setQuellen(q); setKonten(k); const je = {}; for (const s of q) je[s.id] = await api.listMailSenders(s.id); setAbsender(je); } catch (e) { toast(e.message, "error"); } } useEffect(() => { laden(); }, []); const setzen = (teil) => setForm((f) => ({ ...f, ...teil })); async function speichern(e) { e.preventDefault(); setBusy(true); try { const koerper = { ...form }; if (form.id && !koerper.password) delete koerper.password; if (form.id) await api.updateMailSource(form.id, koerper); else await api.createMailSource(koerper); setForm(null); setOrdner(null); laden(); } catch (e) { toast(e.message, "error"); } finally { setBusy(false); } } async function testen(quelle) { setBusy(true); try { const r = await api.testMailSource(quelle.id); setOrdner(r.folders); toast(t("mailbox.testOk", { n: r.count })); } catch (e) { toast(e.message, "error"); } finally { setBusy(false); } } async function abrufen(quelle) { setBusy(true); try { const r = await api.fetchMailSource(quelle.id); // „0 neu" allein sagt nicht, ob nichts da war oder nichts passte. toast(r.gefunden === 0 ? t("mailbox.fetchedNone") : t("mailbox.fetched", { gefunden: r.gefunden, neu: r.neu, unklar: r.unklar })); setUebergangen(r.ohne_zuordnung || []); laden(); } catch (e) { toast(e.message, "error"); } finally { setBusy(false); } } async function loeschen(quelle) { if (!(await confirm({ title: t("mailbox.delete"), message: t("mailbox.deleteConfirm", { name: quelle.name || quelle.host }), danger: true, confirmLabel: t("common.delete"), }))) return; try { await api.deleteMailSource(quelle.id); laden(); } catch (e) { toast(e.message, "error"); } } async function absenderAnlegen(quelle, daten) { try { await api.createMailSender(quelle.id, daten); laden(); } catch (e) { toast(e.message, "error"); } } return (
{t("mailbox.intro")}
{quellen.map((q) => ({t("mailbox.skippedHint")}