Verified Commit f8b09050 authored by KokaKiwi's avatar KokaKiwi Committed by Haelwenn

Add status content type dropdown to compose box.

parent f39d4434
......@@ -45,6 +45,7 @@ export const COMPOSE_SPOILERNESS_CHANGE = 'COMPOSE_SPOILERNESS_CHANGE';
export const COMPOSE_SPOILER_TEXT_CHANGE = 'COMPOSE_SPOILER_TEXT_CHANGE';
export const COMPOSE_VISIBILITY_CHANGE = 'COMPOSE_VISIBILITY_CHANGE';
export const COMPOSE_LISTABILITY_CHANGE = 'COMPOSE_LISTABILITY_CHANGE';
export const COMPOSE_CONTENT_TYPE_CHANGE = 'COMPOSE_CONTENT_TYPE_CHANGE';
export const COMPOSE_EMOJI_INSERT = 'COMPOSE_EMOJI_INSERT';
......@@ -140,6 +141,7 @@ export function submitCompose(routerHistory) {
}
api(getState).post('/api/v1/statuses', {
status,
content_type: getState().getIn(['compose', 'content_type']),
in_reply_to_id: getState().getIn(['compose', 'in_reply_to'], null),
media_ids: media.map(item => item.get('id')),
sensitive: getState().getIn(['compose', 'sensitive']) || (spoilerText.length > 0 && media.size !== 0),
......@@ -528,6 +530,13 @@ export function changeComposeVisibility(value) {
};
};
export function changeComposeContentType(value) {
return {
type: COMPOSE_CONTENT_TYPE_CHANGE,
value,
};
};
export function insertEmojiCompose(position, emoji) {
return {
type: COMPOSE_EMOJI_INSERT,
......
......@@ -15,6 +15,7 @@ import {
changeComposeSpoilerText,
changeComposeSpoilerness,
changeComposeVisibility,
changeComposeContentType,
changeUploadCompose,
clearComposeSuggestions,
fetchComposeSuggestions,
......@@ -89,6 +90,7 @@ function mapStateToProps (state) {
media: state.getIn(['compose', 'media_attachments']),
preselectDate: state.getIn(['compose', 'preselectDate']),
privacy: state.getIn(['compose', 'privacy']),
contentType: state.getIn(['compose', 'content_type']),
progress: state.getIn(['compose', 'progress']),
inReplyTo: inReplyTo ? state.getIn(['statuses', inReplyTo]) : null,
replyAccount: inReplyTo ? state.getIn(['statuses', inReplyTo, 'account']) : null,
......@@ -118,6 +120,9 @@ const mapDispatchToProps = (dispatch, { intl }) => ({
onChangeAdvancedOption(option, value) {
dispatch(changeComposeAdvancedOption(option, value));
},
onChangeContentType(value) {
dispatch(changeComposeContentType(value));
},
onChangeDescription(id, description) {
dispatch(changeUploadCompose(id, { description }));
},
......@@ -399,6 +404,7 @@ class Composer extends React.Component {
advancedOptions,
amUnlocked,
anyMedia,
contentType,
intl,
isSubmitting,
isChangingUpload,
......@@ -408,6 +414,7 @@ class Composer extends React.Component {
poll,
onCancelReply,
onChangeAdvancedOption,
onChangeContentType,
onChangeDescription,
onChangeSensitivity,
onChangeSpoilerness,
......@@ -496,6 +503,7 @@ class Composer extends React.Component {
<ComposerOptions
acceptContentTypes={acceptContentTypes}
advancedOptions={advancedOptions}
contentType={contentType}
disabled={isSubmitting}
allowMedia={!poll && (media ? media.size < 4 && !media.some(
item => item.get('type') === 'video'
......@@ -505,6 +513,7 @@ class Composer extends React.Component {
hasPoll={!!poll}
intl={intl}
onChangeAdvancedOption={onChangeAdvancedOption}
onChangeContentType={onChangeContentType}
onChangeSensitivity={onChangeSensitivity}
onChangeVisibility={onChangeVisibility}
onTogglePoll={onTogglePoll}
......@@ -550,6 +559,7 @@ Composer.propTypes = {
media: ImmutablePropTypes.list,
preselectDate: PropTypes.instanceOf(Date),
privacy: PropTypes.string,
contentType: PropTypes.string,
progress: PropTypes.number,
inReplyTo: ImmutablePropTypes.map,
resetFileKey: PropTypes.number,
......@@ -569,6 +579,7 @@ Composer.propTypes = {
// Dispatch props.
onCancelReply: PropTypes.func,
onChangeAdvancedOption: PropTypes.func,
onChangeContentType: PropTypes.func,
onChangeDescription: PropTypes.func,
onChangeSensitivity: PropTypes.func,
onChangeSpoilerText: PropTypes.func,
......
......@@ -35,6 +35,10 @@ const messages = defineMessages({
defaultMessage: 'Adjust status privacy',
id: 'privacy.change',
},
content_type: {
defaultMessage: 'Content type',
id: 'content-type.change',
},
direct_long: {
defaultMessage: 'Post to mentioned users only',
id: 'privacy.direct.long',
......@@ -47,6 +51,10 @@ const messages = defineMessages({
defaultMessage: 'Draw something',
id: 'compose.attach.doodle',
},
html: {
defaultMessage: 'HTML',
id: 'compose.content-type.html',
},
local_only_long: {
defaultMessage: 'Do not post to other instances',
id: 'advanced_options.local-only.long',
......@@ -55,6 +63,14 @@ const messages = defineMessages({
defaultMessage: 'Local-only',
id: 'advanced_options.local-only.short',
},
markdown: {
defaultMessage: 'Markdown',
id: 'compose.content-type.markdown',
},
plain: {
defaultMessage: 'Plain text',
id: 'compose.content-type.plain',
},
private_long: {
defaultMessage: 'Post to followers only',
id: 'privacy.private.long',
......@@ -168,6 +184,7 @@ export default class ComposerOptions extends React.PureComponent {
const {
acceptContentTypes,
advancedOptions,
contentType,
disabled,
allowMedia,
hasMedia,
......@@ -178,6 +195,7 @@ export default class ComposerOptions extends React.PureComponent {
onChangeSensitivity,
onChangeVisibility,
onTogglePoll,
onChangeContentType,
onModalClose,
onModalOpen,
onToggleSpoiler,
......@@ -216,6 +234,24 @@ export default class ComposerOptions extends React.PureComponent {
},
};
const contentTypeItems = {
plain: {
icon: 'file',
name: 'text/plain',
text: <FormattedMessage {...messages.plain} />,
},
html: {
icon: 'file-text',
name: 'text/html',
text: <FormattedMessage {...messages.html} />,
},
markdown: {
icon: 'file-text',
name: 'text/markdown',
text: <FormattedMessage {...messages.markdown} />,
},
};
// The result.
return (
<div className='composer--options'>
......@@ -313,6 +349,19 @@ export default class ComposerOptions extends React.PureComponent {
title={intl.formatMessage(messages.change_privacy)}
value={privacy}
/>
<Dropdown
icon="code"
items={[
contentTypeItems.plain,
contentTypeItems.html,
contentTypeItems.markdown,
]}
onChange={onChangeContentType}
onModalClose={onModalClose}
onModalOpen={onModalOpen}
title={intl.formatMessage(messages.content_type)}
value={contentType}
/>
{onToggleSpoiler && (
<TextIconButton
active={spoiler}
......@@ -355,6 +404,7 @@ export default class ComposerOptions extends React.PureComponent {
ComposerOptions.propTypes = {
acceptContentTypes: PropTypes.string,
advancedOptions: ImmutablePropTypes.map,
contentType: PropTypes.string,
disabled: PropTypes.bool,
allowMedia: PropTypes.bool,
hasMedia: PropTypes.bool,
......@@ -365,6 +415,7 @@ ComposerOptions.propTypes = {
onChangeSensitivity: PropTypes.func,
onChangeVisibility: PropTypes.func,
onTogglePoll: PropTypes.func,
onChangeContentType: PropTypes.func,
onDoodleOpen: PropTypes.func,
onModalClose: PropTypes.func,
onModalOpen: PropTypes.func,
......
......@@ -25,6 +25,7 @@ import {
COMPOSE_SPOILERNESS_CHANGE,
COMPOSE_SPOILER_TEXT_CHANGE,
COMPOSE_VISIBILITY_CHANGE,
COMPOSE_CONTENT_TYPE_CHANGE,
COMPOSE_EMOJI_INSERT,
COMPOSE_UPLOAD_CHANGE_REQUEST,
COMPOSE_UPLOAD_CHANGE_SUCCESS,
......@@ -66,6 +67,7 @@ const initialState = ImmutableMap({
spoiler: false,
spoiler_text: '',
privacy: null,
content_type: 'text/plain',
text: '',
focusDate: null,
caretPosition: null,
......@@ -308,6 +310,10 @@ export default function compose(state = initialState, action) {
return state
.set('privacy', action.value)
.set('idempotencyKey', uuid());
case COMPOSE_CONTENT_TYPE_CHANGE:
return state
.set('content_type', action.value)
.set('idempotencyKey', uuid());
case COMPOSE_CHANGE:
return state
.set('text', action.text)
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment