146 lines
4.1 KiB
JavaScript
146 lines
4.1 KiB
JavaScript
const API_URL = window.__ENV__?.API_BASE || window.ENV?.VITE_API_URL || "http://192.168.1.100:8000";
|
|
|
|
// Get auth token from localStorage
|
|
const getAuthHeaders = () => {
|
|
const token = localStorage.getItem("auth_token");
|
|
return {
|
|
"Content-Type": "application/json",
|
|
...(token && { Authorization: `Bearer ${token}` }),
|
|
};
|
|
};
|
|
|
|
// Get all grocery lists
|
|
export const getGroceryLists = async () => {
|
|
const res = await fetch(`${API_URL}/grocery-lists`, {
|
|
headers: getAuthHeaders(),
|
|
});
|
|
if (!res.ok) throw new Error("Failed to fetch grocery lists");
|
|
return res.json();
|
|
};
|
|
|
|
// Create a new grocery list
|
|
export const createGroceryList = async (data) => {
|
|
const res = await fetch(`${API_URL}/grocery-lists`, {
|
|
method: "POST",
|
|
headers: getAuthHeaders(),
|
|
body: JSON.stringify(data),
|
|
});
|
|
if (!res.ok) {
|
|
const error = await res.json();
|
|
throw new Error(error.detail || "Failed to create grocery list");
|
|
}
|
|
return res.json();
|
|
};
|
|
|
|
// Get a specific grocery list
|
|
export const getGroceryList = async (id) => {
|
|
const res = await fetch(`${API_URL}/grocery-lists/${id}`, {
|
|
headers: getAuthHeaders(),
|
|
});
|
|
if (!res.ok) throw new Error("Failed to fetch grocery list");
|
|
return res.json();
|
|
};
|
|
|
|
// Update a grocery list
|
|
export const updateGroceryList = async (id, data) => {
|
|
const res = await fetch(`${API_URL}/grocery-lists/${id}`, {
|
|
method: "PUT",
|
|
headers: getAuthHeaders(),
|
|
body: JSON.stringify(data),
|
|
});
|
|
if (!res.ok) {
|
|
const error = await res.json();
|
|
throw new Error(error.detail || "Failed to update grocery list");
|
|
}
|
|
return res.json();
|
|
};
|
|
|
|
// Delete a grocery list
|
|
export const deleteGroceryList = async (id) => {
|
|
const res = await fetch(`${API_URL}/grocery-lists/${id}`, {
|
|
method: "DELETE",
|
|
headers: getAuthHeaders(),
|
|
});
|
|
if (!res.ok) {
|
|
const error = await res.json();
|
|
throw new Error(error.detail || "Failed to delete grocery list");
|
|
}
|
|
};
|
|
|
|
// Toggle pin status for a grocery list
|
|
export const togglePinGroceryList = async (id) => {
|
|
const res = await fetch(`${API_URL}/grocery-lists/${id}/pin`, {
|
|
method: "PATCH",
|
|
headers: getAuthHeaders(),
|
|
});
|
|
if (!res.ok) {
|
|
let errorMessage = "Failed to toggle pin status";
|
|
try {
|
|
const error = await res.json();
|
|
errorMessage = error.detail || errorMessage;
|
|
} catch (e) {
|
|
errorMessage = `HTTP ${res.status}: ${res.statusText}`;
|
|
}
|
|
throw new Error(errorMessage);
|
|
}
|
|
return res.json();
|
|
};
|
|
|
|
// Share a grocery list
|
|
export const shareGroceryList = async (listId, data) => {
|
|
const res = await fetch(`${API_URL}/grocery-lists/${listId}/share`, {
|
|
method: "POST",
|
|
headers: getAuthHeaders(),
|
|
body: JSON.stringify(data),
|
|
});
|
|
if (!res.ok) {
|
|
const error = await res.json();
|
|
throw new Error(error.detail || "Failed to share grocery list");
|
|
}
|
|
return res.json();
|
|
};
|
|
|
|
// Get grocery list shares
|
|
export const getGroceryListShares = async (listId) => {
|
|
const res = await fetch(`${API_URL}/grocery-lists/${listId}/shares`, {
|
|
headers: getAuthHeaders(),
|
|
});
|
|
if (!res.ok) throw new Error("Failed to fetch shares");
|
|
return res.json();
|
|
};
|
|
|
|
// Unshare a grocery list
|
|
export const unshareGroceryList = async (listId, userId) => {
|
|
const res = await fetch(`${API_URL}/grocery-lists/${listId}/shares/${userId}`, {
|
|
method: "DELETE",
|
|
headers: getAuthHeaders(),
|
|
});
|
|
if (!res.ok) {
|
|
const error = await res.json();
|
|
throw new Error(error.detail || "Failed to unshare grocery list");
|
|
}
|
|
};
|
|
|
|
// Update share permissions
|
|
export const updateSharePermission = async (listId, userId, canEdit) => {
|
|
const res = await fetch(`${API_URL}/grocery-lists/${listId}/shares/${userId}`, {
|
|
method: "PATCH",
|
|
headers: getAuthHeaders(),
|
|
body: JSON.stringify({ can_edit: canEdit }),
|
|
});
|
|
if (!res.ok) {
|
|
const error = await res.json();
|
|
throw new Error(error.detail || "Failed to update share permission");
|
|
}
|
|
return res.json();
|
|
};
|
|
|
|
// Search users
|
|
export const searchUsers = async (query) => {
|
|
const res = await fetch(`${API_URL}/users/search?q=${encodeURIComponent(query)}`, {
|
|
headers: getAuthHeaders(),
|
|
});
|
|
if (!res.ok) throw new Error("Failed to search users");
|
|
return res.json();
|
|
};
|