forked from polka_billy/porridger
97 lines
2.6 KiB
TypeScript
97 lines
2.6 KiB
TypeScript
import useFetch from './useFetch'
|
|
import { FiltersType, filterNames } from '../../utils/filters'
|
|
import { isArrayOf, isObject } from '../../utils/types'
|
|
import { API_URL } from '../../config'
|
|
import { Category, isCategory } from '../../assets/category'
|
|
|
|
const initialAnnouncements = { list_of_announcements: [], Success: true }
|
|
|
|
type AnnouncementsListResponse = {
|
|
list_of_announcements: AnnouncementResponse[],
|
|
Success: boolean
|
|
}
|
|
|
|
const isAnnouncementsListResponse = (obj: unknown): obj is AnnouncementsListResponse => isObject(obj, {
|
|
'list_of_announcements': obj => isArrayOf<AnnouncementResponse>(obj, isAnnouncementResponse),
|
|
'Success': 'boolean'
|
|
})
|
|
|
|
type AnnouncementResponse = {
|
|
id: number,
|
|
user_id: number,
|
|
name: string,
|
|
category: Category,
|
|
best_by: number,
|
|
address: string,
|
|
longtitude: number,
|
|
latitude: number,
|
|
description: string,
|
|
src: string | null,
|
|
metro: string,
|
|
trashId: number | null,
|
|
booked_by: number
|
|
}
|
|
|
|
const isAnnouncementResponse = (obj: unknown): obj is AnnouncementResponse => isObject(obj, {
|
|
'id': 'number',
|
|
'user_id': 'number',
|
|
'name': 'string',
|
|
'category': isCategory,
|
|
'best_by': 'number',
|
|
'address': 'string',
|
|
'longtitude': 'number',
|
|
'latitude': 'number',
|
|
'description': 'string',
|
|
'src': 'string?',
|
|
'metro': 'string',
|
|
'trashId': 'number?',
|
|
'booked_by': 'number'
|
|
})
|
|
|
|
type Announcement = {
|
|
id: number,
|
|
userId: number,
|
|
name: string,
|
|
category: Category,
|
|
bestBy: number,
|
|
address: string,
|
|
lng: number,
|
|
lat: number,
|
|
description: string | null,
|
|
src: string | null,
|
|
metro: string,
|
|
trashId: number | null,
|
|
bookedBy: number
|
|
}
|
|
|
|
const composeFilters = (filters: FiltersType) => Object.fromEntries(
|
|
filterNames.map(
|
|
fName => [fName, filters[fName]?.toString()]
|
|
).filter((p): p is [string, string] => typeof p[1] !== 'undefined')
|
|
)
|
|
|
|
const useHomeAnnouncementList = (filters: FiltersType) => {
|
|
const { data, loading, error } = useFetch(
|
|
API_URL + '/announcements?' + new URLSearchParams(composeFilters(filters)).toString(),
|
|
undefined,
|
|
initialAnnouncements,
|
|
isAnnouncementsListResponse
|
|
)
|
|
|
|
const annList = data.list_of_announcements
|
|
|
|
const res: Announcement[] = annList.map(ann => ({
|
|
...ann,
|
|
lat: ann.latitude,
|
|
lng: ann.longtitude,
|
|
bestBy: ann.best_by,
|
|
bookedBy: ann.booked_by,
|
|
userId: ann.user_id
|
|
}))
|
|
|
|
return { data: error ? [] : res, loading, error }
|
|
}
|
|
|
|
export type { Announcement, AnnouncementsListResponse }
|
|
export default useHomeAnnouncementList
|