@ -32,6 +32,7 @@ import {
} from 'flavours/glitch/actions/compose' ;
import { TIMELINE_DELETE } from 'flavours/glitch/actions/timelines' ;
import { STORE_HYDRATE } from 'flavours/glitch/actions/store' ;
import { REDRAFT } from 'flavours/glitch/actions/statuses' ;
import { Map as ImmutableMap , List as ImmutableList , OrderedSet as ImmutableOrderedSet , fromJS } from 'immutable' ;
import uuid from 'flavours/glitch/util/uuid' ;
import { me } from 'flavours/glitch/util/initial_state' ;
@ -226,6 +227,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 :
@ -366,6 +379,24 @@ export default function compose(state = initialState, action) {
} ) ) ;
case COMPOSE_DOODLE_SET :
return state . mergeIn ( [ 'doodle' ] , action . options ) ;
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 ;
}