mirror of
				https://github.com/superseriousbusiness/gotosocial.git
				synced 2025-10-31 15:22:26 -05:00 
			
		
		
		
	[frontend] Basic user moderation actions (#1728)
* remove info banner * update swagger definition for AccountAction * basic user view, suspend action * clean up suspended user display * basic user searching * rename User -> Account for clarity * refactor error boundary component to give better info * appease the linter
This commit is contained in:
		
					parent
					
						
							
								b47661f033
							
						
					
				
			
			
				commit
				
					
						89dcbd5a20
					
				
			
		
					 16 changed files with 419 additions and 37 deletions
				
			
		
							
								
								
									
										140
									
								
								web/source/settings/admin/accounts/index.jsx
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										140
									
								
								web/source/settings/admin/accounts/index.jsx
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,140 @@ | |||
| /* | ||||
| 	GoToSocial | ||||
| 	Copyright (C) GoToSocial Authors admin@gotosocial.org | ||||
| 	SPDX-License-Identifier: AGPL-3.0-or-later | ||||
| 
 | ||||
| 	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 { Switch, Route, Link } = require("wouter"); | ||||
| 
 | ||||
| const query = require("../../lib/query"); | ||||
| const { useTextInput } = require("../../lib/form"); | ||||
| 
 | ||||
| const AccountDetail = require("./detail"); | ||||
| const { useBaseUrl } = require("../../lib/navigation/util"); | ||||
| const { Error } = require("../../components/error"); | ||||
| 
 | ||||
| module.exports = function Accounts({ baseUrl }) { | ||||
| 	return ( | ||||
| 		<div className="accounts"> | ||||
| 			<Switch> | ||||
| 				<Route path={`${baseUrl}/:accountId`}> | ||||
| 					<AccountDetail /> | ||||
| 				</Route> | ||||
| 				<AccountOverview /> | ||||
| 			</Switch> | ||||
| 		</div> | ||||
| 	); | ||||
| }; | ||||
| 
 | ||||
| function AccountOverview({ }) { | ||||
| 	return ( | ||||
| 		<> | ||||
| 			<h1>Accounts</h1> | ||||
| 			<div> | ||||
| 				Pending <a href="https://github.com/superseriousbusiness/gotosocial/issues/581">#581</a>, | ||||
| 				there is currently no way to list accounts.<br /> | ||||
| 				You can perform actions on reported accounts by clicking their name in the report, or searching for a username below. | ||||
| 			</div> | ||||
| 
 | ||||
| 			<AccountSearchForm /> | ||||
| 		</> | ||||
| 	); | ||||
| } | ||||
| 
 | ||||
| function AccountSearchForm() { | ||||
| 	const [searchAccount, result] = query.useSearchAccountMutation(); | ||||
| 
 | ||||
| 	const [onAccountChange, _resetAccount, { account }] = useTextInput("account"); | ||||
| 
 | ||||
| 	function submitSearch(e) { | ||||
| 		e.preventDefault(); | ||||
| 		if (account.trim().length != 0) { | ||||
| 			searchAccount(account); | ||||
| 		} | ||||
| 	} | ||||
| 
 | ||||
| 	return ( | ||||
| 		<div className="account-search"> | ||||
| 			<form onSubmit={submitSearch}> | ||||
| 				<div className="form-field text"> | ||||
| 					<label htmlFor="url"> | ||||
| 						Account: | ||||
| 					</label> | ||||
| 					<div className="row"> | ||||
| 						<input | ||||
| 							type="text" | ||||
| 							id="account" | ||||
| 							name="account" | ||||
| 							onChange={onAccountChange} | ||||
| 							value={account} | ||||
| 						/> | ||||
| 						<button disabled={result.isLoading}> | ||||
| 							<i className={[ | ||||
| 								"fa fa-fw", | ||||
| 								(result.isLoading | ||||
| 									? "fa-refresh fa-spin" | ||||
| 									: "fa-search") | ||||
| 							].join(" ")} aria-hidden="true" title="Search" /> | ||||
| 							<span className="sr-only">Search</span> | ||||
| 						</button> | ||||
| 					</div> | ||||
| 				</div> | ||||
| 			</form> | ||||
| 			<AccountList | ||||
| 				isSuccess={result.isSuccess} | ||||
| 				data={result.data} | ||||
| 				isError={result.isError} | ||||
| 				error={result.error} | ||||
| 			/> | ||||
| 		</div> | ||||
| 	); | ||||
| } | ||||
| 
 | ||||
| function AccountList({ isSuccess, data, isError, error }) { | ||||
| 	const baseUrl = useBaseUrl(); | ||||
| 
 | ||||
| 	if (!(isSuccess || isError)) { | ||||
| 		return null; | ||||
| 	} | ||||
| 
 | ||||
| 	if (error) { | ||||
| 		return <Error error={error} />; | ||||
| 	} | ||||
| 
 | ||||
| 	if (data.length == 0) { | ||||
| 		return <b>No accounts found that match your query</b>; | ||||
| 	} | ||||
| 
 | ||||
| 	return ( | ||||
| 		<> | ||||
| 			<h2>Results:</h2> | ||||
| 			<div className="list"> | ||||
| 				{data.map((acc) => ( | ||||
| 					<Link key={acc.acct} className="account entry" to={`${baseUrl}/${acc.id}`}> | ||||
| 						{acc.display_name?.length > 0 | ||||
| 							? acc.display_name | ||||
| 							: acc.username | ||||
| 						} | ||||
| 						<span id="username">(@{acc.acct})</span> | ||||
| 					</Link> | ||||
| 				))} | ||||
| 			</div> | ||||
| 		</> | ||||
| 	); | ||||
| } | ||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue