import { useEffect, useState } from 'react'; import { useParams, Link } from 'react-router-dom'; import { api } from '../api/client'; import type { Remote } from '../api/types'; import { Badge } from '../components/Badge'; import './RemoteDetail.css'; export function RemoteDetail() { const { name } = useParams<{ name: string }>(); const [remote, setRemote] = useState(null); const [error, setError] = useState(null); useEffect(() => { if (!name) return; api.getRemote(name) .then(setRemote) .catch(e => setError(e.message)); }, [name]); if (error) return
{error}
; if (!remote) return
Loading...
; return (
← Remotes

{remote.name}

{remote.package_type} {remote.managed_by && managed by {remote.managed_by}}
{remote.description && (

{remote.description}

)}

Configuration

Base URL
{remote.base_url}
Immutable TTL
{remote.immutable_ttl === 0 ? 'forever' : `${remote.immutable_ttl}s`}
Mutable TTL
{remote.mutable_ttl}s
Conditional Revalidation
{remote.check_mutable ? 'enabled' : 'disabled'}
Stale on Error
{remote.stale_on_error ? 'enabled' : 'disabled'}
{remote.releases_remote && ( <>
Releases Remote
{remote.releases_remote}
)}

Access Control

Patterns
{remote.patterns?.length ? : none (proxy all)}
Blocklist
{remote.blocklist?.length ? : none}

Classification Overrides

Mutable
{remote.mutable_patterns?.length ? : provider defaults only}
Immutable
{remote.immutable_patterns?.length ? : provider defaults only}
{remote.ban_tags_enabled && (

Tag Banning

Banned Tags
)}
Browse Objects
); } function PatternList({ patterns }: { patterns: string[] }) { return ( ); }