diff --git a/src-ui/app/App.jsx b/src-ui/app/App.jsx index 16247f71..184eee25 100644 --- a/src-ui/app/App.jsx +++ b/src-ui/app/App.jsx @@ -20,6 +20,8 @@ export const App = () => { import { useSoftwareVersion } from "@logics_configs/useSoftwareVersion"; +import { useEnableAutoMicSelect } from "@logics_configs/useEnableAutoMicSelect"; +import { useEnableAutoSpeakerSelect } from "@logics_configs/useEnableAutoSpeakerSelect"; import { useSelectedMicHost } from "@logics_configs/useSelectedMicHost"; import { useSelectedMicDevice } from "@logics_configs/useSelectedMicDevice"; import { useSelectedSpeakerDevice } from "@logics_configs/useSelectedSpeakerDevice"; @@ -29,6 +31,7 @@ import { useEnableAutoClearMessageBox } from "@logics_configs/useEnableAutoClear import { useSendMessageButtonType } from "@logics_configs/useSendMessageButtonType"; import { useUiLanguage } from "@logics_configs/useUiLanguage"; +import { useLanguageSettings } from "@logics/useLanguageSettings"; import { useSelectableLanguageList } from "@logics/useSelectableLanguageList"; const StartPythonFacadeComponent = () => { @@ -37,6 +40,8 @@ const StartPythonFacadeComponent = () => { const main_page = getCurrent(); const { getSoftwareVersion } = useSoftwareVersion(); + const { getEnableAutoMicSelect } = useEnableAutoMicSelect(); + const { getEnableAutoSpeakerSelect } = useEnableAutoSpeakerSelect(); const { getSelectedMicHost } = useSelectedMicHost(); const { getSelectedMicDevice } = useSelectedMicDevice(); const { getSelectedSpeakerDevice } = useSelectedSpeakerDevice(); @@ -46,6 +51,7 @@ const StartPythonFacadeComponent = () => { const { getSendMessageButtonType } = useSendMessageButtonType(); const { getUiLanguage } = useUiLanguage(); + const { getSelectedPresetTabNumber, getEnableMultiTranslation, getSelectedYourLanguages, getSelectedTargetLanguages } = useLanguageSettings(); const { getSelectableLanguageList } = useSelectableLanguageList(); @@ -57,8 +63,14 @@ const StartPythonFacadeComponent = () => { getSoftwareVersion(); + getSelectedPresetTabNumber(); + getEnableMultiTranslation(); + getSelectedYourLanguages(); + getSelectedTargetLanguages(); getSelectableLanguageList(); + getEnableAutoMicSelect(); + getEnableAutoSpeakerSelect(); getSelectedMicHost(); getSelectedMicDevice(); getSelectedSpeakerDevice(); diff --git a/src-ui/app/config_page/setting_section/setting_box/components/dropdown_menu/DropdownMenu.module.scss b/src-ui/app/config_page/setting_section/setting_box/components/dropdown_menu/DropdownMenu.module.scss index c6bcbfa6..1a5c88af 100644 --- a/src-ui/app/config_page/setting_section/setting_box/components/dropdown_menu/DropdownMenu.module.scss +++ b/src-ui/app/config_page/setting_section/setting_box/components/dropdown_menu/DropdownMenu.module.scss @@ -31,6 +31,8 @@ .dropdown_selected_text { font-size: 1.4rem; padding-right: 2.8rem; + overflow: hidden; + text-overflow: ellipsis; } .dropdown_content_wrapper { diff --git a/src-ui/app/config_page/setting_section/setting_box/components/label_component/LabelComponent.module.scss b/src-ui/app/config_page/setting_section/setting_box/components/label_component/LabelComponent.module.scss index ee8e088a..f9ea7d93 100644 --- a/src-ui/app/config_page/setting_section/setting_box/components/label_component/LabelComponent.module.scss +++ b/src-ui/app/config_page/setting_section/setting_box/components/label_component/LabelComponent.module.scss @@ -2,16 +2,20 @@ display: flex; flex-direction: column; gap: 0.2rem; + flex-shrink: 0; } .label { font-size: 1.6rem; font-weight: 400; color: var(--dark_basic_text_color); + white-space: nowrap; } .desc { font-size: 1.4rem; font-weight: 300; color: var(--dark_500_color); + max-width: 38rem; + overflow-wrap: break-word; } \ No newline at end of file diff --git a/src-ui/app/config_page/setting_section/setting_box/components/switchbox/Switchbox.module.scss b/src-ui/app/config_page/setting_section/setting_box/components/switchbox/Switchbox.module.scss index 2c69fe8f..701f7371 100644 --- a/src-ui/app/config_page/setting_section/setting_box/components/switchbox/Switchbox.module.scss +++ b/src-ui/app/config_page/setting_section/setting_box/components/switchbox/Switchbox.module.scss @@ -15,6 +15,7 @@ cursor: pointer; padding: 2rem; height: 100%; + flex-shrink: 0; &.is_loading { pointer-events: none; } 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 762b3e52..4975b435 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 @@ -77,30 +77,32 @@ const Mic_Container = () => {
-

{t("config_page.mic_host_device.label_host")}

- -
+
+

{t("config_page.mic_host_device.label_host")}

+ +
-
-

{t("config_page.mic_host_device.label_device")}

- +
+

{t("config_page.mic_host_device.label_device")}

+ +
@@ -172,7 +174,7 @@ const Speaker_Container = () => { /> -
+

{t("config_page.mic_host_device.label_device")}

{ ); }; + +import { useLanguageSettings } from "@logics/useLanguageSettings"; const HandleLanguageSelector = () => { const { currentIsOpenedLanguageSelector } = useStore_IsOpenedLanguageSelector(); + const { + currentSelectedYourLanguages, + setSelectedYourLanguages, + currentSelectedTargetLanguages, + setSelectedTargetLanguages, + } = useLanguageSettings(); if (currentIsOpenedLanguageSelector.your_language === true) { - return ; + const onclickFunction_YourLanguage = (payload) => setSelectedYourLanguages(payload); + return ; } else if (currentIsOpenedLanguageSelector.target_language === true) { - return ; + const onclickFunction_TargetLanguage = (payload) => setSelectedTargetLanguages(payload); + return ; } else { return null; } diff --git a/src-ui/app/main_page/main_section/language_selector/LanguageSelector.jsx b/src-ui/app/main_page/main_section/language_selector/LanguageSelector.jsx index 3c636428..664587e9 100644 --- a/src-ui/app/main_page/main_section/language_selector/LanguageSelector.jsx +++ b/src-ui/app/main_page/main_section/language_selector/LanguageSelector.jsx @@ -4,14 +4,14 @@ import { useSelectableLanguageList } from "@logics/useSelectableLanguageList"; import styles from "./LanguageSelector.module.scss"; import { LanguageSelectorTopBar } from "./language_selector_top_bar/LanguageSelectorTopBar"; -export const LanguageSelector = ({ id }) => { +export const LanguageSelector = ({ id, onClickFunction }) => { const { t } = useTranslation(); - const { currentSelectableLanguageList, updateSelectableLanguageList } = useSelectableLanguageList(); + const { currentSelectableLanguageList } = useSelectableLanguageList(); const languageTitles = { - "your_language": t("selectable_language_window.title_your_language"), - "target_language": t("selectable_language_window.title_target_language") + your_language: t("selectable_language_window.title_your_language"), + target_language: t("selectable_language_window.title_target_language") }; const language_selector_title = languageTitles[id] || ""; @@ -35,7 +35,7 @@ export const LanguageSelector = ({ id }) => {
{Object.entries(groupedLanguages).map(([letter, languages]) => ( - + ))}
@@ -43,20 +43,28 @@ export const LanguageSelector = ({ id }) => { ); }; -const LanguageGroup = ({ letter, languages }) => { +const LanguageGroup = ({ onClickFunction, letter, languages }) => { return (

{letter}

{languages.map((languageData, index) => ( - + ))}
); }; -const LanguageButton = ({ languageData }) => { +const LanguageButton = ({ onClickFunction, languageData }) => { + + const adjustedOnClickFunction = () => { + onClickFunction({ + language: languageData.language, + country: languageData.country + }); + }; + return ( -
+

{languageData.language} ({languageData.country})

); diff --git a/src-ui/app/main_page/sidebar_section/language_settings/LanguageSettings.jsx b/src-ui/app/main_page/sidebar_section/language_settings/LanguageSettings.jsx index 130b467b..46459770 100644 --- a/src-ui/app/main_page/sidebar_section/language_settings/LanguageSettings.jsx +++ b/src-ui/app/main_page/sidebar_section/language_settings/LanguageSettings.jsx @@ -1,7 +1,5 @@ import { useTranslation } from "react-i18next"; - import styles from "./LanguageSettings.module.scss"; - import { PresetTabSelector } from "./preset_tab_selector/PresetTabSelector"; import { LanguageSelectorOpenButton } from "./language_selector_open_button/LanguageSelectorOpenButton"; import { LanguageSwapButton } from "./language_swap_button/LanguageSwapButton"; @@ -9,11 +7,11 @@ import { TranslatorSelectorOpenButton } from "./translator_selector_open_button/ import { useStore_IsOpenedTranslatorSelector } from "@store"; export const LanguageSettings = () => { - const { updateIsOpenedTranslatorSelector} = useStore_IsOpenedTranslatorSelector(); + const { updateIsOpenedTranslatorSelector } = useStore_IsOpenedTranslatorSelector(); const closeTranslatorSelector = () => updateIsOpenedTranslatorSelector(false); return ( -
+

Language Settings

@@ -21,81 +19,70 @@ export const LanguageSettings = () => { ); }; - import MicSvg from "@images/mic.svg?react"; import HeadphonesSvg from "@images/headphones.svg?react"; import { useStore_IsOpenedLanguageSelector } from "@store"; import { useMainFunction } from "@logics/useMainFunction"; +import { useLanguageSettings } from "@logics/useLanguageSettings"; + +// 言語セレクターをトグルする処理を関数化 +const toggleSelector = (selector, currentStatus, updateSelector) => { + if (currentStatus) { + updateSelector({ your_language: false, target_language: false }); + } else { + updateSelector({ + your_language: selector === "your_language", + target_language: selector === "target_language", + }); + } +}; + +// 選択された言語データの取得を関数化 +const getSelectedLanguageData = (presetTabData, languageData) => { + return (presetTabData !== undefined && languageData !== undefined) + ? languageData[Number(presetTabData)] + : undefined; +}; const PresetContainer = () => { const { t } = useTranslation(); const { updateIsOpenedLanguageSelector, currentIsOpenedLanguageSelector } = useStore_IsOpenedLanguageSelector(); + const { currentTranscriptionSendStatus, currentTranscriptionReceiveStatus } = useMainFunction(); const { - currentTranscriptionSendStatus, - currentTranscriptionReceiveStatus, - } = useMainFunction(); + currentSelectedPresetTabNumber, + currentSelectedYourLanguages, + currentSelectedTargetLanguages, + } = useLanguageSettings(); + + const your_language_data = getSelectedLanguageData(currentSelectedPresetTabNumber.data, currentSelectedYourLanguages.data); + const target_language_data = getSelectedLanguageData(currentSelectedPresetTabNumber.data, currentSelectedTargetLanguages.data); - const closeLanguageSelector = () => { - updateIsOpenedLanguageSelector({ - your_language: false, - target_language: false, - }); - }; - - const toggleYourLanguageSelector = () => { - if (currentIsOpenedLanguageSelector.your_language === true) { - closeLanguageSelector(); - } else { - updateIsOpenedLanguageSelector({ - your_language: true, - target_language: false, - }); - } - }; - - const toggleTargetLanguageSelector = () => { - if (currentIsOpenedLanguageSelector.target_language === true) { - closeLanguageSelector(); - } else { - updateIsOpenedLanguageSelector({ - your_language: false, - target_language: true, - }); - } - }; - - const handleLanguageSelectorClick = (selector) => { - if (selector === "your_language") { - toggleYourLanguageSelector(); - } else if (selector === "target_language") { - toggleTargetLanguageSelector(); - } - }; - - const your_language_settings = { + const yourLanguageSettings = { title: t("main_page.your_language"), is_opened: currentIsOpenedLanguageSelector.your_language, - onClickFunction: () => handleLanguageSelectorClick("your_language"), + onClickFunction: () => toggleSelector("your_language", currentIsOpenedLanguageSelector.your_language, updateIsOpenedLanguageSelector), TurnedOnSvgComponent: , is_turned_on: currentTranscriptionSendStatus.data, + variable: your_language_data?.primary, }; - const target_language_settings = { + const targetLanguageSettings = { title: t("main_page.target_language"), is_opened: currentIsOpenedLanguageSelector.target_language, - onClickFunction: () => handleLanguageSelectorClick("target_language"), + onClickFunction: () => toggleSelector("target_language", currentIsOpenedLanguageSelector.target_language, updateIsOpenedLanguageSelector), TurnedOnSvgComponent: , is_turned_on: currentTranscriptionReceiveStatus.data, + variable: target_language_data?.primary, }; return (
- + - +
); -}; \ No newline at end of file +}; diff --git a/src-ui/app/main_page/sidebar_section/language_settings/language_selector_open_button/LanguageSelectorOpenButton.jsx b/src-ui/app/main_page/sidebar_section/language_settings/language_selector_open_button/LanguageSelectorOpenButton.jsx index 9c269101..7d080914 100644 --- a/src-ui/app/main_page/sidebar_section/language_settings/language_selector_open_button/LanguageSelectorOpenButton.jsx +++ b/src-ui/app/main_page/sidebar_section/language_settings/language_selector_open_button/LanguageSelectorOpenButton.jsx @@ -2,32 +2,31 @@ import clsx from "clsx"; import styles from "./LanguageSelectorOpenButton.module.scss"; import ArrowLeftSvg from "@images/arrow_left.svg?react"; import { useSvg } from "@utils/useSvg"; -export const LanguageSelectorOpenButton = (props) => { - const toggleLanguageSelector = () => { - props.onClickFunction(); - }; - - const class_names = clsx(styles["arrow_left_svg"], { - [styles["reverse"]]: props.is_opened +export const LanguageSelectorOpenButton = ({ title, onClickFunction, is_opened, TurnedOnSvgComponent, is_turned_on, variable }) => { + const classNames = clsx(styles.arrow_left_svg, { + [styles.reverse]: is_opened, }); - const SvgComponent = useSvg(props.TurnedOnSvgComponent, - {className: clsx(styles["category_svg"], { - [styles["is_turned_on"]]: props.is_turned_on - })} - ); + const SvgComponent = useSvg(TurnedOnSvgComponent, { + className: clsx(styles.category_svg, { + [styles.is_turned_on]: is_turned_on, + }), + }); + + const languageText = variable?.language ?? "Loading..."; + const countryText = variable?.country ?? "Loading..."; return (
{SvgComponent} -

{props.title}

+

{title}

-
-

Japanese

-

(Japan)

- +
+

{languageText}

+

({countryText})

+
); diff --git a/src-ui/app/main_page/sidebar_section/language_settings/preset_tab_selector/PresetTabSelector.jsx b/src-ui/app/main_page/sidebar_section/language_settings/preset_tab_selector/PresetTabSelector.jsx index 9442ea60..e5e8f694 100644 --- a/src-ui/app/main_page/sidebar_section/language_settings/preset_tab_selector/PresetTabSelector.jsx +++ b/src-ui/app/main_page/sidebar_section/language_settings/preset_tab_selector/PresetTabSelector.jsx @@ -3,25 +3,25 @@ import styles from "./PresetTabSelector.module.scss"; export const PresetTabSelector = () => { return (
- - - + + +
); }; import clsx from "clsx"; -import { useStore_SelectedPresetTabNumber } from "@store"; +import { useLanguageSettings } from "@logics/useLanguageSettings"; const Tab = (props) => { - const { updateSelectedPresetTabNumber, currentSelectedPresetTabNumber } = useStore_SelectedPresetTabNumber(); + const { currentSelectedPresetTabNumber, setSelectedPresetTabNumber } = useLanguageSettings(); const onclickFunction = () => { - updateSelectedPresetTabNumber(props.preset_number); + setSelectedPresetTabNumber(props.preset_number); }; - const class_names = clsx(styles["tab_container"], { - [styles["is_selected"]]: (currentSelectedPresetTabNumber === props.preset_number) ? true : false + const class_names = clsx(styles.tab_container, { + [styles.is_selected]: (currentSelectedPresetTabNumber.data === props.preset_number) ? true : false }); return ( diff --git a/src-ui/logics/useLanguageSettings.js b/src-ui/logics/useLanguageSettings.js new file mode 100644 index 00000000..b2bc8a64 --- /dev/null +++ b/src-ui/logics/useLanguageSettings.js @@ -0,0 +1,84 @@ +import { useStore_SelectedPresetTabNumber, useStore_EnableMultiTranslation, useStore_SelectedYourLanguages, useStore_SelectedTargetLanguages } from "@store"; +import { useStdoutToPython } from "@logics/useStdoutToPython"; + +export const useLanguageSettings = () => { + const { asyncStdoutToPython } = useStdoutToPython(); + const { currentEnableMultiTranslation, updateEnableMultiTranslation } = useStore_EnableMultiTranslation(); + const { currentSelectedYourLanguages, updateSelectedYourLanguages } = useStore_SelectedYourLanguages(); + const { currentSelectedTargetLanguages, updateSelectedTargetLanguages } = useStore_SelectedTargetLanguages(); + const { currentSelectedPresetTabNumber, updateSelectedPresetTabNumber } = useStore_SelectedPresetTabNumber(); + + const getEnableMultiTranslation = () => { + updateEnableMultiTranslation(() => new Promise(() => {})); + asyncStdoutToPython("/config/enable_multi_translation"); + }; + + const getSelectedPresetTabNumber = () => { + updateSelectedPresetTabNumber(() => new Promise(() => {})); + asyncStdoutToPython("/config/selected_tab_no"); + }; + + const setSelectedPresetTabNumber = (preset_number) => { + updateSelectedPresetTabNumber(() => new Promise(() => {})); + + asyncStdoutToPython("/controller/callback_selected_language_preset_tab", preset_number); + }; + + + const getSelectedYourLanguages = () => { + updateSelectedYourLanguages(() => new Promise(() => {})); + asyncStdoutToPython("/config/selected_tab_your_languages"); + }; + + const setSelectedYourLanguages = (selected_language_data) => { + // updateSelectedYourLanguages(() => new Promise(() => {})); + const send_obj = { + ...currentSelectedYourLanguages.data, + [currentSelectedPresetTabNumber.data]: { + primary: { + language: selected_language_data.language, + country: selected_language_data.country, + } + } + }; + asyncStdoutToPython("/controller/set_your_language_and_country", send_obj); + }; + + + const getSelectedTargetLanguages = () => { + updateSelectedTargetLanguages(() => new Promise(() => {})); + asyncStdoutToPython("/config/selected_tab_target_languages"); + }; + + const setSelectedTargetLanguages = (selected_language_data) => { + // updateSelectedTargetLanguages(() => new Promise(() => {})); + let send_obj = currentSelectedTargetLanguages.data; + + send_obj[currentSelectedPresetTabNumber.data].primary.language = selected_language_data.language, + send_obj[currentSelectedPresetTabNumber.data].primary.country = selected_language_data.country, + + asyncStdoutToPython("/controller/set_target_language_and_country", send_obj); + }; + + return { + currentSelectedPresetTabNumber, + getSelectedPresetTabNumber, + updateSelectedPresetTabNumber, + setSelectedPresetTabNumber, + + currentEnableMultiTranslation, + getEnableMultiTranslation, + updateEnableMultiTranslation, + // setEnableMultiTranslation, + + currentSelectedYourLanguages, + getSelectedYourLanguages, + updateSelectedYourLanguages, + setSelectedYourLanguages, + + currentSelectedTargetLanguages, + getSelectedTargetLanguages, + updateSelectedTargetLanguages, + setSelectedTargetLanguages, + }; +}; \ No newline at end of file diff --git a/src-ui/logics/useReceiveRoutes.js b/src-ui/logics/useReceiveRoutes.js index 875b77a4..fee89a4a 100644 --- a/src-ui/logics/useReceiveRoutes.js +++ b/src-ui/logics/useReceiveRoutes.js @@ -2,6 +2,7 @@ import { arrayToObject } from "@utils/arrayToObject"; import { useMainFunction } from "./useMainFunction"; import { useMessage } from "./useMessage"; import { useSelectableLanguageList } from "./useSelectableLanguageList"; +import { useLanguageSettings } from "./useLanguageSettings"; import { useVolume } from "./useVolume"; import { useSoftwareVersion } from "@logics_configs/useSoftwareVersion"; @@ -28,6 +29,12 @@ export const useReceiveRoutes = () => { updateTranscriptionReceiveStatus, } = useMainFunction(); + const { + updateSelectedPresetTabNumber, + updateEnableMultiTranslation, + updateSelectedYourLanguages, + updateSelectedTargetLanguages + } = useLanguageSettings(); const { updateSelectableLanguageList } = useSelectableLanguageList(); const { @@ -72,12 +79,22 @@ export const useReceiveRoutes = () => { "/controller/callback_enable_transcription_receive": updateTranscriptionReceiveStatus, "/controller/callback_disable_transcription_receive": updateTranscriptionReceiveStatus, + "/config/selected_tab_no": updateSelectedPresetTabNumber, + "/controller/callback_selected_language_preset_tab": updateSelectedPresetTabNumber, + "/config/enable_multi_translation": updateEnableMultiTranslation, + "/config/selected_tab_your_languages": updateSelectedYourLanguages, + "/controller/set_your_language_and_country": updateSelectedYourLanguages, + "/config/selected_tab_target_languages": updateSelectedTargetLanguages, + "/controller/set_your_language_and_country": updateSelectedTargetLanguages, + "/controller/list_language_and_country": updateSelectableLanguageList, "/config/version": updateSoftwareVersion, + "/config/enable_mic_automatic_selection": updateEnableAutoMicSelect, "/controller/callback_enable_mic_automatic_selection": updateEnableAutoMicSelect, "/controller/callback_disable_mic_automatic_selection": updateEnableAutoMicSelect, + "/config/enable_speaker_automatic_selection": updateEnableAutoSpeakerSelect, "/controller/callback_enable_speaker_automatic_selection": updateEnableAutoSpeakerSelect, "/controller/callback_disable_speaker_automatic_selection": updateEnableAutoSpeakerSelect, diff --git a/src-ui/store.js b/src-ui/store.js index 907ef58b..0d62c1ab 100644 --- a/src-ui/store.js +++ b/src-ui/store.js @@ -103,14 +103,19 @@ export const { atomInstance: Atom_ForegroundStatus, useHook: useStore_Foreground export const { atomInstance: Atom_MessageLogs, useHook: useStore_MessageLogs } = createAtomWithHook(generateTestData(20), "MessageLogs"); export const { atomInstance: Atom_IsMainPageCompactMode, useHook: useStore_IsMainPageCompactMode } = createAtomWithHook(false, "IsMainPageCompactMode"); + export const { atomInstance: Atom_IsOpenedLanguageSelector, useHook: useStore_IsOpenedLanguageSelector } = createAtomWithHook( { your_language: false, target_language: false }, "IsOpenedLanguageSelector" ); - export const { atomInstance: Atom_SelectableLanguageList, useHook: useStore_SelectableLanguageList } = createAtomWithHook([], "SelectableLanguageList"); -export const { atomInstance: Atom_SelectedPresetTabNumber, useHook: useStore_SelectedPresetTabNumber } = createAtomWithHook(1, "SelectedPresetTabNumber"); +export const { atomInstance: Atom_SelectedPresetTabNumber, useHook: useStore_SelectedPresetTabNumber } = createAsyncAtomWithHook("", "SelectedPresetTabNumber"); +export const { atomInstance: Atom_EnableMultiTranslation, useHook: useStore_EnableMultiTranslation } = createAsyncAtomWithHook(false, "EnableMultiTranslation"); +export const { atomInstance: Atom_SelectedYourLanguages, useHook: useStore_SelectedYourLanguages } = createAsyncAtomWithHook({}, "SelectedYourLanguages"); +export const { atomInstance: Atom_SelectedTargetLanguages, useHook: useStore_SelectedTargetLanguages } = createAsyncAtomWithHook({}, "SelectedTargetLanguages"); + + export const { atomInstance: Atom_IsOpenedConfigPage, useHook: useStore_IsOpenedConfigPage } = createAtomWithHook(false, "IsOpenedConfigPage"); export const { atomInstance: Atom_SelectedConfigTabId, useHook: useStore_SelectedConfigTabId } = createAtomWithHook("device", "SelectedConfigTabId"); export const { atomInstance: Atom_IsOpenedDropdownMenu, useHook: useStore_IsOpenedDropdownMenu } = createAtomWithHook("", "IsOpenedDropdownMenu");