mirror of
https://github.com/superseriousbusiness/gotosocial.git
synced 2025-11-30 09:03:33 -06:00
[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
This commit is contained in:
parent
1edcb06afe
commit
725a21b027
30 changed files with 1473 additions and 432 deletions
|
|
@ -23,51 +23,89 @@ import { useGetAccountQuery } from "../../../../lib/query/admin";
|
|||
import FormWithData from "../../../../lib/form/form-with-data";
|
||||
import FakeProfile from "../../../../components/fake-profile";
|
||||
import { AdminAccount } from "../../../../lib/types/account";
|
||||
import { HandleSignup } from "./handlesignup";
|
||||
import { AccountActions } from "./actions";
|
||||
import { useParams } from "wouter";
|
||||
import { useBaseUrl } from "../../../../lib/navigation/util";
|
||||
import BackButton from "../../../../components/back-button";
|
||||
import { UseOurInstanceAccount, yesOrNo } from "./util";
|
||||
|
||||
export default function AccountDetail() {
|
||||
const params: { accountID: string } = useParams();
|
||||
|
||||
const baseUrl = useBaseUrl();
|
||||
const backLocation: String = history.state?.backLocation ?? `~${baseUrl}`;
|
||||
|
||||
return (
|
||||
<div className="account-detail">
|
||||
<h1>Account Details</h1>
|
||||
<h1><BackButton to={backLocation} /> Account Details</h1>
|
||||
<FormWithData
|
||||
dataQuery={useGetAccountQuery}
|
||||
queryArg={params.accountID}
|
||||
DataForm={AccountDetailForm}
|
||||
{...{ backLocation: backLocation }}
|
||||
/>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
|
||||
interface AccountDetailFormProps {
|
||||
backLocation: string,
|
||||
data: AdminAccount,
|
||||
data: AdminAccount;
|
||||
backLocation: string;
|
||||
}
|
||||
|
||||
function AccountDetailForm({ data: adminAcct, backLocation }: AccountDetailFormProps) {
|
||||
let yesOrNo = (b: boolean) => {
|
||||
return b ? "yes" : "no";
|
||||
};
|
||||
function AccountDetailForm({ data: adminAcct, backLocation }: AccountDetailFormProps) {
|
||||
// If this is our instance account, don't
|
||||
// bother returning detailed account information.
|
||||
const ourInstanceAccount = UseOurInstanceAccount(adminAcct);
|
||||
if (ourInstanceAccount) {
|
||||
return (
|
||||
<>
|
||||
<FakeProfile {...adminAcct.account} />
|
||||
<div className="info">
|
||||
<i className="fa fa-fw fa-info-circle" aria-hidden="true"></i>
|
||||
<b>
|
||||
This is the service account for your instance; you
|
||||
cannot perform moderation actions on this account.
|
||||
</b>
|
||||
</div>
|
||||
</>
|
||||
);
|
||||
}
|
||||
|
||||
let created = new Date(adminAcct.created_at).toDateString();
|
||||
const local = !adminAcct.domain;
|
||||
return (
|
||||
<>
|
||||
<FakeProfile {...adminAcct.account} />
|
||||
<GeneralAccountDetails adminAcct={adminAcct} />
|
||||
{
|
||||
// Only show local account details
|
||||
// if this is a local account!
|
||||
local && <LocalAccountDetails adminAcct={adminAcct} />
|
||||
}
|
||||
<AccountActions
|
||||
account={adminAcct}
|
||||
backLocation={backLocation}
|
||||
/>
|
||||
</>
|
||||
);
|
||||
}
|
||||
|
||||
function GeneralAccountDetails({ adminAcct } : { adminAcct: AdminAccount }) {
|
||||
const local = !adminAcct.domain;
|
||||
const created = new Date(adminAcct.created_at).toDateString();
|
||||
|
||||
let lastPosted = "never";
|
||||
if (adminAcct.account.last_status_at) {
|
||||
lastPosted = new Date(adminAcct.account.last_status_at).toDateString();
|
||||
}
|
||||
const local = !adminAcct.domain;
|
||||
|
||||
return (
|
||||
<>
|
||||
<FakeProfile {...adminAcct.account} />
|
||||
<h3>General Account Details</h3>
|
||||
{ adminAcct.suspended &&
|
||||
<div className="info">
|
||||
<i className="fa fa-fw fa-info-circle" aria-hidden="true"></i>
|
||||
<b>Account is suspended.</b>
|
||||
</div>
|
||||
{ adminAcct.suspended &&
|
||||
<div className="info">
|
||||
<i className="fa fa-fw fa-info-circle" aria-hidden="true"></i>
|
||||
<b>Account is suspended.</b>
|
||||
</div>
|
||||
}
|
||||
<dl className="info-list">
|
||||
{ !local &&
|
||||
|
|
@ -75,6 +113,18 @@ function AccountDetailForm({ data: adminAcct, backLocation }: AccountDetailFormP
|
|||
<dt>Domain</dt>
|
||||
<dd>{adminAcct.domain}</dd>
|
||||
</div>}
|
||||
<div className="info-list-entry">
|
||||
<dt>Profile URL</dt>
|
||||
<dd>
|
||||
<a
|
||||
href={adminAcct.account.url}
|
||||
target="_blank"
|
||||
rel="noreferrer"
|
||||
>
|
||||
<i className="fa fa-fw fa-external-link" aria-hidden="true"></i> {adminAcct.account.url} (opens in a new tab)
|
||||
</a>
|
||||
</dd>
|
||||
</div>
|
||||
<div className="info-list-entry">
|
||||
<dt>Created</dt>
|
||||
<dd><time dateTime={adminAcct.created_at}>{created}</time></dd>
|
||||
|
|
@ -104,61 +154,54 @@ function AccountDetailForm({ data: adminAcct, backLocation }: AccountDetailFormP
|
|||
<dd>{adminAcct.account.following_count}</dd>
|
||||
</div>
|
||||
</dl>
|
||||
{ local &&
|
||||
// Only show local account details
|
||||
// if this is a local account!
|
||||
<>
|
||||
<h3>Local Account Details</h3>
|
||||
{ !adminAcct.approved &&
|
||||
</>
|
||||
);
|
||||
}
|
||||
|
||||
function LocalAccountDetails({ adminAcct }: { adminAcct: AdminAccount }) {
|
||||
return (
|
||||
<>
|
||||
<h3>Local Account Details</h3>
|
||||
{ !adminAcct.approved &&
|
||||
<div className="info">
|
||||
<i className="fa fa-fw fa-info-circle" aria-hidden="true"></i>
|
||||
<b>Account is pending.</b>
|
||||
</div>
|
||||
}
|
||||
{ !adminAcct.confirmed &&
|
||||
}
|
||||
{ !adminAcct.confirmed &&
|
||||
<div className="info">
|
||||
<i className="fa fa-fw fa-info-circle" aria-hidden="true"></i>
|
||||
<b>Account email not yet confirmed.</b>
|
||||
</div>
|
||||
}
|
||||
<dl className="info-list">
|
||||
<div className="info-list-entry">
|
||||
<dt>Email</dt>
|
||||
<dd>{adminAcct.email} {<b>{adminAcct.confirmed ? "(confirmed)" : "(not confirmed)"}</b> }</dd>
|
||||
</div>
|
||||
<div className="info-list-entry">
|
||||
<dt>Disabled</dt>
|
||||
<dd>{yesOrNo(adminAcct.disabled)}</dd>
|
||||
</div>
|
||||
<div className="info-list-entry">
|
||||
<dt>Approved</dt>
|
||||
<dd>{yesOrNo(adminAcct.approved)}</dd>
|
||||
</div>
|
||||
<div className="info-list-entry">
|
||||
<dt>Sign-Up Reason</dt>
|
||||
<dd>{adminAcct.invite_request ?? <i>none provided</i>}</dd>
|
||||
</div>
|
||||
{ (adminAcct.ip && adminAcct.ip !== "0.0.0.0") &&
|
||||
}
|
||||
<dl className="info-list">
|
||||
<div className="info-list-entry">
|
||||
<dt>Email</dt>
|
||||
<dd>{adminAcct.email} {<b>{adminAcct.confirmed ? "(confirmed)" : "(not confirmed)"}</b> }</dd>
|
||||
</div>
|
||||
<div className="info-list-entry">
|
||||
<dt>Disabled</dt>
|
||||
<dd>{yesOrNo(adminAcct.disabled)}</dd>
|
||||
</div>
|
||||
<div className="info-list-entry">
|
||||
<dt>Approved</dt>
|
||||
<dd>{yesOrNo(adminAcct.approved)}</dd>
|
||||
</div>
|
||||
<div className="info-list-entry">
|
||||
<dt>Sign-Up Reason</dt>
|
||||
<dd>{adminAcct.invite_request ?? <i>none provided</i>}</dd>
|
||||
</div>
|
||||
{ (adminAcct.ip && adminAcct.ip !== "0.0.0.0") &&
|
||||
<div className="info-list-entry">
|
||||
<dt>Sign-Up IP</dt>
|
||||
<dd>{adminAcct.ip}</dd>
|
||||
</div> }
|
||||
{ adminAcct.locale &&
|
||||
{ adminAcct.locale &&
|
||||
<div className="info-list-entry">
|
||||
<dt>Locale</dt>
|
||||
<dd>{adminAcct.locale}</dd>
|
||||
</div> }
|
||||
</dl>
|
||||
</> }
|
||||
{ local && !adminAcct.approved
|
||||
?
|
||||
<HandleSignup
|
||||
account={adminAcct}
|
||||
backLocation={backLocation}
|
||||
/>
|
||||
:
|
||||
<AccountActions account={adminAcct} />
|
||||
}
|
||||
</>
|
||||
</dl>
|
||||
</>
|
||||
);
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue