--- /dev/null
+import React from 'react';
+import PropTypes from 'prop-types';
+import { length } from 'stringz';
+
+export default class CharacterCounter extends React.PureComponent {
+
+ static propTypes = {
+ text: PropTypes.string.isRequired,
+ max: PropTypes.number.isRequired,
+ };
+
+ checkRemainingText (diff) {
+ if (diff < 0) {
+ return <span className='character-counter character-counter--over'>{diff}</span>;
+ }
+
+ return <span className='character-counter'>{diff}</span>;
+ }
+
+ render () {
+ const diff = this.props.max - length(this.props.text);
+ return this.checkRemainingText(diff);
+ }
+
+}
// Components.
import Button from 'flavours/glitch/components/button';
import Icon from 'flavours/glitch/components/icon';
+import CharacterCounter from './character_counter';
// Utils.
import { maxChars } from 'flavours/glitch/util/initial_state';
return (
<div className={computedClass}>
- <span className='count'>{diff}</span>
+ <CharacterCounter text={countText} max={maxChars} />
{sideArm && sideArm !== 'none' ? (
<Button
className='side_arm'
import ImmutablePureComponent from 'react-immutable-pure-component';
import UploadContainer from '../containers/upload_container';
import SensitiveButtonContainer from '../containers/sensitive_button_container';
+import { FormattedMessage } from 'react-intl';
export default class UploadForm extends ImmutablePureComponent {
static propTypes = {
return (
<div className='composer--upload_form'>
- <UploadProgressContainer />
+ <UploadProgressContainer icon='upload' message={<FormattedMessage id='upload_progress.label' defaultMessage='Uploading…' />} />
{mediaIds.size > 0 && (
<div className='content'>
import PropTypes from 'prop-types';
import Motion from 'flavours/glitch/util/optional_motion';
import spring from 'react-motion/lib/spring';
-import { FormattedMessage } from 'react-intl';
import Icon from 'flavours/glitch/components/icon';
export default class UploadProgress extends React.PureComponent {
static propTypes = {
active: PropTypes.bool,
progress: PropTypes.number,
+ icon: PropTypes.string.isRequired,
+ message: PropTypes.node.isRequired,
};
render () {
- const { active, progress } = this.props;
+ const { active, progress, icon, message } = this.props;
if (!active) {
return null;
return (
<div className='composer--upload_form--progress'>
- <Icon icon='upload' />
+ <Icon icon={icon} />
<div className='message'>
- <FormattedMessage id='upload_progress.label' defaultMessage='Uploading...' />
+ {message}
<div className='backdrop'>
<Motion defaultStyle={{ width: 0 }} style={{ width: spring(progress) }}>
justify-content: flex-end;
flex: 0 0 auto;
- & > .count {
+ & > .character-counter {
display: inline-block;
margin: 0 16px 0 8px;
font-size: 16px;