diff --git a/web/components/Main.js b/web/components/Main.js index 261e1e8..a66fa14 100644 --- a/web/components/Main.js +++ b/web/components/Main.js @@ -5,11 +5,13 @@ import ListingDetails from './ListingDetails'; import { pacSelectFirst } from '../helpers/googleMaps'; import { loadProperties, loadSeen, loadListing} from '../lib/api' import { handleMessage } from '../lib/handlers' +import Router from '../lib/router'; class Main extends React.Component { constructor(props) { super(props); - this.state = { + + const state = { listingDetails: false, listings: (new Map()), imageIndex: 0, @@ -19,7 +21,18 @@ class Main extends React.Component { rooms: {}, category: {} } - }; + } + + if (props.initialState) { + state.filters.rooms = props.initialState.rooms; + state.filters.category = props.initialState.category; + state.sort = props.initialState.sort || state.sort; + state.listingId = props.initialState.listingId; + state.listingDetails = true; + } + + this.state = state; + this.router = new Router(this); } dispatch ({type, action = {}}) { @@ -93,6 +106,22 @@ class Main extends React.Component { console.log('idle'); this.dispatch({type: 'MAP_IDLE'}); }); + + + // TODO: if state contains listingId reload + // + + if (this.state.listingId) { + + console.log("IT ISSSSS"); + loadListing(this.state.listingId).then(l => l.text()).then(l => { + console.log('listing loaded', l); + this.dispatch({type: 'VIEW_LISTING_DETAILS', action: { + id: this.state.listingId, + listing: JSON.parse(l) + }}); + }); + } } removeAllMarkers () { diff --git a/web/dist/index.html b/web/dist/index.html index bc94177..5666bf3 100644 --- a/web/dist/index.html +++ b/web/dist/index.html @@ -15,10 +15,10 @@ - - - - + diff --git a/web/index.js b/web/index.js index 29159e6..4730073 100644 --- a/web/index.js +++ b/web/index.js @@ -2,5 +2,48 @@ import React from 'react'; import {render} from 'react-dom'; import Main from './components/Main'; -render(
, document.getElementById('root')); +const getInitialState = (url) => { + console.log('PARSING URL:', url); + const params = window.location.search.substr(1).split("&"); + + const initialState = { + rooms: {}, + category: {} + } + + for(const param of params) { + const [key, value] = param.split("="); + if (key === "rooms" && value !== '') { + value.split(",").forEach(k => { + initialState.rooms[parseInt(k)] = true; + }); + } + + if (key === "category" && value !== '') { + value.split(",").forEach(k => { + initialState.category[parseInt(k)] = true; + }); + } + + if (key === "sort") { + initialState.sort = value; + } + + if (key === "bounds") { + // TODO: save bounds + initialState.bounds = value; + } + + if (key === "listingId") { + initialState.listingId = value; + } + } + + console.log('initial state dump', initialState); + return initialState; +} + +const main = (
); + +render(main, document.getElementById('root')); diff --git a/web/lib/handlers.js b/web/lib/handlers.js index 2b6f5a4..2b17ea9 100644 --- a/web/lib/handlers.js +++ b/web/lib/handlers.js @@ -59,6 +59,8 @@ const viewListingDetails = ({ type, action }, component) => { imageIndex: 0, listing: action.listing }, () => { + //window.history.pushState({}, '', `/listing/${action.id}`); + component.router.update(); markSeen(action.id); const m = component.findMarker(action.id); if (m) { diff --git a/web/lib/router.js b/web/lib/router.js new file mode 100644 index 0000000..5e4a206 --- /dev/null +++ b/web/lib/router.js @@ -0,0 +1,18 @@ +export default class Router { + constructor(comp) { + this.component = comp; + } + + update () { + // Take the state from the component and update the URL + const {listingId, sort, minPrice, maxPrice, minSize, maxSize, filters: {rooms, category}} = this.component.state; + const bounds = this.component.map.getBounds().toUrlValue(); + const params = []; + params.push(`listingId=${listingId}`); + params.push(`sort=${sort}`); + params.push(`bounds=${bounds}`); + params.push(`rooms=${Object.keys(rooms).filter(v => rooms[v]).join(",")}`); + params.push(`category=${Object.keys(category).filter(v => category[v]).join(",")}`); + window.history.pushState({}, '', `/?${params.join("&")}`); + } +}