diff --git a/packages/components/src/api/beta_key/CreateBetaKey.ts b/packages/components/src/api/beta_key/CreateBetaKey.ts
new file mode 100644
index 0000000000..6a7e8ff02f
--- /dev/null
+++ b/packages/components/src/api/beta_key/CreateBetaKey.ts
@@ -0,0 +1,22 @@
+import MakeRequest from "../MakeRequest";
+
+export interface CreateBetaKeyRequest {
+ maybe_referrer_username: string;
+ number_of_keys: number;
+ uuid_idempotency_token: string;
+}
+
+export interface CreateBetaKeyResponse {
+ beta_keys: string[];
+ success: boolean;
+}
+
+export const CreateBetaKey = MakeRequest<
+ string,
+ CreateBetaKeyRequest,
+ CreateBetaKeyResponse,
+ {}
+>({
+ method: "POST",
+ routingFunction: () => "/v1/beta_keys/new",
+});
diff --git a/packages/fakeyou.com/src/components/layout/PageHeader/PageHeader.tsx b/packages/fakeyou.com/src/components/layout/PageHeader/PageHeader.tsx
index f384c77af7..0d93d9f316 100644
--- a/packages/fakeyou.com/src/components/layout/PageHeader/PageHeader.tsx
+++ b/packages/fakeyou.com/src/components/layout/PageHeader/PageHeader.tsx
@@ -116,7 +116,10 @@ export default function PageHeader({
>
{titleH2 ? (
-
{title}
+
+ {icon}
+ {title}
+
) : (
{icon}
diff --git a/packages/fakeyou.com/src/scss/site-refresh.scss b/packages/fakeyou.com/src/scss/site-refresh.scss
index b4db175f82..0c9ed0db47 100644
--- a/packages/fakeyou.com/src/scss/site-refresh.scss
+++ b/packages/fakeyou.com/src/scss/site-refresh.scss
@@ -244,6 +244,10 @@ styles with important tags:
padding-left: var(--bs-gutter-x, 1rem);
}
+ .narrow-container {
+ max-width: 900px !important;
+ }
+
.py-6 {
padding-top: 1.6rem !important;
padding-bottom: 0.4rem !important;
diff --git a/packages/fakeyou.com/src/v2/view/PageContainer.tsx b/packages/fakeyou.com/src/v2/view/PageContainer.tsx
index ba8ec2fd30..04e89c44ab 100644
--- a/packages/fakeyou.com/src/v2/view/PageContainer.tsx
+++ b/packages/fakeyou.com/src/v2/view/PageContainer.tsx
@@ -135,6 +135,7 @@ import DashboardPage from "./pages/dashboard/DashboardPage";
import DevUploadAlt from "./pages/dev_upload/DevUploadAlt";
import { ModerationTokenInfoPage } from "./pages/moderation/ModerationTokenInfoPage";
import StyleVideo from "./pages/style-video";
+import CreateBetaKeyPage from "./pages/beta_key/CreateBetaKeyPage";
interface Props {
sessionWrapper: SessionWrapper;
@@ -1124,6 +1125,10 @@ class PageContainer extends React.Component<
/>
+
+
+
+
{/*
//
// (null);
+ const [alertType, setAlertType] = useState<"success" | "danger" | null>(null);
+ const [generatedKeys, setGeneratedKeys] = useState([]);
+ const [loading, setLoading] = useState(false);
+ const { canBanUsers } = useSession();
+
+ const getUser = useCallback(async (username: string) => {
+ const response = await GetUserByUsername(username);
+ if (GetUserByUsernameIsOk(response)) {
+ return true;
+ } else if (GetUserByUsernameIsErr(response)) {
+ switch (response) {
+ case UserLookupError.NotFound:
+ setAlertMessage("Failed to create beta key(s). Username not found.");
+ setAlertType("danger");
+ setGeneratedKeys([]);
+ break;
+ default:
+ setAlertMessage("Failed to create beta key(s). Username not found.");
+ setAlertType("danger");
+ setGeneratedKeys([]);
+ break;
+ }
+ return false;
+ }
+ }, []);
+
+ const handleCreateBetaKey = async () => {
+ try {
+ setLoading(true);
+ const userExists = await getUser(username);
+ if (!userExists) {
+ setLoading(false);
+ return;
+ }
+
+ const response = await CreateBetaKey("", {
+ maybe_referrer_username: username,
+ number_of_keys: numberOfKeys,
+ uuid_idempotency_token: uuidv4(),
+ });
+
+ if (response.success) {
+ setAlertMessage(
+ `Successfully created ${response.beta_keys.length} beta key(s):`
+ );
+ setAlertType("success");
+ setGeneratedKeys(response.beta_keys);
+ } else {
+ setAlertMessage("Failed to create beta key(s).");
+ setAlertType("danger");
+ setGeneratedKeys([]);
+ }
+ } catch (error) {
+ console.error("Error creating beta keys:", error);
+ setAlertMessage("An error occurred while creating beta key(s).");
+ setAlertType("danger");
+ setGeneratedKeys([]);
+ } finally {
+ setLoading(false);
+ }
+ };
+
+ if (!canBanUsers()) {
+ return (
+
+
+
+ );
+ }
+
+ return (
+
+
+
+
+
setUsername(e.target.value)}
+ required={true}
+ />
+ setNumberOfKeys(Number(e.target.value))}
+ defaultValue={1}
+ required={true}
+ />
+
+
+
+
+
+
+
+ {alertMessage && (
+
+ {alertMessage}
+ {generatedKeys.length > 0 && (
+
+
+ {generatedKeys.map((key, index) => (
+ - {key}
+ ))}
+
+
+ )}
+
+ )}
+
+ );
+}