import type { Meta, StoryObj } from "@storybook/react-vite"; import { MoonlightPairing } from "@/sections/Pairing/MoonlightPairingCard"; import { NativePairingCard } from "@/sections/Pairing/NativePairingCard"; import { PairedDevices } from "@/sections/Pairing/PairedDevices"; import { PendingDevices } from "@/sections/Pairing/PendingDevices"; import { PairingView } from "@/sections/Pairing/view"; import { nativeClients, nativePairArmed, pairedClients, pairingIdle, pendingDevices, } from "./lib/fixtures"; const noop = () => {}; const idle = { isLoading: false, error: null, refetch: noop }; // Renders the REAL page layout (PairingView) — the same component index.tsx uses. The live page // fills its slots with the self-contained containers; here we fill them with the pure cards + mock // state, so there's no duplicated composition to drift. const meta = { title: "Pages/Pairing", component: PairingView, parameters: { layout: "padded" }, } satisfies Meta; export default meta; type Story = StoryObj; // The marketing state: one device knocking for delegated approval, a PIN armed for a phone, the // consolidated paired-devices list (native + Moonlight), idle Moonlight pairing. export const Armed: Story = { args: { pending: ( ), native: ( ), moonlight: ( ), paired: ( ({ protocol: "native" as const, fingerprint: c.fingerprint, name: c.name, })), ...pairedClients.map((c) => ({ protocol: "moonlight" as const, fingerprint: c.fingerprint, name: c.subject ?? "", })), ]} isLoading={false} error={null} refetch={noop} onUnpair={noop} isUnpairing={false} /> ), }, };