0

Here is a working Apollo subscription handler:

componentDidMount() {
    const fromID = Meteor.userId();
    const {toID} = this.props;
    this.toID = toID;

    this.props.data.subscribeToMore({
        document: IM_SUBSCRIPTION_QUERY,
        variables: {
            fromID: fromID,
            toID: toID,
        },
        updateQuery: (prev, {subscriptionData}) => {
            if (!subscriptionData.data) {
                return prev;
            }
            const newIM = subscriptionData.data.IMAdded;
            // don't double add the message
            if (isDuplicateIM(newIM, prev.instant_message)) {
                return previousResult;
            }
            return update(prev, {
                instant_message: {
                    $push: [newIM],
                },
            });
        }
    });
}

instant_message is an array of objects to be displayed. Each object contains a date field. I need to sort the objects in this array by date.

This approach used to work with beta versions of Apollo:

//update returns a new "immutable" list
const instant_message = update(previousResult, {instant_message: {$push: [newAppt]}});
instant_message.instant_message = instant_message.instant_message.sort(sortIMsByDateHelper);
return instant_message;

I can sort the array, but Apollo throws an error with the returned object-- e.g. it is not found in props when the render routine needs it.

What is the correct way to return the sorted array from updateQuery? Thanks in advance to all for any info.

VikR
  • 4,818
  • 8
  • 51
  • 96

1 Answers1

0

It turns out it wasn't the sorting that was causing the anomaly. It appears that subscriptions fail if the __TYPENAME of the returned object doesn't match something else here -- either the varname used in this routine ('instant_message' in the above code), or the varname of the array of objects returned in props to the render function. Lining up all these things so that they are identical fixes it.

VikR
  • 4,818
  • 8
  • 51
  • 96