outshine84 commited on
Commit
ae65ff2
·
1 Parent(s): 1c05683

altre specie

Browse files
Files changed (2) hide show
  1. pwa-app/src/App.jsx +36 -0
  2. 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;