diff --git a/frontend/src/calendar.jsx b/frontend/src/calendar.jsx index 3cae87a..a009321 100644 --- a/frontend/src/calendar.jsx +++ b/frontend/src/calendar.jsx @@ -88,9 +88,7 @@ export default function CalendarWidget() { const [today] = useState(new Date()); const [cur, setCur] = useState({ y: today.getFullYear(), m: today.getMonth() }); const [events, setEvents] = useState([]); - // Feeds immer frisch aus localStorage lesen - const getFeeds = () => { try { return JSON.parse(localStorage.getItem('dd_cal_feeds') || '[]'); } catch { return []; } }; - const [feedCount, setFeedCount] = useState(0); // trigger re-render + const [feeds, setFeeds] = useState([]); const [loading, setLoading] = useState(false); const [selected, setSelected] = useState(new Date()); // default: heute @@ -123,7 +121,7 @@ export default function CalendarWidget() { setLoading(false); }; - const refresh = () => { const f = getFeeds(); if (f.length > 0) loadFeeds(f); setFeedCount(f.length); }; + const refresh = () => { api('/calendar/feeds').then(f=>{ setFeeds(f); loadFeeds(f); }).catch(()=>{}); }; useEffect(() => { if (isOpen) refresh(); }, [isOpen]); // Nächster oder aktueller Termin (für zugeklappte Ansicht) @@ -162,7 +160,7 @@ export default function CalendarWidget() { ▶ - {isOpen && getFeeds().length > 0 && ( + {isOpen && feeds.length > 0 && ( {/* Ende Termine */} {/* Ende Flex-Layout */} - {getFeeds().length === 0 && ( + {feeds.length === 0 && ( Noch keine Kalender abonniert. Füge Kalender in den Einstellungen hinzu. @@ -317,16 +315,11 @@ export default function CalendarWidget() { // ── iCal-Einstellungen (für Einstellungen-Seite) ────────────────────────────── export function CalendarSettings({ toast }) { - const [feeds, setFeeds] = useState(() => { - try { return JSON.parse(localStorage.getItem('dd_cal_feeds') || '[]'); } catch { return []; } - }); - const [form, setForm] = useState({ name:'', url:'', color:'#4ecdc4' }); + const [feeds, setFeeds] = useState([]); + const [form, setForm] = useState({ name:'', url:'', color:'#4ecdc4' }); const [testing, setTesting] = useState(false); - const save = (newFeeds) => { - setFeeds(newFeeds); - localStorage.setItem('dd_cal_feeds', JSON.stringify(newFeeds)); - }; + useEffect(() => { api('/calendar/feeds').then(setFeeds).catch(()=>{}); }, []); const add = async () => { if (!form.name.trim() || !form.url.trim()) { toast('Name und URL erforderlich', 'error'); return; } @@ -336,13 +329,17 @@ export function CalendarSettings({ toast }) { headers: { Authorization: `Bearer ${localStorage.getItem('sk_token')}` } }); if (!res.ok) { const d=await res.json(); toast(d.error||'Feed-Fehler','error'); return; } - save([...feeds, { ...form, id: Date.now() }]); + const newFeed = await api('/calendar/feeds', { body: { name:form.name.trim(), url:form.url.trim(), color:form.color } }); + setFeeds(p => [...p, newFeed]); setForm({ name:'', url:'', color:'#4ecdc4' }); toast('Kalender hinzugefügt ✓'); } catch(e) { toast(e.message,'error'); } finally { setTesting(false); } }; - const remove = (id) => save(feeds.filter(f => f.id !== id)); + const remove = async (id) => { + try { await api(`/calendar/feeds/${id}`, {method:'DELETE'}); setFeeds(p=>p.filter(f=>f.id!==id)); toast('Entfernt'); } + catch(e) { toast(e.message,'error'); } + }; const COLORS = ['#4ecdc4','#ff6b9d','#ffe66d','#6bcb77','#a78bfa','#60a5fa','#fb923c'];