import { useState } from "react"; import { Button, Spinner } from "react-bootstrap"; import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; import { faMagnifyingGlass, faArrowUpRightFromSquare, faBookmark } from "@fortawesome/free-solid-svg-icons"; import { CalorieSearchResult, searchCalories } from "../../../types"; type Props = { /** Název jídla, ke kterému se energie hledá. */ name: string, /** Zavolá se po výběru návrhu s energií na 100 g v kcal. */ onPick: (caloriesPer100g: number) => void, }; /** Návrhy pocházející z vlastní knihovny se odlišují ikonou a popiskem. */ const LIBRARY_ORIGIN = 'library'; /** * Vyhledání energetické hodnoty k názvu jídla. * * Návrhy chodí z vlastní knihovny dřívějších zadání a od externího poskytovatele. * Když je poskytovatel nedostupný (což se stává), zůstane aspoň knihovna a odkaz * na KalorickéTabulky.cz, odkud si hodnotu uživatel opíše ručně — automaticky se * odtud nic nestahuje, veřejné API nemají. */ export default function CalorieLookup({ name, onPick }: Readonly) { const [result, setResult] = useState(); const [searching, setSearching] = useState(false); const [copied, setCopied] = useState(false); const canSearch = name.trim().length > 0 && !searching; /** * Zkopíruje název jídla do schránky při otevření Kalorických tabulek. * Jejich vyhledávání nejde předvyplnit z URL, takže aspoň stačí vložit. */ const copyName = () => { navigator.clipboard?.writeText(name.trim()) .then(() => setCopied(true)) .catch(() => { /* schránka není dostupná, odkaz se stejně otevře */ }); }; const search = async () => { if (!canSearch) return; setSearching(true); const response = await searchCalories({ query: { q: name.trim() } }); setResult(response.data); setCopied(false); setSearching(false); }; return (
{!canSearch && !name.trim().length && ( nejdřív vyplňte název jídla )} {result && !searching && (
{result.suggestions.map(suggestion => ( ))} {!result.suggestions.length && (
Nic se nenašlo{!result.providerAvailable && ' a externí databáze je nedostupná'}.
)} {result.providerAvailable === false && !!result.suggestions.length && (
Externí databáze je nedostupná, návrhy jsou jen z vašich dřívějších zadání.
)} {copied ? 'Název zkopírován, vložte ho do jejich hledání' : 'Otevřít KalorickéTabulky.cz'} {' '}
)}
); }