import { useEffect, useState, useCallback } from 'react';
import RankingGrid from "./RankingGrid";
import ItemCollection from "./ItemCollection";
const API_BASE_URL = "/api/item"; // Use proxy to .NET which will forward to PHP
const RankItems = ({ items, setItems, dataType, imgArr, localStorageKey, tierListId, onDeleteItem }) => {
const [reload, setReload] = useState(false);
const getDataFromApi = useCallback(() => {
let url = `${API_BASE_URL}/read`;
if (tierListId) {
url += `?item_type=${dataType}&tier_list_id=${tierListId}`;
} else if (dataType) {
url += `?item_type=${dataType}`;
}
fetch(url)
.then((results) => results.json())
.then(data => {
setItems(data);
})
.catch(error => {
setItems([]);
console.error('Error fetching items:', error);
});
}, [tierListId, dataType, setItems]);
function Reload() {
setReload(!reload);
getDataFromApi();
}
function drag(ev) {
ev.dataTransfer.setData("text", ev.target.id);
}
function allowDrop(ev) {
ev.preventDefault();
}
function drop(ev) {
ev.preventDefault();
const targetElm = ev.target;
// Don't allow dropping on images
if (targetElm.nodeName === "IMG") {
return false;
}
var data = parseInt(ev.dataTransfer.getData("text").substring(5));
// If dropped on a rank cell (has id starting with "rank-")
if (targetElm.id && targetElm.id.startsWith("rank-")) {
if (targetElm.childNodes.length === 0) {
const ranking = parseInt(targetElm.id.substring(5));
const transformedCollection = items.map((item) => (item.id === parseInt(data)) ?
{ ...item, ranking: ranking } : { ...item, ranking: item.ranking });
setItems(transformedCollection);
updateItemRanking(data, ranking);
}
}
// If dropped on unranked section or unranked items
else if (targetElm.className === "items-not-ranked" || targetElm.closest(".items-not-ranked")) {
const transformedCollection = items.map((item) => (item.id === parseInt(data)) ?
{ ...item, ranking: 0 } : { ...item, ranking: item.ranking });
setItems(transformedCollection);
updateItemRanking(data, 0);
}
}
function updateItemRanking(itemId, newRanking) {
fetch(`${API_BASE_URL}/update`, {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify({ id: itemId, ranking: newRanking }),
})
.then(response => response.json())
.catch(error => console.error('Error updating ranking:', error));
}
useEffect(() => {
if (!items || items.length === 0) {
getDataFromApi();
}
}, [getDataFromApi, items.length]);
useEffect(() => {
if (items != null && localStorageKey) {
localStorage.setItem(localStorageKey, JSON.stringify(items));
}
}, [items, localStorageKey])
return (
(items != null) ?
: Loading...
)
}
export default RankItems;