mirror of
https://github.com/wavetermdev/waveterm
synced 2026-05-06 06:58:21 +00:00
A couple small things: - make the timer more robust in case of a timing issue where the timer skips 0 - make the x button in the corner work - style the title to stand out The title will need more styling in the future, but this is still an improvement.
123 lines
4.2 KiB
TypeScript
123 lines
4.2 KiB
TypeScript
// Copyright 2024, Command Line Inc.
|
|
// SPDX-License-Identifier: Apache-2.0
|
|
|
|
import { Modal } from "@/app/modals/modal";
|
|
import { Markdown } from "@/element/markdown";
|
|
import { modalsModel } from "@/store/modalmodel";
|
|
import * as keyutil from "@/util/keyutil";
|
|
import { UserInputService } from "../store/services";
|
|
|
|
import { useCallback, useEffect, useMemo, useRef, useState } from "react";
|
|
import "./userinputmodal.less";
|
|
|
|
const UserInputModal = (userInputRequest: UserInputRequest) => {
|
|
const [responseText, setResponseText] = useState("");
|
|
const [countdown, setCountdown] = useState(Math.floor(userInputRequest.timeoutms / 1000));
|
|
const checkboxStatus = useRef(false);
|
|
|
|
const handleSendCancel = useCallback(() => {
|
|
UserInputService.SendUserInputResponse({
|
|
type: "userinputresp",
|
|
requestid: userInputRequest.requestid,
|
|
errormsg: "Canceled by the user",
|
|
});
|
|
modalsModel.popModal();
|
|
}, [responseText, userInputRequest]);
|
|
|
|
const handleSendText = useCallback(() => {
|
|
UserInputService.SendUserInputResponse({
|
|
type: "userinputresp",
|
|
requestid: userInputRequest.requestid,
|
|
text: responseText,
|
|
checkboxstat: checkboxStatus.current,
|
|
});
|
|
modalsModel.popModal();
|
|
}, [responseText, userInputRequest]);
|
|
|
|
const handleSendConfirm = useCallback(() => {
|
|
UserInputService.SendUserInputResponse({
|
|
type: "userinputresp",
|
|
requestid: userInputRequest.requestid,
|
|
confirm: true,
|
|
checkboxstat: checkboxStatus.current,
|
|
});
|
|
modalsModel.popModal();
|
|
}, [userInputRequest]);
|
|
|
|
const handleSubmit = useCallback(() => {
|
|
switch (userInputRequest.responsetype) {
|
|
case "text":
|
|
handleSendText();
|
|
break;
|
|
case "confirm":
|
|
handleSendConfirm();
|
|
break;
|
|
}
|
|
}, [handleSendConfirm, handleSendText, userInputRequest.responsetype]);
|
|
|
|
const handleKeyDown = useCallback(
|
|
(waveEvent: WaveKeyboardEvent): boolean => {
|
|
if (keyutil.checkKeyPressed(waveEvent, "Escape")) {
|
|
handleSendCancel();
|
|
return;
|
|
}
|
|
if (keyutil.checkKeyPressed(waveEvent, "Enter")) {
|
|
handleSubmit();
|
|
return true;
|
|
}
|
|
},
|
|
[handleSendCancel, handleSubmit]
|
|
);
|
|
|
|
const queryText = useMemo(() => {
|
|
if (userInputRequest.markdown) {
|
|
return <Markdown text={userInputRequest.querytext} className="userinput-markdown" />;
|
|
}
|
|
return <span className="userinput-text">{userInputRequest.querytext}</span>;
|
|
}, [userInputRequest.markdown, userInputRequest.querytext]);
|
|
|
|
const inputBox = useMemo(() => {
|
|
if (userInputRequest.responsetype === "confirm") {
|
|
return <></>;
|
|
}
|
|
return (
|
|
<input
|
|
type={userInputRequest.publictext ? "text" : "password"}
|
|
onChange={(e) => setResponseText(e.target.value)}
|
|
value={responseText}
|
|
maxLength={400}
|
|
className="userinput-inputbox"
|
|
autoFocus={true}
|
|
onKeyDown={(e) => keyutil.keydownWrapper(handleKeyDown)(e)}
|
|
/>
|
|
);
|
|
}, [userInputRequest.responsetype, userInputRequest.publictext, responseText, handleKeyDown, setResponseText]);
|
|
|
|
useEffect(() => {
|
|
let timeout: ReturnType<typeof setTimeout>;
|
|
if (countdown <= 0) {
|
|
timeout = setTimeout(() => {
|
|
handleSendCancel();
|
|
}, 300);
|
|
} else {
|
|
timeout = setTimeout(() => {
|
|
setCountdown(countdown - 1);
|
|
}, 1000);
|
|
}
|
|
return () => clearTimeout(timeout);
|
|
}, [countdown]);
|
|
|
|
return (
|
|
<Modal onOk={() => handleSubmit()} onCancel={() => handleSendCancel()} onClose={() => handleSendCancel()}>
|
|
<div className="userinput-header">{userInputRequest.title + ` (${countdown}s)`}</div>
|
|
<div className="userinput-body">
|
|
{queryText}
|
|
{inputBox}
|
|
</div>
|
|
</Modal>
|
|
);
|
|
};
|
|
|
|
UserInputModal.displayName = "UserInputModal";
|
|
|
|
export { UserInputModal };
|