From 27b9d844b7a18168e06d272aed82674509ef0c27 Mon Sep 17 00:00:00 2001 From: 6ea86b96 <6ea86b96@gmail.com> Date: Tue, 23 May 2017 12:46:52 +0400 Subject: [PATCH] Fix navigating back through search results --- ui/js/actions/app.js | 11 ++++++++++ ui/js/actions/search.js | 34 ++++++++++++++---------------- ui/js/component/wunderbar/index.js | 5 +---- ui/js/main.js | 9 +++++--- ui/js/selectors/app.js | 6 ++++-- ui/js/util/query_params.js | 14 ++++++++++-- 6 files changed, 50 insertions(+), 29 deletions(-) diff --git a/ui/js/actions/app.js b/ui/js/actions/app.js index 347e07cc2..d7ac439a4 100644 --- a/ui/js/actions/app.js +++ b/ui/js/actions/app.js @@ -6,7 +6,12 @@ import { selectUpgradeDownloadItem, selectUpgradeFilename, selectPageTitle, + selectCurrentPage, + selectCurrentParams, } from 'selectors/app' +import { + doSearch, +} from 'actions/search' const {remote, ipcRenderer, shell} = require('electron'); const path = require('path'); @@ -47,6 +52,12 @@ export function doChangePath(path) { const state = getState() const pageTitle = selectPageTitle(state) window.document.title = pageTitle + + const currentPage = selectCurrentPage(state) + if (currentPage === 'search') { + const params = selectCurrentParams(state) + dispatch(doSearch(params.query)) + } } } diff --git a/ui/js/actions/search.js b/ui/js/actions/search.js index 8dd85d822..149aa78ea 100644 --- a/ui/js/actions/search.js +++ b/ui/js/actions/search.js @@ -31,26 +31,24 @@ export function doSearch(query) { if(page != 'search') { dispatch(doNavigate('search', { query: query })) } else { - dispatch(doHistoryPush({ query }, "Search for " + query, '/search')) - } - - lighthouse.search(query).then(results => { - results.forEach(result => { - const uri = lbryuri.build({ - channelName: result.channel_name, - contentName: result.name, - claimId: result.channel_id || result.claim_id, + lighthouse.search(query).then(results => { + results.forEach(result => { + const uri = lbryuri.build({ + channelName: result.channel_name, + contentName: result.name, + claimId: result.channel_id || result.claim_id, + }) + dispatch(doResolveUri(uri)) }) - dispatch(doResolveUri(uri)) - }) - dispatch({ - type: types.SEARCH_COMPLETED, - data: { - query, - results, - } + dispatch({ + type: types.SEARCH_COMPLETED, + data: { + query, + results, + } + }) }) - }) + } } } diff --git a/ui/js/component/wunderbar/index.js b/ui/js/component/wunderbar/index.js index 9e597220b..8cde7704c 100644 --- a/ui/js/component/wunderbar/index.js +++ b/ui/js/component/wunderbar/index.js @@ -7,9 +7,6 @@ import { selectWunderBarAddress, selectWunderBarIcon } from 'selectors/search' -import { - doSearch, -} from 'actions/search' import { doNavigate, } from 'actions/app' @@ -21,7 +18,7 @@ const select = (state) => ({ }) const perform = (dispatch) => ({ - onSearch: (query) => dispatch(doSearch(query)), + onSearch: (query) => dispatch(doNavigate('/search', { query, })), onSubmit: (query) => dispatch(doNavigate('/show', { uri: lbryuri.normalize(query) } )) }) diff --git a/ui/js/main.js b/ui/js/main.js index 8d6d1be1d..9dd2a5347 100644 --- a/ui/js/main.js +++ b/ui/js/main.js @@ -22,7 +22,9 @@ import { import { doFileList } from 'actions/file_info' -import parseQueryParams from 'util/query_params' +import { + toQueryString, +} from 'util/query_params' const {remote, ipcRenderer, shell} = require('electron'); const contextMenu = remote.require('./menu/context-menu'); @@ -37,15 +39,16 @@ window.addEventListener('contextmenu', (event) => { }); window.addEventListener('popstate', (event, param) => { - const queryString = document.location.search + const params = event.state const pathParts = document.location.pathname.split('/') const route = '/' + pathParts[pathParts.length - 1] + const queryString = toQueryString(params) let action if (route.match(/html$/)) { action = doChangePath('/discover') } else { - action = doChangePath(`${route}${queryString}`) + action = doChangePath(`${route}?${queryString}`) } app.store.dispatch(action) diff --git a/ui/js/selectors/app.js b/ui/js/selectors/app.js index 6e9638a5d..2563eb81b 100644 --- a/ui/js/selectors/app.js +++ b/ui/js/selectors/app.js @@ -1,5 +1,7 @@ import {createSelector} from 'reselect' -import parseQueryParams from 'util/query_params' +import { + parseQueryParams, +} from 'util/query_params' import lbryuri from 'lbryuri' export const _selectState = state => state.app || {} @@ -37,7 +39,7 @@ export const selectPageTitle = createSelector( (page, params) => { switch (page) { case 'search': - return 'Search' + return params.query ? `Search results for ${params.query}` : 'Search' case 'settings': return 'Settings' case 'help': diff --git a/ui/js/util/query_params.js b/ui/js/util/query_params.js index 45abc635c..5cf8b256e 100644 --- a/ui/js/util/query_params.js +++ b/ui/js/util/query_params.js @@ -1,4 +1,4 @@ -function parseQueryParams(queryString) { +export function parseQueryParams(queryString) { if (queryString === '') return {}; const parts = queryString .split('?') @@ -13,4 +13,14 @@ function parseQueryParams(queryString) { return params; } -export default parseQueryParams +export function toQueryString(params) { + if (!params) return "" + + const parts = [] + for (const key in params) { + if (params.hasOwnProperty(key) && params[key]) { + parts.push(encodeURIComponent(key) + "=" + encodeURIComponent(params[key])) + } + } + return parts.join("&") +}