{/* Search */}
{items.length > 3 && (
)}
{/* Accordion items */}
{filteredItems.length === 0 ? (
{search ? t('admin.infoPages.faq.noResults') : t('admin.infoPages.faq.noQuestions')}
) : (
{filteredItems.map((item, index) => {
const key = `${index}-${item.q.slice(0, 50)}`;
return (
handleToggle(key)}
/>
);
})}
)}
);
}
export default function InfoPageView() {
const { slug } = useParams<{ slug: string }>();
const { t, i18n } = useTranslation();
const navigate = useNavigate();
const { capabilities, backButton } = usePlatform();
const navigateRef = useRef(navigate);
useEffect(() => {
navigateRef.current = navigate;
}, [navigate]);
useEffect(() => {
if (!capabilities.hasBackButton) return;
backButton.show(() => navigateRef.current(-1));
return () => backButton.hide();
}, [capabilities.hasBackButton, backButton]);
const {
data: page,
isLoading,
isError,
} = useQuery({
queryKey: ['info-pages', 'page', slug],
queryFn: () => {
if (!slug) throw new Error('Missing slug parameter');
return infoPagesApi.getPageBySlug(slug);
},
enabled: !!slug,
staleTime: 60_000,
});
const locale = i18n.language.split('-')[0];
const resolvedTitle = useMemo(() => {
if (!page) return '';
return page.title[locale] || page.title['ru'] || page.title['en'] || '';
}, [page, locale]);
const isFaq = page?.page_type === 'faq';
// Parse FAQ items from content
const faqItems = useMemo((): FaqItem[] => {
if (!page || !isFaq) return [];
const raw = page.content[locale] || page.content['ru'] || page.content['en'] || '[]';
try {
const parsed = typeof raw === 'string' ? JSON.parse(raw) : raw;
return Array.isArray(parsed) ? parsed : [];
} catch {
return [];
}
}, [page, locale, isFaq]);
// Content is sanitized with DOMPurify before rendering
const sanitizedContent = useMemo(() => {
if (!page || isFaq) return '';
const rawContent = page.content[locale] || page.content['ru'] || page.content['en'] || '';
return sanitizeHtml(rawContent);
}, [page, locale, isFaq]);
if (isLoading) {
return (
{/* Back button */}
{!capabilities.hasBackButton && (
)}
{/* Page header */}
{page.icon && {page.icon}}
{resolvedTitle}
{/* Page content */}
{isFaq ? (
) : (
/* Regular page content - sanitized with DOMPurify (strict allowlist) */
)}
);
}