{"ast":null,"code":"var _jsxFileName = \"/home/magh/Documents/landing_page/src/App.js\",\n _s = $RefreshSig$(),\n _s2 = $RefreshSig$();\nimport React, { useState, useEffect } from 'react';\nimport './App.css';\nimport { jsxDEV as _jsxDEV } from \"react/jsx-dev-runtime\";\nfunction YacySearchResults({\n category,\n query\n}) {\n _s();\n const [results, setResults] = useState([]);\n const [loading, setLoading] = useState(false);\n const resultsPerPage = 50; // number of results to fetch per page\n const [page, setPage] = useState(0);\n\n // Map category to the corresponding YaCy JSON API endpoint\n const endpoints = {\n science: \"https://science.tsugutsugugo.com/yacysearch.json?query=\",\n philosophy: \"https://sophos.tsugutsugugo.com/yacysearch.json?query=\",\n tech: \"https://tech.tsugutsugugo.com/yacysearch.json?query=\",\n discover: \"https://web.tsugutsugugo.com/yacysearch.json?query=\"\n };\n useEffect(() => {\n if (!query) {\n setResults([]);\n return;\n }\n setLoading(true);\n const startRecord = page * resultsPerPage;\n const baseUrl = endpoints[category] || endpoints.science;\n const apiUrl = `${baseUrl}${encodeURIComponent(query)}&resource=global&urlmaskfilter=.*&prefermaskfilter=&nav=all&startRecord=${startRecord}&maximumRecords=${resultsPerPage}`;\n fetch(apiUrl).then(res => res.json()).then(data => {\n var _data$channel;\n // Depending on the JSON structure returned by YaCy, adjust as needed.\n // For this example, we assume that results are stored in data.channel.item as an array.\n const items = ((_data$channel = data.channel) === null || _data$channel === void 0 ? void 0 : _data$channel.item) || [];\n // Map each XML item to a simplified object.\n const parsedResults = items.map(item => ({\n title: item.title || \"\",\n link: item.link || \"\",\n description: item.description || \"\",\n pubDate: item.pubDate || \"\"\n }));\n setResults(parsedResults);\n }).catch(err => {\n console.error(\"Error fetching search results:\", err);\n setResults([]);\n }).finally(() => {\n setLoading(false);\n });\n }, [category, query, page]);\n const handleNext = () => setPage(page + 1);\n const handlePrev = () => {\n if (page > 0) setPage(page - 1);\n };\n return /*#__PURE__*/_jsxDEV(\"div\", {\n className: \"search-results\",\n style: {\n marginTop: '2rem',\n textAlign: 'left'\n },\n children: [loading && /*#__PURE__*/_jsxDEV(\"p\", {\n children: \"Loading results...\"\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 57,\n columnNumber: 19\n }, this), !loading && results.length === 0 && query && /*#__PURE__*/_jsxDEV(\"p\", {\n children: [\"No results found for \\\"\", /*#__PURE__*/_jsxDEV(\"strong\", {\n children: query\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 59,\n columnNumber: 34\n }, this), \"\\\".\"]\n }, void 0, true, {\n fileName: _jsxFileName,\n lineNumber: 59,\n columnNumber: 9\n }, this), results.map(result => /*#__PURE__*/_jsxDEV(\"div\", {\n className: \"result-item\",\n style: {\n borderBottom: '1px solid #ccc',\n padding: '1rem 0'\n },\n children: [/*#__PURE__*/_jsxDEV(\"h3\", {\n className: \"result-title\",\n children: /*#__PURE__*/_jsxDEV(\"a\", {\n href: result.link,\n target: \"_blank\",\n rel: \"noopener noreferrer\",\n children: result.title\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 64,\n columnNumber: 13\n }, this)\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 63,\n columnNumber: 11\n }, this), /*#__PURE__*/_jsxDEV(\"p\", {\n className: \"result-description\",\n dangerouslySetInnerHTML: {\n __html: result.description\n }\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 68,\n columnNumber: 11\n }, this), /*#__PURE__*/_jsxDEV(\"p\", {\n className: \"result-meta\",\n style: {\n fontSize: '0.85rem',\n color: '#555'\n },\n children: [result.pubDate, \" |\", ' ', /*#__PURE__*/_jsxDEV(\"a\", {\n href: `https://web.archive.org/web/*/${encodeURIComponent(result.link)}`,\n target: \"_blank\",\n rel: \"noopener noreferrer\",\n children: \"Cache\"\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 74,\n columnNumber: 13\n }, this)]\n }, void 0, true, {\n fileName: _jsxFileName,\n lineNumber: 72,\n columnNumber: 11\n }, this)]\n }, result.link, true, {\n fileName: _jsxFileName,\n lineNumber: 62,\n columnNumber: 9\n }, this)), /*#__PURE__*/_jsxDEV(\"div\", {\n className: \"pagination\",\n style: {\n textAlign: 'center',\n margin: '1rem 0'\n },\n children: [page > 0 && /*#__PURE__*/_jsxDEV(\"button\", {\n onClick: handlePrev,\n children: \"Previous\"\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 85,\n columnNumber: 22\n }, this), results.length === resultsPerPage && /*#__PURE__*/_jsxDEV(\"button\", {\n onClick: handleNext,\n children: \"Next\"\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 86,\n columnNumber: 47\n }, this)]\n }, void 0, true, {\n fileName: _jsxFileName,\n lineNumber: 84,\n columnNumber: 7\n }, this)]\n }, void 0, true, {\n fileName: _jsxFileName,\n lineNumber: 56,\n columnNumber: 5\n }, this);\n}\n_s(YacySearchResults, \"OPKTaR9Cw+8xxEkhFKF7+871bVA=\");\n_c = YacySearchResults;\nfunction App() {\n _s2();\n const [query, setQuery] = useState('');\n const [category, setCategory] = useState('science');\n const [showResults, setShowResults] = useState(false);\n\n // Mapping for mascot images by category\n const imageMap = {\n science: 'main.png',\n philosophy: 'philosophy.png',\n tech: 'tech.png',\n discover: 'web.png'\n };\n\n // Mapping for header images by category\n const headerMap = {\n science: 'header.png',\n philosophy: 'header_philosophy.png',\n tech: 'header_tech.png',\n discover: 'header_web.png'\n };\n\n // Mapping for overall background colors for the App container.\n const appBgMap = {\n science: '#fcfcff',\n // keeps your original body background color\n philosophy: '#ffffff',\n // example for other categories\n tech: '#ffffff',\n discover: '#ffffff'\n };\n\n // Mapping for header background colors.\n const headerBgMap = {\n science: '#f8f8f8',\n // keeps your original header background\n philosophy: '#ffffff',\n // example for other categories\n tech: '#ffffff',\n discover: '#ffffff'\n };\n const handleSubmit = e => {\n e.preventDefault();\n // Instead of redirecting, we update state to show results.\n setShowResults(true);\n };\n return /*#__PURE__*/_jsxDEV(\"div\", {\n className: \"App\",\n style: {\n backgroundColor: appBgMap[category]\n },\n children: [/*#__PURE__*/_jsxDEV(\"header\", {\n className: \"header-bar\",\n style: {\n backgroundColor: headerBgMap[category]\n },\n children: /*#__PURE__*/_jsxDEV(\"img\", {\n src: headerMap[category],\n alt: \"Header\"\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 138,\n columnNumber: 9\n }, this)\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 137,\n columnNumber: 7\n }, this), /*#__PURE__*/_jsxDEV(\"main\", {\n className: \"main-content\",\n children: [/*#__PURE__*/_jsxDEV(\"img\", {\n id: \"mascot-img\",\n src: imageMap[category],\n alt: \"Mascot\"\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 141,\n columnNumber: 9\n }, this), /*#__PURE__*/_jsxDEV(\"div\", {\n id: \"tagline\",\n children: \"a search engine for the rest of us\"\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 142,\n columnNumber: 9\n }, this), /*#__PURE__*/_jsxDEV(\"form\", {\n className: \"search-form\",\n onSubmit: handleSubmit,\n children: [/*#__PURE__*/_jsxDEV(\"div\", {\n className: \"search-container\",\n children: /*#__PURE__*/_jsxDEV(\"input\", {\n type: \"text\",\n name: \"search\",\n placeholder: \"Search...\",\n value: query,\n onChange: e => {\n setQuery(e.target.value);\n setShowResults(false); // reset when the query changes\n }\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 145,\n columnNumber: 13\n }, this)\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 144,\n columnNumber: 11\n }, this), /*#__PURE__*/_jsxDEV(\"div\", {\n className: \"radio-options\",\n children: [/*#__PURE__*/_jsxDEV(\"label\", {\n htmlFor: \"science\",\n children: [/*#__PURE__*/_jsxDEV(\"input\", {\n type: \"radio\",\n name: \"category\",\n id: \"science\",\n value: \"science\",\n checked: category === 'science',\n onChange: e => {\n setCategory(e.target.value);\n setShowResults(false); // optionally reset results\n }\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 158,\n columnNumber: 15\n }, this), \"Science\"]\n }, void 0, true, {\n fileName: _jsxFileName,\n lineNumber: 157,\n columnNumber: 13\n }, this), /*#__PURE__*/_jsxDEV(\"label\", {\n htmlFor: \"philosophy\",\n children: [/*#__PURE__*/_jsxDEV(\"input\", {\n type: \"radio\",\n name: \"category\",\n id: \"philosophy\",\n value: \"philosophy\",\n checked: category === 'philosophy',\n onChange: e => {\n setCategory(e.target.value);\n setShowResults(false);\n }\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 172,\n columnNumber: 15\n }, this), \"Philosophy\"]\n }, void 0, true, {\n fileName: _jsxFileName,\n lineNumber: 171,\n columnNumber: 13\n }, this), /*#__PURE__*/_jsxDEV(\"label\", {\n htmlFor: \"tech\",\n children: [/*#__PURE__*/_jsxDEV(\"input\", {\n type: \"radio\",\n name: \"category\",\n id: \"tech\",\n value: \"tech\",\n checked: category === 'tech',\n onChange: e => {\n setCategory(e.target.value);\n setShowResults(false);\n }\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 186,\n columnNumber: 15\n }, this), \"Tech\"]\n }, void 0, true, {\n fileName: _jsxFileName,\n lineNumber: 185,\n columnNumber: 13\n }, this), /*#__PURE__*/_jsxDEV(\"label\", {\n htmlFor: \"discover\",\n children: [/*#__PURE__*/_jsxDEV(\"input\", {\n type: \"radio\",\n name: \"category\",\n id: \"discover\",\n value: \"discover\",\n checked: category === 'discover',\n onChange: e => {\n setCategory(e.target.value);\n setShowResults(false);\n }\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 200,\n columnNumber: 15\n }, this), \"Discover the Web\"]\n }, void 0, true, {\n fileName: _jsxFileName,\n lineNumber: 199,\n columnNumber: 13\n }, this)]\n }, void 0, true, {\n fileName: _jsxFileName,\n lineNumber: 156,\n columnNumber: 11\n }, this)]\n }, void 0, true, {\n fileName: _jsxFileName,\n lineNumber: 143,\n columnNumber: 9\n }, this), showResults && /*#__PURE__*/_jsxDEV(YacySearchResults, {\n category: category,\n query: query\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 216,\n columnNumber: 25\n }, this)]\n }, void 0, true, {\n fileName: _jsxFileName,\n lineNumber: 140,\n columnNumber: 7\n }, this), /*#__PURE__*/_jsxDEV(\"footer\", {\n className: \"footer\",\n children: [/*#__PURE__*/_jsxDEV(\"a\", {\n href: \"https://git.tsugutsugugo.com/explore/repos\",\n children: \"Source\"\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 219,\n columnNumber: 9\n }, this), \" |\", ' ', /*#__PURE__*/_jsxDEV(\"a\", {\n href: \"https://docs.tsugutsugugo.com/\",\n children: \"Docs\"\n }, void 0, false, {\n fileName: _jsxFileName,\n lineNumber: 220,\n columnNumber: 9\n }, this)]\n }, void 0, true, {\n fileName: _jsxFileName,\n lineNumber: 218,\n columnNumber: 7\n }, this)]\n }, void 0, true, {\n fileName: _jsxFileName,\n lineNumber: 136,\n columnNumber: 5\n }, this);\n}\n_s2(App, \"3BCUzD+xqDqezpeDr2sTxPiaCYE=\");\n_c2 = App;\nexport default App;\nvar _c, _c2;\n$RefreshReg$(_c, \"YacySearchResults\");\n$RefreshReg$(_c2, \"App\");","map":{"version":3,"names":["React","useState","useEffect","jsxDEV","_jsxDEV","YacySearchResults","category","query","_s","results","setResults","loading","setLoading","resultsPerPage","page","setPage","endpoints","science","philosophy","tech","discover","startRecord","baseUrl","apiUrl","encodeURIComponent","fetch","then","res","json","data","_data$channel","items","channel","item","parsedResults","map","title","link","description","pubDate","catch","err","console","error","finally","handleNext","handlePrev","className","style","marginTop","textAlign","children","fileName","_jsxFileName","lineNumber","columnNumber","length","result","borderBottom","padding","href","target","rel","dangerouslySetInnerHTML","__html","fontSize","color","margin","onClick","_c","App","_s2","setQuery","setCategory","showResults","setShowResults","imageMap","headerMap","appBgMap","headerBgMap","handleSubmit","e","preventDefault","backgroundColor","src","alt","id","onSubmit","type","name","placeholder","value","onChange","htmlFor","checked","_c2","$RefreshReg$"],"sources":["/home/magh/Documents/landing_page/src/App.js"],"sourcesContent":["import React, { useState, useEffect } from 'react';\nimport './App.css';\n\nfunction YacySearchResults({ category, query }) {\n const [results, setResults] = useState([]);\n const [loading, setLoading] = useState(false);\n const resultsPerPage = 50; // number of results to fetch per page\n const [page, setPage] = useState(0);\n\n // Map category to the corresponding YaCy JSON API endpoint\n const endpoints = {\n science: \"https://science.tsugutsugugo.com/yacysearch.json?query=\",\n philosophy: \"https://sophos.tsugutsugugo.com/yacysearch.json?query=\",\n tech: \"https://tech.tsugutsugugo.com/yacysearch.json?query=\",\n discover: \"https://web.tsugutsugugo.com/yacysearch.json?query=\"\n };\n\n useEffect(() => {\n if (!query) {\n setResults([]);\n return;\n }\n setLoading(true);\n const startRecord = page * resultsPerPage;\n const baseUrl = endpoints[category] || endpoints.science;\n const apiUrl = `${baseUrl}${encodeURIComponent(query)}&resource=global&urlmaskfilter=.*&prefermaskfilter=&nav=all&startRecord=${startRecord}&maximumRecords=${resultsPerPage}`;\n\n fetch(apiUrl)\n .then((res) => res.json())\n .then((data) => {\n // Depending on the JSON structure returned by YaCy, adjust as needed.\n // For this example, we assume that results are stored in data.channel.item as an array.\n const items = data.channel?.item || [];\n // Map each XML item to a simplified object.\n const parsedResults = items.map((item) => ({\n title: item.title || \"\",\n link: item.link || \"\",\n description: item.description || \"\",\n pubDate: item.pubDate || \"\"\n }));\n setResults(parsedResults);\n })\n .catch((err) => {\n console.error(\"Error fetching search results:\", err);\n setResults([]);\n })\n .finally(() => {\n setLoading(false);\n });\n }, [category, query, page]);\n\n const handleNext = () => setPage(page + 1);\n const handlePrev = () => { if (page > 0) setPage(page - 1); };\n\n return (\n
Loading results...
}\n {!loading && results.length === 0 && query && (\nNo results found for \"{query}\".
\n )}\n {results.map((result) => (\n\n {result.pubDate} |{' '}\n \n Cache\n \n
\n