Skip to content

Commit b072edb

Browse files
authored
Merge pull request #1123 from GetStream/send-message-update
Send message update
2 parents b9bb892 + 55c4ae8 commit b072edb

File tree

11 files changed

+90
-27
lines changed

11 files changed

+90
-27
lines changed

CHANGELOG.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44

55
### Feature
66

7-
- Add option to pass `customMessageData` to the `ChannelActionContext` `sendMessage` function [#1121](https://github.com/GetStream/stream-chat-react/pull/1121)
7+
- Add option to pass `customMessageData` to the `ChannelActionContext` `sendMessage` function [#1121](https://github.com/GetStream/stream-chat-react/pull/1123)
88

99
### Chore
1010

docusaurus/docs/React/contexts/channel-action-context.mdx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -100,15 +100,15 @@ The function to remove a `message` from `MessageList`, handled by the `Channel`
100100

101101
### retrySendMessage
102102

103-
The function to resend a `message`, handled by the `Channel` component. Takes a `message` object.
103+
The function to resend a `message`, handled by the `Channel` component.
104104

105105
| Type |
106106
| -------- |
107107
| function |
108108

109109
### sendMessage
110110

111-
The function to send a `message` on `Channel`, takes a `message` object.
111+
The function to send a `message` on `Channel`. Takes a `message` object with the basic message information as the first argument, and custom data as the second argument.
112112

113113
| Type |
114114
| -------- |

docusaurus/docs/React/contexts/message-input-context.mdx

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -202,9 +202,9 @@ Opens the `EmojiPicker` component on Enter or Spacebar key down.
202202

203203
Function that runs onSubmit to the underlying `textarea` component.
204204

205-
| Type |
206-
| ----------------------------------------- |
207-
| (event: React.BaseSyntheticEvent) => void |
205+
| Type |
206+
| --------------------------------------------------------------------- |
207+
| (event: React.BaseSyntheticEvent, customMessageData?: Message) => void |
208208

209209
### imageOrder
210210

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
import React from "react"
2+
3+
import {
4+
ChannelHeader,
5+
MessageList,
6+
MessageInput,
7+
Thread,
8+
Window,
9+
} from 'stream-chat-react';
10+
11+
export const ChannelInner = () => {
12+
return (
13+
<>
14+
<Window>
15+
<ChannelHeader />
16+
<MessageList />
17+
<MessageInput focus />
18+
</Window>
19+
<Thread />
20+
</>
21+
)
22+
}

src/components/Channel/Channel.tsx

Lines changed: 12 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -569,6 +569,7 @@ const ChannelInner = <
569569
message:
570570
| MessageToSend<At, Ch, Co, Ev, Me, Re, Us>
571571
| StreamMessage<At, Ch, Co, Ev, Me, Re, Us>,
572+
customMessageData?: Partial<Message<At, Me, Us>>,
572573
) => {
573574
if (!channel) return;
574575

@@ -586,6 +587,7 @@ const ChannelInner = <
586587
parent_id,
587588
quoted_message_id: quotedMessage?.id,
588589
text,
590+
...customMessageData,
589591
} as Message<At, Me, Us>;
590592

591593
try {
@@ -650,12 +652,15 @@ const ChannelInner = <
650652
);
651653

652654
const sendMessage = useCallback(
653-
async ({
654-
attachments = [],
655-
mentioned_users = [],
656-
parent = undefined,
657-
text = '',
658-
}: MessageToSend<At, Ch, Co, Ev, Me, Re, Us>) => {
655+
async (
656+
{
657+
attachments = [],
658+
mentioned_users = [],
659+
parent = undefined,
660+
text = '',
661+
}: MessageToSend<At, Ch, Co, Ev, Me, Re, Us>,
662+
customMessageData?: Partial<Message<At, Me, Us>>,
663+
) => {
659664
if (!channel) return;
660665

661666
// remove error messages upon submit
@@ -667,7 +672,7 @@ const ChannelInner = <
667672
// first we add the message to the UI
668673
updateMessage(messagePreview);
669674

670-
await doSendMessage(messagePreview);
675+
await doSendMessage(messagePreview, customMessageData);
671676
},
672677
[channel?.state, createMessagePreview, doSendMessage, updateMessage],
673678
);

src/components/MessageInput/hooks/useMessageInputState.ts

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ import { usePasteHandler } from './usePasteHandler';
1212

1313
import type { EmojiData, NimbleEmojiIndex } from 'emoji-mart';
1414
import type { FileLike } from 'react-file-utils';
15-
import type { Attachment, UserResponse } from 'stream-chat';
15+
import type { Attachment, Message, UserResponse } from 'stream-chat';
1616

1717
import type { MessageInputProps } from '../MessageInput';
1818

@@ -122,12 +122,19 @@ export type MessageInputReducerAction<Us extends DefaultUserType<Us> = DefaultUs
122122
| RemoveFileUploadAction
123123
| AddMentionedUserAction<Us>;
124124

125-
export type MessageInputHookProps<Us extends DefaultUserType<Us> = DefaultUserType> = {
125+
export type MessageInputHookProps<
126+
At extends DefaultAttachmentType = DefaultAttachmentType,
127+
Me extends DefaultMessageType = DefaultMessageType,
128+
Us extends DefaultUserType<Us> = DefaultUserType
129+
> = {
126130
closeEmojiPicker: React.MouseEventHandler<HTMLElement>;
127131
emojiPickerRef: React.MutableRefObject<HTMLDivElement | null>;
128132
handleChange: React.ChangeEventHandler<HTMLTextAreaElement>;
129133
handleEmojiKeyDown: React.KeyboardEventHandler<HTMLSpanElement>;
130-
handleSubmit: (event: React.BaseSyntheticEvent) => void;
134+
handleSubmit: (
135+
event: React.BaseSyntheticEvent,
136+
customMessageData?: Partial<Message<At, Me, Us>>,
137+
) => void;
131138
insertText: (textToInsert: string) => void;
132139
isUploadEnabled: boolean;
133140
maxFilesLeft: number;
@@ -344,7 +351,7 @@ export const useMessageInputState = <
344351
V extends CustomTrigger = CustomTrigger
345352
>(
346353
props: MessageInputProps<At, Ch, Co, Ev, Me, Re, Us, V>,
347-
): MessageInputState<At, Us> & MessageInputHookProps<Us> & CommandsListState => {
354+
): MessageInputState<At, Us> & MessageInputHookProps<At, Me, Us> & CommandsListState => {
348355
const { message } = props;
349356

350357
const { channel } = useChannelStateContext<At, Ch, Co, Ev, Me, Re, Us>();

src/components/MessageInput/hooks/useSubmitHandler.ts

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ import { useChannelActionContext } from '../../../context/ChannelActionContext';
22
import { useChannelStateContext } from '../../../context/ChannelStateContext';
33
import { useTranslationContext } from '../../../context/TranslationContext';
44

5-
import type { Attachment, UpdatedMessage } from 'stream-chat';
5+
import type { Attachment, Message, UpdatedMessage } from 'stream-chat';
66

77
import type { MessageInputReducerAction, MessageInputState } from './useMessageInputState';
88
import type { MessageInputProps } from '../MessageInput';
@@ -102,7 +102,10 @@ export const useSubmitHandler = <
102102
];
103103
};
104104

105-
const handleSubmit = async (event: React.BaseSyntheticEvent) => {
105+
const handleSubmit = async (
106+
event: React.BaseSyntheticEvent,
107+
customMessageData?: Partial<Message<At, Me, Us>>,
108+
) => {
106109
event.preventDefault();
107110

108111
const trimmedMessage = text.trim();
@@ -171,7 +174,13 @@ export const useSubmitHandler = <
171174
channel.cid,
172175
);
173176
} else {
174-
await sendMessage({ ...updatedMessage, parent });
177+
await sendMessage(
178+
{
179+
...updatedMessage,
180+
parent,
181+
},
182+
customMessageData,
183+
);
175184
}
176185

177186
if (publishTypingEvent) await channel.stopTyping();

src/components/MessageInput/icons.tsx

Lines changed: 20 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,10 @@ import React from 'react';
22

33
import { useTranslationContext } from '../../context/TranslationContext';
44

5+
import type { Message } from 'stream-chat';
6+
7+
import type { DefaultAttachmentType, DefaultMessageType, DefaultUserType } from '../../types/types';
8+
59
export const EmojiIconLarge: React.FC = () => {
610
const { t } = useTranslationContext();
711

@@ -56,12 +60,24 @@ export const FileUploadIconFlat: React.FC = () => {
5660
);
5761
};
5862

59-
export type SendButtonProps = {
60-
/** Function to send a message to the currently active channel */
61-
sendMessage: (event: React.BaseSyntheticEvent) => void;
63+
export type SendButtonProps<
64+
At extends DefaultAttachmentType = DefaultAttachmentType,
65+
Me extends DefaultMessageType = DefaultMessageType,
66+
Us extends DefaultUserType<Us> = DefaultUserType
67+
> = {
68+
sendMessage: (
69+
event: React.BaseSyntheticEvent,
70+
customMessageData?: Partial<Message<At, Me, Us>>,
71+
) => void;
6272
};
6373

64-
export const SendButton: React.FC<SendButtonProps> = ({ sendMessage }) => {
74+
export const SendButton = <
75+
At extends DefaultAttachmentType = DefaultAttachmentType,
76+
Me extends DefaultMessageType = DefaultMessageType,
77+
Us extends DefaultUserType<Us> = DefaultUserType
78+
>({
79+
sendMessage,
80+
}: SendButtonProps<At, Me, Us>) => {
6581
const { t } = useTranslationContext();
6682

6783
return (

src/context/ChannelActionContext.tsx

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ import React, { PropsWithChildren, useContext } from 'react';
22

33
import type {
44
Attachment,
5+
Message,
56
UpdatedMessage,
67
UpdateMessageAPIResponse,
78
UserResponse,
@@ -81,7 +82,10 @@ export type ChannelActionContextValue<
8182
) => void;
8283
removeMessage: (message: StreamMessage<At, Ch, Co, Ev, Me, Re, Us>) => void;
8384
retrySendMessage: RetrySendMessage<At, Ch, Co, Ev, Me, Re, Us>;
84-
sendMessage: (message: MessageToSend<At, Ch, Co, Ev, Me, Re, Us>) => Promise<void>;
85+
sendMessage: (
86+
message: MessageToSend<At, Ch, Co, Ev, Me, Re, Us>,
87+
customMessageData?: Partial<Message<At, Me, Us>>,
88+
) => Promise<void>;
8589
setQuotedMessage: React.Dispatch<
8690
React.SetStateAction<StreamMessage<At, Ch, Co, Ev, Me, Re, Us> | undefined>
8791
>;

src/context/ComponentContext.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -81,7 +81,7 @@ export type ComponentContextValue<
8181
QuotedMessagePreview?: React.ComponentType<QuotedMessagePreviewProps<At, Ch, Co, Ev, Me, Re, Us>>;
8282
ReactionSelector?: React.ForwardRefExoticComponent<ReactionSelectorProps<Re, Us>>;
8383
ReactionsList?: React.ComponentType<ReactionsListProps<Re, Us>>;
84-
SendButton?: React.ComponentType<SendButtonProps>;
84+
SendButton?: React.ComponentType<SendButtonProps<At, Me, Us>>;
8585
ThreadHeader?: React.ComponentType<ThreadHeaderProps<At, Ch, Co, Ev, Me, Re, Us>>;
8686
ThreadInput?: React.ComponentType<MessageInputProps<At, Ch, Co, Ev, Me, Re, Us, V>>;
8787
ThreadStart?: React.ComponentType;

0 commit comments

Comments
 (0)