diff --git a/app/soapbox/features/compose/components/upload_button.js b/app/soapbox/features/compose/components/upload_button.js deleted file mode 100644 index a42e3be1f..000000000 --- a/app/soapbox/features/compose/components/upload_button.js +++ /dev/null @@ -1,92 +0,0 @@ -import PropTypes from 'prop-types'; -import React from 'react'; -import ImmutablePropTypes from 'react-immutable-proptypes'; -import ImmutablePureComponent from 'react-immutable-pure-component'; -import { defineMessages, injectIntl } from 'react-intl'; -import { connect } from 'react-redux'; - -import { IconButton } from '../../../components/ui'; - -const messages = defineMessages({ - upload: { id: 'upload_button.label', defaultMessage: 'Add media attachment' }, -}); - -const onlyImages = types => { - return Boolean(types && types.every(type => type.startsWith('image/'))); -}; - -const makeMapStateToProps = () => { - const mapStateToProps = state => ({ - attachmentTypes: state.getIn(['instance', 'configuration', 'media_attachments', 'supported_mime_types']), - }); - - return mapStateToProps; -}; - -export default @connect(makeMapStateToProps) -@injectIntl -class UploadButton extends ImmutablePureComponent { - - static propTypes = { - disabled: PropTypes.bool, - unavailable: PropTypes.bool, - onSelectFile: PropTypes.func.isRequired, - style: PropTypes.object, - resetFileKey: PropTypes.number, - attachmentTypes: ImmutablePropTypes.listOf(PropTypes.string), - intl: PropTypes.object.isRequired, - }; - - handleChange = (e) => { - if (e.target.files.length > 0) { - this.props.onSelectFile(e.target.files); - } - } - - handleClick = () => { - this.fileElement.click(); - } - - setRef = (c) => { - this.fileElement = c; - } - - render() { - const { intl, resetFileKey, attachmentTypes, unavailable, disabled } = this.props; - - if (unavailable) { - return null; - } - - const src = onlyImages(attachmentTypes) - ? require('@tabler/icons/icons/photo.svg') - : require('@tabler/icons/icons/paperclip.svg'); - - return ( -
- - - -
- ); - } - -} diff --git a/app/soapbox/features/compose/components/upload_button.tsx b/app/soapbox/features/compose/components/upload_button.tsx new file mode 100644 index 000000000..a34e2b4ad --- /dev/null +++ b/app/soapbox/features/compose/components/upload_button.tsx @@ -0,0 +1,81 @@ +import React, { useRef } from 'react'; +import { defineMessages, useIntl } from 'react-intl'; + +import { IconButton } from 'soapbox/components/ui'; +import { useAppSelector } from 'soapbox/hooks'; + +import type { List as ImmutableList } from 'immutable'; + +const messages = defineMessages({ + upload: { id: 'upload_button.label', defaultMessage: 'Add media attachment' }, +}); + +const onlyImages = (types: ImmutableList) => { + return Boolean(types && types.every(type => type.startsWith('image/'))); +}; + +interface IUploadButton { + disabled: boolean, + unavailable: boolean, + onSelectFile: (files: FileList) => void, + style: React.CSSProperties, + resetFileKey: number, +} + +const UploadButton: React.FC = ({ + disabled, + unavailable, + onSelectFile, + resetFileKey, +}) => { + const intl = useIntl(); + + const fileElement = useRef(null); + const attachmentTypes = useAppSelector(state => state.instance.configuration.getIn(['media_attachments', 'supported_mime_types']) as ImmutableList); + + const handleChange: React.ChangeEventHandler = (e) => { + if (e.target.files?.length) { + onSelectFile(e.target.files); + } + }; + + const handleClick = () => { + fileElement.current?.click(); + }; + + if (unavailable) { + return null; + } + + const src = onlyImages(attachmentTypes) + ? require('@tabler/icons/icons/photo.svg') + : require('@tabler/icons/icons/paperclip.svg'); + + return ( +
+ + + +
+ ); +}; + +export default UploadButton;