💬

SendbirdでUIKit for Reactを利用する際に困ったこと

2024/10/02に公開

https://sendbird.com/docs/chat/uikit/v3/react/overview
SendbirdでUIKit for Reactを利用し、既存のアプリケーションにチャットUIを組み込む際の困りポイントです。
特別言及がない限り、バージョンは3.15.3を利用していた時のものです。

🚨GroupChannelSettingsのMessageInputWrapperコンポーネントに日本語をペーストするとASCIIコードに変換される

対象コンポーネント

https://sendbird.com/docs/chat/uikit/v3/react/modules/group-channel#2-ui-components-3-messageinputwrapper

事象

  • 日本語をコピーしてMessageInput欄にペーストするとASCIIコードに変換される
  • アルファベットは問題なくペースト可能

MessageInputWrapper

対応策

あまり好ましくないのですが、useRefを使って要素を走査し、pasteイベントをカスタマイズすることで無理くり回避することはできました。

sample.ts
  const inputRef = useRef<HTMLInputElement>(null);

  useEffect(() => {
    customPaste(inputRef);
  }, [inputRef.current]);

  const customPaste = (ref: React.RefObject<HTMLInputElement>) => {
  if (ref.current) {
    const elm = ref.current.getElementsByClassName('sendbird-message-input-text-field')[0];
    elm.addEventListener('paste', (event) => {
      event.stopPropagation();
      event.preventDefault();
      const paste = (event.clipboardData || window.clipboardData).getData('text');
      const selection = window.getSelection();
      if (selection && selection.rangeCount) {
        selection.deleteFromDocument();
        selection.getRangeAt(0).insertNode(document.createTextNode(paste));
        selection.collapseToEnd();
      }
    });
  }
  
  return (
    <div ref={inputRef}>
      <GroupChannelUI
        renderMessageInput={() => <MessageInputWrapper />}
      />
    </div>
  )

🚨MessageSearchモジュールで2文字以上のひらがな検索ができない

対象コンポーネント

https://sendbird.com/docs/chat/uikit/v3/react/modules/message-search

事象

  • ひらがな2文字以上で検索すると条件にマッチするメッセージがヒットしない(1文字ならヒットする)
  • カタカナは2文字以上でもヒットする

MessageSearch

対応策

日本語検索を前提とする場合、現状MessageSearchモジュールの利用は難しいと感じます。
単一グループ内の検索であれば、PlatformAPIのsearchMessagesAPIを利用してコンポーネントごと開発するという方法が考えられます。

https://sendbird.com/docs/chat/platform-api/v3/message/message-search/search-messages

🚨Group channel settingsのLeaveChannelコンポーネントでUncaught Errorが発生する

該当CHANGELOG

https://github.com/sendbird/sendbird-uikit-react/blob/5fbf631b291b5455646ee5cc27bee8420f5e4f2c/CHANGELOG.md#L18

事象

Group-channel-settingsコンポーネントを利用し、レンダリングさせようとすることで以下のエラーが発生します。
厳密に言うと、Group-channel-settings内のleavechannelレンダリング時に発生します。

console.log
react-dom.development.js:14169 Uncaught Error: MenuItemAction(...):
 Nothing was returned from render. This usually means a return statement is missing.
 Or, to render nothing, return null.

これはサンプルアプリケーション上では発生しておらず、GroupChannelUIなど他コンポーネントのカスタマイズとの組み合わせで発生します。

対応策

renderLeaveChannelでleavechannelコンポーネントをカスタマイズしてあげれば回避することができます。

sample.ts
<ChannelSettingsProvider
  channelUrl={channel.url}
  onCloseClick={() => onCloseClickAction()}
>
  <ChannelSettingsUI
    renderLeaveChannel={() => <Box/>}
  />
</ChannelSettingsProvider>

🚨Group channel listのチャンネル取得が不安定(時々no channels)になる

これはバージョンは3.15.3に上げる前に3.14.14を利用していた時発生していました。
直近の3.15.3リリースで修正がなされたので良かったですが、このようにクリティカルな問題もちらほらありそうです。

Fixed the issue where the channel list appears empty when the UIKit is rendered for the first time.

https://github.com/sendbird/sendbird-uikit-react/pull/1220

感想

今回はGroupChannel周りのモジュールを中心に触っていましたが、アプリケーションに組み込むにはところどころクリティカルな問題がまだ残っているように感じました。OpenChannel側は触っていないので、GroupChannel側でこれだけ問題があるとすれば、全体としてはまだ未成熟感があるのかなあと思います。

とはいえ、UIKitを利用することによって結果的にアプリケーションへの組み込みはかなり早くなったと感じます。
全てスクラッチで構築しようとすると、動画のプレビューやリプライ(スレッド)表示、リアクション(スタンプ)、既読表示など、チャット画面だけでも開発しなければいけない細かな部分が沢山あります。
コンポーネント単位でカスタマイズできるようになっているので、うまくスクラッチしていく部分と組み合わせて使いこなしていくのが良いかと思います。

また、MessageSearchモジュールやMessageInputWrapperコンポーネントでの問題など日本語対応が遅れているようにも見受けられますが、Localization機能におけるテキストの置き換えなど抜け漏れはなさそうでしたし、sendbird社と打ち合わせをする際にも日本語ネイティブな通訳を用意してくださったりとかなり気を遣ってくれているように感じました。

GitHubで編集を提案

Discussion