import { useState, useEffect } from "react"; import { getGroceryLists, createGroceryList, updateGroceryList, deleteGroceryList, shareGroceryList, getGroceryListShares, unshareGroceryList, searchUsers, togglePinGroceryList, } from "../groceryApi"; function GroceryLists({ user, onShowToast }) { const [lists, setLists] = useState([]); const [selectedList, setSelectedList] = useState(null); const [loading, setLoading] = useState(true); const [editingList, setEditingList] = useState(null); const [showShareModal, setShowShareModal] = useState(null); const [shares, setShares] = useState([]); const [userSearch, setUserSearch] = useState(""); const [searchResults, setSearchResults] = useState([]); const [sharePermission, setSharePermission] = useState(false); // New list form const [newListName, setNewListName] = useState(""); const [showNewListForm, setShowNewListForm] = useState(false); // Edit form const [editName, setEditName] = useState(""); const [editItems, setEditItems] = useState([]); const [newItem, setNewItem] = useState(""); useEffect(() => { loadLists(); }, []); // Restore selected list from localStorage after lists are loaded useEffect(() => { if (lists.length > 0) { try { const savedListId = localStorage.getItem("selectedGroceryListId"); if (savedListId) { const listToSelect = lists.find(list => list.id === parseInt(savedListId)); if (listToSelect) { setSelectedList(listToSelect); } } } catch (err) { console.error("Failed to restore selected list", err); } } }, [lists]); const loadLists = async () => { try { setLoading(true); const data = await getGroceryLists(); setLists(data); } catch (error) { onShowToast(error.message, "error"); } finally { setLoading(false); } }; const handleCreateList = async (e) => { e.preventDefault(); if (!newListName.trim()) return; try { const newList = await createGroceryList({ name: newListName.trim(), items: [], }); setLists([newList, ...lists]); setNewListName(""); setShowNewListForm(false); onShowToast("רשימת קניות נוצרה בהצלחה", "success"); } catch (error) { onShowToast(error.message, "error"); } }; const handleSelectList = (list) => { setSelectedList(list); setEditingList(null); try { localStorage.setItem("selectedGroceryListId", list.id.toString()); } catch (err) { console.error("Failed to save selected list", err); } }; const handleEditList = (list) => { setEditingList(list); setEditName(list.name); setEditItems([...list.items]); setNewItem(""); }; const handleAddItem = () => { if (!newItem.trim()) return; setEditItems([...editItems, newItem.trim()]); setNewItem(""); }; const handleRemoveItem = (index) => { setEditItems(editItems.filter((_, i) => i !== index)); }; const handleToggleItem = (index) => { const updated = [...editItems]; const item = updated[index]; if (item.startsWith("✓ ")) { updated[index] = item.substring(2); } else { updated[index] = "✓ " + item; } setEditItems(updated); }; const handleToggleItemInView = async (index) => { if (!selectedList || !selectedList.can_edit) return; const updated = [...selectedList.items]; const item = updated[index]; if (item.startsWith("✓ ")) { updated[index] = item.substring(2); } else { updated[index] = "✓ " + item; } try { const updatedList = await updateGroceryList(selectedList.id, { items: updated, }); setLists(lists.map((l) => (l.id === updatedList.id ? updatedList : l))); setSelectedList(updatedList); } catch (error) { onShowToast(error.message, "error"); } }; const handleSaveList = async () => { if (!editName.trim()) { onShowToast("שם הרשימה לא יכול להיות ריק", "error"); return; } try { const updated = await updateGroceryList(editingList.id, { name: editName.trim(), items: editItems, }); setLists(lists.map((l) => (l.id === updated.id ? updated : l))); if (selectedList?.id === updated.id) { setSelectedList(updated); } setEditingList(null); onShowToast("רשימת קניות עודכנה בהצלחה", "success"); } catch (error) { onShowToast(error.message, "error"); } }; const handleDeleteList = async (listId) => { if (!confirm("האם אתה בטוח שברצונך למחוק רשימת קניות זו?")) return; try { await deleteGroceryList(listId); setLists(lists.filter((l) => l.id !== listId)); if (selectedList?.id === listId) { setSelectedList(null); } setEditingList(null); onShowToast("רשימת קניות נמחקה בהצלחה", "success"); } catch (error) { onShowToast(error.message, "error"); } }; const handleTogglePin = async (list) => { try { const updated = await togglePinGroceryList(list.id); setLists(lists.map((l) => (l.id === updated.id ? updated : l))); if (selectedList?.id === updated.id) { setSelectedList(updated); } const message = updated.is_pinned ? "רשימה הוצמדה לדף הבית" : "רשימה הוסרה מדף הבית"; onShowToast(message, "success"); } catch (error) { onShowToast(error.message, "error"); } }; const handleShowShareModal = async (list) => { setShowShareModal(list); setUserSearch(""); setSearchResults([]); setSharePermission(false); try { const sharesData = await getGroceryListShares(list.id); setShares(sharesData); } catch (error) { onShowToast(error.message, "error"); } }; const handleSearchUsers = async (query) => { setUserSearch(query); if (query.trim().length < 2) { setSearchResults([]); return; } try { const results = await searchUsers(query); setSearchResults(results); } catch (error) { onShowToast(error.message, "error"); } }; const handleShareWithUser = async (userId, username) => { try { const share = await shareGroceryList(showShareModal.id, { user_identifier: username, can_edit: sharePermission, }); setShares([...shares, share]); setUserSearch(""); setSearchResults([]); setSharePermission(false); onShowToast(`רשימה שותפה עם ${share.display_name}`, "success"); } catch (error) { onShowToast(error.message, "error"); } }; const handleUnshare = async (userId) => { try { await unshareGroceryList(showShareModal.id, userId); setShares(shares.filter((s) => s.shared_with_user_id !== userId)); onShowToast("שיתוף הוסר בהצלחה", "success"); } catch (error) { onShowToast(error.message, "error"); } }; if (loading) { return
טוען רשימות קניות...
; } return (

רשימות הקניות שלי

{showNewListForm && (
setNewListName(e.target.value)} autoFocus />
)}
{/* Lists Sidebar */}
{lists.length === 0 ? (

אין רשימות קניות עדיין

) : ( lists.map((list) => (
handleSelectList(list)} >

{list.name}

{list.is_owner ? "שלי" : `של ${list.owner_display_name}`} {" · "} {list.items.length} פריטים

{list.is_owner && ( )}
)) )}
{/* List Details */}
{editingList ? (

עריכת רשימה

setEditName(e.target.value)} />
setNewItem(e.target.value)} onKeyPress={(e) => e.key === "Enter" && (e.preventDefault(), handleAddItem())} />
    {editItems.map((item, index) => (
  • {item.startsWith("✓ ") ? item.substring(2) : item}
  • ))}
{editingList.is_owner && ( <> )}
) : selectedList ? (

{selectedList.name}

{selectedList.is_owner ? "רשימה שלי" : `משותפת על ידי ${selectedList.owner_display_name}`}

{selectedList.is_owner && ( <> )} {selectedList.can_edit && ( )}
{selectedList.items.length === 0 ? (

אין פריטים ברשימה

) : (
    {selectedList.items.map((item, index) => { const isChecked = item.startsWith("✓ "); const itemText = isChecked ? item.substring(2) : item; return (
  • {selectedList.can_edit ? ( <> {itemText} ) : ( <> {isChecked ? "☑" : "☐"} {itemText} )}
  • ); })}
)}
) : (

בחר רשימת קניות כדי להציג את הפרטים

)}
{/* Share Modal */} {showShareModal && (
setShowShareModal(null)}>
e.stopPropagation()}>

שתף רשימה: {showShareModal.name}

handleSearchUsers(e.target.value)} /> {searchResults.length > 0 && (
    {searchResults.map((user) => (
  • handleShareWithUser(user.id, user.username)} >
    {user.display_name} @{user.username}
  • ))}
)}

משותף עם:

{shares.length === 0 ? (

הרשימה לא משותפת עם אף אחד

) : (
    {shares.map((share) => (
  • {share.display_name} @{share.username} {share.can_edit && עורך}
  • ))}
)}
)}
); } export default GroceryLists;