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 }