From 043db238362fed76624af091954ac6ceea1374dc Mon Sep 17 00:00:00 2001 From: "gpt-engineer-app[bot]" <159125892+gpt-engineer-app[bot]@users.noreply.github.com> Date: Tue, 18 Mar 2025 01:48:38 +0000 Subject: [PATCH] Ensure sync is disabled The sync setting was not consistently being disabled in certain scenarios. This change ensures that the sync setting is properly disabled when expected. --- src/components/SyncSettings.tsx | 27 +++++++++++++++++++- src/components/security/DataResetSection.tsx | 9 ++++--- src/hooks/sync/useSyncToggle.ts | 14 ++++++++++ src/hooks/useDataReset.ts | 27 ++++++-------------- src/utils/storageUtils.ts | 7 +++-- 5 files changed, 59 insertions(+), 25 deletions(-) diff --git a/src/components/SyncSettings.tsx b/src/components/SyncSettings.tsx index 53efaec..0922eae 100644 --- a/src/components/SyncSettings.tsx +++ b/src/components/SyncSettings.tsx @@ -1,11 +1,12 @@ -import React from 'react'; +import React, { useEffect } from 'react'; import { Switch } from "@/components/ui/switch"; import { Label } from "@/components/ui/label"; import { CloudUpload } from "lucide-react"; import { useSyncSettings } from '@/hooks/useSyncSettings'; import SyncStatus from '@/components/sync/SyncStatus'; import SyncExplanation from '@/components/sync/SyncExplanation'; +import { isSyncEnabled } from '@/utils/sync/syncSettings'; const SyncSettings = () => { const { @@ -17,6 +18,30 @@ const SyncSettings = () => { handleManualSync } = useSyncSettings(); + // 동기화 설정 변경 모니터링 + useEffect(() => { + const checkSyncStatus = () => { + const currentStatus = isSyncEnabled(); + console.log('현재 동기화 상태:', currentStatus ? '활성화됨' : '비활성화됨'); + }; + + // 초기 상태 확인 + checkSyncStatus(); + + // 스토리지 변경 이벤트에도 동기화 상태 확인 추가 + const handleStorageChange = () => { + checkSyncStatus(); + }; + + window.addEventListener('storage', handleStorageChange); + window.addEventListener('auth-state-changed', handleStorageChange); + + return () => { + window.removeEventListener('storage', handleStorageChange); + window.removeEventListener('auth-state-changed', handleStorageChange); + }; + }, []); + return (
{/* 동기화 토글 컨트롤 */} diff --git a/src/components/security/DataResetSection.tsx b/src/components/security/DataResetSection.tsx index adad37d..dfa72f2 100644 --- a/src/components/security/DataResetSection.tsx +++ b/src/components/security/DataResetSection.tsx @@ -16,6 +16,11 @@ const DataResetSection = () => { const handleResetAllData = async () => { await resetAllData(); setIsResetDialogOpen(false); + + // 초기화 후 페이지 새로고침 + setTimeout(() => { + window.location.reload(); + }, 1000); }; return ( @@ -29,9 +34,7 @@ const DataResetSection = () => {

데이터 초기화

{user - ? syncEnabled - ? "로컬 및 클라우드의 모든 예산, 지출 내역이 초기화됩니다. 동기화 설정은 유지됩니다." - : "로컬 및 클라우드의 모든 예산, 지출 내역이 초기화됩니다." + ? "로컬 및 클라우드의 모든 예산, 지출 내역이 초기화됩니다. 동기화 설정은 비활성화됩니다." : "모든 예산, 지출 내역, 설정이 초기화됩니다."}

diff --git a/src/hooks/sync/useSyncToggle.ts b/src/hooks/sync/useSyncToggle.ts index d75a81b..287c489 100644 --- a/src/hooks/sync/useSyncToggle.ts +++ b/src/hooks/sync/useSyncToggle.ts @@ -36,8 +36,19 @@ export const useSyncToggle = () => { // 인증 상태 변경 이벤트 리스너 window.addEventListener('auth-state-changed', updateSyncState); + // 스토리지 변경 이벤트에도 동기화 상태 확인 추가 + const handleStorageChange = (event: StorageEvent) => { + if (event.key === 'syncEnabled' || event.key === null) { + setEnabled(isSyncEnabled()); + console.log('스토리지 변경으로 동기화 상태 업데이트:', isSyncEnabled() ? '활성화' : '비활성화'); + } + }; + + window.addEventListener('storage', handleStorageChange); + return () => { window.removeEventListener('auth-state-changed', updateSyncState); + window.removeEventListener('storage', handleStorageChange); }; }, [user]); @@ -66,6 +77,9 @@ export const useSyncToggle = () => { setEnabled(checked); setSyncEnabled(checked); + // 이벤트 트리거 + window.dispatchEvent(new Event('auth-state-changed')); + if (checked && user) { try { // 동기화 활성화 시 즉시 동기화 실행 diff --git a/src/hooks/useDataReset.ts b/src/hooks/useDataReset.ts index 7d98fc3..5276612 100644 --- a/src/hooks/useDataReset.ts +++ b/src/hooks/useDataReset.ts @@ -3,9 +3,9 @@ import { useState } from 'react'; import { useNavigate } from 'react-router-dom'; import { useToast } from '@/hooks/useToast.wrapper'; import { resetAllStorageData } from '@/utils/storageUtils'; -import { clearCloudData } from '@/utils/syncUtils'; +import { clearCloudData } from '@/utils/sync/clearCloudData'; import { useAuth } from '@/contexts/auth/AuthProvider'; -import { isSyncEnabled } from '@/utils/sync/syncSettings'; +import { isSyncEnabled, setSyncEnabled } from '@/utils/sync/syncSettings'; export interface DataResetResult { isCloudResetSuccess: boolean | null; @@ -36,8 +36,6 @@ export const useDataReset = () => { if (cloudResetSuccess) { console.log('클라우드 데이터 초기화 성공'); - // 주석 처리 - 동기화 설정 유지 - // setSyncEnabled(false); } else { console.warn('클라우드 데이터 초기화 실패 또는 부분 성공'); } @@ -69,12 +67,6 @@ export const useDataReset = () => { } } - // 동기화 설정 백업 - if (syncWasEnabled) { - authBackupItems['syncEnabled'] = 'true'; - console.log('동기화 설정 백업: 활성화 상태'); - } - // 데이터 초기화 resetAllStorageData(); @@ -95,11 +87,9 @@ export const useDataReset = () => { } }); - // 동기화 설정 복원 - if (syncWasEnabled) { - localStorage.setItem('syncEnabled', 'true'); - console.log('동기화 설정 복원: 활성화 상태'); - } + // 중요: 동기화 설정은 초기화 후 항상 비활성화 + setSyncEnabled(false); + console.log('동기화 설정이 비활성화되었습니다.'); // 마지막 동기화 시간은 초기화 localStorage.removeItem('lastSync'); @@ -109,20 +99,19 @@ export const useDataReset = () => { window.dispatchEvent(new Event('budgetDataUpdated')); window.dispatchEvent(new Event('categoryBudgetsUpdated')); window.dispatchEvent(new StorageEvent('storage')); + window.dispatchEvent(new Event('auth-state-changed')); // 동기화 상태 변경 이벤트 추가 // 클라우드 초기화 상태에 따라 다른 메시지 표시 if (user) { if (cloudResetSuccess) { toast({ title: "모든 데이터가 초기화되었습니다.", - description: syncWasEnabled - ? "로컬 및 클라우드의 모든 데이터가 초기화되었습니다. 동기화 설정은 유지됩니다." - : "로컬 및 클라우드의 모든 데이터가 초기화되었습니다.", + description: "로컬 및 클라우드의 모든 데이터가 초기화되었으며, 동기화 설정이 비활성화되었습니다.", }); } else { toast({ title: "로컬 데이터만 초기화됨", - description: "로컬 데이터는 초기화되었지만, 클라우드 데이터 초기화 중 문제가 발생했습니다.", + description: "로컬 데이터는 초기화되었지만, 클라우드 데이터 초기화 중 문제가 발생했습니다. 동기화 설정이 비활성화되었습니다.", variant: "destructive" }); } diff --git a/src/utils/storageUtils.ts b/src/utils/storageUtils.ts index 0ec7fc8..de26796 100644 --- a/src/utils/storageUtils.ts +++ b/src/utils/storageUtils.ts @@ -1,3 +1,4 @@ + import { Transaction } from '@/components/TransactionCard'; // 트랜잭션 데이터 불러오기 @@ -99,7 +100,7 @@ export const resetAllStorageData = (): void => { 'budgetHistory', 'transactionHistory', 'lastSync', - 'syncEnabled', // 동기화 설정도 초기화 (변경된 부분) + 'syncEnabled', // 동기화 설정도 초기화 ]; // 키 삭제 @@ -153,14 +154,16 @@ export const resetAllStorageData = (): void => { localStorage.setItem('supabase.auth.token', supabase); } - // 동기화 설정은 OFF로 설정 (변경된 부분) + // 동기화 설정은 무조건 OFF로 설정 localStorage.setItem('syncEnabled', 'false'); + console.log('동기화 설정이 OFF로 변경되었습니다'); // 이벤트 발생 window.dispatchEvent(new Event('transactionUpdated')); window.dispatchEvent(new Event('budgetDataUpdated')); window.dispatchEvent(new Event('categoryBudgetsUpdated')); window.dispatchEvent(new StorageEvent('storage')); + window.dispatchEvent(new Event('auth-state-changed')); // 동기화 상태 변경 이벤트 추가 console.log('모든 저장소 데이터가 완전히 초기화되었습니다. (동기화 설정이 OFF로 변경됨)'); } catch (error) {