import { LoaderFunctionArgs, useLoaderData } from "react-router-dom"; import { createProfilesSharesPageURL } from "#lib/urls"; import { parseOffset } from "#lib/pagination"; import { fetchProfileShares } from "#api/shares"; import { PageSkeleton } from "#components/pages"; import { Paginator } from "#components/pagination"; import { CardList, ShareCard } from "#components/cards"; import { validatePaysite } from "#entities/paysites"; import { IShare } from "#entities/files"; interface IProps { service: string; profileID: string; offset?: number; count: number; shares: IShare[]; } export function ProfileSharesPage() { const { service, profileID, count, offset, shares } = useLoaderData() as IProps; const title = "Filehaus"; const heading = "Filehaus"; return (
String(createProfilesSharesPageURL(service, profileID, offset)) } />
{!count ? (

Nobody here but us chickens!

There are no uploads.

) : ( shares.map((share) => ) )}
String(createProfilesSharesPageURL(service, profileID, offset)) } />
); } export async function loader({ params, request, }: LoaderFunctionArgs): Promise { const searchParams = new URL(request.url).searchParams; const service = params.service?.trim(); { if (!service) { throw new Error("Service name is required."); } validatePaysite(service); } const profileID = params.creator_id?.trim(); { if (!profileID) { throw new Error("Artist ID is required."); } } let offset: number | undefined = undefined; { const inputOffset = searchParams.get("o")?.trim(); if (inputOffset) { offset = parseOffset(inputOffset); } } const { results, props } = await fetchProfileShares( service, profileID, offset ); const { share_count } = props; return { service, profileID, shares: results, count: share_count, offset, }; }