github.com/Kartograf/gqlgen@v0.7.2/example/chat/src/Room.js (about)

     1  import React , {Component} from 'react';
     2  import { graphql, compose } from 'react-apollo';
     3  import gql from 'graphql-tag';
     4  
     5  class Room extends Component {
     6      constructor(props) {
     7          super(props)
     8  
     9          this.state = {text: ''}
    10      }
    11  
    12      componentWillMount() {
    13          this.props.data.subscribeToMore({
    14              document: Subscription,
    15              variables: {
    16                  channel: this.props.channel,
    17              },
    18              updateQuery: (prev, {subscriptionData}) => {
    19                  if (!subscriptionData.data) {
    20                      return prev;
    21                  }
    22                  const newMessage = subscriptionData.data.messageAdded;
    23                  if (prev.room.messages.find((msg) => msg.id === newMessage.id)) {
    24                      return prev
    25                  }
    26                  return Object.assign({}, prev, {
    27                      room: Object.assign({}, prev.room, {
    28                          messages: [...prev.room.messages, newMessage],
    29                      })
    30                  });
    31              }
    32          });
    33      }
    34  
    35      render() {
    36          const data = this.props.data;
    37  
    38          if (data.loading) {
    39              return <div>loading</div>
    40          }
    41  
    42          return <div>
    43              <div>
    44                  {data.room.messages.map((msg) =>
    45                      <div key={msg.id}>{msg.createdBy}: {msg.text}</div>
    46                  )}
    47              </div>
    48              <input value={this.state.text} onChange={(e) => this.setState({text: e.target.value})}/>
    49              <button onClick={() => this.props.mutate({
    50                  variables: {
    51                      text: this.state.text,
    52                      channel: this.props.channel,
    53                      name: this.props.name,
    54                  }
    55              })} >send</button>
    56          </div>;
    57      }
    58  }
    59  
    60  const Subscription = gql`
    61      subscription MoreMessages($channel: String!) {
    62          messageAdded(roomName:$channel) {
    63              id
    64              text
    65              createdBy
    66          }
    67      }
    68  `;
    69  
    70  const Query = gql`
    71      query Room($channel: String!) {
    72          room(name: $channel) {
    73              messages { id text createdBy }
    74          }
    75      }
    76  `;
    77  
    78  const Mutation = gql`
    79      mutation sendMessage($text: String!, $channel: String!, $name: String!) {
    80          post(text:$text, roomName:$channel, username:$name) { id }
    81      }
    82  `;
    83  
    84  
    85  export default compose(graphql(Mutation), graphql(Query))(Room);