From 6ec671e9ab44fe2d7eb1b3dad5473ac44051c513 Mon Sep 17 00:00:00 2001 From: "gpt-engineer-app[bot]" <159125892+gpt-engineer-app[bot]@users.noreply.github.com> Date: Fri, 21 Mar 2025 08:43:47 +0000 Subject: [PATCH] Fix TypeScript and Sync Errors - Resolves TypeScript errors related to missing exports and incorrect argument counts. - Corrects re-exporting of types to comply with `isolatedModules` setting. - Addresses issues in sync-related files to ensure proper functionality. --- src/hooks/sync/syncResultHandler.ts | 52 ++++++++++++++++------------- src/hooks/sync/useManualSync.ts | 12 +++---- src/hooks/sync/useSyncToggle.ts | 16 ++++----- src/utils/sync/data.ts | 10 ++---- src/utils/syncUtils.ts | 28 ++++++++-------- 5 files changed, 56 insertions(+), 62 deletions(-) diff --git a/src/hooks/sync/syncResultHandler.ts b/src/hooks/sync/syncResultHandler.ts index df54c8d..502e242 100644 --- a/src/hooks/sync/syncResultHandler.ts +++ b/src/hooks/sync/syncResultHandler.ts @@ -1,40 +1,46 @@ import { toast } from '@/hooks/useToast.wrapper'; -import { SyncResult } from '@/utils/syncUtils'; +import type { SyncResult } from '@/utils/syncUtils'; /** * 동기화 결과 처리 함수 */ export const handleSyncResult = (result: SyncResult) => { + if (!result) { + toast({ + title: "동기화 오류", + description: "동기화 결과를 처리할 수 없습니다.", + variant: "destructive" + }); + return; + } + if (result.success) { - if (result.downloadSuccess && result.uploadSuccess) { + if (result.partial) { + // 부분 성공 처리 + toast({ + title: "부분 동기화 완료", + description: "일부 데이터만 동기화되었습니다. 다시 시도해보세요.", + variant: "default" + }); + } else { + // 전체 성공 처리 toast({ title: "동기화 완료", - description: "모든 데이터가 클라우드에 동기화되었습니다.", - }); - } else if (result.downloadSuccess) { - toast({ - title: "다운로드만 성공", - description: "서버 데이터를 가져왔지만, 업로드에 실패했습니다.", - variant: "destructive" - }); - } else if (result.uploadSuccess) { - toast({ - title: "업로드만 성공", - description: "로컬 데이터를 업로드했지만, 다운로드에 실패했습니다.", - variant: "destructive" - }); - } else if (result.partial) { - toast({ - title: "동기화 일부 완료", - description: "일부 데이터만 동기화되었습니다. 다시 시도해보세요.", - variant: "destructive" + description: "모든 데이터가 성공적으로 동기화되었습니다.", + variant: "default" }); + + // 데이터 변경 이벤트 발생 + window.dispatchEvent(new Event('budgetDataUpdated')); + window.dispatchEvent(new Event('categoryBudgetsUpdated')); + window.dispatchEvent(new Event('transactionUpdated')); } } else { + // 실패 처리 toast({ - title: "일부 동기화 실패", - description: "일부 데이터 동기화 중 문제가 발생했습니다. 다시 시도해주세요.", + title: "동기화 실패", + description: "데이터 동기화에 실패했습니다. 나중에 다시 시도해보세요.", variant: "destructive" }); } diff --git a/src/hooks/sync/useManualSync.ts b/src/hooks/sync/useManualSync.ts index cd038d2..e8991f0 100644 --- a/src/hooks/sync/useManualSync.ts +++ b/src/hooks/sync/useManualSync.ts @@ -1,9 +1,10 @@ import { useState } from 'react'; import { toast } from '@/hooks/useToast.wrapper'; -import { trySyncAllData, SyncResult } from '@/utils/syncUtils'; +import { trySyncAllData } from '@/utils/syncUtils'; import { getLastSyncTime, setLastSyncTime } from '@/utils/syncUtils'; import { handleSyncResult } from './syncResultHandler'; +import type { SyncResult } from '@/utils/syncUtils'; /** * 수동 동기화 기능을 위한 커스텀 훅 @@ -31,14 +32,11 @@ export const useManualSync = (user: any) => { try { setSyncing(true); - // 안전한 동기화 함수 사용 (setSyncState를 더미 함수로 제공) - const result = await trySyncAllData(userId, (state) => { - // 상태 업데이트 콜백 (필요에 따라 처리) - console.log('동기화 상태 업데이트:', state); - }); + // 인자 수정: 콜백 함수 제거 + const result = await trySyncAllData(userId); handleSyncResult(result); - setLastSyncTime(getLastSyncTime()); + setLastSyncTime(new Date().toISOString()); } catch (error) { console.error('동기화 오류:', error); toast({ diff --git a/src/hooks/sync/useSyncToggle.ts b/src/hooks/sync/useSyncToggle.ts index 794d192..92468fe 100644 --- a/src/hooks/sync/useSyncToggle.ts +++ b/src/hooks/sync/useSyncToggle.ts @@ -1,15 +1,14 @@ - import { useState, useEffect } from 'react'; import { useAuth } from '@/contexts/auth'; import { toast } from '@/hooks/useToast.wrapper'; import { isSyncEnabled, - setSyncEnabled + setSyncEnabled, + trySyncAllData } from '@/utils/syncUtils'; -import { trySyncAllData } from '@/utils/syncUtils'; /** - * 동기화 토글 기능을 위한 커스텀 훅 + * 동기화 토글 기능을 위한 커스텀 훅 */ export const useSyncToggle = () => { const [enabled, setEnabled] = useState(isSyncEnabled()); @@ -82,7 +81,7 @@ export const useSyncToggle = () => { if (checked && user) { try { - // 동기화 활성화 시 즉시 동기화 실행 + // 인자 수정: 콜백 함수 제거 await performSync(user.id); } catch (error) { console.error('동기화 중 오류, 로컬 데이터 복원 시도:', error); @@ -120,11 +119,8 @@ const performSync = async (userId: string) => { if (!userId) return; try { - // 안전한 동기화 함수 사용 (setSyncState를 더미 함수로 제공) - const result = await trySyncAllData(userId, (state) => { - // 상태 업데이트 콜백 (필요에 따라 처리) - console.log('동기화 상태 업데이트:', state); - }); + // 인자 수정: 콜백 함수 제거 + const result = await trySyncAllData(userId); return result; } catch (error) { console.error('동기화 오류:', error); diff --git a/src/utils/sync/data.ts b/src/utils/sync/data.ts index d3915a9..6522109 100644 --- a/src/utils/sync/data.ts +++ b/src/utils/sync/data.ts @@ -1,4 +1,3 @@ - import { supabase } from '@/lib/supabase'; import { uploadBudgets, downloadBudgets } from './budget'; import { uploadTransactions, downloadTransactions } from './transaction'; @@ -17,9 +16,7 @@ export interface SyncResult { }; } -/** - * 모든 데이터를 동기화합니다 (업로드 우선 수행) - */ +// 모든 데이터를 동기화합니다 (업로드 우선 수행) export const syncAllData = async (userId: string): Promise => { // 로컬 데이터 백업 const backupBudgetData = localStorage.getItem('budgetData'); @@ -160,10 +157,7 @@ export const syncAllData = async (userId: string): Promise => { } }; -/** - * 서버에 대한 안전한 동기화 래퍼 - * 오류 처리와 재시도 로직을 포함 - */ +// 서버에 대한 안전한 동기화 래퍼 - 인자 수정 export const trySyncAllData = async (userId: string): Promise => { console.log('안전한 데이터 동기화 시도'); let attempts = 0; diff --git a/src/utils/syncUtils.ts b/src/utils/syncUtils.ts index 5e11b59..621c486 100644 --- a/src/utils/syncUtils.ts +++ b/src/utils/syncUtils.ts @@ -1,26 +1,26 @@ -import { isSyncEnabled, getNetworkStatus, setNetworkStatus, startNetworkMonitoring, - stopNetworkMonitoring, onNetworkStatusChange, addToSyncQueue, - processPendingSyncQueue, getLastSyncTime, setLastSyncTime } from './sync/syncSettings'; +import { isSyncEnabled, setSyncEnabled, initSyncSettings } from './sync/config'; +import { getLastSyncTime, setLastSyncTime } from './sync/time'; import { trySyncAllData } from './sync/data'; -import { SyncResult } from './sync/data'; import { clearCloudData } from './sync/clearCloudData'; -import { setSyncEnabled } from './sync/config'; + +// SyncResult 타입 내보내기 수정 +export type { SyncResult } from './sync/data'; // 모든 유틸리티 함수를 동일한 공개 API로 유지하기 위해 내보내기 export { isSyncEnabled, setSyncEnabled, - getNetworkStatus, - setNetworkStatus, - startNetworkMonitoring, - stopNetworkMonitoring, - onNetworkStatusChange, - addToSyncQueue, - processPendingSyncQueue, getLastSyncTime, setLastSyncTime, trySyncAllData, - SyncResult, - clearCloudData + clearCloudData, + initSyncSettings +}; + +// App.tsx에서 사용하는 initSyncState 함수 추가 +export const initSyncState = async (): Promise => { + // 동기화 설정 초기화 + initSyncSettings(); + console.log('동기화 상태 초기화 완료'); };