feat: supports keyboard shortcuts with immediate effect (#316)

* feat: supports keyboard shortcuts with immediate effect

* feat: customize mode switching shortcuts

* refactor: remove the shift

* fix: voice input audio input device number anomaly issue

* feat: support for changing the focus state of the input box

* refactor: shortcuts for handling input box focus separately

* feat: upload file support shortcuts

* refactor: the connection timeout is specified with the variable

* refactor: shortcut keys to modify the input box before displaying modifier keys

* docs: update changelog

* style: remove useless import

* refactor: window focus changes modifier key press status to false

* refactor: correcting errors of judgment

* docs: update changelog
This commit is contained in:
ayangweb
2025-03-31 17:07:34 +08:00
committed by GitHub
parent 0c42a51cb5
commit 89a763dff7
13 changed files with 309 additions and 139 deletions

View File

@@ -1,16 +1,23 @@
import { useCallback } from "react";
import { useCallback, useEffect } from "react";
import SearchChat from "@/pages/web/SearchChat";
import platformAdapter from "@/utils/platformAdapter";
import { useShortcutsStore } from "@/stores/shortcutsStore";
import { useStartupStore } from "@/stores/startupStore";
import { useKeyPress } from "ahooks";
import { modifierKeys } from "@/components/Settings/Advanced/components/Shortcuts";
function MainApp() {
const querySearch = useCallback(async (input: string) => {
try {
const response: any = await platformAdapter.invokeBackend("query_coco_fusion", {
from: 0,
size: 10,
queryStrings: { query: input },
});
const response: any = await platformAdapter.invokeBackend(
"query_coco_fusion",
{
from: 0,
size: 10,
queryStrings: { query: input },
}
);
return response;
} catch (error) {
console.error("query_coco_fusion error:", error);
@@ -21,11 +28,14 @@ function MainApp() {
const queryDocuments = useCallback(
async (from: number, size: number, queryStrings: any) => {
try {
const response: any = await platformAdapter.invokeBackend("query_coco_fusion", {
from,
size,
queryStrings,
});
const response: any = await platformAdapter.invokeBackend(
"query_coco_fusion",
{
from,
size,
queryStrings,
}
);
return response;
} catch (error) {
console.error("query_coco_fusion error:", error);
@@ -34,13 +44,92 @@ function MainApp() {
},
[]
);
const modifierKey = useShortcutsStore((state) => {
return state.modifierKey;
});
const setModifierKey = useShortcutsStore((state) => {
return state.setModifierKey;
});
const setModifierKeyPressed = useShortcutsStore((state) => {
return state.setModifierKeyPressed;
});
const setModeSwitch = useShortcutsStore((state) => {
return state.setModeSwitch;
});
const setReturnToInput = useShortcutsStore((state) => {
return state.setReturnToInput;
});
const setVoiceInput = useShortcutsStore((state) => {
return state.setVoiceInput;
});
const setAddImage = useShortcutsStore((state) => {
return state.setAddImage;
});
const setAddFile = useShortcutsStore((state) => {
return state.setAddFile;
});
const setDefaultStartupWindow = useStartupStore((state) => {
return state.setDefaultStartupWindow;
});
const setDefaultContentForSearchWindow = useStartupStore((state) => {
return state.setDefaultContentForSearchWindow;
});
const setDefaultContentForChatWindow = useStartupStore((state) => {
return state.setDefaultContentForChatWindow;
});
useEffect(() => {
const unListeners = Promise.all([
platformAdapter.listenEvent("change-shortcuts-store", ({ payload }) => {
const {
modifierKey,
modeSwitch,
returnToInput,
voiceInput,
addImage,
addFile,
} = payload;
setModifierKey(modifierKey);
setModeSwitch(modeSwitch);
setReturnToInput(returnToInput);
setVoiceInput(voiceInput);
setAddImage(addImage);
setAddFile(addFile);
}),
platformAdapter.listenEvent("change-startup-store", ({ payload }) => {
const {
defaultStartupWindow,
defaultContentForSearchWindow,
defaultContentForChatWindow,
} = payload;
setDefaultStartupWindow(defaultStartupWindow);
setDefaultContentForSearchWindow(defaultContentForSearchWindow);
setDefaultContentForChatWindow(defaultContentForChatWindow);
}),
]);
return () => {
unListeners.then((fns) => {
fns.forEach((fn) => fn());
});
};
}, []);
useKeyPress(
modifierKeys,
(event, key) => {
if (key === modifierKey) {
setModifierKeyPressed(event.type === "keydown");
}
},
{
events: ["keydown", "keyup"],
}
);
return (
<SearchChat
querySearch={querySearch}
queryDocuments={queryDocuments}
/>
<SearchChat querySearch={querySearch} queryDocuments={queryDocuments} />
);
}