[Glitch] Add support for editing for published statuses
Port front-end changes from 1060666c583670bb3b89ed5154e61038331e30c3 to glitch-soc Signed-off-by: Claire <claire.github-309c@sitedethib.com>
This commit is contained in:
		
							parent
							
								
									1af4618a06
								
							
						
					
					
						commit
						d4654dc892
					
				| @ -54,9 +54,10 @@ export function normalizeStatus(status, normalOldStatus) { | |||||||
|     normalStatus.poll = status.poll.id; |     normalStatus.poll = status.poll.id; | ||||||
|   } |   } | ||||||
| 
 | 
 | ||||||
|   // Only calculate these values when status first encountered
 |   // Only calculate these values when status first encountered and
 | ||||||
|   // Otherwise keep the ones already in the reducer
 |   // when the underlying values change. Otherwise keep the ones
 | ||||||
|   if (normalOldStatus) { |   // already in the reducer
 | ||||||
|  |   if (normalOldStatus && normalOldStatus.get('content') === normalStatus.content && normalOldStatus.get('spoiler_text') === normalStatus.spoiler_text) { | ||||||
|     normalStatus.search_index = normalOldStatus.get('search_index'); |     normalStatus.search_index = normalOldStatus.get('search_index'); | ||||||
|     normalStatus.contentHtml = normalOldStatus.get('contentHtml'); |     normalStatus.contentHtml = normalOldStatus.get('contentHtml'); | ||||||
|     normalStatus.spoilerHtml = normalOldStatus.get('spoilerHtml'); |     normalStatus.spoilerHtml = normalOldStatus.get('spoilerHtml'); | ||||||
|  | |||||||
| @ -128,6 +128,9 @@ export function deleteStatusFail(id, error) { | |||||||
|   }; |   }; | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
|  | export const updateStatus = status => dispatch => | ||||||
|  |   dispatch(importFetchedStatus(status)); | ||||||
|  | 
 | ||||||
| export function fetchContext(id) { | export function fetchContext(id) { | ||||||
|   return (dispatch, getState) => { |   return (dispatch, getState) => { | ||||||
|     dispatch(fetchContextRequest(id)); |     dispatch(fetchContextRequest(id)); | ||||||
|  | |||||||
| @ -10,6 +10,7 @@ import { | |||||||
| } from './timelines'; | } from './timelines'; | ||||||
| import { updateNotifications, expandNotifications } from './notifications'; | import { updateNotifications, expandNotifications } from './notifications'; | ||||||
| import { updateConversations } from './conversations'; | import { updateConversations } from './conversations'; | ||||||
|  | import { updateStatus } from './statuses'; | ||||||
| import { | import { | ||||||
|   fetchAnnouncements, |   fetchAnnouncements, | ||||||
|   updateAnnouncements, |   updateAnnouncements, | ||||||
| @ -75,6 +76,9 @@ export const connectTimelineStream = (timelineId, channelName, params = {}, opti | |||||||
|         case 'update': |         case 'update': | ||||||
|           dispatch(updateTimeline(timelineId, JSON.parse(data.payload), options.accept)); |           dispatch(updateTimeline(timelineId, JSON.parse(data.payload), options.accept)); | ||||||
|           break; |           break; | ||||||
|  |         case 'status.update': | ||||||
|  |           dispatch(updateStatus(JSON.parse(data.payload))); | ||||||
|  |           break; | ||||||
|         case 'delete': |         case 'delete': | ||||||
|           dispatch(deleteFromTimelines(data.payload)); |           dispatch(deleteFromTimelines(data.payload)); | ||||||
|           break; |           break; | ||||||
|  | |||||||
| @ -38,6 +38,7 @@ const messages = defineMessages({ | |||||||
|   admin_status: { id: 'status.admin_status', defaultMessage: 'Open this status in the moderation interface' }, |   admin_status: { id: 'status.admin_status', defaultMessage: 'Open this status in the moderation interface' }, | ||||||
|   copy: { id: 'status.copy', defaultMessage: 'Copy link to status' }, |   copy: { id: 'status.copy', defaultMessage: 'Copy link to status' }, | ||||||
|   hide: { id: 'status.hide', defaultMessage: 'Hide toot' }, |   hide: { id: 'status.hide', defaultMessage: 'Hide toot' }, | ||||||
|  |   edited: { id: 'status.edited', defaultMessage: 'Edited {date}' }, | ||||||
| }); | }); | ||||||
| 
 | 
 | ||||||
| export default @injectIntl | export default @injectIntl | ||||||
| @ -324,7 +325,9 @@ class StatusActionBar extends ImmutablePureComponent { | |||||||
|           </div>, |           </div>, | ||||||
|         ]} |         ]} | ||||||
| 
 | 
 | ||||||
|         <a href={status.get('url')} className='status__relative-time' target='_blank' rel='noopener'><RelativeTimestamp timestamp={status.get('created_at')} /></a> |         <a href={status.get('url')} className='status__relative-time' target='_blank' rel='noopener'> | ||||||
|  |           <RelativeTimestamp timestamp={status.get('created_at')} />{status.get('edited_at') && <abbr title={intl.formatMessage(messages.edited, { date: intl.formatDate(status.get('edited_at'), { hour12: false, year: 'numeric', month: 'short', day: '2-digit', hour: '2-digit', minute: '2-digit' }) })}> *</abbr>} | ||||||
|  |         </a> | ||||||
|       </div> |       </div> | ||||||
|     ); |     ); | ||||||
|   } |   } | ||||||
|  | |||||||
| @ -7,7 +7,7 @@ import StatusContent from 'flavours/glitch/components/status_content'; | |||||||
| import MediaGallery from 'flavours/glitch/components/media_gallery'; | import MediaGallery from 'flavours/glitch/components/media_gallery'; | ||||||
| import AttachmentList from 'flavours/glitch/components/attachment_list'; | import AttachmentList from 'flavours/glitch/components/attachment_list'; | ||||||
| import { Link } from 'react-router-dom'; | import { Link } from 'react-router-dom'; | ||||||
| import { FormattedDate } from 'react-intl'; | import { injectIntl, FormattedDate, FormattedMessage } from 'react-intl'; | ||||||
| import Card from './card'; | import Card from './card'; | ||||||
| import ImmutablePureComponent from 'react-immutable-pure-component'; | import ImmutablePureComponent from 'react-immutable-pure-component'; | ||||||
| import Video from 'flavours/glitch/features/video'; | import Video from 'flavours/glitch/features/video'; | ||||||
| @ -20,7 +20,8 @@ import Icon from 'flavours/glitch/components/icon'; | |||||||
| import AnimatedNumber from 'flavours/glitch/components/animated_number'; | import AnimatedNumber from 'flavours/glitch/components/animated_number'; | ||||||
| import PictureInPicturePlaceholder from 'flavours/glitch/components/picture_in_picture_placeholder'; | import PictureInPicturePlaceholder from 'flavours/glitch/components/picture_in_picture_placeholder'; | ||||||
| 
 | 
 | ||||||
| export default class DetailedStatus extends ImmutablePureComponent { | export default @injectIntl | ||||||
|  | class DetailedStatus extends ImmutablePureComponent { | ||||||
| 
 | 
 | ||||||
|   static contextTypes = { |   static contextTypes = { | ||||||
|     router: PropTypes.object, |     router: PropTypes.object, | ||||||
| @ -40,6 +41,7 @@ export default class DetailedStatus extends ImmutablePureComponent { | |||||||
|     showMedia: PropTypes.bool, |     showMedia: PropTypes.bool, | ||||||
|     usingPiP: PropTypes.bool, |     usingPiP: PropTypes.bool, | ||||||
|     onToggleMediaVisibility: PropTypes.func, |     onToggleMediaVisibility: PropTypes.func, | ||||||
|  |     intl: PropTypes.object.isRequired, | ||||||
|   }; |   }; | ||||||
| 
 | 
 | ||||||
|   state = { |   state = { | ||||||
| @ -111,7 +113,7 @@ export default class DetailedStatus extends ImmutablePureComponent { | |||||||
| 
 | 
 | ||||||
|   render () { |   render () { | ||||||
|     const status = (this.props.status && this.props.status.get('reblog')) ? this.props.status.get('reblog') : this.props.status; |     const status = (this.props.status && this.props.status.get('reblog')) ? this.props.status.get('reblog') : this.props.status; | ||||||
|     const { expanded, onToggleHidden, settings, usingPiP } = this.props; |     const { expanded, onToggleHidden, settings, usingPiP, intl } = this.props; | ||||||
|     const outerStyle = { boxSizing: 'border-box' }; |     const outerStyle = { boxSizing: 'border-box' }; | ||||||
|     const { compact } = this.props; |     const { compact } = this.props; | ||||||
| 
 | 
 | ||||||
| @ -125,6 +127,7 @@ export default class DetailedStatus extends ImmutablePureComponent { | |||||||
|     let reblogLink = ''; |     let reblogLink = ''; | ||||||
|     let reblogIcon = 'retweet'; |     let reblogIcon = 'retweet'; | ||||||
|     let favouriteLink = ''; |     let favouriteLink = ''; | ||||||
|  |     let edited = ''; | ||||||
| 
 | 
 | ||||||
|     if (this.props.measureHeight) { |     if (this.props.measureHeight) { | ||||||
|       outerStyle.height = `${this.state.height}px`; |       outerStyle.height = `${this.state.height}px`; | ||||||
| @ -258,6 +261,15 @@ export default class DetailedStatus extends ImmutablePureComponent { | |||||||
|       ); |       ); | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|  |     if (status.get('edited_at')) { | ||||||
|  |       edited = ( | ||||||
|  |         <React.Fragment> | ||||||
|  |           <React.Fragment> · </React.Fragment> | ||||||
|  |           <FormattedMessage id='status.edited' defaultMessage='Edited {date}' values={{ date: intl.formatDate(status.get('edited_at'), { hour12: false, month: 'short', day: '2-digit', hour: '2-digit', minute: '2-digit' }) }} /> | ||||||
|  |         </React.Fragment> | ||||||
|  |       ); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|     return ( |     return ( | ||||||
|       <div style={outerStyle}> |       <div style={outerStyle}> | ||||||
|         <div ref={this.setRef} className={classNames('detailed-status', `detailed-status-${status.get('visibility')}`, { compact })} data-status-by={status.getIn(['account', 'acct'])}> |         <div ref={this.setRef} className={classNames('detailed-status', `detailed-status-${status.get('visibility')}`, { compact })} data-status-by={status.getIn(['account', 'acct'])}> | ||||||
| @ -283,7 +295,7 @@ export default class DetailedStatus extends ImmutablePureComponent { | |||||||
|           <div className='detailed-status__meta'> |           <div className='detailed-status__meta'> | ||||||
|             <a className='detailed-status__datetime' href={status.get('url')} target='_blank' rel='noopener noreferrer'> |             <a className='detailed-status__datetime' href={status.get('url')} target='_blank' rel='noopener noreferrer'> | ||||||
|               <FormattedDate value={new Date(status.get('created_at'))} hour12={false} year='numeric' month='short' day='2-digit' hour='2-digit' minute='2-digit' /> |               <FormattedDate value={new Date(status.get('created_at'))} hour12={false} year='numeric' month='short' day='2-digit' hour='2-digit' minute='2-digit' /> | ||||||
|             </a>{visibilityLink}{applicationLink}{reblogLink} · {favouriteLink} |             </a>{edited}{visibilityLink}{applicationLink}{reblogLink} · {favouriteLink} | ||||||
|           </div> |           </div> | ||||||
|         </div> |         </div> | ||||||
|       </div> |       </div> | ||||||
|  | |||||||
| @ -205,6 +205,17 @@ | |||||||
|   } |   } | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | .status__content__edited-label { | ||||||
|  |   display: block; | ||||||
|  |   cursor: default; | ||||||
|  |   font-size: 15px; | ||||||
|  |   line-height: 20px; | ||||||
|  |   padding: 0; | ||||||
|  |   padding-top: 8px; | ||||||
|  |   color: $dark-text-color; | ||||||
|  |   font-weight: 500; | ||||||
|  | } | ||||||
|  | 
 | ||||||
| .status__content__spoiler-link { | .status__content__spoiler-link { | ||||||
|   display: inline-block; |   display: inline-block; | ||||||
|   border-radius: 2px; |   border-radius: 2px; | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user