import paper from '@turbowarp/paper'; import {connect} from 'react-redux'; import bindAll from 'lodash.bindall'; import PropTypes from 'prop-types'; import React from 'react'; import FontDropdownComponent from '../components/font-dropdown/font-dropdown.jsx'; import Fonts from '../lib/fonts'; import {changeFont} from '../reducers/font'; import {getSelectedLeafItems} from '../helper/selection'; class FontDropdown extends React.Component { constructor (props) { super(props); bindAll(this, [ 'getFontName', 'handleHoverCustom', 'handleManageFonts', 'handleChangeFontSerif', 'handleChangeFontSansSerif', 'handleChangeFontHandwriting', 'handleChangeFontMarker', 'handleChangeFontCurly', 'handleChangeFontPixel', 'handleChangeFontMopedLike', 'handleChangeFontChinese', 'handleChangeFontJapanese', 'handleChangeFontKorean', 'handleOpenDropdown', 'handleClickOutsideDropdown', 'setDropdown', 'handleChoose' ]); } getFontName (font) { const NATIVE_FONTS = Object.values(Fonts); if (NATIVE_FONTS.includes(font)) { switch (font) { case Fonts.CHINESE: return '中文'; case Fonts.KOREAN: return '한국어'; case Fonts.JAPANESE: return '日本語'; case Fonts.MOPED_LIKE: return 'Mopeds'; default: return font; } } const customFont = this.props.customFonts.find(i => i.family === font); if (customFont) { return customFont.name; } return font; } handleHoverCustom (family) { if (this.dropDown.isOpen()) { this.props.changeFont(family); } } handleManageFonts () { this.cancelFontChange(); this.props.onManageFonts(); } handleChangeFontSansSerif () { if (this.dropDown.isOpen()) { this.props.changeFont(Fonts.SANS_SERIF); } } handleChangeFontSerif () { if (this.dropDown.isOpen()) { this.props.changeFont(Fonts.SERIF); } } handleChangeFontHandwriting () { if (this.dropDown.isOpen()) { this.props.changeFont(Fonts.HANDWRITING); } } handleChangeFontMarker () { if (this.dropDown.isOpen()) { this.props.changeFont(Fonts.MARKER); } } handleChangeFontCurly () { if (this.dropDown.isOpen()) { this.props.changeFont(Fonts.CURLY); } } handleChangeFontPixel () { if (this.dropDown.isOpen()) { this.props.changeFont(Fonts.PIXEL); } } handleChangeFontMopedLike () { if (this.dropDown.isOpen()) { this.props.changeFont(Fonts.MOPED_LIKE); } } handleChangeFontChinese () { if (this.dropDown.isOpen()) { this.props.changeFont(Fonts.CHINESE); } } handleChangeFontJapanese () { if (this.dropDown.isOpen()) { this.props.changeFont(Fonts.JAPANESE); } } handleChangeFontKorean () { if (this.dropDown.isOpen()) { this.props.changeFont(Fonts.KOREAN); } } handleChoose () { if (this.dropDown.isOpen()) { this.dropDown.handleClosePopover(); this.props.onUpdateImage(); } } handleOpenDropdown () { this.savedFont = this.props.font; this.savedSelection = getSelectedLeafItems(); } handleClickOutsideDropdown (e) { e.stopPropagation(); this.cancelFontChange(); } cancelFontChange () { this.dropDown.handleClosePopover(); // Cancel font change for (const item of this.savedSelection) { if (item instanceof paper.PointText) { item.font = this.savedFont; } } this.props.changeFont(this.savedFont); this.savedFont = null; this.savedSelection = null; } setDropdown (element) { this.dropDown = element; } render () { return ( ); } } FontDropdown.propTypes = { changeFont: PropTypes.func.isRequired, customFonts: PropTypes.arrayOf(PropTypes.shape({ name: PropTypes.string.isRequired, family: PropTypes.string.isRequired })).isRequired, onManageFonts: PropTypes.func, font: PropTypes.string, onUpdateImage: PropTypes.func.isRequired }; const mapStateToProps = state => ({ font: state.scratchPaint.font, customFonts: state.scratchPaint.customFonts }); const mapDispatchToProps = dispatch => ({ changeFont: font => { dispatch(changeFont(font)); } }); export default connect( mapStateToProps, mapDispatchToProps )(FontDropdown);