react-vite-demo

react and vite demo

git clone https://9o.is/git/react-vite-demo.git

useFilteredSHEvents.ts

(1272B)


      1 import { 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(initialEvents: SHEvent[]) {
     22     const [events, setEvents] = useState<SHEvent[]>(initialEvents)
     23 
     24     useEffect(() => {
     25         setEvents(initialEvents)
     26     }, [initialEvents])
     27 
     28     const filterSHEvents = ({ city, priceSort, cheapest }: FilteredSHEventsInput) => {
     29         setEvents(pipe(
     30             initialEvents,
     31             filterByCity(city),
     32             sortByPrice(priceSort),
     33             filterCheapest(cheapest),
     34             asArray
     35         ))
     36     }
     37 
     38     return { events, filterSHEvents }
     39 }