This commit is contained in:
Adam Butterworth
2019-02-22 16:57:43 -05:00
committed by Adam Butterworth
parent ff756bd4ec
commit 2598934db9

View File

@@ -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 (
<ul className="list-unstyled">
{platforms.map(({ key, name }) => (
<EmptyListItem
key={key}
onClick={onEdit}
name={name}
/>
))}
</ul>
);
}
renderStatic(linkValues) {
const { platforms } = this.props;
const links = platforms.filter(({ key }) => Boolean(linkValues[key]));
return (
<React.Fragment>
<EditableItemHeader content="Social Links" />
<ul className="list-unstyled">
{links.map(({ key, name}) => (
<StaticListItem
key={key}
name={name}
url={linkValues[key]}
platform={key}
/>
))}
</ul>
</React.Fragment>
);
}
renderEditable(linkValues, isEmpty) {
const { visibility, platforms, showVisibility } = this.props;
const onEdit = this.onEdit;
return (
<React.Fragment>
<EditableItemHeader
content="Social Links"
showEditButton
onClickEdit={onEdit}
showVisibility={showVisibility}
visibility={visibility}
/>
<ul className="list-unstyled">
{platforms.map(({ key, name }) => (
<EditableListItem
key={key}
platform={key}
name={name}
url={linkValues[key]}
onEdit={onEdit}
/>
))}
</ul>
</React.Fragment>
);
}
renderEditing(linkValues) {
const { platforms, saveState, visibility, onVisibilityChange, onCancel } = this.props;
const onInputChange = this.onInputChange;
return (
<React.Fragment>
<EditableItemHeader content="Social Links" />
<ul className="list-unstyled">
{platforms.map(({ key, name }) => (
<EditingListItem
key={key}
name={name}
platform={key}
defaultValue={linkValues[key]}
onChange={onInputChange}
/>
))}
</ul>
<EditControls
onCancel={() => onCancel('socialLinks')}
onSave={this.onSave}
saveState={saveState}
visibility={visibility}
onVisibilityChange={e => onVisibilityChange('socialLinks', e.target.value)}
/>
</React.Fragment>
);
}
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 (
<SwitchContent
className="mb-4"
expression={editMode}
cases={{
editing: (
<React.Fragment>
<EditableItemHeader content="Social Links" />
<ul className="list-unstyled">
{this.props.platforms.map(({ key, name }) => (
<li key={key} className="form-group">
<h6>{name}</h6>
<Input
type="text"
defaultValue={socialLinksObj[key]}
onChange={(e) => {
this.setState({
[key]: e.target.value,
});
}}
/>
</li>
))}
</ul>
<EditControls
onCancel={() => onCancel('socialLinks')}
onSave={this.onSave}
saveState={saveState}
visibility={this.props.visibility}
onVisibilityChange={e => onVisibilityChange('socialLinks', e.target.value)}
/>
</React.Fragment>
),
editable: (
<React.Fragment>
<EditableItemHeader
content="Social Links"
showEditButton
onClickEdit={() => onEdit('socialLinks')}
showVisibility={socialLinks && socialLinks.length > 0}
visibility={this.props.visibility}
/>
<ul className="list-unstyled">
{this.props.platforms.map(({ key, name }) => (
<li key={key} className="form-group">
{
socialLinksObj[key] ? (
<a
href={socialLinksObj[key]}
className="font-weight-bold"
>
<FontAwesomeIcon className="mr-2" icon={brandIcons[key]} />
{name}
</a>
) : (
<EmptyContent onClick={() => onEdit('socialLinks')}>Add {name}</EmptyContent>
)
}
</li>
))}
</ul>
</React.Fragment>
),
empty: (
<ul className="list-unstyled">
{this.props.platforms.map(({ key, name }) => (
<li key={key} className="mb-4">
<EmptyContent onClick={() => onEdit('socialLinks')}>Add {name}</EmptyContent>
</li>
))}
</ul>
),
static: (
<React.Fragment>
<EditableItemHeader content="Social Links" />
<ul>
{this.props.platforms.map(({ key, name }) => {
if (!socialLinksObj[key]) return null;
return (
<li key={key}>
<a href={socialLinksObj[key]}>{name}</a>
</li>
);
})}
</ul>
</React.Fragment>
),
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 (
<a href={url} className="font-weight-bold">
<FontAwesomeIcon className="mr-2" icon={brandIcons[platform]} />
{name}
</a>
);
}
function EditableListItem({ url, platform, onEdit, name }) {
const linkDisplay = url != null ?
<SocialLink name={name} url={url} platform={platform} /> :
<EmptyContent onClick={onEdit}>Add {name}</EmptyContent>;
return <li className="form-group">{linkDisplay}</li>;
}
function EditingListItem({ platform, name, defaultValue, onChange }) {
return (
<li className="form-group">
<h6>{name}</h6>
<Input
type="text"
defaultValue={defaultValue}
onChange={e => onChange(platform, e.target.value)}
/>
</li>
);
}
function EmptyListItem({ onClick, name }) {
return (
<li className="mb-4">
<EmptyContent onClick={onClick}>Add {name}</EmptyContent>
</li>
);
}
function StaticListItem({ name, url, platform }) {
return (
<li className="mb-2">
<SocialLink name={name} url={url} platform={platform} />
</li>
);
}