Fix data loss on sync enable
Addresses an issue where budget data was lost when enabling sync after entering budget information.
This commit is contained in:
@@ -11,6 +11,23 @@ export const downloadBudgets = async (userId: string): Promise<void> => {
|
||||
try {
|
||||
console.log('서버에서 예산 데이터 다운로드 시작');
|
||||
|
||||
// 현재 로컬 예산 데이터 백업
|
||||
const localBudgetData = localStorage.getItem('budgetData');
|
||||
const localCategoryBudgets = localStorage.getItem('categoryBudgets');
|
||||
|
||||
// 서버에 데이터가 없는지 확인
|
||||
const { data: budgetExists, error: checkError } = await supabase
|
||||
.from('budgets')
|
||||
.select('count')
|
||||
.eq('user_id', userId)
|
||||
.single();
|
||||
|
||||
// 서버에 데이터가 없고 로컬에 데이터가 있으면 다운로드 건너뜀
|
||||
if ((budgetExists?.count === 0 || !budgetExists) && localBudgetData) {
|
||||
console.log('서버에 예산 데이터가 없고 로컬 데이터가 있어 다운로드 건너뜀');
|
||||
return;
|
||||
}
|
||||
|
||||
// 예산 데이터 및 카테고리 예산 데이터 가져오기
|
||||
const [budgetData, categoryData] = await Promise.all([
|
||||
fetchBudgetData(userId),
|
||||
@@ -19,16 +36,24 @@ export const downloadBudgets = async (userId: string): Promise<void> => {
|
||||
|
||||
// 예산 데이터 처리
|
||||
if (budgetData) {
|
||||
await processBudgetData(budgetData);
|
||||
await processBudgetData(budgetData, localBudgetData);
|
||||
} else {
|
||||
console.log('서버에서 예산 데이터를 찾을 수 없음');
|
||||
// 로컬 데이터가 있으면 유지
|
||||
if (localBudgetData) {
|
||||
console.log('로컬 예산 데이터 유지');
|
||||
}
|
||||
}
|
||||
|
||||
// 카테고리 예산 데이터 처리
|
||||
if (categoryData && categoryData.length > 0) {
|
||||
await processCategoryBudgetData(categoryData);
|
||||
await processCategoryBudgetData(categoryData, localCategoryBudgets);
|
||||
} else {
|
||||
console.log('서버에서 카테고리 예산 데이터를 찾을 수 없음');
|
||||
// 로컬 데이터가 있으면 유지
|
||||
if (localCategoryBudgets) {
|
||||
console.log('로컬 카테고리 예산 데이터 유지');
|
||||
}
|
||||
}
|
||||
|
||||
console.log('예산 데이터 다운로드 완료');
|
||||
@@ -82,11 +107,16 @@ async function fetchCategoryBudgetData(userId: string) {
|
||||
/**
|
||||
* 예산 데이터 처리 및 로컬 저장
|
||||
*/
|
||||
async function processBudgetData(budgetData: any) {
|
||||
async function processBudgetData(budgetData: any, localBudgetDataStr: string | null) {
|
||||
console.log('서버에서 예산 데이터 수신:', budgetData);
|
||||
|
||||
// 기존 로컬 데이터 가져오기
|
||||
const localBudgetDataStr = localStorage.getItem('budgetData');
|
||||
// 서버 예산이 0이고 로컬 예산이 있으면 로컬 데이터 유지
|
||||
if (budgetData.total_budget === 0 && localBudgetDataStr) {
|
||||
console.log('서버 예산이 0이고 로컬 예산이 있어 로컬 데이터 유지');
|
||||
return;
|
||||
}
|
||||
|
||||
// 기존 로컬 데이터 가져오기
|
||||
let localBudgetData = localBudgetDataStr ? JSON.parse(localBudgetDataStr) : {
|
||||
daily: { targetAmount: 0, spentAmount: 0, remainingAmount: 0 },
|
||||
weekly: { targetAmount: 0, spentAmount: 0, remainingAmount: 0 },
|
||||
@@ -114,6 +144,7 @@ async function processBudgetData(budgetData: any) {
|
||||
|
||||
// 로컬 스토리지에 저장
|
||||
localStorage.setItem('budgetData', JSON.stringify(updatedBudgetData));
|
||||
localStorage.setItem('budgetData_backup', JSON.stringify(updatedBudgetData));
|
||||
console.log('예산 데이터 로컬 저장 완료', updatedBudgetData);
|
||||
|
||||
// 이벤트 발생시켜 UI 업데이트
|
||||
@@ -123,9 +154,18 @@ async function processBudgetData(budgetData: any) {
|
||||
/**
|
||||
* 카테고리 예산 데이터 처리 및 로컬 저장
|
||||
*/
|
||||
async function processCategoryBudgetData(categoryData: any[]) {
|
||||
async function processCategoryBudgetData(categoryData: any[], localCategoryBudgetsStr: string | null) {
|
||||
console.log(`${categoryData.length}개의 카테고리 예산 수신`);
|
||||
|
||||
// 서버 카테고리 예산 합계 계산
|
||||
const serverTotal = categoryData.reduce((sum, item) => sum + item.amount, 0);
|
||||
|
||||
// 로컬 카테고리 예산이 있고 서버 데이터가 비어있거나 합계가 0이면 로컬 데이터 유지
|
||||
if (localCategoryBudgetsStr && (categoryData.length === 0 || serverTotal === 0)) {
|
||||
console.log('서버 카테고리 예산이 없거나 0이고 로컬 데이터가 있어 로컬 데이터 유지');
|
||||
return;
|
||||
}
|
||||
|
||||
// 카테고리 예산 로컬 형식으로 변환
|
||||
const localCategoryBudgets = categoryData.reduce((acc, curr) => {
|
||||
acc[curr.category] = curr.amount;
|
||||
@@ -134,6 +174,7 @@ async function processCategoryBudgetData(categoryData: any[]) {
|
||||
|
||||
// 로컬 스토리지에 저장
|
||||
localStorage.setItem('categoryBudgets', JSON.stringify(localCategoryBudgets));
|
||||
localStorage.setItem('categoryBudgets_backup', JSON.stringify(localCategoryBudgets));
|
||||
console.log('카테고리 예산 로컬 저장 완료', localCategoryBudgets);
|
||||
|
||||
// 이벤트 발생시켜 UI 업데이트
|
||||
|
||||
Reference in New Issue
Block a user