react-router-relay: Error - Make sure the `relay` property on the React context conforms to the `RelayEnvironment` interface.

Hi, I ran into some problems with the new version (Not very sure about this). Basically, I got the error:

invariant.js:38 Uncaught Invariant Violation: RelayContainer: `Relay(onlyUpdateForKeys(Todos))` was rendered with invalid Relay context `undefined`. Make sure the `relay` property on the React context conforms to the `RelayEnvironment` interface.
import React from 'react';
import Relay from 'react-relay';
import useRelay from 'react-router-relay';
import { Router, Route, applyRouterMiddleware } from 'react-router';
import ViewerQuery from 'client/queries/viewer';
import Todos from 'client/components/todos/index.jsx';
import StaticPage from 'client/components/static-page/index.jsx';

export const getClientHistory = () =>
  require('react-router').browserHistory;

export const getServerHistory = (url) =>
  require('react-router').createMemoryHistory(url);

export const getRoutes = (history) => (
  <Router
    history={history}
    render={applyRouterMiddleware(useRelay)}
    environment={Relay.Store}
  >
    <Route path="/" component={Todos} queries={ViewerQuery} />
    <Route path="/static-page" component={StaticPage} />
  </Router>
);
// @flow
import React from 'react';
import Relay from 'react-relay';
import { compose, onlyUpdateForKeys } from 'recompose';
import { createContainer } from 'recompose-relay';
import AddTodoMutation from 'client/mutations/add-todo';
import CompleteTodoMutation from 'client/mutations/complete-todo';
import RemoveTodoMutation from 'client/mutations/remove-todo';
import TodosHeader from './todos-header';
import TodosAdd from './todos-add';
import TodosBody from './todos-body';
import TodosFooter from './todos-footer';
import type { ViewerType } from './types';

export const Todos = ({ viewer, relay }: { viewer: ViewerType, relay: Object }) => (
  <div className="container">
    <div className="row">
      <TodosHeader />
      <TodosAdd relay={relay} viewer={viewer} />
      <TodosBody viewer={viewer} />
      <TodosFooter />
    </div>
  </div>
);

Todos.propTypes = {
  viewer: React.PropTypes.object,
  relay: React.PropTypes.object,
};

export const enhance = compose(
  createContainer({
    initialVariables: {
      numberOfTodos: 10,
    },
    fragments: {
      viewer: () => Relay.QL`
        fragment on Viewer {
          todos(last: $numberOfTodos) {
            edges {
              node {
                id
                text
                complete
              }
            }
          }
          numberOfTodos
          ${AddTodoMutation.getFragment('viewer')}
          ${CompleteTodoMutation.getFragment('viewer')}
          ${RemoveTodoMutation.getFragment('viewer')}
        }
      `,
    },
  }),
  onlyUpdateForKeys(['viewer', 'relay'])
);

export default enhance(Todos);

I use createContainer from recompose, and I don’t know how I got this error. I just got this error recently. By the way, this is my project https://github.com/hung-phan/koa-react-isomorphic/tree/features/relay

About this issue

  • Original URL
  • State: closed
  • Created 8 years ago
  • Comments: 16 (6 by maintainers)

Most upvoted comments

["es2015", { "modules": false }] seems to turn off import?

I get SyntaxError: Unexpected token import.

Here’s my .babelrc

{
  "passPerPreset": true,
  "presets": [
    { "plugins": [ "./babelRelayPlugin" ] },
    "react",
    ["es2015", { "modules": false }],
    "stage-0"
  ],
  "plugins": [
    "transform-runtime",
    "transform-decorators-legacy",
    "transform-class-properties",
    "react-hot-loader/babel"
  ]
}

I’m using the latest babel+webpack beta 20.