nextjs-demo

next.js demo using react 19 rc

git clone https://9o.is/git/nextjs-demo.git

useFilteredSHEvents.ts

(1332B)


      1 import { use, useEffect, useState } from "react"
      2 import { asArray, filterByProp, minByProp, pipe, sortByProp, SortType } from "../../../lib"
      3 import { SHEvent } from "./useSHEvents"
      4 
      5 export type FilteredSHEventsInput = {
      6     city?: string
      7     priceSort?: SortType
      8     cheapest?: boolean
      9 }
     10   
     11 const sortByPrice = (priceSort: FilteredSHEventsInput['priceSort']) => 
     12     (events: SHEvent[]) => priceSort ? sortByProp('price', priceSort, events) : events
     13 
     14 const filterByCity = (city: FilteredSHEventsInput['city']) => 
     15     (events: SHEvent[]) => city ? filterByProp("city", city, events) : events
     16 
     17 const filterCheapest = (cheapest: FilteredSHEventsInput['cheapest']) => 
     18     (events: SHEvent[]) => cheapest ? minByProp('price', events) : events
     19   
     20 
     21 export function useFilteredSHEvents(initialEventsPromise: Promise<SHEvent[]>) {
     22     const initialEvents = use(initialEventsPromise)
     23     const [events, setEvents] = useState<SHEvent[]>()
     24 
     25     useEffect(() => {
     26         setEvents(initialEvents)
     27     }, [initialEvents])
     28 
     29     const filterSHEvents = ({ city, priceSort, cheapest }: FilteredSHEventsInput) => {
     30         setEvents(pipe(
     31             initialEvents,
     32             filterByCity(city),
     33             sortByPrice(priceSort),
     34             filterCheapest(cheapest),
     35             asArray
     36         ))
     37     }
     38 
     39     return { events, filterSHEvents }
     40 }