From eb25423b27e43ee1940f43a813876b08e8ba6230 Mon Sep 17 00:00:00 2001 From: "gpt-engineer-app[bot]" <159125892+gpt-engineer-app[bot]@users.noreply.github.com> Date: Sat, 22 Mar 2025 06:18:55 +0000 Subject: [PATCH] Update last sync time Ensure the last sync time is updated after adding a budget. --- src/hooks/sync/useManualSync.ts | 4 +- src/hooks/sync/useSyncStatus.ts | 26 ++++++-- src/hooks/useSyncSettings.ts | 9 +++ src/utils/sync/data.ts | 11 +++- src/utils/syncUtils.ts | 103 +++++++++++++++++++++----------- 5 files changed, 110 insertions(+), 43 deletions(-) diff --git a/src/hooks/sync/useManualSync.ts b/src/hooks/sync/useManualSync.ts index 53d9839..959229b 100644 --- a/src/hooks/sync/useManualSync.ts +++ b/src/hooks/sync/useManualSync.ts @@ -46,7 +46,9 @@ export const useManualSync = (user: any) => { // 동기화 시간 업데이트 if (result.success) { - setLastSyncTime(new Date().toISOString()); + const currentTime = new Date().toISOString(); + console.log('수동 동기화 성공, 시간 업데이트:', currentTime); + setLastSyncTime(currentTime); } return result; diff --git a/src/hooks/sync/useSyncStatus.ts b/src/hooks/sync/useSyncStatus.ts index c39beaf..75324e6 100644 --- a/src/hooks/sync/useSyncStatus.ts +++ b/src/hooks/sync/useSyncStatus.ts @@ -54,17 +54,35 @@ export const useSyncStatus = () => { // 동기화 시간이 변경될 때 상태 업데이트 useEffect(() => { - const updateLastSyncTime = () => { - setLastSync(getLastSyncTime()); + console.log('useSyncStatus 훅 초기화, 현재 마지막 동기화 시간:', lastSync); + + const updateLastSyncTime = (event?: Event | CustomEvent) => { + const newTime = getLastSyncTime(); + console.log('마지막 동기화 시간 업데이트됨:', newTime, event instanceof CustomEvent ? `(이벤트 상세: ${JSON.stringify(event.detail)})` : ''); + setLastSync(newTime); }; - // 이벤트 리스너 등록 + // 이벤트 리스너 등록 - 커스텀 이벤트 사용 window.addEventListener('syncTimeUpdated', updateLastSyncTime); + // 스토리지 이벤트도 모니터링 + const handleStorageChange = (event: StorageEvent) => { + if (event.key === 'lastSync' || event.key === null) { + console.log('스토리지 변경 감지 (lastSync):', event.newValue); + updateLastSyncTime(); + } + }; + + window.addEventListener('storage', handleStorageChange); + + // 초기 상태 업데이트 + updateLastSyncTime(); + return () => { window.removeEventListener('syncTimeUpdated', updateLastSyncTime); + window.removeEventListener('storage', handleStorageChange); }; - }, []); + }, [lastSync]); return { lastSync, diff --git a/src/hooks/useSyncSettings.ts b/src/hooks/useSyncSettings.ts index 34ed383..7eaf7e7 100644 --- a/src/hooks/useSyncSettings.ts +++ b/src/hooks/useSyncSettings.ts @@ -13,6 +13,15 @@ export const useSyncSettings = () => { const { enabled, setEnabled, handleSyncToggle } = useSyncToggle(); const { syncing, handleManualSync } = useManualSync(user); const { lastSync, formatLastSyncTime } = useSyncStatus(); + + // 콘솔에 상태 기록 + useEffect(() => { + console.log(`[동기화설정] 상태 변경: + - 활성화: ${enabled ? '예' : '아니오'} + - 진행중: ${syncing ? '예' : '아니오'} + - 마지막동기화: ${lastSync || '없음'} + - 사용자: ${user ? '로그인됨' : '로그인안됨'}`); + }, [enabled, syncing, lastSync, user]); return { enabled, diff --git a/src/utils/sync/data.ts b/src/utils/sync/data.ts index 6e90eb8..c5ad5a5 100644 --- a/src/utils/sync/data.ts +++ b/src/utils/sync/data.ts @@ -3,7 +3,7 @@ * 데이터 동기화 메인 모듈 */ import { isSyncEnabled } from './config'; -import { setLastSyncTime } from './time'; +import { setLastSyncTime } from '../syncUtils'; import { BackupData, SyncResult, @@ -107,15 +107,20 @@ export const syncAllData = async (userId: string): Promise => { // 전체 성공 여부 설정 result.success = result.uploadSuccess || result.downloadSuccess; - // 동기화 시간 기록 + // 동기화 시간 기록 - 추가 디버깅 로그 및 중요 부분 if (result.success) { - setLastSyncTime(new Date().toISOString()); + const currentTime = new Date().toISOString(); + console.log('동기화 성공, 시간 업데이트:', currentTime); + setLastSyncTime(currentTime); + } else { + console.log('동기화 실패, 시간 업데이트 안함'); } console.log('데이터 동기화 결과:', result); return result; } catch (error) { // 오류 발생 시 백업 데이터 복원 + console.error('동기화 중 오류 발생:', error); recoverFromSyncError(backup, error); return result; diff --git a/src/utils/syncUtils.ts b/src/utils/syncUtils.ts index 640c0b2..10da998 100644 --- a/src/utils/syncUtils.ts +++ b/src/utils/syncUtils.ts @@ -1,41 +1,74 @@ -// 편의를 위한 인덱스 파일 +// 동기화 관련 설정 관리 -// sync 디렉토리의 함수들 내보내기 -export * from './sync/data'; -export * from './sync/time'; -export * from './sync/transaction'; -export * from './sync/budget'; -export * from './sync/clearCloudData'; - -// 설정 관련 함수들 내보내기 - 이름 충돌 방지를 위해 명시적으로 내보내기 -export { - isSyncEnabled, - setSyncEnabled, - initSyncSettings -} from './sync/config'; - -// 동기화 상태 초기화 함수 추가 -export const initSyncState = async (): Promise => { +/** + * 동기화 활성화 여부 확인 + */ +export const isSyncEnabled = (): boolean => { try { - // 동기화 설정 초기화 - const { initSyncSettings } = await import('./sync/config'); - initSyncSettings(); - console.log('동기화 설정 초기화 완료'); - - // 네트워크 상태 모니터링 시작 - window.addEventListener('online', () => { - console.log('네트워크 연결됨'); - window.dispatchEvent(new Event('networkStatusChanged')); - }); - - window.addEventListener('offline', () => { - console.log('네트워크 연결 끊김'); - window.dispatchEvent(new Event('networkStatusChanged')); - }); - - console.log('네트워크 모니터링 시작됨'); + const value = localStorage.getItem('syncEnabled'); + return value === 'true'; } catch (error) { - console.error('동기화 상태 초기화 오류:', error); + console.error('동기화 설정 조회 오류:', error); + return false; } }; + +/** + * 동기화 설정 변경 + */ +export const setSyncEnabled = (enabled: boolean): void => { + try { + localStorage.setItem('syncEnabled', enabled ? 'true' : 'false'); + // 상태 변경 이벤트 발생 + window.dispatchEvent(new Event('syncSettingChanged')); + window.dispatchEvent(new StorageEvent('storage', { + key: 'syncEnabled', + newValue: enabled ? 'true' : 'false' + })); + console.log('동기화 설정이 변경되었습니다:', enabled ? '활성화' : '비활성화'); + } catch (error) { + console.error('동기화 설정 변경 오류:', error); + } +}; + +/** + * 동기화 설정 초기화 + */ +export const initSyncSettings = (): void => { + // 이미 설정이 있으면 초기화하지 않음 + if (localStorage.getItem('syncEnabled') === null) { + setSyncEnabled(false); // 기본값: 비활성화 + } + console.log('동기화 설정 초기화 완료, 현재 상태:', isSyncEnabled() ? '활성화' : '비활성화'); +}; + +/** + * 마지막 동기화 시간 가져오기 + */ +export const getLastSyncTime = (): string | null => { + return localStorage.getItem('lastSync'); +}; + +/** + * 마지막 동기화 시간 설정 + */ +export const setLastSyncTime = (timestamp: string): void => { + console.log('마지막 동기화 시간 업데이트:', timestamp); + localStorage.setItem('lastSync', timestamp); + + // 이벤트 발생 - 커스텀 이벤트로 변경하여 디버깅 용이하게 + try { + const event = new CustomEvent('syncTimeUpdated', { + detail: { time: timestamp } + }); + window.dispatchEvent(event); + console.log('syncTimeUpdated 이벤트 발생 완료'); + } catch (error) { + console.error('동기화 시간 이벤트 발생 오류:', error); + } +}; + +// syncUtils.ts에서 사용하던 함수들도 여기로 통합 +export { trySyncAllData } from './sync/data'; +export type { SyncResult } from './sync/data';