50 lines
1.5 KiB
TypeScript
50 lines
1.5 KiB
TypeScript
import { useEffect, useRef } from "react";
|
|
import { SubmitKey, useAppConfig } from "../store/config";
|
|
|
|
export default function useSubmitHandler() {
|
|
const config = useAppConfig();
|
|
const submitKey = config.submitKey;
|
|
const isComposing = useRef(false);
|
|
|
|
useEffect(() => {
|
|
const onCompositionStart = () => {
|
|
isComposing.current = true;
|
|
};
|
|
const onCompositionEnd = () => {
|
|
isComposing.current = false;
|
|
};
|
|
|
|
window.addEventListener("compositionstart", onCompositionStart);
|
|
window.addEventListener("compositionend", onCompositionEnd);
|
|
|
|
return () => {
|
|
window.removeEventListener("compositionstart", onCompositionStart);
|
|
window.removeEventListener("compositionend", onCompositionEnd);
|
|
};
|
|
}, []);
|
|
|
|
const shouldSubmit = (e: React.KeyboardEvent<HTMLTextAreaElement>) => {
|
|
// Fix Chinese input method "Enter" on Safari
|
|
if (e.keyCode == 229) return false;
|
|
if (e.key !== "Enter") return false;
|
|
if (e.key === "Enter" && (e.nativeEvent.isComposing || isComposing.current))
|
|
return false;
|
|
return (
|
|
(config.submitKey === SubmitKey.AltEnter && e.altKey) ||
|
|
(config.submitKey === SubmitKey.CtrlEnter && e.ctrlKey) ||
|
|
(config.submitKey === SubmitKey.ShiftEnter && e.shiftKey) ||
|
|
(config.submitKey === SubmitKey.MetaEnter && e.metaKey) ||
|
|
(config.submitKey === SubmitKey.Enter &&
|
|
!e.altKey &&
|
|
!e.ctrlKey &&
|
|
!e.shiftKey &&
|
|
!e.metaKey)
|
|
);
|
|
};
|
|
|
|
return {
|
|
submitKey,
|
|
shouldSubmit,
|
|
};
|
|
}
|