import type { ActionArgs, LoaderArgs, MetaFunction } from '@remix-run/node'; import { json, redirect } from '@remix-run/node'; import { Form, useActionData, useLoaderData, useNavigate, useParams } from '@remix-run/react'; import * as React from 'react'; import { Group, Button, PasswordInput, Modal, Alert, Text } from '@mantine/core'; import { AlertTriangle, Lock, Trash } from 'react-feather'; import { requireUser } from '~/session.server'; import { deleteUserByEmail, deleteUserById, getUserById, verifyLogin } from '~/models/user.server'; import invariant from 'tiny-invariant'; export async function loader({ request, params }: LoaderArgs) { invariant(params.userId, 'userId is required'); const loggedUser = await requireUser(request); if (!loggedUser || !loggedUser.admin) return redirect('/login'); const user = await getUserById(params.userId); return json({ user }); } export async function action({ request, params }: ActionArgs) { invariant(params.userId, 'userId is required'); const loggedUser = await requireUser(request); if (!loggedUser || !loggedUser.admin) return redirect('/login?redirectTo=/users'); if (request.method !== 'DELETE') { return json( { errors: { request: 'Invalid request' } }, { status: 422 } ); } const user = await getUserById(params.userId); if (!user) { return json( { errors: { request: 'User not found' } }, { status: 404 } ); } await deleteUserById(user.id); return redirect('/users'); } export const meta: MetaFunction = () => { return { title: 'Users | WorkTimer', description: 'Manage users and their permissions. Delete users and their data.' }; }; export default function AccountDelete() { const loaderData = useLoaderData(); const navigate = useNavigate(); return ( navigate('/users')} title="Delete user"> } radius="md" mb="md" title="Are you sure?" > This action cannot be undone. All of the user's data will be permanently deleted. User: {loaderData.user?.email}
); }