import * as React from "react"; import type { MetaFunction } from "react-router"; import { Form, Link, useFetcher, useLoaderData, useNavigation, useSearchParams, } from "react-router"; import { Avatar } from "~/components/Avatar"; import { Catcher } from "~/components/Catcher"; import { SendouButton } from "~/components/elements/Button"; import { SendouSelect, SendouSelectItem } from "~/components/elements/Select"; import { SendouTab, SendouTabList, SendouTabPanel, SendouTabs, } from "~/components/elements/Tabs"; import { UserSearch } from "~/components/elements/UserSearch"; import { FormMessage } from "~/components/FormMessage"; import { Input } from "~/components/Input"; import { SearchIcon } from "~/components/icons/Search"; import { Main } from "~/components/Main"; import { SubmitButton } from "~/components/SubmitButton"; import { SEED_VARIATIONS } from "~/features/api-private/constants"; import { FRIEND_CODE_REGEXP_PATTERN } from "~/features/sendouq/q-constants"; import { useHasRole } from "~/modules/permissions/hooks"; import { metaTags } from "~/utils/remix"; import { impersonateUrl, SEED_URL, STOP_IMPERSONATING_URL, userPage, } from "~/utils/urls"; import { action } from "../actions/admin.server"; import { DANGEROUS_CAN_ACCESS_DEV_CONTROLS } from "../core/dev-controls"; import { loader } from "../loaders/admin.server"; export { loader, action }; export const meta: MetaFunction = (args) => { return metaTags({ title: "Admin Panel", location: args.location, }); }; export default function AdminPage() { return (
Actions Friend code look-up
); } function FriendCodeLookUp() { const data = useLoaderData(); const [searchParams, setSearchParams] = useSearchParams(); const [friendCode, setFriendCode] = React.useState( searchParams.get("friendCode") ?? "", ); const fetcher = useFetcher(); return (
setFriendCode(e.target.value)} /> } onPress={() => setSearchParams({ friendCode })} > Search
{data.friendCodeSearchUsers?.map((user) => ( {user.username} ))}
); } function AdminActions() { const isStaff = useHasRole("STAFF"); const isAdmin = useHasRole("ADMIN"); return (
{DANGEROUS_CAN_ACCESS_DEV_CONTROLS && } {DANGEROUS_CAN_ACCESS_DEV_CONTROLS || isAdmin ? : null} {isStaff ? : null} {isStaff ? : null} {isStaff ? : null} {isAdmin ? : null} {isAdmin ? : null} {isStaff ? : null} {isStaff ? : null} {isAdmin ? : null} {isStaff ? : null} {isStaff ? : null} {isAdmin ? : null} {isAdmin ? : null}
); } function Impersonate() { const [userId, setUserId] = React.useState(); const { isImpersonating } = useLoaderData(); return (

Impersonate user

setUserId(newUser?.id)} />
Go {isImpersonating ? ( Stop impersonating ) : null}
); } function MigrateUser() { const [oldUserId, setOldUserId] = React.useState(); const [newUserId, setNewUserId] = React.useState(); const navigation = useNavigation(); const fetcher = useFetcher(); return (

Migrate user data

setOldUserId(newUser?.id)} /> setNewUserId(newUser?.id)} />
Migrate
Note: data on "New user" will be deleted (e.g. builds)
); } function LinkPlayer() { const fetcher = useFetcher(); return (

Link player

Link player
); } function GiveArtist() { const fetcher = useFetcher(); return (

Add as artist

Add as artist
); } function GiveVideoAdder() { const fetcher = useFetcher(); return (

Give video adder

Add as video adder
); } function GiveTournamentOrganizer() { const fetcher = useFetcher(); return (

Give tournament organizer

Add as tournament organizer
); } function GiveApiAccess() { const fetcher = useFetcher(); return (

Give API access

Grant API access
); } function UpdateFriendCode() { const fetcher = useFetcher(); const id = React.useId(); return (

Update friend code

Submit
); } function ForcePatron() { const fetcher = useFetcher(); return (

Force patron

Save
); } function BanUser() { const fetcher = useFetcher(); return (

Ban user

Save
); } function UnbanUser() { const fetcher = useFetcher(); return (

Unban user

Save
); } function RefreshPlusTiers() { const fetcher = useFetcher(); return (

Refresh Plus Tiers

Refresh
); } function CleanUp() { const fetcher = useFetcher(); return (

DB Clean up

Clean up
); } function Seed() { const fetcher = useFetcher(); return (
Seed {SEED_VARIATIONS.map((variation) => ( {variation} ))}
); } export const ErrorBoundary = Catcher;