@ -17,6 +17,8 @@ import {
COMPOSE_SUGGESTIONS_READY ,
COMPOSE_SUGGESTION_SELECT ,
COMPOSE_SENSITIVITY_CHANGE ,
COMPOSE_SPOILERNESS_CHANGE ,
COMPOSE_SPOILER_TEXT_CHANGE ,
COMPOSE_VISIBILITY_CHANGE ,
COMPOSE_LISTABILITY_CHANGE
} from '../actions/compose' ;
@ -27,6 +29,8 @@ import Immutable from 'immutable';
const initialState = Immutable . Map ( {
mounted : false ,
sensitive : false ,
spoiler : false ,
spoiler_text : '' ,
unlisted : false ,
private : false ,
text : '' ,
@ -56,6 +60,8 @@ function statusToTextMentions(state, status) {
function clearAll ( state ) {
return state . withMutations ( map => {
map . set ( 'text' , '' ) ;
map . set ( 'spoiler' , false ) ;
map . set ( 'spoiler_text' , '' ) ;
map . set ( 'is_submitting' , false ) ;
map . set ( 'in_reply_to' , null ) ;
map . update ( 'media_attachments' , list => list . clear ( ) ) ;
@ -90,64 +96,68 @@ const insertSuggestion = (state, position, token, completion) => {
export default function compose ( state = initialState , action ) {
switch ( action . type ) {
case STORE_HYDRATE :
return state . merge ( action . state . get ( 'compose' ) ) ;
case COMPOSE_MOUNT :
return state . set ( 'mounted' , true ) ;
case COMPOSE_UNMOUNT :
return state . set ( 'mounted' , false ) ;
case COMPOSE_SENSITIVITY_CHANGE :
return state . set ( 'sensitive' , action . checked ) ;
case COMPOSE_VISIBILITY_CHANGE :
return state . set ( 'private' , action . checked ) ;
case COMPOSE_LISTABILITY_CHANGE :
return state . set ( 'unlisted' , action . checked ) ;
case COMPOSE_CHANGE :
return state . set ( 'text' , action . text ) ;
case COMPOSE_REPLY :
return state . withMutations ( map => {
map . set ( 'in_reply_to' , action . status . get ( 'id' ) ) ;
map . set ( 'text' , statusToTextMentions ( state , action . status ) ) ;
} ) ;
case COMPOSE_REPLY_CANCEL :
return state . withMutations ( map => {
map . set ( 'in_reply_to' , null ) ;
map . set ( 'text' , '' ) ;
} ) ;
case COMPOSE_SUBMIT_REQUEST :
return state . set ( 'is_submitting' , true ) ;
case COMPOSE_SUBMIT_SUCCESS :
return clearAll ( state ) ;
case COMPOSE_SUBMIT_FAIL :
return state . set ( 'is_submitting' , false ) ;
case COMPOSE_UPLOAD_REQUEST :
return state . withMutations ( map => {
map . set ( 'is_uploading' , true ) ;
map . set ( 'fileDropDate' , new Date ( ) ) ;
} ) ;
case COMPOSE_UPLOAD_SUCCESS :
return appendMedia ( state , Immutable . fromJS ( action . media ) ) ;
case COMPOSE_UPLOAD_FAIL :
return state . set ( 'is_uploading' , false ) ;
case COMPOSE_UPLOAD_UNDO :
return removeMedia ( state , action . media_id ) ;
case COMPOSE_UPLOAD_PROGRESS :
return state . set ( 'progress' , Math . round ( ( action . loaded / action . total ) * 100 ) ) ;
case COMPOSE_MENTION :
return state . update ( 'text' , text => ` ${ text } @ ${ action . account . get ( 'acct' ) } ` ) ;
case COMPOSE_SUGGESTIONS_CLEAR :
return state . update ( 'suggestions' , Immutable . List ( ) , list => list . clear ( ) ) . set ( 'suggestion_token' , null ) ;
case COMPOSE_SUGGESTIONS_READY :
return state . set ( 'suggestions' , Immutable . List ( action . accounts . map ( item => item . id ) ) ) . set ( 'suggestion_token' , action . token ) ;
case COMPOSE_SUGGESTION_SELECT :
return insertSuggestion ( state , action . position , action . token , action . completion ) ;
case TIMELINE_DELETE :
if ( action . id === state . get ( 'in_reply_to' ) ) {
return state . set ( 'in_reply_to' , null ) ;
} else {
return state ;
}
default :
case STORE_HYDRATE :
return state . merge ( action . state . get ( 'compose' ) ) ;
case COMPOSE_MOUNT :
return state . set ( 'mounted' , true ) ;
case COMPOSE_UNMOUNT :
return state . set ( 'mounted' , false ) ;
case COMPOSE_SENSITIVITY_CHANGE :
return state . set ( 'sensitive' , action . checked ) ;
case COMPOSE_SPOILERNESS_CHANGE :
return ( action . checked ? state : state . set ( 'spoiler_text' , '' ) ) . set ( 'spoiler' , action . checked ) ;
case COMPOSE_SPOILER_TEXT_CHANGE :
return state . set ( 'spoiler_text' , action . text ) ;
case COMPOSE_VISIBILITY_CHANGE :
return state . set ( 'private' , action . checked ) ;
case COMPOSE_LISTABILITY_CHANGE :
return state . set ( 'unlisted' , action . checked ) ;
case COMPOSE_CHANGE :
return state . set ( 'text' , action . text ) ;
case COMPOSE_REPLY :
return state . withMutations ( map => {
map . set ( 'in_reply_to' , action . status . get ( 'id' ) ) ;
map . set ( 'text' , statusToTextMentions ( state , action . status ) ) ;
} ) ;
case COMPOSE_REPLY_CANCEL :
return state . withMutations ( map => {
map . set ( 'in_reply_to' , null ) ;
map . set ( 'text' , '' ) ;
} ) ;
case COMPOSE_SUBMIT_REQUEST :
return state . set ( 'is_submitting' , true ) ;
case COMPOSE_SUBMIT_SUCCESS :
return clearAll ( state ) ;
case COMPOSE_SUBMIT_FAIL :
return state . set ( 'is_submitting' , false ) ;
case COMPOSE_UPLOAD_REQUEST :
return state . withMutations ( map => {
map . set ( 'is_uploading' , true ) ;
map . set ( 'fileDropDate' , new Date ( ) ) ;
} ) ;
case COMPOSE_UPLOAD_SUCCESS :
return appendMedia ( state , Immutable . fromJS ( action . media ) ) ;
case COMPOSE_UPLOAD_FAIL :
return state . set ( 'is_uploading' , false ) ;
case COMPOSE_UPLOAD_UNDO :
return removeMedia ( state , action . media_id ) ;
case COMPOSE_UPLOAD_PROGRESS :
return state . set ( 'progress' , Math . round ( ( action . loaded / action . total ) * 100 ) ) ;
case COMPOSE_MENTION :
return state . update ( 'text' , text => ` ${ text } @ ${ action . account . get ( 'acct' ) } ` ) ;
case COMPOSE_SUGGESTIONS_CLEAR :
return state . update ( 'suggestions' , Immutable . List ( ) , list => list . clear ( ) ) . set ( 'suggestion_token' , null ) ;
case COMPOSE_SUGGESTIONS_READY :
return state . set ( 'suggestions' , Immutable . List ( action . accounts . map ( item => item . id ) ) ) . set ( 'suggestion_token' , action . token ) ;
case COMPOSE_SUGGESTION_SELECT :
return insertSuggestion ( state , action . position , action . token , action . completion ) ;
case TIMELINE_DELETE :
if ( action . id === state . get ( 'in_reply_to' ) ) {
return state . set ( 'in_reply_to' , null ) ;
} else {
return state ;
}
default :
return state ;
}
} ;