'use client' import { useState, useEffect } from 'react' import { Card, CardContent, CardDescription, CardHeader, CardTitle } from '@/components/ui/card' import { Label } from '@/components/ui/label' import { Switch } from '@/components/ui/switch' import { Button } from '@/components/ui/button' import { Input } from '@/components/ui/input' import { useToast } from '@/components/ui/use-toast' import { Badge } from '@/components/ui/badge' import { Calendar, Copy, RefreshCw, Loader2, ExternalLink, Check } from 'lucide-react' import { DestructiveConfirmDialog, useDestructiveConfirm } from '@/components/ui/destructive-confirm-dialog' import type { CalendarFeed } from '@/types' interface CalendarFeedWithUrls extends CalendarFeed { webcalUrl: string httpsUrl: string } export function CalendarFeedSettings() { const { toast } = useToast() const [isLoading, setIsLoading] = useState(true) const [isSaving, setIsSaving] = useState(false) const [isRegenerating, setIsRegenerating] = useState(false) const [feed, setFeed] = useState(null) const [copied, setCopied] = useState(false) const { dialogProps: confirmDialogProps, confirm: confirmAction } = useDestructiveConfirm() useEffect(() => { fetchFeed() }, []) const fetchFeed = async () => { setIsLoading(true) const response = await fetch('/api/calendar/feed') const { data } = await response.json() setFeed(data) setIsLoading(false) } const createFeed = async () => { setIsSaving(true) try { const response = await fetch('/api/calendar/feed', { method: 'POST', }) if (!response.ok) { throw new Error('Failed to create feed') } const { data } = await response.json() setFeed(data) toast({ title: 'Kalenderfeed skapad', description: 'Du kan nu koppla kalendern till Apple Calendar eller Google Calendar.', }) } catch (error) { toast({ title: 'Fel', description: 'Kunde inte skapa kalenderfeed.', variant: 'destructive', }) } finally { setIsSaving(false) } } const updateFeed = async (key: keyof CalendarFeed, value: boolean) => { if (!feed) return setIsSaving(true) try { const response = await fetch('/api/calendar/feed', { method: 'PUT', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ [key]: value }), }) if (!response.ok) { throw new Error('Failed to update feed') } const { data } = await response.json() setFeed(data) } catch (error) { toast({ title: 'Fel', description: 'Kunde inte uppdatera inställning.', variant: 'destructive', }) } finally { setIsSaving(false) } } const regenerateToken = async () => { const ok = await confirmAction({ title: 'Skapa ny kalender-länk', description: 'Den gamla länken slutar fungera omedelbart. Du behöver uppdatera länken i alla kalenderappar som använder den.', confirmLabel: 'Skapa ny länk', variant: 'warning', }) if (!ok) return setIsRegenerating(true) try { const response = await fetch('/api/calendar/feed', { method: 'DELETE', }) if (!response.ok) { throw new Error('Failed to regenerate token') } const { data } = await response.json() setFeed(data) toast({ title: 'Ny länk skapad', description: 'Den gamla länken fungerar inte längre.', }) } catch (error) { toast({ title: 'Fel', description: 'Kunde inte skapa ny länk.', variant: 'destructive', }) } finally { setIsRegenerating(false) } } const copyToClipboard = async (text: string) => { try { await navigator.clipboard.writeText(text) setCopied(true) setTimeout(() => setCopied(false), 2000) toast({ title: 'Kopierad', description: 'Länken har kopierats till urklipp.', }) } catch (error) { toast({ title: 'Fel', description: 'Kunde inte kopiera länken.', variant: 'destructive', }) } } const openWebcal = () => { if (feed?.webcalUrl) { window.location.href = feed.webcalUrl } } if (isLoading) { return (
) } if (!feed) { return ( Kalendersynkronisering Synka dina deadlines med Apple Calendar, Google Calendar eller Outlook

Skapa en kalenderfeed för att se dina deadlines i din vanliga kalenderapp.

) } return (
{/* Feed URL */} Kalendersynkronisering Prenumerera på din kalender i Apple Calendar, Google Calendar eller Outlook {/* Quick add for Apple Calendar */}
{/* URL display */}

Kopiera denna länk och lägg till som URL-prenumeration i din kalenderapp.

{/* Stats */} {feed.last_accessed_at && (
Senast hämtad: {new Date(feed.last_accessed_at).toLocaleDateString('sv-SE', { day: 'numeric', month: 'short', hour: '2-digit', minute: '2-digit', })} {feed.access_count} gånger
)} {/* Regenerate link */}

Ogiltigförklarar den gamla länken. Använd om någon obehörig fått tag i länken.

{/* Content settings */} Innehåll i kalendern Välj vilka händelser som ska visas i din kalender

Moms, F-skatt, deklarationer

updateFeed('include_tax_deadlines', checked) } disabled={isSaving} />

Förfallodatum för fakturor

updateFeed('include_invoices', checked) } disabled={isSaving} />
) }