react-apollo实现客服/聊天即时通讯功能

实现思路
apollo是一个非常棒的库结合graphql使用非常便捷巧妙,有着良好的编程快感,不觉让人沉浸在其中,以下是实现及时通讯的思路
使用:aws-appsync react-apollo graphQL
首先全局全局包裹,也需要全局监听,实时的消息接收

const client = new AWSAppSyncClient({
  url,
  region,
  auth
})

<ApolloProvider client={client}>
    <App/>
</ApolloProvider>

先实现简单的聊天室,即两者都在同一页面,没有一方处于离线状态下
以2.58版为例(新版差别不大,新版3.15目前我使用有点问题,stackoverflow上有解决办法,以后会使用新版本,先用旧版本实现功能)
用graphql包裹组建开启一个查询

export default graphql(...)(componentName)

graphql的第一个参数是一个查询方法:GetMessages,查询当前聊天室中的消息列表,
options是相关的配置返回一个对象,属性variables是查询需要的参数,fetchPolicy是数据存储方式:缓存和网络

graphql(GetMessages, {
  options: (props) => {
    const { conversationId } = props;
    return {
      variables: {
        conversationId,
      },
      fetchPolicy: "cache-and-network",
    };
  }

查询的返回值props会成为被包裹组建的props,查询的props有一个subscribeToMore属性可以监听subscription类型的方法的触发也就是监听/订阅

// 设置返回给被包裹组件的props
props: (props: any) => {
    // 从组件原有的props中结构订阅需要的参数,如果需要的话
    const { conversationId } = props.ownProps;
    return {
    // 返回给被包裹组件的props
    // 设置messages属性值是查询的结果如果没有则返回一个空数组
      messages: props.data.queryMessagesByConversation?.items ?? [],
      // 重点订阅属性设置 params是在组件中可选的传餐 subscribeToNewPosts属性,是一个方法,传给被包裹组建,要实现订阅需要在被包裹组建内调用它,执行订阅
      subscribeToNewPosts: (params: any) => {
      // subscribeToMore是订阅属性执行订阅是的操作,单独提出来展示,有点乱
        props.data.subscribeToMore({})
    }
}
          

subscribeToNewPosts设置

    // subscribeToMore属性从props上取得
    props.data.subscribeToMore({
          document: SubscribeMessage,// 要订阅的方法,即哪个方法执行了在处理
          variables: { conversationId },// 订阅需要的参数,参数可以从params和props中取得
          updateQuery: ( prev:,curr) =>{ // 重点,处理查询的结果,有旧的查询结果,和订阅新发来的数据,组合他们返回你需要的数据返回给被包裹组件
          const {// 数据结构,onCreateMessage是订阅的数据
              subscriptionData: {
                data: { onCreateMessage },
              },
            } = curr;
            return {
              ...prev,...curr// 组合需要的数据结构,这个会是被包裹组件的message属性
            };
            
          } 

然后被包裹组件内可以得到上面props返回的数据messages和subscribeToNewPosts,在组建内出发subscribeToNewPosts即可执行订阅

const componentName = {
messages,
subscribeToNewPosts
} => {
    useEffect(() => {
        subscribeToNewPosts()// 执行订阅这里传参,params里可以接收,需要的话
    })
    
    return (
    // 使用传来的messages数据,这个数据当订阅执行时,会出发设置的updataQuery会按照你的组合改变新的数据,就是说当对方给你发消息时就会出发创建消息的订阅,你这边能接收到新发的消息,把新消息加入到传给被包裹组件就可以实现实时消息接收/发送
    {messages.map(message => <Text key={message.id}>{message}</Text>)}
    )
}

一般即时通讯双方需要有一个房间号,在创建消息和执行订阅等操作需要传入此项,我这是由后端生成,相当于给两个通讯的人一个小数据库,凭借这个钥匙双发可对数据进行操作,双方都可监听这个数据库的变化,每当这个数据库中创建了一条新消息,两边都可以收到,并且展示到界面上来,就完成了即时通讯,这只是双方都在这个聊天室中的情况,还有一方离线,如何新消息弹窗提醒,以及新的聊天室创建了,另一方执行监听等等,不过都不难,都差不多,大体是把,新消息创建的监听设置全局这样,用户进入app有新消息发来订阅就执行,能看到新消息,就可以执行相关操作了,新的聊天室创建也是,监听聊天室的创建,同样是全局的,这块因为没有经验的前辈指导,自己摸索了很长时间,网上搜索相关饿资料也没有找到合适的,于是,把我这点经验记录下,如果是也是使用react-native,graphQL,apollo,aws相关技术,希望能够帮助到你,自己摸索太累了,告辞,有不明白的,或者哪里有问题,再或者你有一些建议,请一定要告诉我!
这是我的公众号,欢迎关注~
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值