From ae23354a093d2e80ca4bb1b3ef20cf8de9d0ab0f Mon Sep 17 00:00:00 2001 From: Andrey Smolko Date: Tue, 12 Feb 2019 00:11:43 +0300 Subject: [PATCH] wrapper for tag lists to hide all tags --- src/components/common/tag.jsx | 83 ++++++++++++++++++++-- src/components/events-page/events-feed.jsx | 25 +++++-- src/components/icons/down-arrow-icon.jsx | 17 +++++ src/components/icons/index.js | 1 + 4 files changed, 115 insertions(+), 11 deletions(-) create mode 100644 src/components/icons/down-arrow-icon.jsx diff --git a/src/components/common/tag.jsx b/src/components/common/tag.jsx index 77098ac33..8f9cf659a 100644 --- a/src/components/common/tag.jsx +++ b/src/components/common/tag.jsx @@ -1,6 +1,8 @@ -import React from 'react' +import React, { Component } from 'react' import PropTypes from 'prop-types' import styled, { withTheme } from 'styled-components' +import { Media } from '../../utils/css-utils' +import { DownArrowIcon } from '../icons' export const Tag = styled.li` font-size: 1.6rem; @@ -25,6 +27,7 @@ const TagListLabel = styled.span` ` const tagColors = ['lipstick', 'vividPurple', 'rouge', 'warmPurple'] +const morePlaqueColor = '#545454' const Tags = styled.ul` list-style: none; @@ -33,11 +36,71 @@ const Tags = styled.ul` padding: 0; ` +export class TagListCutter extends Component { + constructor(props) { + super(props) + this.state = { allOpen: false } + } + handleChange() { + this.setState({ allOpen: !this.state.allOpen }) + } + render() { + const { tagNumberDesktop, tagNumberMobile, tags } = this.props + + return ( + + {isMobile => { + let currentNumber = isMobile ? tagNumberMobile : tagNumberDesktop + return currentNumber && currentNumber < tags.length + ? this.props.children( + this.state.allOpen ? tags : tags.slice(0, currentNumber), + ToogleLabel(() => this.handleChange(), this.state.allOpen), + MoreTag(() => this.handleChange(), this.state.allOpen), + ) + : this.props.children(tags) + }} + + ) + } +} + +const ToogleLabel = (onLableClick, allOpen) => (label, theme) => ( +
+ {label} + + + +
+) + +const ToogleButton = styled.div` + display: flex; + transform: ${props => (props.down ? 'rotate(0deg)' : 'rotate(180deg)')}; + cursor: pointer; +` + +const MoreTag = (onLableClick, allOpen) => () => + allOpen ? null : ( + onLableClick()}> + more tags... + + ) + export const TagList = withTheme( - ({ tags, selectedTags, label, theme, onTagClick }) => ( + ({ + tags, + selectedTags, + label, + theme, + onTagClick, + LabelComponent = label => {label}, + MoreTag = () => null, + }) => (
- {label && {label}} - + {label && LabelComponent(label, theme)} {tags && tags.length > 0 && ( @@ -50,6 +113,7 @@ export const TagList = withTheme( #{tag} ))} + {MoreTag()} )}
@@ -67,3 +131,14 @@ TagList.defaultProps = { selectedTags: [], onTagClick: () => null, } + +TagListCutter.propTypes = { + tags: PropTypes.arrayOf(String).isRequired, + tagNumberDesktop: PropTypes.number, + tagNumberMobile: PropTypes.number, +} + +TagListCutter.defaultProps = { + tagNumberDesktop: 0, + tagNumberMobile: 0, +} diff --git a/src/components/events-page/events-feed.jsx b/src/components/events-page/events-feed.jsx index 695395074..2224569dd 100644 --- a/src/components/events-page/events-feed.jsx +++ b/src/components/events-page/events-feed.jsx @@ -5,7 +5,7 @@ import { chain, difference, either, isEmpty, pipe, uniq } from 'ramda' import BlockHeader from '../common/block-header' import MainContainer from '../common/main-container' -import { TagList } from '../common/tag' +import { TagList, TagListCutter } from '../common/tag' import EventList from './event-list' import { eventTags } from '../../utils/selectors' @@ -20,12 +20,23 @@ let EventsFeed = ({ Events {(filteredEventsTags.length > 0 || !selectedTags.length) && ( - 0 ? filteredEventsTags : selectedTags} - selectedTags={selectedTags} - onTagClick={toggleTag} - /> + 0 ? filteredEventsTags : selectedTags + }> + {(visibleTags, ToogleLable, MoreTag) => ( + + )} + )} {filteredEvents && ( diff --git a/src/components/icons/down-arrow-icon.jsx b/src/components/icons/down-arrow-icon.jsx new file mode 100644 index 000000000..7aff2723e --- /dev/null +++ b/src/components/icons/down-arrow-icon.jsx @@ -0,0 +1,17 @@ +import React from 'react' + +const DownArrowIcon = props => { + return ( + + + + ) +} + +export default DownArrowIcon diff --git a/src/components/icons/index.js b/src/components/icons/index.js index 2257891cc..dc375935b 100644 --- a/src/components/icons/index.js +++ b/src/components/icons/index.js @@ -8,3 +8,4 @@ export { default as PadlockIcon } from './padlock-icon' export { default as WebpurpleLogoIcon } from './webpurple-logo-icon' export { default as WatchIcon } from './watch' export { default as DownloadIcon } from './download' +export { default as DownArrowIcon } from './down-arrow-icon'