From f8bacf77dfb2542b97246113fedaa6c5757f564a Mon Sep 17 00:00:00 2001 From: Hongbo Wu Date: Thu, 21 Apr 2022 11:10:18 +0800 Subject: [PATCH] add list subscriptions --- .../queries/useGetSubscriptionsQuery.tsx | 67 +++++++++++++++++ packages/web/pages/settings/subscriptions.tsx | 74 +++++++++++++++++++ 2 files changed, 141 insertions(+) create mode 100644 packages/web/lib/networking/queries/useGetSubscriptionsQuery.tsx create mode 100644 packages/web/pages/settings/subscriptions.tsx diff --git a/packages/web/lib/networking/queries/useGetSubscriptionsQuery.tsx b/packages/web/lib/networking/queries/useGetSubscriptionsQuery.tsx new file mode 100644 index 000000000..89d0d5528 --- /dev/null +++ b/packages/web/lib/networking/queries/useGetSubscriptionsQuery.tsx @@ -0,0 +1,67 @@ +import { gql } from 'graphql-request' +import useSWR from 'swr' +import { publicGqlFetcher } from '../networkHelpers' +import { Subscription } from '@omnivore/api/src/generated/graphql' + +type SubscriptionsQueryResponse = { + isValidating: boolean + subscriptions: Subscription[] + revalidate: () => void +} + +type SubscriptionsResponseData = { + subscriptions: SubscriptionsData +} + +type SubscriptionsData = { + subscriptions: unknown +} + +export function useGetSubscriptionsQuery(): SubscriptionsQueryResponse { + const query = gql` + query GetSubscriptions { + subscriptions { + ... on SubscriptionsSuccess { + subscriptions { + id + name + url + description + status + unsubscribeMailTo + unsubscribeHttpUrl + createdAt + updatedAt + } + } + ... on SubscriptionsError { + errorCodes + } + } + } + ` + + const { data, mutate, error, isValidating } = useSWR(query, publicGqlFetcher) + + try { + if (data) { + const result = data as SubscriptionsResponseData + const subscriptions = result.subscriptions.subscriptions as Subscription[] + return { + isValidating, + subscriptions, + revalidate: () => { + mutate() + }, + } + } + } catch (error) { + console.log('error', error) + } + return { + isValidating: false, + subscriptions: [], + // eslint-disable-next-line @typescript-eslint/no-empty-function + revalidate: () => {}, + } +} diff --git a/packages/web/pages/settings/subscriptions.tsx b/packages/web/pages/settings/subscriptions.tsx new file mode 100644 index 000000000..6c6db5e07 --- /dev/null +++ b/packages/web/pages/settings/subscriptions.tsx @@ -0,0 +1,74 @@ +import { useState } from 'react' +import { PrimaryLayout } from '../../components/templates/PrimaryLayout' +import { styled } from '../../components/tokens/stitches.config' +import { Box, VStack } from '../../components/elements/LayoutPrimitives' +import { Toaster } from 'react-hot-toast' +import { applyStoredTheme } from '../../lib/themeUpdater' +import { StyledText } from '../../components/elements/StyledText' +import { ConfirmationModal } from '../../components/patterns/ConfirmationModal' +import { useGetSubscriptionsQuery } from '../../lib/networking/queries/useGetSubscriptionsQuery' + +const HeaderWrapper = styled(Box, { + width: '100%', +}) + +export default function SubscriptionsPage(): JSX.Element { + const { subscriptions, revalidate } = useGetSubscriptionsQuery() + const [confirmUnsubscribeName, setConfirmUnsubscribeName] = + useState(null) + + applyStoredTheme(false) + + async function onUnsubscribe(name: string): Promise { + // TODO: unsubscribe from the server + // const result = await deleteLabelMutation(name) + // if (result) { + // showSuccessToast('Unsubscribed', { position: 'bottom-right' }) + // } else { + // showErrorToast('Failed to unsubscribe', { position: 'bottom-right' }) + // } + // revalidate() + } + + return ( + + + + {confirmUnsubscribeName ? ( + { + await onUnsubscribe(confirmUnsubscribeName) + setConfirmUnsubscribeName(null) + }} + onOpenChange={() => setConfirmUnsubscribeName(null)} + /> + ) : null} + + + + Subscriptions + + + + {subscriptions + ? subscriptions.map((subscription, i) => { + return + }) + : null} + + + + ) +}