Port 4c03e05a4e
to glitch-soc
This introduces new requirements in the API:
`/api/v1/timelines/tag/:tag` now accepts new params: `any`, `all` and `none`
It now returns status matching tag :tag or any of the :any, provided that
they also include all tags in `all` and none of `none`.
main
parent
6073195a7d
commit
4be7313298
@ -0,0 +1,102 @@
|
|||||||
|
import React from 'react';
|
||||||
|
import PropTypes from 'prop-types';
|
||||||
|
import ImmutablePropTypes from 'react-immutable-proptypes';
|
||||||
|
import { injectIntl, FormattedMessage } from 'react-intl';
|
||||||
|
import Toggle from 'react-toggle';
|
||||||
|
import AsyncSelect from 'react-select/lib/Async';
|
||||||
|
|
||||||
|
@injectIntl
|
||||||
|
export default class ColumnSettings extends React.PureComponent {
|
||||||
|
|
||||||
|
static propTypes = {
|
||||||
|
settings: ImmutablePropTypes.map.isRequired,
|
||||||
|
onChange: PropTypes.func.isRequired,
|
||||||
|
onLoad: PropTypes.func.isRequired,
|
||||||
|
intl: PropTypes.object.isRequired,
|
||||||
|
};
|
||||||
|
|
||||||
|
state = {
|
||||||
|
open: this.hasTags(),
|
||||||
|
};
|
||||||
|
|
||||||
|
hasTags () {
|
||||||
|
return ['all', 'any', 'none'].map(mode => this.tags(mode).length > 0).includes(true);
|
||||||
|
}
|
||||||
|
|
||||||
|
tags (mode) {
|
||||||
|
let tags = this.props.settings.getIn(['tags', mode]) || [];
|
||||||
|
if (tags.toJSON) {
|
||||||
|
return tags.toJSON();
|
||||||
|
} else {
|
||||||
|
return tags;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
onSelect = (mode) => {
|
||||||
|
return (value) => {
|
||||||
|
this.props.onChange(['tags', mode], value);
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
onToggle = () => {
|
||||||
|
if (this.state.open && this.hasTags()) {
|
||||||
|
this.props.onChange('tags', {});
|
||||||
|
}
|
||||||
|
this.setState({ open: !this.state.open });
|
||||||
|
};
|
||||||
|
|
||||||
|
modeSelect (mode) {
|
||||||
|
return (
|
||||||
|
<div className='column-settings__section'>
|
||||||
|
{this.modeLabel(mode)}
|
||||||
|
<AsyncSelect
|
||||||
|
isMulti
|
||||||
|
autoFocus
|
||||||
|
value={this.tags(mode)}
|
||||||
|
settings={this.props.settings}
|
||||||
|
settingPath={['tags', mode]}
|
||||||
|
onChange={this.onSelect(mode)}
|
||||||
|
loadOptions={this.props.onLoad}
|
||||||
|
classNamePrefix='column-settings__hashtag-select'
|
||||||
|
name='tags'
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
modeLabel (mode) {
|
||||||
|
switch(mode) {
|
||||||
|
case 'any': return <FormattedMessage id='hashtag.column_settings.tag_mode.any' defaultMessage='Any of these' />;
|
||||||
|
case 'all': return <FormattedMessage id='hashtag.column_settings.tag_mode.all' defaultMessage='All of these' />;
|
||||||
|
case 'none': return <FormattedMessage id='hashtag.column_settings.tag_mode.none' defaultMessage='None of these' />;
|
||||||
|
}
|
||||||
|
return '';
|
||||||
|
};
|
||||||
|
|
||||||
|
render () {
|
||||||
|
return (
|
||||||
|
<div>
|
||||||
|
<div className='column-settings__row'>
|
||||||
|
<div className='setting-toggle'>
|
||||||
|
<Toggle
|
||||||
|
id='hashtag.column_settings.tag_toggle'
|
||||||
|
onChange={this.onToggle}
|
||||||
|
checked={this.state.open}
|
||||||
|
/>
|
||||||
|
<span className='setting-toggle__label'>
|
||||||
|
<FormattedMessage id='hashtag.column_settings.tag_toggle' defaultMessage='Include additional tags in this column' />
|
||||||
|
</span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
{this.state.open &&
|
||||||
|
<div className='column-settings__hashtags'>
|
||||||
|
{this.modeSelect('any')}
|
||||||
|
{this.modeSelect('all')}
|
||||||
|
{this.modeSelect('none')}
|
||||||
|
</div>
|
||||||
|
}
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,31 @@
|
|||||||
|
import { connect } from 'react-redux';
|
||||||
|
import ColumnSettings from '../components/column_settings';
|
||||||
|
import { changeColumnParams } from 'flavours/glitch/actions/columns';
|
||||||
|
import api from 'flavours/glitch/util/api';
|
||||||
|
|
||||||
|
const mapStateToProps = (state, { columnId }) => {
|
||||||
|
const columns = state.getIn(['settings', 'columns']);
|
||||||
|
const index = columns.findIndex(c => c.get('uuid') === columnId);
|
||||||
|
|
||||||
|
if (!(columnId && index >= 0)) {
|
||||||
|
return {};
|
||||||
|
}
|
||||||
|
|
||||||
|
return { settings: columns.get(index).get('params') };
|
||||||
|
};
|
||||||
|
|
||||||
|
const mapDispatchToProps = (dispatch, { columnId }) => ({
|
||||||
|
onChange (key, value) {
|
||||||
|
dispatch(changeColumnParams(columnId, key, value));
|
||||||
|
},
|
||||||
|
|
||||||
|
onLoad (value) {
|
||||||
|
return api().get('/api/v2/search', { params: { q: value } }).then(response => {
|
||||||
|
return (response.data.hashtags || []).map((tag) => {
|
||||||
|
return { value: tag.name, label: `#${tag.name}` };
|
||||||
|
});
|
||||||
|
});
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
|
export default connect(mapStateToProps, mapDispatchToProps)(ColumnSettings);
|
Loading…
Reference in new issue