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 }