import React, { useState, useEffect, useCallback } from 'react'; import { View, StyleSheet, ScrollView, StatusBar, Platform, Dimensions } from 'react-native'; import { useNavigation, useFocusEffect } from '@react-navigation/native'; import { NavigationProp } from '@react-navigation/native'; import { useSafeAreaInsets } from 'react-native-safe-area-context'; import { useTheme } from '../../contexts/ThemeContext'; import { useSettings } from '../../hooks/useSettings'; import { stremioService } from '../../services/stremioService'; import { mmkvStorage } from '../../services/mmkvStorage'; import { RootStackParamList } from '../../navigation/AppNavigator'; import ScreenHeader from '../../components/common/ScreenHeader'; import PluginIcon from '../../components/icons/PluginIcon'; import { SettingsCard, SettingItem, CustomSwitch, ChevronRight } from './SettingsComponents'; import { useRealtimeConfig } from '../../hooks/useRealtimeConfig'; import { useTranslation } from 'react-i18next'; const { width } = Dimensions.get('window'); interface ContentDiscoverySettingsContentProps { isTablet?: boolean; } /** * Reusable ContentDiscoverySettingsContent component * Can be used inline (tablets) or wrapped in a screen (mobile) */ export const ContentDiscoverySettingsContent: React.FC = ({ isTablet = false }) => { const navigation = useNavigation>(); const { currentTheme } = useTheme(); const { settings, updateSetting } = useSettings(); const { t } = useTranslation(); const config = useRealtimeConfig(); const [addonCount, setAddonCount] = useState(0); const [catalogCount, setCatalogCount] = useState(0); const loadData = useCallback(async () => { try { const addons = await stremioService.getInstalledAddonsAsync(); setAddonCount(addons.length); let totalCatalogs = 0; addons.forEach(addon => { if (addon.catalogs && addon.catalogs.length > 0) { totalCatalogs += addon.catalogs.length; } }); const catalogSettingsJson = await mmkvStorage.getItem('catalog_settings'); if (catalogSettingsJson) { const catalogSettings = JSON.parse(catalogSettingsJson); const disabledCount = Object.entries(catalogSettings) .filter(([key, value]) => key !== '_lastUpdate' && value === false) .length; setCatalogCount(totalCatalogs - disabledCount); } else { setCatalogCount(totalCatalogs); } } catch (error) { if (__DEV__) console.error('Error loading content data:', error); } }, []); useFocusEffect( useCallback(() => { loadData(); }, [loadData]) ); const isItemVisible = (itemId: string) => { if (!config?.items) return true; const item = config.items[itemId]; if (item && item.visible === false) return false; return true; }; const hasVisibleItems = (itemIds: string[]) => { return itemIds.some(id => isItemVisible(id)); }; return ( <> {hasVisibleItems(['addons', 'scrapers']) && ( {isItemVisible('addons') && ( } onPress={() => navigation.navigate('Addons')} isLast={!isItemVisible('scrapers')} isTablet={isTablet} /> )} {isItemVisible('scrapers') && ( } renderControl={() => } onPress={() => navigation.navigate('ScraperSettings')} isLast isTablet={isTablet} /> )} )} {hasVisibleItems(['catalogs', 'home_screen', 'continue_watching']) && ( {isItemVisible('catalogs') && ( } onPress={() => navigation.navigate('CatalogSettings')} isTablet={isTablet} /> )} {isItemVisible('home_screen') && ( } onPress={() => navigation.navigate('HomeScreenSettings')} isTablet={isTablet} /> )} {isItemVisible('continue_watching') && ( } onPress={() => navigation.navigate('ContinueWatchingSettings')} isLast isTablet={isTablet} /> )} )} {hasVisibleItems(['show_discover']) && ( {isItemVisible('show_discover') && ( ( updateSetting('showDiscover', value)} /> )} isLast isTablet={isTablet} /> )} )} ); }; /** * ContentDiscoverySettingsScreen - Wrapper for mobile navigation */ const ContentDiscoverySettingsScreen: React.FC = () => { const navigation = useNavigation>(); const { currentTheme } = useTheme(); const { t } = useTranslation(); const insets = useSafeAreaInsets(); const screenIsTablet = width >= 768; return ( navigation.goBack()} /> ); }; const styles = StyleSheet.create({ container: { flex: 1, }, scrollView: { flex: 1, }, scrollContent: { paddingTop: 16, }, }); export default ContentDiscoverySettingsScreen;