import { MagnifyingGlassIcon } from "@heroicons/react/20/solid"; import { Form } from "@remix-run/react"; import { typedjson, useTypedLoaderData } from "remix-typedjson"; import { z } from "zod"; import { Button, LinkButton } from "~/components/primitives/Buttons"; import { CopyableText } from "~/components/primitives/CopyableText"; import { Input } from "~/components/primitives/Input"; import { PaginationControls } from "~/components/primitives/Pagination"; import { Paragraph } from "~/components/primitives/Paragraph"; import { Table, TableBlankRow, TableBody, TableCell, TableHeader, TableHeaderCell, TableRow, } from "~/components/primitives/Table"; import { adminGetUsers, redirectWithImpersonation } from "~/models/admin.server"; import { dashboardAction, dashboardLoader } from "~/services/routeBuilders/dashboardBuilder"; import { createSearchParams } from "~/utils/searchParams"; export const SearchParams = z.object({ page: z.coerce.number().optional(), search: z.string().optional(), }); export type SearchParams = z.infer; export const loader = dashboardLoader( { authorization: { requireSuper: true } }, async ({ user, request }) => { const searchParams = createSearchParams(request.url, SearchParams); if (!searchParams.success) { throw new Error(searchParams.error); } const result = await adminGetUsers(user.id, searchParams.params.getAll()); return typedjson(result); } ); const FormSchema = z.object({ id: z.string() }); export const action = dashboardAction( { authorization: { requireSuper: true } }, async ({ request }) => { if (request.method.toLowerCase() !== "post") { return new Response("Method not allowed", { status: 405 }); } const payload = Object.fromEntries(await request.formData()); const { id } = FormSchema.parse(payload); return redirectWithImpersonation(request, id, "/"); } ); export default function AdminDashboardRoute() { const { users, filters, page, pageCount } = useTypedLoaderData(); return (
Email Orgs GitHub id Created Admin? Actions {users.length === 0 ? ( No users found for search ) : ( users.map((user) => { return ( {user.orgMemberships.map((org) => ( {org.organization.title} ({org.organization.slug}) {org.organization.deletedAt ? " (☠️)" : ""} ))} {user.displayName} {user.admin ? "✅" : ""}
); }) )}
); }