diff --git a/package-lock.json b/package-lock.json index 6d9aef1..31a8619 100644 --- a/package-lock.json +++ b/package-lock.json @@ -24,6 +24,7 @@ "play-sound": "^1.1.6", "qs": "^6.11.0", "run-applescript": "^6.1.0", + "swr": "^2.2.5", "tencentcloud-sdk-nodejs-tmt": "^4.0.559" }, "devDependencies": { @@ -1990,6 +1991,11 @@ "url": "https://github.com/chalk/strip-ansi?sponsor=1" } }, + "node_modules/client-only": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/client-only/-/client-only-0.0.1.tgz", + "integrity": "sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==" + }, "node_modules/cliui": { "version": "7.0.4", "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", @@ -5081,6 +5087,18 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/swr": { + "version": "2.2.5", + "resolved": "https://registry.npmjs.org/swr/-/swr-2.2.5.tgz", + "integrity": "sha512-QtxqyclFeAsxEUeZIYmsaQ0UjimSq1RZ9Un7I68/0ClKK/U3LoyQunwkQfJZr2fc22DfIXLNDc2wFyTEikCUpg==", + "dependencies": { + "client-only": "^0.0.1", + "use-sync-external-store": "^1.2.0" + }, + "peerDependencies": { + "react": "^16.11.0 || ^17.0.0 || ^18.0.0" + } + }, "node_modules/tencentcloud-sdk-nodejs-common": { "version": "4.0.559", "resolved": "https://registry.npmjs.org/tencentcloud-sdk-nodejs-common/-/tencentcloud-sdk-nodejs-common-4.0.559.tgz", @@ -5376,6 +5394,14 @@ "punycode": "^2.1.0" } }, + "node_modules/use-sync-external-store": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.2.0.tgz", + "integrity": "sha512-eEgnFxGQ1Ife9bzYs6VLi8/4X6CObHMw9Qr9tPY43iKwsPw8xE8+EFsf/2cFZ5S3esXgpWgtSCtLNS41F+sKPA==", + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + } + }, "node_modules/util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", @@ -6938,6 +6964,11 @@ } } }, + "client-only": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/client-only/-/client-only-0.0.1.tgz", + "integrity": "sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==" + }, "cliui": { "version": "7.0.4", "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", @@ -9125,6 +9156,15 @@ "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", "dev": true }, + "swr": { + "version": "2.2.5", + "resolved": "https://registry.npmjs.org/swr/-/swr-2.2.5.tgz", + "integrity": "sha512-QtxqyclFeAsxEUeZIYmsaQ0UjimSq1RZ9Un7I68/0ClKK/U3LoyQunwkQfJZr2fc22DfIXLNDc2wFyTEikCUpg==", + "requires": { + "client-only": "^0.0.1", + "use-sync-external-store": "^1.2.0" + } + }, "tencentcloud-sdk-nodejs-common": { "version": "4.0.559", "resolved": "https://registry.npmjs.org/tencentcloud-sdk-nodejs-common/-/tencentcloud-sdk-nodejs-common-4.0.559.tgz", @@ -9332,6 +9372,12 @@ "punycode": "^2.1.0" } }, + "use-sync-external-store": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.2.0.tgz", + "integrity": "sha512-eEgnFxGQ1Ife9bzYs6VLi8/4X6CObHMw9Qr9tPY43iKwsPw8xE8+EFsf/2cFZ5S3esXgpWgtSCtLNS41F+sKPA==", + "requires": {} + }, "util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", diff --git a/package.json b/package.json index c06d274..bbe3472 100644 --- a/package.json +++ b/package.json @@ -70,6 +70,7 @@ "play-sound": "^1.1.6", "qs": "^6.11.0", "run-applescript": "^6.1.0", + "swr": "^2.2.5", "tencentcloud-sdk-nodejs-tmt": "^4.0.559" }, "devDependencies": { diff --git a/src/easydict.tsx b/src/easydict.tsx index 2e8dc36..1352148 100644 --- a/src/easydict.tsx +++ b/src/easydict.tsx @@ -9,7 +9,7 @@ */ import { Icon, LaunchProps, List, getSelectedText } from "@raycast/api"; -import { useEffect, useState } from "react"; +import { useEffect, useMemo, useState } from "react"; import { configAxiosProxy, delayGetSystemProxy } from "./axiosConfig"; import { ListActionPanel, checkIfPreferredLanguagesConflict, getListItemIcon, getWordAccessories } from "./components"; import { DataManager } from "./dataManager/dataManager"; @@ -18,6 +18,8 @@ import { LanguageItem } from "./language/type"; import { myPreferences, preferredLanguage1 } from "./preferences"; import { DisplaySection } from "./types"; import { checkIfInstalledEudic, checkIfNeedShowReleasePrompt, trimTextLength } from "./utils"; +import useSWR from "swr"; +import { requestDeepLXTranslate } from "./translation/deepLX"; const disableConsoleLog = false; @@ -235,6 +237,19 @@ export default function (props: LaunchProps<{ arguments: EasydictArguments }>) { updateInputTextAndQueryText(text, true); } + const queryInfo = useMemo( + () => ({ + word: searchText, + fromLanguage: currentFromLanguageItem.youdaoLangCode, + toLanguage: userSelectedTargetLanguageItem.youdaoLangCode, + }), + [searchText, currentFromLanguageItem, userSelectedTargetLanguageItem] + ); + + const { data: deepLXResult } = useSWR(["deepLX", queryInfo], ([, wordInfo]: [string, QueryWordInfo]) => + requestDeepLXTranslate(wordInfo) + ); + return ( ) { ); })} + + {deepLXResult && } + ); diff --git a/src/preferences.ts b/src/preferences.ts index 3537c6f..2253872 100644 --- a/src/preferences.ts +++ b/src/preferences.ts @@ -99,7 +99,7 @@ export class AppKeyStore { static volcanoSecretKey = myPreferences.volcanoAccessKeySecret.trim(); static openAIAPIKey = myPreferences.openAIAPIKey.trim(); - static openAIEndpoint = myPreferences.openAIAPIURL.trim() || "https://api.openai.com/v1/chat/completions"; + static openAIEndpoint = myPreferences.openAIAPIURL?.trim() || "https://api.openai.com/v1/chat/completions"; static openAIModel = myPreferences.openAIModel.trim() || "gpt-3.5-turbo"; } diff --git a/src/translation/deepLX.ts b/src/translation/deepLX.ts new file mode 100644 index 0000000..8848f4e --- /dev/null +++ b/src/translation/deepLX.ts @@ -0,0 +1,13 @@ +import { QueryWordInfo } from "../dictionary/youdao/types"; +import axios from "axios"; + +export const requestDeepLXTranslate = async (queryWordInfo: QueryWordInfo): Promise<{ translations: string[] }> => { + const body = await axios.post<{ data: string }>("https://deeplx.mingming.dev/translate", { + text: queryWordInfo.word, + source_lang: queryWordInfo.fromLanguage, + target_lang: queryWordInfo.toLanguage.split("-")[0], + }); + return { + translations: [body.data.data], + }; +};