aboutsummaryrefslogtreecommitdiffstats
path: root/src/components
diff options
context:
space:
mode:
Diffstat (limited to 'src/components')
-rw-r--r--src/components/AnotherComponent.tsx28
-rw-r--r--src/components/FFXIVItemPrice.tsx83
-rw-r--r--src/components/FFXIVWorldSelector.tsx17
3 files changed, 93 insertions, 35 deletions
diff --git a/src/components/AnotherComponent.tsx b/src/components/AnotherComponent.tsx
deleted file mode 100644
index f74e924..0000000
--- a/src/components/AnotherComponent.tsx
+++ /dev/null
@@ -1,28 +0,0 @@
-import React, { useState, useEffect } from 'react';
-
-const AnotherComponent: React.FC = () => {
- const [selectedWorld, setSelectedWorld] = useState<string | null>(null);
-
- useEffect(() => {
- // Load selected world from localStorage
- const savedWorld = localStorage.getItem('selectedWorld');
- if (savedWorld) {
- setSelectedWorld(savedWorld);
- }
- }, []);
-
- return (
- <div>
- <p>Selected World: {selectedWorld}</p>
- <button onClick={() => {
- const newWorld = 'New World';
- setSelectedWorld(newWorld);
- localStorage.setItem('selectedWorld', newWorld); // Save to localStorage
- }}>
- Change World
- </button>
- </div>
- );
-};
-
-export default AnotherComponent; \ No newline at end of file
diff --git a/src/components/FFXIVItemPrice.tsx b/src/components/FFXIVItemPrice.tsx
new file mode 100644
index 0000000..8f265fc
--- /dev/null
+++ b/src/components/FFXIVItemPrice.tsx
@@ -0,0 +1,83 @@
+import React, { useState, useEffect } from 'react';
+
+interface FFXIVItemPriceProps {
+ itemId: number;
+ itemName: string;
+ itemImageUrl: string;
+}
+
+const FFXIVItemPrice: React.FC<FFXIVItemPriceProps> = ({ itemId = 5530, itemName="Coke", itemImageUrl="https://xivapi.com/i/021000/021462_hr1.png"}) => {
+ const [selectedWorld, setSelectedWorld] = useState<string | null>(null);
+ const [dailySaleVelocity, setDailySaleVelocity] = useState<number | null>(null);
+ const [averageSalePrice, setAverageSalePrice] = useState<number | null>(null);
+ const [inputQuantity, setInputQuantity] = useState<number>(0);
+ const [potentialGil, setPotentialGil] = useState<number>(0);
+
+ useEffect(() => {
+ const savedWorld = localStorage.getItem('selectedWorld');
+ if (savedWorld) {
+ setSelectedWorld(savedWorld);
+ } else {
+ setSelectedWorld('Midgardsormr');
+ }
+
+ fetch(`https://universalis.app/api/v2/aggregated/${selectedWorld}/${itemId}`)
+ .then(response => response.json())
+ .then(data => {
+ const result = data.results[0];
+ setDailySaleVelocity(Math.round(result.nq.dailySaleVelocity.world.quantity));
+ setAverageSalePrice(Math.round(result.nq.averageSalePrice.world.price));
+ })
+ .catch(error => console.error('Error fetching data:', error));
+ }, [itemId, selectedWorld]);
+
+ const handleInputChange = (e: React.ChangeEvent<HTMLInputElement>) => {
+ 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 (
+ <div className="ffxiv-container">
+ <div className="ffxiv-header">
+ <h1 className="ffxiv-h1">{itemName}</h1>
+ <img src={itemImageUrl} alt={itemName} className="ffxiv-item-icon" />
+ </div>
+ <table className="ffxiv-table">
+ <tbody>
+ <tr>
+ <td className="ffxiv-label">Daily Sale Velocity:</td>
+ <td className="ffxiv-value">{formatNumber(dailySaleVelocity)} items</td>
+ </tr>
+ <tr>
+ <td className="ffxiv-label">Average Price/Item:</td>
+ <td className="ffxiv-value">{formatNumber(averageSalePrice)} gil</td>
+ </tr>
+ <tr>
+ <td className="ffxiv-label">Enter Quantity:</td>
+ <td>
+ <input
+ type="number"
+ value={inputQuantity}
+ onChange={handleInputChange}
+ placeholder="Enter quantity"
+ className="ffxiv-input"
+ />
+ </td>
+ </tr>
+ <tr>
+ <td className="ffxiv-label">Potential Gil Earnings:</td>
+ <td className="ffxiv-value">{formatNumber(potentialGil)} gil</td>
+ </tr>
+ </tbody>
+ </table>
+ <footer>{selectedWorld} Marketboard Data provided by Universalis API</footer>
+ </div>
+ );
+};
+
+export default FFXIVItemPrice; \ No newline at end of file
diff --git a/src/components/FFXIVWorldSelector.tsx b/src/components/FFXIVWorldSelector.tsx
index f2dc4cc..63eff07 100644
--- a/src/components/FFXIVWorldSelector.tsx
+++ b/src/components/FFXIVWorldSelector.tsx
@@ -1,11 +1,15 @@
import React, { useState, useEffect } from 'react';
-
+import '../styles/ffxiv-selector.css';
interface World {
id: number;
name: string;
}
-const FFXIVWorldSelector: React.FC = () => {
+interface FFXIVWorldSelectorProps {
+ message: string;
+}
+
+const FFXIVWorldSelector: React.FC<FFXIVWorldSelectorProps> = ({ message = "Select a World" }) => {
const [worlds, setWorlds] = useState<World[]>([]);
const [selectedWorld, setSelectedWorld] = useState<string | null>(null);
@@ -40,9 +44,9 @@ const FFXIVWorldSelector: React.FC = () => {
};
return (
- <div>
- <label htmlFor="world-select">Select a world: </label>
- <select id="world-select" onChange={handleWorldChange} value={selectedWorld || ''}>
+ <div className="ffxiv-container">
+ <label htmlFor="world-select" className="ffxiv-label">{message}</label>
+ <select id="world-select" onChange={handleWorldChange} value={selectedWorld || ''} className="ffxiv-select">
<option value="">--Please choose an option--</option>
{worlds.map((world) => (
<option key={world.id} value={world.name}>
@@ -50,8 +54,7 @@ const FFXIVWorldSelector: React.FC = () => {
</option>
))}
</select>
- {selectedWorld && <p>Selected World: {selectedWorld}</p>}
- <button onClick={handleApplyClick}>Apply</button>
+ <button onClick={handleApplyClick} className="ffxiv-button">Apply</button>
</div>
);
};
send patches to the email below
yukais@pinapelz.com
include the subject [PATCH repo_name]
pinapelz.com
homepage