diff --git a/src/components/UserProfile/SocialLinks.jsx b/src/components/UserProfile/SocialLinks.jsx index d0867d6..9ec3e49 100644 --- a/src/components/UserProfile/SocialLinks.jsx +++ b/src/components/UserProfile/SocialLinks.jsx @@ -21,6 +21,8 @@ class SocialLinks extends React.Component { super(props); this.state = {}; this.onSave = this.onSave.bind(this); + this.onEdit = this.onEdit.bind(this); + this.onInputChange = this.onInputChange.bind(this); } onSave() { @@ -32,136 +34,134 @@ class SocialLinks extends React.Component { this.props.onSave('socialLinks', values); } + onEdit() { + this.props.onEdit('socialLinks'); + } + + onInputChange(platform, value) { + console.log(platform, value) + this.setState({ [platform]: value}); + } + + renderEmpty() { + const { platforms } = this.props; + const onEdit = this.onEdit; + + return ( + + ); + } + + renderStatic(linkValues) { + const { platforms } = this.props; + const links = platforms.filter(({ key }) => Boolean(linkValues[key])); + + return ( + + + + + ); + } + + renderEditable(linkValues, isEmpty) { + const { visibility, platforms, showVisibility } = this.props; + const onEdit = this.onEdit; + + return ( + + + + + ); + } + + renderEditing(linkValues) { + const { platforms, saveState, visibility, onVisibilityChange, onCancel } = this.props; + const onInputChange = this.onInputChange; + + return ( + + + + onCancel('socialLinks')} + onSave={this.onSave} + saveState={saveState} + visibility={visibility} + onVisibilityChange={e => onVisibilityChange('socialLinks', e.target.value)} + /> + + ); + } + render() { - const { - socialLinks, - editMode, - onEdit, - onCancel, - onVisibilityChange, - saveState, - } = this.props; - - const socialLinksObj = {}; - - if (socialLinks !== null) { - socialLinks.forEach(({ platform, socialLink }) => { - socialLinksObj[platform] = socialLink; - }); - } - + const { socialLinks, editMode } = this.props; + const socialLinksObj = socialLinks.reduce((acc, { platform, socialLink }) => { + acc[platform] = socialLink; + return acc; + }, {}); + const isEmpty = socialLinks && socialLinks.length > 0; return ( - - - onCancel('socialLinks')} - onSave={this.onSave} - saveState={saveState} - visibility={this.props.visibility} - onVisibilityChange={e => onVisibilityChange('socialLinks', e.target.value)} - /> - - ), - editable: ( - - onEdit('socialLinks')} - showVisibility={socialLinks && socialLinks.length > 0} - visibility={this.props.visibility} - /> -
    - {this.props.platforms.map(({ key, name }) => ( -
  • - { - socialLinksObj[key] ? ( - - - {name} - - ) : ( - onEdit('socialLinks')}>Add {name} - ) - } -
  • - ))} -
-
- ), - empty: ( -
    - {this.props.platforms.map(({ key, name }) => ( -
  • - onEdit('socialLinks')}>Add {name} -
  • - ))} -
- ), - static: ( - - -
    - {this.props.platforms.map(({ key, name }) => { - if (!socialLinksObj[key]) return null; - - return ( -
  • - {name} -
  • - ); - })} -
-
- ), + empty: this.renderEmpty(), + static: this.renderStatic(socialLinksObj), + editing: this.renderEditing(socialLinksObj), + editable: this.renderEditable(socialLinksObj, isEmpty), }} /> ); } } -const sectionPropTypes = { - editMode: PropTypes.string, - onEdit: PropTypes.func.isRequired, - onChange: PropTypes.func.isRequired, - onSave: PropTypes.func.isRequired, - onCancel: PropTypes.func.isRequired, - onVisibilityChange: PropTypes.func.isRequired, - saveState: PropTypes.string, -}; - -const sectionDefaultProps = { - editMode: 'static', - saveState: null, -}; - SocialLinks.propTypes = { - ...sectionPropTypes, socialLinks: PropTypes.arrayOf(PropTypes.shape({ platform: PropTypes.string, socialLink: PropTypes.string, @@ -171,10 +171,16 @@ SocialLinks.propTypes = { name: PropTypes.string, })), visibility: PropTypes.oneOf(['private', 'all_users']), + editMode: PropTypes.string, + onEdit: PropTypes.func.isRequired, + onChange: PropTypes.func.isRequired, + onSave: PropTypes.func.isRequired, + onCancel: PropTypes.func.isRequired, + onVisibilityChange: PropTypes.func.isRequired, + saveState: PropTypes.string, }; SocialLinks.defaultProps = { - ...sectionDefaultProps, socialLinks: [], platforms: [ { key: 'twitter', name: 'Twitter' }, @@ -182,6 +188,57 @@ SocialLinks.defaultProps = { { key: 'facebook', name: 'Facebook' }, ], visibility: 'private', + editMode: 'static', + saveState: null, }; export default SocialLinks; + + + + +function SocialLink({ url, name, platform }) { + return ( + + + {name} + + ); +} + +function EditableListItem({ url, platform, onEdit, name }) { + const linkDisplay = url != null ? + : + Add {name}; + + return
  • {linkDisplay}
  • ; +} + +function EditingListItem({ platform, name, defaultValue, onChange }) { + return ( +
  • +
    {name}
    + onChange(platform, e.target.value)} + /> +
  • + ); +} + +function EmptyListItem({ onClick, name }) { + return ( +
  • + Add {name} +
  • + ); +} + +function StaticListItem({ name, url, platform }) { + return ( +
  • + +
  • + ); +}