| 
									
										
										
										
											2023-02-06 09:33:47 +01:00
										 |  |  | /* | 
					
						
							|  |  |  | 	GoToSocial | 
					
						
							| 
									
										
										
										
											2023-03-12 18:49:06 +01:00
										 |  |  | 	Copyright (C) GoToSocial Authors admin@gotosocial.org | 
					
						
							|  |  |  | 	SPDX-License-Identifier: AGPL-3.0-or-later | 
					
						
							| 
									
										
										
										
											2023-02-06 09:33:47 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	This program is free software: you can redistribute it and/or modify | 
					
						
							|  |  |  | 	it under the terms of the GNU Affero General Public License as published by | 
					
						
							|  |  |  | 	the Free Software Foundation, either version 3 of the License, or | 
					
						
							|  |  |  | 	(at your option) any later version. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	This program is distributed in the hope that it will be useful, | 
					
						
							|  |  |  | 	but WITHOUT ANY WARRANTY; without even the implied warranty of | 
					
						
							|  |  |  | 	MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | 
					
						
							|  |  |  | 	GNU Affero General Public License for more details. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	You should have received a copy of the GNU Affero General Public License | 
					
						
							|  |  |  | 	along with this program.  If not, see <http://www.gnu.org/licenses/>. | 
					
						
							|  |  |  | */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | "use strict"; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | const React = require("react"); | 
					
						
							|  |  |  | const { Link, Switch, Route } = require("wouter"); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | const query = require("../../lib/query"); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | const FormWithData = require("../../lib/form/form-with-data"); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | const ReportDetail = require("./detail"); | 
					
						
							|  |  |  | const Username = require("./username"); | 
					
						
							| 
									
										
										
										
											2023-03-29 12:18:45 +02:00
										 |  |  | const { useBaseUrl } = require("../../lib/navigation/util"); | 
					
						
							| 
									
										
										
										
											2023-02-06 09:33:47 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-03-29 12:18:45 +02:00
										 |  |  | module.exports = function Reports({ baseUrl }) { | 
					
						
							| 
									
										
										
										
											2023-02-06 09:33:47 +01:00
										 |  |  | 	return ( | 
					
						
							|  |  |  | 		<div className="reports"> | 
					
						
							|  |  |  | 			<Switch> | 
					
						
							|  |  |  | 				<Route path={`${baseUrl}/:reportId`}> | 
					
						
							| 
									
										
										
										
											2023-03-29 12:18:45 +02:00
										 |  |  | 					<ReportDetail /> | 
					
						
							| 
									
										
										
										
											2023-02-06 09:33:47 +01:00
										 |  |  | 				</Route> | 
					
						
							| 
									
										
										
										
											2023-03-29 12:18:45 +02:00
										 |  |  | 				<ReportOverview /> | 
					
						
							| 
									
										
										
										
											2023-02-06 09:33:47 +01:00
										 |  |  | 			</Switch> | 
					
						
							|  |  |  | 		</div> | 
					
						
							|  |  |  | 	); | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-03-29 12:18:45 +02:00
										 |  |  | function ReportOverview({ }) { | 
					
						
							| 
									
										
										
										
											2023-02-06 09:33:47 +01:00
										 |  |  | 	return ( | 
					
						
							|  |  |  | 		<> | 
					
						
							|  |  |  | 			<h1>Reports</h1> | 
					
						
							|  |  |  | 			<div> | 
					
						
							|  |  |  | 				<div className="info"> | 
					
						
							|  |  |  | 					<i className="fa fa-fw fa-exclamation-triangle" aria-hidden="true"></i> | 
					
						
							|  |  |  | 					<p> | 
					
						
							|  |  |  | 						<b>This interface is currently very limited</b>, only providing a basic overview. <br /> | 
					
						
							|  |  |  | 						Work is in progress on a more full-fledged moderation experience. | 
					
						
							|  |  |  | 					</p> | 
					
						
							|  |  |  | 				</div> | 
					
						
							|  |  |  | 				<p> | 
					
						
							|  |  |  | 					Here you can view and resolve reports made to your instance, originating from local and remote users. | 
					
						
							|  |  |  | 				</p> | 
					
						
							|  |  |  | 			</div> | 
					
						
							|  |  |  | 			<FormWithData | 
					
						
							|  |  |  | 				dataQuery={query.useListReportsQuery} | 
					
						
							|  |  |  | 				DataForm={ReportsList} | 
					
						
							|  |  |  | 			/> | 
					
						
							|  |  |  | 		</> | 
					
						
							|  |  |  | 	); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | function ReportsList({ data: reports }) { | 
					
						
							|  |  |  | 	return ( | 
					
						
							|  |  |  | 		<div className="list"> | 
					
						
							|  |  |  | 			{reports.map((report) => ( | 
					
						
							|  |  |  | 				<ReportEntry key={report.id} report={report} /> | 
					
						
							|  |  |  | 			))} | 
					
						
							|  |  |  | 		</div> | 
					
						
							|  |  |  | 	); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | function ReportEntry({ report }) { | 
					
						
							| 
									
										
										
										
											2023-03-29 12:18:45 +02:00
										 |  |  | 	const baseUrl = useBaseUrl(); | 
					
						
							| 
									
										
										
										
											2023-02-06 09:33:47 +01:00
										 |  |  | 	const from = report.account; | 
					
						
							|  |  |  | 	const target = report.target_account; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	let comment = report.comment.length > 200 | 
					
						
							|  |  |  | 		? report.comment.slice(0, 200) + "..." | 
					
						
							|  |  |  | 		: report.comment; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	return ( | 
					
						
							|  |  |  | 		<Link to={`${baseUrl}/${report.id}`}> | 
					
						
							|  |  |  | 			<a className={`report entry${report.action_taken ? " resolved" : ""}`}> | 
					
						
							|  |  |  | 				<div className="byline"> | 
					
						
							| 
									
										
										
										
											2023-02-09 09:26:35 +01:00
										 |  |  | 					<div className="usernames"> | 
					
						
							| 
									
										
										
										
											2023-02-06 09:33:47 +01:00
										 |  |  | 						<Username user={from} link={false} /> reported <Username user={target} link={false} /> | 
					
						
							|  |  |  | 					</div> | 
					
						
							|  |  |  | 					<h3 className="status"> | 
					
						
							|  |  |  | 						{report.action_taken ? "Resolved" : "Open"} | 
					
						
							|  |  |  | 					</h3> | 
					
						
							|  |  |  | 				</div> | 
					
						
							|  |  |  | 				<div className="details"> | 
					
						
							|  |  |  | 					<b>Created: </b> | 
					
						
							|  |  |  | 					<span>{new Date(report.created_at).toLocaleString()}</span> | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 					<b>Reason: </b> | 
					
						
							|  |  |  | 					{comment.length > 0 | 
					
						
							|  |  |  | 						? <p>{comment}</p> | 
					
						
							|  |  |  | 						: <i className="no-comment">none provided</i> | 
					
						
							|  |  |  | 					} | 
					
						
							|  |  |  | 				</div> | 
					
						
							|  |  |  | 			</a> | 
					
						
							|  |  |  | 		</Link> | 
					
						
							|  |  |  | 	); | 
					
						
							|  |  |  | } |