forked from treehouse/mastodon
Adding media controller, 1 webm/compose form allowed, previews generated
parent
183a23943b
commit
bd5ad304ba
|
@ -40,8 +40,9 @@ const Status = React.createClass({
|
||||||
if (e.button === 0) {
|
if (e.button === 0) {
|
||||||
e.preventDefault();
|
e.preventDefault();
|
||||||
hashHistory.push(`/accounts/${id}`);
|
hashHistory.push(`/accounts/${id}`);
|
||||||
e.stopPropagation();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
e.stopPropagation();
|
||||||
},
|
},
|
||||||
|
|
||||||
render () {
|
render () {
|
||||||
|
|
|
@ -25,9 +25,11 @@ const UploadForm = React.createClass({
|
||||||
);
|
);
|
||||||
}.bind(this));
|
}.bind(this));
|
||||||
|
|
||||||
|
const noMoreAllowed = (this.props.media.some(m => m.get('type') === 'video')) || (this.props.media.size > 3);
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div style={{ marginBottom: '20px', padding: '10px', paddingTop: '0' }}>
|
<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' }}>
|
<div style={{ marginTop: '10px', overflow: 'hidden' }}>
|
||||||
{uploads}
|
{uploads}
|
||||||
|
|
|
@ -4,6 +4,8 @@ import ImmutablePropTypes from 'react-immutable-proptypes';
|
||||||
import { fetchStatus } from '../../actions/statuses';
|
import { fetchStatus } from '../../actions/statuses';
|
||||||
import Immutable from 'immutable';
|
import Immutable from 'immutable';
|
||||||
import EmbeddedStatus from '../../components/status';
|
import EmbeddedStatus from '../../components/status';
|
||||||
|
import { favourite, reblog } from '../../actions/interactions';
|
||||||
|
import { replyCompose } from '../../actions/compose';
|
||||||
|
|
||||||
function selectStatus(state, id) {
|
function selectStatus(state, id) {
|
||||||
let status = state.getIn(['timelines', 'statuses', 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) {
|
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 () {
|
render () {
|
||||||
|
@ -63,7 +77,7 @@ const Status = React.createClass({
|
||||||
return (
|
return (
|
||||||
<div>
|
<div>
|
||||||
{this.renderChildren(ancestors)}
|
{this.renderChildren(ancestors)}
|
||||||
<EmbeddedStatus status={status} />
|
<EmbeddedStatus status={status} onReply={this.handleReplyClick} onFavourite={this.handleFavouriteClick} onReblog={this.handleReblogClick} />
|
||||||
{this.renderChildren(descendants)}
|
{this.renderChildren(descendants)}
|
||||||
</div>
|
</div>
|
||||||
);
|
);
|
||||||
|
|
|
@ -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
|
|
@ -5,7 +5,7 @@ class MediaAttachment < ApplicationRecord
|
||||||
belongs_to :account, inverse_of: :media_attachments
|
belongs_to :account, inverse_of: :media_attachments
|
||||||
belongs_to :status, 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_content_type :file, content_type: IMAGE_MIME_TYPES + VIDEO_MIME_TYPES
|
||||||
validates_attachment_size :file, less_than: 4.megabytes
|
validates_attachment_size :file, less_than: 4.megabytes
|
||||||
|
|
||||||
|
@ -26,4 +26,8 @@ class MediaAttachment < ApplicationRecord
|
||||||
def video?
|
def video?
|
||||||
VIDEO_MIME_TYPES.include? file_content_type
|
VIDEO_MIME_TYPES.include? file_content_type
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def type
|
||||||
|
image? ? 'image' : 'video'
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -1,4 +1,5 @@
|
||||||
object @media
|
object @media
|
||||||
attribute :id
|
attribute :id, :type
|
||||||
node(:url) { |media| full_asset_url(media.file.url) }
|
node(:url) { |media| full_asset_url(media.file.url) }
|
||||||
node(:preview_url) { |media| full_asset_url(media.file.url(:small)) }
|
node(:preview_url) { |media| full_asset_url(media.file.url(:small)) }
|
||||||
|
node(:text_url) { |media| medium_url(media) }
|
||||||
|
|
|
@ -30,6 +30,7 @@ Rails.application.routes.draw do
|
||||||
end
|
end
|
||||||
|
|
||||||
resource :settings, only: [:show, :update]
|
resource :settings, only: [:show, :update]
|
||||||
|
resources :media, only: [:show]
|
||||||
|
|
||||||
namespace :api do
|
namespace :api do
|
||||||
# PubSubHubbub
|
# PubSubHubbub
|
||||||
|
|
Loading…
Reference in New Issue