개발 일지
팝업에서 장바구니에 메뉴 담기
만식
2024. 5. 29. 18:45
- 기존 문제: 팝업으로 첫 번째 추천 메뉴를 조회하고 창을 닫는 것은 가능했으나 바로 장바구니에 더하는 것은 불가능 → 카드를 누르면 장바구니에 더해지는 것까지는 구현했으나 닫기 버튼을 누르면 장바구니에 메뉴가 더해지면서 팝업이 닫힘
- 해결: 닫기 버튼을 제외한 팝업 창 어디든 누르면 메뉴가 장바구니에 더해지도록 수정, 닫기 버튼을 누르면 팝업창 닫힘
<!-- Pop-up for best recommendation -->
<div class="popup-overlay" id="popup-overlay">
<div class="popup-container" id="popup-container">
<h2>추천 음료</h2>
<div class="menu-image">
<img src="" alt="메뉴 이미지" id="popup-image"/>
</div>
<h2 class="name" id="popup-name">메뉴 이름</h2>
<p class="price" id="popup-price">₩0</p>
<button id="closePopup">닫기</button>
</div>
</div>
<script src="https://cdn.jsdelivr.net/npm/axios/dist/axios.min.js"></script>
<script>
document.addEventListener('DOMContentLoaded', function() {
const filteredHashtags = localStorage.getItem('filteredHashtags');
const responseText = localStorage.getItem('responseText');
const popupOverlay = document.getElementById('popup-overlay');
const popupContainer = document.getElementById('popup-container'); // 수정된 부분
const popupImage = document.getElementById('popup-image');
const popupName = document.getElementById('popup-name');
const popupPrice = document.getElementById('popup-price');
const closePopup = document.getElementById('closePopup'); // 수정된 부분
console.log("filteredHashtags>>>>>>>>>>", filteredHashtags)
console.log("responseText>>>>>>>>>>", responseText)
// Function to update the menu based on hashtags
axios.get('/orders/get_menus/', { params: { hashtags: filteredHashtags } })
.then(response => {
const menus = response.data.menus.slice(0, 3);
const recommendations = document.getElementById('recommendations');
recommendations.innerHTML = '';
menus.forEach((menu, index) => {
const menuItem = `
<div class="recommendation" onclick="addItem('${menu.food_name}', ${menu.price}, '${menu.img_url}')">
<h2>${menu.food_name}</h2>
<div class="menu-image">
<img src="${menu.img_url}" alt="${menu.food_name} 이미지">
</div>
<p>₩${menu.price}</p>
</div>
`;
if (index === 0) {
popupImage.src = menu.img_url;
popupName.textContent = menu.food_name;
popupPrice.textContent = `₩${menu.price}`;
popupContainer.setAttribute('onclick', `addItem('${menu.food_name}', ${menu.price}, '${menu.img_url}')`); // 수정된 부분
popupOverlay.style.display = 'flex';
}
recommendations.insertAdjacentHTML('beforeend', menuItem);
});
closePopup.addEventListener("click", function() {
event.stopPropagation(); // Stop event from bubbling up // 수정된 부분
popupOverlay.style.display = "none"; // Hide the popup // 수정된 부분
});
})
.catch(error => {
console.error('메뉴 업데이트 중 오류 발생:', error);
});
if (responseText) {
speak(responseText);
}
});
- 프롬프트 수정에 따른 문제
- 음성 안내가 나오지 않는 문제: 프롬프트를 수정해 음성 안내와 메뉴 추천이 분리되도록 해서 발생함
- 추천된 메뉴로 메뉴가 불러와지지 않았던 문제: 추천 메뉴 리스트를 기반으로 데이터베이스에서 값을 뽑아내야 하는 로직이 구현되지 않음
- 해결
- 음성 안내와 메뉴 추천을 각각 받아서 local storage에 저장
- 기존에 사용했던 API 가 아닌 원하는 로직이 들어있는 API를 불러와서 사용
axios.post('/orders/aibot/', { inputText: transcript },
{
headers: {
'X-CSRFToken': csrfToken
}
})
.then(function (response) {
const responseText = response.data.responseText;
const recommended_menu = response.data.recommended_menu;
console.log('서버 응답:', responseText);
localStorage.setItem('recommended_menu', JSON.stringify(recommended_menu)); // 수정된 부분 recommended_menu를 JSON.stringify()로 저장해줌
localStorage.setItem('customer_message', responseText); // 수정된 부분 - responseText와 recommended_menu를 분리해줌
window.location.href = '/orders/elder_menu/';
console.log("customer_message>>>>>>>", responseText);
console.log("recommended_menu>>>>>>>", recommended_menu);
})
.catch(function (error) {
console.error('에러:', error);
});
document.addEventListener('DOMContentLoaded', function() {
const recommended_menu_string = localStorage.getItem('recommended_menu'); // recommended_menu_string을 불러와주고
const recommended_menu = JSON.parse(recommended_menu_string); // 다시 리스트화
const responseText = localStorage.getItem('customer_message'); // 안내 메시지 불러옴
axios.get('/orders/aibot/', { params: { recommended_menu: recommended_menu_string } }) // 사용하는 API를 변경
.then(response => {
const menuData = response.data.recommends; // assuming your API returns menus as an array
//const recommendations = document.getElementById('recommendations');
recommendations.innerHTML = '';
menuData.forEach((menu, index) => {
const menuItem = `
<div class="recommendation" onclick="addItem('${menu.food_name}', ${menu.price}, '${menu.img_url}')">
<h2>${menu.food_name}</h2>
<div class="menu-image">
<img src="${menu.img_url}" alt="${menu.food_name} 이미지">
</div>
<p>₩${menu.price}</p>
</div>
`;