diff --git a/packages/api/src/generated/graphql.ts b/packages/api/src/generated/graphql.ts index 07daba72c..99fa8611d 100644 --- a/packages/api/src/generated/graphql.ts +++ b/packages/api/src/generated/graphql.ts @@ -3031,6 +3031,7 @@ export type UpdateSubscriptionInput = { id: Scalars['ID']; lastFetchedAt?: InputMaybe; name?: InputMaybe; + status?: InputMaybe; }; export type UpdateSubscriptionResult = UpdateSubscriptionError | UpdateSubscriptionSuccess; diff --git a/packages/api/src/generated/schema.graphql b/packages/api/src/generated/schema.graphql index b001391ca..f06cea0fa 100644 --- a/packages/api/src/generated/schema.graphql +++ b/packages/api/src/generated/schema.graphql @@ -2353,6 +2353,7 @@ input UpdateSubscriptionInput { id: ID! lastFetchedAt: Date name: String + status: SubscriptionStatus } union UpdateSubscriptionResult = UpdateSubscriptionError | UpdateSubscriptionSuccess diff --git a/packages/api/src/resolvers/subscriptions/index.ts b/packages/api/src/resolvers/subscriptions/index.ts index a74c49a81..de2d62c5a 100644 --- a/packages/api/src/resolvers/subscriptions/index.ts +++ b/packages/api/src/resolvers/subscriptions/index.ts @@ -71,7 +71,10 @@ export const subscriptionsResolver = authorized< .leftJoinAndSelect('subscription.newsletterEmail', 'newsletterEmail') .where({ user: { id: uid }, - status: SubscriptionStatus.Active, + status: + subscriptionType == SubscriptionType.Newsletter + ? SubscriptionStatus.Active + : undefined, // only return active subscriptions for newsletter type: subscriptionType || SubscriptionType.Newsletter, // default to newsletter }) .orderBy('subscription.' + sortBy, sortOrder) @@ -315,7 +318,6 @@ export const updateSubscriptionResolver = authorized< const subscription = await getRepository(Subscription).findOneBy({ id: input.id, user: { id: uid }, - status: SubscriptionStatus.Active, }) if (!subscription) { log.info('subscription not found') @@ -332,6 +334,7 @@ export const updateSubscriptionResolver = authorized< lastFetchedAt: input.lastFetchedAt ? new Date(input.lastFetchedAt) : undefined, + status: input.status || undefined, }) return { diff --git a/packages/api/src/schema.ts b/packages/api/src/schema.ts index 74b3f283b..15b5d31c1 100755 --- a/packages/api/src/schema.ts +++ b/packages/api/src/schema.ts @@ -2511,6 +2511,7 @@ const schema = gql` name: String description: String lastFetchedAt: Date + status: SubscriptionStatus } union UpdateSubscriptionResult = diff --git a/packages/web/lib/networking/mutations/updateSubscriptionMutation.ts b/packages/web/lib/networking/mutations/updateSubscriptionMutation.ts index b623ff482..08e06d6e6 100644 --- a/packages/web/lib/networking/mutations/updateSubscriptionMutation.ts +++ b/packages/web/lib/networking/mutations/updateSubscriptionMutation.ts @@ -1,6 +1,9 @@ import { gql } from 'graphql-request' import { gqlFetcher } from '../networkHelpers' -import { Subscription } from '../queries/useGetSubscriptionsQuery' +import { + Subscription, + SubscriptionStatus, +} from '../queries/useGetSubscriptionsQuery' interface UpdateSubscriptionResult { updateSubscription: UpdateSubscription @@ -22,6 +25,7 @@ interface UpdateSubscriptionInput { lastFetchedAt?: Date name?: string description?: string + status?: SubscriptionStatus } export async function updateSubscriptionMutation( diff --git a/packages/web/pages/settings/rss/index.tsx b/packages/web/pages/settings/rss/index.tsx index 5e75cdebe..a7105c62f 100644 --- a/packages/web/pages/settings/rss/index.tsx +++ b/packages/web/pages/settings/rss/index.tsx @@ -15,6 +15,7 @@ import { formattedDateTime } from '../../../lib/dateFormatting' import { unsubscribeMutation } from '../../../lib/networking/mutations/unsubscribeMutation' import { updateSubscriptionMutation } from '../../../lib/networking/mutations/updateSubscriptionMutation' import { + SubscriptionStatus, SubscriptionType, useGetSubscriptionsQuery, } from '../../../lib/networking/queries/useGetSubscriptionsQuery' @@ -30,6 +31,8 @@ export default function Rss(): JSX.Element { const [onDeleteId, setOnDeleteId] = useState('') const [onEditId, setOnEditId] = useState('') const [onEditName, setOnEditName] = useState('') + const [onPauseId, setOnPauseId] = useState('') + const [onEditStatus, setOnEditStatus] = useState() async function updateSubscription(): Promise { const result = await updateSubscriptionMutation({ @@ -61,6 +64,19 @@ export default function Rss(): JSX.Element { revalidate() } + async function onPause(): Promise { + const result = await updateSubscriptionMutation({ + id: onPauseId, + status: onEditStatus, + }) + if (result) { + showSuccessToast('RSS feed paused', { position: 'bottom-right' }) + } else { + showErrorToast('Failed to pause', { position: 'bottom-right' }) + } + revalidate() + } + applyStoredTheme(false) return ( @@ -152,7 +168,18 @@ export default function Rss(): JSX.Element { console.log('onDelete triggered: ', subscription.id) setOnDeleteId(subscription.id) }} + onEdit={() => { + setOnEditStatus( + subscription.status == 'UNSUBSCRIBED' + ? 'ACTIVE' + : 'UNSUBSCRIBED' + ) + setOnPauseId(subscription.id) + }} deleteTitle="Delete" + editTitle={ + subscription.status === 'UNSUBSCRIBED' ? 'Unpause' : 'Pause' + } sublineElement={ setOnDeleteId('')} /> )} + + {onPauseId && ( + { + setOnPauseId('') + setOnEditStatus(undefined) + await onPause() + }} + onOpenChange={() => { + setOnPauseId('') + setOnEditStatus(undefined) + }} + /> + )} ) }