Vulcan/packages/vulcan-core/lib/modules/containers/withDocument.js

71 lines
2.2 KiB
JavaScript
Raw Normal View History

2018-01-06 07:07:38 +01:00
import React, { Component } from 'react';
import PropTypes from 'prop-types';
import { graphql } from 'react-apollo';
import gql from 'graphql-tag';
import { getSetting, getFragment, getFragmentName } from 'meteor/vulcan:core';
2016-12-12 09:54:16 +09:00
export default function withDocument (options) {
const { collection, pollInterval = getSetting('pollInterval', 20000), enableCache = false, extraQueries } = options,
queryName = options.queryName || `${collection.options.collectionName}SingleQuery`,
2017-02-22 18:04:59 +01:00
singleResolverName = collection.options.resolvers.single && collection.options.resolvers.single.name;
let fragment;
if (options.fragment) {
fragment = options.fragment;
} else if (options.fragmentName) {
fragment = getFragment(options.fragmentName);
} else {
fragment = getFragment(`${collection.options.collectionName}DefaultFragment`);
}
const fragmentName = getFragmentName(fragment);
return graphql(gql`
query ${queryName}($documentId: String, $slug: String, $enableCache: Boolean) {
${singleResolverName}(documentId: $documentId, slug: $slug, enableCache: $enableCache) {
__typename
...${fragmentName}
}
${extraQueries || ''}
}
${fragment}
`, {
2017-01-14 08:29:51 +09:00
alias: 'withDocument',
options(ownProps) {
const graphQLOptions = {
variables: { documentId: ownProps.documentId, slug: ownProps.slug, enableCache },
2017-01-11 10:36:08 +01:00
pollInterval, // note: pollInterval can be set to 0 to disable polling (20s by default)
};
if (options.fetchPolicy) {
graphQLOptions.fetchPolicy = options.fetchPolicy;
}
return graphQLOptions;
},
props: returnedProps => {
2018-01-25 15:03:03 -06:00
const { /* ownProps, */ data } = returnedProps;
const propertyName = options.propertyName || 'document';
const props = {
2017-05-03 14:42:57 +09:00
loading: data.loading,
// document: Utils.convertDates(collection, data[singleResolverName]),
[ propertyName ]: data[singleResolverName],
2016-11-23 11:07:48 +09:00
fragmentName,
fragment,
data,
};
if (data.error) {
// get graphQL error (see https://github.com/thebigredgeek/apollo-errors/issues/12)
props.error = data.error.graphQLErrors[0];
}
return props;
},
});
}