From 6755c1dc458e7f3ff68fb180306f72b17ff2a5b8 Mon Sep 17 00:00:00 2001 From: Fringg Date: Fri, 6 Mar 2026 17:00:05 +0300 Subject: [PATCH] =?UTF-8?q?fix:=20landing=20list=20crash=20=E2=80=94=20tit?= =?UTF-8?q?le=20is=20now=20LocaleDict,=20not=20string?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Update LandingListItem.title type to LocaleDict - Add resolveLocaleDisplay() helper for extracting display string - Use resolveLocaleDisplay() in landing list and delete confirm --- src/api/landings.ts | 9 ++++++++- src/pages/AdminLandings.tsx | 8 +++++--- 2 files changed, 13 insertions(+), 4 deletions(-) diff --git a/src/api/landings.ts b/src/api/landings.ts index b40ecfc..d940139 100644 --- a/src/api/landings.ts +++ b/src/api/landings.ts @@ -108,7 +108,7 @@ export interface AdminLandingFeature { export interface LandingListItem { id: number; slug: string; - title: string; + title: LocaleDict; is_active: boolean; display_order: number; gift_enabled: boolean; @@ -167,6 +167,13 @@ export type LandingUpdateRequest = Partial; * If it's a string, wraps it as `{ ru: value }`. * If null/undefined, returns the fallback. */ +/** Extract best display string from a LocaleDict: ru → en → first available → '' */ +export function resolveLocaleDisplay(dict: LocaleDict | string | null | undefined): string { + if (!dict) return ''; + if (typeof dict === 'string') return dict; + return dict.ru || dict.en || Object.values(dict).find((v) => v?.trim()) || ''; +} + export function toLocaleDict( value: string | LocaleDict | null | undefined, fallback: LocaleDict = {}, diff --git a/src/pages/AdminLandings.tsx b/src/pages/AdminLandings.tsx index e65ff2c..1511d0a 100644 --- a/src/pages/AdminLandings.tsx +++ b/src/pages/AdminLandings.tsx @@ -2,7 +2,7 @@ import { useState, useCallback, useEffect, useRef } from 'react'; import { useNavigate } from 'react-router'; import { useQuery, useMutation, useQueryClient } from '@tanstack/react-query'; import { useTranslation } from 'react-i18next'; -import { adminLandingsApi, LandingListItem } from '../api/landings'; +import { adminLandingsApi, LandingListItem, resolveLocaleDisplay } from '../api/landings'; import { useNotify } from '@/platform'; import { copyToClipboard } from '../utils/clipboard'; import { getApiErrorMessage } from '../utils/api-error'; @@ -137,7 +137,9 @@ function SortableLandingCard({ {/* Content */}
-

{landing.title}

+

+ {resolveLocaleDisplay(landing.title)} +

{landing.slug} @@ -204,7 +206,7 @@ function SortableLandingCard({ )} title={ isPendingDelete - ? t('admin.landings.deleteConfirm', { title: landing.title }) + ? t('admin.landings.deleteConfirm', { title: resolveLocaleDisplay(landing.title) }) : t('common.delete') } >