const setMinPrice = ({type, action}, component) => { component.setState({ filters: { ...component.state.filters, minPrice: parseFloat(action.minPrice) || 0 } }) } const viewListingDetails= ({type, action}, component) => { component.setState({ listingDetails: true, listingId: action.id, descriptionExpanded: false, imageIndex: 0 }) } const listingsLoaded = ({type, action}, component) => { const currentListings = new Map(); //component.state.listings; for(const listing of action.listings) { currentListings.set(listing.url, listing) } component.setState({ listings: currentListings }); } const expandDescription = ({type, action}, component) => { component.setState({ descriptionExpanded: true }); } const prevImage = ({type, action}, component) => { const index = component.state.imageIndex; if (index > 0) { component.setState({ imageIndex: index - 1 }); } } const nextImage = ({type, action}, component) => { const index = component.state.imageIndex; component.setState({ imageIndex: index + 1 }); } const viewImage = ({type, action}, component) => { component.setState({ imageIndex: action.index }); } const searchPlaceChanged = ({type, action}, component) => { component.setState({ listingDetails: false }); } const setRooms = ({type, action}, component) => { const prevRooms = (component.state.filters.rooms || {}); component.setState({ filters: { ...component.state.filters, rooms: { ...prevRooms, [action.rooms]: !prevRooms[action.rooms] } } }); } const handlers = { 'SET_MIN_PRICE': setMinPrice, 'LISTINGS_LOADED': listingsLoaded, 'EXPAND_DESCRIPTION': expandDescription, 'PREV_IMAGE': prevImage, 'NEXT_IMAGE': nextImage, 'VIEW_IMAGE': viewImage, 'SEARCH_PLACE_CHANGED': searchPlaceChanged, 'SET_ROOMS': setRooms, 'VIEW_LISTING_DETAILS': viewListingDetails } export const handleMessage = ({type, action}, component) => { if (!handlers[type]) { throw new `Unhandled message: ${type}`; } return handlers[type]({type, action}, component); }