mirror of
https://github.com/superseriousbusiness/gotosocial
synced 2025-06-05 21:59:39 +02:00
[feature] Admin accounts endpoints; approve/reject sign-ups (#2826)
* update settings panels, add pending overview + approve/deny functions * add admin accounts get, approve, reject * send approved/rejected emails * use signup URL * docs! * email * swagger * web linting * fix email tests * wee lil fixerinos * use new paging logic for GetAccounts() series of admin endpoints, small changes to query building * shuffle useAccountIDIn check *before* adding to query * fix parse from toot react error * use `netip.Addr` * put valid slices in globals * optimistic updates for account state --------- Co-authored-by: kim <grufwub@gmail.com>
This commit is contained in:
@ -1,48 +0,0 @@
|
||||
/*
|
||||
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/>.
|
||||
*/
|
||||
|
||||
const React = require("react");
|
||||
const { Error } = require("../error");
|
||||
|
||||
module.exports = function MutationButton({ label, result, disabled, showError = true, className = "", wrapperClassName = "", ...inputProps }) {
|
||||
let iconClass = "";
|
||||
const targetsThisButton = result.action == inputProps.name; // can also both be undefined, which is correct
|
||||
|
||||
if (targetsThisButton) {
|
||||
if (result.isLoading) {
|
||||
iconClass = "fa-spin fa-refresh";
|
||||
} else if (result.isSuccess) {
|
||||
iconClass = "fa-check fadeout";
|
||||
}
|
||||
}
|
||||
|
||||
return (<div className={wrapperClassName}>
|
||||
{(showError && targetsThisButton && result.error) &&
|
||||
<Error error={result.error} />
|
||||
}
|
||||
<button type="submit" className={"with-icon " + className} disabled={result.isLoading || disabled} {...inputProps}>
|
||||
<i className={`fa fa-fw ${iconClass}`} aria-hidden="true"></i>
|
||||
{(targetsThisButton && result.isLoading)
|
||||
? "Processing..."
|
||||
: label
|
||||
}
|
||||
</button>
|
||||
</div>
|
||||
);
|
||||
};
|
72
web/source/settings/components/form/mutation-button.tsx
Normal file
72
web/source/settings/components/form/mutation-button.tsx
Normal file
@ -0,0 +1,72 @@
|
||||
/*
|
||||
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 { Error } from "../error";
|
||||
|
||||
export interface MutationButtonProps extends React.DetailedHTMLProps<React.ButtonHTMLAttributes<HTMLButtonElement>, HTMLButtonElement> {
|
||||
label: string,
|
||||
result,
|
||||
disabled: boolean,
|
||||
showError?: boolean,
|
||||
className?: string,
|
||||
wrapperClassName?: string,
|
||||
}
|
||||
|
||||
export default function MutationButton({
|
||||
label,
|
||||
result,
|
||||
disabled,
|
||||
showError = true,
|
||||
className = "",
|
||||
wrapperClassName = "",
|
||||
...inputProps
|
||||
}: MutationButtonProps) {
|
||||
let iconClass = "";
|
||||
// Can also both be undefined, which is correct.
|
||||
const targetsThisButton = result.action == inputProps.name;
|
||||
|
||||
if (targetsThisButton) {
|
||||
if (result.isLoading) {
|
||||
iconClass = " fa-spin fa-refresh";
|
||||
} else if (result.isSuccess) {
|
||||
iconClass = " fa-check fadeout";
|
||||
}
|
||||
}
|
||||
|
||||
return (
|
||||
<div className={wrapperClassName}>
|
||||
{(showError && targetsThisButton && result.error) &&
|
||||
<Error error={result.error} />
|
||||
}
|
||||
<button
|
||||
type="submit"
|
||||
className={"with-icon " + className}
|
||||
disabled={result.isLoading || disabled}
|
||||
{...inputProps}
|
||||
>
|
||||
<i className={`fa fa-fw${iconClass}`} aria-hidden="true"></i>
|
||||
{(targetsThisButton && result.isLoading)
|
||||
? "Processing..."
|
||||
: label
|
||||
}
|
||||
</button>
|
||||
</div>
|
||||
);
|
||||
}
|
Reference in New Issue
Block a user