Skip to content

Commit c197726

Browse files
authored
Component/language drop down (#5982)
* feat: Added LanguageDropDown Component * chore: Removed Leftover Files * Resolve Issues - Proper Component Name - Use Predefined Tailwind Class - Pass Handler as Prop * Resolve Issues - Replace Tabs with Spaces - Use Tailwind Default Class for Dropdown Content
1 parent 71ec88b commit c197726

File tree

8 files changed

+178
-61
lines changed

8 files changed

+178
-61
lines changed
Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
.iconWrapper {
2+
@apply h-9
3+
w-9
4+
rounded-md
5+
bg-neutral-100
6+
p-2
7+
text-neutral-700
8+
dark:bg-neutral-900
9+
dark:text-neutral-300;
10+
}
11+
12+
.dropDownContent {
13+
@apply max-h-80
14+
w-48
15+
overflow-y-scroll
16+
rounded
17+
border
18+
border-neutral-200
19+
py-[1px]
20+
shadow-lg
21+
dark:border-neutral-900;
22+
}
23+
24+
.dropDownItem {
25+
@apply cursor-default
26+
px-2.5
27+
py-1.5
28+
text-sm
29+
font-medium
30+
text-neutral-800
31+
outline-none
32+
data-[highlighted]:bg-green-600
33+
data-[highlighted]:text-white
34+
dark:text-white;
35+
}
36+
37+
.currentDropDown {
38+
@apply bg-green-600 text-white;
39+
}
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
import type { Meta as MetaObj, StoryObj } from '@storybook/react';
2+
3+
import LanguageDropDown from './index';
4+
5+
type Story = StoryObj<typeof LanguageDropDown>;
6+
type Meta = MetaObj<typeof LanguageDropDown>;
7+
8+
export const Default: Story = {};
9+
10+
export default { component: LanguageDropDown } as Meta;
Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
import { LanguageIcon } from '@heroicons/react/24/outline';
2+
import * as DropdownMenu from '@radix-ui/react-dropdown-menu';
3+
import classNames from 'classnames';
4+
import type { FC } from 'react';
5+
import { useIntl } from 'react-intl';
6+
7+
import { useLocale } from '@/hooks/useLocale';
8+
9+
import styles from './index.module.css';
10+
11+
export type LanguageDropDownProps = {
12+
onClick?: () => void;
13+
};
14+
15+
const LanguageDropdown: FC<LanguageDropDownProps> = ({
16+
onClick = () => {},
17+
}) => {
18+
const { availableLocales, currentLocale } = useLocale();
19+
const intl = useIntl();
20+
21+
const ariaLabel = intl.formatMessage({
22+
id: 'components.common.languageDropdown.label',
23+
});
24+
25+
return (
26+
<DropdownMenu.Root>
27+
<DropdownMenu.Trigger asChild>
28+
<button className={styles.iconWrapper} aria-label={ariaLabel}>
29+
<LanguageIcon height="20" />
30+
</button>
31+
</DropdownMenu.Trigger>
32+
33+
<DropdownMenu.Portal>
34+
<DropdownMenu.Content
35+
align="start"
36+
className={styles.dropDownContent}
37+
sideOffset={5}
38+
>
39+
{availableLocales.map(({ name, code }) => (
40+
<DropdownMenu.Item
41+
key={code}
42+
onClick={onClick}
43+
className={classNames(styles.dropDownItem, {
44+
[styles.currentDropDown]: code === currentLocale.code,
45+
})}
46+
>
47+
{name}
48+
</DropdownMenu.Item>
49+
))}
50+
</DropdownMenu.Content>
51+
</DropdownMenu.Portal>
52+
</DropdownMenu.Root>
53+
);
54+
};
55+
56+
export default LanguageDropdown;

hooks/__tests__/useClickOutside.test.mjs

Lines changed: 0 additions & 39 deletions
This file was deleted.

hooks/useClickOutside.ts

Lines changed: 0 additions & 21 deletions
This file was deleted.

i18n/locales/en.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -54,5 +54,6 @@
5454
"components.common.pagination.next": "Next",
5555
"components.common.pagination.nextAriaLabel": "Next page",
5656
"components.common.pagination.defaultLabel": "Pagination",
57-
"components.common.pagination.pageLabel": "Go to page {pageNumber}"
57+
"components.common.pagination.pageLabel": "Go to page {pageNumber}",
58+
"components.common.languageDropdown.label": "Choose Language"
5859
}

package-lock.json

Lines changed: 70 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@
4444
"@mdx-js/react": "^2.3.0",
4545
"@nodevu/core": "~0.1.0",
4646
"@radix-ui/react-avatar": "^1.0.4",
47+
"@radix-ui/react-dropdown-menu": "^2.0.6",
4748
"@radix-ui/react-select": "^2.0.0",
4849
"@radix-ui/react-tabs": "^1.0.4",
4950
"@radix-ui/react-toast": "^1.1.5",

0 commit comments

Comments
 (0)