Add better PropType validation for components

This commit is contained in:
Brett Sun 2016-02-05 11:53:33 +01:00
parent 1091e76447
commit 8ba9eb20b6
44 changed files with 170 additions and 151 deletions

View File

@ -111,13 +111,15 @@ let AccordionListItemWallet = React.createClass({
},
getLicences() {
const { content, whitelabel } = this.props;
// convert this to acl_view_licences later
if (this.props.whitelabel && this.props.whitelabel.name === 'Creative Commons France') {
if (whitelabel.name === 'Creative Commons France') {
return (
<span>
<span>, </span>
<a href={this.props.content.license_type.url} target="_blank">
{getLangText('%s license', this.props.content.license_type.code)}
<a href={content.license_type.url} target="_blank">
{getLangText('%s license', content.license_type.code)}
</a>
</span>
);

View File

@ -24,23 +24,20 @@ export default function AclButton({ action, displayName, title, tooltip }) {
propTypes: {
availableAcls: React.PropTypes.object.isRequired,
handleSuccess: React.PropTypes.func.isRequired,
pieceOrEditions: React.PropTypes.oneOfType([
React.PropTypes.object,
React.PropTypes.array
]).isRequired,
buttonAcceptName: React.PropTypes.string,
buttonAcceptClassName: React.PropTypes.string,
currentUser: React.PropTypes.object,
email: React.PropTypes.string,
pieceOrEditions: React.PropTypes.oneOfType([
React.PropTypes.object,
React.PropTypes.array
]).isRequired,
className: React.PropTypes.string
handleSuccess: React.PropTypes.func
},
sanitizeAction() {
const { buttonAcceptName } = this.props;
return buttonAcceptName || AclInformationText.titles[action];
return this.props.buttonAcceptName || AclInformationText.titles[action];
},
render() {

View File

@ -15,10 +15,12 @@ let UnConsignRequestButton = React.createClass({
propTypes: {
currentUser: React.PropTypes.object.isRequired,
edition: React.PropTypes.object.isRequired,
handleSuccess: React.PropTypes.func.isRequired
handleSuccess: React.PropTypes.func
},
render: function () {
const { currentUser, edition, handleSuccess } = this.props;
return (
<ModalWrapper
trigger={
@ -26,17 +28,18 @@ let UnConsignRequestButton = React.createClass({
REQUEST UNCONSIGN
</Button>
}
handleSuccess={this.props.handleSuccess}
handleSuccess={handleSuccess}
title='Request to Un-Consign'>
<UnConsignRequestForm
url={ApiUrls.ownership_unconsigns_request}
id={{'bitcoin_id': this.props.edition.bitcoin_id}}
id={{'bitcoin_id': edition.bitcoin_id}}
message={`${getLangText('Hi')},
${getLangText('I request you to un-consign')} \" ${this.props.edition.title} \".
${getLangText('I request you to un-consign')} \" ${edition.title} \".
${getLangText('Truly yours')},
${this.props.currentUser.username}`}/>
${currentUser.username}`
} />
</ModalWrapper>
);
}

View File

@ -26,8 +26,8 @@ let EditionContainer = React.createClass({
furtherDetailsType: React.PropTypes.func,
// Provided from AscribeApp
currentUser: React.PropTypes.object,
whitelabel: React.PropTypes.object,
currentUser: React.PropTypes.object.isRequired,
whitelabel: React.PropTypes.object.isRequired,
// Provided from router
location: React.PropTypes.object,

View File

@ -2,64 +2,68 @@
import React from 'react';
import GlobalNotificationModel from '../../models/global_notification_model';
import GlobalNotificationActions from '../../actions/global_notification_actions';
import Form from './../ascribe_forms/form';
import Property from './../ascribe_forms/property';
import InputTextAreaToggable from './../ascribe_forms/input_textarea_toggable';
import GlobalNotificationModel from '../../models/global_notification_model';
import GlobalNotificationActions from '../../actions/global_notification_actions';
import { getLangText } from '../../utils/lang_utils';
let Note = React.createClass({
propTypes: {
url: React.PropTypes.string,
id: React.PropTypes.func,
label: React.PropTypes.string,
currentUser: React.PropTypes.object,
currentUser: React.PropTypes.object.isRequired,
id: React.PropTypes.func.isRequired,
url: React.PropTypes.string.isRequired,
defaultValue: React.PropTypes.string,
editable: React.PropTypes.bool,
show: React.PropTypes.bool,
label: React.PropTypes.string,
placeholder: React.PropTypes.string,
show: React.PropTypes.bool,
successMessage: React.PropTypes.string
},
getDefaultProps() {
return {
editable: true,
show: true,
placeholder: getLangText('Enter a note'),
show: true,
successMessage: getLangText('Note saved')
};
},
showNotification(){
let notification = new GlobalNotificationModel(this.props.successMessage, 'success');
showNotification() {
const notification = new GlobalNotificationModel(this.props.successMessage, 'success');
GlobalNotificationActions.appendGlobalNotification(notification);
},
render() {
if ((!!this.props.currentUser.username && this.props.editable || !this.props.editable ) && this.props.show) {
const { currentUser, defaultValue, editable, id, label, placeholder, show, url } = this.props;
if ((!!currentUser.username && editable || !editable ) && show) {
return (
<Form
url={this.props.url}
getFormData={this.props.id}
url={url}
getFormData={id}
handleSuccess={this.showNotification}
disabled={!this.props.editable}>
disabled={!editable}>
<Property
name='note'
label={this.props.label}>
label={label}>
<InputTextAreaToggable
rows={1}
defaultValue={this.props.defaultValue}
placeholder={this.props.placeholder}/>
defaultValue={defaultValue}
placeholder={placeholder} />
</Property>
<hr />
</Form>
);
} else {
return null;
}
return null;
}
});
export default Note;
export default Note;

View File

@ -15,11 +15,12 @@ import MediaContainer from './media_container';
*/
let Piece = React.createClass({
propTypes: {
piece: React.PropTypes.object,
piece: React.PropTypes.object.isRequired,
buttons: React.PropTypes.object,
currentUser: React.PropTypes.object,
header: React.PropTypes.object,
subheader: React.PropTypes.object,
buttons: React.PropTypes.object,
children: React.PropTypes.oneOfType([
React.PropTypes.arrayOf(React.PropTypes.element),
React.PropTypes.element

View File

@ -52,7 +52,7 @@ let PieceContainer = React.createClass({
furtherDetailsType: React.PropTypes.func,
// Provided from AscribeApp
currentUser: React.PropTypes.object,
currentUser: React.PropTypes.object.isRequired,
whitelabel: React.PropTypes.object,
// Provided from router

View File

@ -20,16 +20,17 @@ import { getAclFormMessage, getAclFormDataId } from '../../utils/form_utils';
let AclFormFactory = React.createClass({
propTypes: {
action: React.PropTypes.oneOf(AppConstants.aclList).isRequired,
autoFocusProperty: React.PropTypes.string,
currentUser: React.PropTypes.object,
email: React.PropTypes.string,
message: React.PropTypes.string,
labels: React.PropTypes.object,
pieceOrEditions: React.PropTypes.oneOfType([
React.PropTypes.object,
React.PropTypes.array
]).isRequired,
autoFocusProperty: React.PropTypes.string,
currentUser: React.PropTypes.object,
email: React.PropTypes.string,
handleSuccess: React.PropTypes.func,
message: React.PropTypes.string,
labels: React.PropTypes.object,
showNotification: React.PropTypes.bool
},
@ -105,7 +106,7 @@ let AclFormFactory = React.createClass({
message={formMessage}
id={this.getFormDataId()}
url={this.isPiece() ? ApiUrls.ownership_loans_pieces
: ApiUrls.ownership_loans_editions}
: ApiUrls.ownership_loans_editions}
handleSuccess={showNotification ? this.showSuccessNotification : handleSuccess} />
);
} else if (action === 'acl_loan_request') {
@ -122,7 +123,7 @@ let AclFormFactory = React.createClass({
message={formMessage}
id={this.getFormDataId()}
url={this.isPiece() ? ApiUrls.ownership_shares_pieces
: ApiUrls.ownership_shares_editions}
: ApiUrls.ownership_shares_editions}
handleSuccess={showNotification ? this.showSuccessNotification : handleSuccess} />
);
} else {

View File

@ -15,30 +15,30 @@ import { getLangText } from '../../utils/lang_utils';
let CopyrightAssociationForm = React.createClass({
propTypes: {
currentUser: React.PropTypes.object
currentUser: React.PropTypes.object.isRequired
},
handleSubmitSuccess(){
let notification = getLangText('Copyright association updated');
notification = new GlobalNotificationModel(notification, 'success', 10000);
handleSubmitSuccess() {
const notification = new GlobalNotificationModel(getLangText('Copyright association updated'), 'success', 10000);
GlobalNotificationActions.appendGlobalNotification(notification);
},
getProfileFormData(){
return {email: this.props.currentUser.email};
getProfileFormData() {
return { email: this.props.currentUser.email };
},
render() {
let selectedState;
let selectDefaultValue = ' -- ' + getLangText('select an association') + ' -- ';
const { currentUser } = this.props;
const selectDefaultValue = ' -- ' + getLangText('select an association') + ' -- ';
if (this.props.currentUser && this.props.currentUser.profile
&& this.props.currentUser.profile.copyright_association) {
selectedState = AppConstants.copyrightAssociations.indexOf(this.props.currentUser.profile.copyright_association);
selectedState = selectedState !== -1 ? AppConstants.copyrightAssociations[selectedState] : selectDefaultValue;
let selectedState = selectDefaultValue;
if (currentUser.profile && currentUser.profile.copyright_association) {
if (AppConstants.copyrightAssociations.indexOf(currentUser.profile.copyright_association) !== -1) {
selectedState = AppConstants.copyrightAssociations[selectedState];
}
}
if (this.props.currentUser && this.props.currentUser.email){
if (currentUser.email) {
return (
<Form
ref='form'
@ -71,8 +71,9 @@ let CopyrightAssociationForm = React.createClass({
<hr />
</Form>
);
} else {
return null;
}
return null;
}
});

View File

@ -21,11 +21,12 @@ import { getLangText } from '../../utils/lang_utils.js';
let RequestActionForm = React.createClass({
propTypes: {
notifications: React.PropTypes.object.isRequired,
pieceOrEditions: React.PropTypes.oneOfType([
React.PropTypes.object,
React.PropTypes.array
]).isRequired,
notifications: React.PropTypes.object,
currentUser: React.PropTypes.object,
handleSuccess: React.PropTypes.func
},

View File

@ -18,26 +18,26 @@ import { getLangText } from '../../utils/lang_utils.js';
let TransferForm = React.createClass({
propTypes: {
url: React.PropTypes.string,
id: React.PropTypes.object,
message: React.PropTypes.string,
editions: React.PropTypes.array,
currentUser: React.PropTypes.object,
handleSuccess: React.PropTypes.func
id: React.PropTypes.object.isRequired,
url: React.PropTypes.string.isRequired,
handleSuccess: React.PropTypes.func,
message: React.PropTypes.string
},
getFormData(){
getFormData() {
return this.props.id;
},
render() {
const { handleSuccess, message, url } = this.props;
return (
<Form
ref='form'
url={this.props.url}
url={url}
getFormData={this.getFormData}
handleSuccess={this.props.handleSuccess}
handleSuccess={handleSuccess}
buttons={
<div className="modal-footer">
<p className="pull-right">
@ -70,7 +70,7 @@ let TransferForm = React.createClass({
overrideForm={true}>
<InputTextAreaToggable
rows={1}
defaultValue={this.props.message}
defaultValue={message}
placeholder={getLangText('Enter a message...')}
required />
</Property>

View File

@ -4,32 +4,35 @@ import React from 'react';
import RequestActionForm from './form_request_action';
let ListRequestActions = React.createClass({
propTypes: {
notifications: React.PropTypes.array.isRequired,
pieceOrEditions: React.PropTypes.oneOfType([
React.PropTypes.object,
React.PropTypes.array
]).isRequired,
currentUser: React.PropTypes.object,
handleSuccess: React.PropTypes.func.isRequired,
notifications: React.PropTypes.array.isRequired
handleSuccess: React.PropTypes.func
},
render () {
if (this.props.notifications &&
this.props.notifications.length > 0) {
const { currentUser, handleSuccess, notifications, pieceOrEditions } = this.props;
if (notifications.length) {
return (
<div>
{this.props.notifications.map((notification) =>
{notifications.map((notification) =>
<RequestActionForm
currentUser={this.props.currentUser}
pieceOrEditions={ this.props.pieceOrEditions }
currentUser={currentUser}
handleSuccess={handleSuccess}
notifications={notification}
handleSuccess={this.props.handleSuccess}/>)}
pieceOrEditions={pieceOrEditions} />
)}
</div>
);
} else {
return null;
}
return null;
}
});

View File

@ -6,6 +6,10 @@ import Modal from 'react-bootstrap/lib/Modal';
let ModalWrapper = React.createClass({
propTypes: {
children: React.PropTypes.oneOfType([
React.PropTypes.arrayOf(React.PropTypes.element),
React.PropTypes.element
]).isRequired,
title: React.PropTypes.oneOfType([
React.PropTypes.arrayOf(React.PropTypes.element),
React.PropTypes.element,
@ -14,11 +18,7 @@ let ModalWrapper = React.createClass({
handleCancel: React.PropTypes.func,
handleSuccess: React.PropTypes.func,
trigger: React.PropTypes.element,
children: React.PropTypes.oneOfType([
React.PropTypes.arrayOf(React.PropTypes.element),
React.PropTypes.element
])
trigger: React.PropTypes.element
},
getInitialState() {

View File

@ -34,7 +34,7 @@ export function AuthRedirect({to, when}) {
//
// So if when === 'loggedIn', we're checking if the user is logged in (and
// vice versa)
const isLoggedIn = currentUser && Object.keys(currentUser).length && currentUser.email;
const isLoggedIn = Object.keys(currentUser).length && currentUser.email;
const exprToValidate = when === 'loggedIn' ? isLoggedIn : !isLoggedIn;
// and redirect if `true`.
@ -81,7 +81,7 @@ export function ProxyHandler(...redirectFunctions) {
propTypes: {
// Provided from AscribeApp
currentUser: React.PropTypes.object,
currentUser: React.PropTypes.object.isRequired,
whitelabel: React.PropTypes.object,
// Provided from router

View File

@ -26,21 +26,23 @@ let AccountSettings = React.createClass({
whitelabel: React.PropTypes.object.isRequired
},
handleSuccess(){
handleSuccess() {
this.props.loadUser(true);
let notification = new GlobalNotificationModel(getLangText('Settings succesfully updated'), 'success', 5000);
const notification = new GlobalNotificationModel(getLangText('Settings succesfully updated'), 'success', 5000);
GlobalNotificationActions.appendGlobalNotification(notification);
},
getFormDataProfile(){
return {'email': this.props.currentUser.email};
getFormDataProfile() {
return { 'email': this.props.currentUser.email };
},
render() {
let content = <AscribeSpinner color='dark-blue' size='lg'/>;
const { currentUser, whitelabel } = this.props;
let content = <AscribeSpinner color='dark-blue' size='lg' />;
let profile = null;
if (this.props.currentUser.username) {
if (currentUser.username) {
content = (
<Form
url={ApiUrls.users_username}
@ -50,7 +52,7 @@ let AccountSettings = React.createClass({
label={getLangText('Username')}>
<input
type="text"
defaultValue={this.props.currentUser.username}
defaultValue={currentUser.username}
placeholder={getLangText('Enter your username')}
required/>
</Property>
@ -61,7 +63,7 @@ let AccountSettings = React.createClass({
editable={false}>
<input
type="text"
defaultValue={this.props.currentUser.email}
defaultValue={currentUser.email}
placeholder={getLangText('Enter your username')}
required/>
</Property>
@ -70,7 +72,7 @@ let AccountSettings = React.createClass({
);
profile = (
<AclProxy
aclObject={this.props.whitelabel}
aclObject={whitelabel}
aclName="acl_view_settings_account_hash">
<Form
url={ApiUrls.users_profile}
@ -80,7 +82,7 @@ let AccountSettings = React.createClass({
name="hash_locally"
className="ascribe-property-collapsible-toggle">
<InputCheckbox
defaultChecked={this.props.currentUser.profile.hash_locally}>
defaultChecked={currentUser.profile.hash_locally}>
<span>
{' ' + getLangText('Enable hash option, e.g. slow connections or to keep piece private')}
</span>
@ -96,9 +98,9 @@ let AccountSettings = React.createClass({
defaultExpanded={true}>
{content}
<AclProxy
aclObject={this.props.whitelabel}
aclObject={whitelabel}
aclName="acl_view_settings_copyright_association">
<CopyrightAssociationForm currentUser={this.props.currentUser}/>
<CopyrightAssociationForm currentUser={currentUser} />
</AclProxy>
{profile}
</CollapsibleParagraph>

View File

@ -24,8 +24,8 @@ import { truncateTextAtCharIndex } from '../../utils/general_utils';
let ContractSettings = React.createClass({
propTypes: {
// Provided from AscribeApp
currentUser: React.PropTypes.object,
whitelabel: React.PropTypes.object,
currentUser: React.PropTypes.object.isRequired,
whitelabel: React.PropTypes.object.isRequired,
// Provided from router
location: React.PropTypes.object

View File

@ -24,8 +24,8 @@ let SettingsContainer = React.createClass({
]),
// Provided from AscribeApp
currentUser: React.PropTypes.object,
whitelabel: React.PropTypes.object,
currentUser: React.PropTypes.object.isRequired,
whitelabel: React.PropTypes.object.isRequired,
// Provided from router
location: React.PropTypes.object
@ -40,7 +40,7 @@ let SettingsContainer = React.createClass({
setDocumentTitle(getLangText('Account settings'));
if (currentUser && currentUser.username) {
if (currentUser.username) {
return (
<div className="settings-container">
<AccountSettings

View File

@ -29,7 +29,6 @@ import { constructHead } from '../utils/dom_utils';
let Header = React.createClass({
propTypes: {
// Provided from AscribeApp
currentUser: React.PropTypes.object.isRequired,
routes: React.PropTypes.arrayOf(React.PropTypes.object).isRequired,
whitelabel: React.PropTypes.object.isRequired

View File

@ -48,8 +48,8 @@ let PieceList = React.createClass({
orderBy: React.PropTypes.string,
// Provided from AscribeApp
currentUser: React.PropTypes.object,
whitelabel: React.PropTypes.object,
currentUser: React.PropTypes.object.isRequired,
whitelabel: React.PropTypes.object.isRequired,
// Provided from router
location: React.PropTypes.object

View File

@ -31,7 +31,7 @@ let RegisterPiece = React.createClass( {
// Provided from AscribeApp
currentUser: React.PropTypes.object,
whitelabel: React.PropTypes.object,
whitelabel: React.PropTypes.object.isRequired,
// Provided from router
location: React.PropTypes.object
@ -69,7 +69,9 @@ let RegisterPiece = React.createClass( {
},
getSpecifyEditions() {
if (this.props.whitelabel && (this.props.whitelabel.acl_create_editions || Object.keys(this.props.whitelabel).length)) {
const { whitelabel } = this.props;
if (whitelabel.acl_create_editions || Object.keys(whitelabel).length) {
return (
<Property
name="num_editions"

View File

@ -32,7 +32,7 @@ const { object } = React.PropTypes;
const PRRegisterPieceForm = React.createClass({
propTypes: {
currentUser: object,
currentUser: object.isRequired,
location: object
},

View File

@ -12,7 +12,7 @@ const PRHero = React.createClass({
propTypes: {
currentUser: React.PropTypes.shape({
email: React.PropTypes.object
})
}).isRequired
},
render() {

View File

@ -18,7 +18,7 @@ const { object } = React.PropTypes;
const PRRegisterPiece = React.createClass({
propTypes: {
// Provided from PrizeApp
currentUser: React.PropTypes.object,
currentUser: React.PropTypes.object.isRequired,
whitelabel: React.PropTypes.object,
// Provided from router
@ -29,7 +29,7 @@ const PRRegisterPiece = React.createClass({
componentDidUpdate() {
const { currentUser } = this.props;
if (currentUser && currentUser.email) {
if (currentUser.email) {
const submittedPieceId = getCookie(currentUser.email);
if (submittedPieceId) {
this.history.push(`/pieces/${submittedPieceId}`);

View File

@ -28,11 +28,11 @@ let AccordionListItemPrize = React.createClass({
content: React.PropTypes.object.isRequired,
currentUser: React.PropTypes.object.isRequired,
className: React.PropTypes.string,
children: React.PropTypes.oneOfType([
React.PropTypes.arrayOf(React.PropTypes.element),
React.PropTypes.element
])
]),
className: React.PropTypes.string
},
getInitialState() {

View File

@ -53,7 +53,7 @@ let PrizePieceContainer = React.createClass({
selectedPrizeActionButton: React.PropTypes.func,
// Provided from PrizeApp
currentUser: React.PropTypes.object,
currentUser: React.PropTypes.object.isRequired,
whitelabel: React.PropTypes.object,
// Provided from router

View File

@ -18,7 +18,7 @@ import { setDocumentTitle } from '../../../../../utils/dom_utils';
let PrizePieceList = React.createClass({
propTypes: {
// Provided from PrizeApp
currentUser: React.PropTypes.object,
currentUser: React.PropTypes.object.isRequired,
whitelabel: React.PropTypes.object,
// Provided from router

View File

@ -28,7 +28,7 @@ import { setDocumentTitle } from '../../../../../utils/dom_utils';
let Settings = React.createClass({
propTypes: {
// Provided from PrizeApp
currentUser: React.PropTypes.object,
currentUser: React.PropTypes.object.isRequired,
whitelabel: React.PropTypes.object,
// Provided from router

View File

@ -16,8 +16,9 @@ import { getLangText } from '../../../../../../utils/lang_utils';
const SluiceSelectedPrizeActionButton = React.createClass({
propTypes: {
piece: React.PropTypes.object,
currentUser: React.PropTypes.object,
currentUser: React.PropTypes.object.isRequired,
piece: React.PropTypes.object.isRequired,
startLoanDate: React.PropTypes.object,
endLoanDate: React.PropTypes.object,
className: React.PropTypes.string,

View File

@ -14,7 +14,7 @@ let Vivi23Landing = React.createClass({
// Provided from PrizeApp
currentUser: React.PropTypes.object,
whitelabel: React.PropTypes.object,
whitelabel: React.PropTypes.object.isRequired,
// Provided from router
location: React.PropTypes.object

View File

@ -15,8 +15,8 @@ let WalletActionPanel = React.createClass({
propTypes: {
piece: React.PropTypes.object.isRequired,
currentUser: React.PropTypes.object.isRequired,
loadPiece: React.PropTypes.func.isRequired,
handleDeleteSuccess: React.PropTypes.func.isRequired,
loadPiece: React.PropTypes.func.isRequired,
submitButtonType: React.PropTypes.func.isRequired
},

View File

@ -23,9 +23,10 @@ let WalletPieceContainer = React.createClass({
propTypes: {
piece: React.PropTypes.object.isRequired,
currentUser: React.PropTypes.object.isRequired,
loadPiece: React.PropTypes.func.isRequired,
handleDeleteSuccess: React.PropTypes.func.isRequired,
loadPiece: React.PropTypes.func.isRequired,
submitButtonType: React.PropTypes.func.isRequired,
children: React.PropTypes.oneOfType([
React.PropTypes.object,
React.PropTypes.array

View File

@ -32,7 +32,7 @@ import { mergeOptions } from '../../../../../../utils/general_utils';
let CylandPieceContainer = React.createClass({
propTypes: {
// Provided from PrizeApp
currentUser: React.PropTypes.object,
currentUser: React.PropTypes.object.isRequired,
whitelabel: React.PropTypes.object,
// Provided from router

View File

@ -16,7 +16,7 @@ let CylandLanding = React.createClass({
propTypes: {
// Provided from PrizeApp
currentUser: React.PropTypes.object,
whitelabel: React.PropTypes.object,
whitelabel: React.PropTypes.object.isRequired,
// Provided from router
location: React.PropTypes.object
@ -30,7 +30,7 @@ let CylandLanding = React.createClass({
<div className="row">
<div className="col-xs-12">
<div className="row" style={{border: '1px solid #CCC', padding: '2em'}}>
<img src={this.props.whitelabel.logo} height="115"/>
<img src={this.props.whitelabel.logo} height="115" />
<div style={{marginTop: '1em'}}>
{getLangText('Submissions to Cyland Archive are powered by') + ' '}
<span>

View File

@ -11,8 +11,8 @@ import { setDocumentTitle } from '../../../../../utils/dom_utils';
let CylandPieceList = React.createClass({
propTypes: {
// Provided from PrizeApp
currentUser: React.PropTypes.object,
whitelabel: React.PropTypes.object,
currentUser: React.PropTypes.object.isRequired,
whitelabel: React.PropTypes.object.isRequired,
// Provided from router
location: React.PropTypes.object

View File

@ -37,8 +37,8 @@ import { getAclFormMessage } from '../../../../../utils/form_utils';
let CylandRegisterPiece = React.createClass({
propTypes: {
// Provided from PrizeApp
currentUser: React.PropTypes.object,
whitelabel: React.PropTypes.object,
currentUser: React.PropTypes.object.isRequired,
whitelabel: React.PropTypes.object.isRequired,
// Provided from router
location: React.PropTypes.object

View File

@ -24,11 +24,11 @@ let IkonotvAccordionListItem = React.createClass({
content: React.PropTypes.object.isRequired,
currentUser: React.PropTypes.object.isRequired,
className: React.PropTypes.string,
children: React.PropTypes.oneOfType([
React.PropTypes.arrayOf(React.PropTypes.element),
React.PropTypes.element
])
]),
className: React.PropTypes.string
},
getInitialState() {

View File

@ -26,8 +26,8 @@ import { setDocumentTitle } from '../../../../../utils/dom_utils';
let IkonotvContractNotifications = React.createClass({
propTypes: {
// Provided from PrizeApp
currentUser: React.PropTypes.object,
whitelabel: React.PropTypes.object,
currentUser: React.PropTypes.object.isRequired,
whitelabel: React.PropTypes.object.isRequired,
// Provided from router
location: React.PropTypes.object
@ -135,7 +135,7 @@ let IkonotvContractNotifications = React.createClass({
getCopyrightAssociationForm(){
const { currentUser } = this.props;
if (currentUser && currentUser.profile && !currentUser.profile.copyright_association) {
if (currentUser.profile && !currentUser.profile.copyright_association) {
return (
<div className='notification-contract-footer'>
<h1>{getLangText('Are you a member of any copyright societies?')}</h1>
@ -165,7 +165,7 @@ let IkonotvContractNotifications = React.createClass({
<div className='container'>
<div className='notification-contract-wrapper'>
<div className='notification-contract-logo'>
<img src={whitelabel.logo}/>
<img src={whitelabel.logo} />
<div className='notification-contract-header'>
{getLangText('Contract')}
</div>

View File

@ -13,7 +13,7 @@ import { setDocumentTitle } from '../../../../../utils/dom_utils';
let IkonotvLanding = React.createClass({
propTypes: {
// Provided from PrizeApp
currentUser: React.PropTypes.object,
currentUser: React.PropTypes.object.isRequired,
whitelabel: React.PropTypes.object,
// Provided from router
@ -24,7 +24,7 @@ let IkonotvLanding = React.createClass({
const { currentUser, location } = this.props;
let redirect = '/login';
if (currentUser && currentUser.email) {
if (currentUser.email) {
redirect = '/collection';
} else if (location.query.redirect) {
redirect = '/' + location.query.redirect;

View File

@ -15,8 +15,8 @@ import { getLangText } from '../../../../../utils/lang_utils';
let IkonotvPieceList = React.createClass({
propTypes: {
// Provided from PrizeApp
currentUser: React.PropTypes.object,
whitelabel: React.PropTypes.object,
currentUser: React.PropTypes.object.isRequired,
whitelabel: React.PropTypes.object.isRequired,
// Provided from router
location: React.PropTypes.object

View File

@ -35,8 +35,8 @@ let IkonotvRegisterPiece = React.createClass({
handleSuccess: React.PropTypes.func,
// Provided from PrizeApp
currentUser: React.PropTypes.object,
whitelabel: React.PropTypes.object,
currentUser: React.PropTypes.object.isRequired,
whitelabel: React.PropTypes.object.isRequired,
// Provided from router
location: React.PropTypes.object

View File

@ -13,7 +13,7 @@ let LumenusLanding = React.createClass({
propTypes: {
// Provided from PrizeApp
currentUser: React.PropTypes.object,
whitelabel: React.PropTypes.object,
whitelabel: React.PropTypes.object.isRequired,
// Provided from router
location: React.PropTypes.object
@ -29,7 +29,7 @@ let LumenusLanding = React.createClass({
<div className="row">
<div className="col-xs-12 wp-landing-wrapper">
<div className="row" style={{border: '1px solid #CCC', padding: '2em'}}>
<img src={this.props.whitelabel.logo} height="150"/>
<img src={this.props.whitelabel.logo} height="150" />
<div style={{marginTop: '1em'}}>
{getLangText('Artwork from the Lumenus Marketplace is powered by') + ' '}
<span>

View File

@ -24,6 +24,7 @@ let MarketSubmitButton = React.createClass({
availableAcls: React.PropTypes.object.isRequired,
currentUser: React.PropTypes.object.isRequired,
editions: React.PropTypes.array.isRequired,
whitelabel: React.PropTypes.object.isRequired,
className: React.PropTypes.string,
handleSuccess: React.PropTypes.func

View File

@ -15,8 +15,8 @@ let MarketPieceList = React.createClass({
customThumbnailPlaceholder: React.PropTypes.func,
// Provided from PrizeApp
currentUser: React.PropTypes.object,
whitelabel: React.PropTypes.object,
currentUser: React.PropTypes.object.isRequired,
whitelabel: React.PropTypes.object.isRequired,
// Provided from router
location: React.PropTypes.object

View File

@ -27,7 +27,7 @@ let MarketRegisterPiece = React.createClass({
propTypes: {
// Provided from PrizeApp
currentUser: React.PropTypes.object,
whitelabel: React.PropTypes.object,
whitelabel: React.PropTypes.object.isRequired,
// Provided from router
location: React.PropTypes.object