Files
zellyy-finance/src/hooks/sync/useSyncToggle.ts
gpt-engineer-app[bot] 6ec671e9ab 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.
2025-03-21 08:43:47 +00:00

130 lines
4.2 KiB
TypeScript

import { useState, useEffect } from 'react';
import { useAuth } from '@/contexts/auth';
import { toast } from '@/hooks/useToast.wrapper';
import {
isSyncEnabled,
setSyncEnabled,
trySyncAllData
} from '@/utils/syncUtils';
/**
* 동기화 토글 기능을 위한 커스텀 훅
*/
export const useSyncToggle = () => {
const [enabled, setEnabled] = useState(isSyncEnabled());
const { user } = useAuth();
// 사용자 로그인 상태 변경 감지
useEffect(() => {
// 사용자 로그인 상태에 따라 동기화 설정 업데이트
const updateSyncState = () => {
if (!user && isSyncEnabled()) {
// 사용자가 로그아웃했고 동기화가 활성화되어 있으면 비활성화
setSyncEnabled(false);
setEnabled(false);
console.log('로그아웃으로 인해 동기화 설정이 비활성화되었습니다.');
}
// 동기화 상태 업데이트
setEnabled(isSyncEnabled());
};
// 초기 호출
updateSyncState();
// 인증 상태 변경 이벤트 리스너
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]);
// 동기화 토글 핸들러
const handleSyncToggle = async (checked: boolean) => {
if (!user && checked) {
toast({
title: "로그인 필요",
description: "데이터 동기화를 위해 로그인이 필요합니다.",
variant: "destructive"
});
return;
}
// 현재 로컬 데이터 백업
const budgetDataBackup = localStorage.getItem('budgetData');
const categoryBudgetsBackup = localStorage.getItem('categoryBudgets');
const transactionsBackup = localStorage.getItem('transactions');
console.log('동기화 설정 변경 전 로컬 데이터 백업:', {
budgetData: budgetDataBackup ? '있음' : '없음',
categoryBudgets: categoryBudgetsBackup ? '있음' : '없음',
transactions: transactionsBackup ? '있음' : '없음'
});
setEnabled(checked);
setSyncEnabled(checked);
// 이벤트 트리거
window.dispatchEvent(new Event('auth-state-changed'));
if (checked && user) {
try {
// 인자 수정: 콜백 함수 제거
await performSync(user.id);
} catch (error) {
console.error('동기화 중 오류, 로컬 데이터 복원 시도:', error);
// 오류 발생 시 백업 데이터 복원
if (budgetDataBackup) {
localStorage.setItem('budgetData', budgetDataBackup);
}
if (categoryBudgetsBackup) {
localStorage.setItem('categoryBudgets', categoryBudgetsBackup);
}
if (transactionsBackup) {
localStorage.setItem('transactions', transactionsBackup);
}
// 이벤트 발생시켜 UI 업데이트
window.dispatchEvent(new Event('budgetDataUpdated'));
window.dispatchEvent(new Event('categoryBudgetsUpdated'));
window.dispatchEvent(new Event('transactionUpdated'));
toast({
title: "동기화 오류",
description: "동기화 중 문제가 발생하여 로컬 데이터가 복원되었습니다.",
variant: "destructive"
});
}
}
};
return { enabled, setEnabled, handleSyncToggle };
};
// 실제 동기화 수행 함수
const performSync = async (userId: string) => {
if (!userId) return;
try {
// 인자 수정: 콜백 함수 제거
const result = await trySyncAllData(userId);
return result;
} catch (error) {
console.error('동기화 오류:', error);
throw error;
}
};