import { type LoaderFunctionArgs } from '@remix-run/node' import { Link, useLoaderData } from '@remix-run/react' import { useMemo } from 'react' import { startOidc } from '~/utils/oidc' export async function loader({ request }: LoaderFunctionArgs) { const issuer = process.env.OIDC_ISSUER const id = process.env.OIDC_CLIENT_ID const secret = process.env.OIDC_CLIENT_SECRET const normal = process.env.DISABLE_API_KEY_LOGIN if (issuer && (!id || !secret)) { throw new Error('An invalid OIDC configuration was provided') } const data = { oidc: issuer, apiKey: normal === undefined } if (!data.oidc && !data.apiKey) { throw new Error('No authentication method is enabled') } if (data.oidc && !data.apiKey) { // eslint-disable-next-line @typescript-eslint/no-non-null-assertion return startOidc(data.oidc, id!, request) } return data } export default function Page() { const data = useLoaderData() const showOr = useMemo(() => data.oidc && data.apiKey, [data]) return (

Login

{data.apiKey ? ( <>

Enter an API key to authenticate with Headplane. You can generate one by running {' '} headscale apikeys create {' '} in your terminal.

) : undefined} {showOr ? (

or
) : undefined} {data.oidc ? ( ) : undefined}
) }