import { Card, Collection, Flex, Heading } from '@aws-amplify/ui-react'; import { API } from 'aws-amplify'; import { useEffect, useState } from 'react'; import Observable from 'zen-observable-ts'; import { CONNECTION_STATE_CHANGE, ConnectionState } from '@aws-amplify/pubsub'; import { Hub } from 'aws-amplify'; import pluralize from 'pluralize'; import _ from 'lodash'; import { AuthMode, HarnessContext, HarnessContextType } from './HarnessContext'; type SubscriptionComponentProps = { id: string; query: string; title: string; authMode?: AuthMode; }; const SubscriptionState = ({ authMode }: { authMode?: AuthMode }) => { const [areSubscriptionsReady, setSubscriptionsReady] = useState(false); useEffect(() => { const hubListener = (data: any) => { const { payload } = data; if (payload.event === CONNECTION_STATE_CHANGE) { const connectionState = payload.data.connectionState as ConnectionState; if (connectionState === 'Connected') { setSubscriptionsReady(true); } } } Hub.listen('api', hubListener); return () => Hub.remove('api', hubListener); }, [authMode]); const stateIndicator = areSubscriptionsReady ? '✅' : '❌'; return ({ stateIndicator }); }; const SubscriptionComponent = ({ id, query, title, authMode }: SubscriptionComponentProps) => { const [loggedSubscriptionMessages, setSubscriptionMessages] = useState([]); const appendSubscriptionMessage = (newMessage: object): void => { setSubscriptionMessages(oldSubscriptionMessages => [...oldSubscriptionMessages, newMessage]); }; useEffect(() => { // Subscribe to creation of Todo const request = API.graphql({ query, authMode }) as Observable; const subscription = request.subscribe({ // @ts-ignore next: ({ value }) => appendSubscriptionMessage(value), error: (error) => console.warn(error) }); // Stop receiving data updates from the subscription on unmount return () => subscription.unsubscribe(); }, [id, title, query, authMode]); return ( { title } {(msg, idx) => { JSON.stringify(msg) } } ); }; type SubscriptionsProps = { recordName: string; createSubscriptionQuery: string; updateSubscriptionQuery: string; deleteSubscriptionQuery: string; } export const Subscriptions = ({ recordName, createSubscriptionQuery, updateSubscriptionQuery, deleteSubscriptionQuery }: SubscriptionsProps) => { return ( { ({ authMode }: HarnessContextType) => Subscriptions } ); };