Change author_account to be authors in REST API (#30846)
				
					
				
			This commit is contained in:
		
							parent
							
								
									6d1c1fd684
								
							
						
					
					
						commit
						096057b845
					
				| @ -76,8 +76,8 @@ export function importFetchedStatuses(statuses) { | |||||||
|         pushUnique(polls, normalizePoll(status.poll, getState().getIn(['polls', status.poll.id]))); |         pushUnique(polls, normalizePoll(status.poll, getState().getIn(['polls', status.poll.id]))); | ||||||
|       } |       } | ||||||
| 
 | 
 | ||||||
|       if (status.card?.author_account) { |       if (status.card) { | ||||||
|         pushUnique(accounts, status.card.author_account); |         status.card.authors.forEach(author => author.account && pushUnique(accounts, author.account)); | ||||||
|       } |       } | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -36,8 +36,15 @@ export function normalizeStatus(status, normalOldStatus) { | |||||||
|     normalStatus.poll = status.poll.id; |     normalStatus.poll = status.poll.id; | ||||||
|   } |   } | ||||||
| 
 | 
 | ||||||
|   if (status.card?.author_account) { |   if (status.card) { | ||||||
|     normalStatus.card = { ...status.card, author_account: status.card.author_account.id }; |     normalStatus.card = { | ||||||
|  |       ...status.card, | ||||||
|  |       authors: status.card.authors.map(author => ({ | ||||||
|  |         ...author, | ||||||
|  |         accountId: author.account?.id, | ||||||
|  |         account: undefined, | ||||||
|  |       })), | ||||||
|  |     }; | ||||||
|   } |   } | ||||||
| 
 | 
 | ||||||
|   if (status.filtered) { |   if (status.filtered) { | ||||||
|  | |||||||
| @ -51,7 +51,7 @@ export const fetchTrendingLinks = () => (dispatch) => { | |||||||
|   api() |   api() | ||||||
|     .get('/api/v1/trends/links', { params: { limit: 20 } }) |     .get('/api/v1/trends/links', { params: { limit: 20 } }) | ||||||
|     .then(({ data }) => { |     .then(({ data }) => { | ||||||
|       dispatch(importFetchedAccounts(data.map(link => link.author_account).filter(account => !!account))); |       dispatch(importFetchedAccounts(data.flatMap(link => link.authors.map(author => author.account)).filter(account => !!account))); | ||||||
|       dispatch(fetchTrendingLinksSuccess(data)); |       dispatch(fetchTrendingLinksSuccess(data)); | ||||||
|     }) |     }) | ||||||
|     .catch(err => dispatch(fetchTrendingLinksFail(err))); |     .catch(err => dispatch(fetchTrendingLinksFail(err))); | ||||||
|  | |||||||
| @ -30,6 +30,12 @@ export interface ApiMentionJSON { | |||||||
|   acct: string; |   acct: string; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | export interface ApiPreviewCardAuthorJSON { | ||||||
|  |   name: string; | ||||||
|  |   url: string; | ||||||
|  |   account?: ApiAccountJSON; | ||||||
|  | } | ||||||
|  | 
 | ||||||
| export interface ApiPreviewCardJSON { | export interface ApiPreviewCardJSON { | ||||||
|   url: string; |   url: string; | ||||||
|   title: string; |   title: string; | ||||||
| @ -48,6 +54,7 @@ export interface ApiPreviewCardJSON { | |||||||
|   embed_url: string; |   embed_url: string; | ||||||
|   blurhash: string; |   blurhash: string; | ||||||
|   published_at: string; |   published_at: string; | ||||||
|  |   authors: ApiPreviewCardAuthorJSON[]; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| export interface ApiStatusJSON { | export interface ApiStatusJSON { | ||||||
|  | |||||||
| @ -8,6 +8,10 @@ import { useAppSelector } from 'mastodon/store'; | |||||||
| export const AuthorLink = ({ accountId }) => { | export const AuthorLink = ({ accountId }) => { | ||||||
|   const account = useAppSelector(state => state.getIn(['accounts', accountId])); |   const account = useAppSelector(state => state.getIn(['accounts', accountId])); | ||||||
| 
 | 
 | ||||||
|  |   if (!account) { | ||||||
|  |     return null; | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|   return ( |   return ( | ||||||
|     <Link to={`/@${account.get('acct')}`} className='story__details__shared__author-link' data-hover-card-account={accountId}> |     <Link to={`/@${account.get('acct')}`} className='story__details__shared__author-link' data-hover-card-account={accountId}> | ||||||
|       <Avatar account={account} size={16} /> |       <Avatar account={account} size={16} /> | ||||||
|  | |||||||
| @ -75,7 +75,7 @@ class Links extends PureComponent { | |||||||
|             publisher={link.get('provider_name')} |             publisher={link.get('provider_name')} | ||||||
|             publishedAt={link.get('published_at')} |             publishedAt={link.get('published_at')} | ||||||
|             author={link.get('author_name')} |             author={link.get('author_name')} | ||||||
|             authorAccount={link.getIn(['author_account', 'id'])} |             authorAccount={link.getIn(['authors', 0, 'account', 'id'])} | ||||||
|             sharedTimes={link.getIn(['history', 0, 'accounts']) * 1 + link.getIn(['history', 1, 'accounts']) * 1} |             sharedTimes={link.getIn(['history', 0, 'accounts']) * 1 + link.getIn(['history', 1, 'accounts']) * 1} | ||||||
|             thumbnail={link.get('image')} |             thumbnail={link.get('image')} | ||||||
|             thumbnailDescription={link.get('image_description')} |             thumbnailDescription={link.get('image_description')} | ||||||
|  | |||||||
| @ -138,7 +138,7 @@ export default class Card extends PureComponent { | |||||||
|     const interactive = card.get('type') === 'video'; |     const interactive = card.get('type') === 'video'; | ||||||
|     const language    = card.get('language') || ''; |     const language    = card.get('language') || ''; | ||||||
|     const largeImage  = (card.get('image')?.length > 0 && card.get('width') > card.get('height')) || interactive; |     const largeImage  = (card.get('image')?.length > 0 && card.get('width') > card.get('height')) || interactive; | ||||||
|     const showAuthor  = !!card.get('author_account'); |     const showAuthor  = !!card.getIn(['authors', 0, 'accountId']); | ||||||
| 
 | 
 | ||||||
|     const description = ( |     const description = ( | ||||||
|       <div className='status-card__content'> |       <div className='status-card__content'> | ||||||
| @ -244,7 +244,7 @@ export default class Card extends PureComponent { | |||||||
|           {description} |           {description} | ||||||
|         </a> |         </a> | ||||||
| 
 | 
 | ||||||
|         {showAuthor && <MoreFromAuthor accountId={card.get('author_account')} />} |         {showAuthor && <MoreFromAuthor accountId={card.getIn(['authors', 0, 'accountId'])} />} | ||||||
|       </> |       </> | ||||||
|     ); |     ); | ||||||
|   } |   } | ||||||
|  | |||||||
| @ -128,6 +128,22 @@ class PreviewCard < ApplicationRecord | |||||||
|     @history ||= Trends::History.new('links', id) |     @history ||= Trends::History.new('links', id) | ||||||
|   end |   end | ||||||
| 
 | 
 | ||||||
|  |   def authors | ||||||
|  |     @authors ||= [PreviewCard::Author.new(self)] | ||||||
|  |   end | ||||||
|  | 
 | ||||||
|  |   class Author < ActiveModelSerializers::Model | ||||||
|  |     attributes :name, :url, :account | ||||||
|  | 
 | ||||||
|  |     def initialize(preview_card) | ||||||
|  |       super( | ||||||
|  |         name: preview_card.author_name, | ||||||
|  |         url: preview_card.author_url, | ||||||
|  |         account: preview_card.author_account, | ||||||
|  |       ) | ||||||
|  |     end | ||||||
|  |   end | ||||||
|  | 
 | ||||||
|   class << self |   class << self | ||||||
|     private |     private | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -1,6 +1,11 @@ | |||||||
| # frozen_string_literal: true | # frozen_string_literal: true | ||||||
| 
 | 
 | ||||||
| class REST::PreviewCardSerializer < ActiveModel::Serializer | class REST::PreviewCardSerializer < ActiveModel::Serializer | ||||||
|  |   class AuthorSerializer < ActiveModel::Serializer | ||||||
|  |     attributes :name, :url | ||||||
|  |     has_one :account, serializer: REST::AccountSerializer | ||||||
|  |   end | ||||||
|  | 
 | ||||||
|   include RoutingHelper |   include RoutingHelper | ||||||
| 
 | 
 | ||||||
|   attributes :url, :title, :description, :language, :type, |   attributes :url, :title, :description, :language, :type, | ||||||
| @ -8,7 +13,7 @@ class REST::PreviewCardSerializer < ActiveModel::Serializer | |||||||
|              :provider_url, :html, :width, :height, |              :provider_url, :html, :width, :height, | ||||||
|              :image, :image_description, :embed_url, :blurhash, :published_at |              :image, :image_description, :embed_url, :blurhash, :published_at | ||||||
| 
 | 
 | ||||||
|   has_one :author_account, serializer: REST::AccountSerializer, if: -> { object.author_account.present? } |   has_many :authors, serializer: AuthorSerializer | ||||||
| 
 | 
 | ||||||
|   def url |   def url | ||||||
|     object.original_url.presence || object.url |     object.original_url.presence || object.url | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user