about summary refs log tree commit diff
path: root/app
diff options
context:
space:
mode:
authorEugen Rochko <eugen@zeonfederated.com>2016-09-17 17:47:26 +0200
committerEugen Rochko <eugen@zeonfederated.com>2016-09-17 17:47:26 +0200
commitbd5ad304bac69b34a3c223e9baac532106db7dd8 (patch)
tree46d98c91108401e19a5065103b7c1f48db91def8 /app
parent183a23943bba2c214c56bf43c706f3f34d9bde32 (diff)
Adding media controller, 1 webm/compose form allowed, previews generated
Diffstat (limited to 'app')
-rw-r--r--app/assets/javascripts/components/components/status.jsx3
-rw-r--r--app/assets/javascripts/components/components/upload_form.jsx4
-rw-r--r--app/assets/javascripts/components/features/status/index.jsx18
-rw-r--r--app/controllers/media_controller.rb13
-rw-r--r--app/models/media_attachment.rb6
-rw-r--r--app/views/api/media/create.rabl3
6 files changed, 41 insertions, 6 deletions
diff --git a/app/assets/javascripts/components/components/status.jsx b/app/assets/javascripts/components/components/status.jsx
index 3882fc97f..8cdbd5625 100644
--- a/app/assets/javascripts/components/components/status.jsx
+++ b/app/assets/javascripts/components/components/status.jsx
@@ -40,8 +40,9 @@ const Status = React.createClass({
     if (e.button === 0) {
       e.preventDefault();
       hashHistory.push(`/accounts/${id}`);
-      e.stopPropagation();
     }
+
+    e.stopPropagation();
   },
 
   render () {
diff --git a/app/assets/javascripts/components/components/upload_form.jsx b/app/assets/javascripts/components/components/upload_form.jsx
index 429e672c0..f0b6f7992 100644
--- a/app/assets/javascripts/components/components/upload_form.jsx
+++ b/app/assets/javascripts/components/components/upload_form.jsx
@@ -25,9 +25,11 @@ const UploadForm = React.createClass({
       );
     }.bind(this));
 
+    const noMoreAllowed = (this.props.media.some(m => m.get('type') === 'video')) || (this.props.media.size > 3);
+
     return (
       <div style={{ marginBottom: '20px', padding: '10px', paddingTop: '0' }}>
-        <UploadButton onSelectFile={this.props.onSelectFile} disabled={this.props.is_uploading || this.props.media.size > 3} />
+        <UploadButton onSelectFile={this.props.onSelectFile} disabled={this.props.is_uploading || noMoreAllowed } />
 
         <div style={{ marginTop: '10px', overflow: 'hidden' }}>
           {uploads}
diff --git a/app/assets/javascripts/components/features/status/index.jsx b/app/assets/javascripts/components/features/status/index.jsx
index 122db8906..39bc2bec5 100644
--- a/app/assets/javascripts/components/features/status/index.jsx
+++ b/app/assets/javascripts/components/features/status/index.jsx
@@ -4,6 +4,8 @@ import ImmutablePropTypes       from 'react-immutable-proptypes';
 import { fetchStatus }          from '../../actions/statuses';
 import Immutable                from 'immutable';
 import EmbeddedStatus           from '../../components/status';
+import { favourite, reblog }    from '../../actions/interactions';
+import { replyCompose }         from '../../actions/compose';
 
 function selectStatus(state, id) {
   let status = state.getIn(['timelines', 'statuses', id]);
@@ -49,8 +51,20 @@ const Status = React.createClass({
     }
   },
 
+  handleFavouriteClick (status) {
+    this.props.dispatch(favourite(status));
+  },
+
+  handleReplyClick (status) {
+    this.props.dispatch(replyCompose(status));
+  },
+
+  handleReblogClick (status) {
+    this.props.dispatch(reblog(status));
+  },
+
   renderChildren (list) {
-    return list.map(s => <EmbeddedStatus status={s} key={s.get('id')} />);
+    return list.map(s => <EmbeddedStatus status={s} key={s.get('id')} onReply={this.handleReplyClick} onFavourite={this.handleFavouriteClick} onReblog={this.handleReblogClick} />);
   },
 
   render () {
@@ -63,7 +77,7 @@ const Status = React.createClass({
     return (
       <div>
         {this.renderChildren(ancestors)}
-        <EmbeddedStatus status={status} />
+        <EmbeddedStatus status={status} onReply={this.handleReplyClick} onFavourite={this.handleFavouriteClick} onReblog={this.handleReblogClick} />
         {this.renderChildren(descendants)}
       </div>
     );
diff --git a/app/controllers/media_controller.rb b/app/controllers/media_controller.rb
new file mode 100644
index 000000000..5a7b0bcbd
--- /dev/null
+++ b/app/controllers/media_controller.rb
@@ -0,0 +1,13 @@
+class MediaController < ApplicationController
+  before_action :set_media_attachment
+
+  def show
+    redirect TagManager.instance.url_for(@media_attachment.status)
+  end
+
+  private
+
+  def set_media_attachment
+    @media_attachment = MediaAttachment.where.not(status_id: nil).find(params[:id])
+  end
+end
diff --git a/app/models/media_attachment.rb b/app/models/media_attachment.rb
index 7dddfd610..73fb967c4 100644
--- a/app/models/media_attachment.rb
+++ b/app/models/media_attachment.rb
@@ -5,7 +5,7 @@ class MediaAttachment < ApplicationRecord
   belongs_to :account, inverse_of: :media_attachments
   belongs_to :status,  inverse_of: :media_attachments
 
-  has_attached_file :file, styles: lambda { |f| f.instance.image? ? { small: '510x680>' } : { small: { format: 'webm' } } }, processors: lambda { |f| f.video? ? [:transcoder] : [:thumbnail] }
+  has_attached_file :file, styles: lambda { |f| f.instance.image? ? { small: '510x680>' } : { small: { convert_options: { output: { vf: 'scale="min(510\, iw):min(680\, ih)":force_original_aspect_ratio=decrease' } }, format: 'png', time: 1 } } }, processors: lambda { |f| f.video? ? [:transcoder] : [:thumbnail] }
   validates_attachment_content_type :file, content_type: IMAGE_MIME_TYPES + VIDEO_MIME_TYPES
   validates_attachment_size :file, less_than: 4.megabytes
 
@@ -26,4 +26,8 @@ class MediaAttachment < ApplicationRecord
   def video?
     VIDEO_MIME_TYPES.include? file_content_type
   end
+
+  def type
+    image? ? 'image' : 'video'
+  end
 end
diff --git a/app/views/api/media/create.rabl b/app/views/api/media/create.rabl
index 0239aa585..803a93094 100644
--- a/app/views/api/media/create.rabl
+++ b/app/views/api/media/create.rabl
@@ -1,4 +1,5 @@
 object @media
-attribute :id
+attribute :id, :type
 node(:url) { |media| full_asset_url(media.file.url) }
 node(:preview_url) { |media| full_asset_url(media.file.url(:small)) }
+node(:text_url) { |media| medium_url(media) }