@ -22,6 +22,7 @@ import { length } from 'stringz';
import { countableText } from '../util/counter' ;
import Icon from 'mastodon/components/icon' ;
import { maxChars } from '../../../initial_state' ;
import { getRandomTermPouet } from '../../../../flavours/glitch/locales/fr' ;
const allowedAroundShortCode = '><\u0085\u0020\u00a0\u1680\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u202f\u205f\u3000\u2028\u2029\u0009\u000a\u000b\u000c\u000d' ;
@ -32,6 +33,7 @@ const messages = defineMessages({
publishLoud : { id : 'compose_form.publish_loud' , defaultMessage : '{publish}!' } ,
saveChanges : { id : 'compose_form.save_changes' , defaultMessage : 'Save changes' } ,
} ) ;
let publishText = '' ;
export default @ injectIntl
class ComposeForm extends ImmutablePureComponent {
@ -74,17 +76,17 @@ class ComposeForm extends ImmutablePureComponent {
handleChange = ( e ) => {
this . props . onChange ( e . target . value ) ;
}
} ;
handleKeyDown = ( e ) => {
if ( e . keyCode === 13 && ( e . ctrlKey || e . metaKey ) ) {
this . handleSubmit ( ) ;
}
}
} ;
getFulltextForCharacterCounting = ( ) => {
return [ this . props . spoiler ? this . props . spoilerText : '' , countableText ( this . props . text ) ] . join ( '' ) ;
}
return [ this . props . spoiler ? this . props . spoilerText : '' , countableText ( this . props . text ) ] . join ( '' ) ;
} ;
canSubmit = ( ) => {
const { isSubmitting , isChangingUpload , isUploading , anyMedia } = this . props ;
@ -92,9 +94,11 @@ class ComposeForm extends ImmutablePureComponent {
const isOnlyWhitespace = fulltext . length !== 0 && fulltext . trim ( ) . length === 0 ;
return ! ( isSubmitting || isUploading || isChangingUpload || length ( fulltext ) > maxChars || ( isOnlyWhitespace && ! anyMedia ) ) ;
}
} ;
handleSubmit = ( e ) => {
console . log ( 'handle du submit' ) ;
if ( this . props . text !== this . autosuggestTextarea . textarea . value ) {
// Something changed the text inside the textarea (e.g. browser extensions like Grammarly)
// Update the state to match the current text
@ -106,31 +110,30 @@ class ComposeForm extends ImmutablePureComponent {
}
this . props . onSubmit ( this . context . router ? this . context . router . history : null ) ;
if ( e ) {
e . preventDefault ( ) ;
}
}
} ;
onSuggestionsClearRequested = ( ) => {
this . props . onClearSuggestions ( ) ;
}
} ;
onSuggestionsFetchRequested = ( token ) => {
this . props . onFetchSuggestions ( token ) ;
}
} ;
onSuggestionSelected = ( tokenStart , token , value ) => {
this . props . onSuggestionSelected ( tokenStart , token , value , [ 'text' ] ) ;
}
} ;
onSpoilerSuggestionSelected = ( tokenStart , token , value ) => {
this . props . onSuggestionSelected ( tokenStart , token , value , [ 'spoiler_text' ] ) ;
}
} ;
handleChangeSpoilerText = ( e ) => {
this . props . onChangeSpoilerText ( e . target . value ) ;
}
} ;
handleFocus = ( ) => {
if ( this . composeForm && ! this . props . singleColumn ) {
@ -139,13 +142,13 @@ class ComposeForm extends ImmutablePureComponent {
this . composeForm . scrollIntoView ( ) ;
}
}
}
} ;
componentDidMount ( ) {
this . _updateFocusAndSelection ( { } ) ;
componentDidMount ( ) {
this . _updateFocusAndSelection ( { } ) ;
}
componentDidUpdate ( prevProps ) {
componentDidUpdate ( prevProps ) {
this . _updateFocusAndSelection ( prevProps ) ;
}
@ -159,13 +162,13 @@ class ComposeForm extends ImmutablePureComponent {
let selectionEnd , selectionStart ;
if ( this . props . preselectDate !== prevProps . preselectDate && this . props . isInReply ) {
selectionEnd = this . props . text . length ;
selectionEnd = this . props . text . length ;
selectionStart = this . props . text . search ( /\s/ ) + 1 ;
} else if ( typeof this . props . caretPosition === 'number' ) {
selectionStart = this . props . caretPosition ;
selectionEnd = this . props . caretPosition ;
selectionEnd = this . props . caretPosition ;
} else {
selectionEnd = this . props . text . length ;
selectionEnd = this . props . text . length ;
selectionStart = selectionEnd ;
}
@ -176,7 +179,7 @@ class ComposeForm extends ImmutablePureComponent {
this . autosuggestTextarea . textarea . setSelectionRange ( selectionStart , selectionEnd ) ;
this . autosuggestTextarea . textarea . focus ( ) ;
} ) . catch ( console . error ) ;
} else if ( prevProps . isSubmitting && ! this . props . isSubmitting ) {
} else if ( prevProps . isSubmitting && ! this . props . isSubmitting ) {
this . autosuggestTextarea . textarea . focus ( ) ;
} else if ( this . props . spoiler !== prevProps . spoiler ) {
if ( this . props . spoiler ) {
@ -185,40 +188,53 @@ class ComposeForm extends ImmutablePureComponent {
this . autosuggestTextarea . textarea . focus ( ) ;
}
}
}
} ;
setAutosuggestTextarea = ( c ) => {
this . autosuggestTextarea = c ;
}
} ;
setSpoilerText = ( c ) => {
this . spoilerText = c ;
}
} ;
setRef = c => {
this . composeForm = c ;
} ;
handleEmojiPick = ( data ) => {
const { text } = this . props ;
const position = this . autosuggestTextarea . textarea . selectionStart ;
const needsSpace = data . custom && position > 0 && ! allowedAroundShortCode . includes ( text [ position - 1 ] ) ;
const { text } = this . props ;
const position = this . autosuggestTextarea . textarea . selectionStart ;
const needsSpace = data . custom && position > 0 && ! allowedAroundShortCode . includes ( text [ position - 1 ] ) ;
this . props . onPickEmoji ( position , data , needsSpace ) ;
}
} ;
render ( ) {
render ( ) {
const { intl , onPaste , showSearch } = this . props ;
const disabled = this . props . isSubmitting ;
let publishText = '' ;
if ( this . props . isEditing ) {
publishText = intl . formatMessage ( messages . saveChanges ) ;
} else if ( this . props . privacy === 'private' || this . props . privacy === 'direct' ) {
publishText = < span className = 'compose-form__publish-private' > < Icon id = 'lock' / > { intl . formatMessage ( messages . publish ) } < / s p a n > ;
} else {
publishText = this . props . privacy !== 'unlisted' ? intl . formatMessage ( messages . publishLoud , { publish : intl . formatMessage ( messages . publish ) } ) : intl . formatMessage ( messages . publish ) ;
const locale = document . documentElement . lang ;
console . log ( 'is editing' , this . props . isEditing ) ;
if ( locale === 'fr' ) {
let items = [ 'Pouet' , 'Révolte' , 'Couillère' , 'Allez viens' , 'On est bien' , 'Sapristi' , 'PWOUINNNN' , 'Squalala' , 'C\'est parti' , 'Allez' , 'Roulez jeunesse' , 'Magnéto' , 'Illuminer le monde' ] ;
publishText = items [ Math . floor ( Math . random ( ) * items . length ) ] ;
} else {
if ( this . props . isEditing ) {
publishText = intl . formatMessage ( messages . saveChanges ) ;
} else if ( this . props . privacy === 'private' || this . props . privacy === 'direct' ) {
publishText =
< span className = 'compose-form__publish-private' > < Icon id = 'lock' / > { intl . formatMessage ( messages . publish ) } < / s p a n > ;
} else {
publishText = this . props . privacy !== 'unlisted' ? intl . formatMessage ( messages . publishLoud , { publish : intl . formatMessage ( messages . publish ) } ) : intl . formatMessage ( messages . publish ) ;
}
}
return (
@ -297,3 +313,4 @@ class ComposeForm extends ImmutablePureComponent {
}
}