【React Native】「react-native-gifted-chat」のチャットに追加読み込み機能を実装する

以前からよく取り上げさせていただいている React Native でチャットページを簡単に実装できるライブラリ「react-native-gifted-chat」で、上までスクロールしたら以前のチャットメッセージを追加読み込みする機能を実装する方法についてです。
「react-native-gifted-chat」ライブラリにも、loadEarlieronLoadEarlier という Props があるのですが、こちらはチャットメッセージ最上部に表示される「以前のメッセージを読み込む」ボタンをタップしないと発火しませんでした。
今回は、上までスクロールしたことを検知して、自動で追加読み込み処理が実行されてほしかったので別の方法を使います。

react-native-gifted-chat ライブラリの GitHub はこちらです。

FaridSafi/react-native-gifted-chat: 💬 The most complete chat UI for React Native
https://github.com/FaridSafi/react-native-gifted-chat

もう何回も紹介していますが…念のため!

 

参考にしたサイトがあったのですが、うっかりリンクを保存し忘れてしまったので、いきなりサンプルコードを掲載します。

<GiftedChat
  messages={this.state.messages}
  onSend={this.sendMessage}
  user={this.state.sender}
  locale='ja'
  placeholder='メッセージを入力'
  keyboardShouldPersistTaps='never'
  timeFormat='H:mm'
  alignTop={true}
  alwaysShowSend={true}
  infiniteScroll={true}
  loadEarlier={this.state.isLoadingEarlier}
  isLoadingEarlier={true}
  listViewProps={{
    onEndReached: this.onEndReached,
    onEndReachedThreshold: 0.4,
  }} />

11 行目から 17 行目が追加する設定です。
無限スクロールを有効にし、チャットメッセージ最上部に追加読み込み中を表すローディングアイコンを表示するようにしています。

で、上までスクロールしたら追加読み込みを実行する処理は 14 行目から 17 行目の listViewProps で指定しています。
「react-native-gifted-chat」ライブラリでは、メッセージの吹き出しを表示するのに React Native の FlatList を使用しており、listViewProps ではその FlatListProps を設定することができます。
上記のサンプルコードでは、FlatListProps である onEndReachedonEndReachedThreshold を指定しています。
上記のように追加して実際に実行してみたところ、上にスクロールしていくとちゃんと onEndReached に指定した this.onEndReached() が呼び出されました!
あとは、任意の処理を this.onEndReached() 内に記述して、以前のメッセージを取得してください。

なお、追加読み込みのローディングアイコンの表示/非表示は stateisLoadingEarlier で管理しています。
もし、全部のメッセージを取得したら、isLoadingEarlierfalse にしてローディングアイコンを非表示にしてください。
もしくは、renderLoadEarlier で以前のメッセージを読み込むボタンのカスタマイズができるので、こちらで表示/非表示を切り替えてもいいと思います。

 

以上、React Native の「react-native-gifted-chat」ライブラリで、チャットページを上にスクロールしたら以前のメッセージを自動で読み込む機能を実装する方法についてでした。
React Native の FlatList を使ったことがあればそこまで難しくないと思いますので、頑張って下さい。
ご参考になれば幸いです。

>株式会社シーポイントラボ

株式会社シーポイントラボ

TEL:053-543-9889
営業時間:9:00~18:00(月〜金)
住所:〒432-8003
   静岡県浜松市中央区和地山3-1-7
   浜松イノベーションキューブ 315
※ご来社の際はインターホンで「316」をお呼びください

CTR IMG