RPS Digital P3 Intake Archive Apps.Downloads.$Token source
Imported React file from ../../app/app/routes/apps.downloads.$token.tsx.
Source file
../../app/app/routes/apps.downloads.$token.tsx
React61 lines
import { json, type LoaderFunctionArgs } from '@remix-run/node';import { useLoaderData } from '@remix-run/react';import { getEntitlementByToken, getAssetsByRelease } from '../db.server';import { getSignedUrl } from '../storage.server';export async function loader({ params }: LoaderFunctionArgs) {const token = params.token || '';const entitlement = getEntitlementByToken(token);if (!entitlement) {return json({ error: 'Invalid token' }, { status: 404 });}const expiresAtMs = Date.parse(String(entitlement.expires_at || ''));if (!Number.isFinite(expiresAtMs)) {return json({ error: 'Invalid token' }, { status: 404 });}if (expiresAtMs <= Date.now()) {return json({ error: 'Expired token' }, { status: 410 });}if (!entitlement.release_id || entitlement.release_id === 'unknown-release') {return json({ error: 'Invalid entitlement release mapping' }, { status: 404 });}const assets = getAssetsByRelease(entitlement.release_id);if (!assets.length) {return json({ error: 'No downloadable assets available for this entitlement' }, { status: 404 });}const urls = await Promise.all(assets.map(async (asset: any) => ({key: asset.key,label: asset.variant_label,url: await getSignedUrl(asset.key, 24 * 60 * 60),})));return json({ entitlement, urls });}export default function DownloadPage() {const data = useLoaderData<typeof loader>();if ('error' in data) {return <div>Invalid or expired link.</div>;}return (<div style={{ fontFamily: 'system-ui', padding: '2rem' }}><h1>Your Digital Downloads</h1><p>Links will expire in 24 hours.</p><ul>{data.urls.map((item: { key: string; url: string; label: string }) => (<li key={item.key}><a href={item.url} rel="noreferrer">{item.label}</a></li>))}</ul></div>);}