import React, { useCallback, useEffect, useState } from 'react'; import { api } from './api.js'; import { copyToast } from './toast.js'; // amerc Mansion β€” a hall of amerc services. First live service: Showcase (reverse proxy). export default function Mansion({ auth, setRoute }) { if (!auth.ready) return

Loading…

; const loggedIn = !!auth.user; const handle = loggedIn ? auth.user.handle.toLowerCase().replace(/[^a-z0-9]/g, '') : 'you'; return (

The Mansion

A hall of amerc services that put your work on the open internet β€” each lives behind amerc's edge and is brought to life by your own broker. No servers to rent, no ports to forward.

{loggedIn ? {auth.user.handle}'s rooms are open : }
); } function RoomShell({ ico, name, tag, status, desc, feats, children }) { return (
{name} {tag}
{status === 'live' ? '● LIVE' : 'SOON'}

{desc}

{feats && } {children}
); } function SoonRoom(props) { return (
in development
); } function ShowcaseRoom({ loggedIn, handle, setRoute }) { const [list, setList] = useState([]); const [name, setName] = useState(''); const [created, setCreated] = useState(null); const [err, setErr] = useState(''); const [loaded, setLoaded] = useState(false); const load = useCallback(async () => { if (!loggedIn) return; try { const d = await api('/showcase'); setList(d.showcases || []); } catch (e) { setErr(e.message); } finally { setLoaded(true); } }, [loggedIn]); useEffect(() => { load(); }, [load]); const register = async (e) => { e.preventDefault(); setErr(''); try { const r = await api('/showcase', { method: 'POST', body: { name } }); setCreated(r); setName(''); load(); } catch (e2) { setErr(e2.message); } }; const del = async (id) => { if (!window.confirm('Delete this showcase?')) return; try { await api(`/showcase/${id}`, { method: 'DELETE' }); load(); } catch (e2) { setErr(e2.message); } }; return ( {!loggedIn ? (
show1.{handle}.amerc.ai
) : ( <>
register setName(e.target.value.toLowerCase().replace(/[^a-z0-9-]/g, ''))} required /> .{handle}.amerc.ai
{err &&

{err}

} {created && (

βœ… {created.host} reserved Β· DNS {created.dns}

{created.tls &&

πŸ”’ {created.tls}

}

In the kebab delivery center: connect a broker to the WS with this token, send {`{type:"bind",host:"${created.host}",port:}`}, and your local service is live at the public URL.

)}

My showcases

{!loaded ? ( ) : ( <> {list.map((s) => (
{s.host} registered {new Date(s.created_at).toLocaleDateString()}
))} {!list.length &&

No showcases yet β€” register one above.

} )}
)}
); }