11import type { UseFileUploadReturn } from "@chakra-ui/react" ;
2- import { useEffect , useState , type ReactNode } from "react" ;
2+ import { useEffect , useMemo , useState , type ReactNode } from "react" ;
33import type { StacItem } from "stac-ts" ;
44import { StacMapContext } from "./context" ;
55import useStacGeoparquet from "./hooks/stac-geoparquet" ;
@@ -9,14 +9,16 @@ import type { TemporalFilter } from "./types/datetime";
99export function StacMapProvider ( {
1010 href,
1111 fileUpload,
12- temporalFilter,
1312 children,
1413} : {
1514 href : string | undefined ;
1615 fileUpload : UseFileUploadReturn ;
17- temporalFilter : TemporalFilter | undefined ;
1816 children : ReactNode ;
1917} ) {
18+ const [ unlinkedItems , setUnlinkedItems ] = useState < StacItem [ ] > ( ) ;
19+ const [ picked , setPicked ] = useState < StacItem > ( ) ;
20+ const [ temporalFilter , setTemporalFilter ] = useState < TemporalFilter > ( ) ;
21+
2022 // TODO we should probably consolidate useStacValue and useStacGeoparquet into
2123 // a single hook, since they're coupled.
2224 const {
@@ -34,8 +36,10 @@ export function StacMapProvider({
3436 setId : setStacGeoparquetItemId ,
3537 item : stacGeoparquetItem ,
3638 } = useStacGeoparquet ( parquetPath , temporalFilter ) ;
37- const [ items , setItems ] = useState < StacItem [ ] > ( ) ;
38- const [ picked , setPicked ] = useState < StacItem > ( ) ;
39+
40+ const items = useMemo ( ( ) => {
41+ return unlinkedItems || linkedItems ;
42+ } , [ unlinkedItems , linkedItems ] ) ;
3943
4044 useEffect ( ( ) => {
4145 if ( value ?. title || value ?. id ) {
@@ -44,30 +48,65 @@ export function StacMapProvider({
4448 document . title = "stac-map" ;
4549 }
4650
47- setItems ( undefined ) ;
51+ setUnlinkedItems ( undefined ) ;
4852 setPicked ( undefined ) ;
4953 } , [ value ] ) ;
5054
5155 useEffect ( ( ) => {
5256 setPicked ( stacGeoparquetItem ) ;
5357 } , [ stacGeoparquetItem ] ) ;
5458
59+ const filteredItems = useMemo ( ( ) => {
60+ if ( items && temporalFilter ) {
61+ return items . filter ( ( item ) =>
62+ isItemWithinTemporalFilter ( item , temporalFilter ) ,
63+ ) ;
64+ } else {
65+ return undefined ;
66+ }
67+ } , [ items , temporalFilter ] ) ;
68+
5569 return (
5670 < StacMapContext . Provider
5771 value = { {
5872 value,
5973 collections,
60- linkedItems,
6174 items,
62- setItems,
75+ setItems : setUnlinkedItems ,
6376 picked,
6477 setPicked,
6578 stacGeoparquetTable,
6679 stacGeoparquetMetadata,
6780 setStacGeoparquetItemId,
81+ temporalFilter,
82+ setTemporalFilter,
83+ filteredItems,
6884 } }
6985 >
7086 { children }
7187 </ StacMapContext . Provider >
7288 ) ;
7389}
90+
91+ function isItemWithinTemporalFilter (
92+ item : StacItem ,
93+ temporalFilter : TemporalFilter ,
94+ ) {
95+ const start = item . properties ?. start_datetime
96+ ? new Date ( item . properties . start_datetime )
97+ : item . properties ?. datetime
98+ ? new Date ( item . properties . datetime )
99+ : null ;
100+ if ( ! start ) {
101+ return false ;
102+ }
103+ const end = item . properties ?. end_datetime
104+ ? new Date ( item . properties . end_datetime )
105+ : item . properties ?. datetime
106+ ? new Date ( item . properties . datetime )
107+ : null ;
108+ if ( ! end ) {
109+ return false ;
110+ }
111+ return start >= temporalFilter . start && end <= temporalFilter . end ;
112+ }
0 commit comments