#✅ - Subscriptions in Amplify gen2 react-native don't work

5 messages · Page 1 of 1 (latest)

solid viper
#

Hi, I cannot figure out why my subscription doesn't work.
I have a model:

const schema = a
  .schema({
...
    Relationship: a
      .model({
        id: a.id().required(),
        initiatorId: a.id().required(),
        recipientEmail: a.string(),
        recipientId: a.id(),
        status: a.enum(['ACTIVE', 'PENDING', "CANCELLED", "REJECTED"]),
        establishedAt: a.datetime(),
        // Relationships
        initiator: a.belongsTo('User', 'initiatorId'),
        recipient: a.belongsTo('User', 'recipientId'),
      })
      .identifier(['id'])
      .secondaryIndexes(index => [
        index('initiatorId').name('byInitiator'),
        index('recipientId').name('byRecipient'),
        index('recipientEmail').name('byRecipientEmail'),
      ])
      .authorization(allow => [allow.publicApiKey()]),
...
})
  .authorization(allow => [
    allow.resource(postConfirmation).to(['query', 'listen', 'mutate']),
  ]);

Then I have my frontend code:

  useEffect(() => {
    console.log("useEffect to subscribe")
    if (currentUser?.email) {
      console.log("subscribed, email: ", currentUser?.email)
      const sub = client.models.Relationship.onCreate({
        filter:{},
        // filter: {id: {contains: "-"}},
        // filter: {recipientEmail: {eq: currentUser?.email}},
        authMode: "apiKey",
      }).subscribe({
        next: newdata => {
          console.log('subscription data', newdata);
          // if(newdata){
          //     setData((prevData) => [...prevData, newdata]);
          // }

        },
        error: (error) => console.warn(error),

        
      });
      return () => sub.unsubscribe();
    }
  }, [currentUser?.email]);

As you see I tried different filters, but none worked.
If I use empty it triggers and prints null, but if I use real filter it doesn't trigger at all. What am I missing?

#

Subscriptions in Amplify gen2 react-native don't work

potent island
#

Hi @solid viper , I don't see why your code would not work, but I am also working on React Native and the subscription that I am sharing below is working fine. Try to use useRef to prevent opening multiple subscription connections on currentUser?.email change.

import { useAuth } from '@Context/AuthContext';
import { Address, Professional, User } from '@localTypes/schema';
import { Schema } from 'amplify/data/resource';
import { generateClient } from 'aws-amplify/data';
import { useEffect, useRef, useState } from 'react';

const client = generateClient<Schema>();

function useUser(id: string) {
  const [user, setUser] = useState<User | null>(null);
  const [error, setError] = useState<Error | null>(null);

  const subscriptionRef = useRef<any>(null);

  useEffect(() => {
    if (subscriptionRef.current) {
      subscriptionRef.current.unsubscribe();
      subscriptionRef.current = null;
    }

    if (user) {
      subscriptionRef.current = client.models.user.onUpdate({ filter: { id: { eq: id } } }).subscribe({
        next: async (userData) => {
          try {

            setUser(userData as User);
          } catch (err) {
            setError(new Error('Erro buscando usuário'));
            console.error(err);
          }
        },
        error: (err) => {
          setError(new Error('Erro buscando usuário'));
          console.error(err);
        },
      });
    }

    return () => {
      if (subscriptionRef.current) {
        subscriptionRef.current.unsubscribe();
        subscriptionRef.current = null;
      }
    };
  }, [id]);

  return {
    user,
    error,
  };
}

export default useUser;
solid viper
#

Oh , f** me, I feel so dumb.
The problem is that I triggered createRelationship mutation via AppSync console and didn't include recipientEmail in the selection set of response.
So, my subscription couldn't access this information...
Aaaaahhh

faint aspenBOT
#

✅ - Subscriptions in Amplify gen2 react-native don't work