Fix redirection of wallet owners

This also fixes a problem where newly created
users would be redirected to a 404 page.
This commit is contained in:
Tim Daubenschütz 2016-02-01 13:50:55 +01:00
parent f2542f99bd
commit e2a481a3f0
7 changed files with 95 additions and 21 deletions

View File

@ -36,7 +36,10 @@ let PieceList = React.createClass({
accordionListItemType: React.PropTypes.func,
bulkModalButtonListType: React.PropTypes.func,
canLoadPieceList: React.PropTypes.bool,
redirectTo: React.PropTypes.string,
redirectTo: React.PropTypes.shape({
pathname: React.PropTypes.string,
query: React.PropTypes.object
}),
shouldRedirect: React.PropTypes.func,
customSubmitButton: React.PropTypes.element,
customThumbnailPlaceholder: React.PropTypes.func,
@ -62,7 +65,10 @@ let PieceList = React.createClass({
]
}],
orderParams: ['artist_name', 'title'],
redirectTo: '/register_piece',
redirectTo: {
pathname: '/register_piece',
query: {}
},
shouldRedirect: () => true
};
},
@ -120,10 +126,16 @@ let PieceList = React.createClass({
const { location: { query }, redirectTo, shouldRedirect } = this.props;
const { unfilteredPieceListCount } = this.state;
if (redirectTo && unfilteredPieceListCount === 0 &&
if (redirectTo && redirectTo.pathname && unfilteredPieceListCount === 0 &&
(typeof shouldRedirect === 'function' && shouldRedirect(unfilteredPieceListCount))) {
// FIXME: hack to redirect out of the dispatch cycle
window.setTimeout(() => this.history.push({ query, pathname: redirectTo }), 0);
window.setTimeout(() => this.history.push({
// Occasionally, the back end also sets query parameters for Onion.
// We need to consider this by merging all passed query parameters, as we'll
// otherwise end up in a 404 screen
query: Object.assign(query, redirectTo.query),
pathname: redirectTo.pathname
}), 0);
}
},

View File

@ -62,13 +62,15 @@ let PrizePieceList = React.createClass({
},
render() {
const { is_judge: isJudge, is_jury: isJury, is_admin: isAdmin } = this.state.currentUser;
setDocumentTitle(getLangText('Collection'));
let orderParams = ['artist_name', 'title'];
if (this.state.currentUser.is_jury) {
if (isJury) {
orderParams = ['rating', 'title'];
}
if (this.state.currentUser.is_judge) {
if (isJudge) {
orderParams = ['rating', 'title', 'selected'];
}
return (
@ -80,7 +82,8 @@ let PrizePieceList = React.createClass({
orderBy={this.state.currentUser.is_jury ? 'rating' : null}
filterParams={[]}
customSubmitButton={this.getButtonSubmit()}
location={this.props.location}/>
location={this.props.location}
shouldRedirect={() => !(isJury || isJudge || isAdmin)} />
</div>
);
}

View File

@ -1,4 +1,4 @@
'use strict'
'use strict';
import React from 'react';

View File

@ -6,11 +6,14 @@ import PieceList from '../../../../piece_list';
import UserActions from '../../../../../actions/user_actions';
import UserStore from '../../../../../stores/user_store';
import WhitelabelActions from '../../../../../actions/whitelabel_actions';
import WhitelabelStore from '../../../../../stores/whitelabel_store';
import CylandAccordionListItem from './cyland_accordion_list/cyland_accordion_list_item';
import { getLangText } from '../../../../../utils/lang_utils';
import { setDocumentTitle } from '../../../../../utils/dom_utils';
import { mergeOptions } from '../../../../../utils/general_utils';
let CylandPieceList = React.createClass({
propTypes: {
@ -18,15 +21,22 @@ let CylandPieceList = React.createClass({
},
getInitialState() {
return UserStore.getState();
return mergeOptions(
UserStore.getState(),
WhitelabelStore.getState()
);
},
componentDidMount() {
UserStore.listen(this.onChange);
WhitelabelStore.listen(this.onChange);
WhitelabelActions.fetchWhitelabel();
UserActions.fetchCurrentUser();
},
componentWillUnmount() {
WhitelabelStore.unlisten(this.onChange);
UserStore.unlisten(this.onChange);
},
@ -34,13 +44,30 @@ let CylandPieceList = React.createClass({
this.setState(state);
},
shouldRedirect(pieceCount) {
const {
currentUser: { email: userEmail },
whitelabel: {
user: whitelabelAdminEmail
}
} = this.state;
return userEmail !== whitelabelAdminEmail && !pieceCount;
},
render() {
setDocumentTitle(getLangText('Collection'));
return (
<div>
<PieceList
redirectTo="/register_piece?slide_num=0"
redirectTo={{
pathname: '/register_piece',
query: {
'slide_num': 0
}
}}
shouldRedirect={this.shouldRedirect}
accordionListItemType={CylandAccordionListItem}
filterParams={[{
label: getLangText('Show works I have'),

View File

@ -6,8 +6,12 @@ import PieceList from '../../../../piece_list';
import UserActions from '../../../../../actions/user_actions';
import UserStore from '../../../../../stores/user_store';
import NotificationStore from '../../../../../stores/notification_store';
import WhitelabelActions from '../../../../../actions/whitelabel_actions';
import WhitelabelStore from '../../../../../stores/whitelabel_store';
import IkonotvAccordionListItem from './ikonotv_accordion_list/ikonotv_accordion_list_item';
import { setDocumentTitle } from '../../../../../utils/dom_utils';
@ -23,31 +27,43 @@ let IkonotvPieceList = React.createClass({
getInitialState() {
return mergeOptions(
NotificationStore.getState(),
UserStore.getState()
UserStore.getState(),
WhitelabelStore.getState()
);
},
componentDidMount() {
NotificationStore.listen(this.onChange);
WhitelabelStore.listen(this.onChange);
UserStore.listen(this.onChange);
WhitelabelActions.fetchWhitelabel();
UserActions.fetchCurrentUser();
},
componentWillUnmount() {
NotificationStore.unlisten(this.onChange);
WhitelabelStore.unlisten(this.onChange);
UserStore.unlisten(this.onChange);
},
onChange(state) {
this.setState(state);
},
redirectIfNoContractNotifications() {
const { contractAgreementListNotifications } = this.state;
shouldRedirect(pieceCount) {
const {
contractAgreementListNotifications,
currentUser: { email: userEmail },
whitelabel: {
user: whitelabelAdminEmail
}
} = this.state;
return contractAgreementListNotifications && !contractAgreementListNotifications.length;
return contractAgreementListNotifications &&
!contractAgreementListNotifications.length &&
userEmail !== whitelabelAdminEmail &&
!pieceCount;
},
render() {
@ -56,8 +72,13 @@ let IkonotvPieceList = React.createClass({
return (
<div>
<PieceList
redirectTo="/register_piece?slide_num=0"
shouldRedirect={this.redirectIfNoContractNotifications}
redirectTo={{
pathname: '/register_piece',
query: {
'slide_num': 0
}
}}
shouldRedirect={this.shouldRedirect}
accordionListItemType={IkonotvAccordionListItem}
filterParams={[{
label: getLangText('Show works I have'),

View File

@ -49,6 +49,10 @@ let MarketPieceList = React.createClass({
this.setState(state);
},
shouldRedirect(isUserAdmin) {
return (pieceCount) => !isUserAdmin && !pieceCount;
},
render() {
const { customThumbnailPlaceholder, location } = this.props;
const {
@ -59,11 +63,12 @@ let MarketPieceList = React.createClass({
} } = this.state;
let filterParams = null;
let isUserAdmin = null;
let canLoadPieceList = false;
if (userEmail && whitelabelAdminEmail) {
canLoadPieceList = true;
const isUserAdmin = userEmail === whitelabelAdminEmail;
isUserAdmin = userEmail === whitelabelAdminEmail;
filterParams = [{
label: getLangText('Show works I can'),
@ -78,7 +83,13 @@ let MarketPieceList = React.createClass({
return (
<PieceList
canLoadPieceList={canLoadPieceList}
redirectTo="/register_piece?slide_num=0"
redirectTo={{
pathname: '/register_piece',
query: {
'slide_num': 0
}
}}
shouldRedirect={this.shouldRedirect(isUserAdmin)}
bulkModalButtonListType={MarketAclButtonList}
customThumbnailPlaceholder={customThumbnailPlaceholder}
filterParams={filterParams}

View File

@ -117,7 +117,7 @@ let MarketRegisterPiece = React.createClass({
step,
whitelabel: {
name: whitelabelName = 'Market'
} } = this.state;
} } = this.state;
setDocumentTitle(getLangText('Register a new piece'));