import { useLoaderData, json, redirect, useOutletContext } from "remix"; import type { LoaderFunction } from 'remix'; import styles from "~/styles/syntax/show.css"; import { padNumber } from "~/utils/pad"; export interface Show { number: number; title: string; html: string; url: string; } // incoordination with useMatches() export const handle = { // object you can put anything in. } // Action // Handle data, mutations, or other actions. // Same api as a loader, called when a post, put, patch, delete request is made. export function action() { // Most common use if for forms. } // Sets the meta data for a route export function meta() { return { title: "The Syntax Podcast", "og:title": "The Syntax Podcast", } } export function headers() { // return http headers // most comming user is caching } // Set tags for this page. export function links() { return [ { rel: "stylesheet", href: styles } ]; } // Server only loader function export let loader: LoaderFunction = async ({ params }) => { let showNumber = params.show; if (showNumber?.length < 3) { showNumber = padNumber(showNumber); return redirect(`/syntax/${showNumber}`, 301); } const response = await fetch('https://syntax.fm/api/shows/' + showNumber) const show = await response.json(); if(!show.url) { // Throw a 404 throw json("Not found", { status: 404 }); } return show; } export default function() { const show = useLoaderData(); const { podcastName } = useOutletContext(); return (

{podcastName}

#{show.number}: {show.title}

) }