From 725a21b02721f92ed0420ed3f807ee921de77992 Mon Sep 17 00:00:00 2001
From: tobi <31960611+tsmethurst@users.noreply.github.com>
Date: Wed, 1 May 2024 15:11:22 +0200
Subject: [feature] Page through accounts as moderator (#2881)

* [feature] Page through accounts as moderator

* aaaaa

* use COLLATE "C" for Postgres to ensure same ordering as SQLite

* fix typo, test paging up

* don't show moderation / info for our instance acct
---
 web/source/settings/components/username.tsx | 90 +++++++++++++++++++++++++++++
 1 file changed, 90 insertions(+)
 create mode 100644 web/source/settings/components/username.tsx

(limited to 'web/source/settings/components/username.tsx')

diff --git a/web/source/settings/components/username.tsx b/web/source/settings/components/username.tsx
new file mode 100644
index 000000000..f7be1cd4a
--- /dev/null
+++ b/web/source/settings/components/username.tsx
@@ -0,0 +1,90 @@
+/*
+	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/>.
+*/
+
+import React from "react";
+import { useLocation } from "wouter";
+import { AdminAccount } from "../lib/types/account";
+
+interface UsernameProps {
+	account: AdminAccount;
+	linkTo?: string;
+	backLocation?: string;
+	classNames?: string[];
+}
+
+export default function Username({ account, linkTo, backLocation, classNames }: UsernameProps) {
+	const [ _location, setLocation ] = useLocation();
+	
+	let className = "username-lozenge";
+	let isLocal = account.domain == null;
+
+	if (account.suspended) {
+		className += " suspended";
+	}
+
+	if (isLocal) {
+		className += " local";
+	}
+
+	if (classNames) {
+		className = [ className, classNames ].flat().join(" ");
+	}
+
+	let icon = isLocal
+		? { fa: "fa-home", info: "Local user" }
+		: { fa: "fa-external-link-square", info: "Remote user" };
+
+	const content = (
+		<>
+			<i className={`fa fa-fw ${icon.fa}`} aria-hidden="true" title={icon.info} />
+			<span className="sr-only">{icon.info}</span>
+			&nbsp;
+			<span className="acct">@{account.account.acct}</span>
+		</>
+	);
+
+	if (linkTo) {
+		className += " spanlink";
+		return (
+			<span
+				className={className}
+				onClick={() => {
+					// When clicking on an account, direct
+					// to the detail view for that account.
+					setLocation(linkTo, {
+						// Store the back location in history so
+						// the detail view can use it to return to
+						// this page (including query parameters).
+						state: { backLocation: backLocation }
+					});
+				}}
+				role="link"
+				tabIndex={0}
+			>
+				{content}
+			</span>
+		);
+	} else {
+		return (
+			<div className={className}>
+				{content}
+			</div>
+		);
+	}
+}
-- 
cgit v1.2.3

