|
'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> |
|
</> |
|
) |
|
} |
|
|