import { Box, Button, Checkbox, Chip, FormControl, FormHelperText, Input, Typography, } from '@mui/joy' import { useQueryClient } from '@tanstack/react-query' import { useEffect, useState } from 'react' import RealTimeSettings from '../../components/RealTimeSettings' import { useUserProfile } from '../../queries/UserQueries' import { useNotification } from '../../service/NotificationProvider' import { GetUserCircle, PutWebhookURL } from '../../utils/Fetcher' import { isPlusAccount } from '../../utils/Helpers' import { offlineDB } from '../../utils/OfflineDB' import { clearBrowserCacheStorage, isOfflineFeatureEnabled, setOfflineFeatureEnabled, subscribeToOfflineFeature, } from '../../utils/OfflineFeatureToggle' import { syncEngine } from '../../utils/SyncEngine' import ConfirmationModal from '../Modals/Inputs/ConfirmationModal' import SettingsLayout from './SettingsLayout' const AdvancedSettings = () => { const { data: userProfile } = useUserProfile() const queryClient = useQueryClient() const { showNotification } = useNotification() const [userCircles, setUserCircles] = useState([]) const [webhookURL, setWebhookURL] = useState(null) const [webhookError, setWebhookError] = useState(null) const [isAdmin, setIsAdmin] = useState(false) const [offlineEnabled, setOfflineEnabled] = useState( isOfflineFeatureEnabled(), ) const [offlineLoading, setOfflineLoading] = useState(false) const [confirmModalConfig, setConfirmModalConfig] = useState({}) useEffect(() => { const unsubscribe = subscribeToOfflineFeature(setOfflineEnabled) return unsubscribe }, []) useEffect(() => { GetUserCircle().then(resp => { resp.json().then(data => { setUserCircles(data.res ? data.res : []) setWebhookURL(data.res ? data.res[0].webhook_url : null) }) }) }, []) // Check if user is admin based on userRole from the circle data useEffect(() => { if (userCircles.length > 0) { setIsAdmin(userCircles[0]?.userRole === 'admin') } }, [userCircles]) const disableOfflineSupport = async () => { setOfflineLoading(true) try { await offlineDB.clearAll() await clearBrowserCacheStorage() setOfflineFeatureEnabled(false) queryClient.removeQueries({ queryKey: ['pendingCommands'] }) queryClient.removeQueries({ queryKey: ['chores'] }) queryClient.invalidateQueries() showNotification({ type: 'success', message: 'Offline mode turned off and local data was cleared', }) } catch { setOfflineFeatureEnabled(false) queryClient.removeQueries({ queryKey: ['pendingCommands'] }) queryClient.removeQueries({ queryKey: ['chores'] }) queryClient.invalidateQueries() showNotification({ type: 'warning', message: 'Offline mode was turned off, but some local data may still be stored', }) } finally { setOfflineLoading(false) } } const showDisableOfflineConfirmation = () => { setConfirmModalConfig({ isOpen: true, title: 'Turn Off Offline Mode', message: 'Turning off offline mode will remove unsynced offline changes and saved offline data on this device/browser. Do you want to continue?', confirmText: 'Turn Off & Clear Data', cancelText: 'Cancel', color: 'danger', onClose: isConfirmed => { setConfirmModalConfig({}) if (isConfirmed) { disableOfflineSupport() } }, }) } const handleOfflineToggle = async event => { const nextEnabled = !!event.target.checked if (nextEnabled) { setOfflineFeatureEnabled(true) await syncEngine.sync() queryClient.invalidateQueries() showNotification({ type: 'success', message: 'Offline mode turned on for this device/browser', }) return } showDisableOfflineConfirmation() } // if (!userProfile) { // return ( // //
Loading...
//
// ) // } return (
Configure advanced features like webhooks and real-time updates for enhanced productivity. Offline Support Early Access Keep using Donetick when you're offline on this device/browser. Your changes are saved locally and synced when you're back online. Turning this off removes unsynced offline changes and saved offline data from this device/browser. {/* Webhook Settings - Only show for admins */} {isAdmin && ( <> Webhook Integration Webhooks allow you to send real-time notifications to other services when events happen in your Circle. Configure a webhook URL to receive real-time updates. {!isPlusAccount(userProfile) && ( Webhook notifications are not available in the Basic plan. Upgrade to Plus to receive real-time updates via webhooks. )} { if (webhookURL === null) { setWebhookURL('') } else { setWebhookURL(null) } }} variant='soft' label='Enable Webhook' disabled={!isPlusAccount(userProfile)} overlay /> Enable webhook notifications for tasks and things updates.{' '} {userProfile && !isPlusAccount(userProfile) && ( Plus Feature )} {webhookURL !== null && ( Webhook URL setWebhookURL(e.target.value)} size='lg' sx={{ width: '220px', mb: 1, }} /> {webhookError && ( {webhookError} )} )} )} {/* Real-time Settings */} Real-time Updates Configure how you receive live updates when tasks and activities change in your circle. {confirmModalConfig?.isOpen && ( )}
) } export default AdvancedSettings