const setMaxPrice = ({type, action}, component) => { component.setState({ filters: { ...component.state.filters, maxPrice: parseFloat(action.maxPrice), dirty: true } }) } const setMinPrice = ({type, action}, component) => { component.setState({ filters: { ...component.state.filters, minPrice: parseFloat(action.minPrice), dirty: true } }) } 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] } } }, () => { component.refreshListings(); }); } const updateSearch = ({type, action}, component) => { console.log('updating search'); component.setState({ filters: { ...component.state.filters, dirty: false } }, () => { component.refreshListings(); }); } const handlers = { 'SET_MIN_PRICE': setMinPrice, 'SET_MAX_PRICE': setMaxPrice, '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, 'UPDATE_SEARCH': updateSearch } export const handleMessage = ({type, action}, component) => { if (!handlers[type]) { throw new `Unhandled message: ${type}`; } return handlers[type]({type, action}, component); }