拉黑与屏蔽
This commit is contained in:
92
src/Flows.js
92
src/Flows.js
@@ -96,7 +96,10 @@ class Reply extends PureComponent {
|
|||||||
}
|
}
|
||||||
|
|
||||||
render() {
|
render() {
|
||||||
const {info, color_picker, show_pid, do_filter_name, do_delete} = this.props;
|
const {
|
||||||
|
info, color_picker, show_pid, do_filter_name, do_delete,
|
||||||
|
do_report, do_block
|
||||||
|
} = this.props;
|
||||||
const author = info.name,
|
const author = info.name,
|
||||||
replyText = info.text;
|
replyText = info.text;
|
||||||
return (
|
return (
|
||||||
@@ -127,19 +130,42 @@ class Reply extends PureComponent {
|
|||||||
<span className="box-header-name">{info.name}</span>
|
<span className="box-header-name">{info.name}</span>
|
||||||
)}
|
)}
|
||||||
{!!do_delete && !!info.can_del && (
|
{!!do_delete && !!info.can_del && (
|
||||||
<span
|
<>
|
||||||
className="clickable"
|
<span
|
||||||
onClick={() => {
|
className="clickable"
|
||||||
do_delete('cid', info.cid);
|
onClick={() => {
|
||||||
}}
|
do_delete('cid', info.cid);
|
||||||
>
|
}}
|
||||||
<span className="icon icon-trash" />
|
>
|
||||||
</span>
|
<span className="icon icon-trash" />
|
||||||
|
</span>
|
||||||
|
|
||||||
|
</>
|
||||||
)}
|
)}
|
||||||
|
{!!do_block && (
|
||||||
|
<>
|
||||||
|
<span
|
||||||
|
className="clickable"
|
||||||
|
onClick={do_block}
|
||||||
|
>
|
||||||
|
<span className="icon icon-block" />
|
||||||
|
</span>
|
||||||
|
|
||||||
|
</>
|
||||||
|
)}
|
||||||
|
{!!do_report && (
|
||||||
|
<>
|
||||||
|
<span
|
||||||
|
className="clickable"
|
||||||
|
onClick={do_report}
|
||||||
|
>
|
||||||
|
<span className="icon icon-flag" />
|
||||||
|
</span>
|
||||||
|
|
||||||
|
</>
|
||||||
|
)}
|
||||||
|
<Time stamp={info.timestamp} short={!do_report} />
|
||||||
|
|
||||||
<Time stamp={info.timestamp} short={false} />
|
|
||||||
|
|
||||||
<code className="box-id">{'$' + info.cid}</code>
|
|
||||||
</div>
|
</div>
|
||||||
<div className="box-content">
|
<div className="box-content">
|
||||||
<HighlightedMarkdown
|
<HighlightedMarkdown
|
||||||
@@ -201,7 +227,7 @@ class FlowItem extends PureComponent {
|
|||||||
const {
|
const {
|
||||||
info, is_quote, cached, attention, can_del, do_filter_name, do_delete,
|
info, is_quote, cached, attention, can_del, do_filter_name, do_delete,
|
||||||
do_edit_cw, do_edit_score, timestamp, img_clickable, color_picker,
|
do_edit_cw, do_edit_score, timestamp, img_clickable, color_picker,
|
||||||
show_pid, do_vote
|
show_pid, do_vote, do_block
|
||||||
} = this.props;
|
} = this.props;
|
||||||
const { cw, hot_score } = this.state;
|
const { cw, hot_score } = this.state;
|
||||||
return (
|
return (
|
||||||
@@ -269,6 +295,14 @@ class FlowItem extends PureComponent {
|
|||||||
<span className="icon icon-trash" />
|
<span className="icon icon-trash" />
|
||||||
</span>
|
</span>
|
||||||
)}
|
)}
|
||||||
|
{!!do_block && (
|
||||||
|
<span
|
||||||
|
className="clickable"
|
||||||
|
onClick={do_block}
|
||||||
|
>
|
||||||
|
<span className="icon icon-block" />
|
||||||
|
</span>
|
||||||
|
)}
|
||||||
|
|
||||||
{info.cw !== null &&
|
{info.cw !== null &&
|
||||||
(!do_edit_cw || !info.can_del) && (
|
(!do_edit_cw || !info.can_del) && (
|
||||||
@@ -540,8 +574,8 @@ class FlowSidebar extends PureComponent {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
report() {
|
report(text = '') {
|
||||||
let reason = prompt(`举报 #${this.state.info.pid} 的理由:`);
|
let reason = prompt(`举报 #${this.state.info.pid} 的理由:`, text);
|
||||||
if (reason !== null) {
|
if (reason !== null) {
|
||||||
API.report(this.state.info.pid, reason, this.props.token)
|
API.report(this.state.info.pid, reason, this.props.token)
|
||||||
.then((json) => {
|
.then((json) => {
|
||||||
@@ -554,6 +588,21 @@ class FlowSidebar extends PureComponent {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
block(name, type, id, on_complete) {
|
||||||
|
if (confirm(`确定拉黑${name}吗?后续将不会收到其发布的任何内容`)) {
|
||||||
|
API.block(type, id, this.props.token)
|
||||||
|
.then((json) => {
|
||||||
|
let data = json.data;
|
||||||
|
alert(`操作成功,其成为危险用户进度 ${data.curr}/${data.threshold}`)
|
||||||
|
!!on_complete && on_complete();
|
||||||
|
})
|
||||||
|
.catch((e) => {
|
||||||
|
alert('拉黑失败');
|
||||||
|
console.error(e)
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
set_filter_name(name) {
|
set_filter_name(name) {
|
||||||
this.setState((prevState) => ({
|
this.setState((prevState) => ({
|
||||||
filter_name: name === prevState.filter_name ? null : name,
|
filter_name: name === prevState.filter_name ? null : name,
|
||||||
@@ -674,6 +723,9 @@ class FlowSidebar extends PureComponent {
|
|||||||
do_edit_cw={this.make_do_edit_cw(this.props.token)}
|
do_edit_cw={this.make_do_edit_cw(this.props.token)}
|
||||||
do_edit_score={this.make_do_edit_score(this.props.token)}
|
do_edit_score={this.make_do_edit_score(this.props.token)}
|
||||||
do_vote={this.do_vote.bind(this)}
|
do_vote={this.do_vote.bind(this)}
|
||||||
|
do_block={() => {this.block(
|
||||||
|
'洞主', 'post', this.state.info.pid, () => {window.location.reload();}
|
||||||
|
)}}
|
||||||
/>
|
/>
|
||||||
</ClickHandler>
|
</ClickHandler>
|
||||||
);
|
);
|
||||||
@@ -763,7 +815,7 @@ class FlowSidebar extends PureComponent {
|
|||||||
条回复被删除
|
条回复被删除
|
||||||
</div>
|
</div>
|
||||||
)}
|
)}
|
||||||
{replies_to_show.map((reply, i) => (
|
{replies_to_show.map((reply, i) => !reply.blocked && (
|
||||||
<LazyLoad
|
<LazyLoad
|
||||||
key={i}
|
key={i}
|
||||||
offset={1500}
|
offset={1500}
|
||||||
@@ -789,6 +841,10 @@ class FlowSidebar extends PureComponent {
|
|||||||
: null
|
: null
|
||||||
}
|
}
|
||||||
do_delete={this.make_do_delete(this.props.token, this.load_replies.bind(this))}
|
do_delete={this.make_do_delete(this.props.token, this.load_replies.bind(this))}
|
||||||
|
do_block={() => {this.block(
|
||||||
|
reply.name, 'comment', reply.cid, this.load_replies.bind(this)
|
||||||
|
)}}
|
||||||
|
do_report={() => {this.report(`评论区${reply.name},评论id ${reply.cid}`)}}
|
||||||
/>
|
/>
|
||||||
</ClickHandler>
|
</ClickHandler>
|
||||||
</LazyLoad>
|
</LazyLoad>
|
||||||
@@ -988,7 +1044,7 @@ class FlowItemRow extends PureComponent {
|
|||||||
<p>{this.state.reply_error}</p>
|
<p>{this.state.reply_error}</p>
|
||||||
</div>
|
</div>
|
||||||
)}
|
)}
|
||||||
{this.state.replies.slice(0, PREVIEW_REPLY_COUNT).map((reply) => (
|
{this.state.replies.slice(0, PREVIEW_REPLY_COUNT).map((reply) => !reply.blocked && (
|
||||||
<Reply
|
<Reply
|
||||||
key={reply.cid}
|
key={reply.cid}
|
||||||
info={reply}
|
info={reply}
|
||||||
@@ -1159,7 +1215,7 @@ function FlowChunk(props) {
|
|||||||
{({ value: token }) => (
|
{({ value: token }) => (
|
||||||
<div className="flow-chunk">
|
<div className="flow-chunk">
|
||||||
{!!props.title && <TitleLine text={props.title} />}
|
{!!props.title && <TitleLine text={props.title} />}
|
||||||
{props.list.map((info, ind) => (
|
{props.list.map((info, ind) => !info.blocked && (
|
||||||
<LazyLoad
|
<LazyLoad
|
||||||
key={info.pid}
|
key={info.pid}
|
||||||
offset={500}
|
offset={500}
|
||||||
|
|||||||
@@ -99,6 +99,25 @@ export const API = {
|
|||||||
return handle_response(response, true);
|
return handle_response(response, true);
|
||||||
},
|
},
|
||||||
|
|
||||||
|
block: async (type, id, token) => {
|
||||||
|
let data = new URLSearchParams([
|
||||||
|
['type', type], ['id', id]
|
||||||
|
]);
|
||||||
|
let response = await fetch(
|
||||||
|
API_BASE + '/block',
|
||||||
|
{
|
||||||
|
method: 'POST',
|
||||||
|
headers: {
|
||||||
|
'Content-Type': 'application/x-www-form-urlencoded',
|
||||||
|
'User-Token': token,
|
||||||
|
},
|
||||||
|
body: data,
|
||||||
|
},
|
||||||
|
);
|
||||||
|
return handle_response(response, true);
|
||||||
|
},
|
||||||
|
|
||||||
|
|
||||||
del: async (type, id, note, token) => {
|
del: async (type, id, note, token) => {
|
||||||
let data = new URLSearchParams();
|
let data = new URLSearchParams();
|
||||||
data.append('type', type);
|
data.append('type', type);
|
||||||
|
|||||||
@@ -111,3 +111,7 @@
|
|||||||
.icon-trash:before {
|
.icon-trash:before {
|
||||||
content: "\1f5d1";
|
content: "\1f5d1";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.icon-block:before {
|
||||||
|
content: "\1F6C7";
|
||||||
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user