Skip to content

Instantly share code, notes, and snippets.

@slaskis
Last active September 8, 2017 07:15
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 slaskis/bd7af41346c4b171ad0913299cd69554 to your computer and use it in GitHub Desktop.
Save slaskis/bd7af41346c4b171ad0913299cd69554 to your computer and use it in GitHub Desktop.
Proposed Query component use with fragments
import React from "react"
import {gql} from "react-apollo"
import OrderRow, {LoadingOrderRow} from "../components/OrderRow"
import SingleOrder from "../components/SingleOrder"
import ErrorMessage from "../components/ErrorMessage"
import Query from "../components/Query"
export default const Page => ({query}) =>
query.id
? <Show id={query.id} />
: <List />
const List = ({}) =>
<div>
<Query gql={ListOrderQuery}>{({ListOrder, error, loading, refetch}) =>
loading
: Array.from(5).map(i => <LoadingOrderRow />)
? error
? <ErrorMessage error={error} />
: ListOrder.orders.map(order => <OrderRow order={order}/>)
}</Query>
</div>
const ListOrderQuery = gql`
query ListOrder {
orders {
...OrderRow
}
}
${OrderRow.fragments.OrderRow}
`
const Show = ({id}) =>
<div>
<Query gql={ShowOrderQuery} variables={{id}} wait>{({ShowOrder, error, refetch}) =>
error
? <ErrorMessage error={error} />
: <SingleOrder order={ShowOrder.order} />
}</Query>
</div>
const ShowOrderQuery = gql`
query ShowOrder($id: ID!) {
order {
...SingleOrder
}
}
${SingleOrder.fragments.SingleOrder}
`
import React from "react"
import {gql} from "react-apollo"
export const OrderRecordRow = ({record}) =>
<li>{record.title}</li>
OrderRecordRow.fragments = {
OrderRecordRow: gql`
fragment OrderRecordRow on OrderRecord {
title
}
`
}
import React from "react"
import {gql} from "react-apollo"
export default const OrderRow = ({order}) =>
<span>{order.name}</span>
OrderRow.fragments = {
OrderRow: gql`
fragment OrderRow on Order {
id
name
}
`
}
import React from "react"
import {gql} from "react-apollo"
import {OrderRecordRow} from "./OrderRecord"
export default const SingleOrder = ({order}) =>
<div id={order.id}>
<h1>{order.name}</h1>
<ol>
{order.records.map(rec => <OrderRecordRow record={rec} />)}
</ol>
</div>
SingleOrder.fragments = {
SingleOrder: gql`
fragment SingleOrder on Order {
id
name
records {
...OrderRecordRow
}
}
${OrderRecordRow.fragments.OrderRecordRow}
`
}
@slaskis
Copy link
Author

slaskis commented Sep 8, 2017

Using these components in storybooks should be possible by wrapping the stories in a MockedProvider 🙌

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment