From 113881ad52a3e6bca131dc125600e4e77c98d564 Mon Sep 17 00:00:00 2001
From: Sakamoto Shiina <68018796+ShiinaSakamoto@users.noreply.github.com>
Date: Fri, 1 Nov 2024 16:25:47 +0900
Subject: [PATCH 1/2] [bugfix] Config Page: Device Tab. Add disabled behavior
when the device is 'NoDevice'.
---
.../setting_section/setting_box/device/Device.jsx | 12 +++++-------
1 file changed, 5 insertions(+), 7 deletions(-)
diff --git a/src-ui/app/config_page/setting_section/setting_box/device/Device.jsx b/src-ui/app/config_page/setting_section/setting_box/device/Device.jsx
index 877dc019..7417c562 100644
--- a/src-ui/app/config_page/setting_section/setting_box/device/Device.jsx
+++ b/src-ui/app/config_page/setting_section/setting_box/device/Device.jsx
@@ -38,23 +38,21 @@ const Mic_Container = () => {
const { currentEnableAutoMicSelect, toggleEnableAutoMicSelect } = useEnableAutoMicSelect();
const { currentSelectedMicHost, setSelectedMicHost } = useSelectedMicHost();
const { currentMicHostList } = useMicHostList();
+ const { currentSelectedMicDevice, setSelectedMicDevice } = useSelectedMicDevice();
+ const { currentMicDeviceList } = useMicDeviceList();
const { onMouseLeaveFunction } = useOnMouseLeaveDropdownMenu();
const { currentEnableAutomaticMicThreshold, toggleEnableAutomaticMicThreshold } = useMicThreshold();
-
const selectFunction_host = (selected_data) => {
setSelectedMicHost(selected_data.selected_id);
};
- const is_disabled_selector = currentEnableAutoMicSelect.data === true || currentEnableAutoMicSelect.data === "pending";
-
- const { currentSelectedMicDevice, setSelectedMicDevice } = useSelectedMicDevice();
- const { currentMicDeviceList } = useMicDeviceList();
-
const selectFunction_device = (selected_data) => {
setSelectedMicDevice(selected_data.selected_id);
};
+ const is_disabled_selector = currentEnableAutoMicSelect.data === true || currentEnableAutoMicSelect.data === "pending" || currentSelectedMicHost.data === "NoHost" || currentSelectedMicDevice.data === "NoDevice";
+
const getLabels = () => {
if (currentEnableAutomaticMicThreshold.data === true) {
return {
@@ -143,7 +141,7 @@ const Speaker_Container = () => {
setSelectedSpeakerDevice(selected_data.selected_id);
};
- const is_disabled_selector = currentEnableAutoSpeakerSelect.data === true || currentEnableAutoSpeakerSelect.data === "pending";
+ const is_disabled_selector = currentEnableAutoSpeakerSelect.data === true || currentEnableAutoSpeakerSelect.data === "pending" || currentSelectedSpeakerDevice.data === "NoDevice";
const getLabels = () => {
if (currentEnableAutomaticSpeakerThreshold.data === true) {
From 65f073964507a17b49a01301bb3075d0d89bca3b Mon Sep 17 00:00:00 2001
From: Sakamoto Shiina <68018796+ShiinaSakamoto@users.noreply.github.com>
Date: Fri, 1 Nov 2024 19:33:49 +0900
Subject: [PATCH 2/2] [Update] Config Page: Add Translation Tab. DeeplAuthKey
section. Allow null value to Entry component's input element.
---
.../setting_box/SettingBox.jsx | 3 ++
.../_components/_atoms/_entry/_Entry.jsx | 2 +-
.../deepl_auth_key/DeeplAuthKey.jsx | 9 ++--
.../setting_section/setting_box/index.js | 1 +
.../setting_box/translation/Translation.jsx | 45 +++++++++++++++++++
.../translation/Translation.module.scss | 0
src-ui/logics/configs/index.js | 2 +
.../configs/translation/useDeepLAuthKey.js | 30 +++++++++++++
src-ui/logics/useReceiveRoutes.js | 10 +++++
src-ui/store.js | 3 ++
10 files changed, 99 insertions(+), 6 deletions(-)
create mode 100644 src-ui/app/config_page/setting_section/setting_box/translation/Translation.jsx
create mode 100644 src-ui/app/config_page/setting_section/setting_box/translation/Translation.module.scss
create mode 100644 src-ui/logics/configs/translation/useDeepLAuthKey.js
diff --git a/src-ui/app/config_page/setting_section/setting_box/SettingBox.jsx b/src-ui/app/config_page/setting_section/setting_box/SettingBox.jsx
index fac72e8a..a6b3bb75 100644
--- a/src-ui/app/config_page/setting_section/setting_box/SettingBox.jsx
+++ b/src-ui/app/config_page/setting_section/setting_box/SettingBox.jsx
@@ -3,6 +3,7 @@ import { useStore_SelectedConfigTabId } from "@store";
import {
Device,
Appearance,
+ Translation,
Transcription,
Others,
AdvancedSettings,
@@ -17,6 +18,8 @@ export const SettingBox = () => {
return ;
case "appearance":
return ;
+ case "translation":
+ return ;
case "transcription":
return ;
case "others":
diff --git a/src-ui/app/config_page/setting_section/setting_box/_components/_atoms/_entry/_Entry.jsx b/src-ui/app/config_page/setting_section/setting_box/_components/_atoms/_entry/_Entry.jsx
index f0276ff8..dc6f4309 100644
--- a/src-ui/app/config_page/setting_section/setting_box/_components/_atoms/_entry/_Entry.jsx
+++ b/src-ui/app/config_page/setting_section/setting_box/_components/_atoms/_entry/_Entry.jsx
@@ -19,7 +19,7 @@ const _Entry = forwardRef((props, ref) => {
props.onChange(e)}
/>
diff --git a/src-ui/app/config_page/setting_section/setting_box/_components/deepl_auth_key/DeeplAuthKey.jsx b/src-ui/app/config_page/setting_section/setting_box/_components/deepl_auth_key/DeeplAuthKey.jsx
index fa0f7710..0a1dea91 100644
--- a/src-ui/app/config_page/setting_section/setting_box/_components/deepl_auth_key/DeeplAuthKey.jsx
+++ b/src-ui/app/config_page/setting_section/setting_box/_components/deepl_auth_key/DeeplAuthKey.jsx
@@ -5,10 +5,9 @@ import ExternalLink from "@images/external_link.svg?react";
import { _Entry } from "../_atoms/_entry/_Entry";
import { useState, useRef } from "react";
-export const DeeplAuthKey = () => {
+export const DeeplAuthKey = (props) => {
const { t } = useTranslation();
const [is_editable, seIsEditable] = useState(false);
- const [input_value, seInputValue] = useState("");
const entryRef = useRef(null);
const revealEditAuthKey = () => {
@@ -17,16 +16,16 @@ export const DeeplAuthKey = () => {
};
const onchangeEntryAuthKey = (e) => {
- seInputValue(e.target.value);
+ props.onChangeFunction(e.target.value);
};
const saveAuthKey = () => {
- console.log(input_value);
+ props.saveFunction();
};
return (
- <_Entry ref={entryRef} width="30rem" onChange={onchangeEntryAuthKey}/>
+ <_Entry ref={entryRef} width="30rem" onChange={onchangeEntryAuthKey} ui_variable={props.variable}/>
{is_editable
? null
diff --git a/src-ui/app/config_page/setting_section/setting_box/index.js b/src-ui/app/config_page/setting_section/setting_box/index.js
index a656c23c..5c19a095 100644
--- a/src-ui/app/config_page/setting_section/setting_box/index.js
+++ b/src-ui/app/config_page/setting_section/setting_box/index.js
@@ -1,5 +1,6 @@
export { Device } from "./device/Device";
export { Appearance } from "./appearance/Appearance";
+export { Translation } from "./translation/Translation";
export { Transcription } from "./transcription/Transcription";
export { Others, VrcMicMuteSyncContainer } from "./others/Others";
export { AdvancedSettings } from "./advanced_settings/AdvancedSettings";
diff --git a/src-ui/app/config_page/setting_section/setting_box/translation/Translation.jsx b/src-ui/app/config_page/setting_section/setting_box/translation/Translation.jsx
new file mode 100644
index 00000000..5cae2c20
--- /dev/null
+++ b/src-ui/app/config_page/setting_section/setting_box/translation/Translation.jsx
@@ -0,0 +1,45 @@
+import { useEffect, useState } from "react";
+import { useTranslation } from "react-i18next";
+import styles from "./Translation.module.scss";
+
+import {
+ useDeepLAuthKey,
+} from "@logics_configs";
+
+import {
+ DeeplAuthKeyContainer,
+} from "../_templates/Templates";
+
+export const Translation = () => {
+ const [input_value, seInputValue] = useState("");
+ const { t } = useTranslation();
+ const { currentDeepLAuthKey, setDeepLAuthKey, deleteDeepLAuthKey } = useDeepLAuthKey();
+
+ const onChangeFunction = (value) => {
+ seInputValue(value);
+ };
+
+ const saveFunction = () => {
+ if (input_value === "") return deleteDeepLAuthKey();
+ setDeepLAuthKey(input_value);
+ };
+
+ useEffect(() => {
+ seInputValue(currentDeepLAuthKey.data);
+ }, [currentDeepLAuthKey]);
+
+ return (
+ <>
+
+ >
+ );
+};
\ No newline at end of file
diff --git a/src-ui/app/config_page/setting_section/setting_box/translation/Translation.module.scss b/src-ui/app/config_page/setting_section/setting_box/translation/Translation.module.scss
new file mode 100644
index 00000000..e69de29b
diff --git a/src-ui/logics/configs/index.js b/src-ui/logics/configs/index.js
index e290d5d1..504fcce6 100644
--- a/src-ui/logics/configs/index.js
+++ b/src-ui/logics/configs/index.js
@@ -31,6 +31,8 @@ export { useSpeakerRecordTimeout } from "./transcription/useSpeakerRecordTimeout
export { useSpeakerPhraseTimeout } from "./transcription/useSpeakerPhraseTimeout";
export { useSpeakerMaxWords } from "./transcription/useSpeakerMaxWords";
+export { useDeepLAuthKey } from "./translation/useDeepLAuthKey";
+
export { useIsEnabledOverlaySmallLog } from "./vr/useIsEnabledOverlaySmallLog";
export { useOverlaySettings } from "./vr/useOverlaySettings";
export { useOverlaySmallLogSettings } from "./vr/useOverlaySmallLogSettings";
diff --git a/src-ui/logics/configs/translation/useDeepLAuthKey.js b/src-ui/logics/configs/translation/useDeepLAuthKey.js
new file mode 100644
index 00000000..e379ce0f
--- /dev/null
+++ b/src-ui/logics/configs/translation/useDeepLAuthKey.js
@@ -0,0 +1,30 @@
+import { useStore_DeepLAuthKey } from "@store";
+import { useStdoutToPython } from "@logics/useStdoutToPython";
+
+export const useDeepLAuthKey = () => {
+ const { asyncStdoutToPython } = useStdoutToPython();
+ const { currentDeepLAuthKey, updateDeepLAuthKey, pendingDeepLAuthKey } = useStore_DeepLAuthKey();
+
+ const getDeepLAuthKey = () => {
+ pendingDeepLAuthKey();
+ asyncStdoutToPython("/get/data/deepl_auth_key");
+ };
+
+ const setDeepLAuthKey = (selected_deepl_auth_key) => {
+ pendingDeepLAuthKey();
+ asyncStdoutToPython("/set/data/deepl_auth_key", selected_deepl_auth_key);
+ };
+
+ const deleteDeepLAuthKey = () => {
+ pendingDeepLAuthKey();
+ asyncStdoutToPython("/delete/data/deepl_auth_key");
+ };
+
+ return {
+ currentDeepLAuthKey,
+ getDeepLAuthKey,
+ updateDeepLAuthKey,
+ setDeepLAuthKey,
+ deleteDeepLAuthKey,
+ };
+};
\ No newline at end of file
diff --git a/src-ui/logics/useReceiveRoutes.js b/src-ui/logics/useReceiveRoutes.js
index 7879b28e..8cdda433 100644
--- a/src-ui/logics/useReceiveRoutes.js
+++ b/src-ui/logics/useReceiveRoutes.js
@@ -45,6 +45,7 @@ import {
useSpeakerRecordTimeout,
useSpeakerPhraseTimeout,
useSpeakerMaxWords,
+ useDeepLAuthKey,
useOverlaySettings,
useIsEnabledOverlaySmallLog,
useOverlaySmallLogSettings,
@@ -116,6 +117,8 @@ export const useReceiveRoutes = () => {
const { updateSpeakerPhraseTimeout } = useSpeakerPhraseTimeout();
const { updateSpeakerMaxWords } = useSpeakerMaxWords();
+ const { updateDeepLAuthKey } = useDeepLAuthKey();
+
const { updateOverlaySettings } = useOverlaySettings();
const { updateOverlaySmallLogSettings } = useOverlaySmallLogSettings();
const { updateIsEnabledOverlaySmallLog } = useIsEnabledOverlaySmallLog();
@@ -270,6 +273,11 @@ export const useReceiveRoutes = () => {
"/get/data/transparency": updateTransparency,
"/set/data/transparency": updateTransparency,
+ // Translation
+ "/get/data/deepl_auth_key": updateDeepLAuthKey,
+ "/set/data/deepl_auth_key": updateDeepLAuthKey,
+ "/delete/data/deepl_auth_key": () => updateDeepLAuthKey(""),
+
// Transcription
"/get/data/mic_record_timeout": updateMicRecordTimeout,
"/set/data/mic_record_timeout": updateMicRecordTimeout,
@@ -366,6 +374,8 @@ export const useReceiveRoutes = () => {
"/set/data/speaker_record_timeout": updateSpeakerRecordTimeout,
"/set/data/speaker_phrase_timeout": updateSpeakerPhraseTimeout,
"/set/data/speaker_max_phrases": updateSpeakerMaxWords,
+
+ "/set/data/deepl_auth_key": updateDeepLAuthKey,
};
diff --git a/src-ui/store.js b/src-ui/store.js
index 2e775960..0df5654f 100644
--- a/src-ui/store.js
+++ b/src-ui/store.js
@@ -181,6 +181,9 @@ export const { atomInstance: Atom_Transparency, useHook: useStore_Transparency }
export const { atomInstance: Atom_IsOpenedMicWordFilterList, useHook: useStore_IsOpenedMicWordFilterList } = createAtomWithHook(false, "IsOpenedMicWordFilterList");
export const { atomInstance: Atom_MicWordFilterList, useHook: useStore_MicWordFilterList } = createAtomWithHook([], "MicWordFilterList");
+// Translation
+export const { atomInstance: Atom_DeepLAuthKey, useHook: useStore_DeepLAuthKey } = createAtomWithHook(null, "DeepLAuthKey");
+
// Transcription
export const { atomInstance: Atom_MicRecordTimeout, useHook: useStore_MicRecordTimeout } = createAtomWithHook(0, "MicRecordTimeout");
export const { atomInstance: Atom_MicPhraseTimeout, useHook: useStore_MicPhraseTimeout } = createAtomWithHook(0, "MicPhraseTimeout");