import { FloppyDisk, Pencil, XCircle } from '@phosphor-icons/react' import { useRouter } from 'next/router' import { useMemo, useState } from 'react' import { FormInput } from '../../../components/elements/FormElements' import { HStack, SpanBox, VStack, } from '../../../components/elements/LayoutPrimitives' import { ConfirmationModal } from '../../../components/patterns/ConfirmationModal' import { EmptySettingsRow, SettingsTable, SettingsTableRow, } from '../../../components/templates/settings/SettingsTable' import { theme } from '../../../components/tokens/stitches.config' import { formattedDateTime } from '../../../lib/dateFormatting' import { unsubscribeMutation } from '../../../lib/networking/mutations/unsubscribeMutation' import { UpdateSubscriptionInput, updateSubscriptionMutation, } from '../../../lib/networking/mutations/updateSubscriptionMutation' import { FetchContentType, Subscription, SubscriptionStatus, SubscriptionType, useGetSubscriptionsQuery, } from '../../../lib/networking/queries/useGetSubscriptionsQuery' import { applyStoredTheme } from '../../../lib/themeUpdater' import { showErrorToast, showSuccessToast } from '../../../lib/toastHelpers' import { formatMessage } from '../../../locales/en/messages' export default function Rss(): JSX.Element { const router = useRouter() const subscriptionsResponse = useGetSubscriptionsQuery( SubscriptionType.RSS ) const subscriptions = subscriptionsResponse.subscriptions as Array< Subscription & { type: SubscriptionType.RSS } > const { isValidating, revalidate } = subscriptionsResponse const [onDeleteId, setOnDeleteId] = useState('') const [onEditId, setOnEditId] = useState('') const [onEditName, setOnEditName] = useState('') const [onPauseId, setOnPauseId] = useState('') const [onEditStatus, setOnEditStatus] = useState() const sortedSubscriptions = useMemo(() => { if (!subscriptions) { return [] } return subscriptions .filter((s) => s.status == 'ACTIVE') .sort((a, b) => a.name.localeCompare(b.name)) }, [subscriptions]) async function updateSubscription( input: UpdateSubscriptionInput ): Promise { const result = await updateSubscriptionMutation(input) if (result.updateSubscription.errorCodes) { const errorMessage = formatMessage({ id: `error.${result.updateSubscription.errorCodes[0]}`, }) showErrorToast(`failed to update subscription: ${errorMessage}`, { position: 'bottom-right', }) return } showSuccessToast('Feed updated', { position: 'bottom-right' }) revalidate() } async function onDelete(id: string): Promise { const result = await unsubscribeMutation('', id) if (result) { showSuccessToast('Feed unsubscribed', { position: 'bottom-right' }) } else { showErrorToast('Failed to unsubscribe', { position: 'bottom-right' }) } revalidate() } async function onPause( id: string, status: SubscriptionStatus = 'UNSUBSCRIBED' ): Promise { const result = await updateSubscriptionMutation({ id, status, }) const action = status == 'UNSUBSCRIBED' ? 'pause' : 'resume' if (result) { showSuccessToast(`Feed ${action}d`, { position: 'bottom-right', }) } else { showErrorToast(`Failed to ${action}`, { position: 'bottom-right' }) } revalidate() } const updateFetchContent = async ( id: string, fetchContent: FetchContentType ): Promise => { const result = await updateSubscriptionMutation({ id, fetchContentType: fetchContent, }) if (result) { showSuccessToast(`Updated feed fetch rule`) } else { showErrorToast(`Error updating feed fetch rule`) } revalidate() } applyStoredTheme() return ( { router.push('/settings/feeds/add') }} > {sortedSubscriptions.length === 0 ? ( ) : ( sortedSubscriptions.map((subscription, i) => { return ( e.stopPropagation()} onChange={(e) => setOnEditName(e.target.value)} placeholder="Description" css={{ m: '0px', fontSize: '18px', '@mdDown': { fontSize: '12px', fontWeight: 'bold', }, width: '400px', }} /> { e.stopPropagation() await updateSubscription({ id: onEditId, name: onEditName, }) setOnEditId('') }} /> { e.stopPropagation() setOnEditId('') setOnEditName('') }} /> ) : ( {subscription.name} { e.stopPropagation() setOnEditName(subscription.name) setOnEditId(subscription.id) }} /> ) } isLast={i === sortedSubscriptions.length - 1} onDelete={() => { console.log('onDelete triggered: ', subscription.id) setOnDeleteId(subscription.id) }} deleteTitle="Unsubscribe" sublineElement={ {`URL: ${subscription.url}`} {/* show failed timestamp instead of last refreshed timestamp if the feed failed to refresh */} {subscription.failedAt ? ( {`Failed to refresh: ${formattedDateTime( subscription.failedAt )}`} ) : ( {`Last refreshed: ${ subscription.lastFetchedAt ? formattedDateTime(subscription.lastFetchedAt) : 'Never' }`} )} {subscription.mostRecentItemDate && `Most recent item: ${formattedDateTime( subscription.mostRecentItemDate )}`} } onClick={() => { router.push( `/search?q=in:inbox rss:"${encodeURIComponent( subscription.url )}"` ) }} // extraElement={ // // { // await updateSubscriptionMutation({ // id: subscription.id, // autoAddToLibrary: checked, // }) // revalidate() // }} // /> // // Auto add to library // // // } /> ) }) )} {onDeleteId && ( { await onDelete(onDeleteId) setOnDeleteId('') }} onOpenChange={() => setOnDeleteId('')} /> )} {onPauseId && ( { await onPause(onPauseId, onEditStatus) setOnPauseId('') setOnEditStatus(undefined) }} onOpenChange={() => { setOnPauseId('') setOnEditStatus(undefined) }} /> )} ) }