import { Container, Heading, IconButton, Link, Table, TableCaption, TableContainer, Tbody, Td, Th, Thead, Tr, useToast, } from "@chakra-ui/react"; import { useLoaderData } from "@remix-run/react"; export function meta() { return [ { title: "Short Link Manager - Car Crushers", }, ]; } export async function loader({ context }: { context: RequestContext }) { const userId = context.data.current_user?.id; if (!userId) throw new Response(null, { status: 401, }); if ( typeof [0, 2, 4, 5, 6, 7, 9, 10, 11, 12].find( (i) => context.data.current_user.permissions & (1 << i), ) === "undefined" ) throw new Response(null, { status: 403, }); const { results } = await context.env.D1.prepare( "SELECT destination, path FROM short_links WHERE user = ?;", ) .bind(userId) .all(); return results as Record[]; } export default function () { const data = useLoaderData(); const toast = useToast(); async function deleteLink(path: string) { const deleteResp = await fetch( `/api/short-links/${encodeURIComponent(path)}`, { method: "DELETE", }, ); if (!deleteResp.ok) { let error = "Unknown error"; try { error = ((await deleteResp.json()) as { error: string }).error; } catch {} toast({ description: error, status: "error", title: "Failed to delete link", }); return; } toast({ description: `Link ${path} was successfully deleted.`, onCloseComplete: () => location.reload(), status: "success", title: "Deleted", }); } return ( Short Links Your short links {data.map((entry) => { return ( ); })}
Destination Code Delete
{entry.destination} { navigator.clipboard.writeText( encodeURIComponent( `https://carcrushe.rs/${entry.path}`, ), ); alert("Link copied"); }} > https://carcrushe.rs/{entry.path} } onClick={async () => await deleteLink(entry.path)} />
Create a new link
); }