Created
March 31, 2016 15:49
-
-
Save rodrigopr/605ab032830ae8e686a0123baa3c80a1 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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