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(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