You are seeing an ESLint warning (probably from react-hooks/exhaustive-deps
) because you are using apiParameters
inside the useEffect
, but it's not in the dependency array.
👉 The problem:
apiParameters
comes from the component scope and is "stale" insideuseEffect
when you usesetApiParameters({ ...apiParameters, models: data })
.- ESLint suggests adding
apiParameters
to the dependency array to ensure it stays up to date — but you don’t want that, because you want theuseEffect
to run once (empty dependency[]
).
Solution (safe pattern): Use functional update to avoid stale closure
React allows you to use this pattern:
setApiParameters((prev) => ({ ...prev, models: data }));
👉 This way you do not need to depend on apiParameters
, because you are always using the latest value.
Final optimized version (solves ESLint + keeps one-time run):
useEffect(() => {
let ignore = false;
async function fetchModel() {
try {
const response = await fetch("https://image.pollinations.ai/models");
if (!response.ok) {
console.log("Failed to Fetch Models");
return;
}
const data = await response.json();
if (!ignore) {
setApiParameters((prev) => ({ ...prev, models: data }));
}
} catch (error) {
console.log(error.message);
}
}
fetchModel();
return () => (ignore = true);
}, []); // still empty array — safe now
Summary:
✅ ESLint error will be gone — no need to add apiParameters
to dependencies.
✅ Your effect still runs only once ([]
dependency).
✅ Code works safely even if apiParameters
changes in the future.
If you want, I can also explain why "functional update" solves the stale closure problem — just say if you want that too. Would you like to? 🚀