Spaces:
Build error
Build error
'use client' | |
import { useState } from 'react' | |
import { useTranslation } from 'react-i18next' | |
import { useContext } from 'use-context-selector' | |
import { useAppContext } from '@/context/app-context' | |
import { SimpleSelect } from '@/app/components/base/select' | |
import type { Item } from '@/app/components/base/select' | |
import { updateUserProfile } from '@/service/common' | |
import { ToastContext } from '@/app/components/base/toast' | |
import I18n from '@/context/i18n' | |
import { timezones } from '@/utils/timezone' | |
import { languages } from '@/i18n/language' | |
const titleClassName = ` | |
mb-2 text-sm font-medium text-gray-900 | |
` | |
export default function LanguagePage() { | |
const { locale, setLocaleOnClient } = useContext(I18n) | |
const { userProfile, mutateUserProfile } = useAppContext() | |
const { notify } = useContext(ToastContext) | |
const [editing, setEditing] = useState(false) | |
const { t } = useTranslation() | |
const handleSelectLanguage = async (item: Item) => { | |
const url = '/account/interface-language' | |
const bodyKey = 'interface_language' | |
setEditing(true) | |
try { | |
await updateUserProfile({ url, body: { [bodyKey]: item.value } }) | |
notify({ type: 'success', message: t('common.actionMsg.modifiedSuccessfully') }) | |
setLocaleOnClient(item.value.toString()) | |
} | |
catch (e) { | |
notify({ type: 'error', message: (e as Error).message }) | |
} | |
finally { | |
setEditing(false) | |
} | |
} | |
const handleSelectTimezone = async (item: Item) => { | |
const url = '/account/timezone' | |
const bodyKey = 'timezone' | |
setEditing(true) | |
try { | |
await updateUserProfile({ url, body: { [bodyKey]: item.value } }) | |
notify({ type: 'success', message: t('common.actionMsg.modifiedSuccessfully') }) | |
mutateUserProfile() | |
} | |
catch (e) { | |
notify({ type: 'error', message: (e as Error).message }) | |
} | |
finally { | |
setEditing(false) | |
} | |
} | |
return ( | |
<> | |
<div className='mb-8'> | |
<div className={titleClassName}>{t('common.language.displayLanguage')}</div> | |
<SimpleSelect | |
defaultValue={locale || userProfile.interface_language} | |
items={languages.filter(item => item.supported)} | |
onSelect={item => handleSelectLanguage(item)} | |
disabled={editing} | |
/> | |
</div> | |
<div className='mb-8'> | |
<div className={titleClassName}>{t('common.language.timezone')}</div> | |
<SimpleSelect | |
defaultValue={userProfile.timezone} | |
items={timezones} | |
onSelect={item => handleSelectTimezone(item)} | |
disabled={editing} | |
/> | |
</div> | |
</> | |
) | |
} | |