Chat ui for React Native
- discord/bottom-sheet
- react-native-keyboard-controller
- react-native-image-picker
- react-native-gesture-handler
- react-native-reanimated
- react-native-tab-view
- react-native-video
- @shopify/flash-list
npm install @vokhuyet/react-native-messy
or
yarn add @vokhuyet/react-native-messy
import { Messy } from '@vokhuyet/react-native-messy';
// ...
const [list, setList] = useState([]);
<Messy
messages={list}
loading={isLoading}
BaseModule={{
Cache: CacheDimension,
Image: ChatListImage,
Text: AppText,
}}
renderLoading={renderLoading}
renderMessageSystem={ChatListMessageSystem}
listProps={{
onEndReached,
ListHeaderComponent: ChatListHeader,
}}
messageProps={{
hideOwnerAvatar: true,
hidePartnerAvatar: false,
onPress: onPressMessage,
onLongPress: onLongPressMessage,
}}
user={{id: account?.user?.id}}
footerProps={{
hideEmoji: false;
hideFooterAction: false;
Send: <Image source={require('NewSendIcon.png')} />
onSend,
ExtraLeft: <ChatListExtraLeft />,
ExtraActionLeft: <ChatListExtraActionLeft />,
}}
/>
name: string;
image: ImageProps['source'];
latitude: string;
longitude: string;
id?: string | number | null;
text?: string;
image?: ImageSourcePropType;
video?: { uri: string };
audio?: {uri: string}; // not implemented, you can implement by yourself
location?: TMessyMessageLocation;
user?: TUser;
type?: 'system' | 'message';
createdTime?: Date | number | string;
status?: 'sending' | 'sent' | 'seen';
seenBy?: TUser[];
local?: Asset;
clientId?: string; // used for display message in List before receiving response from Server
category?: string; // used for display multiple type of system message
background: string;
primary: string;
accent: string;
placeholder: string;
shadow: string;
success: string;
message_left: {
background: string;
text: string;
link: string;
email: string;
phone: string;
audio: string;
}
message_right: {
background: string;
text: string;
link: string;
email: string;
phone: string;
audio: string;
}
input: {
text: string; //text color in TextInput
}
id: string | number | null | undefined;
userName?: string | null;
avatar?: ImageSource;
hideEmoji?: boolean;
hideFooterAction?: boolean;
Send?: React.ReactNode;
onSend?: (message?: TMessyMessage) => Promise<void> | void;
inputProps?: TextInputProps;
ExtraLeft?: React.ReactNode;
ExtraActionLeft?: React.ReactNode;
renderFooter?: FC<TMessyFooterProps>;
hideOwnerAvatar: boolean;
hidePartnerAvatar: boolean;
onPress?: (message: TMessyMessageProps) => Promise<void> | void;
onLongPress?: (message: TMessyMessageProps) => Promise<void> | void;
Image?: FC<ImageProps>;
Text?: FC<TextProps>;
Video?: FC;
Cache: {
get: (key: string) => any;
set: (key: string, value: any) => void;
};
loading
(boolean): loading statusmessages
(TMessyMessage[]): list of messagesuser
(TUser): sender information;theme
: (TColor): custom theme for message;footerProps
(TMessyFooterProps): Custom props for Element below list messages;listProps
(TListProps): custom flatlist props;messageProps
(TMessageProps): ;parsedShape
(ParseShape[]): Custom parse patterns for react-native-parsed-text ;showDateTime
(boolean): show created time of message;renderLoading
(FC<{}>): component when loading list message;renderMessageSystem
(FC<{ data?: TMessyMessage }>): custom system message;renderMessage
((data: TMessyMessageProps) => JSX.Element): custom whole message item view;renderAvatar
FC<{ user?: TUser }>: custom ;renderMessageText
((data: TMessyMessageProps) => JSX.Element): custom text message;renderMessageAudio
(data: TMessyMessageProps) => JSX.Element;renderMessageImage
(data: TMessyMessageProps) => JSX.Element;renderMessageVideo
(data: TMessyMessageProps) => JSX.Element;renderMessageDateTime
((data: TMessyMessage) => JSX.Element): custom datetime value in message itemrenderMessageLocation
: (data: TMessyMessageProps) => JSX.Element;renderMessageOther
(data: TMessyMessageProps) => JSX.Element: Customize other message types that the library does not yet supportBaseModule
(TBaseModule);
See the contributing guide to learn how to contribute to the repository and the development workflow.
MIT
Made with create-react-native-library