72 lines
1.9 KiB
TypeScript
Raw Normal View History

import { ChangeEvent, KeyboardEvent, useEffect, useState } from "react";
import { useWaku } from "@waku/react";
import { LightNode } from "@waku/interfaces";
2023-08-03 13:23:17 +05:30
import { MessageInputProps } from "./types";
2022-06-17 10:48:15 +10:00
2023-08-03 13:23:17 +05:30
export default function MessageInput(props: MessageInputProps) {
const { hasLightPushPeers } = props;
const { node } = useWaku<LightNode>();
2022-06-17 10:48:15 +10:00
const [inputText, setInputText] = useState<string>("");
const [isActive, setActiveButton] = useState<boolean>(false);
2022-06-17 10:48:15 +10:00
const onMessage = async () => {
if (props.sendMessage && inputText) {
try {
await props.sendMessage(inputText);
} catch (e) {
console.error(`Failed to send message: ${e}`);
}
2022-06-17 10:48:15 +10:00
setInputText("");
}
};
const onChange = (event: ChangeEvent<HTMLInputElement>) => {
event.preventDefault();
2022-06-17 10:48:15 +10:00
setInputText(event.target.value);
};
const onKeyDown = async (event: KeyboardEvent<HTMLInputElement>) => {
2022-06-17 10:48:15 +10:00
if (
isActive &&
2022-06-17 10:48:15 +10:00
event.key === "Enter" &&
!event.altKey &&
!event.ctrlKey &&
!event.shiftKey
) {
await onMessage();
2022-06-17 10:48:15 +10:00
}
};
// Enable the button if there are peers available or the user is sending a command
useEffect(() => {
if (inputText.startsWith("/") || hasLightPushPeers) {
setActiveButton(true);
} else if (node) {
setActiveButton(false);
}
}, [node, inputText, hasLightPushPeers]);
2022-06-17 10:48:15 +10:00
return (
<div className="flex p-2">
<input
type="text"
value={inputText}
onChange={onChange}
onKeyDown={onKeyDown}
className="flex-grow p-2 border border-gray-300 rounded-l-md"
placeholder="Type your message..."
/>
<button
onClick={onMessage}
className={`flex-none px-4 py-2 text-white ${
isActive ? "bg-blue-500" : "bg-blue-300 cursor-not-allowed"
} rounded-r-md`}
disabled={!isActive}
>
Send
</button>
</div>
2022-06-17 10:48:15 +10:00
);
}