import React, { useState, useEffect } from 'react'; interface FFXIVItemPriceProps { itemId: number; itemName: string; itemImageUrl: string; } const FFXIVItemPrice: React.FC = ({ itemId = 5530, itemName="Coke", itemImageUrl="https://xivapi.com/i/021000/021462_hr1.png"}) => { const [selectedWorld, setSelectedWorld] = useState(null); const [dailySaleVelocity, setDailySaleVelocity] = useState(null); const [averageSalePrice, setAverageSalePrice] = useState(null); const [inputQuantity, setInputQuantity] = useState(0); const [potentialGil, setPotentialGil] = useState(0); const [dataSource, setDataSource] = useState('world'); const fetchData = (attempt: number = 1) => { fetch(`https://universalis.app/api/v2/aggregated/${selectedWorld}/${itemId}`) .then(response => response.json()) .then(data => { let result = data.results[0]; try { setDailySaleVelocity(Math.round(result.nq.dailySaleVelocity.world.quantity)); setAverageSalePrice(Math.round(result.nq.averageSalePrice.world.price)); setDataSource('world'); } catch (error) { try { setDailySaleVelocity(Math.round(result.nq.dailySaleVelocity.dc.quantity)); setAverageSalePrice(Math.round(result.nq.averageSalePrice.dc.price)); setDataSource('dc'); } catch (error) { try { setDailySaleVelocity(Math.round(result.nq.dailySaleVelocity.region.quantity)); setAverageSalePrice(Math.round(result.nq.averageSalePrice.region.price)); setDataSource('region'); } catch (error) { console.error('Error fetching data:', error); if (attempt < 3) { setTimeout(() => fetchData(attempt + 1), 5000); } } } } }) .catch(error => { console.error(`Error fetching data (attempt ${attempt}):`, error); if (attempt < 3) { setTimeout(() => fetchData(attempt + 1), 5000); } }); }; useEffect(() => { const savedWorld = localStorage.getItem('selectedWorld'); if (savedWorld) { setSelectedWorld(savedWorld); } else { setSelectedWorld('Midgardsormr'); } fetchData(); }, [itemId, selectedWorld]); const handleInputChange = (e: React.ChangeEvent) => { const quantity = parseInt(e.target.value, 10); setInputQuantity(quantity); setPotentialGil(quantity * (averageSalePrice || 0)); }; const formatNumber = (number: number | null) => { return number !== null ? new Intl.NumberFormat().format(number) : 'N/A'; }; return (
Average Price/Item: {formatNumber(averageSalePrice)} gil
Daily Sale Velocity: {formatNumber(dailySaleVelocity)} items
Enter Quantity:
Potential Gil Earnings: {formatNumber(potentialGil)} gil
); }; export default FFXIVItemPrice;