Custom MessageList

This UI Cookbook shows how to achieve custom UI using MessageList.

Live-stream implementation using MessageList

There are two common scenarios in live-stream applications.

LivestreamExample1

LivestreamExample2

Faded chat with video as backgroundSplit screen between video and chat

Here is how you can implement these two use cases:

Faded chat with video as background

import React from "react";
import { SafeAreaView, StyleSheet, View } from "react-native";

// Make sure you have installed following two dependencies
import MaskedView from "@react-native-community/masked-view";
import LinearGradient from "react-native-linear-gradient";

import { Chat, Channel, MessageList } from "stream-chat-react-native";

const theme = {
  messageList: {
    container: {
      backgroundColor: "transparent",
    },
  },
  messageSimple: {
    content: {
      textContainer: {
        backgroundColor: "white",
      },
    },
  },
};

// When you render your chat screen
<SafeAreaView style={{ flex: 1 }}>
  {/* For the sake of example, we are using image as background, you can replace it with your Video component. */}
  <Image
    source={{
      uri: "https://i.pinimg.com/474x/59/a2/aa/59a2aae82b34bace9dc4d4df90457a3b.jpg",
    }}
    style={{ height: "100%", width: "100%" }}
  />

  <View style={[{ position: "absolute" }, StyleSheet.absoluteFillObject]}>
    <Chat client={chatClient} style={theme}>
      <Channel
        channel={channel}
        keyboardVerticalOffset={headerHeight}
        thread={thread}
      >
        <View style={{ flex: 1 }} />
        <View style={{ flex: 2 }}>
          <MaskedView
            style={{ flex: 1 }}
            maskElement={
              <LinearGradient
                colors={["rgba(0,0,0,0)", "rgba(0,0,0,1)"]}
                style={{
                  flex: 1,
                }}
                start={{ x: 0, y: 0 }}
                end={{ x: 0, y: 1 }}
                locations={[0, 0.5]}
              />
            }
          >
            <MessageList />
          </MaskedView>
        </View>
        <MessageInput />
      </Channel>
    </Chat>
  </View>
</SafeAreaView>;

Split screen between video and chat

import React from "react";
import { SafeAreaView, StyleSheet, View } from "react-native";

import { Chat, Channel, MessageList } from "stream-chat-react-native";

// When you render your chat screen
<SafeAreaView style={{ flex: 1 }}>
  <View style={[{ position: "absolute" }, StyleSheet.absoluteFillObject]}>
    <Chat client={chatClient} i18nInstance={streami18n}>
      <Channel
        channel={channel}
        keyboardVerticalOffset={headerHeight}
        thread={thread}
      >
        <View style={{ flex: 1 }}>
          <Image
            source={{
              uri: "https://i.ibb.co/rfx5PCr/Screenshot-2021-02-24-at-14-20-57.png",
            }}
            style={{ height: "100%", width: "100%" }}
            resizeMode={"cover"}
          />
        </View>
        <MessageList
          onThreadSelect={(thread) => {
            setThread(thread);
            navigation.navigate("Thread");
          }}
        />
        <MessageInput />
      </Channel>
    </Chat>
  </View>
</SafeAreaView>;
© Getstream.io, Inc. All Rights Reserved.