Implement preferred audio languages feature: update site settings to include preferred audio languages, modify related data structures and API endpoints, and enhance media processing to select audio tracks based on user preferences. Update frontend components for managing and displaying these settings.
tests / backend-tests (push) Failing after 32s
build / backend (push) Successful in 2m17s
build / frontend (push) Successful in 58s

This commit is contained in:
Leonid Pershin committed 2026-07-26 01:51:55 +03:00
1 parent 64a2dade74
commit 525fd2ee01
17 files changed
+236 -17

No files matched your search

@@ -4,6 +4,7 @@ import { useTranslation } from 'react-i18next'
import { HttpError } from '@/shared/api/client'
import { Button } from '@/shared/ui/button'
import { Card, CardContent, CardDescription, CardHeader, CardTitle } from '@/shared/ui/card'
import { Input } from '@/shared/ui/input'
import { toast } from '@/shared/ui/toast-store'
import { getSiteSettings, updateSiteSettings } from './api'
@@ -11,6 +12,7 @@ export function SettingsPanel() {
const { t } = useTranslation()
const queryClient = useQueryClient()
const [registrationEnabled, setRegistrationEnabled] = useState(false)
const [preferredAudioLanguages, setPreferredAudioLanguages] = useState('')
const { data, isLoading } = useQuery({
queryKey: ['admin', 'settings'],
@@ -18,11 +20,14 @@ export function SettingsPanel() {
})
useEffect(() => {
if (data) setRegistrationEnabled(data.registrationEnabled)
if (data) {
setRegistrationEnabled(data.registrationEnabled)
setPreferredAudioLanguages(data.preferredAudioLanguages)
}
}, [data])
const save = useMutation({
mutationFn: () => updateSiteSettings({ registrationEnabled }),
mutationFn: () => updateSiteSettings({ registrationEnabled, preferredAudioLanguages }),
onSuccess: () => {
toast.success(t('settings.saved'))
void queryClient.invalidateQueries({ queryKey: ['admin', 'settings'] })
@@ -50,6 +55,24 @@ export function SettingsPanel() {
/>
{t('admin.settings.registrationLabel')}
</label>
<div className="flex flex-col gap-1.5">
<label className="text-sm font-medium" htmlFor="preferred-audio">
{t('admin.settings.preferredAudio')}
</label>
<Input
id="preferred-audio"
className="max-w-xs"
placeholder="rus, eng"
value={preferredAudioLanguages}
disabled={isLoading}
onChange={(e) => setPreferredAudioLanguages(e.target.value)}
/>
<p className="text-xs text-muted-foreground">
{t('admin.settings.preferredAudioHint')}
</p>
</div>
<div>
<Button size="sm" disabled={isLoading || save.isPending} onClick={() => save.mutate()}>
{t('common.save')}