@ -32,6 +32,7 @@ import {
} from '../actions/compose' ;
import { TIMELINE _DELETE } from '../actions/timelines' ;
import { STORE _HYDRATE } from '../actions/store' ;
import { REDRAFT } from '../actions/statuses' ;
import { Map as ImmutableMap , List as ImmutableList , OrderedSet as ImmutableOrderedSet , fromJS } from 'immutable' ;
import uuid from '../uuid' ;
import { me } from '../initial_state' ;
@ -170,6 +171,18 @@ const hydrate = (state, hydratedState) => {
return state ;
} ;
const domParser = new DOMParser ( ) ;
const htmlToText = status => {
const fragment = domParser . parseFromString ( status . get ( 'content' ) , 'text/html' ) . documentElement ;
status . get ( 'mentions' ) . forEach ( mention => {
fragment . querySelector ( ` a[href=" ${ mention . get ( 'url' ) } "] ` ) . textContent = ` @ ${ mention . get ( 'acct' ) } ` ;
} ) ;
return fragment . textContent ;
} ;
export default function compose ( state = initialState , action ) {
switch ( action . type ) {
case STORE _HYDRATE :
@ -301,6 +314,24 @@ export default function compose(state = initialState, action) {
return item ;
} ) ) ;
case REDRAFT :
return state . withMutations ( map => {
map . set ( 'text' , htmlToText ( action . status ) ) ;
map . set ( 'in_reply_to' , action . status . get ( 'in_reply_to_id' ) ) ;
map . set ( 'privacy' , action . status . get ( 'visibility' ) ) ;
map . set ( 'media_attachments' , action . status . get ( 'media_attachments' ) ) ;
map . set ( 'focusDate' , new Date ( ) ) ;
map . set ( 'caretPosition' , null ) ;
map . set ( 'idempotencyKey' , uuid ( ) ) ;
if ( action . status . get ( 'spoiler_text' ) . length > 0 ) {
map . set ( 'spoiler' , true ) ;
map . set ( 'spoiler_text' , action . status . get ( 'spoiler_text' ) ) ;
} else {
map . set ( 'spoiler' , false ) ;
map . set ( 'spoiler_text' , '' ) ;
}
} ) ;
default :
return state ;
}