From b04cb5247027fc431f7aa1704ef823ac8ce5fdd1 Mon Sep 17 00:00:00 2001 From: xavcz Date: Fri, 14 Oct 2016 08:47:18 +0200 Subject: [PATCH] currentUser is now only given via context, update README about it, add a missing import --- README.md | 21 +++++++++++++++++- .../lib/components/CustomPostsItem.jsx | 4 ++-- .../lib/categories/CategoriesEditForm.jsx | 3 --- .../lib/categories/CategoriesNewForm.jsx | 1 - .../lib/comments/CommentsEdit.jsx | 1 - .../lib/comments/CommentsItem.jsx | 5 ++--- .../lib/comments/CommentsList.jsx | 4 ++-- .../lib/comments/CommentsNew.jsx | 1 - .../lib/comments/CommentsNode.jsx | 9 +++++--- .../nova-base-components/lib/common/App.jsx | 2 +- .../lib/common/Header.jsx | 6 ++++- .../lib/common/Newsletter.jsx | 2 -- .../nova-base-components/lib/common/Vote.jsx | 5 +---- .../lib/posts/PostsCommentsThread.jsx | 6 ++++- .../lib/posts/PostsItem.jsx | 4 ++-- .../lib/posts/PostsList.jsx | 8 +------ .../lib/posts/PostsNewForm.jsx | 1 - .../lib/posts/PostsPage.jsx | 2 +- .../lib/users/UsersEdit.jsx | 2 +- .../lib/users/UsersProfileCheck.jsx | 22 +++++++++---------- packages/nova-comments/lib/methods.js | 7 ++---- packages/nova-forms/README.md | 6 ++--- packages/nova-forms/lib/NovaForm.jsx | 4 ++-- 23 files changed, 66 insertions(+), 60 deletions(-) diff --git a/README.md b/README.md index 249a000c3..763c9bf1f 100644 --- a/README.md +++ b/README.md @@ -374,7 +374,26 @@ If a component deals with a collection (`Posts`, `Comments`, etc.) its name shou For example: `PostsShare`. -The outermost HTML element within the component will have a class of the same name, but with a dash instead: `posts-share`. If possible, classes for all other elements within the component will start with the component's class: `posts-share-button`, `posts-share-divider`, etc. +The outermost HTML element within the component will have a class of the same name, but with a dash instead: `posts-share`. If possible, classes for all other elements within the component will start with the component's class: `posts-share-button`, `posts-share-divider`, etc. + +### Get current user + +The current user is given to the components via the React context. You can access it via `this.context.currentUser` (class) or `context.currentUser` (stateless-component). + +The component needs to define `currentUser` in its `contextTypes`. If `contextTypes` is not defined, then `context` will be an empty object and you won't be able to access to the current user. + +Example : +```js +const CustomHeader = (props, context) => { + // if a user is connected, show its username; else say hello + return context.currentUser ?
Hey ${context.currentUser.username}!
:
Hello!
+}; + +// if you don't define `contextTypes` for `CustomHeader`, then the `context` argument will be an empty object +CustomHeader.contextTypes = { + currentUser: React.PropTypes.object +}; +``` ## Customizing Emails diff --git a/packages/my-custom-package/lib/components/CustomPostsItem.jsx b/packages/my-custom-package/lib/components/CustomPostsItem.jsx index c32751cda..672d2fe4e 100644 --- a/packages/my-custom-package/lib/components/CustomPostsItem.jsx +++ b/packages/my-custom-package/lib/components/CustomPostsItem.jsx @@ -27,7 +27,7 @@ class CustomPostsItem extends Telescope.components.PostsItem {
- +
{post.thumbnailUrl ? : null} @@ -49,7 +49,7 @@ class CustomPostsItem extends Telescope.components.PostsItem {
- {(this.context.currentUser && this.context.currentUser.isAdmin) ?:null} + {this.context.currentUser && this.context.currentUser.isAdmin ? : null} {this.renderActions()} diff --git a/packages/nova-base-components/lib/categories/CategoriesEditForm.jsx b/packages/nova-base-components/lib/categories/CategoriesEditForm.jsx index b588df9ad..ecb453b44 100644 --- a/packages/nova-base-components/lib/categories/CategoriesEditForm.jsx +++ b/packages/nova-base-components/lib/categories/CategoriesEditForm.jsx @@ -3,8 +3,6 @@ import React, { PropTypes, Component } from 'react'; import { FormattedMessage } from 'react-intl'; import NovaForm from "meteor/nova:forms"; import { DocumentContainer } from "meteor/utilities:react-list-container"; -//import { Messages } from "meteor/nova:core"; -//import Actions from "../actions.js"; import Categories from "meteor/nova:categories"; class CategoriesEditForm extends Component{ @@ -35,7 +33,6 @@ class CategoriesEditForm extends Component{ { this.context.messages.flash("Category edited.", "success"); diff --git a/packages/nova-base-components/lib/categories/CategoriesNewForm.jsx b/packages/nova-base-components/lib/categories/CategoriesNewForm.jsx index 0b1918135..c8b496b59 100644 --- a/packages/nova-base-components/lib/categories/CategoriesNewForm.jsx +++ b/packages/nova-base-components/lib/categories/CategoriesNewForm.jsx @@ -9,7 +9,6 @@ const CategoriesNewForm = (props, context) => {
{ context.messages.flash("Category created.", "success"); diff --git a/packages/nova-base-components/lib/comments/CommentsEdit.jsx b/packages/nova-base-components/lib/comments/CommentsEdit.jsx index bae6f7e67..0436de1f5 100644 --- a/packages/nova-base-components/lib/comments/CommentsEdit.jsx +++ b/packages/nova-base-components/lib/comments/CommentsEdit.jsx @@ -10,7 +10,6 @@ class CommentsEdit extends Component { { +const CommentsList = ({results, hasMore, ready, count, totalCount, loadMore}) => { if (!!results.length) { return (
- {results.map(comment => )} + {results.map(comment => )} {hasMore ? (ready ? : ) : null}
) diff --git a/packages/nova-base-components/lib/comments/CommentsNew.jsx b/packages/nova-base-components/lib/comments/CommentsNew.jsx index 4a5346b54..e7e192e62 100644 --- a/packages/nova-base-components/lib/comments/CommentsNew.jsx +++ b/packages/nova-base-components/lib/comments/CommentsNew.jsx @@ -20,7 +20,6 @@ class CommentsNew extends Component {
+ ) } renderChildren(children) { return (
- {children.map(comment => )} + {children.map(comment => )}
) } @@ -35,7 +35,10 @@ class CommentsNode extends Component { CommentsNode.propTypes = { comment: React.PropTypes.object.isRequired, // the current comment +}; + +CommentsNode.contextTypes = { currentUser: React.PropTypes.object, // the current user -} +}; module.exports = CommentsNode; \ No newline at end of file diff --git a/packages/nova-base-components/lib/common/App.jsx b/packages/nova-base-components/lib/common/App.jsx index 1198ee751..a229fac00 100644 --- a/packages/nova-base-components/lib/common/App.jsx +++ b/packages/nova-base-components/lib/common/App.jsx @@ -30,7 +30,7 @@ class App extends Component { { this.props.ready ? - {this.props.children} + {this.props.children} : } diff --git a/packages/nova-base-components/lib/common/Header.jsx b/packages/nova-base-components/lib/common/Header.jsx index 6b28d2581..241b7942b 100644 --- a/packages/nova-base-components/lib/common/Header.jsx +++ b/packages/nova-base-components/lib/common/Header.jsx @@ -2,7 +2,7 @@ import Telescope from 'meteor/nova:lib'; import React from 'react'; //import { Messages } from "meteor/nova:core"; -const Header = ({currentUser}) => { +const Header = (props, {currentUser}) => { const logoUrl = Telescope.settings.get("logoUrl"); const siteTitle = Telescope.settings.get("title", "Nova"); @@ -37,4 +37,8 @@ const Header = ({currentUser}) => { Header.displayName = "Header"; +Header.contextTypes = { + currentUser: React.PropTypes.object, +}; + module.exports = Header; diff --git a/packages/nova-base-components/lib/common/Newsletter.jsx b/packages/nova-base-components/lib/common/Newsletter.jsx index 96da2d6b5..e9f5dfc6c 100644 --- a/packages/nova-base-components/lib/common/Newsletter.jsx +++ b/packages/nova-base-components/lib/common/Newsletter.jsx @@ -3,10 +3,8 @@ import React, { PropTypes, Component } from 'react'; import { FormattedMessage, intlShape } from 'react-intl'; import Formsy from 'formsy-react'; import { Input } from 'formsy-react-components'; -//import Actions from "../actions.js"; import { Button } from 'react-bootstrap'; import Cookie from 'react-cookie'; -//import { Messages } from "meteor/nova:core"; import Users from 'meteor/nova:users'; class Newsletter extends Component { diff --git a/packages/nova-base-components/lib/common/Vote.jsx b/packages/nova-base-components/lib/common/Vote.jsx index 998fe5cf6..751097a4b 100644 --- a/packages/nova-base-components/lib/common/Vote.jsx +++ b/packages/nova-base-components/lib/common/Vote.jsx @@ -1,7 +1,5 @@ import Telescope from 'meteor/nova:lib'; import React, { PropTypes, Component } from 'react'; -//import Actions from "../actions.js"; -//import { Messages } from "meteor/nova:core"; import classNames from 'classnames'; import Users from 'meteor/nova:users'; @@ -61,8 +59,7 @@ class Vote extends Component { Vote.propTypes = { post: React.PropTypes.object.isRequired, // the current post - // currentUser: React.PropTypes.object, // the current user -} +}; Vote.contextTypes = { currentUser: React.PropTypes.object, diff --git a/packages/nova-base-components/lib/posts/PostsCommentsThread.jsx b/packages/nova-base-components/lib/posts/PostsCommentsThread.jsx index 13f6838c4..dc95b7198 100644 --- a/packages/nova-base-components/lib/posts/PostsCommentsThread.jsx +++ b/packages/nova-base-components/lib/posts/PostsCommentsThread.jsx @@ -5,7 +5,7 @@ import { ListContainer } from "meteor/utilities:react-list-container"; import { ModalTrigger } from "meteor/nova:core"; import Comments from "meteor/nova:comments"; -const PostsCommentsThread = ({document, currentUser}) => { +const PostsCommentsThread = ({document}, {currentUser}) => { const post = document; @@ -39,5 +39,9 @@ const PostsCommentsThread = ({document, currentUser}) => { PostsCommentsThread.displayName = "PostsCommentsThread"; +PostsCommentsThread.contextTypes = { + currentUser: React.PropTypes.object +}; + module.exports = PostsCommentsThread; export default PostsCommentsThread; \ No newline at end of file diff --git a/packages/nova-base-components/lib/posts/PostsItem.jsx b/packages/nova-base-components/lib/posts/PostsItem.jsx index 0693c8852..aeaecde2a 100644 --- a/packages/nova-base-components/lib/posts/PostsItem.jsx +++ b/packages/nova-base-components/lib/posts/PostsItem.jsx @@ -47,7 +47,7 @@ class PostsItem extends Component {
- +
{post.thumbnailUrl ? : null} @@ -69,7 +69,7 @@ class PostsItem extends Component {
- {(this.context.currentUser && this.context.currentUser.isAdmin) ?:null} + {this.context.currentUser && this.context.currentUser.isAdmin ? : null} {this.renderActions()}
diff --git a/packages/nova-base-components/lib/posts/PostsList.jsx b/packages/nova-base-components/lib/posts/PostsList.jsx index 3fbc9a964..867011197 100644 --- a/packages/nova-base-components/lib/posts/PostsList.jsx +++ b/packages/nova-base-components/lib/posts/PostsList.jsx @@ -3,18 +3,12 @@ import React from 'react'; const PostsList = ({results, currentUser, hasMore, ready, count, totalCount, loadMore, showHeader = true}) => { - // console.log(results); - // console.log(ready); - // console.log(hasMore); - // console.log(totalCount); - // console.log(count); - if (!!results.length) { return (
{showHeader ? : null}
- {results.map(post => )} + {results.map(post => )}
{hasMore ? (ready ? : ) : }
diff --git a/packages/nova-base-components/lib/posts/PostsNewForm.jsx b/packages/nova-base-components/lib/posts/PostsNewForm.jsx index 8687ecf53..ede25c7c2 100644 --- a/packages/nova-base-components/lib/posts/PostsNewForm.jsx +++ b/packages/nova-base-components/lib/posts/PostsNewForm.jsx @@ -18,7 +18,6 @@ const PostsNewForm = (props, context) => {
{ context.messages.flash(context.intl.formatMessage({id: "posts.created_message"}), "success"); diff --git a/packages/nova-base-components/lib/posts/PostsPage.jsx b/packages/nova-base-components/lib/posts/PostsPage.jsx index 5a0c5b0b8..5e8fd3a51 100644 --- a/packages/nova-base-components/lib/posts/PostsPage.jsx +++ b/packages/nova-base-components/lib/posts/PostsPage.jsx @@ -18,7 +18,7 @@ const PostsPage = ({document, currentUser}) => { {/**/} - +
) diff --git a/packages/nova-base-components/lib/users/UsersEdit.jsx b/packages/nova-base-components/lib/users/UsersEdit.jsx index a1dff2eda..d8d2b2f85 100644 --- a/packages/nova-base-components/lib/users/UsersEdit.jsx +++ b/packages/nova-base-components/lib/users/UsersEdit.jsx @@ -22,7 +22,6 @@ const UsersEdit = (props, context) => {

{ +const UsersProfileCheckModal = ({show, router}, {currentUser}) => { // return fields that are required by the schema but haven't been filled out yet const schema = Users.simpleSchema()._schema; - const requiredFields = _.filter(_.keys(schema), function (fieldName) { + const requiredFields = _.filter(_.keys(schema), (fieldName) => { var field = schema[fieldName]; - return !!field.required && !Telescope.getNestedProperty(Meteor.user(), fieldName); + return !!field.required && !Telescope.getNestedProperty(currentUser, fieldName); }); return ( @@ -23,7 +23,6 @@ const UsersProfileCheckModal = ({currentUser, show, router}) => { { ) }; -class UsersProfileCheck extends Component { - render() { - const currentUser = this.context.currentUser; - return currentUser ? : null - } -} +const UsersProfileCheck = (props, {currentUser}) => { + return currentUser ? : null; +}; UsersProfileCheck.contextTypes = { currentUser: React.PropTypes.object -} +}; + +UsersProfileCheckModal.contextTypes = { + currentUser: React.PropTypes.object +}; UsersProfileCheck.displayName = "UsersProfileCheck"; diff --git a/packages/nova-comments/lib/methods.js b/packages/nova-comments/lib/methods.js index c063a17fd..255d78457 100644 --- a/packages/nova-comments/lib/methods.js +++ b/packages/nova-comments/lib/methods.js @@ -2,6 +2,7 @@ import Telescope from 'meteor/nova:lib'; import Comments from './collection.js'; import Posts from "meteor/nova:posts"; import Users from 'meteor/nova:users'; +import { Messages } from 'meteor/nova:core'; Comments.methods = {}; // ------------------------------------------------------------------------------------------- // @@ -97,7 +98,6 @@ Meteor.methods({ var user = Meteor.user(); if(Users.canEdit(user, comment)){ - // decrement post comment count and remove user ID from post Posts.update(comment.postId, { $inc: {commentCount: -1}, @@ -117,11 +117,8 @@ Meteor.methods({ htmlBody: 'Deleted', isDeleted: true }}); - - }else{ - + } else { Messages.flash("You don't have permission to delete this comment.", "error"); - } }, diff --git a/packages/nova-forms/README.md b/packages/nova-forms/README.md index 152a22f92..f70bbde24 100644 --- a/packages/nova-forms/README.md +++ b/packages/nova-forms/README.md @@ -81,7 +81,6 @@ New document form: ```jsx ``` @@ -91,9 +90,8 @@ Edit document form: ```jsx diff --git a/packages/nova-forms/lib/NovaForm.jsx b/packages/nova-forms/lib/NovaForm.jsx index 69a76c52a..8df4dbe5a 100644 --- a/packages/nova-forms/lib/NovaForm.jsx +++ b/packages/nova-forms/lib/NovaForm.jsx @@ -172,7 +172,7 @@ class NovaForm extends Component{ const fields = this.props.fields; // get all editable/insertable fields (depending on current form type) - let relevantFields = this.getFormType() === "edit" ? getEditableFields(this.getSchema(), this.props.currentUser, this.getDocument()) : getInsertableFields(this.getSchema(), this.props.currentUser); + let relevantFields = this.getFormType() === "edit" ? getEditableFields(this.getSchema(), this.context.currentUser, this.getDocument()) : getInsertableFields(this.getSchema(), this.context.currentUser); // if "fields" prop is specified, restrict list of fields to it if (typeof fields !== "undefined" && fields.length > 0) { @@ -401,7 +401,6 @@ NovaForm.propTypes = { collection: React.PropTypes.object, schema: React.PropTypes.object, document: React.PropTypes.object, // if a document is passed, this will be an edit form - currentUser: React.PropTypes.object, submitCallback: React.PropTypes.func, successCallback: React.PropTypes.func, errorCallback: React.PropTypes.func, @@ -419,6 +418,7 @@ NovaForm.defaultProps = { NovaForm.contextTypes = { closeCallback: React.PropTypes.func, + currentUser: React.PropTypes.object, intl: intlShape }