Skip to content

Instantly share code, notes, and snippets.

@rodrigopr
Created March 31, 2016 15:49
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save rodrigopr/605ab032830ae8e686a0123baa3c80a1 to your computer and use it in GitHub Desktop.
Save rodrigopr/605ab032830ae8e686a0123baa3c80a1 to your computer and use it in GitHub Desktop.
import _ from 'lodash';
import React from 'react';
import Relay from 'react-relay';
import RelayQuery from 'react-relay/lib/RelayQuery';
import GraphQLStoreQueryResolver from 'react-relay/lib/GraphQLStoreQueryResolver'
import RelayFragmentPointer from 'react-relay/lib/RelayFragmentPointer';
import RelayMetaRoute from 'react-relay/lib/RelayMetaRoute';
class DummyComponent extends React.Component {
render() {
return null;
}
}
function getQueryFragment(Container, route, fragmentName, args) {
const fragmentReference = Container.getFragment(fragmentName, args);
const concreteFragment = fragmentReference.getFragment(args)
const metaRoute = RelayMetaRoute.get(route.name);
return RelayQuery.Fragment.create(concreteFragment, metaRoute, args);
}
export default {
fetch(route, args, fragments) {
const environment = Relay.Store;
const store = environment.getStoreData();
const DummyContainer = Relay.createContainer(DummyComponent, {
initialVariables: args,
fragments
});
const queryToRecord = (query, name) => {
// get container fragment based on query
const queryFragment = getQueryFragment(DummyContainer, route, name, args);
// create fragment pointer (dataid reference from relay store)
const fp = RelayFragmentPointer.createForRoot(store.getQueuedStore(), query);
if (fp && fp.__dataID__) {
// resolve the query on the store
const resolver = new GraphQLStoreQueryResolver(store, queryFragment);
return resolver.resolve(queryFragment, fp.__dataID__);
} else {
return null;
}
}
return new Promise((resolve, reject) => {
const querySet = Relay.getQueries(DummyContainer, route);
// execute the query
environment.primeCache(querySet, readyState => {
if (readyState.ready) {
resolve(_.mapValues(querySet, queryToRecord));
} else if (readyState.error || readyState.aborted) {
reject(readyState.error || new Error('Unexpected error on query'));
}
});
});
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment