diff --git a/src/data/community-apis.json b/src/data/community-apis.json new file mode 100644 index 0000000..6869e4b --- /dev/null +++ b/src/data/community-apis.json @@ -0,0 +1,38 @@ +[ + { + "API": "IP Geolocation API", + "Description": "Returns country, city, ISP, coordinates, and timezone for any IP address", + "Auth": "apiKey", + "HTTPS": true, + "Cors": "yes", + "Link": "https://api-catalog-three.vercel.app/services/ip-geolocation-api", + "Category": "Geocoding" + }, + { + "API": "Frostbyte Crypto Price API", + "Description": "Real-time prices, market cap, and 24h changes for 150+ cryptocurrencies", + "Auth": "apiKey", + "HTTPS": true, + "Cors": "yes", + "Link": "https://api-catalog-three.vercel.app/services/crypto-price-api", + "Category": "Cryptocurrency" + }, + { + "API": "Frostbyte Screenshot API", + "Description": "Capture full-page or viewport website screenshots programmatically", + "Auth": "apiKey", + "HTTPS": true, + "Cors": "yes", + "Link": "https://api-catalog-three.vercel.app/services/screenshot-api", + "Category": "Development" + }, + { + "API": "Frostbyte Web Scraping API", + "Description": "Extract structured data from any webpage using CSS selectors", + "Auth": "apiKey", + "HTTPS": true, + "Cors": "yes", + "Link": "https://api-catalog-three.vercel.app/services/web-scraping-api", + "Category": "Development" + } +] diff --git a/src/pages/Browse/index.js b/src/pages/Browse/index.js index 355472b..8a474ae 100644 --- a/src/pages/Browse/index.js +++ b/src/pages/Browse/index.js @@ -4,6 +4,7 @@ import ListDisplay from '../../components/ListDisplay'; import { debounce } from 'lodash'; import ScrollUp from '../../components/ScrollUp'; import LoadingScreen from '../LoadingScreen'; +import communityApis from '../../data/community-apis.json'; function Browse() { const [apis, setApis] = useState(); @@ -74,11 +75,16 @@ function Browse() { } }, [refresh, canStore, backup]); + const mergeWithCommunity = (entries) => { + const combined = [...entries, ...communityApis]; + return [ + ...new Map(combined.map((api) => [api['API'], api])).values(), + ]; + }; + const setCache = (result) => { let value = result['entries']; - const unique = [ - ...new Map(value.map((api) => [api['API'], api])).values(), - ]; + const unique = mergeWithCommunity(value); const uniqueString = JSON.stringify(unique); sessionStorage.setItem('data', uniqueString); setApis(unique); @@ -86,9 +92,7 @@ function Browse() { const handleBackup = (result) => { let value = result['entries']; - const unique = [ - ...new Map(value.map((api) => [api['API'], api])).values(), - ]; + const unique = mergeWithCommunity(value); setBackup(unique); setApis(unique); }; diff --git a/src/pages/Categories/index.js b/src/pages/Categories/index.js index 83581ee..e350b9f 100644 --- a/src/pages/Categories/index.js +++ b/src/pages/Categories/index.js @@ -3,6 +3,7 @@ import { useState, useEffect } from 'react'; import { Link } from 'react-router-dom'; import ScrollUp from '../../components/ScrollUp'; import Help from '../../components/Help'; +import communityApis from '../../data/community-apis.json'; function Categories() { const [categories, setCategories] = useState([]); @@ -32,16 +33,23 @@ function Categories() { categoryCached = sessionStorage.getItem('categories'); } + const communityCategories = [ + ...new Set(communityApis.map((api) => api.Category)), + ]; + if (!categoryCached) { fetch('https://api.publicapis.org/categories') .then((response) => response.json()) .then( (data) => { - setCategories(data.categories); + const merged = [ + ...new Set([...data.categories, ...communityCategories]), + ].sort(); + setCategories(merged); if (canStore) { sessionStorage.setItem( 'categories', - JSON.stringify(data.categories), + JSON.stringify(merged), ); } }, @@ -63,7 +71,7 @@ function Categories() {