js-waku/examples/web-chat/src/MessageInput.tsx

64 lines
1.4 KiB
TypeScript
Raw Normal View History

import { ChangeEvent, KeyboardEvent, useState } from 'react';
2021-04-22 17:05:19 +10:00
import { useWaku } from './WakuContext';
import {
TextInput,
TextComposer,
Row,
Fill,
Fit,
SendButton,
} from '@livechat/ui-kit';
2021-04-19 13:33:23 +10:00
interface Props {
sendMessage: ((msg: string) => Promise<void>) | undefined;
2021-04-19 13:33:23 +10:00
}
2021-04-22 17:01:46 +10:00
export default function MessageInput(props: Props) {
2021-04-22 17:02:10 +10:00
const [inputText, setInputText] = useState<string>('');
2021-04-22 17:05:19 +10:00
const { waku } = useWaku();
2021-04-19 13:33:23 +10:00
2021-04-27 13:36:25 +10:00
const sendMessage = async () => {
if (props.sendMessage) {
await props.sendMessage(inputText);
2021-04-27 13:36:25 +10:00
setInputText('');
}
2021-04-22 17:02:10 +10:00
};
2021-04-19 13:33:23 +10:00
2021-04-22 17:01:46 +10:00
const messageHandler = (event: ChangeEvent<HTMLInputElement>) => {
2021-04-22 17:02:10 +10:00
setInputText(event.target.value);
2021-04-22 17:01:46 +10:00
};
2021-04-19 13:33:23 +10:00
2021-04-27 13:36:25 +10:00
const keyPressHandler = async (event: KeyboardEvent<HTMLInputElement>) => {
if (
event.key === 'Enter' &&
!event.altKey &&
!event.ctrlKey &&
!event.shiftKey
) {
2021-04-27 13:36:25 +10:00
await sendMessage();
2021-04-22 15:11:37 +10:00
}
2021-04-22 17:02:10 +10:00
};
2021-04-22 15:11:37 +10:00
// Enable the button if there are relay peers available or the user is sending a command
const activeButton =
(waku && waku.relay.getPeers().size !== 0) || inputText.startsWith('/');
2021-04-22 17:02:10 +10:00
return (
<TextComposer
onKeyDown={keyPressHandler}
onChange={messageHandler}
active={activeButton}
onButtonClick={sendMessage}
>
<Row align="center">
<Fill>
<TextInput value={inputText} />
</Fill>
<Fit>
<SendButton />
</Fit>
</Row>
</TextComposer>
2021-04-22 17:02:10 +10:00
);
2021-04-19 13:33:23 +10:00
}