Refactor useSyncSettings hook
Refactors the useSyncSettings hook into smaller, more manageable modules to improve code organization and maintainability. The functionality of the hook remains unchanged.
This commit is contained in:
116
src/hooks/sync/useSyncToggle.ts
Normal file
116
src/hooks/sync/useSyncToggle.ts
Normal file
@@ -0,0 +1,116 @@
|
||||
|
||||
import { useState, useEffect } from 'react';
|
||||
import { useAuth } from '@/contexts/auth';
|
||||
import { toast } from '@/hooks/useToast.wrapper';
|
||||
import {
|
||||
isSyncEnabled,
|
||||
setSyncEnabled
|
||||
} from '@/utils/syncUtils';
|
||||
import { 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);
|
||||
|
||||
return () => {
|
||||
window.removeEventListener('auth-state-changed', updateSyncState);
|
||||
};
|
||||
}, [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);
|
||||
|
||||
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;
|
||||
}
|
||||
};
|
||||
Reference in New Issue
Block a user