import { useState } from 'react'; import type { Meta, StoryObj } from '@storybook/react-vite'; import HeaderMapEditor, { type HeaderMapValue } from './HeaderMapEditor'; const meta = { title: 'Form/HeaderMapEditor', component: HeaderMapEditor, tags: ['autodocs'], parameters: { layout: 'padded', docs: { description: { component: 'Row-based editor for Xray HTTP header maps, used in the inbound/outbound stream forms. Mode `v1` emits one string per header name (WS / HTTPUpgrade / Hysteria masquerade); mode `v2` emits string arrays so headers can repeat (TCP HTTP camouflage request/response).', }, }, }, argTypes: { mode: { description: 'Wire shape: `v1` = string per name, `v2` = string[] per name (repeatable headers).', }, value: { description: 'Header map in the wire shape matching `mode`; converted to editable rows internally.', }, onChange: { description: 'Called with the rebuilt wire-shape map after every row edit, add, or remove.', }, }, } satisfies Meta; export default meta; type Story = StoryObj; export const Empty: Story = { args: { mode: 'v1', onChange: () => undefined }, }; export const WsHostHeaders: Story = { args: { mode: 'v1', value: { Host: 'cdn.example.com', 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36', }, onChange: () => undefined, }, }; export const TcpCamouflageRequest: Story = { args: { mode: 'v2', value: { Accept: ['text/html,application/xhtml+xml', 'application/json'], 'Accept-Encoding': ['gzip, deflate'], Connection: ['keep-alive'], Pragma: ['no-cache'], }, onChange: () => undefined, }, }; function WireShapeDemo() { const [value, setValue] = useState({ Accept: ['text/html', 'application/json'], 'X-Forwarded-For': ['203.0.113.7'], }); return (
        {JSON.stringify(value ?? {}, null, 2)}
      
); } export const LiveWireShape: Story = { args: { mode: 'v2', onChange: () => undefined }, render: () => , };