mirror of
				https://github.com/superseriousbusiness/gotosocial.git
				synced 2025-10-31 09:42:26 -05:00 
			
		
		
		
	
		
			
	
	
		
			140 lines
		
	
	
	
		
			3.4 KiB
		
	
	
	
		
			React
		
	
	
	
	
	
		
		
			
		
	
	
			140 lines
		
	
	
	
		
			3.4 KiB
		
	
	
	
		
			React
		
	
	
	
	
	
|  | /* | ||
|  | 	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> | ||
|  | 		</> | ||
|  | 	); | ||
|  | } |