@openmarketsai/order-sheet 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +201 -0
- package/NOTICE +5 -0
- package/README.md +183 -0
- package/dist/auth.d.ts +24 -0
- package/dist/auth.js +36 -0
- package/dist/auth.js.map +1 -0
- package/dist/client.d.ts +158 -0
- package/dist/client.js +253 -0
- package/dist/client.js.map +1 -0
- package/dist/errors.d.ts +34 -0
- package/dist/errors.js +34 -0
- package/dist/errors.js.map +1 -0
- package/dist/generated/contract.d.ts +28 -0
- package/dist/generated/contract.js +176 -0
- package/dist/generated/contract.js.map +1 -0
- package/dist/http.d.ts +19 -0
- package/dist/http.js +58 -0
- package/dist/http.js.map +1 -0
- package/dist/index.cjs +1742 -0
- package/dist/index.d.ts +41 -0
- package/dist/index.js +31 -0
- package/dist/index.js.map +1 -0
- package/dist/math.d.ts +22 -0
- package/dist/math.js +55 -0
- package/dist/math.js.map +1 -0
- package/dist/messages.d.ts +21 -0
- package/dist/messages.js +97 -0
- package/dist/messages.js.map +1 -0
- package/dist/odds.d.ts +12 -0
- package/dist/odds.js +33 -0
- package/dist/odds.js.map +1 -0
- package/dist/quote.d.ts +20 -0
- package/dist/quote.js +117 -0
- package/dist/quote.js.map +1 -0
- package/dist/react.cjs +2137 -0
- package/dist/react.d.ts +157 -0
- package/dist/react.js +297 -0
- package/dist/react.js.map +1 -0
- package/dist/sheet.d.ts +77 -0
- package/dist/sheet.js +648 -0
- package/dist/sheet.js.map +1 -0
- package/dist/stream.d.ts +71 -0
- package/dist/stream.js +160 -0
- package/dist/stream.js.map +1 -0
- package/dist/types.d.ts +287 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/dist/ui/styles.css +284 -0
- package/dist/ui/theme.d.ts +108 -0
- package/dist/ui/theme.js +180 -0
- package/dist/ui/theme.js.map +1 -0
- package/dist/ui.cjs +2606 -0
- package/dist/ui.d.ts +124 -0
- package/dist/ui.js +154 -0
- package/dist/ui.js.map +1 -0
- package/dist/validate.d.ts +20 -0
- package/dist/validate.js +126 -0
- package/dist/validate.js.map +1 -0
- package/dist/venues.d.ts +19 -0
- package/dist/venues.js +103 -0
- package/dist/venues.js.map +1 -0
- package/dist/wire.d.ts +382 -0
- package/dist/wire.js +2 -0
- package/dist/wire.js.map +1 -0
- package/package.json +78 -0
package/dist/react.d.ts
ADDED
|
@@ -0,0 +1,157 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @openmarketsai/order-sheet/react — hooks + UNSTYLED primitives.
|
|
3
|
+
*
|
|
4
|
+
* const h = useOrderSheet(om, { liquidityHash }) // subscribes; re-renders on state
|
|
5
|
+
* <OrderSheet.Root handle={h}>
|
|
6
|
+
* <OrderSheet.Venues /> <OrderSheet.Mode /> <OrderSheet.Stake />
|
|
7
|
+
* <OrderSheet.Quote /> <OrderSheet.Issues /> <OrderSheet.Submit />
|
|
8
|
+
* </OrderSheet.Root>
|
|
9
|
+
*
|
|
10
|
+
* Every primitive renders a plain element carrying `data-oms-part="…"` plus state
|
|
11
|
+
* attributes (`data-phase`, `data-mode`, `data-state`, `data-best`, …) and no
|
|
12
|
+
* class of its own, so a Tailwind user styles them with
|
|
13
|
+
* `[data-oms-part=submit][data-mode=real]:bg-red-600`. Each takes `className`,
|
|
14
|
+
* spreads the rest onto its element, and accepts `render` / `children` to swap
|
|
15
|
+
* the markup while keeping the wiring.
|
|
16
|
+
*/
|
|
17
|
+
import { type ComponentPropsWithoutRef, type ReactNode } from 'react';
|
|
18
|
+
import type { OrderSheetClient } from './client.js';
|
|
19
|
+
import { type Sheet, type SheetInit } from './sheet.js';
|
|
20
|
+
import type { AccountFacts, Issue, MoneyMode, OrderType, PlaceOutcome, PositionRef, PreflightSnapshot, SheetPatch, SheetState, StakeUnit, VenueOption } from './types.js';
|
|
21
|
+
import type { OrderSheetError } from './errors.js';
|
|
22
|
+
export * from './index.js';
|
|
23
|
+
export declare function OrderSheetProvider({ client, children }: {
|
|
24
|
+
client: OrderSheetClient;
|
|
25
|
+
children: ReactNode;
|
|
26
|
+
}): import("react/jsx-runtime").JSX.Element;
|
|
27
|
+
export declare function useOrderSheetClient(): OrderSheetClient;
|
|
28
|
+
export interface OrderSheetHandle extends SheetState {
|
|
29
|
+
sheet: Sheet;
|
|
30
|
+
select: (partnerId: string | null) => void;
|
|
31
|
+
set: (patch: SheetPatch) => void;
|
|
32
|
+
setStake: (value: number | null, unit?: StakeUnit) => void;
|
|
33
|
+
setMode: (mode: MoneyMode) => void;
|
|
34
|
+
setOrderType: (t: OrderType) => void;
|
|
35
|
+
setMaxPrice: (p: number | null) => void;
|
|
36
|
+
place: (opts?: Parameters<Sheet['place']>[0]) => Promise<PlaceOutcome>;
|
|
37
|
+
confirm: () => Promise<PlaceOutcome>;
|
|
38
|
+
cancelConfirm: () => void;
|
|
39
|
+
cancel: () => Promise<{
|
|
40
|
+
cancelled: string[];
|
|
41
|
+
skipped: string[];
|
|
42
|
+
}>;
|
|
43
|
+
/** Ask the server for exact fees / fill / checks now (the state's `preflight` is the last answer). */
|
|
44
|
+
runPreflight: (opts?: {
|
|
45
|
+
verifyLiquidity?: boolean;
|
|
46
|
+
}) => Promise<PreflightSnapshot | null>;
|
|
47
|
+
reset: () => void;
|
|
48
|
+
refresh: () => Promise<void>;
|
|
49
|
+
}
|
|
50
|
+
/** Subscribe to a sheet's state. */
|
|
51
|
+
export declare function useSheetState(sheet: Sheet): SheetState;
|
|
52
|
+
export declare function isSheet(x: unknown): x is Sheet;
|
|
53
|
+
/**
|
|
54
|
+
* Open a sheet for a position and follow it. One sheet per (client, position);
|
|
55
|
+
* re-keyed when the position changes; destroyed on unmount.
|
|
56
|
+
*
|
|
57
|
+
* The sheet is opened in an EFFECT, never during render: rendering has no side
|
|
58
|
+
* effects, so server rendering fetches nothing and starts no timer, and a render
|
|
59
|
+
* React discards (concurrent rendering, Suspense retries) leaves nothing behind.
|
|
60
|
+
* Until the effect runs the handle is an inert `loading` sheet whose actions are
|
|
61
|
+
* no-ops (placing answers `not_ready`). StrictMode's mount → unmount → mount
|
|
62
|
+
* opens, destroys and re-opens — the surviving sheet is the second one.
|
|
63
|
+
*
|
|
64
|
+
* Pass an existing `Sheet` instead of a ref to follow one you opened yourself
|
|
65
|
+
* (it is then yours to destroy).
|
|
66
|
+
*/
|
|
67
|
+
export declare function useOrderSheet(client: OrderSheetClient | null | undefined, ref: PositionRef | Sheet, init?: SheetInit): OrderSheetHandle;
|
|
68
|
+
/** The account's money modes, practice wallet and policy — for a mode switch before any position is open. */
|
|
69
|
+
export declare function useOrderSheetAccount(client?: OrderSheetClient | null): {
|
|
70
|
+
account: AccountFacts | null;
|
|
71
|
+
loading: boolean;
|
|
72
|
+
error: OrderSheetError | null;
|
|
73
|
+
refresh: () => Promise<void>;
|
|
74
|
+
};
|
|
75
|
+
export declare function useOrderSheetHandle(): OrderSheetHandle;
|
|
76
|
+
type DivProps = ComponentPropsWithoutRef<'div'>;
|
|
77
|
+
type FormProps = ComponentPropsWithoutRef<'form'>;
|
|
78
|
+
export interface RootProps extends Omit<FormProps, 'onSubmit'> {
|
|
79
|
+
handle: OrderSheetHandle;
|
|
80
|
+
/** Called after a successful submit (the default onSubmit places the order). */
|
|
81
|
+
onOutcome?: (outcome: PlaceOutcome) => void;
|
|
82
|
+
onPlaceError?: (error: OrderSheetError) => void;
|
|
83
|
+
}
|
|
84
|
+
export interface VenuesProps extends Omit<DivProps, 'children'> {
|
|
85
|
+
/** Replace the row markup; the wiring (select on click, data attributes) stays on the wrapper. */
|
|
86
|
+
render?: (venue: VenueOption, handle: OrderSheetHandle) => ReactNode;
|
|
87
|
+
/** Hide venues the current mode cannot use (default: show them, blocked, with the reason). */
|
|
88
|
+
hideBlocked?: boolean;
|
|
89
|
+
}
|
|
90
|
+
/**
|
|
91
|
+
* Which venue a key press moves to: arrows step through the ENABLED venues
|
|
92
|
+
* (wrapping), Home/End jump to the first/last. From no selection, forward keys
|
|
93
|
+
* land on the first enabled venue and backward keys on the last. Null = no move.
|
|
94
|
+
*/
|
|
95
|
+
export declare function venueKeyTarget(key: string, venues: VenueOption[], fromPartnerId: string | null): VenueOption | null;
|
|
96
|
+
/** The one venue in the tab order: the selected one, else the first enabled one (else the first). */
|
|
97
|
+
export declare function tabbableVenueId(venues: VenueOption[]): string | null;
|
|
98
|
+
declare function Venues({ render, hideBlocked, ...rest }: VenuesProps): import("react/jsx-runtime").JSX.Element;
|
|
99
|
+
export interface ModeProps extends DivProps {
|
|
100
|
+
labels?: {
|
|
101
|
+
paper?: string;
|
|
102
|
+
real?: string;
|
|
103
|
+
};
|
|
104
|
+
}
|
|
105
|
+
declare function Mode({ labels, ...rest }: ModeProps): import("react/jsx-runtime").JSX.Element;
|
|
106
|
+
declare function OrderTypeToggle(props: DivProps): import("react/jsx-runtime").JSX.Element;
|
|
107
|
+
export interface StakeProps extends Omit<ComponentPropsWithoutRef<'input'>, 'value' | 'onChange'> {
|
|
108
|
+
label?: string;
|
|
109
|
+
/** Show the $ / shares unit toggle. */
|
|
110
|
+
unitToggle?: boolean;
|
|
111
|
+
/** Render only the <input> (you supply the label). */
|
|
112
|
+
bare?: boolean;
|
|
113
|
+
}
|
|
114
|
+
declare function Stake({ label, unitToggle, bare, id, ...rest }: StakeProps): import("react/jsx-runtime").JSX.Element;
|
|
115
|
+
export interface PriceProps extends Omit<ComponentPropsWithoutRef<'input'>, 'value' | 'onChange'> {
|
|
116
|
+
label?: string;
|
|
117
|
+
/** Render only the <input> (you supply the label and the reset). */
|
|
118
|
+
bare?: boolean;
|
|
119
|
+
}
|
|
120
|
+
/** The limit / max price, in probability (0.01–0.99). Shown for limit orders; for market orders it is the auto ceiling. */
|
|
121
|
+
declare function Price({ label, bare, id, ...rest }: PriceProps): import("react/jsx-runtime").JSX.Element;
|
|
122
|
+
export interface QuoteProps extends DivProps {
|
|
123
|
+
render?: (handle: OrderSheetHandle) => ReactNode;
|
|
124
|
+
}
|
|
125
|
+
declare function Quote({ render, ...rest }: QuoteProps): import("react/jsx-runtime").JSX.Element;
|
|
126
|
+
export interface IssuesProps extends DivProps {
|
|
127
|
+
/** Which severities to show (default: all). */
|
|
128
|
+
severities?: Array<Issue['severity']>;
|
|
129
|
+
render?: (issue: Issue, handle: OrderSheetHandle) => ReactNode;
|
|
130
|
+
}
|
|
131
|
+
declare function Issues({ severities, render, ...rest }: IssuesProps): import("react/jsx-runtime").JSX.Element;
|
|
132
|
+
export interface SubmitProps extends Omit<ComponentPropsWithoutRef<'button'>, 'children'> {
|
|
133
|
+
children?: ReactNode | ((handle: OrderSheetHandle) => ReactNode);
|
|
134
|
+
}
|
|
135
|
+
declare function Submit({ children, ...rest }: SubmitProps): import("react/jsx-runtime").JSX.Element;
|
|
136
|
+
export interface HintProps extends DivProps {
|
|
137
|
+
render?: (venue: VenueOption, handle: OrderSheetHandle) => ReactNode;
|
|
138
|
+
}
|
|
139
|
+
/** "Better price on X — switch?" — a suggestion the USER acts on; the sheet never auto-switches. */
|
|
140
|
+
declare function Hint({ render, ...rest }: HintProps): import("react/jsx-runtime").JSX.Element | null;
|
|
141
|
+
export interface OutcomeProps extends DivProps {
|
|
142
|
+
render?: (handle: OrderSheetHandle) => ReactNode;
|
|
143
|
+
}
|
|
144
|
+
declare function Outcome({ render, ...rest }: OutcomeProps): import("react/jsx-runtime").JSX.Element | null;
|
|
145
|
+
export declare const OrderSheet: {
|
|
146
|
+
Root: import("react").ForwardRefExoticComponent<RootProps & import("react").RefAttributes<HTMLFormElement>>;
|
|
147
|
+
Venues: typeof Venues;
|
|
148
|
+
Mode: typeof Mode;
|
|
149
|
+
OrderType: typeof OrderTypeToggle;
|
|
150
|
+
Stake: typeof Stake;
|
|
151
|
+
Price: typeof Price;
|
|
152
|
+
Quote: typeof Quote;
|
|
153
|
+
Issues: typeof Issues;
|
|
154
|
+
Submit: typeof Submit;
|
|
155
|
+
Hint: typeof Hint;
|
|
156
|
+
Outcome: typeof Outcome;
|
|
157
|
+
};
|
package/dist/react.js
ADDED
|
@@ -0,0 +1,297 @@
|
|
|
1
|
+
import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
/**
|
|
3
|
+
* @openmarketsai/order-sheet/react — hooks + UNSTYLED primitives.
|
|
4
|
+
*
|
|
5
|
+
* const h = useOrderSheet(om, { liquidityHash }) // subscribes; re-renders on state
|
|
6
|
+
* <OrderSheet.Root handle={h}>
|
|
7
|
+
* <OrderSheet.Venues /> <OrderSheet.Mode /> <OrderSheet.Stake />
|
|
8
|
+
* <OrderSheet.Quote /> <OrderSheet.Issues /> <OrderSheet.Submit />
|
|
9
|
+
* </OrderSheet.Root>
|
|
10
|
+
*
|
|
11
|
+
* Every primitive renders a plain element carrying `data-oms-part="…"` plus state
|
|
12
|
+
* attributes (`data-phase`, `data-mode`, `data-state`, `data-best`, …) and no
|
|
13
|
+
* class of its own, so a Tailwind user styles them with
|
|
14
|
+
* `[data-oms-part=submit][data-mode=real]:bg-red-600`. Each takes `className`,
|
|
15
|
+
* spreads the rest onto its element, and accepts `render` / `children` to swap
|
|
16
|
+
* the markup while keeping the wiring.
|
|
17
|
+
*/
|
|
18
|
+
import { createContext, forwardRef, useCallback, useContext, useEffect, useId, useMemo, useRef, useState, useSyncExternalStore, } from 'react';
|
|
19
|
+
import { createInertSheet } from './sheet.js';
|
|
20
|
+
export * from './index.js';
|
|
21
|
+
// ─── Client context ────────────────────────────────────────────────────────────
|
|
22
|
+
const ClientContext = createContext(null);
|
|
23
|
+
export function OrderSheetProvider({ client, children }) {
|
|
24
|
+
return _jsx(ClientContext.Provider, { value: client, children: children });
|
|
25
|
+
}
|
|
26
|
+
export function useOrderSheetClient() {
|
|
27
|
+
const c = useContext(ClientContext);
|
|
28
|
+
if (!c)
|
|
29
|
+
throw new Error('useOrderSheetClient: wrap the tree in <OrderSheetProvider client={…}> or pass a client explicitly.');
|
|
30
|
+
return c;
|
|
31
|
+
}
|
|
32
|
+
function refKey(ref) {
|
|
33
|
+
if ('position' in ref)
|
|
34
|
+
return `pos:${ref.position.position_hash}:${ref.partnerId ?? ''}`;
|
|
35
|
+
if ('liquidityHash' in ref)
|
|
36
|
+
return `lh:${ref.liquidityHash}`;
|
|
37
|
+
return `ph:${ref.positionHash}:${ref.partnerId ?? ''}`;
|
|
38
|
+
}
|
|
39
|
+
/** Subscribe to a sheet's state. */
|
|
40
|
+
export function useSheetState(sheet) {
|
|
41
|
+
return useSyncExternalStore(sheet.subscribe, sheet.getState, sheet.getState);
|
|
42
|
+
}
|
|
43
|
+
export function isSheet(x) {
|
|
44
|
+
return typeof x === 'object' && x !== null && typeof x.getState === 'function' && typeof x.subscribe === 'function';
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Open a sheet for a position and follow it. One sheet per (client, position);
|
|
48
|
+
* re-keyed when the position changes; destroyed on unmount.
|
|
49
|
+
*
|
|
50
|
+
* The sheet is opened in an EFFECT, never during render: rendering has no side
|
|
51
|
+
* effects, so server rendering fetches nothing and starts no timer, and a render
|
|
52
|
+
* React discards (concurrent rendering, Suspense retries) leaves nothing behind.
|
|
53
|
+
* Until the effect runs the handle is an inert `loading` sheet whose actions are
|
|
54
|
+
* no-ops (placing answers `not_ready`). StrictMode's mount → unmount → mount
|
|
55
|
+
* opens, destroys and re-opens — the surviving sheet is the second one.
|
|
56
|
+
*
|
|
57
|
+
* Pass an existing `Sheet` instead of a ref to follow one you opened yourself
|
|
58
|
+
* (it is then yours to destroy).
|
|
59
|
+
*/
|
|
60
|
+
export function useOrderSheet(client, ref, init) {
|
|
61
|
+
const ctx = useContext(ClientContext);
|
|
62
|
+
const om = client ?? ctx;
|
|
63
|
+
const given = isSheet(ref) ? ref : null;
|
|
64
|
+
if (!om && !given)
|
|
65
|
+
throw new Error('useOrderSheet: pass a client or wrap the tree in <OrderSheetProvider>.');
|
|
66
|
+
const key = given ? 'given' : refKey(ref);
|
|
67
|
+
// Track the ref/init for the next opening without re-opening on identity changes.
|
|
68
|
+
const latest = useRef({ ref, init });
|
|
69
|
+
latest.current = { ref, init };
|
|
70
|
+
const [opened, setOpened] = useState(null);
|
|
71
|
+
useEffect(() => {
|
|
72
|
+
if (given || !om)
|
|
73
|
+
return;
|
|
74
|
+
const sheet = om.openSheet(latest.current.ref, latest.current.init);
|
|
75
|
+
setOpened({ key, om, sheet });
|
|
76
|
+
return () => {
|
|
77
|
+
sheet.destroy();
|
|
78
|
+
setOpened((cur) => (cur?.sheet === sheet ? null : cur));
|
|
79
|
+
};
|
|
80
|
+
}, [key, om, given]);
|
|
81
|
+
// Before the effect (and on the server): an inert placeholder for this key.
|
|
82
|
+
const inert = useMemo(() => (given || !om ? null : createInertSheet(om.options, latest.current.ref, latest.current.init)),
|
|
83
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
84
|
+
[key, om, given]);
|
|
85
|
+
const live = opened && opened.key === key && opened.om === om ? opened.sheet : null;
|
|
86
|
+
const sheet = given ?? live ?? inert;
|
|
87
|
+
const state = useSyncExternalStore(sheet.subscribe, sheet.getState, sheet.getState);
|
|
88
|
+
return useMemo(() => ({
|
|
89
|
+
...state,
|
|
90
|
+
sheet,
|
|
91
|
+
select: sheet.select,
|
|
92
|
+
set: sheet.set,
|
|
93
|
+
setStake: (value, unit) => sheet.set({ stake: value == null ? null : (unit ?? state.stake.unit) === 'shares' ? { shares: value } : { amount: value } }),
|
|
94
|
+
setMode: (mode) => sheet.set({ mode }),
|
|
95
|
+
setOrderType: (orderType) => sheet.set({ orderType }),
|
|
96
|
+
setMaxPrice: (maxPrice) => sheet.set({ maxPrice }),
|
|
97
|
+
place: sheet.place,
|
|
98
|
+
confirm: sheet.confirm,
|
|
99
|
+
cancelConfirm: sheet.cancelConfirm,
|
|
100
|
+
cancel: sheet.cancel,
|
|
101
|
+
runPreflight: sheet.preflight,
|
|
102
|
+
reset: sheet.reset,
|
|
103
|
+
refresh: sheet.refresh,
|
|
104
|
+
}), [state, sheet]);
|
|
105
|
+
}
|
|
106
|
+
/** The account's money modes, practice wallet and policy — for a mode switch before any position is open. */
|
|
107
|
+
export function useOrderSheetAccount(client) {
|
|
108
|
+
const ctx = useContext(ClientContext);
|
|
109
|
+
const om = client ?? ctx;
|
|
110
|
+
const [account, setAccount] = useState(null);
|
|
111
|
+
const [loading, setLoading] = useState(true);
|
|
112
|
+
const [error, setError] = useState(null);
|
|
113
|
+
const refresh = useCallback(async () => {
|
|
114
|
+
if (!om)
|
|
115
|
+
return;
|
|
116
|
+
setLoading(true);
|
|
117
|
+
try {
|
|
118
|
+
setAccount(await om.account({ force: true }));
|
|
119
|
+
setError(null);
|
|
120
|
+
}
|
|
121
|
+
catch (e) {
|
|
122
|
+
setError(e);
|
|
123
|
+
}
|
|
124
|
+
finally {
|
|
125
|
+
setLoading(false);
|
|
126
|
+
}
|
|
127
|
+
}, [om]);
|
|
128
|
+
useEffect(() => {
|
|
129
|
+
let alive = true;
|
|
130
|
+
if (!om)
|
|
131
|
+
return;
|
|
132
|
+
om.account().then((a) => { if (alive) {
|
|
133
|
+
setAccount(a);
|
|
134
|
+
setError(null);
|
|
135
|
+
} }).catch((e) => { if (alive)
|
|
136
|
+
setError(e); }).finally(() => { if (alive)
|
|
137
|
+
setLoading(false); });
|
|
138
|
+
const off = om.events.on('constraints', (c) => { if (alive && c)
|
|
139
|
+
setAccount(om.accountFromConstraints(c)); });
|
|
140
|
+
return () => { alive = false; off(); };
|
|
141
|
+
}, [om]);
|
|
142
|
+
return { account, loading, error, refresh };
|
|
143
|
+
}
|
|
144
|
+
// ─── Unstyled primitives ───────────────────────────────────────────────────────
|
|
145
|
+
const HandleContext = createContext(null);
|
|
146
|
+
export function useOrderSheetHandle() {
|
|
147
|
+
const h = useContext(HandleContext);
|
|
148
|
+
if (!h)
|
|
149
|
+
throw new Error('OrderSheet.* must be rendered inside <OrderSheet.Root handle={…}>.');
|
|
150
|
+
return h;
|
|
151
|
+
}
|
|
152
|
+
const Root = forwardRef(function Root({ handle, onOutcome, onPlaceError, children, ...rest }, ref) {
|
|
153
|
+
return (_jsx(HandleContext.Provider, { value: handle, children: _jsx("form", { ref: ref, "data-oms-part": "root", "data-phase": handle.phase, "data-mode": handle.mode, "data-order-type": handle.orderType, "data-loading": handle.loading || undefined, noValidate: true, onSubmit: (e) => {
|
|
154
|
+
e.preventDefault();
|
|
155
|
+
handle.place().then((o) => onOutcome?.(o)).catch((err) => onPlaceError?.(err));
|
|
156
|
+
}, ...rest, children: children }) }));
|
|
157
|
+
});
|
|
158
|
+
/** The keys a radio group answers to (WAI-ARIA radio group pattern). */
|
|
159
|
+
const VENUE_KEYS = new Set(['ArrowRight', 'ArrowDown', 'ArrowLeft', 'ArrowUp', 'Home', 'End']);
|
|
160
|
+
const isEnabledVenue = (v) => v.eligibility.status !== 'blocked';
|
|
161
|
+
/**
|
|
162
|
+
* Which venue a key press moves to: arrows step through the ENABLED venues
|
|
163
|
+
* (wrapping), Home/End jump to the first/last. From no selection, forward keys
|
|
164
|
+
* land on the first enabled venue and backward keys on the last. Null = no move.
|
|
165
|
+
*/
|
|
166
|
+
export function venueKeyTarget(key, venues, fromPartnerId) {
|
|
167
|
+
const enabled = venues.filter(isEnabledVenue);
|
|
168
|
+
if (enabled.length === 0 || !VENUE_KEYS.has(key))
|
|
169
|
+
return null;
|
|
170
|
+
if (key === 'Home')
|
|
171
|
+
return enabled[0];
|
|
172
|
+
if (key === 'End')
|
|
173
|
+
return enabled[enabled.length - 1];
|
|
174
|
+
const forward = key === 'ArrowRight' || key === 'ArrowDown';
|
|
175
|
+
const at = fromPartnerId == null ? -1 : venues.findIndex((v) => v.partnerId === fromPartnerId);
|
|
176
|
+
if (at < 0)
|
|
177
|
+
return forward ? enabled[0] : enabled[enabled.length - 1];
|
|
178
|
+
const n = venues.length;
|
|
179
|
+
for (let step = 1; step <= n; step++) {
|
|
180
|
+
const v = venues[(at + (forward ? step : -step) + n * step) % n];
|
|
181
|
+
if (isEnabledVenue(v))
|
|
182
|
+
return v;
|
|
183
|
+
}
|
|
184
|
+
return null;
|
|
185
|
+
}
|
|
186
|
+
/** The one venue in the tab order: the selected one, else the first enabled one (else the first). */
|
|
187
|
+
export function tabbableVenueId(venues) {
|
|
188
|
+
return (venues.find((v) => v.selected) ?? venues.find(isEnabledVenue) ?? venues[0])?.partnerId ?? null;
|
|
189
|
+
}
|
|
190
|
+
function Venues({ render, hideBlocked, ...rest }) {
|
|
191
|
+
const h = useOrderSheetHandle();
|
|
192
|
+
const venues = hideBlocked ? h.venues.filter(isEnabledVenue) : h.venues;
|
|
193
|
+
const nodes = useRef(new Map());
|
|
194
|
+
const tabbable = tabbableVenueId(venues);
|
|
195
|
+
const move = (key, from) => {
|
|
196
|
+
const target = venueKeyTarget(key, venues, from);
|
|
197
|
+
if (!target)
|
|
198
|
+
return false;
|
|
199
|
+
h.select(target.partnerId);
|
|
200
|
+
nodes.current.get(target.partnerId)?.focus();
|
|
201
|
+
return true;
|
|
202
|
+
};
|
|
203
|
+
return (_jsx("div", { "data-oms-part": "venues", role: "radiogroup", "aria-label": "Venue", ...rest, children: venues.map((v) => (_jsx("div", { ref: (el) => { if (el)
|
|
204
|
+
nodes.current.set(v.partnerId, el);
|
|
205
|
+
else
|
|
206
|
+
nodes.current.delete(v.partnerId); }, "data-oms-part": "venue", "data-state": v.eligibility.status, "data-selected": v.selected || undefined, "data-best": v.best || undefined, "data-connected": v.account.connected || undefined, role: "radio", "aria-checked": v.selected, "aria-disabled": v.eligibility.status === 'blocked' || undefined, tabIndex: v.partnerId === tabbable ? 0 : -1, onClick: () => h.select(v.partnerId), onKeyDown: (e) => {
|
|
207
|
+
if (e.key === 'Enter' || e.key === ' ') {
|
|
208
|
+
e.preventDefault();
|
|
209
|
+
h.select(v.partnerId);
|
|
210
|
+
return;
|
|
211
|
+
}
|
|
212
|
+
// The focused radio is the anchor (with roving focus it is the selected one).
|
|
213
|
+
if (move(e.key, v.partnerId))
|
|
214
|
+
e.preventDefault();
|
|
215
|
+
}, children: render ? render(v, h) : (_jsxs(_Fragment, { children: [_jsx("span", { "data-oms-part": "venue-name", children: v.name }), _jsx("span", { "data-oms-part": "venue-price", children: v.display.price }), v.best && _jsx("span", { "data-oms-part": "venue-best", children: "best" }), v.eligibility.issues[0] && _jsx("span", { "data-oms-part": "venue-reason", children: v.eligibility.issues[0].message })] })) }, v.partnerId))) }));
|
|
216
|
+
}
|
|
217
|
+
function Mode({ labels, ...rest }) {
|
|
218
|
+
const h = useOrderSheetHandle();
|
|
219
|
+
const modes = ['paper', 'real'];
|
|
220
|
+
const available = h.account?.moneyModes ?? ['paper'];
|
|
221
|
+
return (_jsx("div", { "data-oms-part": "mode", role: "group", "aria-label": "Money mode", ...rest, children: modes.map((m) => (_jsx("button", { type: "button", "data-oms-part": "mode-option", "data-mode": m, "data-available": available.includes(m) || undefined, "aria-pressed": h.mode === m, disabled: h.phase === 'placing', onClick: () => h.setMode(m), children: m === 'paper' ? (labels?.paper ?? 'Practice') : (labels?.real ?? 'Real money') }, m))) }));
|
|
222
|
+
}
|
|
223
|
+
function OrderTypeToggle(props) {
|
|
224
|
+
const h = useOrderSheetHandle();
|
|
225
|
+
const types = ['market', 'limit'];
|
|
226
|
+
const supported = h.venue?.supports.orderTypes ?? ['market'];
|
|
227
|
+
return (_jsx("div", { "data-oms-part": "order-type", role: "group", "aria-label": "Order type", ...props, children: types.map((t) => (_jsx("button", { type: "button", "data-oms-part": "order-type-option", "data-order-type": t, "data-available": (supported.includes(t) && !(h.mode === 'paper' && t === 'limit')) || undefined, "aria-pressed": h.orderType === t, disabled: h.phase === 'placing', onClick: () => h.setOrderType(t), children: t === 'market' ? 'Market' : 'Limit' }, t))) }));
|
|
228
|
+
}
|
|
229
|
+
function Stake({ label, unitToggle = true, bare, id, ...rest }) {
|
|
230
|
+
const h = useOrderSheetHandle();
|
|
231
|
+
const auto = useId();
|
|
232
|
+
const inputId = id ?? auto;
|
|
233
|
+
const unit = h.stake.unit;
|
|
234
|
+
const input = (_jsx("input", { id: inputId, "data-oms-part": "stake-input", "data-unit": unit, type: "number", inputMode: "decimal", min: 0, step: unit === 'amount' ? 0.01 : (h.venue?.constraints?.size.whole_contracts ? 1 : 0.01), value: h.stake.value ?? '', disabled: h.phase === 'placing', onChange: (e) => { const n = e.target.valueAsNumber; h.setStake(Number.isFinite(n) ? n : null); }, "aria-invalid": h.validation.blocking.some((i) => i.fix === 'raise_stake' || i.fix === 'lower_stake' || i.fix === 'round_stake') || undefined, ...rest }));
|
|
235
|
+
if (bare)
|
|
236
|
+
return input;
|
|
237
|
+
return (_jsxs("div", { "data-oms-part": "stake", "data-unit": unit, children: [_jsx("label", { "data-oms-part": "stake-label", htmlFor: inputId, children: label ?? (unit === 'amount' ? 'Stake' : 'Contracts') }), input, unitToggle && (_jsx("div", { "data-oms-part": "stake-unit", role: "group", "aria-label": "Stake unit", children: ['amount', 'shares'].map((u) => (_jsx("button", { type: "button", "data-oms-part": "stake-unit-option", "data-unit": u, "aria-pressed": unit === u, onClick: () => h.setStake(h.stake.value, u), children: u === 'amount' ? (h.quote?.currency === 'USD' || !h.quote ? '$' : h.quote.currency) : 'contracts' }, u))) }))] }));
|
|
238
|
+
}
|
|
239
|
+
/** The limit / max price, in probability (0.01–0.99). Shown for limit orders; for market orders it is the auto ceiling. */
|
|
240
|
+
function Price({ label, bare, id, ...rest }) {
|
|
241
|
+
const h = useOrderSheetHandle();
|
|
242
|
+
const auto = useId();
|
|
243
|
+
const inputId = id ?? auto;
|
|
244
|
+
const tick = h.venue?.constraints?.price.tick ?? 0.01;
|
|
245
|
+
const input = (_jsx("input", { id: inputId, "data-oms-part": "price-input", "data-auto": h.maxPriceIsAuto || undefined, type: "number", inputMode: "decimal", min: h.venue?.constraints?.price.min ?? 0.01, max: h.venue?.constraints?.price.max ?? 0.99, step: tick, value: h.maxPrice ?? '', disabled: h.phase === 'placing', onChange: (e) => { const n = e.target.valueAsNumber; h.setMaxPrice(Number.isFinite(n) ? n : null); }, ...rest }));
|
|
246
|
+
if (bare)
|
|
247
|
+
return input;
|
|
248
|
+
return (_jsxs("div", { "data-oms-part": "price", "data-auto": h.maxPriceIsAuto || undefined, "data-order-type": h.orderType, children: [_jsx("label", { "data-oms-part": "price-label", htmlFor: inputId, children: label ?? (h.orderType === 'limit' ? 'Limit price' : 'Max price') }), input, !h.maxPriceIsAuto && _jsx("button", { type: "button", "data-oms-part": "price-reset", onClick: () => h.setMaxPrice(null), children: "auto" })] }));
|
|
249
|
+
}
|
|
250
|
+
function Quote({ render, ...rest }) {
|
|
251
|
+
const h = useOrderSheetHandle();
|
|
252
|
+
const q = h.quote;
|
|
253
|
+
return (_jsx("div", { "data-oms-part": "quote", "data-freshness": q?.freshness, "aria-live": "polite", ...rest, children: render ? render(h) : q ? (_jsxs("dl", { children: [_jsx("dt", { children: "Price" }), _jsx("dd", { "data-oms-part": "quote-price", children: q.display.price }), _jsx("dt", { children: "Cost" }), _jsx("dd", { "data-oms-part": "quote-cost", children: q.display.cost }), _jsx("dt", { children: "Contracts" }), _jsx("dd", { "data-oms-part": "quote-contracts", children: q.contracts }), _jsx("dt", { children: "To win" }), _jsx("dd", { "data-oms-part": "quote-payout", children: q.display.payout }), q.fee && _jsxs(_Fragment, { children: [_jsx("dt", { children: "Fee" }), _jsx("dd", { "data-oms-part": "quote-fee", children: q.display.fee })] }), _jsx("dt", { children: "Profit" }), _jsx("dd", { "data-oms-part": "quote-profit", children: q.display.profit })] })) : null }));
|
|
254
|
+
}
|
|
255
|
+
function Issues({ severities, render, ...rest }) {
|
|
256
|
+
const h = useOrderSheetHandle();
|
|
257
|
+
const list = h.validation.all.filter((i) => !severities || severities.includes(i.severity));
|
|
258
|
+
const hasBlock = list.some((i) => i.severity === 'block');
|
|
259
|
+
return (
|
|
260
|
+
// polite, not assertive: a blocking issue can change on every keystroke of the
|
|
261
|
+
// stake, and an assertive region would interrupt the user each time.
|
|
262
|
+
_jsx("div", { "data-oms-part": "issues", role: "status", "aria-live": "polite", "data-blocking": hasBlock || undefined, ...rest, children: list.map((i) => (_jsx("div", { "data-oms-part": "issue", "data-severity": i.severity, "data-code": i.code, "data-fix": i.fix, "data-source": i.source, children: render ? render(i, h) : i.message }, `${i.scope}:${i.code}`))) }));
|
|
263
|
+
}
|
|
264
|
+
function Submit({ children, ...rest }) {
|
|
265
|
+
const h = useOrderSheetHandle();
|
|
266
|
+
return (_jsx("button", { type: "submit", "data-oms-part": "submit", "data-mode": h.mode, "data-phase": h.phase, disabled: !h.canPlace, "aria-busy": h.phase === 'placing' || undefined, ...rest, children: typeof children === 'function' ? children(h) : children ?? h.confirmLabel }));
|
|
267
|
+
}
|
|
268
|
+
/** "Better price on X — switch?" — a suggestion the USER acts on; the sheet never auto-switches. */
|
|
269
|
+
function Hint({ render, ...rest }) {
|
|
270
|
+
const h = useOrderSheetHandle();
|
|
271
|
+
if (!h.hint)
|
|
272
|
+
return null;
|
|
273
|
+
const v = h.hint.venue;
|
|
274
|
+
return (_jsx("div", { "data-oms-part": "hint", ...rest, children: render ? render(v, h) : (_jsx("button", { type: "button", "data-oms-part": "hint-switch", onClick: () => h.select(v.partnerId), children: h.hint.message })) }));
|
|
275
|
+
}
|
|
276
|
+
function Outcome({ render, ...rest }) {
|
|
277
|
+
const h = useOrderSheetHandle();
|
|
278
|
+
const r = h.result;
|
|
279
|
+
if (!r)
|
|
280
|
+
return null;
|
|
281
|
+
const leg = r.legs[0];
|
|
282
|
+
return (_jsx("div", { "data-oms-part": "outcome", "data-summary": r.summary, "data-phase": h.phase, "aria-live": "polite", ...rest, children: render ? render(h) : (_jsxs(_Fragment, { children: [_jsx("span", { "data-oms-part": "outcome-summary", children: h.phase }), leg?.issue && _jsx("span", { "data-oms-part": "outcome-issue", children: leg.issue.message }), leg && leg.fill.shares > 0 && _jsxs("span", { "data-oms-part": "outcome-fill", children: [leg.fill.shares, " @ ", leg.fill.avgPrice ?? '—'] }), leg?.substituted && _jsx("span", { "data-oms-part": "outcome-substituted", children: "Filled on a different venue than requested \u2014 report this." })] })) }));
|
|
283
|
+
}
|
|
284
|
+
export const OrderSheet = {
|
|
285
|
+
Root,
|
|
286
|
+
Venues,
|
|
287
|
+
Mode,
|
|
288
|
+
OrderType: OrderTypeToggle,
|
|
289
|
+
Stake,
|
|
290
|
+
Price,
|
|
291
|
+
Quote,
|
|
292
|
+
Issues,
|
|
293
|
+
Submit,
|
|
294
|
+
Hint,
|
|
295
|
+
Outcome,
|
|
296
|
+
};
|
|
297
|
+
//# sourceMappingURL=react.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"react.js","sourceRoot":"","sources":["../src/react.tsx"],"names":[],"mappings":"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"}
|
package/dist/sheet.d.ts
ADDED
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
import type { AccountFacts, PlaceLeg, PlaceOutcome, PlaceResult, PlaceSummary, PositionRef, PreflightSnapshot, SheetPatch, SheetPhase, SheetState, TrackedOrder, VenueOption, MoneyMode, OrderType } from './types.js';
|
|
2
|
+
import type { OddsFormat } from './odds.js';
|
|
3
|
+
import type { BuyResponse, StreamOrderSettled, StreamOrderUpdate } from './wire.js';
|
|
4
|
+
import type { OrderSheetClient, ResolvedClientOptions } from './client.js';
|
|
5
|
+
export interface SheetInit {
|
|
6
|
+
mode?: MoneyMode;
|
|
7
|
+
orderType?: OrderType;
|
|
8
|
+
stake?: {
|
|
9
|
+
amount: number;
|
|
10
|
+
} | {
|
|
11
|
+
shares: number;
|
|
12
|
+
};
|
|
13
|
+
maxPrice?: number;
|
|
14
|
+
oddsFormat?: OddsFormat;
|
|
15
|
+
slippage?: number;
|
|
16
|
+
/** Pre-select this venue (defaults to the venue named by the ref, e.g. the clicked cell). */
|
|
17
|
+
partnerId?: string;
|
|
18
|
+
}
|
|
19
|
+
export interface Sheet {
|
|
20
|
+
getState(): SheetState;
|
|
21
|
+
subscribe(listener: (state: SheetState) => void): () => void;
|
|
22
|
+
/** Pick the venue. The only way a venue is ever chosen. */
|
|
23
|
+
select(partnerId: string | null): void;
|
|
24
|
+
set(patch: SheetPatch): void;
|
|
25
|
+
/** Re-read the position and the constraints. */
|
|
26
|
+
refresh(): Promise<void>;
|
|
27
|
+
/** Ask the server for the exact fees, fill and every pre-placement check for the current inputs. */
|
|
28
|
+
preflight(opts?: {
|
|
29
|
+
verifyLiquidity?: boolean;
|
|
30
|
+
}): Promise<PreflightSnapshot | null>;
|
|
31
|
+
/**
|
|
32
|
+
* Place the order. Throws OrderSheetError on a transport/4xx failure only.
|
|
33
|
+
* A real-money order (with `realMoney.confirm`, the default) returns
|
|
34
|
+
* `confirm_required` first; calling `place()` again while `phase ===
|
|
35
|
+
* 'confirming'` with the SAME inputs is the confirm click. While a placement
|
|
36
|
+
* is in flight, every further call returns that same promise.
|
|
37
|
+
*/
|
|
38
|
+
place(opts?: {
|
|
39
|
+
idempotencyKey?: string;
|
|
40
|
+
verifyLiquidity?: boolean;
|
|
41
|
+
}): Promise<PlaceOutcome>;
|
|
42
|
+
/**
|
|
43
|
+
* Second click of the real-money confirm step. Places only when `phase ===
|
|
44
|
+
* 'confirming'` AND the inputs are exactly the ones confirmed; any edit after
|
|
45
|
+
* `confirm_required` clears the confirmation, and `confirm()` then returns
|
|
46
|
+
* `blocked` with `confirm_expired` — call `place()` again for a fresh confirm.
|
|
47
|
+
*/
|
|
48
|
+
confirm(): Promise<PlaceOutcome>;
|
|
49
|
+
cancelConfirm(): void;
|
|
50
|
+
/** Cancel the resting order(s) this sheet placed. */
|
|
51
|
+
cancel(): Promise<{
|
|
52
|
+
cancelled: string[];
|
|
53
|
+
skipped: string[];
|
|
54
|
+
}>;
|
|
55
|
+
/** Back to an empty slip on the same position. */
|
|
56
|
+
reset(): void;
|
|
57
|
+
destroy(): void;
|
|
58
|
+
/** Test hook / host-owned sockets: feed an order frame in. */
|
|
59
|
+
ingestOrderUpdate(frame: StreamOrderUpdate): void;
|
|
60
|
+
ingestOrderSettled(frame: StreamOrderSettled): void;
|
|
61
|
+
}
|
|
62
|
+
/** The snapshot a sheet starts from, before anything has loaded. Pure — no I/O. */
|
|
63
|
+
export declare function initialSheetState(o: ResolvedClientOptions, ref: PositionRef, init?: SheetInit): SheetState;
|
|
64
|
+
/**
|
|
65
|
+
* A sheet that does nothing: no fetch, no timer, no listener on the client.
|
|
66
|
+
* What `useOrderSheet` renders with on the server and before its effect has
|
|
67
|
+
* opened the real sheet. Every action is a no-op; placing answers `not_ready`.
|
|
68
|
+
*/
|
|
69
|
+
export declare function createInertSheet(o: ResolvedClientOptions, ref: PositionRef, init?: SheetInit): Sheet;
|
|
70
|
+
export declare function createSheet(client: OrderSheetClient, ref: PositionRef, init?: SheetInit): Sheet;
|
|
71
|
+
export declare function newIdempotencyKey(): string;
|
|
72
|
+
export declare function phaseFromSummary(summary: PlaceSummary): SheetPhase;
|
|
73
|
+
/** Fold every tracked order's fill state into one phase. */
|
|
74
|
+
export declare function phaseFromOrders(orders: TrackedOrder[], current: SheetPhase): SheetPhase;
|
|
75
|
+
export declare function toPlaceResult(raw: BuyResponse, venue: VenueOption, account: AccountFacts | null, idempotencyKey: string, now: number): PlaceResult;
|
|
76
|
+
export declare function summarize(legs: PlaceLeg[]): PlaceSummary;
|
|
77
|
+
export declare function describeCost(n: number, currency: string): string;
|