Showing with 46 additions and 32 deletions.
  1. +19 −4 components.js
  2. +8 −3 lib/modules/components.js
  3. +7 −10 lib/modules/reducer.js
  4. +3 −3 lib/modules/shouldGoBack.js
  5. +1 −1 package.json
  6. +5 −8 reducer.js
  7. +3 −3 shouldGoBack.js
@@ -97,6 +97,10 @@ return /******/ (function(modules) { // webpackBootstrap

var T = _react2.default.PropTypes;

var isNewTabClick = function isNewTabClick(e) {
return e.metaKey || e.ctrlKey || e.button === 1 || e.button === 4;
};

// ****** Anchor

var _Anchor = exports._Anchor = function (_React$Component) {
@@ -114,6 +118,9 @@ return /******/ (function(modules) { // webpackBootstrap
}

return _ret = (_temp = (_this = _possibleConstructorReturn(this, (_Object$getPrototypeO = Object.getPrototypeOf(_Anchor)).call.apply(_Object$getPrototypeO, [this].concat(args))), _this), _this.handleClick = function (e) {
if (isNewTabClick(e)) {
return;
}
e.stopPropagation();
e.preventDefault();

@@ -179,14 +186,20 @@ return /******/ (function(modules) { // webpackBootstrap
}

return _ret2 = (_temp2 = (_this2 = _possibleConstructorReturn(this, (_Object$getPrototypeO2 = Object.getPrototypeOf(_BackAnchor)).call.apply(_Object$getPrototypeO2, [this].concat(args))), _this2), _this2.handleClick = function (e) {
if (isNewTabClick(e)) {
return;
}
e.stopPropagation();
e.preventDefault();

var urlHistory = _this2.props.urlHistory;
var _this2$props = _this2.props;
var urlHistory = _this2$props.urlHistory;
var currentIndex = _this2$props.currentIndex;

var url = _this2.props.href.split('?')[0];
var queryParams = (0, _pageUtils.extractQuery)(_this2.props.href);

if ((0, _shouldGoBack2.default)(urlHistory, url, queryParams)) {
if ((0, _shouldGoBack2.default)(urlHistory, currentIndex, url, queryParams)) {
history.back();
} else {
_this2.props.navigateToPage(url, queryParams);
@@ -201,8 +214,10 @@ return /******/ (function(modules) { // webpackBootstrap

var anchorSelector = (0, _reselect.createSelector)(function (state) {
return state.platform.history;
}, function (urlHistory) {
return { urlHistory: urlHistory };
}, function (state) {
return state.platform.currentPageIndex;
}, function (urlHistory, currentIndex) {
return { urlHistory: urlHistory, currentIndex: currentIndex };
});

var anchorDispatcher = function anchorDispatcher(dispatch) {
@@ -10,6 +10,8 @@ import shouldGoBack from './shouldGoBack';

const T = React.PropTypes;

const isNewTabClick = (e) => e.metaKey || e.ctrlKey || e.button === 1 || e.button === 4;

// ****** Anchor
export class _Anchor extends React.Component {
static propTypes = {
@@ -27,6 +29,7 @@ export class _Anchor extends React.Component {
};

handleClick = e => {
if (isNewTabClick(e)) { return; }
e.stopPropagation();
e.preventDefault();

@@ -54,14 +57,15 @@ export class _Anchor extends React.Component {

export class _BackAnchor extends _Anchor {
handleClick = e => {
if (isNewTabClick(e)) { return; }
e.stopPropagation();
e.preventDefault();

const urlHistory = this.props.urlHistory;
const { urlHistory, currentIndex } = this.props;
const url = this.props.href.split('?')[0];
const queryParams = extractQuery(this.props.href);

if (shouldGoBack(urlHistory, url, queryParams)) {
if (shouldGoBack(urlHistory, currentIndex, url, queryParams)) {
history.back();
} else {
this.props.navigateToPage(url, queryParams);
@@ -71,7 +75,8 @@ export class _BackAnchor extends _Anchor {

const anchorSelector = createSelector(
state => state.platform.history,
urlHistory => ({ urlHistory })
state => state.platform.currentPageIndex,
(urlHistory, currentIndex) => ({ urlHistory, currentIndex })
);

const anchorDispatcher = dispatch => ({
@@ -14,24 +14,21 @@ export default (state=DEFAULT, action={}) => {
const { url, urlParams, queryParams, hashParams } = action.payload;
const relevantHistory = state.history.slice(0, state.currentPageIndex + 1);

return merge(state, {
return {
...state,
currentPageIndex: state.currentPageIndex + 1,
history: [{ url, urlParams, queryParams, hashParams }],
history: relevantHistory.concat({ url, urlParams, queryParams, hashParams }),
currentPage: { url, urlParams, queryParams, hashParams },
}, {
emptyDict: 'replace',
array: 'concat',
});
};
}
case actions.GOTO_PAGE_INDEX: {
const { pageIndex } = action.payload;

return merge(state, {
return {
...state,
currentPageIndex: pageIndex,
currentPage: state.history[pageIndex],
}, {
emptyDict: 'replace',
});
};
}
case actions.SET_SHELL: {
return merge(state, {
@@ -1,11 +1,11 @@
import { isEqual } from 'lodash/lang';

export default function shouldGoBack(urlHistory, url, queryParams) {
export default function shouldGoBack(urlHistory, currentIndex, url, queryParams) {
const existsHistoryAPI = (typeof history !== 'undefined') && history.back && history.state;
const existsUrlHistory = urlHistory && urlHistory.length > 1;
const existsUrlHistory = urlHistory && urlHistory.length > 1 && urlHistory.length > currentIndex;

if (existsHistoryAPI && existsUrlHistory) {
const prevHist = urlHistory[urlHistory.length - 2];
const prevHist = urlHistory[currentIndex - 1];

if (isEqual(prevHist.url, url) && isEqual(prevHist.queryParams, queryParams)) {
return true;
@@ -1,6 +1,6 @@
{
"name": "@r/platform",
"version": "0.4.0",
"version": "0.4.1",
"description": "A set of tools to enable easy universal rendering and page navigation on a React + Redux stack",
"main": "platform.js",
"scripts": {
@@ -61,6 +61,8 @@ return /******/ (function(modules) { // webpackBootstrap
value: true
});

var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };

var _merge = __webpack_require__(317);

var _merge2 = _interopRequireDefault(_merge);
@@ -95,25 +97,20 @@ return /******/ (function(modules) { // webpackBootstrap

var relevantHistory = state.history.slice(0, state.currentPageIndex + 1);

return (0, _merge2.default)(state, {
return _extends({}, state, {
currentPageIndex: state.currentPageIndex + 1,
history: [{ url: url, urlParams: urlParams, queryParams: queryParams, hashParams: hashParams }],
history: relevantHistory.concat({ url: url, urlParams: urlParams, queryParams: queryParams, hashParams: hashParams }),
currentPage: { url: url, urlParams: urlParams, queryParams: queryParams, hashParams: hashParams }
}, {
emptyDict: 'replace',
array: 'concat'
});
}
case actions.GOTO_PAGE_INDEX:
{
var pageIndex = action.payload.pageIndex;


return (0, _merge2.default)(state, {
return _extends({}, state, {
currentPageIndex: pageIndex,
currentPage: state.history[pageIndex]
}, {
emptyDict: 'replace'
});
}
case actions.SET_SHELL:
@@ -64,12 +64,12 @@ return /******/ (function(modules) { // webpackBootstrap

var _lang = __webpack_require__(13);

function shouldGoBack(urlHistory, url, queryParams) {
function shouldGoBack(urlHistory, currentIndex, url, queryParams) {
var existsHistoryAPI = typeof history !== 'undefined' && history.back && history.state;
var existsUrlHistory = urlHistory && urlHistory.length > 1;
var existsUrlHistory = urlHistory && urlHistory.length > 1 && urlHistory.length > currentIndex;

if (existsHistoryAPI && existsUrlHistory) {
var prevHist = urlHistory[urlHistory.length - 2];
var prevHist = urlHistory[currentIndex - 1];

if ((0, _lang.isEqual)(prevHist.url, url) && (0, _lang.isEqual)(prevHist.queryParams, queryParams)) {
return true;