diff --git a/client/components/CalendarFeedManager.jsx b/client/components/CalendarFeedManager.tsx similarity index 82% rename from client/components/CalendarFeedManager.jsx rename to client/components/CalendarFeedManager.tsx index 36cc361..0c564ec 100644 --- a/client/components/CalendarFeedManager.jsx +++ b/client/components/CalendarFeedManager.tsx @@ -1,13 +1,27 @@ -import React, { useCallback, useEffect, useState } from 'react'; +import { useCallback, useEffect, useState, type ReactNode } from 'react'; import { Link } from 'react-router-dom'; import { CalendarDays, Copy, Eye, KeyRound, RefreshCw, ShieldOff, Settings2 } from 'lucide-react'; import { toast } from 'sonner'; import { api } from '@/api'; -import { cn } from '@/lib/utils'; +import { cn, errMessage } from '@/lib/utils'; import { Button } from '@/components/ui/button'; import { Input } from '@/components/ui/input'; -function PlatformNote({ title, children }) { +interface CalFeed { + active?: boolean; + feed_url?: string; + last_used_at?: string | null; +} + +interface CalEvent { + uid: string; + name?: string; + due_date?: string; + cycle_type?: string; + amount?: number; +} + +function PlatformNote({ title, children }: { title: ReactNode; children: ReactNode }) { return (

{title}

@@ -16,25 +30,25 @@ function PlatformNote({ title, children }) { ); } -export function CalendarFeedManager({ compact = false, showManageLink = false }) { - const [feed, setFeed] = useState(null); - const [preview, setPreview] = useState([]); +export function CalendarFeedManager({ compact = false, showManageLink = false }: { compact?: boolean; showManageLink?: boolean }) { + const [feed, setFeed] = useState(null); + const [preview, setPreview] = useState([]); const [loading, setLoading] = useState(true); - const [busy, setBusy] = useState(null); + const [busy, setBusy] = useState(null); const loadFeed = useCallback(async () => { setLoading(true); try { - const data = await api.calendarFeed(); + const data = await api.calendarFeed() as CalFeed; setFeed(data); if (data?.active) { - const nextPreview = await api.calendarFeedPreview(10); + const nextPreview = await api.calendarFeedPreview(10) as { events?: CalEvent[] }; setPreview(nextPreview.events || []); } else { setPreview([]); } } catch (err) { - toast.error(err.message || 'Failed to load calendar feed.'); + toast.error(errMessage(err, 'Failed to load calendar feed.')); } finally { setLoading(false); } @@ -47,13 +61,13 @@ export function CalendarFeedManager({ compact = false, showManageLink = false }) async function createFeed() { setBusy('create'); try { - const data = await api.createCalendarFeed(); + const data = await api.createCalendarFeed() as CalFeed; setFeed(data); - const nextPreview = await api.calendarFeedPreview(10); + const nextPreview = await api.calendarFeedPreview(10) as { events?: CalEvent[] }; setPreview(nextPreview.events || []); toast.success('Calendar feed created.'); } catch (err) { - toast.error(err.message || 'Failed to create calendar feed.'); + toast.error(errMessage(err, 'Failed to create calendar feed.')); } finally { setBusy(null); } @@ -72,13 +86,13 @@ export function CalendarFeedManager({ compact = false, showManageLink = false }) async function regenerateFeed() { setBusy('regenerate'); try { - const data = await api.regenerateCalendarFeed(); + const data = await api.regenerateCalendarFeed() as CalFeed; setFeed(data); - const nextPreview = await api.calendarFeedPreview(10); + const nextPreview = await api.calendarFeedPreview(10) as { events?: CalEvent[] }; setPreview(nextPreview.events || []); toast.success('Calendar feed regenerated. Update any subscribed calendars with the new URL.'); } catch (err) { - toast.error(err.message || 'Failed to regenerate calendar feed.'); + toast.error(errMessage(err, 'Failed to regenerate calendar feed.')); } finally { setBusy(null); } @@ -87,12 +101,12 @@ export function CalendarFeedManager({ compact = false, showManageLink = false }) async function revokeFeed() { setBusy('revoke'); try { - const data = await api.revokeCalendarFeed(); + const data = await api.revokeCalendarFeed() as CalFeed; setFeed(data); setPreview([]); toast.success('Calendar feed revoked.'); } catch (err) { - toast.error(err.message || 'Failed to revoke calendar feed.'); + toast.error(errMessage(err, 'Failed to revoke calendar feed.')); } finally { setBusy(null); } @@ -150,13 +164,13 @@ export function CalendarFeedManager({ compact = false, showManageLink = false })
- +