반응형
const submitupdateMenuItemHandler = async (e: React.FormEvent<HTMLFormElement>) => {
// 옵션 삭제시 필터링
const missingInMenuOptions = origineMenuOptions.filter(item =>
menuOptions.some(menu => menu.menu_id === item.menu_id),
);
const missingItems = missingInMenuOptions.filter(item => !menuOptions.some(menu => menu.id === item.id));
if (missingItems.length > 0) {
missingItems.forEach(async item => {
removeChangeMenuOptionsStore(item);
await removeMenuOption(item.id);
});
}
// 옵션 업데이트 부분
const differences = findDifferences(menuOptions, origineMenuOptions);
differences.map(async item => {
if (item.id === '') {
// 옵션 항목 supabase에 추가
const newOption = {
name: item.name,
is_use: item.is_use,
max_detail_count: item.max_detail_count,
menu_id: item.menu_id,
};
const { data: optionData } = await addMenuOption(newOption);
// 해당 data 받아서 그 option_id로 detail들 추가
item.menu_option_detail.map(async option => {
const addOptionForm: Omit<Tables<'menu_option_detail'>, 'id'> = {
name: option.name,
option_id: optionData[0].id,
price: option.price,
};
await addUpsertMenuOptionDetail(addOptionForm);
});
const newOptionList: MenuOptionWithDetail = {
id: optionData[0].id,
name: optionData[0].name,
is_use: optionData[0].is_use,
max_detail_count: optionData[0].max_detail_count,
menu_id: optionData[0].menu_id,
menu_option_detail: item.menu_option_detail,
};
setChangeMenuOptions([...changeMenuOptions, { ...newOptionList }]);
} else {
// 옵션은 있는거니까 해당 detail을 옵션 아이디로 supabase 추가
await updateMenuOption(item);
const newOptionList: MenuOptionWithDetail = {
id: item.id,
name: item.name,
is_use: item.is_use,
max_detail_count: item.max_detail_count,
menu_id: item.menu_id,
menu_option_detail: [],
};
// 디테일 있는것도 있고 없는것도 있으니까 upsert
item.menu_option_detail.map(async option => {
let addOptionForm: Omit<Tables<'menu_option_detail'>, 'id'> | Tables<'menu_option_detail'>;
option.id === ''
? (addOptionForm = {
name: option.name,
option_id: newOptionList.id,
price: option.price,
})
: (addOptionForm = {
id: option.id,
name: option.name,
option_id: newOptionList.id,
price: option.price,
});
await addUpsertMenuOptionDetail(addOptionForm);
});
updateChangeMenuOptionsStore(prevMenuOptions =>
prevMenuOptions.map(option =>
option.id === item.id
? {
...item,
name: item.name ?? '',
is_use: item.is_use ?? false,
max_detail_count: item.max_detail_count ?? 1,
}
: item,
),
);
}
});
setMenuOptions([]);
};
// 비교 함수
const findDifferences = (optionNowArray: MenuOptionWithDetail[], optionOriginArray: MenuOptionWithDetail[]) => {
const differentArray: MenuOptionWithDetail[] = [];
optionNowArray.forEach(itemNum1 => {
const itemNum2 = optionOriginArray.find(findItem => findItem.id === itemNum1.id);
if (
!itemNum2 ||
itemNum1.is_use !== itemNum2.is_use ||
itemNum1.name !== itemNum2.name ||
itemNum1.max_detail_count !== itemNum2.max_detail_count ||
!compareMenuOptions(itemNum1.menu_option_detail, itemNum2.menu_option_detail)
) {
differentArray.push(itemNum1);
}
});
return differentArray;
};
// menu_option_detail 배열을 비교하는 함수
const compareMenuOptions = (
optionNowArray: Tables<'menu_option_detail'>[],
optionOriginArray: Tables<'menu_option_detail'>[],
) => {
const newItems = [];
optionNowArray.forEach(itemNum1 => {
const itemNum2 = optionOriginArray.find(item => item.name === itemNum1.name);
if (!itemNum2) {
newItems.push(itemNum1);
}
});
return newItems.length === 0; // 반환 값이 true이면 두 배열이 같다는 것을 의미
};
팝업을 타고타고 들어가서 옵션들을 추가하고 나와서 수정하기 전까지 데이터를 가지고 있다가 뿌려야하기에 바로 저장하지 않고 더미데이터에 담아서 기존과 하나라도 다르면 새로운 배열에 담아서 그 배열들을 update, add, upsert해서 사용했다.. 너무 오래 걸리고 확실히 필요에 맞게 짜를 필요가 있겠다.
반응형
'TIL' 카테고리의 다른 글
[TIL][24.01.18] zustand 작업, query hooks로 빼기 (1) | 2024.01.19 |
---|---|
[TIL] [24.01.17] zustand에서 state와 action을 분리하기 (0) | 2024.01.18 |
[TIL][24.1.15] change handler (0) | 2024.01.16 |
[TIL][24.01.12] Zustand로 전역상태 관리하기 (1) | 2024.01.15 |
[TIL] 최종 프로젝트 Github Rules (0) | 2024.01.12 |