3
votes

Part of my route is set up like so:

<Route path=":widgetId" component={Widget} queries={{
    viewer: () => Relay.QL`query { viewer }`,
    widget: () => Relay.QL`query { widget(widgetId: $widgetId) }`
}}>
    <Route
        path="details"
        component={Details}
        queries={{ widget: () => Relay.QL`query { widget(widgetId: $widgetId) }` }}
    />
</Route>

However, I get the following error:

Error:  Invariant Violation: Relay(Details).getFragment(): `viewer` is not a valid fragment name. Available fragments names: `widget``.

Is the queries for route :widgetId valid? If I remove viewer from the top level route, everything works.

EDIT: here is the Details Fragment:

export default Relay.createContainer(Details, {
    fragments: {
        widget: () => Relay.QL`
            fragment on Widget {
                id,
            }
        `
    }
});

Edit: here are the Widget Fragments:

export default Relay.createContainer(Details, {
    fragments: {
        widget: () => Relay.QL`
            fragment on Widget {
                id,
            }
        `
        viewer: () => Relay.QL`
            fragment on Viewer {
                id,
            }
        `
    }
});

Note: I am using isomorphic-relay-router

1
Have you defined fragment viewer in your Widget Relay container? - Ahmad Ferdous
@AhmadFerdous yes, the fragment viewer is in my Widget Relay container. If I take out the Route with path 'details' I don't get thrown the error. So I believe the error is coming from how queries are set up? - jouerai
Invariant Violation: Relay(Details).getFragment() <== looks like the problem is with the Details component. Can you add fragments of Relay container Details? - Ahmad Ferdous
@AhmadFerdous i have added the details fragment - jouerai
Did you have any luck in the end? I'm running into a nearly identical problem with react-router-relay. - Tim Hope

1 Answers

0
votes

It looks like you need to add a viewer fragment to your Widget class, i.e.:

export default Relay.createContainer(Widget, {
  fragments: {
    widget: () => Relay.QL`
      fragment on Widget {
        id,
      }
    `,
    viewer: () => Relay.QL`
      fragment on ObjectType {
        fields
      }
    `
  }
});