const createCompositeQuery = ({children, schema, type, dependents}, id) => {
  const query = Relay.createQuery({
    calls: [{
      kind: 'Call',
      metadata: {},
      name: 'id',
      value: {
        kind: 'CallVariable',
        callVariableName: 'id'
      }
    }],
    fieldName: 'node',
    kind: 'Query',
    metadata: {
      isAbstract: true,
      identifyingArgName: 'id'
    },
    name: 'App',
    type: 'Node',
    children: [{
      fieldName: 'id',
      kind: 'Field',
      metadata: {
        isGenerated: true,
        isRequisite: true
      },
      type: 'ID'
    }, {
      fieldName: '__typename',
      kind: 'Field',
      metadata: {
        isGenerated: true,
        isRequisite: true
      },
      type: 'String'
    }, {
      kind: 'Fragment',
      metadata: {},
      name: type,
      type: type,
      children: []
    }]
  }, { id });

  return {
    query: query.clone(query.getChildren().map(child => {
      if (child instanceof RelayQuery.Fragment) {
        return child.clone(children);
      } else {
        return child;
      }
    })),
    schema,
    dependents
  };
}
const onEnter = (nextState, replace, callback) => {
  const {params: {channelId}} = nextState;
  const query = Relay.createQuery(node, {channelId});
  Relay.Store.primeCache({query}, readyState => {
    if (readyState.done) {
      const [channel] = Relay.Store.readQuery(query);
      if (channel.joined) {
        callback();
      } else {
        Relay.Store.commitUpdate(new JoinChannelMutation({channel}), {
          onSuccess: () => callback()
        });
      }
    }
  });
}