import React from 'react'; import { connect } from 'react-redux'; import { createUpdateQuery } from 'olymp-router'; import { graphql } from 'react-apollo'; import { message } from 'antd'; import { omit as omit2 } from 'olymp-apollo'; import { lowerFirst } from 'lodash'; import gql from 'graphql-tag'; const ok = props => () => { const { form, item, updateQuery, mutate, typeName } = props; form.validateFields((err, values) => { if (err) { return message.error(err); } if (values.start && Array.isArray(values.start)) { values.end = values.start[1]; values.start = values.start[0]; } mutate({ variables: { id: item && item.id, input: omit2(values), }, refetchQueries: [ `${lowerFirst(typeName)}List`, `${lowerFirst(typeName)}`, ], /* updateQueries: !item || !item.id ? { [`${typeName.toLowerCase()}List`]: (prev, { mutationResult }) => ({ ...prev, items: [mutationResult.data.item, ...prev.items], }), } : undefined, */ }) .then(({ data: { item } }) => { message.success('Gespeichert'); form.resetFields(); updateQuery({ [`@${lowerFirst(typeName)}`]: item.id }); }) .catch(err => message.error(err)); }); }; const clone = props => () => { const { form, item, router, updateQuery, mutate, typeName } = props; const cloneItem = omit2(item); delete cloneItem.id; mutate({ variables: { input: cloneItem, }, updateQueries: { [`${typeName.toLowerCase()}List`]: (prev, { mutationResult }) => ({ ...prev, items: [mutationResult.data.item, ...prev.items], }), }, }) .then(({ data: { item } }) => { message.success('Kopiert'); form.resetFields(); updateQuery({ [`@${lowerFirst(typeName)}`]: item.id }); }) .catch(err => message.error(err)); }; const del = props => () => { const { form, item, router, updateQuery, mutate, typeName } = props; return mutate({ variables: { id: item && item.id, type: 'REMOVE', }, updateQueries: { [`${typeName.toLowerCase()}List`]: prev => ({ ...prev, items: prev.items.filter(x => x.id !== item.id), }), }, }) .then(({ data }) => { message.success('Gelöscht'); form.resetFields(); updateQuery({ [`@${lowerFirst(typeName)}`]: null }); }) .catch(err => message.error(err)); }; export default WrappedComponent => { const cache = {}; const bound = ({ typeName, fieldNames }) => { const mutation = graphql(gql` mutation ${lowerFirst(typeName)}($id: String, $input: ${ typeName }Input, $type: MUTATION_TYPE) { item: ${lowerFirst(typeName)}(id: $id, input: $input, type: $type) { ${fieldNames} } } `); const query = graphql( gql` query ${lowerFirst(typeName)}($id: String!) { item: ${lowerFirst(typeName)}(query: { id: {eq: $id} }) { ${fieldNames} } } `, { /* eslint-disable */ props: ({ ownProps, data }) => ({ ...ownProps, item: data.item, }), options: ({ id }) => ({ fetchPolicy: !id ? 'cache-only' : undefined, variables: { id, }, }), }, ); return query( mutation(props => ( )), ); }; return connect(null, dispatcher => ({ updateQuery: createUpdateQuery(dispatcher), }))(props => { if (props.typeName && props.fieldNames && props.collection) { const name = `${props.typeName}|${props.fieldNames}`; const Bound = cache[name] || bound(props); cache[name] = Bound; return ; } return null; }); };