Skip to content

Commit 4d6028f

Browse files
committed
Allow to open sublanguages with keyboard
1 parent f934e32 commit 4d6028f

File tree

3 files changed

+29
-10
lines changed

3 files changed

+29
-10
lines changed

src/components/LanguageSelector.tsx

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -36,13 +36,15 @@ const LanguageSelector = () => {
3636
const handleSelect = (selected: LanguageType) => {
3737
setLanguage(selected);
3838
setIsOpen(false);
39+
setOpenedLanguages([]);
3940
};
4041

4142
const { focusedIndex, handleKeyDown, resetFocus, focusFirst } =
4243
useKeyboardNavigation({
4344
items: allLanguages,
4445
isOpen,
4546
openedLanguages,
47+
toggleDropdown: (openedLang) => handleToggleSublanguage(openedLang),
4648
onSelect: handleSelect,
4749
onClose: () => setIsOpen(false),
4850
});
@@ -58,8 +60,12 @@ const LanguageSelector = () => {
5860
}, 0);
5961
};
6062

61-
const handleOpenedSublanguage = (open: boolean, openedLang: LanguageType) => {
62-
if (open) {
63+
const handleToggleSublanguage = (openedLang: LanguageType) => {
64+
const isAlreadyOpened = openedLanguages.some(
65+
(lang) => lang.name === openedLang.name
66+
);
67+
68+
if (!isAlreadyOpened) {
6369
setOpenedLanguages((prev) => [...prev, openedLang]);
6470
} else {
6571
setOpenedLanguages((prev) =>
@@ -128,7 +134,8 @@ const LanguageSelector = () => {
128134
afterSelect={() => {
129135
setIsOpen(false);
130136
}}
131-
onDropdownChange={handleOpenedSublanguage}
137+
opened={openedLanguages.includes(lang)}
138+
onDropdownToggle={handleToggleSublanguage}
132139
/>
133140
) : (
134141
<li

src/components/SublanguageSelector.tsx

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -6,13 +6,15 @@ import { LanguageType } from "@types";
66
type SubLanguageSelectorProps = {
77
mainLanguage: LanguageType;
88
afterSelect: () => void;
9-
onDropdownChange: (open: boolean, openedLang: LanguageType) => void;
9+
onDropdownToggle: (openedLang: LanguageType) => void;
10+
opened: boolean;
1011
};
1112

1213
const SubLanguageSelector = ({
1314
mainLanguage,
1415
afterSelect,
15-
onDropdownChange,
16+
onDropdownToggle,
17+
opened,
1618
}: SubLanguageSelectorProps) => {
1719
const { language, setLanguage } = useAppContext();
1820
const [isOpen, setIsOpen] = useState(
@@ -24,13 +26,10 @@ const SubLanguageSelector = ({
2426
const handleSelect = (selected: LanguageType) => {
2527
setLanguage(selected);
2628
setIsOpen(false);
29+
onDropdownToggle(mainLanguage);
2730
afterSelect();
2831
};
2932

30-
useEffect(() => {
31-
onDropdownChange(isOpen, mainLanguage);
32-
}, [mainLanguage, onDropdownChange, isOpen]);
33-
3433
return (
3534
<>
3635
<li
@@ -61,7 +60,7 @@ const SubLanguageSelector = ({
6160
</label>
6261
</li>
6362

64-
{isOpen && (
63+
{(opened || isOpen) && (
6564
<>
6665
{mainLanguage.subLanguages.map((subLanguage) => (
6766
<li

src/hooks/useKeyboardNavigation.ts

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ interface UseKeyboardNavigationProps {
77
isOpen: boolean;
88
onSelect: (item: LanguageType) => void;
99
onClose: () => void;
10+
toggleDropdown: (openedLang: LanguageType) => void;
1011
openedLanguages: LanguageType[];
1112
}
1213

@@ -27,6 +28,7 @@ export const useKeyboardNavigation = ({
2728
openedLanguages,
2829
onSelect,
2930
onClose,
31+
toggleDropdown,
3032
}: UseKeyboardNavigationProps) => {
3133
const [focusedIndex, setFocusedIndex] = useState<number>(-1);
3234

@@ -46,6 +48,17 @@ export const useKeyboardNavigation = ({
4648
setFocusedIndex((prev) => (prev > 0 ? prev - 1 : items.length - 1));
4749
break;
4850
case "ArrowRight":
51+
if (focusedIndex >= 0) {
52+
const selectedItem = items.filter(
53+
(item) =>
54+
!item.mainLanguage ||
55+
openedLanguages.includes(item.mainLanguage)
56+
)[focusedIndex];
57+
58+
if (selectedItem.subLanguages.length > 0) {
59+
toggleDropdown(selectedItem);
60+
}
61+
}
4962
break;
5063
case "Enter":
5164
if (focusedIndex >= 0) {

0 commit comments

Comments
 (0)