123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112 |
- # frozen_string_literal: true
- module MediaComponentHelper
- def render_video_component(status, **options)
- video = status.ordered_media_attachments.first
- meta = video.file.meta || {}
- component_params = {
- sensitive: sensitive_viewer?(status, current_account),
- src: full_asset_url(video.file.url(:original)),
- preview: full_asset_url(video.thumbnail.present? ? video.thumbnail.url : video.file.url(:small)),
- alt: video.description,
- blurhash: video.blurhash,
- frameRate: meta.dig('original', 'frame_rate'),
- inline: true,
- aspectRatio: "#{meta.dig('original', 'width')} / #{meta.dig('original', 'height')}",
- media: [
- serialize_media_attachment(video),
- ].as_json,
- }.merge(**options)
- react_component :video, component_params do
- render partial: 'statuses/attachment_list', locals: { attachments: status.ordered_media_attachments }
- end
- end
- def render_audio_component(status, **options)
- audio = status.ordered_media_attachments.first
- meta = audio.file.meta || {}
- component_params = {
- src: full_asset_url(audio.file.url(:original)),
- poster: full_asset_url(audio.thumbnail.present? ? audio.thumbnail.url : status.account.avatar_static_url),
- alt: audio.description,
- backgroundColor: meta.dig('colors', 'background'),
- foregroundColor: meta.dig('colors', 'foreground'),
- accentColor: meta.dig('colors', 'accent'),
- duration: meta.dig('original', 'duration'),
- }.merge(**options)
- react_component :audio, component_params do
- render partial: 'statuses/attachment_list', locals: { attachments: status.ordered_media_attachments }
- end
- end
- def render_media_gallery_component(status, **options)
- component_params = {
- sensitive: sensitive_viewer?(status, current_account),
- autoplay: prefers_autoplay?,
- media: status.ordered_media_attachments.map { |a| serialize_media_attachment(a).as_json },
- }.merge(**options)
- react_component :media_gallery, component_params do
- render partial: 'statuses/attachment_list', locals: { attachments: status.ordered_media_attachments }
- end
- end
- def render_card_component(status, **options)
- component_params = {
- sensitive: sensitive_viewer?(status, current_account),
- card: serialize_status_card(status).as_json,
- }.merge(**options)
- react_component :card, component_params
- end
- def render_poll_component(status, **options)
- component_params = {
- disabled: true,
- poll: serialize_status_poll(status).as_json,
- }.merge(**options)
- react_component :poll, component_params do
- render partial: 'statuses/poll', locals: { status: status, poll: status.preloadable_poll, autoplay: prefers_autoplay? }
- end
- end
- private
- def serialize_media_attachment(attachment)
- ActiveModelSerializers::SerializableResource.new(
- attachment,
- serializer: REST::MediaAttachmentSerializer
- )
- end
- def serialize_status_card(status)
- ActiveModelSerializers::SerializableResource.new(
- status.preview_card,
- serializer: REST::PreviewCardSerializer
- )
- end
- def serialize_status_poll(status)
- ActiveModelSerializers::SerializableResource.new(
- status.preloadable_poll,
- serializer: REST::PollSerializer,
- scope: current_user,
- scope_name: :current_user
- )
- end
- def sensitive_viewer?(status, account)
- if !account.nil? && account.id == status.account_id
- status.sensitive
- else
- status.account.sensitized? || status.sensitive
- end
- end
- end
|