fix(web): align signin locale menu behavior

This commit is contained in:
yyh 2026-04-30 12:52:38 +08:00
parent f7a9279a14
commit 3c5f4433d7
No known key found for this signature in database
3 changed files with 21 additions and 13 deletions

View File

@ -57,7 +57,7 @@ describe('LocaleMenu', () => {
await user.click(screen.getByRole('button', { name: /english \(us\)/i }))
await user.click(screen.getByRole('menuitemradio', { name: '日本語' }))
expect(onChange).toHaveBeenCalledWith('ja-JP', expect.anything())
expect(onChange).toHaveBeenCalledWith('ja-JP')
})
it('should render all locale options when menu is opened', async () => {
@ -93,7 +93,7 @@ describe('LocaleMenu', () => {
await user.click(screen.getByRole('button', { name: /english \(us\)/i }))
await user.click(screen.getByRole('menuitemradio', { name: '简体中文' }))
expect(screen.getByRole('menuitemradio', { name: '简体中文' })).toBeInTheDocument()
expect(screen.queryByRole('menuitemradio', { name: '简体中文' })).not.toBeInTheDocument()
})
it('should render no options when items are empty', async () => {

View File

@ -1,5 +1,4 @@
'use client'
import type { Locale } from '@/i18n-config'
import { useSuspenseQuery } from '@tanstack/react-query'
import Divider from '@/app/components/base/divider'
import { useLocale } from '@/context/i18n'
@ -39,7 +38,7 @@ const Header = () => {
value={locale}
items={languages.filter(item => item.supported)}
onChange={(value) => {
setLocaleOnClient(value as Locale, false)
setLocaleOnClient(value, false)
}}
/>
<Divider type="vertical" className="mx-0 ml-2 h-4" />

View File

@ -1,5 +1,3 @@
'use client'
import {
DropdownMenu,
DropdownMenuContent,
@ -9,18 +7,28 @@ import {
DropdownMenuTrigger,
} from '@langgenius/dify-ui/dropdown-menu'
type LocaleMenuProps = {
items: Array<{ value: string, name: string }>
value?: string
onChange?: (value: string) => void
type LocaleMenuItem<T extends string> = {
value: T
name: string
}
export default function LocaleMenu({
type LocaleMenuProps<T extends string> = {
items: Array<LocaleMenuItem<T>>
value?: T
onChange?: (value: T) => void
}
export default function LocaleMenu<T extends string>({
items,
value,
onChange,
}: LocaleMenuProps) {
}: LocaleMenuProps<T>) {
const selectedItem = items.find(item => item.value === value)
const handleValueChange = (nextValue: string) => {
const nextItem = items.find(item => item.value === nextValue)
if (nextItem)
onChange?.(nextItem.value)
}
return (
<div className="w-56 text-right">
@ -45,11 +53,12 @@ export default function LocaleMenu({
sideOffset={8}
popupClassName="w-[200px]"
>
<DropdownMenuRadioGroup value={value} onValueChange={onChange}>
<DropdownMenuRadioGroup value={value} onValueChange={handleValueChange}>
{items.map(item => (
<DropdownMenuRadioItem
key={item.value}
value={item.value}
closeOnClick
className="px-3 py-2 text-sm text-text-secondary"
>
<span className="grow truncate">{item.name}</span>