1.1.3 • Published 6 years ago

apollo-entity v1.1.3

Weekly downloads
1
License
MIT
Repository
bitbucket
Last release
6 years ago

apollo-entity

This lib provides you with a set of primitives allowing you to gracefully handle local apollo cache changes.

Primitives currently exported as an API:

  • Entity - allows you to specify query to get your entity by graphql query
  • Entity.Field - use to retrieve/edit entity field in apollo cache. Also allows you to specify allow function to check if input is appropriate.
  • Entity.Map - use to retrieve entity. Also allows you to specify map function to map entity to something useful.

This lib was primarily motivated by the need of handling forms.

Here is the example of simple form allowing admin to add a user (member of his community):

import { Entity } from 'apollo-entity';
import gql from 'graphql-tag';

const EMAIL_REGEXP = /^(([^<>()\[\]\\.,;:\s@"]+(\.[^<>()\[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/;
const ALPHABETIC_REGEXP = /^[A-z]*?$/;


const GET_MEMBER = gql`
 query member($id: Int!){
   member(id: $id) {
     firstName,
     lastName,
     email,
     category
   }
 }
`;

const FieldInput = ({
  name,
  allow
}) => (
  <Entity.Field name={name} allow={allow}>
    {(value, change) => (
      <input type="text" value={value} onChange={e => change(e.target.value)} />
    )}
  </Entity.Field>
);

const alphabetic = str => ALPHABETIC_REGEXP.test(str);
const isEmail = str => EMAIL_REGEXP.test(str);

const INVALID_EMAIL = 'Email is not valid!';
const EMPTY_MEMBER = 'Member is empty!';

export default () => (
  <Entity name="member" query={GET_MEMBER} variables={{ id: 1 }}>
      <div className="member__row">
        <FieldInput name="firstName" allow={alphabetic} />
        <FieldInput name="lastName" allow={alphabetic} />
      </div>
      <div className="member__row">
        <FieldInput name="email" />
        <Entity.Map map={({ email }) => isEmail(email)}>
          {valid => (
            valid ?
              null :
              <div className="edit-member-form__invalid-email-message">{INVALID_EMAIL}</div>
          )}
        </Entity.Map>
      </div>
    </Entity>
);
1.1.3

6 years ago

1.1.2

6 years ago

1.1.0

6 years ago

1.0.3

6 years ago

1.0.2

6 years ago