react-vite-demo
react and vite demo
git clone https://9o.is/git/react-vite-demo.git
useSHEvents.ts
(725B)
1 import { useMemo } from "react"
2 import { useFetch } from "../../hooks"
3
4 export type SHEvent = {
5 id: string
6 city: string
7 price: number
8 }
9
10 type SHNodeEventId = {
11 id: string
12 }
13
14 type SHNodeEvent = SHNodeEventId & ({
15 events: SHEvent[]
16 children: []
17 } | {
18 events: []
19 children: SHNodeEvent[]
20 })
21
22 export function useSHEvents(id: SHNodeEvent['id']) {
23 const { data, ...rest } = useFetch<SHNodeEvent>(`http://localhost:3000/node-events/${id}`)
24
25 return {
26 ...rest,
27 events: useMemo(() => data ? getEvents(data) : [], [data]),
28 }
29 }
30
31 function getEvents({ events, children }: SHNodeEvent): SHEvent[] {
32 if (events.length > 0) return events
33 return children.flatMap(getEvents)
34 }