This commit is contained in:
Marces Zastrow
2025-01-17 13:54:01 +01:00
parent 0e888ca258
commit 6f52b6ffb0
3 changed files with 38 additions and 17 deletions
Binary file not shown.
+3 -2
View File
@@ -231,9 +231,10 @@ app.get('/games/:gameId/items', (req, res) => {
if (err) { if (err) {
return res.status(500).json({ error: 'Internal server error' }); return res.status(500).json({ error: 'Internal server error' });
} }
// Convert image data to base64 and store as Img property
const processedRows = rows.map(row => { const processedRows = rows.map(row => {
if (row.img) { if (row.img) { // Database column is lowercase
row.Img = `data:image/jpeg;base64,${row.img.toString('base64')}`; row.Img = `data:image/jpeg;base64,${row.img.toString('base64')}`; // Store as uppercase Img
} }
return row; return row;
}); });
+34 -14
View File
@@ -21,21 +21,18 @@ const GameMasterPage = () => {
const [allOwners, setAllOwners] = useState([]); const [allOwners, setAllOwners] = useState([]);
const [formData, setFormData] = useState(null); const [formData, setFormData] = useState(null);
// Fix useEffect data fetching // Update useEffect for data fetching
useEffect(() => { useEffect(() => {
const fetchData = async () => { const fetchData = async () => {
try { try {
// Fetch player characters
const pcsResponse = await axios.get(`http://localhost:5000/games/${gameId}/playerchars`); const pcsResponse = await axios.get(`http://localhost:5000/games/${gameId}/playerchars`);
const processedPCs = Array.isArray(pcsResponse.data) ? pcsResponse.data : [pcsResponse.data]; const processedPCs = Array.isArray(pcsResponse.data) ? pcsResponse.data : [pcsResponse.data];
setPlayerCharacters(processedPCs.filter(pc => pc !== null)); setPlayerCharacters(processedPCs.filter(pc => pc !== null));
// Fetch NPCs with different structure
const npcsResponse = await axios.get(`http://localhost:5000/games/${gameId}/npcs`); const npcsResponse = await axios.get(`http://localhost:5000/games/${gameId}/npcs`);
const processedNPCs = Array.isArray(npcsResponse.data) ? npcsResponse.data : [npcsResponse.data]; const processedNPCs = Array.isArray(npcsResponse.data) ? npcsResponse.data : [npcsResponse.data];
setNpcs(processedNPCs.filter(npc => npc !== null)); setNpcs(processedNPCs.filter(npc => npc !== null));
// Fetch Items
const itemsResponse = await axios.get(`http://localhost:5000/games/${gameId}/items`); const itemsResponse = await axios.get(`http://localhost:5000/games/${gameId}/items`);
const processedItems = Array.isArray(itemsResponse.data) ? itemsResponse.data : [itemsResponse.data]; const processedItems = Array.isArray(itemsResponse.data) ? itemsResponse.data : [itemsResponse.data];
setItems(processedItems.filter(item => item !== null)); setItems(processedItems.filter(item => item !== null));
@@ -44,15 +41,21 @@ const GameMasterPage = () => {
} }
}; };
// Initial fetch only if no modal is open
if (!editModalOpen) {
fetchData(); fetchData();
let interval;
if (!isEditing && !editModalOpen) { // Add editModalOpen check
interval = setInterval(fetchData, 10000);
} }
// Set up polling only if modal is closed
let interval;
if (!editModalOpen) {
interval = setInterval(fetchData, 5000);
}
return () => { return () => {
if (interval) clearInterval(interval); if (interval) clearInterval(interval);
}; };
}, [gameId, isEditing, editModalOpen]); // Add editModalOpen dependency }, [gameId, editModalOpen]);
useEffect(() => { useEffect(() => {
const fetchOwners = async () => { const fetchOwners = async () => {
@@ -83,7 +86,7 @@ const GameMasterPage = () => {
setFormData({...item}); setFormData({...item});
setEditType('item'); setEditType('item');
setEditModalOpen(true); setEditModalOpen(true);
setIsEditing(true); setIsEditing(true); // Stops the polling
}; };
const handleNpcClick = (npc) => { const handleNpcClick = (npc) => {
@@ -102,6 +105,7 @@ const GameMasterPage = () => {
setIsEditing(true); setIsEditing(true);
}; };
// Update handleUpdate to fetch once after saving
const handleUpdate = async () => { const handleUpdate = async () => {
try { try {
let response; let response;
@@ -114,10 +118,26 @@ const GameMasterPage = () => {
} }
if (response.status === 200) { if (response.status === 200) {
const fetchData = async () => {
try {
const pcsResponse = await axios.get(`http://localhost:5000/games/${gameId}/playerchars`);
const processedPCs = Array.isArray(pcsResponse.data) ? pcsResponse.data : [pcsResponse.data];
setPlayerCharacters(processedPCs.filter(pc => pc !== null));
const npcsResponse = await axios.get(`http://localhost:5000/games/${gameId}/npcs`);
const processedNPCs = Array.isArray(npcsResponse.data) ? npcsResponse.data : [npcsResponse.data];
setNpcs(processedNPCs.filter(npc => npc !== null));
const itemsResponse = await axios.get(`http://localhost:5000/games/${gameId}/items`);
const processedItems = Array.isArray(itemsResponse.data) ? itemsResponse.data : [itemsResponse.data];
setItems(processedItems.filter(item => item !== null));
} catch (error) {
console.error('Error fetching data:', error);
}
};
await fetchData(); // Fetch once after successful update
setEditModalOpen(false); setEditModalOpen(false);
setIsEditing(false);
setFormData(null); setFormData(null);
fetchData();
} }
} catch (error) { } catch (error) {
console.error('Error updating:', error); console.error('Error updating:', error);
@@ -126,7 +146,7 @@ const GameMasterPage = () => {
const handleModalClose = () => { const handleModalClose = () => {
setEditModalOpen(false); setEditModalOpen(false);
setIsEditing(false); setIsEditing(false); // Restarts the polling
setFormData(null); setFormData(null);
}; };
@@ -489,8 +509,8 @@ const GameMasterPage = () => {
}}> }}>
<CardMedia <CardMedia
component="img" component="img"
height="135" // Reduced from 140 height="135"
image={item.img || defaultItemImage} // Changed from item.img to item.Img image={item.Img || defaultItemImage}
alt={item.ItemName} alt={item.ItemName}
className={`rarity-${item.Rarity} rarity-image`} className={`rarity-${item.Rarity} rarity-image`}
sx={{ sx={{