import React, { useEffect, useMemo } from 'react'; import { View, StyleSheet, Text } from 'react-native'; import { colors, spacing, typography } from '../../../theme'; import { useNotificationPreferencesStore } from '../../../store'; import { useAuthStore } from '../../../store'; import { SettingsSection } from './SettingsSection'; import { SwitchItem } from './SwitchItem'; export interface NotificationSettingsProps { pushEnabled: boolean; isUpdatingPush: boolean; onPushToggle: (value: boolean) => void; delay?: number; } export const NotificationSettings: React.FC = ({ pushEnabled, isUpdatingPush, onPushToggle, delay = 360, }) => { const { user } = useAuthStore(); const { preferences, isUpdating, fetchPreferences, updatePreference } = useNotificationPreferencesStore(); // Fetch notification preferences on mount when user is available useEffect(() => { if (user?.id && !preferences) { fetchPreferences(); } }, [user?.id, preferences, fetchPreferences]); // Memoize handlers to prevent unnecessary re-renders const handlers = useMemo(() => ({ onMatchesToggle: (value: boolean) => updatePreference('matches_enabled', value), onMessagesToggle: (value: boolean) => updatePreference('messages_enabled', value), onPartnerActivityToggle: (value: boolean) => updatePreference('partner_activity_enabled', value), onNudgesToggle: (value: boolean) => updatePreference('nudges_enabled', value), onPackChangesToggle: (value: boolean) => updatePreference('pack_changes_enabled', value), onNewPacksToggle: (value: boolean) => updatePreference('new_packs_enabled', value), onStreakMilestonesToggle: (value: boolean) => updatePreference('streak_milestones_enabled', value), }), [updatePreference]); return ( {/* Master push toggle */} {/* Granular settings - only show when push is enabled and preferences are loaded */} {pushEnabled && preferences && ( <> Notification Types )} ); }; const styles = StyleSheet.create({ sectionDivider: { marginTop: spacing.lg, marginBottom: spacing.md, paddingTop: spacing.md, borderTopWidth: 1, borderTopColor: colors.border, }, subsectionLabel: { ...typography.caption1, color: colors.textTertiary, fontWeight: '600', letterSpacing: 1, textTransform: 'uppercase', }, itemDivider: { height: 1, backgroundColor: colors.border, marginVertical: spacing.sm, }, });