From d4f1f981a5143663e03a1daab8105cc11b39820d Mon Sep 17 00:00:00 2001 From: JoramWilander Date: Thu, 22 Oct 2015 08:45:28 -0400 Subject: Auto-embed gifs from .gif links --- web/react/components/post.jsx | 10 +++++-- web/react/components/post_body.jsx | 49 +++++++++++++++++++++++++++++-- web/react/components/post_list.jsx | 10 ++++++- web/sass-files/sass/partials/_videos.scss | 8 +++++ 4 files changed, 72 insertions(+), 5 deletions(-) (limited to 'web') diff --git a/web/react/components/post.jsx b/web/react/components/post.jsx index bc3144dbc..dedac8951 100644 --- a/web/react/components/post.jsx +++ b/web/react/components/post.jsx @@ -120,6 +120,10 @@ export default class Post extends React.Component { var parentPost = this.props.parentPost; var posts = this.props.posts; + if (!post.props) { + post.props = {}; + } + var type = 'Post'; if (post.root_id && post.root_id.length > 0) { type = 'Comment'; @@ -140,7 +144,7 @@ export default class Post extends React.Component { } var currentUserCss = ''; - if (UserStore.getCurrentId() === post.user_id) { + if (UserStore.getCurrentId() === post.user_id && !post.props.from_webhook) { currentUserCss = 'current--user'; } @@ -200,6 +204,7 @@ export default class Post extends React.Component { posts={posts} handleCommentClick={this.handleCommentClick} retryPost={this.retryPost} + resize={this.props.resize} /> { + this.setState({gifLoaded: true}); + } + ); + } + + createGifEmbed(link) { + if (link.substring(link.length - 4) !== '.gif') { + return null; + } + + if (!this.state.gifLoaded) { + this.loadGif(link); + return null; + } + + return ( + + ); + } + handleYoutubeTime(link) { const timeRegex = /[\\?&]t=([0-9hms]+)/; @@ -247,7 +291,7 @@ export default class PostBody extends React.Component { let embed; if (filenames.length === 0 && this.state.links) { - embed = this.createYoutubeEmbed(this.state.links[0]); + embed = this.createEmbed(this.state.links[0]); } let fileAttachmentHolder = ''; @@ -287,5 +331,6 @@ PostBody.propTypes = { post: React.PropTypes.object.isRequired, parentPost: React.PropTypes.object, retryPost: React.PropTypes.func.isRequired, - handleCommentClick: React.PropTypes.func.isRequired + handleCommentClick: React.PropTypes.func.isRequired, + resize: React.PropTypes.func.isRequired }; diff --git a/web/react/components/post_list.jsx b/web/react/components/post_list.jsx index fd29a303c..3ceef478c 100644 --- a/web/react/components/post_list.jsx +++ b/web/react/components/post_list.jsx @@ -42,6 +42,7 @@ export default class PostList extends React.Component { this.deactivate = this.deactivate.bind(this); this.handleResize = this.handleResize.bind(this); this.resizePostList = this.resizePostList.bind(this); + this.updateScroll = this.updateScroll.bind(this); const state = this.getStateFromStores(props.channelId); state.numToDisplay = Constants.POST_CHUNK_SIZE; @@ -205,9 +206,10 @@ export default class PostList extends React.Component { this.scrollToBottom(); // there's a new post and - // it's by the user and not a comment + // it's by the user (and not from their webhook) and not a comment } else if (isNewPost && userId === firstPost.user_id && + !firstPost.props.from_webhook && !Utils.isComment(firstPost)) { this.scrollToBottom(true); @@ -237,6 +239,11 @@ export default class PostList extends React.Component { this.deactivate(); } } + updateScroll() { + if (!this.scrolled) { + this.scrollToBottom(); + } + } handleResize() { this.setState({ windowHeight: Utils.windowHeight() @@ -550,6 +557,7 @@ export default class PostList extends React.Component { posts={posts} hideProfilePic={hideProfilePic} isLastComment={isLastComment} + resize={this.updateScroll} /> ); diff --git a/web/sass-files/sass/partials/_videos.scss b/web/sass-files/sass/partials/_videos.scss index 6ae5b488b..f6999d15c 100644 --- a/web/sass-files/sass/partials/_videos.scss +++ b/web/sass-files/sass/partials/_videos.scss @@ -50,3 +50,11 @@ border-bottom:36px solid transparent; border-left:60px solid rgba(255,255,255,0.4); } + +.gif-div { + position:relative; + max-width: 450px; + max-height: 500px; + margin-bottom: 8px; + border-radius:5px +} -- cgit v1.2.3-1-g7c22 From 4c0e4991e76c18fd39ffadcf5b0e1943fb4cd2c3 Mon Sep 17 00:00:00 2001 From: JoramWilander Date: Fri, 23 Oct 2015 08:01:51 -0400 Subject: Make sure gif only loads once --- web/react/components/post_body.jsx | 7 +++++++ 1 file changed, 7 insertions(+) (limited to 'web') diff --git a/web/react/components/post_body.jsx b/web/react/components/post_body.jsx index 6b15682b0..45eae8c6a 100644 --- a/web/react/components/post_body.jsx +++ b/web/react/components/post_body.jsx @@ -13,6 +13,7 @@ export default class PostBody extends React.Component { super(props); this.receivedYoutubeData = false; + this.isGifLoading = false; this.parseEmojis = this.parseEmojis.bind(this); this.createEmbed = this.createEmbed.bind(this); @@ -70,6 +71,12 @@ export default class PostBody extends React.Component { } loadGif(src) { + if (this.isGifLoading) { + return; + } + + this.isGifLoading = true; + const gif = new Image(); gif.src = src; gif.onload = ( -- cgit v1.2.3-1-g7c22