
Security News
Browserslist-rs Gets Major Refactor, Cutting Binary Size by Over 1MB
Browserslist-rs now uses static data to reduce binary size by over 1MB, improving memory use and performance for Rust-based frontend tools.
@developmentseed/stac-react
Advanced tools
React components and hooks for building STAC-API front-ends
React hooks to build front-end applications for STAC APIs.
Note: stac-react is in early development, the API will likely break in future versions.
With NPM:
npm i @developmentseed/stac-react
With Yarn:
yarn add @developmentseed/stac-react
Stac-react's hooks must be used inside children of a React context that provides access to the stac-react's core functionality.
To get started, initialize StacApiProvider
with the base URL of the STAC catalog.
import { StacApiProvider } from "stac-react";
function StacApp() {
return (
<StacApiProvider apiUrl="https://my-stac-api.com">
// Other components
</StacApiProvide>
);
}
Now you can start using stac-react hooks in child components of StacApiProvider
import { StacApiProvider, useCollections } from "stac-react";
function Collections() {
const { collections } = useCollections();
return (
<ul>
{collections.collections.map(({ id, title }) => (
<li key={id}>{ title }</li>
))}
</ul>
)
}
function StacApp() {
return (
<StacApiProvider apiUrl="https://my-stac-api.com">
<Collections />
</StacApiProvide>
);
}
Provides the React context required for stac-react hooks.
import { StacApiProvider } from "stac-react";
function StacApp() {
return (
<StacApiProvider apiUrl="https://my-stac-api.com">
// Other components
</StacApiProvide>
);
}
Option | Type | Description |
---|---|---|
apiUrl . | string | The base url of the STAC catalog. |
Retrieves collections from a STAC catalog.
import { useCollections } from "stac-react";
const { collections } = useCollections();
Option | Type | Description |
---|---|---|
collections | array | A list of collections available from the STAC catalog. Is null if collections have not been retrieved. |
state | str | The status of the request. "IDLE" before and after the request is sent or received. "LOADING" when the request is in progress. |
reload | function | Callback function to trigger a reload of collections. |
error | Error | Error information if the last request was unsuccessful. undefined if the last request was successful. |
import { useCollections } from "stac-react";
function CollectionList() {
const { collections, state } = useCollections();
if (state === "LOADING") {
return <p>Loading collections...</p>
}
return (
<>
{collections ? (
<ul>
{collections.collections.map(({ id, title }) => (
<li key={id}>{title}</li>
))}
</ul>
<button type="button" onclick={reload}>Update collections</button>
): (
<p>No collections</p>
)}
</>
);
}
Retrieves a single collection from the STAC catalog.
import { useCollection } from "stac-react";
const { collection } = useCollection(id);
Option | Type | Description |
---|---|---|
id | string | The collection ID. |
Option | Type | Description |
---|---|---|
collection | object | The collection matching the provided ID. Is null if collection has not been retrieved. |
state | str | The status of the request. "IDLE" before and after the request is sent or received. "LOADING" when the request is in progress. |
reload | function | Callback function to trigger a reload of the collection. |
error | Error | Error information if the last request was unsuccessful. undefined if the last request was successful. |
import { useCollection } from "stac-react";
function Collection() {
const { collection, state } = useCollection("collection_id");
if (state === "LOADING") {
return <p>Loading collection...</p>
}
return (
<>
{collection ? (
<>
<h2>{collection.id}</h2>
<p>{collection.description}</p>
</>
) : (
<p>Not found</p>
)}
</>
);
}
Retrieves an item from the STAC catalog. To retrieve an item, provide its full url to the useItem
hook.
import { useItem } from "stac-react";
const { item } = useItem(url);
Option | Type | Description |
---|---|---|
url | string | The URL of the item you want to retrieve. |
Option | Type | Description |
---|---|---|
item | object | The item matching the provided URL. |
state | str | The status of the request. "IDLE" before and after the request is sent or received. "LOADING" when the request is in progress. |
reload | function | Callback function to trigger a reload of the item. |
error | Error | Error information if the last request was unsuccessful. undefined if the last request was successful. |
import { useItem } from "stac-react";
function Item() {
const { item, state } = useItem("https://stac-catalog.com/items/abc123");
if (state === "LOADING") {
return <p>Loading item...</p>
}
return (
<>
{item ? (
<>
<h2>{item.id}</h2>
<p>{items.description}</p>
</>
) : (
<p>Not found</p>
)}
</>
);
}
Executes a search against a STAC API using the provided search parameters.
import { useStacSearch } from "stac-react";
const { results } = useStacSearch();
Option | Type | Description |
---|---|---|
submit | function | Callback to submit the search using the current filter parameters. Excecutes an API call to the specified STAC API. |
ids | array<string> | List of item IDs to match in the search, undefined if unset. |
setIds(itemIds) | function | Callback to set ids . itemIds must be an array of string with the IDs of the selected items, or undefined to reset. |
bbox | array<number> | Array of coordinates [northWestLon, northWestLat, southEastLon, southEastLat] , undefined if unset. |
setBbox(bbox) | function | Callback to set bbox . bbox must be an array of coordinates [northWestLon, northWestLat, southEastLon, southEastLat] , or undefined to reset. |
collections | array<string> | List of select collection IDs included in the search query. undefined if unset. |
setCollections(collectionIDs) | function | Callback to set collections . collectionIDs must be an array of string with the IDs of the selected collections, or undefined to reset. |
dateRangeFrom | string | The from-date of the search query. undefined if unset. |
setDateRangeFrom(fromDate) | function | Callback to set dateRangeFrom . fromDate must be ISO representation of a date, ie. 2022-05-18 , or undefined to reset. |
dateRangeTo | string | The to-date of the search query. undefined if unset. |
setDateRangeTo(toDate) | function | Callback to set dateRangeto . toDate must be ISO representation of a date, ie. 2022-05-18 , or undefined to reset. |
sortby | array | Specifies the order of results. Array of `{ field: string, direction: 'asc' |
setSortby(sort) | function | Callback to set sortby . sort must be an array of `{ field: string, direction: 'asc' |
limit | number | The number of results returned per result page. |
setLimit(limit) | function | Callback to set limit . limit must be a number , or undefined to reset. |
results | object | The result of the last search query; a GeoJSON FeatureCollection with additional members. undefined if the search request has not been submitted, or if there was an error. |
state | string | The status of the request. "IDLE" before and after the request is sent or received. "LOADING" when the request is in progress. |
error | Error | Error information if the last request was unsuccessful. undefined if the last request was successful. |
nextPage | function | Callback function to load the next page of results. Is undefined if the last page is the currently loaded. |
previousPage | function | Callback function to load the previous page of results. Is undefined if the first page is the currently loaded. |
import { useStacSearch } from "stac-react";
function StacComponent() {
const { result } = useStacSearch();
return (
<>
<div class="item-list">
{results && (
<ul>
{results.features.map(({ id }) => (
<li key={id}>{ id }</li>
))}
</ul>
)}
</div>
</>
)
}
import { useCallback } from "react";
import { useStacSearch } from "stac-react";
import Map from "./map";
function StacComponent() {
const { error, result } = useStacSearch();
return (
<>
<div class="item-list">
{error && <p>{ error.detail }</p>}
{results && (
<ul>
{results.features.map(({ id }) => (
<li key={id}>{ id }</li>
))}
</ul>
)}
</div>
</>
)
}
import { useStacSearch } from "stac-react";
function StacComponent() {
const {
nextPage,
previousPage,
result
} = useStacSearch();
return (
<>
<div class="item-list">
{results && (
// render results
)}
</div>
<div class="pagination">
<button type="button" disabled={!previousPage} onClick={previousPage}>
<button type="button" disabled={!nextPage} onClick={nextPage}>
</div>
</>
)
}
import { useStacSearch } from "stac-react";
function StacComponent() {
const { collections } = useCollections();
const { collections: selectedCollections, setCollections, results, submit } = useStacSearch();
const handleChange = useCallback((event) => {
const { value } = event.target;
const nextValues = selectedCollections.includes(value)
? selectedCollections.filter((v) => v !== value)
: [ ...selectedCollections, value ];
setCollections(nextValues);
}, [selectedCollections, setCollections]);
return (
<>
<div class="query-builder">
<form onSubmit={submit}>
<fieldset>
<legend>Select collections</legend>
{collections.map(({ id, title }) => (
<input
id={id}
name="collections"
value={id}
type="checkbox"
onChange={handleChange}
checked={selectedCollections.includes(id)}
/>
<label htmlFor={id}>{title}</label>
))}
<fieldset>
<button type="submit">Search</button>
</form>
</div>
</>
)
}
import { useCallback } from "react";
import { useStacSearch } from "stac-react";
function StacComponent() {
const { bbox, setBbox, submit } = useStacSearch();
const handleDrawComplete = useCallback((feature) => {
setIsBboxDrawEnabled(false);
const { coordinates } = feature.geometry;
const bbox = [...coordinates[0][0], ...coordinates[0][2]];
setBbox(bbox);
}, [setBbox]);
<Map handleDrawComplete={handleDrawComplete} />
}
This example assumes that a Map
component handles drawing and calls handleDrawComplete
to set the bbox
for the search. handleDrawComplete
is called with a GeoJSON feature representing the bounding box drawn on the map.
import { useStacSearch } from "stac-react";
function StacComponent() {
const {
dateRangeFrom,
setDateRangeFrom,
dateRangeTo,
setDateRangeTo,
submit
} = useStacSearch();
return (
<>
<input type="date" name="date_from" onChange={setDateRangeFrom} value={dateRangeFrom} />
<input type="date" name="date_to" onChange={setDateRangeTo} value={dateRangeTo} />
<button type="button" onclick={submit}>
</>
)
}
{
detail: "Invalid bbox object"
status: 400,
statusText: "Bad Request"
}
Option | Type | Description |
---|---|---|
detail | string | `object |
status | number | HTTP status code of the response. |
statusText | string | Status text for the response. |
Run tests
yarn test
Lint
yarn lint
Build
yarn build
FAQs
React components and hooks for building STAC-API front-ends
We found that @developmentseed/stac-react demonstrated a not healthy version release cadence and project activity because the last version was released a year ago. It has 5 open source maintainers collaborating on the project.
Did you know?
Socket for GitHub automatically highlights issues in each pull request and monitors the health of all your open source dependencies. Discover the contents of your packages and block harmful activity before you install or update your dependencies.
Security News
Browserslist-rs now uses static data to reduce binary size by over 1MB, improving memory use and performance for Rust-based frontend tools.
Research
Security News
Eight new malicious Firefox extensions impersonate games, steal OAuth tokens, hijack sessions, and exploit browser permissions to spy on users.
Security News
The official Go SDK for the Model Context Protocol is in development, with a stable, production-ready release expected by August 2025.