Skip to content

Instantly share code, notes, and snippets.

@simenbrekken
Last active November 7, 2017 05:20
Show Gist options
  • Select an option

  • Save simenbrekken/953233453690ccb9bf809fdb91eca534 to your computer and use it in GitHub Desktop.

Select an option

Save simenbrekken/953233453690ccb9bf809fdb91eca534 to your computer and use it in GitHub Desktop.

Revisions

  1. simenbrekken revised this gist Nov 6, 2017. 1 changed file with 6 additions and 5 deletions.
    11 changes: 6 additions & 5 deletions GraphQL.js
    Original file line number Diff line number Diff line change
    @@ -6,13 +6,14 @@ class GraphQL extends Component {
    super(props, context)

    this.client = props.client || context.client
    this.renderer = this.createRenderer(props)
    this.renderer = this.createRenderer(this.props)
    }

    createRenderer = ({ query, render }) =>
    withGraphQL(query, { options: { client: this.client } })(mergedPropsAndData =>
    render(mergedPropsAndData),
    )
    createRenderer = ({ query, render, ...props }) => {
    const operationOptions = { options: { client: this.client } }

    return withGraphQL(query, operationOptions)(mergedPropsAndData => render(mergedPropsAndData))
    }

    componentWillReceiveProps(nextProps) {
    // TODO: Handle props.render as well
  2. simenbrekken revised this gist Nov 6, 2017. 1 changed file with 25 additions and 5 deletions.
    30 changes: 25 additions & 5 deletions GraphQL.js
    Original file line number Diff line number Diff line change
    @@ -1,15 +1,35 @@
    import { Component, createElement } from 'react'
    import { graphql as withGraphQL } from 'react-apollo'

    const createRenderer = ({ query, render }) =>
    withGraphQL(query)(mergedPropsAndData => render(mergedPropsAndData))

    class GraphQL extends Component {
    renderer = createRenderer(this.props)
    constructor(props, context) {
    super(props, context)

    this.client = props.client || context.client
    this.renderer = this.createRenderer(props)
    }

    createRenderer = ({ query, render }) =>
    withGraphQL(query, { options: { client: this.client } })(mergedPropsAndData =>
    render(mergedPropsAndData),
    )

    componentWillReceiveProps(nextProps) {
    // TODO: Handle props.render as well
    if (nextProps.query !== this.props.query) {
    this.setState({ renderer: createRenderer(nextProps) })
    this.renderer = this.createRenderer(nextProps)
    this.forceUpdate()
    }
    }

    fetchData() {
    const observable = this.client.watchQuery({ query: this.props.query })
    const result = observable.currentResult()

    if (result.loading) {
    return observable.result()
    } else {
    return false
    }
    }

  3. simenbrekken revised this gist Nov 6, 2017. 1 changed file with 0 additions and 1 deletion.
    1 change: 0 additions & 1 deletion GraphQL.js
    Original file line number Diff line number Diff line change
    @@ -8,7 +8,6 @@ class GraphQL extends Component {
    renderer = createRenderer(this.props)

    componentWillReceiveProps(nextProps) {
    // TODO: Handle props.render as well
    if (nextProps.query !== this.props.query) {
    this.setState({ renderer: createRenderer(nextProps) })
    }
  4. simenbrekken created this gist Nov 6, 2017.
    22 changes: 22 additions & 0 deletions GraphQL.js
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,22 @@
    import { Component, createElement } from 'react'
    import { graphql as withGraphQL } from 'react-apollo'

    const createRenderer = ({ query, render }) =>
    withGraphQL(query)(mergedPropsAndData => render(mergedPropsAndData))

    class GraphQL extends Component {
    renderer = createRenderer(this.props)

    componentWillReceiveProps(nextProps) {
    // TODO: Handle props.render as well
    if (nextProps.query !== this.props.query) {
    this.setState({ renderer: createRenderer(nextProps) })
    }
    }

    render() {
    return createElement(this.renderer, this.props)
    }
    }

    export default GraphQL
    34 changes: 34 additions & 0 deletions README.md
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,34 @@
    # Usage
    ```js
    import gql from 'graphql-tag'

    const MyComponent = () => (
    <div>
    <h1>Render props!</h1>

    <GraphQL
    query={gql`
    query ProductsQuery {
    products {
    id
    name
    }
    }
    `}
    render={props => {
    const { products } = props.data

    if (products) {
    return products.map(product => <div>{product.name} ({product.id})</div>)
    }

    if (loading) {
    return <div>Loading!</div>
    }

    return null
    }}
    />
    </div>
    )
    ```