import React, { useRef } from "react"; import useSWR, { useSWRConfig } from "swr"; import { AdminData } from "../api/adminsRoute.ts"; import { fetchApi, handleResponse } from "./apiClient.ts"; export function AdminsPage(props: { sessionId: string | null }) { const { sessionId } = props; const { mutate } = useSWRConfig(); const addDialogRef = useRef(null); const getSession = useSWR( sessionId ? ["sessions/{sessionId}", "GET", { params: { sessionId } }] as const : null, (args) => fetchApi(...args).then(handleResponse), ); const getUser = useSWR( getSession.data?.userId ? ["users/{userId}", "GET", { params: { userId: String(getSession.data.userId) } }] as const : null, (args) => fetchApi(...args).then(handleResponse), ); const getAdmins = useSWR( ["admins", "GET", {}] as const, (args) => fetchApi(...args).then(handleResponse), ); return ( <> {getUser.data && getAdmins.data && getAdmins.data.length === 0 && ( )} {getAdmins.data?.length ? ( ) : getAdmins.data?.length === 0 ?

No admins

: getAdmins.error ?

Loading admins failed

:
} {getUser.data?.admin && ( )} ); } function AddAdminDialog(props: { dialogRef: React.RefObject; sessionId: string | null; }) { const { dialogRef, sessionId } = props; const { mutate } = useSWRConfig(); return (
{ e.preventDefault(); const data = new FormData(e.target as HTMLFormElement); mutate( (key) => Array.isArray(key) && key[0] === "admins", async () => fetchApi("admins", "POST", { query: { sessionId: sessionId! }, body: { type: "application/json", data: { tgUserId: Number(data.get("tgUserId") as string), }, }, }).then(handleResponse), { populateCache: false }, ); dialogRef.current?.close(); }} >
); } function AdminListItem(props: { admin: AdminData; sessionId: string | null }) { const { admin, sessionId } = props; const deleteDialogRef = useRef(null); const getAdminUser = useSWR( ["users/{userId}", "GET", { params: { userId: String(admin.tgUserId) } }] as const, (args) => fetchApi(...args).then(handleResponse), ); const getSession = useSWR( sessionId ? ["sessions/{sessionId}", "GET", { params: { sessionId } }] as const : null, (args) => fetchApi(...args).then(handleResponse), ); const getUser = useSWR( getSession.data?.userId ? ["users/{userId}", "GET", { params: { userId: String(getSession.data.userId) } }] as const : null, (args) => fetchApi(...args).then(handleResponse), ); const getAdminPhoto = useSWR( ["users/{userId}/photo", "GET", { params: { userId: String(admin.tgUserId) } }] as const, (args) => fetchApi(...args).then(handleResponse).then((blob) => URL.createObjectURL(blob)), ); return (
{/* user avatar */} {getAdminUser.data ? ( getAdminPhoto.data ? ( avatar ) : (
{getAdminUser.data.first_name.at(0)?.toUpperCase()}
) ) : null}
{getAdminUser.data?.first_name ?? admin.id} {getAdminUser.data?.last_name}

{getAdminUser.data?.username ? ( @{getAdminUser.data.username} ) : null}

{getAdminUser.data?.bio ? (

{getAdminUser.data?.bio}

) : null}
{getUser.data?.admin && (

)}
); } function DeleteAdminDialog(props: { dialogRef: React.RefObject; adminId: string; sessionId: string | null; }) { const { dialogRef, adminId, sessionId } = props; const { mutate } = useSWRConfig(); return (
{ e.preventDefault(); mutate( (key) => Array.isArray(key) && key[0] === "admins", async () => fetchApi("admins/{adminId}", "DELETE", { query: { sessionId: sessionId! }, params: { adminId: adminId }, }).then(handleResponse), { populateCache: false }, ); dialogRef.current?.close(); }} >

Are you sure you want to delete this admin?

); }