import { useState, useMemo, useEffect, useCallback } from 'react'; import { useNavigate } from 'react-router'; import { useQuery } from '@tanstack/react-query'; import { useTranslation } from 'react-i18next'; import { adminSettingsApi, SettingDefinition } from '../api/adminSettings'; import { themeColorsApi } from '../api/themeColors'; import { useFavoriteSettings } from '../hooks/useFavoriteSettings'; import { MENU_SECTIONS, MenuItem, formatSettingKey } from '../components/admin'; import { usePlatform } from '../platform/hooks/usePlatform'; import { AnalyticsTab } from '../components/admin/AnalyticsTab'; import { BrandingTab } from '../components/admin/BrandingTab'; import { ButtonsTab } from '../components/admin/ButtonsTab'; import { ThemeTab } from '../components/admin/ThemeTab'; import { FavoritesTab } from '../components/admin/FavoritesTab'; import { SettingsTab } from '../components/admin/SettingsTab'; import { SettingsMobileTabs } from '../components/admin/SettingsMobileTabs'; import { SettingsSearch, SettingsSearchMobile, SettingsSearchResults, } from '../components/admin/SettingsSearch'; // BackIcon const BackIcon = () => ( ); // Find section ID by category key function findSectionByCategory(categoryKey: string): string | null { for (const section of MENU_SECTIONS) { for (const item of section.items) { if (item.categories?.includes(categoryKey)) { return item.id; } } } return null; } export default function AdminSettings() { const { t } = useTranslation(); const navigate = useNavigate(); const { capabilities } = usePlatform(); // State const [activeSection, setActiveSection] = useState('branding'); const [searchQuery, setSearchQuery] = useState(''); // Favorites hook const { favorites, toggleFavorite, isFavorite } = useFavoriteSettings(); // Scroll to top on section change useEffect(() => { window.scrollTo({ top: 0, behavior: 'instant' }); }, [activeSection]); // Queries const { data: themeColors } = useQuery({ queryKey: ['theme-colors'], queryFn: themeColorsApi.getColors, }); const { data: allSettings } = useQuery({ queryKey: ['admin-settings'], queryFn: () => adminSettingsApi.getSettings(), }); // Get current menu item configuration const currentMenuItem = useMemo(() => { for (const section of MENU_SECTIONS) { const item = section.items.find((i: MenuItem) => i.id === activeSection); if (item) return item; } return null; }, [activeSection]); // Get categories for current section const currentCategories = useMemo(() => { if (!currentMenuItem?.categories || !allSettings || !Array.isArray(allSettings)) return []; const categoryMap = new Map(); for (const setting of allSettings) { if (currentMenuItem.categories.includes(setting.category.key)) { if (!categoryMap.has(setting.category.key)) { categoryMap.set(setting.category.key, []); } categoryMap.get(setting.category.key)!.push(setting); } } return Array.from(categoryMap.entries()).map(([key, settings]) => ({ key, label: t(`admin.settings.categories.${key}`, key), settings, })); }, [currentMenuItem, allSettings, t]); // Filter settings for search - GLOBAL search across all settings const filteredSettings = useMemo(() => { if (!allSettings || !Array.isArray(allSettings) || !searchQuery) return []; const q = searchQuery.toLowerCase().trim(); if (!q) return []; return allSettings.filter((s: SettingDefinition) => { // Search by key if (s.key.toLowerCase().includes(q)) return true; // Search by original name if (s.name?.toLowerCase().includes(q)) return true; // Search by translated name const formattedKey = formatSettingKey(s.name || s.key); const translatedName = t(`admin.settings.settingNames.${formattedKey}`, formattedKey); if (translatedName.toLowerCase().includes(q)) return true; // Search by description if (s.hint?.description?.toLowerCase().includes(q)) return true; // Search by category const categoryLabel = t(`admin.settings.categories.${s.category.key}`, s.category.key); if (categoryLabel.toLowerCase().includes(q)) return true; return false; }); }, [allSettings, searchQuery, t]); // Favorite settings const favoriteSettings = useMemo(() => { if (!allSettings || !Array.isArray(allSettings)) return []; return allSettings.filter((s: SettingDefinition) => favorites.includes(s.key)); }, [allSettings, favorites]); // Handle setting selection from autocomplete const handleSelectSetting = useCallback( (setting: SettingDefinition) => { const sectionId = findSectionByCategory(setting.category.key); if (sectionId) { setActiveSection(sectionId); } // Set search to setting key to filter to just this setting setSearchQuery(setting.key); }, [setActiveSection, setSearchQuery], ); // Render content based on active section const renderContent = () => { // If searching, always show search results regardless of active section if (searchQuery.trim()) { return ( ); } switch (activeSection) { case 'analytics': return ; case 'branding': return ; case 'theme': return ; case 'buttons': return ; case 'favorites': return ( ); default: if ( [ 'payments', 'subscriptions', 'interface', 'notifications', 'database', 'system', 'users', ].includes(activeSection) ) { return ( ); } return null; } }; return ( <> {/* Mobile Layout */}
{renderContent()}
{/* Desktop Layout - fixed sidebar, scrollable content */}
{/* Fixed Sidebar */}
{/* Show back button only on web, not in Telegram Mini App */} {!capabilities.hasBackButton && ( )}

{t('admin.settings.title')}

{/* Scrollable Content */}

{t(`admin.settings.${activeSection}`)}

{renderContent()}
); }