costco-grocery-list/frontend/src/api/list.js

122 lines
3.5 KiB
JavaScript

import api from "./axios";
/**
* Get grocery list for household and store
*/
export const getList = (householdId, storeId) =>
api.get(`/households/${householdId}/stores/${storeId}/list`);
/**
* Get specific item by name
*/
export const getItemByName = (householdId, storeId, itemName) =>
api.get(`/households/${householdId}/stores/${storeId}/list/item`, {
params: { item_name: itemName }
});
/**
* Add item to list
*/
export const addItem = (householdId, storeId, itemName, quantity, imageFile = null, notes = null) => {
const formData = new FormData();
formData.append("item_name", itemName);
formData.append("quantity", quantity);
if (notes) {
formData.append("notes", notes);
}
if (imageFile) {
formData.append("image", imageFile);
}
return api.post(`/households/${householdId}/stores/${storeId}/list/add`, formData, {
headers: {
"Content-Type": "multipart/form-data",
},
});
};
/**
* Get item classification
*/
export const getClassification = (householdId, storeId, itemName) =>
api.get(`/households/${householdId}/stores/${storeId}/list/classification`, {
params: { item_name: itemName }
});
/**
* Set item classification
*/
export const setClassification = (householdId, storeId, itemName, classification) =>
api.post(`/households/${householdId}/stores/${storeId}/list/classification`, {
item_name: itemName,
classification
});
/**
* Update item with classification (legacy method - split into separate calls)
*/
export const updateItemWithClassification = (householdId, storeId, itemName, quantity, classification) => {
// This is now two operations: update item + set classification
return Promise.all([
updateItem(householdId, storeId, itemName, quantity),
classification ? setClassification(householdId, storeId, itemName, classification) : Promise.resolve()
]);
};
/**
* Update item details (quantity, notes)
*/
export const updateItem = (householdId, storeId, itemName, quantity, notes) =>
api.put(`/households/${householdId}/stores/${storeId}/list/item`, {
item_name: itemName,
quantity,
notes
});
/**
* Mark item as bought or unbought
*/
export const markBought = (householdId, storeId, itemName, quantityBought = null, bought = true) =>
api.patch(`/households/${householdId}/stores/${storeId}/list/item`, {
item_name: itemName,
bought,
quantity_bought: quantityBought
});
/**
* Delete item from list
*/
export const deleteItem = (householdId, storeId, itemName) =>
api.delete(`/households/${householdId}/stores/${storeId}/list/item`, {
data: { item_name: itemName }
});
/**
* Get suggestions based on query
*/
export const getSuggestions = (householdId, storeId, query) =>
api.get(`/households/${householdId}/stores/${storeId}/list/suggestions`, {
params: { query }
});
/**
* Get recently bought items
*/
export const getRecentlyBought = (householdId, storeId) =>
api.get(`/households/${householdId}/stores/${storeId}/list/recent`);
/**
* Update item image
*/
export const updateItemImage = (householdId, storeId, itemName, quantity, imageFile) => {
const formData = new FormData();
formData.append("item_name", itemName);
formData.append("quantity", quantity);
formData.append("image", imageFile);
return api.post(`/households/${householdId}/stores/${storeId}/list/update-image`, formData, {
headers: {
"Content-Type": "multipart/form-data",
},
});
};