feat: Add support for handling chat input keydown events
This commit is contained in:
parent
35b8579028
commit
9679f92821
@ -14,6 +14,7 @@ import { useTranslation } from "react-i18next"
|
|||||||
import { KnowledgeSelect } from "../Knowledge/KnowledgeSelect"
|
import { KnowledgeSelect } from "../Knowledge/KnowledgeSelect"
|
||||||
import { useSpeechRecognition } from "@/hooks/useSpeechRecognition"
|
import { useSpeechRecognition } from "@/hooks/useSpeechRecognition"
|
||||||
import { PiGlobe } from "react-icons/pi"
|
import { PiGlobe } from "react-icons/pi"
|
||||||
|
import { handleChatInputKeyDown } from "@/utils/key-down"
|
||||||
|
|
||||||
type Props = {
|
type Props = {
|
||||||
dropedFile: File | undefined
|
dropedFile: File | undefined
|
||||||
@ -144,13 +145,16 @@ export const PlaygroundForm = ({ dropedFile }: Props) => {
|
|||||||
})
|
})
|
||||||
|
|
||||||
const handleKeyDown = (e: React.KeyboardEvent) => {
|
const handleKeyDown = (e: React.KeyboardEvent) => {
|
||||||
|
if (import.meta.env.BROWSER !== "firefox") {
|
||||||
if (e.key === "Process" || e.key === "229") return
|
if (e.key === "Process" || e.key === "229") return
|
||||||
|
}
|
||||||
if (
|
if (
|
||||||
!typing &&
|
handleChatInputKeyDown({
|
||||||
e.key === "Enter" &&
|
e,
|
||||||
!e.shiftKey &&
|
sendWhenEnter,
|
||||||
!isSending &&
|
typing,
|
||||||
sendWhenEnter
|
isSending
|
||||||
|
})
|
||||||
) {
|
) {
|
||||||
e.preventDefault()
|
e.preventDefault()
|
||||||
stopListening()
|
stopListening()
|
||||||
@ -244,8 +248,16 @@ export const PlaygroundForm = ({ dropedFile }: Props) => {
|
|||||||
/>
|
/>
|
||||||
<div className="w-full border-x border-t flex flex-col dark:border-gray-600 rounded-t-xl p-2">
|
<div className="w-full border-x border-t flex flex-col dark:border-gray-600 rounded-t-xl p-2">
|
||||||
<textarea
|
<textarea
|
||||||
onCompositionStart={() => setTyping(true)}
|
onCompositionStart={() => {
|
||||||
onCompositionEnd={() => setTyping(false)}
|
if (import.meta.env.BROWSER !== "firefox") {
|
||||||
|
setTyping(true)
|
||||||
|
}
|
||||||
|
}}
|
||||||
|
onCompositionEnd={() => {
|
||||||
|
if (import.meta.env.BROWSER !== "firefox") {
|
||||||
|
setTyping(false)
|
||||||
|
}
|
||||||
|
}}
|
||||||
onKeyDown={(e) => handleKeyDown(e)}
|
onKeyDown={(e) => handleKeyDown(e)}
|
||||||
ref={textareaRef}
|
ref={textareaRef}
|
||||||
className="px-2 py-2 w-full resize-none bg-transparent focus-within:outline-none focus:ring-0 focus-visible:ring-0 ring-0 dark:ring-0 border-0 dark:text-gray-100"
|
className="px-2 py-2 w-full resize-none bg-transparent focus-within:outline-none focus:ring-0 focus-visible:ring-0 ring-0 dark:ring-0 border-0 dark:text-gray-100"
|
||||||
|
@ -12,6 +12,7 @@ import { useTranslation } from "react-i18next"
|
|||||||
import { ModelSelect } from "@/components/Common/ModelSelect"
|
import { ModelSelect } from "@/components/Common/ModelSelect"
|
||||||
import { useSpeechRecognition } from "@/hooks/useSpeechRecognition"
|
import { useSpeechRecognition } from "@/hooks/useSpeechRecognition"
|
||||||
import { PiGlobeX, PiGlobe } from "react-icons/pi"
|
import { PiGlobeX, PiGlobe } from "react-icons/pi"
|
||||||
|
import { handleChatInputKeyDown } from "@/utils/key-down"
|
||||||
|
|
||||||
type Props = {
|
type Props = {
|
||||||
dropedFile: File | undefined
|
dropedFile: File | undefined
|
||||||
@ -66,11 +67,12 @@ export const SidepanelForm = ({ dropedFile }: Props) => {
|
|||||||
const handleKeyDown = (e: React.KeyboardEvent) => {
|
const handleKeyDown = (e: React.KeyboardEvent) => {
|
||||||
if (e.key === "Process" || e.key === "229") return
|
if (e.key === "Process" || e.key === "229") return
|
||||||
if (
|
if (
|
||||||
e.key === "Enter" &&
|
handleChatInputKeyDown({
|
||||||
!e.shiftKey &&
|
e,
|
||||||
!isSending &&
|
sendWhenEnter,
|
||||||
sendWhenEnter &&
|
typing,
|
||||||
!typing
|
isSending
|
||||||
|
})
|
||||||
) {
|
) {
|
||||||
e.preventDefault()
|
e.preventDefault()
|
||||||
form.onSubmit(async (value) => {
|
form.onSubmit(async (value) => {
|
||||||
@ -245,8 +247,16 @@ export const SidepanelForm = ({ dropedFile }: Props) => {
|
|||||||
rows={1}
|
rows={1}
|
||||||
style={{ minHeight: "60px" }}
|
style={{ minHeight: "60px" }}
|
||||||
tabIndex={0}
|
tabIndex={0}
|
||||||
onCompositionStart={() => setTyping(true)}
|
onCompositionStart={() => {
|
||||||
onCompositionEnd={() => setTyping(false)}
|
if (import.meta.env.BROWSER !== "firefox") {
|
||||||
|
setTyping(true)
|
||||||
|
}
|
||||||
|
}}
|
||||||
|
onCompositionEnd={() => {
|
||||||
|
if (import.meta.env.BROWSER !== "firefox") {
|
||||||
|
setTyping(false)
|
||||||
|
}
|
||||||
|
}}
|
||||||
placeholder={t("form.textarea.placeholder")}
|
placeholder={t("form.textarea.placeholder")}
|
||||||
{...form.getInputProps("message")}
|
{...form.getInputProps("message")}
|
||||||
/>
|
/>
|
||||||
|
19
src/utils/key-down.tsx
Normal file
19
src/utils/key-down.tsx
Normal file
@ -0,0 +1,19 @@
|
|||||||
|
export const handleChatInputKeyDown = ({
|
||||||
|
e,
|
||||||
|
sendWhenEnter,
|
||||||
|
typing,
|
||||||
|
isSending
|
||||||
|
}: {
|
||||||
|
e: React.KeyboardEvent
|
||||||
|
typing: boolean
|
||||||
|
sendWhenEnter: boolean
|
||||||
|
isSending: boolean
|
||||||
|
}) => {
|
||||||
|
return import.meta.env.BROWSER === "firefox"
|
||||||
|
? e.key === "Enter" &&
|
||||||
|
!e.shiftKey &&
|
||||||
|
!e.nativeEvent.isComposing &&
|
||||||
|
!isSending &&
|
||||||
|
sendWhenEnter
|
||||||
|
: !typing && e.key === "Enter" && !e.shiftKey && !isSending && sendWhenEnter
|
||||||
|
}
|
@ -50,7 +50,7 @@ export default defineConfig({
|
|||||||
outDir: "build",
|
outDir: "build",
|
||||||
|
|
||||||
manifest: {
|
manifest: {
|
||||||
version: "1.2.1",
|
version: "1.2.2",
|
||||||
name:
|
name:
|
||||||
process.env.TARGET === "firefox"
|
process.env.TARGET === "firefox"
|
||||||
? "Page Assist - A Web UI for Local AI Models"
|
? "Page Assist - A Web UI for Local AI Models"
|
||||||
|
Loading…
x
Reference in New Issue
Block a user