diff --git a/components/settings/unified/UnifiedSettingsModal.tsx b/components/settings/unified/UnifiedSettingsModal.tsx index 09f462d..c57b10a 100644 --- a/components/settings/unified/UnifiedSettingsModal.tsx +++ b/components/settings/unified/UnifiedSettingsModal.tsx @@ -2,7 +2,7 @@ import { useState, useCallback, useEffect, useRef } from 'react' import { AnimatePresence, motion } from 'framer-motion' -import { X, GearSix, Buildings, User, Warning } from '@phosphor-icons/react' +import { X, GearSix, Buildings, User } from '@phosphor-icons/react' import { useUnifiedSettings } from '@/lib/unified-settings-context' import { useAuth } from '@/lib/auth/context' import { useSite } from '@/lib/swr/dashboard' @@ -229,39 +229,25 @@ export default function UnifiedSettingsModal() { const [sites, setSites] = useState([]) const [activeSiteId, setActiveSiteId] = useState(null) - // ─── Dirty state & pending navigation ──────────────────────── + // ─── Dirty state ────────────────────────────────────────────── const isDirtyRef = useRef(false) - const [showDirtyBar, setShowDirtyBar] = useState(false) - const pendingActionRef = useRef<(() => void) | null>(null) const handleDirtyChange = useCallback((dirty: boolean) => { isDirtyRef.current = dirty - // Hide the bar if user saves (dirty becomes false) while bar is showing - if (!dirty) setShowDirtyBar(false) }, []) - /** Try to execute an action — if dirty, show confirmation bar instead */ + /** Run action if clean, or confirm discard if dirty */ const guardedAction = useCallback((action: () => void) => { if (isDirtyRef.current) { - pendingActionRef.current = action - setShowDirtyBar(true) + if (confirm('You have unsaved changes. Discard and continue?')) { + isDirtyRef.current = false + action() + } } else { action() } }, []) - const handleDiscardAndContinue = useCallback(() => { - isDirtyRef.current = false - setShowDirtyBar(false) - pendingActionRef.current?.() - pendingActionRef.current = null - }, []) - - const handleStayHere = useCallback(() => { - setShowDirtyBar(false) - pendingActionRef.current = null - }, []) - // Apply initial tab when modal opens useEffect(() => { if (isOpen && initTab) { @@ -276,11 +262,7 @@ export default function UnifiedSettingsModal() { // Reset dirty state when modal opens useEffect(() => { - if (isOpen) { - isDirtyRef.current = false - setShowDirtyBar(false) - pendingActionRef.current = null - } + if (isOpen) isDirtyRef.current = false }, [isOpen]) // Detect site from URL and load sites list when modal opens @@ -315,13 +297,12 @@ export default function UnifiedSettingsModal() { else openUnifiedSettings() } if (e.key === 'Escape' && isOpen) { - if (showDirtyBar) handleStayHere() - else guardedAction(closeSettings) + guardedAction(closeSettings) } } window.addEventListener('keydown', handler) return () => window.removeEventListener('keydown', handler) - }, [isOpen, openUnifiedSettings, closeSettings, guardedAction, showDirtyBar, handleStayHere]) + }, [isOpen, openUnifiedSettings, closeSettings, guardedAction]) const tabs = context === 'site' ? SITE_TABS : context === 'workspace' ? WORKSPACE_TABS : ACCOUNT_TABS const activeTab = context === 'site' ? siteTabs : context === 'workspace' ? workspaceTabs : accountTabs @@ -399,40 +380,6 @@ export default function UnifiedSettingsModal() { - {/* Unsaved changes bar */} - - {showDirtyBar && ( - -
-
- - You have unsaved changes. -
-
- - -
-
-
- )} -
- {/* Content */}