refactor(web): rename Organisation to Instance

This commit is contained in:
2026-07-24 14:01:19 +01:00
parent 3f0f12b111
commit b70ccc97d4
8 changed files with 76 additions and 76 deletions
+17 -17
View File
@@ -8,17 +8,17 @@ import { Button, Card } from "@/components/ui";
const MIN_PASSWORD_LENGTH = 8;
/**
* Org hosts are `<slug>.vantage.<rest>` and the apex is `vantage.<rest>` (see
* auth.hostSlug on the server). Build the new org's URL by prepending or
* Instance hosts are `<slug>.vantage.<rest>` and the apex is `vantage.<rest>` (see
* auth.hostSlug on the server). Build the new instance's URL by prepending or
* replacing the leftmost label. Hosts that don't match that shape (localhost,
* bare IPs) have no per-org subdomain, so stay put.
* bare IPs) have no per-instance subdomain, so stay put.
*
* Setup runs on the apex, and the session cookie it sets is scoped to that
* exact host by design org hosts must not share cookies. So the new owner is
* sent to the org host's *login* page to sign in there, which is what puts a
* session cookie on the host their org actually lives on.
* exact host by design instance hosts must not share cookies. So the new owner is
* sent to the instance host's *login* page to sign in there, which is what puts a
* session cookie on the host their instance actually lives on.
*/
function orgLoginUrlForSlug(slug: string): string {
function instanceLoginUrlForSlug(slug: string): string {
if (typeof window === "undefined") return "/login";
const { protocol, host } = window.location;
const [hostname, port] = host.split(":");
@@ -34,7 +34,7 @@ function orgLoginUrlForSlug(slug: string): string {
}
export default function SetupPage() {
const [orgName, setOrgName] = useState("");
const [instanceName, setInstanceName] = useState("");
const [email, setEmail] = useState("");
const [password, setPassword] = useState("");
const [confirm, setConfirm] = useState("");
@@ -54,9 +54,9 @@ export default function SetupPage() {
isPending,
error,
} = useMutation({
mutationFn: () => auth.bootstrap({ org_name: orgName, email, password }),
mutationFn: () => auth.bootstrap({ instance_name: instanceName, email, password }),
onSuccess: (res) => {
setCreated({ slug: res.slug, loginUrl: orgLoginUrlForSlug(res.slug) });
setCreated({ slug: res.slug, loginUrl: instanceLoginUrlForSlug(res.slug) });
},
});
@@ -83,13 +83,13 @@ export default function SetupPage() {
<div className="flex min-h-screen items-center justify-center bg-background p-4">
<div className="w-full max-w-md">
<div className="mb-8 text-center">
<h1 className="text-xl font-semibold text-text-primary">Organization created</h1>
<h1 className="text-xl font-semibold text-text-primary">Instance created</h1>
<p className="mt-1 text-sm text-text-secondary">Your owner account is ready. One more step to finish signing in.</p>
</div>
<Card>
<p className="text-sm text-text-secondary">
{created.slug} has its own address, and sign-in is kept separate per organization. Continue to your organization&apos;s sign-in page and log in with the email and password
{created.slug} has its own address, and sign-in is kept separate per instance. Continue to your instance&apos;s sign-in page and log in with the email and password
you just chose.
</p>
<code className="mt-3 block overflow-x-auto rounded bg-surface-2 px-2 py-1.5 font-mono text-xs text-text-primary">{created.loginUrl}</code>
@@ -109,17 +109,17 @@ export default function SetupPage() {
<div className="w-full max-w-md">
<div className="mb-8 text-center">
<h1 className="text-xl font-semibold text-text-primary">Welcome to Vantage</h1>
<p className="mt-1 text-sm text-text-secondary">Create your organization and its owner account to get started.</p>
<p className="mt-1 text-sm text-text-secondary">Create your instance and its owner account to get started.</p>
</div>
<Card>
<form onSubmit={handleSubmit} className="space-y-4">
<div>
<label htmlFor="org" className="mb-1.5 block text-sm font-medium text-text-secondary">
Organization name
<label htmlFor="instance" className="mb-1.5 block text-sm font-medium text-text-secondary">
Instance name
</label>
<input id="org" type="text" required value={orgName} onChange={(e) => setOrgName(e.target.value)} className={inputClass} />
<p className="mt-1 text-xs text-text-tertiary">Used to derive your organization&apos;s subdomain.</p>
<input id="instance" type="text" required value={instanceName} onChange={(e) => setInstanceName(e.target.value)} className={inputClass} />
<p className="mt-1 text-xs text-text-tertiary">Used to derive your instance&apos;s subdomain.</p>
</div>
<div>