import { useMemo, useState } from 'react' import { applyStoredTheme } from '../../lib/themeUpdater' import { ConfirmationModal } from '../../components/patterns/ConfirmationModal' import { Subscription, SubscriptionType, useGetSubscriptionsQuery, } from '../../lib/networking/queries/useGetSubscriptionsQuery' import { unsubscribeMutation } from '../../lib/networking/mutations/unsubscribeMutation' import { showErrorToast, showSuccessToast } from '../../lib/toastHelpers' import { EmptySettingsRow, SettingsTable, SettingsTableRow, } from '../../components/templates/settings/SettingsTable' import { StyledText } from '../../components/elements/StyledText' import Link from 'next/link' import { formattedShortDate } from '../../lib/dateFormatting' export default function SubscriptionsPage(): JSX.Element { const { subscriptions, revalidate, isValidating } = useGetSubscriptionsQuery() const [confirmUnsubscribeSubscription, setConfirmUnsubscribeSubscription] = useState(null) applyStoredTheme() async function onUnsubscribe(subscription: Subscription): Promise { const result = await unsubscribeMutation(subscription.name, subscription.id) if (result) { showSuccessToast('Unsubscribed', { position: 'bottom-right' }) } else { showErrorToast('Failed to unsubscribe', { position: 'bottom-right' }) } revalidate() } const sortedSubscriptions = useMemo(() => { if (!subscriptions) { return [] } return subscriptions .filter((s) => s.status == 'ACTIVE') .sort((a, b) => a.name.localeCompare(b.name)) }, [subscriptions]) return ( <> {sortedSubscriptions.length > 0 ? ( sortedSubscriptions.map((subscription, i) => { return ( setConfirmUnsubscribeSubscription(subscription)} deleteTitle="Unsubscribe" sublineElement={ {`Last received ${formattedShortDate( subscription.updatedAt )}`} {subscription.newsletterEmail && ( <> {' '} at{' '} {subscription.newsletterEmail} )} {subscription.type == SubscriptionType.RSS && subscription.url && ( <> {' '} via RSS )} } /> ) }) ) : ( )} {confirmUnsubscribeSubscription ? ( { await onUnsubscribe(confirmUnsubscribeSubscription) setConfirmUnsubscribeSubscription(null) setTimeout(() => { document.body.style.removeProperty('pointer-events') }, 200) }} onOpenChange={() => setConfirmUnsubscribeSubscription(null)} /> ) : null} ) }