feat: hide info tabs by display mode visibility

This commit is contained in:
Boris Kovalskii
2026-06-11 09:17:05 +10:00
parent 0d6a85a4f9
commit 39758a18b0

View File

@@ -3,7 +3,7 @@ import { useQuery } from '@tanstack/react-query';
import { useTranslation } from 'react-i18next';
import { PiCaretDown } from 'react-icons/pi';
import DOMPurify from 'dompurify';
import { infoApi, FaqPage } from '../api/info';
import { infoApi, FaqPage, InfoVisibility } from '../api/info';
import { infoPagesApi } from '../api/infoPages';
import { promoApi, LoyaltyTierInfo } from '../api/promo';
import type { FaqItem, ReplacesTab } from '../api/infoPages';
@@ -331,6 +331,12 @@ export default function Info() {
staleTime: 60_000,
});
const { data: visibility } = useQuery({
queryKey: ['info-visibility'],
queryFn: infoApi.getVisibility,
staleTime: 60_000,
});
// Filter to only pages that don't replace a built-in tab and don't collide with built-in IDs
const extraPages = useMemo(
() => (customPages ?? []).filter((p) => !p.replaces_tab && !BUILTIN_TABS.has(p.slug)),
@@ -425,6 +431,7 @@ export default function Info() {
refetchOnMount: 'always',
});
const tabs = useMemo(() => {
const builtinTabs: Array<{ id: string; label: string; icon: React.FC; emoji?: string }> = [
{ id: 'faq', label: t('info.faq'), icon: QuestionIcon },
{ id: 'rules', label: t('info.rules'), icon: DocumentIcon },
@@ -433,12 +440,27 @@ export default function Info() {
{ id: 'loyalty', label: t('info.loyalty'), icon: StarIcon },
];
const visibleBuiltinTabs = builtinTabs.filter((tab) => {
if (tab.id === 'loyalty') return true;
if (tabReplacements?.[tab.id as ReplacesTab]) return true;
if (!visibility) return true;
return visibility[tab.id as keyof InfoVisibility];
});
const customTabs = extraPages.map((p) => {
const label = p.title[locale] || p.title['ru'] || p.title['en'] || p.slug;
return { id: p.slug, label, icon: DocumentIcon, emoji: p.icon ?? undefined };
});
const tabs = [...builtinTabs, ...customTabs];
return [...visibleBuiltinTabs, ...customTabs];
}, [visibility, tabReplacements, extraPages, locale, t]);
useEffect(() => {
if (tabs.length === 0) return;
if (!tabs.some((tab) => tab.id === activeTab)) {
setActiveTab(tabs[0].id);
}
}, [tabs, activeTab]);
const toggleFaq = useCallback((id: number) => {
setExpandedFaq((prev) => (prev === id ? null : id));