Spaces:
Sleeping
Sleeping
outshine84 commited on
Commit ·
ae65ff2
1
Parent(s): 1c05683
altre specie
Browse files- pwa-app/src/App.jsx +36 -0
- pwa-app/src/styles.css +12 -0
pwa-app/src/App.jsx
CHANGED
|
@@ -121,6 +121,7 @@ export default function App({ googleClientIdConfigured = false }) {
|
|
| 121 |
const cameraInputRef = useRef(null);
|
| 122 |
|
| 123 |
const [searchResults, setSearchResults] = useState([]);
|
|
|
|
| 124 |
const [speciesPreviews, setSpeciesPreviews] = useState({});
|
| 125 |
const [speciesCommonNames, setSpeciesCommonNames] = useState({});
|
| 126 |
const [selectedSpecies, setSelectedSpecies] = useState("");
|
|
@@ -319,6 +320,7 @@ export default function App({ googleClientIdConfigured = false }) {
|
|
| 319 |
setFile(nextFile);
|
| 320 |
setSelectedSpecies("");
|
| 321 |
setSearchResults([]);
|
|
|
|
| 322 |
setSpeciesPreviews({});
|
| 323 |
setSpeciesCommonNames({});
|
| 324 |
setShowSpeciesGrid(true);
|
|
@@ -381,6 +383,7 @@ export default function App({ googleClientIdConfigured = false }) {
|
|
| 381 |
|
| 382 |
setError("");
|
| 383 |
setSearchResults([]);
|
|
|
|
| 384 |
setSpeciesPreviews({});
|
| 385 |
setSpeciesCommonNames({});
|
| 386 |
setSelectedSpecies("");
|
|
@@ -416,6 +419,31 @@ export default function App({ googleClientIdConfigured = false }) {
|
|
| 416 |
}
|
| 417 |
}
|
| 418 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 419 |
async function selectSpecies(speciesName) {
|
| 420 |
setSelectedSpecies(speciesName);
|
| 421 |
setShowSpeciesGrid(false);
|
|
@@ -940,6 +968,14 @@ export default function App({ googleClientIdConfigured = false }) {
|
|
| 940 |
</button>
|
| 941 |
))}
|
| 942 |
</div>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 943 |
</>
|
| 944 |
)}
|
| 945 |
</section>
|
|
|
|
| 121 |
const cameraInputRef = useRef(null);
|
| 122 |
|
| 123 |
const [searchResults, setSearchResults] = useState([]);
|
| 124 |
+
const [searchFile, setSearchFile] = useState(null);
|
| 125 |
const [speciesPreviews, setSpeciesPreviews] = useState({});
|
| 126 |
const [speciesCommonNames, setSpeciesCommonNames] = useState({});
|
| 127 |
const [selectedSpecies, setSelectedSpecies] = useState("");
|
|
|
|
| 320 |
setFile(nextFile);
|
| 321 |
setSelectedSpecies("");
|
| 322 |
setSearchResults([]);
|
| 323 |
+
setSearchFile(null);
|
| 324 |
setSpeciesPreviews({});
|
| 325 |
setSpeciesCommonNames({});
|
| 326 |
setShowSpeciesGrid(true);
|
|
|
|
| 383 |
|
| 384 |
setError("");
|
| 385 |
setSearchResults([]);
|
| 386 |
+
setSearchFile(file);
|
| 387 |
setSpeciesPreviews({});
|
| 388 |
setSpeciesCommonNames({});
|
| 389 |
setSelectedSpecies("");
|
|
|
|
| 419 |
}
|
| 420 |
}
|
| 421 |
|
| 422 |
+
async function loadMoreSpecies() {
|
| 423 |
+
if (!searchFile || busy.moreSpecies) return;
|
| 424 |
+
setBusy((prev) => ({ ...prev, moreSpecies: true }));
|
| 425 |
+
try {
|
| 426 |
+
const nextK = searchResults.length + 5;
|
| 427 |
+
const data = await searchPlantImage(searchFile, nextK);
|
| 428 |
+
const allResults = [...(data.results || [])].sort((a, b) => b.score - a.score);
|
| 429 |
+
const existingNames = new Set(searchResults.map((r) => r.species));
|
| 430 |
+
const newResults = allResults.filter((r) => !existingNames.has(r.species));
|
| 431 |
+
if (!newResults.length) return;
|
| 432 |
+
const newSpeciesNames = newResults.map((r) => r.species);
|
| 433 |
+
const [previewData, commonNameData] = await Promise.all([
|
| 434 |
+
getSpeciesPreviews(newSpeciesNames),
|
| 435 |
+
getSpeciesCommonNames(newSpeciesNames),
|
| 436 |
+
]);
|
| 437 |
+
setSpeciesPreviews((prev) => ({ ...prev, ...(previewData.previews || {}) }));
|
| 438 |
+
setSpeciesCommonNames((prev) => ({ ...prev, ...(commonNameData.common_names || {}) }));
|
| 439 |
+
setSearchResults((prev) => [...prev, ...newResults]);
|
| 440 |
+
} catch (err) {
|
| 441 |
+
setError(err.message);
|
| 442 |
+
} finally {
|
| 443 |
+
setBusy((prev) => ({ ...prev, moreSpecies: false }));
|
| 444 |
+
}
|
| 445 |
+
}
|
| 446 |
+
|
| 447 |
async function selectSpecies(speciesName) {
|
| 448 |
setSelectedSpecies(speciesName);
|
| 449 |
setShowSpeciesGrid(false);
|
|
|
|
| 968 |
</button>
|
| 969 |
))}
|
| 970 |
</div>
|
| 971 |
+
<button
|
| 972 |
+
type="button"
|
| 973 |
+
className="btn-secondary btn-more-species"
|
| 974 |
+
onClick={loadMoreSpecies}
|
| 975 |
+
disabled={busy.moreSpecies}
|
| 976 |
+
>
|
| 977 |
+
{busy.moreSpecies ? "Cerco..." : "+ Altre specie"}
|
| 978 |
+
</button>
|
| 979 |
</>
|
| 980 |
)}
|
| 981 |
</section>
|
pwa-app/src/styles.css
CHANGED
|
@@ -248,6 +248,18 @@ button:disabled {
|
|
| 248 |
padding: 0.5rem 1rem;
|
| 249 |
}
|
| 250 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 251 |
.btn-small {
|
| 252 |
font-size: 0.78rem;
|
| 253 |
padding: 0.25rem 0.65rem;
|
|
|
|
| 248 |
padding: 0.5rem 1rem;
|
| 249 |
}
|
| 250 |
|
| 251 |
+
.btn-more-species {
|
| 252 |
+
display: block;
|
| 253 |
+
width: 100%;
|
| 254 |
+
margin-top: 0.75rem;
|
| 255 |
+
text-align: center;
|
| 256 |
+
}
|
| 257 |
+
|
| 258 |
+
.btn-more-species:disabled {
|
| 259 |
+
opacity: 0.5;
|
| 260 |
+
cursor: default;
|
| 261 |
+
}
|
| 262 |
+
|
| 263 |
.btn-small {
|
| 264 |
font-size: 0.78rem;
|
| 265 |
padding: 0.25rem 0.65rem;
|