From ef7aa3ff5a167a0885586366a7aad9a8d46ae8c2 Mon Sep 17 00:00:00 2001 From: Jannis Braun <151788261+TheZwiss@users.noreply.github.com> Date: Mon, 2 Mar 2026 23:31:28 +0100 Subject: [PATCH] feat: add instance store and Connected Instances settings UI MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Introduce instanceStore (Zustand) with full federation lifecycle: probe remote instances, register with username collision fallback, login to existing accounts, sync instance list across all connected instances, auto-reconnect from cached tokens on login/page load, and cleanup on logout. Add ConnectedInstances component to User Settings with home instance card, remote instance management, and inline add-instance flow (URL probe → register/login → connected). --- .../components/modals/ConnectedInstances.tsx | 337 +++++++++++++++++ .../src/components/modals/UserSettings.tsx | 4 + packages/web/src/stores/authStore.ts | 6 + packages/web/src/stores/instanceStore.ts | 343 ++++++++++++++++++ 4 files changed, 690 insertions(+) create mode 100644 packages/web/src/components/modals/ConnectedInstances.tsx create mode 100644 packages/web/src/stores/instanceStore.ts diff --git a/packages/web/src/components/modals/ConnectedInstances.tsx b/packages/web/src/components/modals/ConnectedInstances.tsx new file mode 100644 index 00000000..1f06ce30 --- /dev/null +++ b/packages/web/src/components/modals/ConnectedInstances.tsx @@ -0,0 +1,337 @@ +import React, { useState } from 'react'; +import type { InstanceInfoResponse } from '@backspace/shared'; +import { useInstanceStore } from '../../stores/instanceStore'; +import { useAuthStore } from '../../stores/authStore'; + +// ─── Status indicator ──────────────────────────────────────────────────────── + +function StatusDot({ status }: { status: string }) { + const colorClass = + status === 'connected' ? 'bg-status-online' : + status === 'connecting' ? 'bg-accent-amber' : + 'bg-txt-tertiary'; + + return
; +} + +// ─── Add Instance flow ─────────────────────────────────────────────────────── + +type AddStep = 'url' | 'auth' | 'done'; +type AuthTab = 'register' | 'login'; + +function AddInstanceFlow({ onDone }: { onDone: () => void }) { + const user = useAuthStore((s) => s.user); + const registerOnRemote = useInstanceStore((s) => s.registerOnRemote); + const loginToRemote = useInstanceStore((s) => s.loginToRemote); + const probeInstance = useInstanceStore((s) => s.probeInstance); + + const [step, setStep] = useState