import { Sync, SyncDisabled } from '@mui/icons-material' import { Box, Card, Chip, FormHelperText, Switch, Typography } from '@mui/joy' import { useState } from 'react' import { useSSEContext } from '../hooks/useSSEContext' import { useUserProfile } from '../queries/UserQueries' import { isPlusAccount } from '../utils/Helpers' import SSEConnectionStatus from './SSEConnectionStatus' const REALTIME_TYPES = { DISABLED: 'disabled', SSE: 'sse', } const RealTimeSettings = () => { const { data: userProfile } = useUserProfile() // SSE context const sseContext = useSSEContext() // Get current realtime type from localStorage const getCurrentRealtimeType = () => { const sseEnabled = localStorage.getItem('sse_enabled') === 'true' return sseEnabled ? REALTIME_TYPES.SSE : REALTIME_TYPES.DISABLED } const [realtimeType, setRealtimeType] = useState(getCurrentRealtimeType()) const handleRealtimeTypeChange = (event, newValue) => { if (!isPlusAccount(userProfile)) { return // Don't allow changes for non-Plus users } setRealtimeType(newValue) // Update localStorage and toggle connections switch (newValue) { case REALTIME_TYPES.DISABLED: localStorage.setItem('sse_enabled', 'false') sseContext.disconnect() break case REALTIME_TYPES.SSE: localStorage.setItem('sse_enabled', 'true') sseContext.connect() break } } const getCurrentContext = () => { switch (realtimeType) { case REALTIME_TYPES.SSE: return sseContext default: return { isConnected: false, isConnecting: false, error: null, getConnectionStatus: () => 'disabled', } } } const context = getCurrentContext() const getStatusDescription = () => { if (!isPlusAccount(userProfile)) { return 'Real-time updates are not available in the Basic plan. Upgrade to Plus to receive instant notifications when chores are updated.' } if (realtimeType === REALTIME_TYPES.DISABLED) { return 'Real-time updates are disabled. Enable them to see live changes when you or other circle members complete, skip, or modify chores.' } if (context.isConnected) { return "Real-time updates are working. You'll see live changes when you or other circle members complete, skip, or modify chores." } if (context.isConnecting) { return 'Connecting to real-time updates...' } if (context.error) { return `Real-time updates are enabled but not working: ${context.error}` } return 'Real-time updates are enabled but not currently connected.' } const getConnectionStatusComponent = () => { switch (realtimeType) { case REALTIME_TYPES.SSE: return default: return null } } return ( {realtimeType !== REALTIME_TYPES.DISABLED && isPlusAccount(userProfile) ? ( ) : ( )} Real-time Updates {!isPlusAccount(userProfile) && ( Plus Feature )} { handleRealtimeTypeChange( null, e.target.checked ? REALTIME_TYPES.SSE : REALTIME_TYPES.DISABLED, ) }} disabled={!isPlusAccount(userProfile)} inputProps={{ 'aria-label': 'Enable Real-time Updates' }} /> Get instant notifications when chores are updated {/* Real-time Connection Type Choose how to receive real-time updates */} {getStatusDescription()} {realtimeType !== REALTIME_TYPES.DISABLED && isPlusAccount(userProfile) && ( Status: {getConnectionStatusComponent()} {context.error && ( {context.error} )} )} {!isPlusAccount(userProfile) && ( Real-time updates are not available in the Basic plan. Upgrade to Plus to receive instant notifications when you or other circle members complete, skip, or modify chores. )} ) } export default RealTimeSettings